51 auto const lines = env.rpc(
"json",
"account_lines",
"{ }");
53 lines[jss::result][jss::error_message] ==
59 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
60 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
62 lines[jss::result][jss::error_message] ==
67 auto testInvalidAccountParam = [&](
auto const& param) {
69 params[jss::account] = param;
70 auto jrr = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
71 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
72 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
75 testInvalidAccountParam(1);
76 testInvalidAccountParam(1.1);
77 testInvalidAccountParam(
true);
86 params[jss::account] = alice.human();
87 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
89 lines[jss::result][jss::error_message] ==
92 env.fund(XRP(10000), alice);
95 BEAST_EXPECT(ledger3Info.
seq == 3);
99 auto testInvalidPeerParam = [&](
auto const& param) {
101 params[jss::account] = alice.human();
102 params[jss::peer] = param;
103 auto jrr = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
104 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
105 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'peer'.");
108 testInvalidPeerParam(1);
109 testInvalidPeerParam(1.1);
110 testInvalidPeerParam(
true);
118 params[jss::account] = alice.human();
119 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
120 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
121 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
126 params[jss::account] = alice.human();
127 params[jss::ledger_index] =
"nonsense";
128 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
130 lines[jss::result][jss::error_message] ==
131 "Invalid field 'ledger_index', not string or number.");
136 params[jss::account] = alice.human();
137 params[jss::ledger_index] = 50000;
138 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
139 BEAST_EXPECT(lines[jss::result][jss::error_message] ==
"ledgerNotFound");
143 env.fund(XRP(10000), gw1);
146 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
150 IOU
const& gw1Currency = gw1Currencies.
back();
153 env(trust(alice, gw1Currency(100 + c)));
154 env(pay(gw1, alice, gw1Currency(50 + c)));
157 LedgerHeader const ledger4Info = env.closed()->header();
158 BEAST_EXPECT(ledger4Info.
seq == 4);
163 env.fund(XRP(10000), gw2);
166 env(fset(gw2, asfRequireAuth));
170 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
174 IOU
const& gw2Currency = gw2Currencies.
back();
177 env(trust(alice, gw2Currency(200 + c)));
178 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
180 env(pay(gw2, alice, gw2Currency(100 + c)));
184 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
187 LedgerHeader const ledger58Info = env.closed()->header();
188 BEAST_EXPECT(ledger58Info.
seq == 58);
191 auto testAccountLinesHistory =
195 paramsSeq[jss::account] = account.human();
196 paramsSeq[jss::ledger_index] = info.seq;
197 auto const linesSeq = env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
198 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
199 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
203 paramsHash[jss::account] = account.human();
204 paramsHash[jss::ledger_hash] =
to_string(info.hash);
205 auto const linesHash = env.rpc(
"json",
"account_lines",
to_string(paramsHash));
206 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
207 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
211 testAccountLinesHistory(alice, ledger3Info, 0);
214 testAccountLinesHistory(alice, ledger4Info, 26);
217 testAccountLinesHistory(alice, ledger58Info, 52);
222 params[jss::account] = alice.human();
224 params[jss::ledger_index] = ledger58Info.
seq;
225 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
226 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
228 lines[jss::error_message] ==
229 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
235 params[jss::account] = alice.human();
237 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
238 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
240 lines[jss::error_message] ==
"Invalid field 'ledger_index', not string or number.");
245 params[jss::account] = alice.human();
246 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
247 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
248 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
253 params[jss::account] = alice.human();
254 params[jss::peer] = gw1.human();
255 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
256 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
257 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
260 auto const& line = lines[jss::result][jss::lines][0u];
261 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
266 params[jss::account] = alice.human();
267 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
268 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
270 lines[jss::result][jss::error_message] ==
276 params[jss::account] = alice.human();
277 params[jss::limit] = -1;
278 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
280 lines[jss::result][jss::error_message] ==
286 paramsA[jss::account] = alice.human();
287 paramsA[jss::limit] = 1;
288 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
289 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
290 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
293 auto marker = linesA[jss::result][jss::marker].asString();
295 paramsB[jss::account] = alice.human();
296 paramsB[jss::marker] = marker;
297 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
298 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
299 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
303 paramsC[jss::account] = alice.human();
304 paramsC[jss::limit] = 3;
305 paramsC[jss::marker] = marker;
306 auto const linesC = env.rpc(
"json",
"account_lines",
to_string(paramsC));
307 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
308 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
311 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
313 paramsD[jss::account] = alice.human();
314 paramsD[jss::marker] = marker;
315 auto const linesD = env.rpc(
"json",
"account_lines",
to_string(paramsD));
317 linesD[jss::result][jss::error_message] ==
323 params[jss::account] = alice.human();
324 params[jss::marker] =
true;
325 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
327 lines[jss::result][jss::error_message] ==
333 params[jss::account] = alice.human();
334 params[jss::limit] = 10;
335 params[jss::peer] = gw2.human();
336 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
337 auto const& line = lines[jss::result][jss::lines][0u];
338 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
339 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
340 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
341 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
346 paramsA[jss::account] = gw2.human();
347 paramsA[jss::limit] = 1;
348 paramsA[jss::peer] = alice.human();
349 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
350 auto const& lineA = linesA[jss::result][jss::lines][0u];
351 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
352 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
353 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
354 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
357 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
358 auto const marker = linesA[jss::result][jss::marker].asString();
360 paramsB[jss::account] = gw2.human();
361 paramsB[jss::limit] = 25;
362 paramsB[jss::marker] = marker;
363 paramsB[jss::peer] = alice.human();
364 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
365 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
366 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
367 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
523 testcase(
"Marker can point to any appropriate ledger entry type");
525 using namespace std::chrono_literals;
537 env.fund(XRP(10000), alice, becky, gw1);
540 auto payChan = [](
Account const& account,
546 jv[jss::TransactionType] = jss::PaymentChannelCreate;
547 jv[jss::Account] = account.human();
548 jv[jss::Destination] = to.human();
550 jv[
"SettleDelay"] = settleDelay.count();
551 jv[
"PublicKey"] =
strHex(pk.slice());
561 env(signers(alice, 2, {{bogie, 3}}));
565 env(signers(becky, 2, {{alice, 3}}));
569 auto const eur = gw1[
"EUR"];
570 env(trust(alice, eur(200)));
571 env(trust(becky, eur(200)));
575 env(escrow::create(alice, becky, XRP(1000)), escrow::kFinishTime(env.now() + 1s));
576 env(escrow::create(becky, alice, XRP(1000)), escrow::kFinishTime(env.now() + 1s));
579 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
580 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
583 uint256 const aliceNFtokenID = token::getNextID(env, alice, 0, tfTransferable);
584 env(token::mint(alice, 0), Txflags(tfTransferable));
586 uint256 const beckyNFtokenID = token::getNextID(env, becky, 0, tfTransferable);
587 env(token::mint(becky, 0), Txflags(tfTransferable));
590 env(token::createOffer(alice, beckyNFtokenID, drops(1)), token::Owner(becky));
591 env(token::createOffer(becky, aliceNFtokenID, drops(1)), token::Owner(alice));
593 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
594 Txflags(tfSellNFToken),
595 token::Destination(alice));
596 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
597 Txflags(tfSellNFToken),
598 token::Destination(becky));
600 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
602 token::Destination(alice));
603 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
605 token::Destination(becky));
607 env(token::createOffer(becky, beckyNFtokenID, drops(1)), Txflags(tfSellNFToken));
608 env(token::createOffer(alice, aliceNFtokenID, drops(1)), Txflags(tfSellNFToken));
611 env(check::create(alice, becky, XRP(50)));
612 env(check::create(becky, alice, XRP(50)));
615 env(deposit::auth(alice, becky));
616 env(deposit::auth(becky, alice));
620 auto const usDalice = alice[
"USD"];
621 env(offer(alice, eur(10), XRP(100)));
622 env(offer(becky, usDalice(10), XRP(100)));
625 env(ticket::create(alice, 2));
628 auto const btCbecky = becky[
"BTC"];
629 env(trust(alice, btCbecky(200)));
640 params[jss::account] = alice.human();
641 params[jss::limit] = 1;
643 params[jss::marker] = *marker;
645 return env.rpc(
"json",
"account_lines",
to_string(params));
648 auto aliceLines = getNextLine(env, alice, std::nullopt);
649 static constexpr std::size_t kExpectedIterations = 16;
654 auto hasMarker = [](
auto const& aliceLines) {
655 return aliceLines[jss::result].isMember(jss::marker);
657 auto marker = [](
auto const& aliceLines) {
658 return aliceLines[jss::result][jss::marker].asString();
660 auto checkLines = [](
auto const& aliceLines) {
661 return aliceLines.isMember(jss::result) &&
662 !aliceLines[jss::result].isMember(jss::error_message) &&
663 aliceLines[jss::result].isMember(jss::lines) &&
664 aliceLines[jss::result][jss::lines].isArray() &&
665 aliceLines[jss::result][jss::lines].size() <= 1;
668 BEAST_EXPECT(hasMarker(aliceLines));
669 BEAST_EXPECT(checkLines(aliceLines));
670 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
674 while (hasMarker(aliceLines))
677 aliceLines = getNextLine(env, alice, marker(aliceLines));
678 BEAST_EXPECT(checkLines(aliceLines));
679 foundLines += aliceLines[jss::result][jss::lines].size();
682 BEAST_EXPECT(kExpectedLines == foundLines);
685 aliceObjectsParams2[jss::account] = alice.human();
686 aliceObjectsParams2[jss::limit] = 200;
688 env.rpc(
"json",
"account_objects",
to_string(aliceObjectsParams2));
689 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
690 BEAST_EXPECT(!aliceObjects[jss::result].isMember(jss::error_message));
691 BEAST_EXPECT(aliceObjects[jss::result].isMember(jss::account_objects));
692 BEAST_EXPECT(aliceObjects[jss::result][jss::account_objects].isArray());
697 aliceObjects[jss::result][jss::account_objects].size() ==
698 iterations + kExpectedNfTs);
701 BEAST_EXPECTS(iterations == kExpectedIterations,
std::to_string(iterations));
705 beckyObjectsParams[jss::account] = becky.human();
706 beckyObjectsParams[jss::limit] = 200;
708 env.rpc(
"json",
"account_objects",
to_string(beckyObjectsParams));
709 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
710 BEAST_EXPECT(!beckyObjects[jss::result].isMember(jss::error_message));
711 BEAST_EXPECT(beckyObjects[jss::result].isMember(jss::account_objects));
712 BEAST_EXPECT(beckyObjects[jss::result][jss::account_objects].isArray());
716 beckyObjects[jss::result][jss::account_objects].size() ==
717 aliceObjects[jss::result][jss::account_objects].size() - 2);
732 request[jss::method] =
"account_lines";
733 request[jss::jsonrpc] =
"2.0";
734 request[jss::ripplerpc] =
"2.0";
735 auto const lines = env.rpc(
"json2",
to_string(request));
736 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
737 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
742 request[jss::method] =
"account_lines";
743 request[jss::jsonrpc] =
"2.0";
744 request[jss::ripplerpc] =
"2.0";
745 request[jss::id] = 5;
746 auto const lines = env.rpc(
"json2",
to_string(request));
748 lines[jss::error][jss::message] ==
750 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
751 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
752 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
757 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
759 request[jss::method] =
"account_lines";
760 request[jss::jsonrpc] =
"2.0";
761 request[jss::ripplerpc] =
"2.0";
762 request[jss::id] = 5;
763 request[jss::params] = params;
764 auto const lines = env.rpc(
"json2",
to_string(request));
766 lines[jss::error][jss::message] ==
768 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
769 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
770 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
776 params[jss::account] = alice.human();
778 request[jss::method] =
"account_lines";
779 request[jss::jsonrpc] =
"2.0";
780 request[jss::ripplerpc] =
"2.0";
781 request[jss::id] = 5;
782 request[jss::params] = params;
783 auto const lines = env.rpc(
"json2",
to_string(request));
785 lines[jss::error][jss::message] ==
787 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
788 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
789 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
791 env.fund(XRP(10000), alice);
793 LedgerHeader const ledger3Info = env.closed()->header();
794 BEAST_EXPECT(ledger3Info.
seq == 3);
798 auto testInvalidPeerParam = [&](
auto const& param) {
800 params[jss::account] = alice.human();
801 params[jss::peer] = param;
804 request[jss::method] =
"account_lines";
805 request[jss::jsonrpc] =
"2.0";
806 request[jss::ripplerpc] =
"2.0";
807 request[jss::id] = 5;
808 request[jss::params] = params;
810 auto const lines = env.rpc(
"json2",
to_string(request));
811 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
812 BEAST_EXPECT(lines[jss::error][jss::message] ==
"Invalid field 'peer'.");
813 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
814 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
815 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
818 testInvalidPeerParam(1);
819 testInvalidPeerParam(1.1);
820 testInvalidPeerParam(
true);
828 params[jss::account] = alice.human();
830 request[jss::method] =
"account_lines";
831 request[jss::jsonrpc] =
"2.0";
832 request[jss::ripplerpc] =
"2.0";
833 request[jss::id] = 5;
834 request[jss::params] = params;
835 auto const lines = env.rpc(
"json2",
to_string(request));
836 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
837 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
838 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
839 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
840 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
845 params[jss::account] = alice.human();
846 params[jss::ledger_index] =
"nonsense";
848 request[jss::method] =
"account_lines";
849 request[jss::jsonrpc] =
"2.0";
850 request[jss::ripplerpc] =
"2.0";
851 request[jss::id] = 5;
852 request[jss::params] = params;
853 auto const lines = env.rpc(
"json2",
to_string(request));
855 lines[jss::error][jss::message] ==
856 "Invalid field 'ledger_index', not string or number.");
857 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
858 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
859 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
864 params[jss::account] = alice.human();
865 params[jss::ledger_index] = 50000;
867 request[jss::method] =
"account_lines";
868 request[jss::jsonrpc] =
"2.0";
869 request[jss::ripplerpc] =
"2.0";
870 request[jss::id] = 5;
871 request[jss::params] = params;
872 auto const lines = env.rpc(
"json2",
to_string(request));
873 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
874 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
875 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
876 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
880 env.fund(XRP(10000), gw1);
883 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
887 IOU
const& gw1Currency = gw1Currencies.
back();
890 env(trust(alice, gw1Currency(100 + c)));
891 env(pay(gw1, alice, gw1Currency(50 + c)));
894 LedgerHeader const ledger4Info = env.closed()->header();
895 BEAST_EXPECT(ledger4Info.
seq == 4);
900 env.fund(XRP(10000), gw2);
903 env(fset(gw2, asfRequireAuth));
907 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
911 IOU
const& gw2Currency = gw2Currencies.
back();
914 env(trust(alice, gw2Currency(200 + c)));
915 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
917 env(pay(gw2, alice, gw2Currency(100 + c)));
921 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
924 LedgerHeader const ledger58Info = env.closed()->header();
925 BEAST_EXPECT(ledger58Info.
seq == 58);
928 auto testAccountLinesHistory = [
this, &env](
934 paramsSeq[jss::account] = account.human();
935 paramsSeq[jss::ledger_index] = info.seq;
937 requestSeq[jss::method] =
"account_lines";
938 requestSeq[jss::jsonrpc] =
"2.0";
939 requestSeq[jss::ripplerpc] =
"2.0";
940 requestSeq[jss::id] = 5;
941 requestSeq[jss::params] = paramsSeq;
942 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
943 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
944 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
945 BEAST_EXPECT(linesSeq.isMember(jss::jsonrpc) && linesSeq[jss::jsonrpc] ==
"2.0");
946 BEAST_EXPECT(linesSeq.isMember(jss::ripplerpc) && linesSeq[jss::ripplerpc] ==
"2.0");
947 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
951 paramsHash[jss::account] = account.human();
952 paramsHash[jss::ledger_hash] =
to_string(info.hash);
954 requestHash[jss::method] =
"account_lines";
955 requestHash[jss::jsonrpc] =
"2.0";
956 requestHash[jss::ripplerpc] =
"2.0";
957 requestHash[jss::id] = 5;
958 requestHash[jss::params] = paramsHash;
959 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
960 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
961 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
962 BEAST_EXPECT(linesHash.isMember(jss::jsonrpc) && linesHash[jss::jsonrpc] ==
"2.0");
963 BEAST_EXPECT(linesHash.isMember(jss::ripplerpc) && linesHash[jss::ripplerpc] ==
"2.0");
964 BEAST_EXPECT(linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
968 testAccountLinesHistory(alice, ledger3Info, 0);
971 testAccountLinesHistory(alice, ledger4Info, 26);
974 testAccountLinesHistory(alice, ledger58Info, 52);
980 params[jss::account] = alice.human();
982 params[jss::ledger_index] = ledger58Info.
seq;
984 request[jss::method] =
"account_lines";
985 request[jss::jsonrpc] =
"2.0";
986 request[jss::ripplerpc] =
"2.0";
987 request[jss::id] = 5;
988 request[jss::params] = params;
989 auto const lines = env.rpc(
"json2",
to_string(request));
990 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
992 lines[jss::error][jss::message] ==
993 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
995 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
996 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
997 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1002 params[jss::account] = alice.human();
1004 request[jss::method] =
"account_lines";
1005 request[jss::jsonrpc] =
"2.0";
1006 request[jss::ripplerpc] =
"2.0";
1007 request[jss::id] = 5;
1008 request[jss::params] = params;
1009 auto const lines = env.rpc(
"json2",
to_string(request));
1010 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1011 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
1012 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1013 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1014 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1019 params[jss::account] = alice.human();
1020 params[jss::peer] = gw1.human();
1022 request[jss::method] =
"account_lines";
1023 request[jss::jsonrpc] =
"2.0";
1024 request[jss::ripplerpc] =
"2.0";
1025 request[jss::id] = 5;
1026 request[jss::params] = params;
1027 auto const lines = env.rpc(
"json2",
to_string(request));
1028 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1029 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1030 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1031 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1032 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1037 params[jss::account] = alice.human();
1038 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
1040 request[jss::method] =
"account_lines";
1041 request[jss::jsonrpc] =
"2.0";
1042 request[jss::ripplerpc] =
"2.0";
1043 request[jss::id] = 5;
1044 request[jss::params] = params;
1045 auto const lines = env.rpc(
"json2",
to_string(request));
1047 lines[jss::error][jss::message] ==
1049 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1050 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1051 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1056 params[jss::account] = alice.human();
1057 params[jss::limit] = -1;
1059 request[jss::method] =
"account_lines";
1060 request[jss::jsonrpc] =
"2.0";
1061 request[jss::ripplerpc] =
"2.0";
1062 request[jss::id] = 5;
1063 request[jss::params] = params;
1064 auto const lines = env.rpc(
"json2",
to_string(request));
1066 lines[jss::error][jss::message] ==
1068 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1069 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1070 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1075 paramsA[jss::account] = alice.human();
1076 paramsA[jss::limit] = 1;
1078 requestA[jss::method] =
"account_lines";
1079 requestA[jss::jsonrpc] =
"2.0";
1080 requestA[jss::ripplerpc] =
"2.0";
1081 requestA[jss::id] = 5;
1082 requestA[jss::params] = paramsA;
1083 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1084 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1085 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1086 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1087 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1088 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1091 auto marker = linesA[jss::result][jss::marker].asString();
1093 paramsB[jss::account] = alice.human();
1094 paramsB[jss::marker] = marker;
1096 requestB[jss::method] =
"account_lines";
1097 requestB[jss::jsonrpc] =
"2.0";
1098 requestB[jss::ripplerpc] =
"2.0";
1099 requestB[jss::id] = 5;
1100 requestB[jss::params] = paramsB;
1101 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1102 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1103 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1104 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1105 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1106 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1110 paramsC[jss::account] = alice.human();
1111 paramsC[jss::limit] = 3;
1112 paramsC[jss::marker] = marker;
1114 requestC[jss::method] =
"account_lines";
1115 requestC[jss::jsonrpc] =
"2.0";
1116 requestC[jss::ripplerpc] =
"2.0";
1117 requestC[jss::id] = 5;
1118 requestC[jss::params] = paramsC;
1119 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1120 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1121 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1122 BEAST_EXPECT(linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1123 BEAST_EXPECT(linesC.isMember(jss::ripplerpc) && linesC[jss::ripplerpc] ==
"2.0");
1124 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1127 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1129 paramsD[jss::account] = alice.human();
1130 paramsD[jss::marker] = marker;
1132 requestD[jss::method] =
"account_lines";
1133 requestD[jss::jsonrpc] =
"2.0";
1134 requestD[jss::ripplerpc] =
"2.0";
1135 requestD[jss::id] = 5;
1136 requestD[jss::params] = paramsD;
1137 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1139 linesD[jss::error][jss::message] ==
1141 BEAST_EXPECT(linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1142 BEAST_EXPECT(linesD.isMember(jss::ripplerpc) && linesD[jss::ripplerpc] ==
"2.0");
1143 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1148 params[jss::account] = alice.human();
1149 params[jss::marker] =
true;
1151 request[jss::method] =
"account_lines";
1152 request[jss::jsonrpc] =
"2.0";
1153 request[jss::ripplerpc] =
"2.0";
1154 request[jss::id] = 5;
1155 request[jss::params] = params;
1156 auto const lines = env.rpc(
"json2",
to_string(request));
1158 lines[jss::error][jss::message] ==
1160 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1161 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1162 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1167 params[jss::account] = alice.human();
1168 params[jss::limit] = 10;
1169 params[jss::peer] = gw2.human();
1171 request[jss::method] =
"account_lines";
1172 request[jss::jsonrpc] =
"2.0";
1173 request[jss::ripplerpc] =
"2.0";
1174 request[jss::id] = 5;
1175 request[jss::params] = params;
1176 auto const lines = env.rpc(
"json2",
to_string(request));
1177 auto const& line = lines[jss::result][jss::lines][0u];
1178 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1179 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1180 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1181 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1182 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1183 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1184 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1189 paramsA[jss::account] = gw2.human();
1190 paramsA[jss::limit] = 1;
1191 paramsA[jss::peer] = alice.human();
1193 requestA[jss::method] =
"account_lines";
1194 requestA[jss::jsonrpc] =
"2.0";
1195 requestA[jss::ripplerpc] =
"2.0";
1196 requestA[jss::id] = 5;
1197 requestA[jss::params] = paramsA;
1198 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1199 auto const& lineA = linesA[jss::result][jss::lines][0u];
1200 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1201 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1202 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1203 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1204 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1205 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1206 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1209 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1210 auto const marker = linesA[jss::result][jss::marker].asString();
1212 paramsB[jss::account] = gw2.human();
1213 paramsB[jss::limit] = 25;
1214 paramsB[jss::marker] = marker;
1215 paramsB[jss::peer] = alice.human();
1217 requestB[jss::method] =
"account_lines";
1218 requestB[jss::jsonrpc] =
"2.0";
1219 requestB[jss::ripplerpc] =
"2.0";
1220 requestB[jss::id] = 5;
1221 requestB[jss::params] = paramsB;
1222 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1223 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1224 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1225 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1226 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1227 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1228 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);