53 auto const lines = env.rpc(
"json",
"account_lines",
"{ }");
55 lines[jss::result][jss::error_message] ==
61 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
62 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
64 lines[jss::result][jss::error_message] ==
69 auto testInvalidAccountParam = [&](
auto const& param) {
71 params[jss::account] = param;
72 auto jrr = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
73 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
74 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
77 testInvalidAccountParam(1);
78 testInvalidAccountParam(1.1);
79 testInvalidAccountParam(
true);
88 params[jss::account] = alice.human();
89 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
91 lines[jss::result][jss::error_message] ==
94 env.fund(XRP(10000), alice);
97 BEAST_EXPECT(ledger3Info.
seq == 3);
101 auto testInvalidPeerParam = [&](
auto const& param) {
103 params[jss::account] = alice.human();
104 params[jss::peer] = param;
105 auto jrr = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
106 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
107 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'peer'.");
110 testInvalidPeerParam(1);
111 testInvalidPeerParam(1.1);
112 testInvalidPeerParam(
true);
120 params[jss::account] = alice.human();
121 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
122 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
123 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
128 params[jss::account] = alice.human();
129 params[jss::ledger_index] =
"nonsense";
130 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
132 lines[jss::result][jss::error_message] ==
133 "Invalid field 'ledger_index', not string or number.");
138 params[jss::account] = alice.human();
139 params[jss::ledger_index] = 50000;
140 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
141 BEAST_EXPECT(lines[jss::result][jss::error_message] ==
"ledgerNotFound");
145 env.fund(XRP(10000), gw1);
148 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
152 IOU
const& gw1Currency = gw1Currencies.
back();
155 env(trust(alice, gw1Currency(100 + c)));
156 env(pay(gw1, alice, gw1Currency(50 + c)));
159 LedgerHeader const ledger4Info = env.closed()->header();
160 BEAST_EXPECT(ledger4Info.
seq == 4);
165 env.fund(XRP(10000), gw2);
168 env(fset(gw2, asfRequireAuth));
172 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
176 IOU
const& gw2Currency = gw2Currencies.
back();
179 env(trust(alice, gw2Currency(200 + c)));
180 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
182 env(pay(gw2, alice, gw2Currency(100 + c)));
186 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
189 LedgerHeader const ledger58Info = env.closed()->header();
190 BEAST_EXPECT(ledger58Info.
seq == 58);
193 auto testAccountLinesHistory =
197 paramsSeq[jss::account] = account.human();
198 paramsSeq[jss::ledger_index] = info.seq;
199 auto const linesSeq = env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
200 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
201 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
205 paramsHash[jss::account] = account.human();
206 paramsHash[jss::ledger_hash] =
to_string(info.hash);
207 auto const linesHash = env.rpc(
"json",
"account_lines",
to_string(paramsHash));
208 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
209 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
213 testAccountLinesHistory(alice, ledger3Info, 0);
216 testAccountLinesHistory(alice, ledger4Info, 26);
219 testAccountLinesHistory(alice, ledger58Info, 52);
224 params[jss::account] = alice.human();
226 params[jss::ledger_index] = ledger58Info.
seq;
227 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
228 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
230 lines[jss::error_message] ==
231 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
237 params[jss::account] = alice.human();
239 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
240 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
242 lines[jss::error_message] ==
"Invalid field 'ledger_index', not string or number.");
247 params[jss::account] = alice.human();
248 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
249 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
250 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
255 params[jss::account] = alice.human();
256 params[jss::peer] = gw1.human();
257 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
258 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
259 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
262 auto const& line = lines[jss::result][jss::lines][0u];
263 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
268 params[jss::account] = alice.human();
269 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
270 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
272 lines[jss::result][jss::error_message] ==
278 params[jss::account] = alice.human();
279 params[jss::limit] = -1;
280 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
282 lines[jss::result][jss::error_message] ==
288 paramsA[jss::account] = alice.human();
289 paramsA[jss::limit] = 1;
290 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
291 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
292 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
295 auto marker = linesA[jss::result][jss::marker].asString();
297 paramsB[jss::account] = alice.human();
298 paramsB[jss::marker] = marker;
299 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
300 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
301 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
305 paramsC[jss::account] = alice.human();
306 paramsC[jss::limit] = 3;
307 paramsC[jss::marker] = marker;
308 auto const linesC = env.rpc(
"json",
"account_lines",
to_string(paramsC));
309 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
310 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
313 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
315 paramsD[jss::account] = alice.human();
316 paramsD[jss::marker] = marker;
317 auto const linesD = env.rpc(
"json",
"account_lines",
to_string(paramsD));
319 linesD[jss::result][jss::error_message] ==
325 params[jss::account] = alice.human();
326 params[jss::marker] =
true;
327 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
329 lines[jss::result][jss::error_message] ==
335 params[jss::account] = alice.human();
336 params[jss::limit] = 10;
337 params[jss::peer] = gw2.human();
338 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
339 auto const& line = lines[jss::result][jss::lines][0u];
340 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
341 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
342 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
343 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
348 paramsA[jss::account] = gw2.human();
349 paramsA[jss::limit] = 1;
350 paramsA[jss::peer] = alice.human();
351 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
352 auto const& lineA = linesA[jss::result][jss::lines][0u];
353 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
354 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
355 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
356 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
359 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
360 auto const marker = linesA[jss::result][jss::marker].asString();
362 paramsB[jss::account] = gw2.human();
363 paramsB[jss::limit] = 25;
364 paramsB[jss::marker] = marker;
365 paramsB[jss::peer] = alice.human();
366 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
367 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
368 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
369 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
590 testcase(
"Marker can point to any appropriate ledger entry type");
592 using namespace std::chrono_literals;
604 env.fund(XRP(10000), alice, becky, gw1);
607 auto payChan = [](
Account const& account,
613 jv[jss::TransactionType] = jss::PaymentChannelCreate;
614 jv[jss::Account] = account.human();
615 jv[jss::Destination] = to.human();
617 jv[
"SettleDelay"] = settleDelay.count();
618 jv[
"PublicKey"] =
strHex(pk.slice());
628 env(signers(alice, 2, {{bogie, 3}}));
632 env(signers(becky, 2, {{alice, 3}}));
636 auto const eur = gw1[
"EUR"];
637 env(trust(alice, eur(200)));
638 env(trust(becky, eur(200)));
642 env(escrow::create(alice, becky, XRP(1000)), escrow::kFinishTime(env.now() + 1s));
643 env(escrow::create(becky, alice, XRP(1000)), escrow::kFinishTime(env.now() + 1s));
646 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
647 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
650 UInt256 const aliceNFtokenID = token::getNextID(env, alice, 0, tfTransferable);
651 env(token::mint(alice, 0), Txflags(tfTransferable));
653 UInt256 const beckyNFtokenID = token::getNextID(env, becky, 0, tfTransferable);
654 env(token::mint(becky, 0), Txflags(tfTransferable));
657 env(token::createOffer(alice, beckyNFtokenID, drops(1)), token::Owner(becky));
658 env(token::createOffer(becky, aliceNFtokenID, drops(1)), token::Owner(alice));
660 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
661 Txflags(tfSellNFToken),
662 token::Destination(alice));
663 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
664 Txflags(tfSellNFToken),
665 token::Destination(becky));
667 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
669 token::Destination(alice));
670 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
672 token::Destination(becky));
674 env(token::createOffer(becky, beckyNFtokenID, drops(1)), Txflags(tfSellNFToken));
675 env(token::createOffer(alice, aliceNFtokenID, drops(1)), Txflags(tfSellNFToken));
678 env(check::create(alice, becky, XRP(50)));
679 env(check::create(becky, alice, XRP(50)));
682 env(deposit::auth(alice, becky));
683 env(deposit::auth(becky, alice));
687 auto const usDalice = alice[
"USD"];
688 env(offer(alice, eur(10), XRP(100)));
689 env(offer(becky, usDalice(10), XRP(100)));
692 env(ticket::create(alice, 2));
695 auto const btcBecky = becky[
"BTC"];
696 env(trust(alice, btcBecky(200)));
707 params[jss::account] = alice.human();
708 params[jss::limit] = 1;
710 params[jss::marker] = *marker;
712 return env.rpc(
"json",
"account_lines",
to_string(params));
715 auto aliceLines = getNextLine(env, alice, std::nullopt);
716 static constexpr std::size_t kExpectedIterations = 16;
721 auto hasMarker = [](
auto const& aliceLines) {
722 return aliceLines[jss::result].isMember(jss::marker);
724 auto marker = [](
auto const& aliceLines) {
725 return aliceLines[jss::result][jss::marker].asString();
727 auto checkLines = [](
auto const& aliceLines) {
728 return aliceLines.isMember(jss::result) &&
729 !aliceLines[jss::result].isMember(jss::error_message) &&
730 aliceLines[jss::result].isMember(jss::lines) &&
731 aliceLines[jss::result][jss::lines].isArray() &&
732 aliceLines[jss::result][jss::lines].size() <= 1;
735 BEAST_EXPECT(hasMarker(aliceLines));
736 BEAST_EXPECT(checkLines(aliceLines));
737 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
741 while (hasMarker(aliceLines))
744 aliceLines = getNextLine(env, alice, marker(aliceLines));
745 BEAST_EXPECT(checkLines(aliceLines));
746 foundLines += aliceLines[jss::result][jss::lines].size();
749 BEAST_EXPECT(kExpectedLines == foundLines);
752 aliceObjectsParams2[jss::account] = alice.human();
753 aliceObjectsParams2[jss::limit] = 200;
755 env.rpc(
"json",
"account_objects",
to_string(aliceObjectsParams2));
756 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
757 BEAST_EXPECT(!aliceObjects[jss::result].isMember(jss::error_message));
758 BEAST_EXPECT(aliceObjects[jss::result].isMember(jss::account_objects));
759 BEAST_EXPECT(aliceObjects[jss::result][jss::account_objects].isArray());
764 aliceObjects[jss::result][jss::account_objects].size() ==
765 iterations + kExpectedNfTs);
768 BEAST_EXPECTS(iterations == kExpectedIterations,
std::to_string(iterations));
772 beckyObjectsParams[jss::account] = becky.human();
773 beckyObjectsParams[jss::limit] = 200;
775 env.rpc(
"json",
"account_objects",
to_string(beckyObjectsParams));
776 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
777 BEAST_EXPECT(!beckyObjects[jss::result].isMember(jss::error_message));
778 BEAST_EXPECT(beckyObjects[jss::result].isMember(jss::account_objects));
779 BEAST_EXPECT(beckyObjects[jss::result][jss::account_objects].isArray());
783 beckyObjects[jss::result][jss::account_objects].size() ==
784 aliceObjects[jss::result][jss::account_objects].size() - 2);
799 request[jss::method] =
"account_lines";
800 request[jss::jsonrpc] =
"2.0";
801 request[jss::ripplerpc] =
"2.0";
802 auto const lines = env.rpc(
"json2",
to_string(request));
803 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
804 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
809 request[jss::method] =
"account_lines";
810 request[jss::jsonrpc] =
"2.0";
811 request[jss::ripplerpc] =
"2.0";
812 request[jss::id] = 5;
813 auto const lines = env.rpc(
"json2",
to_string(request));
815 lines[jss::error][jss::message] ==
817 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
818 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
819 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
824 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
826 request[jss::method] =
"account_lines";
827 request[jss::jsonrpc] =
"2.0";
828 request[jss::ripplerpc] =
"2.0";
829 request[jss::id] = 5;
830 request[jss::params] = params;
831 auto const lines = env.rpc(
"json2",
to_string(request));
833 lines[jss::error][jss::message] ==
835 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
836 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
837 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
843 params[jss::account] = alice.human();
845 request[jss::method] =
"account_lines";
846 request[jss::jsonrpc] =
"2.0";
847 request[jss::ripplerpc] =
"2.0";
848 request[jss::id] = 5;
849 request[jss::params] = params;
850 auto const lines = env.rpc(
"json2",
to_string(request));
852 lines[jss::error][jss::message] ==
854 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
855 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
856 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
858 env.fund(XRP(10000), alice);
860 LedgerHeader const ledger3Info = env.closed()->header();
861 BEAST_EXPECT(ledger3Info.
seq == 3);
865 auto testInvalidPeerParam = [&](
auto const& param) {
867 params[jss::account] = alice.human();
868 params[jss::peer] = param;
871 request[jss::method] =
"account_lines";
872 request[jss::jsonrpc] =
"2.0";
873 request[jss::ripplerpc] =
"2.0";
874 request[jss::id] = 5;
875 request[jss::params] = params;
877 auto const lines = env.rpc(
"json2",
to_string(request));
878 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
879 BEAST_EXPECT(lines[jss::error][jss::message] ==
"Invalid field 'peer'.");
880 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
881 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
882 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
885 testInvalidPeerParam(1);
886 testInvalidPeerParam(1.1);
887 testInvalidPeerParam(
true);
895 params[jss::account] = alice.human();
897 request[jss::method] =
"account_lines";
898 request[jss::jsonrpc] =
"2.0";
899 request[jss::ripplerpc] =
"2.0";
900 request[jss::id] = 5;
901 request[jss::params] = params;
902 auto const lines = env.rpc(
"json2",
to_string(request));
903 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
904 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
905 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
906 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
907 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
912 params[jss::account] = alice.human();
913 params[jss::ledger_index] =
"nonsense";
915 request[jss::method] =
"account_lines";
916 request[jss::jsonrpc] =
"2.0";
917 request[jss::ripplerpc] =
"2.0";
918 request[jss::id] = 5;
919 request[jss::params] = params;
920 auto const lines = env.rpc(
"json2",
to_string(request));
922 lines[jss::error][jss::message] ==
923 "Invalid field 'ledger_index', not string or number.");
924 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
925 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
926 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
931 params[jss::account] = alice.human();
932 params[jss::ledger_index] = 50000;
934 request[jss::method] =
"account_lines";
935 request[jss::jsonrpc] =
"2.0";
936 request[jss::ripplerpc] =
"2.0";
937 request[jss::id] = 5;
938 request[jss::params] = params;
939 auto const lines = env.rpc(
"json2",
to_string(request));
940 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
941 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
942 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
943 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
947 env.fund(XRP(10000), gw1);
950 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
954 IOU
const& gw1Currency = gw1Currencies.
back();
957 env(trust(alice, gw1Currency(100 + c)));
958 env(pay(gw1, alice, gw1Currency(50 + c)));
961 LedgerHeader const ledger4Info = env.closed()->header();
962 BEAST_EXPECT(ledger4Info.
seq == 4);
967 env.fund(XRP(10000), gw2);
970 env(fset(gw2, asfRequireAuth));
974 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
978 IOU
const& gw2Currency = gw2Currencies.
back();
981 env(trust(alice, gw2Currency(200 + c)));
982 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
984 env(pay(gw2, alice, gw2Currency(100 + c)));
988 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
991 LedgerHeader const ledger58Info = env.closed()->header();
992 BEAST_EXPECT(ledger58Info.
seq == 58);
995 auto testAccountLinesHistory = [
this, &env](
1001 paramsSeq[jss::account] = account.human();
1002 paramsSeq[jss::ledger_index] = info.seq;
1004 requestSeq[jss::method] =
"account_lines";
1005 requestSeq[jss::jsonrpc] =
"2.0";
1006 requestSeq[jss::ripplerpc] =
"2.0";
1007 requestSeq[jss::id] = 5;
1008 requestSeq[jss::params] = paramsSeq;
1009 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
1010 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
1011 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
1012 BEAST_EXPECT(linesSeq.isMember(jss::jsonrpc) && linesSeq[jss::jsonrpc] ==
"2.0");
1013 BEAST_EXPECT(linesSeq.isMember(jss::ripplerpc) && linesSeq[jss::ripplerpc] ==
"2.0");
1014 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
1018 paramsHash[jss::account] = account.human();
1019 paramsHash[jss::ledger_hash] =
to_string(info.hash);
1021 requestHash[jss::method] =
"account_lines";
1022 requestHash[jss::jsonrpc] =
"2.0";
1023 requestHash[jss::ripplerpc] =
"2.0";
1024 requestHash[jss::id] = 5;
1025 requestHash[jss::params] = paramsHash;
1026 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
1027 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
1028 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
1029 BEAST_EXPECT(linesHash.isMember(jss::jsonrpc) && linesHash[jss::jsonrpc] ==
"2.0");
1030 BEAST_EXPECT(linesHash.isMember(jss::ripplerpc) && linesHash[jss::ripplerpc] ==
"2.0");
1031 BEAST_EXPECT(linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
1035 testAccountLinesHistory(alice, ledger3Info, 0);
1038 testAccountLinesHistory(alice, ledger4Info, 26);
1041 testAccountLinesHistory(alice, ledger58Info, 52);
1047 params[jss::account] = alice.human();
1049 params[jss::ledger_index] = ledger58Info.
seq;
1051 request[jss::method] =
"account_lines";
1052 request[jss::jsonrpc] =
"2.0";
1053 request[jss::ripplerpc] =
"2.0";
1054 request[jss::id] = 5;
1055 request[jss::params] = params;
1056 auto const lines = env.rpc(
"json2",
to_string(request));
1057 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
1059 lines[jss::error][jss::message] ==
1060 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
1062 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1063 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1064 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1069 params[jss::account] = alice.human();
1071 request[jss::method] =
"account_lines";
1072 request[jss::jsonrpc] =
"2.0";
1073 request[jss::ripplerpc] =
"2.0";
1074 request[jss::id] = 5;
1075 request[jss::params] = params;
1076 auto const lines = env.rpc(
"json2",
to_string(request));
1077 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1078 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
1079 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1080 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1081 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1086 params[jss::account] = alice.human();
1087 params[jss::peer] = gw1.human();
1089 request[jss::method] =
"account_lines";
1090 request[jss::jsonrpc] =
"2.0";
1091 request[jss::ripplerpc] =
"2.0";
1092 request[jss::id] = 5;
1093 request[jss::params] = params;
1094 auto const lines = env.rpc(
"json2",
to_string(request));
1095 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1096 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1097 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1098 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1099 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1104 params[jss::account] = alice.human();
1105 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
1107 request[jss::method] =
"account_lines";
1108 request[jss::jsonrpc] =
"2.0";
1109 request[jss::ripplerpc] =
"2.0";
1110 request[jss::id] = 5;
1111 request[jss::params] = params;
1112 auto const lines = env.rpc(
"json2",
to_string(request));
1114 lines[jss::error][jss::message] ==
1116 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1117 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1118 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1123 params[jss::account] = alice.human();
1124 params[jss::limit] = -1;
1126 request[jss::method] =
"account_lines";
1127 request[jss::jsonrpc] =
"2.0";
1128 request[jss::ripplerpc] =
"2.0";
1129 request[jss::id] = 5;
1130 request[jss::params] = params;
1131 auto const lines = env.rpc(
"json2",
to_string(request));
1133 lines[jss::error][jss::message] ==
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] = alice.human();
1143 paramsA[jss::limit] = 1;
1145 requestA[jss::method] =
"account_lines";
1146 requestA[jss::jsonrpc] =
"2.0";
1147 requestA[jss::ripplerpc] =
"2.0";
1148 requestA[jss::id] = 5;
1149 requestA[jss::params] = paramsA;
1150 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1151 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1152 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1153 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1154 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1155 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1158 auto marker = linesA[jss::result][jss::marker].asString();
1160 paramsB[jss::account] = alice.human();
1161 paramsB[jss::marker] = marker;
1163 requestB[jss::method] =
"account_lines";
1164 requestB[jss::jsonrpc] =
"2.0";
1165 requestB[jss::ripplerpc] =
"2.0";
1166 requestB[jss::id] = 5;
1167 requestB[jss::params] = paramsB;
1168 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1169 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1170 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1171 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1172 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1173 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1177 paramsC[jss::account] = alice.human();
1178 paramsC[jss::limit] = 3;
1179 paramsC[jss::marker] = marker;
1181 requestC[jss::method] =
"account_lines";
1182 requestC[jss::jsonrpc] =
"2.0";
1183 requestC[jss::ripplerpc] =
"2.0";
1184 requestC[jss::id] = 5;
1185 requestC[jss::params] = paramsC;
1186 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1187 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1188 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1189 BEAST_EXPECT(linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1190 BEAST_EXPECT(linesC.isMember(jss::ripplerpc) && linesC[jss::ripplerpc] ==
"2.0");
1191 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1194 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1196 paramsD[jss::account] = alice.human();
1197 paramsD[jss::marker] = marker;
1199 requestD[jss::method] =
"account_lines";
1200 requestD[jss::jsonrpc] =
"2.0";
1201 requestD[jss::ripplerpc] =
"2.0";
1202 requestD[jss::id] = 5;
1203 requestD[jss::params] = paramsD;
1204 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1206 linesD[jss::error][jss::message] ==
1208 BEAST_EXPECT(linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1209 BEAST_EXPECT(linesD.isMember(jss::ripplerpc) && linesD[jss::ripplerpc] ==
"2.0");
1210 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1215 params[jss::account] = alice.human();
1216 params[jss::marker] =
true;
1218 request[jss::method] =
"account_lines";
1219 request[jss::jsonrpc] =
"2.0";
1220 request[jss::ripplerpc] =
"2.0";
1221 request[jss::id] = 5;
1222 request[jss::params] = params;
1223 auto const lines = env.rpc(
"json2",
to_string(request));
1225 lines[jss::error][jss::message] ==
1227 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1228 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1229 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1234 params[jss::account] = alice.human();
1235 params[jss::limit] = 10;
1236 params[jss::peer] = gw2.human();
1238 request[jss::method] =
"account_lines";
1239 request[jss::jsonrpc] =
"2.0";
1240 request[jss::ripplerpc] =
"2.0";
1241 request[jss::id] = 5;
1242 request[jss::params] = params;
1243 auto const lines = env.rpc(
"json2",
to_string(request));
1244 auto const& line = lines[jss::result][jss::lines][0u];
1245 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1246 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1247 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1248 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1249 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1250 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1251 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1256 paramsA[jss::account] = gw2.human();
1257 paramsA[jss::limit] = 1;
1258 paramsA[jss::peer] = alice.human();
1260 requestA[jss::method] =
"account_lines";
1261 requestA[jss::jsonrpc] =
"2.0";
1262 requestA[jss::ripplerpc] =
"2.0";
1263 requestA[jss::id] = 5;
1264 requestA[jss::params] = paramsA;
1265 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1266 auto const& lineA = linesA[jss::result][jss::lines][0u];
1267 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1268 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1269 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1270 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1271 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1272 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1273 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1276 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1277 auto const marker = linesA[jss::result][jss::marker].asString();
1279 paramsB[jss::account] = gw2.human();
1280 paramsB[jss::limit] = 25;
1281 paramsB[jss::marker] = marker;
1282 paramsB[jss::peer] = alice.human();
1284 requestB[jss::method] =
"account_lines";
1285 requestB[jss::jsonrpc] =
"2.0";
1286 requestB[jss::ripplerpc] =
"2.0";
1287 requestB[jss::id] = 5;
1288 requestB[jss::params] = paramsB;
1289 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1290 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1291 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1292 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1293 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1294 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1295 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);