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);
100 params[jss::account] = alice.human();
101 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
102 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
103 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
108 params[jss::account] = alice.human();
109 params[jss::ledger_index] =
"nonsense";
110 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
112 lines[jss::result][jss::error_message] ==
113 "Invalid field 'ledger_index', not string or number.");
118 params[jss::account] = alice.human();
119 params[jss::ledger_index] = 50000;
120 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
121 BEAST_EXPECT(lines[jss::result][jss::error_message] ==
"ledgerNotFound");
125 env.fund(XRP(10000), gw1);
128 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
132 IOU
const& gw1Currency = gw1Currencies.
back();
135 env(trust(alice, gw1Currency(100 + c)));
136 env(pay(gw1, alice, gw1Currency(50 + c)));
139 LedgerHeader const ledger4Info = env.closed()->header();
140 BEAST_EXPECT(ledger4Info.
seq == 4);
145 env.fund(XRP(10000), gw2);
148 env(fset(gw2, asfRequireAuth));
152 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
156 IOU
const& gw2Currency = gw2Currencies.
back();
159 env(trust(alice, gw2Currency(200 + c)));
160 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
162 env(pay(gw2, alice, gw2Currency(100 + c)));
166 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
169 LedgerHeader const ledger58Info = env.closed()->header();
170 BEAST_EXPECT(ledger58Info.
seq == 58);
173 auto testAccountLinesHistory =
177 paramsSeq[jss::account] = account.human();
178 paramsSeq[jss::ledger_index] = info.seq;
179 auto const linesSeq = env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
180 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
181 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
185 paramsHash[jss::account] = account.human();
186 paramsHash[jss::ledger_hash] =
to_string(info.hash);
187 auto const linesHash = env.rpc(
"json",
"account_lines",
to_string(paramsHash));
188 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
189 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
193 testAccountLinesHistory(alice, ledger3Info, 0);
196 testAccountLinesHistory(alice, ledger4Info, 26);
199 testAccountLinesHistory(alice, ledger58Info, 52);
204 params[jss::account] = alice.human();
206 params[jss::ledger_index] = ledger58Info.
seq;
207 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
208 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
210 lines[jss::error_message] ==
211 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
217 params[jss::account] = alice.human();
219 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
220 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
222 lines[jss::error_message] ==
"Invalid field 'ledger_index', not string or number.");
227 params[jss::account] = alice.human();
228 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
229 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
230 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
235 params[jss::account] = alice.human();
236 params[jss::peer] = gw1.human();
237 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
238 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
239 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
242 auto const& line = lines[jss::result][jss::lines][0u];
243 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
248 params[jss::account] = alice.human();
249 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
250 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
252 lines[jss::result][jss::error_message] ==
258 params[jss::account] = alice.human();
259 params[jss::limit] = -1;
260 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
262 lines[jss::result][jss::error_message] ==
268 paramsA[jss::account] = alice.human();
269 paramsA[jss::limit] = 1;
270 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
271 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
272 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
275 auto marker = linesA[jss::result][jss::marker].asString();
277 paramsB[jss::account] = alice.human();
278 paramsB[jss::marker] = marker;
279 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
280 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
281 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
285 paramsC[jss::account] = alice.human();
286 paramsC[jss::limit] = 3;
287 paramsC[jss::marker] = marker;
288 auto const linesC = env.rpc(
"json",
"account_lines",
to_string(paramsC));
289 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
290 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
293 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
295 paramsD[jss::account] = alice.human();
296 paramsD[jss::marker] = marker;
297 auto const linesD = env.rpc(
"json",
"account_lines",
to_string(paramsD));
299 linesD[jss::result][jss::error_message] ==
305 params[jss::account] = alice.human();
306 params[jss::marker] =
true;
307 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
309 lines[jss::result][jss::error_message] ==
315 params[jss::account] = alice.human();
316 params[jss::limit] = 10;
317 params[jss::peer] = gw2.human();
318 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
319 auto const& line = lines[jss::result][jss::lines][0u];
320 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
321 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
322 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
323 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
328 paramsA[jss::account] = gw2.human();
329 paramsA[jss::limit] = 1;
330 paramsA[jss::peer] = alice.human();
331 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
332 auto const& lineA = linesA[jss::result][jss::lines][0u];
333 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
334 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
335 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
336 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
339 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
340 auto const marker = linesA[jss::result][jss::marker].asString();
342 paramsB[jss::account] = gw2.human();
343 paramsB[jss::limit] = 25;
344 paramsB[jss::marker] = marker;
345 paramsB[jss::peer] = alice.human();
346 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
347 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
348 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
349 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
505 testcase(
"Marker can point to any appropriate ledger entry type");
507 using namespace std::chrono_literals;
519 env.fund(XRP(10000), alice, becky, gw1);
522 auto payChan = [](
Account const& account,
528 jv[jss::TransactionType] = jss::PaymentChannelCreate;
529 jv[jss::Account] = account.human();
530 jv[jss::Destination] = to.human();
532 jv[
"SettleDelay"] = settleDelay.count();
533 jv[
"PublicKey"] =
strHex(pk.slice());
543 env(signers(alice, 2, {{bogie, 3}}));
547 env(signers(becky, 2, {{alice, 3}}));
551 auto const eur = gw1[
"EUR"];
552 env(trust(alice, eur(200)));
553 env(trust(becky, eur(200)));
557 env(escrow::create(alice, becky, XRP(1000)), escrow::kFinishTime(env.now() + 1s));
558 env(escrow::create(becky, alice, XRP(1000)), escrow::kFinishTime(env.now() + 1s));
561 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
562 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
565 uint256 const aliceNFtokenID = token::getNextID(env, alice, 0, tfTransferable);
566 env(token::mint(alice, 0), Txflags(tfTransferable));
568 uint256 const beckyNFtokenID = token::getNextID(env, becky, 0, tfTransferable);
569 env(token::mint(becky, 0), Txflags(tfTransferable));
572 env(token::createOffer(alice, beckyNFtokenID, drops(1)), token::Owner(becky));
573 env(token::createOffer(becky, aliceNFtokenID, drops(1)), token::Owner(alice));
575 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
576 Txflags(tfSellNFToken),
577 token::Destination(alice));
578 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
579 Txflags(tfSellNFToken),
580 token::Destination(becky));
582 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
584 token::Destination(alice));
585 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
587 token::Destination(becky));
589 env(token::createOffer(becky, beckyNFtokenID, drops(1)), Txflags(tfSellNFToken));
590 env(token::createOffer(alice, aliceNFtokenID, drops(1)), Txflags(tfSellNFToken));
593 env(check::create(alice, becky, XRP(50)));
594 env(check::create(becky, alice, XRP(50)));
597 env(deposit::auth(alice, becky));
598 env(deposit::auth(becky, alice));
602 auto const usDalice = alice[
"USD"];
603 env(offer(alice, eur(10), XRP(100)));
604 env(offer(becky, usDalice(10), XRP(100)));
607 env(ticket::create(alice, 2));
610 auto const btCbecky = becky[
"BTC"];
611 env(trust(alice, btCbecky(200)));
622 params[jss::account] = alice.human();
623 params[jss::limit] = 1;
625 params[jss::marker] = *marker;
627 return env.rpc(
"json",
"account_lines",
to_string(params));
630 auto aliceLines = getNextLine(env, alice, std::nullopt);
631 static constexpr std::size_t kExpectedIterations = 16;
636 auto hasMarker = [](
auto const& aliceLines) {
637 return aliceLines[jss::result].isMember(jss::marker);
639 auto marker = [](
auto const& aliceLines) {
640 return aliceLines[jss::result][jss::marker].asString();
642 auto checkLines = [](
auto const& aliceLines) {
643 return aliceLines.isMember(jss::result) &&
644 !aliceLines[jss::result].isMember(jss::error_message) &&
645 aliceLines[jss::result].isMember(jss::lines) &&
646 aliceLines[jss::result][jss::lines].isArray() &&
647 aliceLines[jss::result][jss::lines].size() <= 1;
650 BEAST_EXPECT(hasMarker(aliceLines));
651 BEAST_EXPECT(checkLines(aliceLines));
652 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
656 while (hasMarker(aliceLines))
659 aliceLines = getNextLine(env, alice, marker(aliceLines));
660 BEAST_EXPECT(checkLines(aliceLines));
661 foundLines += aliceLines[jss::result][jss::lines].size();
664 BEAST_EXPECT(kExpectedLines == foundLines);
667 aliceObjectsParams2[jss::account] = alice.human();
668 aliceObjectsParams2[jss::limit] = 200;
670 env.rpc(
"json",
"account_objects",
to_string(aliceObjectsParams2));
671 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
672 BEAST_EXPECT(!aliceObjects[jss::result].isMember(jss::error_message));
673 BEAST_EXPECT(aliceObjects[jss::result].isMember(jss::account_objects));
674 BEAST_EXPECT(aliceObjects[jss::result][jss::account_objects].isArray());
679 aliceObjects[jss::result][jss::account_objects].size() ==
680 iterations + kExpectedNfTs);
683 BEAST_EXPECTS(iterations == kExpectedIterations,
std::to_string(iterations));
687 beckyObjectsParams[jss::account] = becky.human();
688 beckyObjectsParams[jss::limit] = 200;
690 env.rpc(
"json",
"account_objects",
to_string(beckyObjectsParams));
691 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
692 BEAST_EXPECT(!beckyObjects[jss::result].isMember(jss::error_message));
693 BEAST_EXPECT(beckyObjects[jss::result].isMember(jss::account_objects));
694 BEAST_EXPECT(beckyObjects[jss::result][jss::account_objects].isArray());
698 beckyObjects[jss::result][jss::account_objects].size() ==
699 aliceObjects[jss::result][jss::account_objects].size() - 2);
714 request[jss::method] =
"account_lines";
715 request[jss::jsonrpc] =
"2.0";
716 request[jss::ripplerpc] =
"2.0";
717 auto const lines = env.rpc(
"json2",
to_string(request));
718 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
719 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
724 request[jss::method] =
"account_lines";
725 request[jss::jsonrpc] =
"2.0";
726 request[jss::ripplerpc] =
"2.0";
727 request[jss::id] = 5;
728 auto const lines = env.rpc(
"json2",
to_string(request));
730 lines[jss::error][jss::message] ==
732 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
733 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
734 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
739 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
741 request[jss::method] =
"account_lines";
742 request[jss::jsonrpc] =
"2.0";
743 request[jss::ripplerpc] =
"2.0";
744 request[jss::id] = 5;
745 request[jss::params] = params;
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);
758 params[jss::account] = alice.human();
760 request[jss::method] =
"account_lines";
761 request[jss::jsonrpc] =
"2.0";
762 request[jss::ripplerpc] =
"2.0";
763 request[jss::id] = 5;
764 request[jss::params] = params;
765 auto const lines = env.rpc(
"json2",
to_string(request));
767 lines[jss::error][jss::message] ==
769 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
770 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
771 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
773 env.fund(XRP(10000), alice);
775 LedgerHeader const ledger3Info = env.closed()->header();
776 BEAST_EXPECT(ledger3Info.
seq == 3);
781 params[jss::account] = alice.human();
783 request[jss::method] =
"account_lines";
784 request[jss::jsonrpc] =
"2.0";
785 request[jss::ripplerpc] =
"2.0";
786 request[jss::id] = 5;
787 request[jss::params] = params;
788 auto const lines = env.rpc(
"json2",
to_string(request));
789 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
790 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
791 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
792 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
793 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
798 params[jss::account] = alice.human();
799 params[jss::ledger_index] =
"nonsense";
801 request[jss::method] =
"account_lines";
802 request[jss::jsonrpc] =
"2.0";
803 request[jss::ripplerpc] =
"2.0";
804 request[jss::id] = 5;
805 request[jss::params] = params;
806 auto const lines = env.rpc(
"json2",
to_string(request));
808 lines[jss::error][jss::message] ==
809 "Invalid field 'ledger_index', not string or number.");
810 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
811 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
812 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
817 params[jss::account] = alice.human();
818 params[jss::ledger_index] = 50000;
820 request[jss::method] =
"account_lines";
821 request[jss::jsonrpc] =
"2.0";
822 request[jss::ripplerpc] =
"2.0";
823 request[jss::id] = 5;
824 request[jss::params] = params;
825 auto const lines = env.rpc(
"json2",
to_string(request));
826 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
827 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
828 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
829 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
833 env.fund(XRP(10000), gw1);
836 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
840 IOU
const& gw1Currency = gw1Currencies.
back();
843 env(trust(alice, gw1Currency(100 + c)));
844 env(pay(gw1, alice, gw1Currency(50 + c)));
847 LedgerHeader const ledger4Info = env.closed()->header();
848 BEAST_EXPECT(ledger4Info.
seq == 4);
853 env.fund(XRP(10000), gw2);
856 env(fset(gw2, asfRequireAuth));
860 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
864 IOU
const& gw2Currency = gw2Currencies.
back();
867 env(trust(alice, gw2Currency(200 + c)));
868 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
870 env(pay(gw2, alice, gw2Currency(100 + c)));
874 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
877 LedgerHeader const ledger58Info = env.closed()->header();
878 BEAST_EXPECT(ledger58Info.
seq == 58);
881 auto testAccountLinesHistory = [
this, &env](
887 paramsSeq[jss::account] = account.human();
888 paramsSeq[jss::ledger_index] = info.seq;
890 requestSeq[jss::method] =
"account_lines";
891 requestSeq[jss::jsonrpc] =
"2.0";
892 requestSeq[jss::ripplerpc] =
"2.0";
893 requestSeq[jss::id] = 5;
894 requestSeq[jss::params] = paramsSeq;
895 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
896 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
897 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
898 BEAST_EXPECT(linesSeq.isMember(jss::jsonrpc) && linesSeq[jss::jsonrpc] ==
"2.0");
899 BEAST_EXPECT(linesSeq.isMember(jss::ripplerpc) && linesSeq[jss::ripplerpc] ==
"2.0");
900 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
904 paramsHash[jss::account] = account.human();
905 paramsHash[jss::ledger_hash] =
to_string(info.hash);
907 requestHash[jss::method] =
"account_lines";
908 requestHash[jss::jsonrpc] =
"2.0";
909 requestHash[jss::ripplerpc] =
"2.0";
910 requestHash[jss::id] = 5;
911 requestHash[jss::params] = paramsHash;
912 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
913 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
914 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
915 BEAST_EXPECT(linesHash.isMember(jss::jsonrpc) && linesHash[jss::jsonrpc] ==
"2.0");
916 BEAST_EXPECT(linesHash.isMember(jss::ripplerpc) && linesHash[jss::ripplerpc] ==
"2.0");
917 BEAST_EXPECT(linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
921 testAccountLinesHistory(alice, ledger3Info, 0);
924 testAccountLinesHistory(alice, ledger4Info, 26);
927 testAccountLinesHistory(alice, ledger58Info, 52);
933 params[jss::account] = alice.human();
935 params[jss::ledger_index] = ledger58Info.
seq;
937 request[jss::method] =
"account_lines";
938 request[jss::jsonrpc] =
"2.0";
939 request[jss::ripplerpc] =
"2.0";
940 request[jss::id] = 5;
941 request[jss::params] = params;
942 auto const lines = env.rpc(
"json2",
to_string(request));
943 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
945 lines[jss::error][jss::message] ==
946 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
948 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
949 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
950 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
955 params[jss::account] = alice.human();
957 request[jss::method] =
"account_lines";
958 request[jss::jsonrpc] =
"2.0";
959 request[jss::ripplerpc] =
"2.0";
960 request[jss::id] = 5;
961 request[jss::params] = params;
962 auto const lines = env.rpc(
"json2",
to_string(request));
963 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
964 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
965 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
966 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
967 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
972 params[jss::account] = alice.human();
973 params[jss::peer] = gw1.human();
975 request[jss::method] =
"account_lines";
976 request[jss::jsonrpc] =
"2.0";
977 request[jss::ripplerpc] =
"2.0";
978 request[jss::id] = 5;
979 request[jss::params] = params;
980 auto const lines = env.rpc(
"json2",
to_string(request));
981 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
982 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
983 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
984 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
985 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
990 params[jss::account] = alice.human();
991 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
993 request[jss::method] =
"account_lines";
994 request[jss::jsonrpc] =
"2.0";
995 request[jss::ripplerpc] =
"2.0";
996 request[jss::id] = 5;
997 request[jss::params] = params;
998 auto const lines = env.rpc(
"json2",
to_string(request));
1000 lines[jss::error][jss::message] ==
1002 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1003 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1004 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1009 params[jss::account] = alice.human();
1010 params[jss::limit] = -1;
1012 request[jss::method] =
"account_lines";
1013 request[jss::jsonrpc] =
"2.0";
1014 request[jss::ripplerpc] =
"2.0";
1015 request[jss::id] = 5;
1016 request[jss::params] = params;
1017 auto const lines = env.rpc(
"json2",
to_string(request));
1019 lines[jss::error][jss::message] ==
1021 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1022 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1023 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1028 paramsA[jss::account] = alice.human();
1029 paramsA[jss::limit] = 1;
1031 requestA[jss::method] =
"account_lines";
1032 requestA[jss::jsonrpc] =
"2.0";
1033 requestA[jss::ripplerpc] =
"2.0";
1034 requestA[jss::id] = 5;
1035 requestA[jss::params] = paramsA;
1036 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1037 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1038 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1039 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1040 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1041 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1044 auto marker = linesA[jss::result][jss::marker].asString();
1046 paramsB[jss::account] = alice.human();
1047 paramsB[jss::marker] = marker;
1049 requestB[jss::method] =
"account_lines";
1050 requestB[jss::jsonrpc] =
"2.0";
1051 requestB[jss::ripplerpc] =
"2.0";
1052 requestB[jss::id] = 5;
1053 requestB[jss::params] = paramsB;
1054 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1055 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1056 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1057 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1058 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1059 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1063 paramsC[jss::account] = alice.human();
1064 paramsC[jss::limit] = 3;
1065 paramsC[jss::marker] = marker;
1067 requestC[jss::method] =
"account_lines";
1068 requestC[jss::jsonrpc] =
"2.0";
1069 requestC[jss::ripplerpc] =
"2.0";
1070 requestC[jss::id] = 5;
1071 requestC[jss::params] = paramsC;
1072 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1073 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1074 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1075 BEAST_EXPECT(linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1076 BEAST_EXPECT(linesC.isMember(jss::ripplerpc) && linesC[jss::ripplerpc] ==
"2.0");
1077 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1080 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1082 paramsD[jss::account] = alice.human();
1083 paramsD[jss::marker] = marker;
1085 requestD[jss::method] =
"account_lines";
1086 requestD[jss::jsonrpc] =
"2.0";
1087 requestD[jss::ripplerpc] =
"2.0";
1088 requestD[jss::id] = 5;
1089 requestD[jss::params] = paramsD;
1090 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1092 linesD[jss::error][jss::message] ==
1094 BEAST_EXPECT(linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1095 BEAST_EXPECT(linesD.isMember(jss::ripplerpc) && linesD[jss::ripplerpc] ==
"2.0");
1096 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1101 params[jss::account] = alice.human();
1102 params[jss::marker] =
true;
1104 request[jss::method] =
"account_lines";
1105 request[jss::jsonrpc] =
"2.0";
1106 request[jss::ripplerpc] =
"2.0";
1107 request[jss::id] = 5;
1108 request[jss::params] = params;
1109 auto const lines = env.rpc(
"json2",
to_string(request));
1111 lines[jss::error][jss::message] ==
1113 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1114 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1115 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1120 params[jss::account] = alice.human();
1121 params[jss::limit] = 10;
1122 params[jss::peer] = gw2.human();
1124 request[jss::method] =
"account_lines";
1125 request[jss::jsonrpc] =
"2.0";
1126 request[jss::ripplerpc] =
"2.0";
1127 request[jss::id] = 5;
1128 request[jss::params] = params;
1129 auto const lines = env.rpc(
"json2",
to_string(request));
1130 auto const& line = lines[jss::result][jss::lines][0u];
1131 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1132 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1133 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1134 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1135 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1136 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1137 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1142 paramsA[jss::account] = gw2.human();
1143 paramsA[jss::limit] = 1;
1144 paramsA[jss::peer] = alice.human();
1146 requestA[jss::method] =
"account_lines";
1147 requestA[jss::jsonrpc] =
"2.0";
1148 requestA[jss::ripplerpc] =
"2.0";
1149 requestA[jss::id] = 5;
1150 requestA[jss::params] = paramsA;
1151 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1152 auto const& lineA = linesA[jss::result][jss::lines][0u];
1153 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1154 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1155 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1156 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1157 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1158 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1159 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1162 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1163 auto const marker = linesA[jss::result][jss::marker].asString();
1165 paramsB[jss::account] = gw2.human();
1166 paramsB[jss::limit] = 25;
1167 paramsB[jss::marker] = marker;
1168 paramsB[jss::peer] = alice.human();
1170 requestB[jss::method] =
"account_lines";
1171 requestB[jss::jsonrpc] =
"2.0";
1172 requestB[jss::ripplerpc] =
"2.0";
1173 requestB[jss::id] = 5;
1174 requestB[jss::params] = paramsB;
1175 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1176 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1177 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1178 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1179 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1180 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1181 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);