19 using namespace test::jtx;
23 auto const lines = env.rpc(
"json",
"account_lines",
"{ }");
25 lines[jss::result][jss::error_message] ==
31 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
32 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
34 lines[jss::result][jss::error_message] ==
39 auto testInvalidAccountParam = [&](
auto const& param) {
41 params[jss::account] = param;
42 auto jrr = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
43 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
44 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
47 testInvalidAccountParam(1);
48 testInvalidAccountParam(1.1);
49 testInvalidAccountParam(
true);
54 Account
const alice{
"alice"};
58 params[jss::account] = alice.human();
59 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
61 lines[jss::result][jss::error_message] ==
64 env.fund(XRP(10000), alice);
67 BEAST_EXPECT(ledger3Info.
seq == 3);
72 params[jss::account] = alice.human();
73 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
74 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
75 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
80 params[jss::account] = alice.human();
81 params[jss::ledger_index] =
"nonsense";
82 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
84 lines[jss::result][jss::error_message] ==
85 "Invalid field 'ledger_index', not string or number.");
90 params[jss::account] = alice.human();
91 params[jss::ledger_index] = 50000;
92 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
93 BEAST_EXPECT(lines[jss::result][jss::error_message] ==
"ledgerNotFound");
96 Account
const gw1{
"gw1"};
97 env.fund(XRP(10000), gw1);
100 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
104 IOU
const& gw1Currency = gw1Currencies.
back();
107 env(trust(alice, gw1Currency(100 + c)));
108 env(pay(gw1, alice, gw1Currency(50 + c)));
111 LedgerHeader const ledger4Info = env.closed()->header();
112 BEAST_EXPECT(ledger4Info.
seq == 4);
116 Account
const gw2{
"gw2"};
117 env.fund(XRP(10000), gw2);
120 env(fset(gw2, asfRequireAuth));
124 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
128 IOU
const& gw2Currency = gw2Currencies.
back();
131 env(trust(alice, gw2Currency(200 + c)));
132 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
134 env(pay(gw2, alice, gw2Currency(100 + c)));
138 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
141 LedgerHeader const ledger58Info = env.closed()->header();
142 BEAST_EXPECT(ledger58Info.
seq == 58);
145 auto testAccountLinesHistory =
146 [
this, &env](Account
const& account,
LedgerHeader const& info,
int count) {
149 paramsSeq[jss::account] = account.human();
150 paramsSeq[jss::ledger_index] = info.seq;
151 auto const linesSeq = env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
152 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
153 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
157 paramsHash[jss::account] = account.human();
158 paramsHash[jss::ledger_hash] =
to_string(info.hash);
159 auto const linesHash = env.rpc(
"json",
"account_lines",
to_string(paramsHash));
160 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
161 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
165 testAccountLinesHistory(alice, ledger3Info, 0);
168 testAccountLinesHistory(alice, ledger4Info, 26);
171 testAccountLinesHistory(alice, ledger58Info, 52);
176 params[jss::account] = alice.human();
178 params[jss::ledger_index] = ledger58Info.
seq;
179 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
180 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
182 lines[jss::error_message] ==
183 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
189 params[jss::account] = alice.human();
191 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params))[jss::result];
192 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
194 lines[jss::error_message] ==
"Invalid field 'ledger_index', not string or number.");
199 params[jss::account] = alice.human();
200 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
201 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
202 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
207 params[jss::account] = alice.human();
208 params[jss::peer] = gw1.human();
209 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
210 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
211 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
214 auto const& line = lines[jss::result][jss::lines][0u];
215 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
220 params[jss::account] = alice.human();
221 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
222 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
224 lines[jss::result][jss::error_message] ==
230 params[jss::account] = alice.human();
231 params[jss::limit] = -1;
232 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
234 lines[jss::result][jss::error_message] ==
240 paramsA[jss::account] = alice.human();
241 paramsA[jss::limit] = 1;
242 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
243 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
244 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
247 auto marker = linesA[jss::result][jss::marker].asString();
249 paramsB[jss::account] = alice.human();
250 paramsB[jss::marker] = marker;
251 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
252 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
253 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
257 paramsC[jss::account] = alice.human();
258 paramsC[jss::limit] = 3;
259 paramsC[jss::marker] = marker;
260 auto const linesC = env.rpc(
"json",
"account_lines",
to_string(paramsC));
261 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
262 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
265 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
267 paramsD[jss::account] = alice.human();
268 paramsD[jss::marker] = marker;
269 auto const linesD = env.rpc(
"json",
"account_lines",
to_string(paramsD));
271 linesD[jss::result][jss::error_message] ==
277 params[jss::account] = alice.human();
278 params[jss::marker] =
true;
279 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
281 lines[jss::result][jss::error_message] ==
287 params[jss::account] = alice.human();
288 params[jss::limit] = 10;
289 params[jss::peer] = gw2.human();
290 auto const lines = env.rpc(
"json",
"account_lines",
to_string(params));
291 auto const& line = lines[jss::result][jss::lines][0u];
292 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
293 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
294 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
295 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
300 paramsA[jss::account] = gw2.human();
301 paramsA[jss::limit] = 1;
302 paramsA[jss::peer] = alice.human();
303 auto const linesA = env.rpc(
"json",
"account_lines",
to_string(paramsA));
304 auto const& lineA = linesA[jss::result][jss::lines][0u];
305 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
306 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
307 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
308 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
311 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
312 auto const marker = linesA[jss::result][jss::marker].asString();
314 paramsB[jss::account] = gw2.human();
315 paramsB[jss::limit] = 25;
316 paramsB[jss::marker] = marker;
317 paramsB[jss::peer] = alice.human();
318 auto const linesB = env.rpc(
"json",
"account_lines",
to_string(paramsB));
319 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
320 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
321 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
477 testcase(
"Marker can point to any appropriate ledger entry type");
478 using namespace test::jtx;
479 using namespace std::chrono_literals;
488 Account
const alice{
"alice"};
489 Account
const becky{
"becky"};
490 Account
const gw1{
"gw1"};
491 env.fund(XRP(10000), alice, becky, gw1);
494 auto payChan = [](Account
const& account,
500 jv[jss::TransactionType] = jss::PaymentChannelCreate;
501 jv[jss::Account] = account.human();
502 jv[jss::Destination] = to.human();
504 jv[
"SettleDelay"] = settleDelay.count();
505 jv[
"PublicKey"] =
strHex(pk.slice());
514 Account
const bogie{
"bogie"};
515 env(signers(alice, 2, {{bogie, 3}}));
519 env(signers(becky, 2, {{alice, 3}}));
523 auto const EUR = gw1[
"EUR"];
524 env(trust(alice, EUR(200)));
525 env(trust(becky, EUR(200)));
529 env(escrow::create(alice, becky, XRP(1000)), escrow::finish_time(env.now() + 1s));
530 env(escrow::create(becky, alice, XRP(1000)), escrow::finish_time(env.now() + 1s));
533 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
534 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
537 uint256 const aliceNFtokenID = token::getNextID(env, alice, 0, tfTransferable);
538 env(token::mint(alice, 0), txflags(tfTransferable));
540 uint256 const beckyNFtokenID = token::getNextID(env, becky, 0, tfTransferable);
541 env(token::mint(becky, 0), txflags(tfTransferable));
544 env(token::createOffer(alice, beckyNFtokenID, drops(1)), token::owner(becky));
545 env(token::createOffer(becky, aliceNFtokenID, drops(1)), token::owner(alice));
547 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
548 txflags(tfSellNFToken),
549 token::destination(alice));
550 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
551 txflags(tfSellNFToken),
552 token::destination(becky));
554 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
556 token::destination(alice));
557 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
559 token::destination(becky));
561 env(token::createOffer(becky, beckyNFtokenID, drops(1)), txflags(tfSellNFToken));
562 env(token::createOffer(alice, aliceNFtokenID, drops(1)), txflags(tfSellNFToken));
565 env(check::create(alice, becky, XRP(50)));
566 env(check::create(becky, alice, XRP(50)));
569 env(deposit::auth(alice, becky));
570 env(deposit::auth(becky, alice));
574 auto const USDalice = alice[
"USD"];
575 env(offer(alice, EUR(10), XRP(100)));
576 env(offer(becky, USDalice(10), XRP(100)));
579 env(ticket::create(alice, 2));
582 auto const BTCbecky = becky[
"BTC"];
583 env(trust(alice, BTCbecky(200)));
594 params[jss::account] = alice.human();
595 params[jss::limit] = 1;
597 params[jss::marker] = *marker;
599 return env.rpc(
"json",
"account_lines",
to_string(params));
602 auto aliceLines = getNextLine(env, alice,
std::nullopt);
608 auto hasMarker = [](
auto const& aliceLines) {
609 return aliceLines[jss::result].isMember(jss::marker);
611 auto marker = [](
auto const& aliceLines) {
612 return aliceLines[jss::result][jss::marker].asString();
614 auto checkLines = [](
auto const& aliceLines) {
615 return aliceLines.isMember(jss::result) &&
616 !aliceLines[jss::result].isMember(jss::error_message) &&
617 aliceLines[jss::result].isMember(jss::lines) &&
618 aliceLines[jss::result][jss::lines].isArray() &&
619 aliceLines[jss::result][jss::lines].size() <= 1;
622 BEAST_EXPECT(hasMarker(aliceLines));
623 BEAST_EXPECT(checkLines(aliceLines));
624 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
628 while (hasMarker(aliceLines))
631 aliceLines = getNextLine(env, alice, marker(aliceLines));
632 BEAST_EXPECT(checkLines(aliceLines));
633 foundLines += aliceLines[jss::result][jss::lines].size();
636 BEAST_EXPECT(expectedLines == foundLines);
639 aliceObjectsParams2[jss::account] = alice.human();
640 aliceObjectsParams2[jss::limit] = 200;
642 env.rpc(
"json",
"account_objects",
to_string(aliceObjectsParams2));
643 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
644 BEAST_EXPECT(!aliceObjects[jss::result].isMember(jss::error_message));
645 BEAST_EXPECT(aliceObjects[jss::result].isMember(jss::account_objects));
646 BEAST_EXPECT(aliceObjects[jss::result][jss::account_objects].isArray());
651 aliceObjects[jss::result][jss::account_objects].size() ==
652 iterations + expectedNFTs);
655 BEAST_EXPECTS(iterations == expectedIterations,
std::to_string(iterations));
659 beckyObjectsParams[jss::account] = becky.human();
660 beckyObjectsParams[jss::limit] = 200;
662 env.rpc(
"json",
"account_objects",
to_string(beckyObjectsParams));
663 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
664 BEAST_EXPECT(!beckyObjects[jss::result].isMember(jss::error_message));
665 BEAST_EXPECT(beckyObjects[jss::result].isMember(jss::account_objects));
666 BEAST_EXPECT(beckyObjects[jss::result][jss::account_objects].isArray());
670 beckyObjects[jss::result][jss::account_objects].size() ==
671 aliceObjects[jss::result][jss::account_objects].size() - 2);
681 using namespace test::jtx;
686 request[jss::method] =
"account_lines";
687 request[jss::jsonrpc] =
"2.0";
688 request[jss::ripplerpc] =
"2.0";
689 auto const lines = env.rpc(
"json2",
to_string(request));
690 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
691 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
696 request[jss::method] =
"account_lines";
697 request[jss::jsonrpc] =
"2.0";
698 request[jss::ripplerpc] =
"2.0";
699 request[jss::id] = 5;
700 auto const lines = env.rpc(
"json2",
to_string(request));
702 lines[jss::error][jss::message] ==
704 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
705 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
706 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
711 params[jss::account] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
713 request[jss::method] =
"account_lines";
714 request[jss::jsonrpc] =
"2.0";
715 request[jss::ripplerpc] =
"2.0";
716 request[jss::id] = 5;
717 request[jss::params] = params;
718 auto const lines = env.rpc(
"json2",
to_string(request));
720 lines[jss::error][jss::message] ==
722 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
723 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
724 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
726 Account
const alice{
"alice"};
730 params[jss::account] = alice.human();
732 request[jss::method] =
"account_lines";
733 request[jss::jsonrpc] =
"2.0";
734 request[jss::ripplerpc] =
"2.0";
735 request[jss::id] = 5;
736 request[jss::params] = params;
737 auto const lines = env.rpc(
"json2",
to_string(request));
739 lines[jss::error][jss::message] ==
741 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
742 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
743 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
745 env.fund(XRP(10000), alice);
747 LedgerHeader const ledger3Info = env.closed()->header();
748 BEAST_EXPECT(ledger3Info.
seq == 3);
753 params[jss::account] = alice.human();
755 request[jss::method] =
"account_lines";
756 request[jss::jsonrpc] =
"2.0";
757 request[jss::ripplerpc] =
"2.0";
758 request[jss::id] = 5;
759 request[jss::params] = params;
760 auto const lines = env.rpc(
"json2",
to_string(request));
761 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
762 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
763 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
764 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
765 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
770 params[jss::account] = alice.human();
771 params[jss::ledger_index] =
"nonsense";
773 request[jss::method] =
"account_lines";
774 request[jss::jsonrpc] =
"2.0";
775 request[jss::ripplerpc] =
"2.0";
776 request[jss::id] = 5;
777 request[jss::params] = params;
778 auto const lines = env.rpc(
"json2",
to_string(request));
780 lines[jss::error][jss::message] ==
781 "Invalid field 'ledger_index', not string or number.");
782 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
783 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
784 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
789 params[jss::account] = alice.human();
790 params[jss::ledger_index] = 50000;
792 request[jss::method] =
"account_lines";
793 request[jss::jsonrpc] =
"2.0";
794 request[jss::ripplerpc] =
"2.0";
795 request[jss::id] = 5;
796 request[jss::params] = params;
797 auto const lines = env.rpc(
"json2",
to_string(request));
798 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
799 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
800 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
801 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
804 Account
const gw1{
"gw1"};
805 env.fund(XRP(10000), gw1);
808 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
812 IOU
const& gw1Currency = gw1Currencies.
back();
815 env(trust(alice, gw1Currency(100 + c)));
816 env(pay(gw1, alice, gw1Currency(50 + c)));
819 LedgerHeader const ledger4Info = env.closed()->header();
820 BEAST_EXPECT(ledger4Info.
seq == 4);
824 Account
const gw2{
"gw2"};
825 env.fund(XRP(10000), gw2);
828 env(fset(gw2, asfRequireAuth));
832 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
836 IOU
const& gw2Currency = gw2Currencies.
back();
839 env(trust(alice, gw2Currency(200 + c)));
840 env(trust(gw2, gw2Currency(0), alice, tfSetfAuth));
842 env(pay(gw2, alice, gw2Currency(100 + c)));
846 env(trust(alice, gw2Currency(0), gw2, tfSetNoRipple | tfSetFreeze | tfSetDeepFreeze));
849 LedgerHeader const ledger58Info = env.closed()->header();
850 BEAST_EXPECT(ledger58Info.
seq == 58);
853 auto testAccountLinesHistory = [
this, &env](
854 Account
const& account,
859 paramsSeq[jss::account] = account.human();
860 paramsSeq[jss::ledger_index] = info.seq;
862 requestSeq[jss::method] =
"account_lines";
863 requestSeq[jss::jsonrpc] =
"2.0";
864 requestSeq[jss::ripplerpc] =
"2.0";
865 requestSeq[jss::id] = 5;
866 requestSeq[jss::params] = paramsSeq;
867 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
868 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
869 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
870 BEAST_EXPECT(linesSeq.isMember(jss::jsonrpc) && linesSeq[jss::jsonrpc] ==
"2.0");
871 BEAST_EXPECT(linesSeq.isMember(jss::ripplerpc) && linesSeq[jss::ripplerpc] ==
"2.0");
872 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
876 paramsHash[jss::account] = account.human();
877 paramsHash[jss::ledger_hash] =
to_string(info.hash);
879 requestHash[jss::method] =
"account_lines";
880 requestHash[jss::jsonrpc] =
"2.0";
881 requestHash[jss::ripplerpc] =
"2.0";
882 requestHash[jss::id] = 5;
883 requestHash[jss::params] = paramsHash;
884 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
885 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
886 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
887 BEAST_EXPECT(linesHash.isMember(jss::jsonrpc) && linesHash[jss::jsonrpc] ==
"2.0");
888 BEAST_EXPECT(linesHash.isMember(jss::ripplerpc) && linesHash[jss::ripplerpc] ==
"2.0");
889 BEAST_EXPECT(linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
893 testAccountLinesHistory(alice, ledger3Info, 0);
896 testAccountLinesHistory(alice, ledger4Info, 26);
899 testAccountLinesHistory(alice, ledger58Info, 52);
905 params[jss::account] = alice.human();
907 params[jss::ledger_index] = ledger58Info.
seq;
909 request[jss::method] =
"account_lines";
910 request[jss::jsonrpc] =
"2.0";
911 request[jss::ripplerpc] =
"2.0";
912 request[jss::id] = 5;
913 request[jss::params] = params;
914 auto const lines = env.rpc(
"json2",
to_string(request));
915 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
917 lines[jss::error][jss::message] ==
918 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
920 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
921 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
922 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
927 params[jss::account] = alice.human();
929 request[jss::method] =
"account_lines";
930 request[jss::jsonrpc] =
"2.0";
931 request[jss::ripplerpc] =
"2.0";
932 request[jss::id] = 5;
933 request[jss::params] = params;
934 auto const lines = env.rpc(
"json2",
to_string(request));
935 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
936 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
937 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
938 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
939 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
944 params[jss::account] = alice.human();
945 params[jss::peer] = gw1.human();
947 request[jss::method] =
"account_lines";
948 request[jss::jsonrpc] =
"2.0";
949 request[jss::ripplerpc] =
"2.0";
950 request[jss::id] = 5;
951 request[jss::params] = params;
952 auto const lines = env.rpc(
"json2",
to_string(request));
953 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
954 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
955 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
956 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
957 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
962 params[jss::account] = alice.human();
963 params[jss::peer] =
"n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
965 request[jss::method] =
"account_lines";
966 request[jss::jsonrpc] =
"2.0";
967 request[jss::ripplerpc] =
"2.0";
968 request[jss::id] = 5;
969 request[jss::params] = params;
970 auto const lines = env.rpc(
"json2",
to_string(request));
972 lines[jss::error][jss::message] ==
974 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
975 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
976 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
981 params[jss::account] = alice.human();
982 params[jss::limit] = -1;
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));
991 lines[jss::error][jss::message] ==
993 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
994 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
995 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1000 paramsA[jss::account] = alice.human();
1001 paramsA[jss::limit] = 1;
1003 requestA[jss::method] =
"account_lines";
1004 requestA[jss::jsonrpc] =
"2.0";
1005 requestA[jss::ripplerpc] =
"2.0";
1006 requestA[jss::id] = 5;
1007 requestA[jss::params] = paramsA;
1008 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1009 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1010 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1011 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1012 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1013 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1016 auto marker = linesA[jss::result][jss::marker].asString();
1018 paramsB[jss::account] = alice.human();
1019 paramsB[jss::marker] = marker;
1021 requestB[jss::method] =
"account_lines";
1022 requestB[jss::jsonrpc] =
"2.0";
1023 requestB[jss::ripplerpc] =
"2.0";
1024 requestB[jss::id] = 5;
1025 requestB[jss::params] = paramsB;
1026 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1027 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1028 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1029 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1030 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1031 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1035 paramsC[jss::account] = alice.human();
1036 paramsC[jss::limit] = 3;
1037 paramsC[jss::marker] = marker;
1039 requestC[jss::method] =
"account_lines";
1040 requestC[jss::jsonrpc] =
"2.0";
1041 requestC[jss::ripplerpc] =
"2.0";
1042 requestC[jss::id] = 5;
1043 requestC[jss::params] = paramsC;
1044 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1045 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1046 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1047 BEAST_EXPECT(linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1048 BEAST_EXPECT(linesC.isMember(jss::ripplerpc) && linesC[jss::ripplerpc] ==
"2.0");
1049 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1052 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1054 paramsD[jss::account] = alice.human();
1055 paramsD[jss::marker] = marker;
1057 requestD[jss::method] =
"account_lines";
1058 requestD[jss::jsonrpc] =
"2.0";
1059 requestD[jss::ripplerpc] =
"2.0";
1060 requestD[jss::id] = 5;
1061 requestD[jss::params] = paramsD;
1062 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1064 linesD[jss::error][jss::message] ==
1066 BEAST_EXPECT(linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1067 BEAST_EXPECT(linesD.isMember(jss::ripplerpc) && linesD[jss::ripplerpc] ==
"2.0");
1068 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1073 params[jss::account] = alice.human();
1074 params[jss::marker] =
true;
1076 request[jss::method] =
"account_lines";
1077 request[jss::jsonrpc] =
"2.0";
1078 request[jss::ripplerpc] =
"2.0";
1079 request[jss::id] = 5;
1080 request[jss::params] = params;
1081 auto const lines = env.rpc(
"json2",
to_string(request));
1083 lines[jss::error][jss::message] ==
1085 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1086 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1087 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1092 params[jss::account] = alice.human();
1093 params[jss::limit] = 10;
1094 params[jss::peer] = gw2.human();
1096 request[jss::method] =
"account_lines";
1097 request[jss::jsonrpc] =
"2.0";
1098 request[jss::ripplerpc] =
"2.0";
1099 request[jss::id] = 5;
1100 request[jss::params] = params;
1101 auto const lines = env.rpc(
"json2",
to_string(request));
1102 auto const& line = lines[jss::result][jss::lines][0u];
1103 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1104 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1105 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1106 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1107 BEAST_EXPECT(lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1108 BEAST_EXPECT(lines.isMember(jss::ripplerpc) && lines[jss::ripplerpc] ==
"2.0");
1109 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1114 paramsA[jss::account] = gw2.human();
1115 paramsA[jss::limit] = 1;
1116 paramsA[jss::peer] = alice.human();
1118 requestA[jss::method] =
"account_lines";
1119 requestA[jss::jsonrpc] =
"2.0";
1120 requestA[jss::ripplerpc] =
"2.0";
1121 requestA[jss::id] = 5;
1122 requestA[jss::params] = paramsA;
1123 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1124 auto const& lineA = linesA[jss::result][jss::lines][0u];
1125 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1126 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1127 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1128 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1129 BEAST_EXPECT(linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1130 BEAST_EXPECT(linesA.isMember(jss::ripplerpc) && linesA[jss::ripplerpc] ==
"2.0");
1131 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1134 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1135 auto const marker = linesA[jss::result][jss::marker].asString();
1137 paramsB[jss::account] = gw2.human();
1138 paramsB[jss::limit] = 25;
1139 paramsB[jss::marker] = marker;
1140 paramsB[jss::peer] = alice.human();
1142 requestB[jss::method] =
"account_lines";
1143 requestB[jss::jsonrpc] =
"2.0";
1144 requestB[jss::ripplerpc] =
"2.0";
1145 requestB[jss::id] = 5;
1146 requestB[jss::params] = paramsB;
1147 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1148 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1149 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1150 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1151 BEAST_EXPECT(linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1152 BEAST_EXPECT(linesB.isMember(jss::ripplerpc) && linesB[jss::ripplerpc] ==
"2.0");
1153 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);