38 using namespace test::jtx;
42 auto const lines = env.rpc(
"json",
"account_lines",
"{ }");
44 lines[jss::result][jss::error_message] ==
50 params[jss::account] =
51 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
53 env.rpc(
"json",
"account_lines",
to_string(params));
55 lines[jss::result][jss::error_message] ==
60 auto testInvalidAccountParam = [&](
auto const& param) {
62 params[jss::account] = param;
64 "json",
"account_lines",
to_string(params))[jss::result];
65 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
67 jrr[jss::error_message] ==
"Invalid field 'account'.");
70 testInvalidAccountParam(1);
71 testInvalidAccountParam(1.1);
72 testInvalidAccountParam(
true);
77 Account
const alice{
"alice"};
81 params[jss::account] = alice.human();
83 env.rpc(
"json",
"account_lines",
to_string(params));
85 lines[jss::result][jss::error_message] ==
88 env.fund(XRP(10000), alice);
90 LedgerInfo const ledger3Info = env.closed()->info();
91 BEAST_EXPECT(ledger3Info.
seq == 3);
96 params[jss::account] = alice.human();
98 env.rpc(
"json",
"account_lines",
to_string(params));
99 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
100 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
105 params[jss::account] = alice.human();
106 params[jss::ledger_index] =
"nonsense";
108 env.rpc(
"json",
"account_lines",
to_string(params));
110 lines[jss::result][jss::error_message] ==
111 "ledgerIndexMalformed");
116 params[jss::account] = alice.human();
117 params[jss::ledger_index] = 50000;
119 env.rpc(
"json",
"account_lines",
to_string(params));
121 lines[jss::result][jss::error_message] ==
"ledgerNotFound");
124 Account
const gw1{
"gw1"};
125 env.fund(XRP(10000), gw1);
128 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
132 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
133 IOU
const& gw1Currency = gw1Currencies.
back();
136 env(trust(alice, gw1Currency(100 + c)));
137 env(pay(gw1, alice, gw1Currency(50 + c)));
140 LedgerInfo const ledger4Info = env.closed()->info();
141 BEAST_EXPECT(ledger4Info.
seq == 4);
145 Account
const gw2{
"gw2"};
146 env.fund(XRP(10000), gw2);
153 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
157 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
158 IOU
const& gw2Currency = gw2Currencies.
back();
161 env(trust(alice, gw2Currency(200 + c)));
162 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
164 env(pay(gw2, alice, gw2Currency(100 + c)));
175 LedgerInfo const ledger58Info = env.closed()->info();
176 BEAST_EXPECT(ledger58Info.
seq == 58);
179 auto testAccountLinesHistory = [
this, &env](
180 Account
const& account,
185 paramsSeq[jss::account] = account.human();
186 paramsSeq[jss::ledger_index] = info.seq;
187 auto const linesSeq =
188 env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
189 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
190 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
194 paramsHash[jss::account] = account.human();
195 paramsHash[jss::ledger_hash] =
to_string(info.hash);
196 auto const linesHash =
197 env.rpc(
"json",
"account_lines",
to_string(paramsHash));
198 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
199 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
203 testAccountLinesHistory(alice, ledger3Info, 0);
206 testAccountLinesHistory(alice, ledger4Info, 26);
209 testAccountLinesHistory(alice, ledger58Info, 52);
215 params[jss::account] = alice.human();
217 params[jss::ledger_index] = ledger58Info.
seq;
219 env.rpc(
"json",
"account_lines",
to_string(params));
220 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
221 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
226 params[jss::account] = alice.human();
228 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();
238 env.rpc(
"json",
"account_lines",
to_string(params));
239 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
240 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
243 auto const& line = lines[jss::result][jss::lines][0u];
244 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
249 params[jss::account] = alice.human();
251 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
253 env.rpc(
"json",
"account_lines",
to_string(params));
255 lines[jss::result][jss::error_message] ==
261 params[jss::account] = alice.human();
262 params[jss::limit] = -1;
264 env.rpc(
"json",
"account_lines",
to_string(params));
266 lines[jss::result][jss::error_message] ==
272 paramsA[jss::account] = alice.human();
273 paramsA[jss::limit] = 1;
275 env.rpc(
"json",
"account_lines",
to_string(paramsA));
276 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
277 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
280 auto marker = linesA[jss::result][jss::marker].asString();
282 paramsB[jss::account] = alice.human();
283 paramsB[jss::marker] = marker;
285 env.rpc(
"json",
"account_lines",
to_string(paramsB));
286 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
287 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
291 paramsC[jss::account] = alice.human();
292 paramsC[jss::limit] = 3;
293 paramsC[jss::marker] = marker;
295 env.rpc(
"json",
"account_lines",
to_string(paramsC));
296 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
297 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
300 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
302 paramsD[jss::account] = alice.human();
303 paramsD[jss::marker] = marker;
305 env.rpc(
"json",
"account_lines",
to_string(paramsD));
307 linesD[jss::result][jss::error_message] ==
313 params[jss::account] = alice.human();
314 params[jss::marker] =
true;
316 env.rpc(
"json",
"account_lines",
to_string(params));
318 lines[jss::result][jss::error_message] ==
324 params[jss::account] = alice.human();
325 params[jss::limit] = 10;
326 params[jss::peer] = gw2.human();
328 env.rpc(
"json",
"account_lines",
to_string(params));
329 auto const& line = lines[jss::result][jss::lines][0u];
330 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
331 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
332 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
333 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
338 paramsA[jss::account] = gw2.human();
339 paramsA[jss::limit] = 1;
340 paramsA[jss::peer] = alice.human();
342 env.rpc(
"json",
"account_lines",
to_string(paramsA));
343 auto const& lineA = linesA[jss::result][jss::lines][0u];
344 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
345 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
346 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
347 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
350 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
351 auto const marker = linesA[jss::result][jss::marker].asString();
353 paramsB[jss::account] = gw2.human();
354 paramsB[jss::limit] = 25;
355 paramsB[jss::marker] = marker;
356 paramsB[jss::peer] = alice.human();
358 env.rpc(
"json",
"account_lines",
to_string(paramsB));
359 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
360 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
361 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
526 testcase(
"Marker can point to any appropriate ledger entry type");
527 using namespace test::jtx;
528 using namespace std::chrono_literals;
537 Account
const alice{
"alice"};
538 Account
const becky{
"becky"};
539 Account
const gw1{
"gw1"};
540 env.fund(XRP(10000), alice, becky, gw1);
543 auto payChan = [](Account
const& account,
549 jv[jss::TransactionType] = jss::PaymentChannelCreate;
550 jv[jss::Account] = account.human();
551 jv[jss::Destination] = to.human();
553 jv[
"SettleDelay"] = settleDelay.count();
554 jv[
"PublicKey"] =
strHex(pk.slice());
563 Account
const bogie{
"bogie"};
564 env(signers(alice, 2, {{bogie, 3}}));
568 env(signers(becky, 2, {{alice, 3}}));
572 auto const EUR = gw1[
"EUR"];
573 env(trust(alice, EUR(200)));
574 env(trust(becky, EUR(200)));
578 env(escrow::create(alice, becky, XRP(1000)),
579 escrow::finish_time(env.now() + 1s));
580 env(escrow::create(becky, alice, XRP(1000)),
581 escrow::finish_time(env.now() + 1s));
584 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
585 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
597 env(token::createOffer(alice, beckyNFtokenID, drops(1)),
598 token::owner(becky));
599 env(token::createOffer(becky, aliceNFtokenID, drops(1)),
600 token::owner(alice));
602 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
604 token::destination(alice));
605 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
607 token::destination(becky));
609 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
611 token::destination(alice));
612 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
614 token::destination(becky));
616 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
618 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
622 env(check::create(alice, becky, XRP(50)));
623 env(check::create(becky, alice, XRP(50)));
626 env(deposit::auth(alice, becky));
627 env(deposit::auth(becky, alice));
631 auto const USDalice = alice[
"USD"];
632 env(offer(alice, EUR(10), XRP(100)));
633 env(offer(becky, USDalice(10), XRP(100)));
636 env(ticket::create(alice, 2));
639 auto const BTCbecky = becky[
"BTC"];
640 env(trust(alice, BTCbecky(200)));
648 auto getNextLine = [](Env& env,
649 Account
const& alice,
652 params[jss::account] = alice.human();
653 params[jss::limit] = 1;
655 params[jss::marker] = *marker;
657 return env.rpc(
"json",
"account_lines",
to_string(params));
660 auto aliceLines = getNextLine(env, alice,
std::nullopt);
666 auto hasMarker = [](
auto const& aliceLines) {
667 return aliceLines[jss::result].isMember(jss::marker);
669 auto marker = [](
auto const& aliceLines) {
670 return aliceLines[jss::result][jss::marker].asString();
672 auto checkLines = [](
auto const& aliceLines) {
673 return aliceLines.isMember(jss::result) &&
674 !aliceLines[jss::result].isMember(jss::error_message) &&
675 aliceLines[jss::result].isMember(jss::lines) &&
676 aliceLines[jss::result][jss::lines].isArray() &&
677 aliceLines[jss::result][jss::lines].size() <= 1;
680 BEAST_EXPECT(hasMarker(aliceLines));
681 BEAST_EXPECT(checkLines(aliceLines));
682 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
686 while (hasMarker(aliceLines))
689 aliceLines = getNextLine(env, alice, marker(aliceLines));
690 BEAST_EXPECT(checkLines(aliceLines));
691 foundLines += aliceLines[jss::result][jss::lines].size();
694 BEAST_EXPECT(expectedLines == foundLines);
697 aliceObjectsParams2[jss::account] = alice.human();
698 aliceObjectsParams2[jss::limit] = 200;
700 "json",
"account_objects",
to_string(aliceObjectsParams2));
701 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
703 !aliceObjects[jss::result].isMember(jss::error_message));
705 aliceObjects[jss::result].isMember(jss::account_objects));
707 aliceObjects[jss::result][jss::account_objects].isArray());
712 aliceObjects[jss::result][jss::account_objects].size() ==
713 iterations + expectedNFTs);
721 beckyObjectsParams[jss::account] = becky.human();
722 beckyObjectsParams[jss::limit] = 200;
724 "json",
"account_objects",
to_string(beckyObjectsParams));
725 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
727 !beckyObjects[jss::result].isMember(jss::error_message));
729 beckyObjects[jss::result].isMember(jss::account_objects));
731 beckyObjects[jss::result][jss::account_objects].isArray());
735 beckyObjects[jss::result][jss::account_objects].size() ==
736 aliceObjects[jss::result][jss::account_objects].size() - 2);
746 using namespace test::jtx;
751 request[jss::method] =
"account_lines";
752 request[jss::jsonrpc] =
"2.0";
753 request[jss::ripplerpc] =
"2.0";
754 auto const lines = env.rpc(
"json2",
to_string(request));
756 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
758 lines.isMember(jss::ripplerpc) &&
759 lines[jss::ripplerpc] ==
"2.0");
764 request[jss::method] =
"account_lines";
765 request[jss::jsonrpc] =
"2.0";
766 request[jss::ripplerpc] =
"2.0";
767 request[jss::id] = 5;
768 auto const lines = env.rpc(
"json2",
to_string(request));
770 lines[jss::error][jss::message] ==
773 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
775 lines.isMember(jss::ripplerpc) &&
776 lines[jss::ripplerpc] ==
"2.0");
777 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
782 params[jss::account] =
783 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
785 request[jss::method] =
"account_lines";
786 request[jss::jsonrpc] =
"2.0";
787 request[jss::ripplerpc] =
"2.0";
788 request[jss::id] = 5;
789 request[jss::params] = params;
790 auto const lines = env.rpc(
"json2",
to_string(request));
792 lines[jss::error][jss::message] ==
795 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
797 lines.isMember(jss::ripplerpc) &&
798 lines[jss::ripplerpc] ==
"2.0");
799 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
801 Account
const alice{
"alice"};
805 params[jss::account] = alice.human();
807 request[jss::method] =
"account_lines";
808 request[jss::jsonrpc] =
"2.0";
809 request[jss::ripplerpc] =
"2.0";
810 request[jss::id] = 5;
811 request[jss::params] = params;
812 auto const lines = env.rpc(
"json2",
to_string(request));
814 lines[jss::error][jss::message] ==
817 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
819 lines.isMember(jss::ripplerpc) &&
820 lines[jss::ripplerpc] ==
"2.0");
821 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
823 env.fund(XRP(10000), alice);
825 LedgerInfo const ledger3Info = env.closed()->info();
826 BEAST_EXPECT(ledger3Info.
seq == 3);
831 params[jss::account] = alice.human();
833 request[jss::method] =
"account_lines";
834 request[jss::jsonrpc] =
"2.0";
835 request[jss::ripplerpc] =
"2.0";
836 request[jss::id] = 5;
837 request[jss::params] = params;
838 auto const lines = env.rpc(
"json2",
to_string(request));
839 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
840 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
842 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
844 lines.isMember(jss::ripplerpc) &&
845 lines[jss::ripplerpc] ==
"2.0");
846 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
851 params[jss::account] = alice.human();
852 params[jss::ledger_index] =
"nonsense";
854 request[jss::method] =
"account_lines";
855 request[jss::jsonrpc] =
"2.0";
856 request[jss::ripplerpc] =
"2.0";
857 request[jss::id] = 5;
858 request[jss::params] = params;
859 auto const lines = env.rpc(
"json2",
to_string(request));
861 lines[jss::error][jss::message] ==
"ledgerIndexMalformed");
863 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
865 lines.isMember(jss::ripplerpc) &&
866 lines[jss::ripplerpc] ==
"2.0");
867 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
872 params[jss::account] = alice.human();
873 params[jss::ledger_index] = 50000;
875 request[jss::method] =
"account_lines";
876 request[jss::jsonrpc] =
"2.0";
877 request[jss::ripplerpc] =
"2.0";
878 request[jss::id] = 5;
879 request[jss::params] = params;
880 auto const lines = env.rpc(
"json2",
to_string(request));
881 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
883 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
885 lines.isMember(jss::ripplerpc) &&
886 lines[jss::ripplerpc] ==
"2.0");
887 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
890 Account
const gw1{
"gw1"};
891 env.fund(XRP(10000), gw1);
894 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
898 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
899 IOU
const& gw1Currency = gw1Currencies.
back();
902 env(trust(alice, gw1Currency(100 + c)));
903 env(pay(gw1, alice, gw1Currency(50 + c)));
906 LedgerInfo const ledger4Info = env.closed()->info();
907 BEAST_EXPECT(ledger4Info.
seq == 4);
911 Account
const gw2{
"gw2"};
912 env.fund(XRP(10000), gw2);
919 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
923 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
924 IOU
const& gw2Currency = gw2Currencies.
back();
927 env(trust(alice, gw2Currency(200 + c)));
928 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
930 env(pay(gw2, alice, gw2Currency(100 + c)));
941 LedgerInfo const ledger58Info = env.closed()->info();
942 BEAST_EXPECT(ledger58Info.
seq == 58);
945 auto testAccountLinesHistory = [
this, &env](
946 Account
const& account,
951 paramsSeq[jss::account] = account.human();
952 paramsSeq[jss::ledger_index] = info.seq;
954 requestSeq[jss::method] =
"account_lines";
955 requestSeq[jss::jsonrpc] =
"2.0";
956 requestSeq[jss::ripplerpc] =
"2.0";
957 requestSeq[jss::id] = 5;
958 requestSeq[jss::params] = paramsSeq;
959 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
960 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
961 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
963 linesSeq.isMember(jss::jsonrpc) &&
964 linesSeq[jss::jsonrpc] ==
"2.0");
966 linesSeq.isMember(jss::ripplerpc) &&
967 linesSeq[jss::ripplerpc] ==
"2.0");
968 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
972 paramsHash[jss::account] = account.human();
973 paramsHash[jss::ledger_hash] =
to_string(info.hash);
975 requestHash[jss::method] =
"account_lines";
976 requestHash[jss::jsonrpc] =
"2.0";
977 requestHash[jss::ripplerpc] =
"2.0";
978 requestHash[jss::id] = 5;
979 requestHash[jss::params] = paramsHash;
980 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
981 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
982 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
984 linesHash.isMember(jss::jsonrpc) &&
985 linesHash[jss::jsonrpc] ==
"2.0");
987 linesHash.isMember(jss::ripplerpc) &&
988 linesHash[jss::ripplerpc] ==
"2.0");
990 linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
994 testAccountLinesHistory(alice, ledger3Info, 0);
997 testAccountLinesHistory(alice, ledger4Info, 26);
1000 testAccountLinesHistory(alice, ledger58Info, 52);
1006 params[jss::account] = alice.human();
1008 params[jss::ledger_index] = ledger58Info.
seq;
1010 request[jss::method] =
"account_lines";
1011 request[jss::jsonrpc] =
"2.0";
1012 request[jss::ripplerpc] =
"2.0";
1013 request[jss::id] = 5;
1014 request[jss::params] = params;
1015 auto const lines = env.rpc(
"json2",
to_string(request));
1016 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1017 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1019 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1021 lines.isMember(jss::ripplerpc) &&
1022 lines[jss::ripplerpc] ==
"2.0");
1023 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1028 params[jss::account] = alice.human();
1030 request[jss::method] =
"account_lines";
1031 request[jss::jsonrpc] =
"2.0";
1032 request[jss::ripplerpc] =
"2.0";
1033 request[jss::id] = 5;
1034 request[jss::params] = params;
1035 auto const lines = env.rpc(
"json2",
to_string(request));
1036 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1037 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
1039 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1041 lines.isMember(jss::ripplerpc) &&
1042 lines[jss::ripplerpc] ==
"2.0");
1043 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1048 params[jss::account] = alice.human();
1049 params[jss::peer] = gw1.human();
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::result][jss::lines].isArray());
1058 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1060 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1062 lines.isMember(jss::ripplerpc) &&
1063 lines[jss::ripplerpc] ==
"2.0");
1064 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1069 params[jss::account] = alice.human();
1071 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
1073 request[jss::method] =
"account_lines";
1074 request[jss::jsonrpc] =
"2.0";
1075 request[jss::ripplerpc] =
"2.0";
1076 request[jss::id] = 5;
1077 request[jss::params] = params;
1078 auto const lines = env.rpc(
"json2",
to_string(request));
1080 lines[jss::error][jss::message] ==
1083 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1085 lines.isMember(jss::ripplerpc) &&
1086 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] = -1;
1095 request[jss::method] =
"account_lines";
1096 request[jss::jsonrpc] =
"2.0";
1097 request[jss::ripplerpc] =
"2.0";
1098 request[jss::id] = 5;
1099 request[jss::params] = params;
1100 auto const lines = env.rpc(
"json2",
to_string(request));
1102 lines[jss::error][jss::message] ==
1105 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1107 lines.isMember(jss::ripplerpc) &&
1108 lines[jss::ripplerpc] ==
"2.0");
1109 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1114 paramsA[jss::account] = alice.human();
1115 paramsA[jss::limit] = 1;
1117 requestA[jss::method] =
"account_lines";
1118 requestA[jss::jsonrpc] =
"2.0";
1119 requestA[jss::ripplerpc] =
"2.0";
1120 requestA[jss::id] = 5;
1121 requestA[jss::params] = paramsA;
1122 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1123 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1124 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1126 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1128 linesA.isMember(jss::ripplerpc) &&
1129 linesA[jss::ripplerpc] ==
"2.0");
1130 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1133 auto marker = linesA[jss::result][jss::marker].asString();
1135 paramsB[jss::account] = alice.human();
1136 paramsB[jss::marker] = marker;
1138 requestB[jss::method] =
"account_lines";
1139 requestB[jss::jsonrpc] =
"2.0";
1140 requestB[jss::ripplerpc] =
"2.0";
1141 requestB[jss::id] = 5;
1142 requestB[jss::params] = paramsB;
1143 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1144 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1145 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1147 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1149 linesB.isMember(jss::ripplerpc) &&
1150 linesB[jss::ripplerpc] ==
"2.0");
1151 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1155 paramsC[jss::account] = alice.human();
1156 paramsC[jss::limit] = 3;
1157 paramsC[jss::marker] = marker;
1159 requestC[jss::method] =
"account_lines";
1160 requestC[jss::jsonrpc] =
"2.0";
1161 requestC[jss::ripplerpc] =
"2.0";
1162 requestC[jss::id] = 5;
1163 requestC[jss::params] = paramsC;
1164 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1165 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1166 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1168 linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1170 linesC.isMember(jss::ripplerpc) &&
1171 linesC[jss::ripplerpc] ==
"2.0");
1172 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1175 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1177 paramsD[jss::account] = alice.human();
1178 paramsD[jss::marker] = marker;
1180 requestD[jss::method] =
"account_lines";
1181 requestD[jss::jsonrpc] =
"2.0";
1182 requestD[jss::ripplerpc] =
"2.0";
1183 requestD[jss::id] = 5;
1184 requestD[jss::params] = paramsD;
1185 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1187 linesD[jss::error][jss::message] ==
1190 linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1192 linesD.isMember(jss::ripplerpc) &&
1193 linesD[jss::ripplerpc] ==
"2.0");
1194 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1199 params[jss::account] = alice.human();
1200 params[jss::marker] =
true;
1202 request[jss::method] =
"account_lines";
1203 request[jss::jsonrpc] =
"2.0";
1204 request[jss::ripplerpc] =
"2.0";
1205 request[jss::id] = 5;
1206 request[jss::params] = params;
1207 auto const lines = env.rpc(
"json2",
to_string(request));
1209 lines[jss::error][jss::message] ==
1212 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1214 lines.isMember(jss::ripplerpc) &&
1215 lines[jss::ripplerpc] ==
"2.0");
1216 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1221 params[jss::account] = alice.human();
1222 params[jss::limit] = 10;
1223 params[jss::peer] = gw2.human();
1225 request[jss::method] =
"account_lines";
1226 request[jss::jsonrpc] =
"2.0";
1227 request[jss::ripplerpc] =
"2.0";
1228 request[jss::id] = 5;
1229 request[jss::params] = params;
1230 auto const lines = env.rpc(
"json2",
to_string(request));
1231 auto const& line = lines[jss::result][jss::lines][0u];
1232 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1233 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1234 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1235 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1237 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1239 lines.isMember(jss::ripplerpc) &&
1240 lines[jss::ripplerpc] ==
"2.0");
1241 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1246 paramsA[jss::account] = gw2.human();
1247 paramsA[jss::limit] = 1;
1248 paramsA[jss::peer] = alice.human();
1250 requestA[jss::method] =
"account_lines";
1251 requestA[jss::jsonrpc] =
"2.0";
1252 requestA[jss::ripplerpc] =
"2.0";
1253 requestA[jss::id] = 5;
1254 requestA[jss::params] = paramsA;
1255 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1256 auto const& lineA = linesA[jss::result][jss::lines][0u];
1257 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1258 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1259 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1260 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1262 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1264 linesA.isMember(jss::ripplerpc) &&
1265 linesA[jss::ripplerpc] ==
"2.0");
1266 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1269 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1270 auto const marker = linesA[jss::result][jss::marker].asString();
1272 paramsB[jss::account] = gw2.human();
1273 paramsB[jss::limit] = 25;
1274 paramsB[jss::marker] = marker;
1275 paramsB[jss::peer] = alice.human();
1277 requestB[jss::method] =
"account_lines";
1278 requestB[jss::jsonrpc] =
"2.0";
1279 requestB[jss::ripplerpc] =
"2.0";
1280 requestB[jss::id] = 5;
1281 requestB[jss::params] = paramsB;
1282 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1283 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1284 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1285 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1287 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1289 linesB.isMember(jss::ripplerpc) &&
1290 linesB[jss::ripplerpc] ==
"2.0");
1291 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);