19 using namespace test::jtx;
23 auto const lines = env.rpc(
"json",
"account_lines",
"{ }");
30 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
31 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
37 auto testInvalidAccountParam = [&](
auto const& param) {
39 params[jss::account] = param;
40 auto jrr = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
41 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
42 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
45 testInvalidAccountParam(1);
46 testInvalidAccountParam(1.1);
47 testInvalidAccountParam(
true);
52 Account
const alice{
"alice"};
56 params[jss::account] = alice.human();
57 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
61 env.fund(XRP(10000), alice);
64 BEAST_EXPECT(ledger3Info.
seq == 3);
69 params[jss::account] = alice.human();
70 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
71 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
72 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
77 params[jss::account] = alice.human();
78 params[jss::ledger_index] =
"nonsense";
79 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
81 lines[jss::result][jss::error_message] ==
"Invalid field 'ledger_index', not string or number.");
86 params[jss::account] = alice.human();
87 params[jss::ledger_index] = 50000;
88 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
89 BEAST_EXPECT(lines[jss::result][jss::error_message] ==
"ledgerNotFound");
92 Account
const gw1{
"gw1"};
93 env.fund(XRP(10000), gw1);
96 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
100 IOU
const& gw1Currency = gw1Currencies.
back();
103 env(trust(alice, gw1Currency(100 + c)));
104 env(pay(gw1, alice, gw1Currency(50 + c)));
107 LedgerHeader const ledger4Info = env.closed()->header();
108 BEAST_EXPECT(ledger4Info.
seq == 4);
112 Account
const gw2{
"gw2"};
113 env.fund(XRP(10000), gw2);
120 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
124 IOU
const& gw2Currency = gw2Currencies.
back();
127 env(trust(alice, gw2Currency(200 + c)));
128 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
130 env(pay(gw2, alice, gw2Currency(100 + c)));
137 LedgerHeader const ledger58Info = env.closed()->header();
138 BEAST_EXPECT(ledger58Info.
seq == 58);
141 auto testAccountLinesHistory = [
this, &env](Account
const& account,
LedgerHeader const& info,
int count) {
144 paramsSeq[jss::account] = account.human();
145 paramsSeq[jss::ledger_index] = info.seq;
146 auto const linesSeq = env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
147 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
148 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
152 paramsHash[jss::account] = account.human();
153 paramsHash[jss::ledger_hash] =
to_string(info.hash);
154 auto const linesHash = env.rpc(
"json",
"account_lines",
to_string(paramsHash));
155 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
156 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
160 testAccountLinesHistory(alice, ledger3Info, 0);
163 testAccountLinesHistory(alice, ledger4Info, 26);
166 testAccountLinesHistory(alice, ledger58Info, 52);
171 params[jss::account] = alice.human();
173 params[jss::ledger_index] = ledger58Info.
seq;
174 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
175 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
177 lines[jss::error_message] ==
178 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
184 params[jss::account] = alice.human();
186 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
187 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
188 BEAST_EXPECT(lines[jss::error_message] ==
"Invalid field 'ledger_index', not string or number.");
193 params[jss::account] = alice.human();
194 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
195 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
196 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
201 params[jss::account] = alice.human();
202 params[jss::peer] = gw1.human();
203 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
204 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
205 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
208 auto const& line = lines[jss::result][jss::lines][0u];
209 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
214 params[jss::account] = alice.human();
215 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
216 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
223 params[jss::account] = alice.human();
224 params[jss::limit] = -1;
225 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
232 paramsA[jss::account] = alice.human();
233 paramsA[jss::limit] = 1;
234 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
235 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
236 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
239 auto marker = linesA[jss::result][jss::marker].asString();
241 paramsB[jss::account] = alice.human();
242 paramsB[jss::marker] = marker;
243 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
244 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
245 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
249 paramsC[jss::account] = alice.human();
250 paramsC[jss::limit] = 3;
251 paramsC[jss::marker] = marker;
252 auto const linesC = env.rpc(
"json",
"account_lines",
to_string(paramsC));
253 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
254 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
257 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
259 paramsD[jss::account] = alice.human();
260 paramsD[jss::marker] = marker;
261 auto const linesD = env.rpc(
"json",
"account_lines",
to_string(paramsD));
268 params[jss::account] = alice.human();
269 params[jss::marker] =
true;
270 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
276 params[jss::account] = alice.human();
277 params[jss::limit] = 10;
278 params[jss::peer] = gw2.human();
279 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
280 auto const& line = lines[jss::result][jss::lines][0u];
281 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
282 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
283 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
284 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
289 paramsA[jss::account] = gw2.human();
290 paramsA[jss::limit] = 1;
291 paramsA[jss::peer] = alice.human();
292 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
293 auto const& lineA = linesA[jss::result][jss::lines][0u];
294 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
295 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
296 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
297 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
300 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
301 auto const marker = linesA[jss::result][jss::marker].asString();
303 paramsB[jss::account] = gw2.human();
304 paramsB[jss::limit] = 25;
305 paramsB[jss::marker] = marker;
306 paramsB[jss::peer] = alice.human();
307 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
308 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
309 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
310 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
464 testcase(
"Marker can point to any appropriate ledger entry type");
465 using namespace test::jtx;
466 using namespace std::chrono_literals;
475 Account
const alice{
"alice"};
476 Account
const becky{
"becky"};
477 Account
const gw1{
"gw1"};
478 env.fund(XRP(10000), alice, becky, gw1);
481 auto payChan = [](Account
const& account,
487 jv[jss::TransactionType] = jss::PaymentChannelCreate;
488 jv[jss::Account] = account.human();
489 jv[jss::Destination] = to.human();
491 jv[
"SettleDelay"] = settleDelay.count();
492 jv[
"PublicKey"] =
strHex(pk.slice());
501 Account
const bogie{
"bogie"};
502 env(signers(alice, 2, {{bogie, 3}}));
506 env(signers(becky, 2, {{alice, 3}}));
510 auto const EUR = gw1[
"EUR"];
511 env(trust(alice, EUR(200)));
512 env(trust(becky, EUR(200)));
516 env(escrow::create(alice, becky, XRP(1000)), escrow::finish_time(env.now() + 1s));
517 env(escrow::create(becky, alice, XRP(1000)), escrow::finish_time(env.now() + 1s));
520 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
521 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
531 env(token::createOffer(alice, beckyNFtokenID, drops(1)), token::owner(becky));
532 env(token::createOffer(becky, aliceNFtokenID, drops(1)), token::owner(alice));
534 env(token::createOffer(becky, beckyNFtokenID, drops(1)), txflags(
tfSellNFToken), token::destination(alice));
535 env(token::createOffer(alice, aliceNFtokenID, drops(1)), txflags(
tfSellNFToken), token::destination(becky));
537 env(token::createOffer(gw1, beckyNFtokenID, drops(1)), token::owner(becky), token::destination(alice));
538 env(token::createOffer(gw1, aliceNFtokenID, drops(1)), token::owner(alice), token::destination(becky));
540 env(token::createOffer(becky, beckyNFtokenID, drops(1)), txflags(
tfSellNFToken));
541 env(token::createOffer(alice, aliceNFtokenID, drops(1)), txflags(
tfSellNFToken));
544 env(check::create(alice, becky, XRP(50)));
545 env(check::create(becky, alice, XRP(50)));
548 env(deposit::auth(alice, becky));
549 env(deposit::auth(becky, alice));
553 auto const USDalice = alice[
"USD"];
554 env(offer(alice, EUR(10), XRP(100)));
555 env(offer(becky, USDalice(10), XRP(100)));
558 env(ticket::create(alice, 2));
561 auto const BTCbecky = becky[
"BTC"];
562 env(trust(alice, BTCbecky(200)));
572 params[jss::account] = alice.human();
573 params[jss::limit] = 1;
575 params[jss::marker] = *marker;
577 return env.rpc(
"json",
"account_lines",
to_string(params));
580 auto aliceLines = getNextLine(env, alice,
std::nullopt);
586 auto hasMarker = [](
auto const& aliceLines) {
return aliceLines[jss::result].isMember(jss::marker); };
587 auto marker = [](
auto const& aliceLines) {
return aliceLines[jss::result][jss::marker].asString(); };
588 auto checkLines = [](
auto const& aliceLines) {
589 return aliceLines.isMember(jss::result) && !aliceLines[jss::result].isMember(jss::error_message) &&
590 aliceLines[jss::result].isMember(jss::lines) && aliceLines[jss::result][jss::lines].isArray() &&
591 aliceLines[jss::result][jss::lines].size() <= 1;
594 BEAST_EXPECT(hasMarker(aliceLines));
595 BEAST_EXPECT(checkLines(aliceLines));
596 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
600 while (hasMarker(aliceLines))
603 aliceLines = getNextLine(env, alice, marker(aliceLines));
604 BEAST_EXPECT(checkLines(aliceLines));
605 foundLines += aliceLines[jss::result][jss::lines].size();
608 BEAST_EXPECT(expectedLines == foundLines);
611 aliceObjectsParams2[jss::account] = alice.human();
612 aliceObjectsParams2[jss::limit] = 200;
613 Json::Value const aliceObjects = env.rpc(
"json",
"account_objects",
to_string(aliceObjectsParams2));
614 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
615 BEAST_EXPECT(!aliceObjects[jss::result].isMember(jss::error_message));
616 BEAST_EXPECT(aliceObjects[jss::result].isMember(jss::account_objects));
617 BEAST_EXPECT(aliceObjects[jss::result][jss::account_objects].isArray());
621 BEAST_EXPECT(aliceObjects[jss::result][jss::account_objects].size() == iterations + expectedNFTs);
624 BEAST_EXPECTS(iterations == expectedIterations,
std::to_string(iterations));
628 beckyObjectsParams[jss::account] = becky.human();
629 beckyObjectsParams[jss::limit] = 200;
630 Json::Value const beckyObjects = env.rpc(
"json",
"account_objects",
to_string(beckyObjectsParams));
631 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
632 BEAST_EXPECT(!beckyObjects[jss::result].isMember(jss::error_message));
633 BEAST_EXPECT(beckyObjects[jss::result].isMember(jss::account_objects));
634 BEAST_EXPECT(beckyObjects[jss::result][jss::account_objects].isArray());
638 beckyObjects[jss::result][jss::account_objects].size() ==
639 aliceObjects[jss::result][jss::account_objects].size() - 2);
649 using namespace test::jtx;
654 request[jss::method] =
"account_lines";
655 request[jss::jsonrpc] =
"2.0";
656 request[jss::ripplerpc] =
"2.0";
657 auto const lines = env.rpc(
"json2",
to_string(request));
658 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
659 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
664 request[jss::method] =
"account_lines";
665 request[jss::jsonrpc] =
"2.0";
666 request[jss::ripplerpc] =
"2.0";
667 request[jss::id] = 5;
668 auto const lines = env.rpc(
"json2",
to_string(request));
670 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
671 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
672 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
677 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
679 request[jss::method] =
"account_lines";
680 request[jss::jsonrpc] =
"2.0";
681 request[jss::ripplerpc] =
"2.0";
682 request[jss::id] = 5;
683 request[jss::params] = params;
684 auto const lines = env.rpc(
"json2",
to_string(request));
686 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
687 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
688 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
690 Account
const alice{
"alice"};
694 params[jss::account] = alice.human();
696 request[jss::method] =
"account_lines";
697 request[jss::jsonrpc] =
"2.0";
698 request[jss::ripplerpc] =
"2.0";
699 request[jss::id] = 5;
700 request[jss::params] = params;
701 auto const lines = env.rpc(
"json2",
to_string(request));
703 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
704 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
705 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
707 env.fund(XRP(10000), alice);
709 LedgerHeader const ledger3Info = env.closed()->header();
710 BEAST_EXPECT(ledger3Info.
seq == 3);
715 params[jss::account] = alice.human();
717 request[jss::method] =
"account_lines";
718 request[jss::jsonrpc] =
"2.0";
719 request[jss::ripplerpc] =
"2.0";
720 request[jss::id] = 5;
721 request[jss::params] = params;
722 auto const lines = env.rpc(
"json2",
to_string(request));
723 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
724 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
725 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
726 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
727 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
732 params[jss::account] = alice.human();
733 params[jss::ledger_index] =
"nonsense";
735 request[jss::method] =
"account_lines";
736 request[jss::jsonrpc] =
"2.0";
737 request[jss::ripplerpc] =
"2.0";
738 request[jss::id] = 5;
739 request[jss::params] = params;
740 auto const lines = env.rpc(
"json2",
to_string(request));
741 BEAST_EXPECT(lines[jss::error][jss::message] ==
"Invalid field 'ledger_index', not string or number.");
742 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
743 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
744 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
749 params[jss::account] = alice.human();
750 params[jss::ledger_index] = 50000;
752 request[jss::method] =
"account_lines";
753 request[jss::jsonrpc] =
"2.0";
754 request[jss::ripplerpc] =
"2.0";
755 request[jss::id] = 5;
756 request[jss::params] = params;
757 auto const lines = env.rpc(
"json2",
to_string(request));
758 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
759 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
760 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
761 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
764 Account
const gw1{
"gw1"};
765 env.fund(XRP(10000), gw1);
768 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
772 IOU
const& gw1Currency = gw1Currencies.
back();
775 env(trust(alice, gw1Currency(100 + c)));
776 env(pay(gw1, alice, gw1Currency(50 + c)));
779 LedgerHeader const ledger4Info = env.closed()->header();
780 BEAST_EXPECT(ledger4Info.
seq == 4);
784 Account
const gw2{
"gw2"};
785 env.fund(XRP(10000), gw2);
792 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
796 IOU
const& gw2Currency = gw2Currencies.
back();
799 env(trust(alice, gw2Currency(200 + c)));
800 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
802 env(pay(gw2, alice, gw2Currency(100 + c)));
809 LedgerHeader const ledger58Info = env.closed()->header();
810 BEAST_EXPECT(ledger58Info.
seq == 58);
813 auto testAccountLinesHistory = [
this, &env](Account
const& account,
LedgerHeader const& info,
int count) {
816 paramsSeq[jss::account] = account.human();
817 paramsSeq[jss::ledger_index] = info.seq;
819 requestSeq[jss::method] =
"account_lines";
820 requestSeq[jss::jsonrpc] =
"2.0";
821 requestSeq[jss::ripplerpc] =
"2.0";
822 requestSeq[jss::id] = 5;
823 requestSeq[jss::params] = paramsSeq;
824 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
825 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
826 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
827 BEAST_EXPECT(linesSeq.isMember(jss::jsonrpc) && linesSeq[jss::jsonrpc] ==
"2.0");
828 BEAST_EXPECT(linesSeq.isMember(jss::ripplerpc) && linesSeq[jss::ripplerpc] ==
"2.0");
829 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
833 paramsHash[jss::account] = account.human();
834 paramsHash[jss::ledger_hash] =
to_string(info.hash);
836 requestHash[jss::method] =
"account_lines";
837 requestHash[jss::jsonrpc] =
"2.0";
838 requestHash[jss::ripplerpc] =
"2.0";
839 requestHash[jss::id] = 5;
840 requestHash[jss::params] = paramsHash;
841 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
842 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
843 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
844 BEAST_EXPECT(linesHash.isMember(jss::jsonrpc) && linesHash[jss::jsonrpc] ==
"2.0");
845 BEAST_EXPECT(linesHash.isMember(jss::ripplerpc) && linesHash[jss::ripplerpc] ==
"2.0");
846 BEAST_EXPECT(linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
850 testAccountLinesHistory(alice, ledger3Info, 0);
853 testAccountLinesHistory(alice, ledger4Info, 26);
856 testAccountLinesHistory(alice, ledger58Info, 52);
862 params[jss::account] = alice.human();
864 params[jss::ledger_index] = ledger58Info.
seq;
866 request[jss::method] =
"account_lines";
867 request[jss::jsonrpc] =
"2.0";
868 request[jss::ripplerpc] =
"2.0";
869 request[jss::id] = 5;
870 request[jss::params] = params;
871 auto const lines = env.rpc(
"json2",
to_string(request));
872 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
874 lines[jss::error][jss::message] ==
875 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
877 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
878 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
879 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
884 params[jss::account] = alice.human();
886 request[jss::method] =
"account_lines";
887 request[jss::jsonrpc] =
"2.0";
888 request[jss::ripplerpc] =
"2.0";
889 request[jss::id] = 5;
890 request[jss::params] = params;
891 auto const lines = env.rpc(
"json2",
to_string(request));
892 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
893 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
894 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
895 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
896 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
901 params[jss::account] = alice.human();
902 params[jss::peer] = gw1.human();
904 request[jss::method] =
"account_lines";
905 request[jss::jsonrpc] =
"2.0";
906 request[jss::ripplerpc] =
"2.0";
907 request[jss::id] = 5;
908 request[jss::params] = params;
909 auto const lines = env.rpc(
"json2",
to_string(request));
910 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
911 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
912 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
913 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
914 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
919 params[jss::account] = alice.human();
920 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
922 request[jss::method] =
"account_lines";
923 request[jss::jsonrpc] =
"2.0";
924 request[jss::ripplerpc] =
"2.0";
925 request[jss::id] = 5;
926 request[jss::params] = params;
927 auto const lines = env.rpc(
"json2",
to_string(request));
929 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
930 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
931 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
936 params[jss::account] = alice.human();
937 params[jss::limit] = -1;
939 request[jss::method] =
"account_lines";
940 request[jss::jsonrpc] =
"2.0";
941 request[jss::ripplerpc] =
"2.0";
942 request[jss::id] = 5;
943 request[jss::params] = params;
944 auto const lines = env.rpc(
"json2",
to_string(request));
947 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
948 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
949 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
954 paramsA[jss::account] = alice.human();
955 paramsA[jss::limit] = 1;
957 requestA[jss::method] =
"account_lines";
958 requestA[jss::jsonrpc] =
"2.0";
959 requestA[jss::ripplerpc] =
"2.0";
960 requestA[jss::id] = 5;
961 requestA[jss::params] = paramsA;
962 auto const linesA = env.rpc(
"json2",
to_string(requestA));
963 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
964 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
965 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
966 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
967 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
970 auto marker = linesA[jss::result][jss::marker].asString();
972 paramsB[jss::account] = alice.human();
973 paramsB[jss::marker] = marker;
975 requestB[jss::method] =
"account_lines";
976 requestB[jss::jsonrpc] =
"2.0";
977 requestB[jss::ripplerpc] =
"2.0";
978 requestB[jss::id] = 5;
979 requestB[jss::params] = paramsB;
980 auto const linesB = env.rpc(
"json2",
to_string(requestB));
981 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
982 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
983 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
984 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
985 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
989 paramsC[jss::account] = alice.human();
990 paramsC[jss::limit] = 3;
991 paramsC[jss::marker] = marker;
993 requestC[jss::method] =
"account_lines";
994 requestC[jss::jsonrpc] =
"2.0";
995 requestC[jss::ripplerpc] =
"2.0";
996 requestC[jss::id] = 5;
997 requestC[jss::params] = paramsC;
998 auto const linesC = env.rpc(
"json2",
to_string(requestC));
999 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1000 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1001 BEAST_EXPECT(linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1002 BEAST_EXPECT(linesC.isMember(jss::ripplerpc) && linesC[jss::ripplerpc] ==
"2.0");
1003 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1006 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1008 paramsD[jss::account] = alice.human();
1009 paramsD[jss::marker] = marker;
1011 requestD[jss::method] =
"account_lines";
1012 requestD[jss::jsonrpc] =
"2.0";
1013 requestD[jss::ripplerpc] =
"2.0";
1014 requestD[jss::id] = 5;
1015 requestD[jss::params] = paramsD;
1016 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1018 BEAST_EXPECT(linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1019 BEAST_EXPECT(linesD.isMember(jss::ripplerpc) && linesD[jss::ripplerpc] ==
"2.0");
1020 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1025 params[jss::account] = alice.human();
1026 params[jss::marker] =
true;
1028 request[jss::method] =
"account_lines";
1029 request[jss::jsonrpc] =
"2.0";
1030 request[jss::ripplerpc] =
"2.0";
1031 request[jss::id] = 5;
1032 request[jss::params] = params;
1033 auto const lines = env.rpc(
"json2",
to_string(request));
1035 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1036 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1037 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1042 params[jss::account] = alice.human();
1043 params[jss::limit] = 10;
1044 params[jss::peer] = gw2.human();
1046 request[jss::method] =
"account_lines";
1047 request[jss::jsonrpc] =
"2.0";
1048 request[jss::ripplerpc] =
"2.0";
1049 request[jss::id] = 5;
1050 request[jss::params] = params;
1051 auto const lines = env.rpc(
"json2",
to_string(request));
1052 auto const& line = lines[jss::result][jss::lines][0u];
1053 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1054 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1055 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1056 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1057 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1058 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1059 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1064 paramsA[jss::account] = gw2.human();
1065 paramsA[jss::limit] = 1;
1066 paramsA[jss::peer] = alice.human();
1068 requestA[jss::method] =
"account_lines";
1069 requestA[jss::jsonrpc] =
"2.0";
1070 requestA[jss::ripplerpc] =
"2.0";
1071 requestA[jss::id] = 5;
1072 requestA[jss::params] = paramsA;
1073 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1074 auto const& lineA = linesA[jss::result][jss::lines][0u];
1075 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1076 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1077 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1078 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1079 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1080 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1081 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1084 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1085 auto const marker = linesA[jss::result][jss::marker].asString();
1087 paramsB[jss::account] = gw2.human();
1088 paramsB[jss::limit] = 25;
1089 paramsB[jss::marker] = marker;
1090 paramsB[jss::peer] = alice.human();
1092 requestB[jss::method] =
"account_lines";
1093 requestB[jss::jsonrpc] =
"2.0";
1094 requestB[jss::ripplerpc] =
"2.0";
1095 requestB[jss::id] = 5;
1096 requestB[jss::params] = paramsB;
1097 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1098 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1099 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1100 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1101 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1102 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1103 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);