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] =
32 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
34 env.rpc(
"json",
"account_lines",
to_string(params));
36 lines[jss::result][jss::error_message] ==
41 auto testInvalidAccountParam = [&](
auto const& param) {
43 params[jss::account] = param;
45 "json",
"account_lines",
to_string(params))[jss::result];
46 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
48 jrr[jss::error_message] ==
"Invalid field 'account'.");
51 testInvalidAccountParam(1);
52 testInvalidAccountParam(1.1);
53 testInvalidAccountParam(
true);
58 Account
const alice{
"alice"};
62 params[jss::account] = alice.human();
64 env.rpc(
"json",
"account_lines",
to_string(params));
66 lines[jss::result][jss::error_message] ==
69 env.fund(XRP(10000), alice);
71 LedgerInfo const ledger3Info = env.closed()->info();
72 BEAST_EXPECT(ledger3Info.
seq == 3);
77 params[jss::account] = alice.human();
79 env.rpc(
"json",
"account_lines",
to_string(params));
80 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
81 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
86 params[jss::account] = alice.human();
87 params[jss::ledger_index] =
"nonsense";
89 env.rpc(
"json",
"account_lines",
to_string(params));
91 lines[jss::result][jss::error_message] ==
92 "ledgerIndexMalformed");
97 params[jss::account] = alice.human();
98 params[jss::ledger_index] = 50000;
100 env.rpc(
"json",
"account_lines",
to_string(params));
102 lines[jss::result][jss::error_message] ==
"ledgerNotFound");
105 Account
const gw1{
"gw1"};
106 env.fund(XRP(10000), gw1);
109 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
113 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
114 IOU
const& gw1Currency = gw1Currencies.
back();
117 env(trust(alice, gw1Currency(100 + c)));
118 env(pay(gw1, alice, gw1Currency(50 + c)));
121 LedgerInfo const ledger4Info = env.closed()->info();
122 BEAST_EXPECT(ledger4Info.
seq == 4);
126 Account
const gw2{
"gw2"};
127 env.fund(XRP(10000), gw2);
134 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
138 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
139 IOU
const& gw2Currency = gw2Currencies.
back();
142 env(trust(alice, gw2Currency(200 + c)));
143 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
145 env(pay(gw2, alice, gw2Currency(100 + c)));
156 LedgerInfo const ledger58Info = env.closed()->info();
157 BEAST_EXPECT(ledger58Info.
seq == 58);
160 auto testAccountLinesHistory = [
this, &env](
161 Account
const& account,
166 paramsSeq[jss::account] = account.human();
167 paramsSeq[jss::ledger_index] = info.seq;
168 auto const linesSeq =
169 env.rpc(
"json",
"account_lines",
to_string(paramsSeq));
170 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
171 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
175 paramsHash[jss::account] = account.human();
176 paramsHash[jss::ledger_hash] =
to_string(info.hash);
177 auto const linesHash =
178 env.rpc(
"json",
"account_lines",
to_string(paramsHash));
179 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
180 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
184 testAccountLinesHistory(alice, ledger3Info, 0);
187 testAccountLinesHistory(alice, ledger4Info, 26);
190 testAccountLinesHistory(alice, ledger58Info, 52);
196 params[jss::account] = alice.human();
198 params[jss::ledger_index] = ledger58Info.
seq;
200 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() == 26);
207 params[jss::account] = alice.human();
209 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() == 52);
216 params[jss::account] = alice.human();
217 params[jss::peer] = gw1.human();
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);
224 auto const& line = lines[jss::result][jss::lines][0u];
225 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
230 params[jss::account] = alice.human();
232 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
234 env.rpc(
"json",
"account_lines",
to_string(params));
236 lines[jss::result][jss::error_message] ==
242 params[jss::account] = alice.human();
243 params[jss::limit] = -1;
245 env.rpc(
"json",
"account_lines",
to_string(params));
247 lines[jss::result][jss::error_message] ==
253 paramsA[jss::account] = alice.human();
254 paramsA[jss::limit] = 1;
256 env.rpc(
"json",
"account_lines",
to_string(paramsA));
257 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
258 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
261 auto marker = linesA[jss::result][jss::marker].asString();
263 paramsB[jss::account] = alice.human();
264 paramsB[jss::marker] = marker;
266 env.rpc(
"json",
"account_lines",
to_string(paramsB));
267 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
268 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
272 paramsC[jss::account] = alice.human();
273 paramsC[jss::limit] = 3;
274 paramsC[jss::marker] = marker;
276 env.rpc(
"json",
"account_lines",
to_string(paramsC));
277 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
278 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
281 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
283 paramsD[jss::account] = alice.human();
284 paramsD[jss::marker] = marker;
286 env.rpc(
"json",
"account_lines",
to_string(paramsD));
288 linesD[jss::result][jss::error_message] ==
294 params[jss::account] = alice.human();
295 params[jss::marker] =
true;
297 env.rpc(
"json",
"account_lines",
to_string(params));
299 lines[jss::result][jss::error_message] ==
305 params[jss::account] = alice.human();
306 params[jss::limit] = 10;
307 params[jss::peer] = gw2.human();
309 env.rpc(
"json",
"account_lines",
to_string(params));
310 auto const& line = lines[jss::result][jss::lines][0u];
311 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
312 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
313 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
314 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
319 paramsA[jss::account] = gw2.human();
320 paramsA[jss::limit] = 1;
321 paramsA[jss::peer] = alice.human();
323 env.rpc(
"json",
"account_lines",
to_string(paramsA));
324 auto const& lineA = linesA[jss::result][jss::lines][0u];
325 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
326 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
327 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
328 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
331 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
332 auto const marker = linesA[jss::result][jss::marker].asString();
334 paramsB[jss::account] = gw2.human();
335 paramsB[jss::limit] = 25;
336 paramsB[jss::marker] = marker;
337 paramsB[jss::peer] = alice.human();
339 env.rpc(
"json",
"account_lines",
to_string(paramsB));
340 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
341 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
342 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
507 testcase(
"Marker can point to any appropriate ledger entry type");
508 using namespace test::jtx;
509 using namespace std::chrono_literals;
518 Account
const alice{
"alice"};
519 Account
const becky{
"becky"};
520 Account
const gw1{
"gw1"};
521 env.fund(XRP(10000), alice, becky, gw1);
524 auto payChan = [](Account
const& account,
530 jv[jss::TransactionType] = jss::PaymentChannelCreate;
531 jv[jss::Account] = account.human();
532 jv[jss::Destination] = to.human();
534 jv[
"SettleDelay"] = settleDelay.count();
535 jv[
"PublicKey"] =
strHex(pk.slice());
544 Account
const bogie{
"bogie"};
545 env(signers(alice, 2, {{bogie, 3}}));
549 env(signers(becky, 2, {{alice, 3}}));
553 auto const EUR = gw1[
"EUR"];
554 env(trust(alice, EUR(200)));
555 env(trust(becky, EUR(200)));
559 env(escrow::create(alice, becky, XRP(1000)),
560 escrow::finish_time(env.now() + 1s));
561 env(escrow::create(becky, alice, XRP(1000)),
562 escrow::finish_time(env.now() + 1s));
565 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
566 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
578 env(token::createOffer(alice, beckyNFtokenID, drops(1)),
579 token::owner(becky));
580 env(token::createOffer(becky, aliceNFtokenID, drops(1)),
581 token::owner(alice));
583 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
585 token::destination(alice));
586 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
588 token::destination(becky));
590 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
592 token::destination(alice));
593 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
595 token::destination(becky));
597 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
599 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
603 env(check::create(alice, becky, XRP(50)));
604 env(check::create(becky, alice, XRP(50)));
607 env(deposit::auth(alice, becky));
608 env(deposit::auth(becky, alice));
612 auto const USDalice = alice[
"USD"];
613 env(offer(alice, EUR(10), XRP(100)));
614 env(offer(becky, USDalice(10), XRP(100)));
617 env(ticket::create(alice, 2));
620 auto const BTCbecky = becky[
"BTC"];
621 env(trust(alice, BTCbecky(200)));
629 auto getNextLine = [](Env& env,
630 Account
const& alice,
633 params[jss::account] = alice.human();
634 params[jss::limit] = 1;
636 params[jss::marker] = *marker;
638 return env.rpc(
"json",
"account_lines",
to_string(params));
641 auto aliceLines = getNextLine(env, alice,
std::nullopt);
647 auto hasMarker = [](
auto const& aliceLines) {
648 return aliceLines[jss::result].isMember(jss::marker);
650 auto marker = [](
auto const& aliceLines) {
651 return aliceLines[jss::result][jss::marker].asString();
653 auto checkLines = [](
auto const& aliceLines) {
654 return aliceLines.isMember(jss::result) &&
655 !aliceLines[jss::result].isMember(jss::error_message) &&
656 aliceLines[jss::result].isMember(jss::lines) &&
657 aliceLines[jss::result][jss::lines].isArray() &&
658 aliceLines[jss::result][jss::lines].size() <= 1;
661 BEAST_EXPECT(hasMarker(aliceLines));
662 BEAST_EXPECT(checkLines(aliceLines));
663 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
667 while (hasMarker(aliceLines))
670 aliceLines = getNextLine(env, alice, marker(aliceLines));
671 BEAST_EXPECT(checkLines(aliceLines));
672 foundLines += aliceLines[jss::result][jss::lines].size();
675 BEAST_EXPECT(expectedLines == foundLines);
678 aliceObjectsParams2[jss::account] = alice.human();
679 aliceObjectsParams2[jss::limit] = 200;
681 "json",
"account_objects",
to_string(aliceObjectsParams2));
682 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
684 !aliceObjects[jss::result].isMember(jss::error_message));
686 aliceObjects[jss::result].isMember(jss::account_objects));
688 aliceObjects[jss::result][jss::account_objects].isArray());
693 aliceObjects[jss::result][jss::account_objects].size() ==
694 iterations + expectedNFTs);
702 beckyObjectsParams[jss::account] = becky.human();
703 beckyObjectsParams[jss::limit] = 200;
705 "json",
"account_objects",
to_string(beckyObjectsParams));
706 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
708 !beckyObjects[jss::result].isMember(jss::error_message));
710 beckyObjects[jss::result].isMember(jss::account_objects));
712 beckyObjects[jss::result][jss::account_objects].isArray());
716 beckyObjects[jss::result][jss::account_objects].size() ==
717 aliceObjects[jss::result][jss::account_objects].size() - 2);
727 using namespace test::jtx;
732 request[jss::method] =
"account_lines";
733 request[jss::jsonrpc] =
"2.0";
734 request[jss::ripplerpc] =
"2.0";
735 auto const lines = env.rpc(
"json2",
to_string(request));
737 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
739 lines.isMember(jss::ripplerpc) &&
740 lines[jss::ripplerpc] ==
"2.0");
745 request[jss::method] =
"account_lines";
746 request[jss::jsonrpc] =
"2.0";
747 request[jss::ripplerpc] =
"2.0";
748 request[jss::id] = 5;
749 auto const lines = env.rpc(
"json2",
to_string(request));
751 lines[jss::error][jss::message] ==
754 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
756 lines.isMember(jss::ripplerpc) &&
757 lines[jss::ripplerpc] ==
"2.0");
758 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
763 params[jss::account] =
764 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
766 request[jss::method] =
"account_lines";
767 request[jss::jsonrpc] =
"2.0";
768 request[jss::ripplerpc] =
"2.0";
769 request[jss::id] = 5;
770 request[jss::params] = params;
771 auto const lines = env.rpc(
"json2",
to_string(request));
773 lines[jss::error][jss::message] ==
776 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
778 lines.isMember(jss::ripplerpc) &&
779 lines[jss::ripplerpc] ==
"2.0");
780 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
782 Account
const alice{
"alice"};
786 params[jss::account] = alice.human();
788 request[jss::method] =
"account_lines";
789 request[jss::jsonrpc] =
"2.0";
790 request[jss::ripplerpc] =
"2.0";
791 request[jss::id] = 5;
792 request[jss::params] = params;
793 auto const lines = env.rpc(
"json2",
to_string(request));
795 lines[jss::error][jss::message] ==
798 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
800 lines.isMember(jss::ripplerpc) &&
801 lines[jss::ripplerpc] ==
"2.0");
802 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
804 env.fund(XRP(10000), alice);
806 LedgerInfo const ledger3Info = env.closed()->info();
807 BEAST_EXPECT(ledger3Info.
seq == 3);
812 params[jss::account] = alice.human();
814 request[jss::method] =
"account_lines";
815 request[jss::jsonrpc] =
"2.0";
816 request[jss::ripplerpc] =
"2.0";
817 request[jss::id] = 5;
818 request[jss::params] = params;
819 auto const lines = env.rpc(
"json2",
to_string(request));
820 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
821 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
823 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
825 lines.isMember(jss::ripplerpc) &&
826 lines[jss::ripplerpc] ==
"2.0");
827 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
832 params[jss::account] = alice.human();
833 params[jss::ledger_index] =
"nonsense";
835 request[jss::method] =
"account_lines";
836 request[jss::jsonrpc] =
"2.0";
837 request[jss::ripplerpc] =
"2.0";
838 request[jss::id] = 5;
839 request[jss::params] = params;
840 auto const lines = env.rpc(
"json2",
to_string(request));
842 lines[jss::error][jss::message] ==
"ledgerIndexMalformed");
844 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
846 lines.isMember(jss::ripplerpc) &&
847 lines[jss::ripplerpc] ==
"2.0");
848 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
853 params[jss::account] = alice.human();
854 params[jss::ledger_index] = 50000;
856 request[jss::method] =
"account_lines";
857 request[jss::jsonrpc] =
"2.0";
858 request[jss::ripplerpc] =
"2.0";
859 request[jss::id] = 5;
860 request[jss::params] = params;
861 auto const lines = env.rpc(
"json2",
to_string(request));
862 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
864 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
866 lines.isMember(jss::ripplerpc) &&
867 lines[jss::ripplerpc] ==
"2.0");
868 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
871 Account
const gw1{
"gw1"};
872 env.fund(XRP(10000), gw1);
875 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
879 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
880 IOU
const& gw1Currency = gw1Currencies.
back();
883 env(trust(alice, gw1Currency(100 + c)));
884 env(pay(gw1, alice, gw1Currency(50 + c)));
887 LedgerInfo const ledger4Info = env.closed()->info();
888 BEAST_EXPECT(ledger4Info.
seq == 4);
892 Account
const gw2{
"gw2"};
893 env.fund(XRP(10000), gw2);
900 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
904 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
905 IOU
const& gw2Currency = gw2Currencies.
back();
908 env(trust(alice, gw2Currency(200 + c)));
909 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
911 env(pay(gw2, alice, gw2Currency(100 + c)));
922 LedgerInfo const ledger58Info = env.closed()->info();
923 BEAST_EXPECT(ledger58Info.
seq == 58);
926 auto testAccountLinesHistory = [
this, &env](
927 Account
const& account,
932 paramsSeq[jss::account] = account.human();
933 paramsSeq[jss::ledger_index] = info.seq;
935 requestSeq[jss::method] =
"account_lines";
936 requestSeq[jss::jsonrpc] =
"2.0";
937 requestSeq[jss::ripplerpc] =
"2.0";
938 requestSeq[jss::id] = 5;
939 requestSeq[jss::params] = paramsSeq;
940 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
941 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
942 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
944 linesSeq.isMember(jss::jsonrpc) &&
945 linesSeq[jss::jsonrpc] ==
"2.0");
947 linesSeq.isMember(jss::ripplerpc) &&
948 linesSeq[jss::ripplerpc] ==
"2.0");
949 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
953 paramsHash[jss::account] = account.human();
954 paramsHash[jss::ledger_hash] =
to_string(info.hash);
956 requestHash[jss::method] =
"account_lines";
957 requestHash[jss::jsonrpc] =
"2.0";
958 requestHash[jss::ripplerpc] =
"2.0";
959 requestHash[jss::id] = 5;
960 requestHash[jss::params] = paramsHash;
961 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
962 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
963 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
965 linesHash.isMember(jss::jsonrpc) &&
966 linesHash[jss::jsonrpc] ==
"2.0");
968 linesHash.isMember(jss::ripplerpc) &&
969 linesHash[jss::ripplerpc] ==
"2.0");
971 linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
975 testAccountLinesHistory(alice, ledger3Info, 0);
978 testAccountLinesHistory(alice, ledger4Info, 26);
981 testAccountLinesHistory(alice, ledger58Info, 52);
987 params[jss::account] = alice.human();
989 params[jss::ledger_index] = ledger58Info.
seq;
991 request[jss::method] =
"account_lines";
992 request[jss::jsonrpc] =
"2.0";
993 request[jss::ripplerpc] =
"2.0";
994 request[jss::id] = 5;
995 request[jss::params] = params;
996 auto const lines = env.rpc(
"json2",
to_string(request));
997 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
998 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1000 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1002 lines.isMember(jss::ripplerpc) &&
1003 lines[jss::ripplerpc] ==
"2.0");
1004 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1009 params[jss::account] = alice.human();
1011 request[jss::method] =
"account_lines";
1012 request[jss::jsonrpc] =
"2.0";
1013 request[jss::ripplerpc] =
"2.0";
1014 request[jss::id] = 5;
1015 request[jss::params] = params;
1016 auto const lines = env.rpc(
"json2",
to_string(request));
1017 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1018 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
1020 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1022 lines.isMember(jss::ripplerpc) &&
1023 lines[jss::ripplerpc] ==
"2.0");
1024 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1029 params[jss::account] = alice.human();
1030 params[jss::peer] = gw1.human();
1032 request[jss::method] =
"account_lines";
1033 request[jss::jsonrpc] =
"2.0";
1034 request[jss::ripplerpc] =
"2.0";
1035 request[jss::id] = 5;
1036 request[jss::params] = params;
1037 auto const lines = env.rpc(
"json2",
to_string(request));
1038 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1039 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1041 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1043 lines.isMember(jss::ripplerpc) &&
1044 lines[jss::ripplerpc] ==
"2.0");
1045 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1050 params[jss::account] = alice.human();
1052 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
1054 request[jss::method] =
"account_lines";
1055 request[jss::jsonrpc] =
"2.0";
1056 request[jss::ripplerpc] =
"2.0";
1057 request[jss::id] = 5;
1058 request[jss::params] = params;
1059 auto const lines = env.rpc(
"json2",
to_string(request));
1061 lines[jss::error][jss::message] ==
1064 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1066 lines.isMember(jss::ripplerpc) &&
1067 lines[jss::ripplerpc] ==
"2.0");
1068 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1073 params[jss::account] = alice.human();
1074 params[jss::limit] = -1;
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] ==
1086 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1088 lines.isMember(jss::ripplerpc) &&
1089 lines[jss::ripplerpc] ==
"2.0");
1090 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1095 paramsA[jss::account] = alice.human();
1096 paramsA[jss::limit] = 1;
1098 requestA[jss::method] =
"account_lines";
1099 requestA[jss::jsonrpc] =
"2.0";
1100 requestA[jss::ripplerpc] =
"2.0";
1101 requestA[jss::id] = 5;
1102 requestA[jss::params] = paramsA;
1103 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1104 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1105 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1107 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1109 linesA.isMember(jss::ripplerpc) &&
1110 linesA[jss::ripplerpc] ==
"2.0");
1111 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1114 auto marker = linesA[jss::result][jss::marker].asString();
1116 paramsB[jss::account] = alice.human();
1117 paramsB[jss::marker] = marker;
1119 requestB[jss::method] =
"account_lines";
1120 requestB[jss::jsonrpc] =
"2.0";
1121 requestB[jss::ripplerpc] =
"2.0";
1122 requestB[jss::id] = 5;
1123 requestB[jss::params] = paramsB;
1124 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1125 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1126 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1128 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1130 linesB.isMember(jss::ripplerpc) &&
1131 linesB[jss::ripplerpc] ==
"2.0");
1132 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1136 paramsC[jss::account] = alice.human();
1137 paramsC[jss::limit] = 3;
1138 paramsC[jss::marker] = marker;
1140 requestC[jss::method] =
"account_lines";
1141 requestC[jss::jsonrpc] =
"2.0";
1142 requestC[jss::ripplerpc] =
"2.0";
1143 requestC[jss::id] = 5;
1144 requestC[jss::params] = paramsC;
1145 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1146 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1147 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1149 linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1151 linesC.isMember(jss::ripplerpc) &&
1152 linesC[jss::ripplerpc] ==
"2.0");
1153 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1156 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1158 paramsD[jss::account] = alice.human();
1159 paramsD[jss::marker] = marker;
1161 requestD[jss::method] =
"account_lines";
1162 requestD[jss::jsonrpc] =
"2.0";
1163 requestD[jss::ripplerpc] =
"2.0";
1164 requestD[jss::id] = 5;
1165 requestD[jss::params] = paramsD;
1166 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1168 linesD[jss::error][jss::message] ==
1171 linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1173 linesD.isMember(jss::ripplerpc) &&
1174 linesD[jss::ripplerpc] ==
"2.0");
1175 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1180 params[jss::account] = alice.human();
1181 params[jss::marker] =
true;
1183 request[jss::method] =
"account_lines";
1184 request[jss::jsonrpc] =
"2.0";
1185 request[jss::ripplerpc] =
"2.0";
1186 request[jss::id] = 5;
1187 request[jss::params] = params;
1188 auto const lines = env.rpc(
"json2",
to_string(request));
1190 lines[jss::error][jss::message] ==
1193 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1195 lines.isMember(jss::ripplerpc) &&
1196 lines[jss::ripplerpc] ==
"2.0");
1197 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1202 params[jss::account] = alice.human();
1203 params[jss::limit] = 10;
1204 params[jss::peer] = gw2.human();
1206 request[jss::method] =
"account_lines";
1207 request[jss::jsonrpc] =
"2.0";
1208 request[jss::ripplerpc] =
"2.0";
1209 request[jss::id] = 5;
1210 request[jss::params] = params;
1211 auto const lines = env.rpc(
"json2",
to_string(request));
1212 auto const& line = lines[jss::result][jss::lines][0u];
1213 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1214 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1215 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1216 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1218 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1220 lines.isMember(jss::ripplerpc) &&
1221 lines[jss::ripplerpc] ==
"2.0");
1222 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1227 paramsA[jss::account] = gw2.human();
1228 paramsA[jss::limit] = 1;
1229 paramsA[jss::peer] = alice.human();
1231 requestA[jss::method] =
"account_lines";
1232 requestA[jss::jsonrpc] =
"2.0";
1233 requestA[jss::ripplerpc] =
"2.0";
1234 requestA[jss::id] = 5;
1235 requestA[jss::params] = paramsA;
1236 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1237 auto const& lineA = linesA[jss::result][jss::lines][0u];
1238 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1239 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1240 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1241 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1243 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1245 linesA.isMember(jss::ripplerpc) &&
1246 linesA[jss::ripplerpc] ==
"2.0");
1247 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1250 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1251 auto const marker = linesA[jss::result][jss::marker].asString();
1253 paramsB[jss::account] = gw2.human();
1254 paramsB[jss::limit] = 25;
1255 paramsB[jss::marker] = marker;
1256 paramsB[jss::peer] = alice.human();
1258 requestB[jss::method] =
"account_lines";
1259 requestB[jss::jsonrpc] =
"2.0";
1260 requestB[jss::ripplerpc] =
"2.0";
1261 requestB[jss::id] = 5;
1262 requestB[jss::params] = paramsB;
1263 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1264 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1265 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1266 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1268 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1270 linesB.isMember(jss::ripplerpc) &&
1271 linesB[jss::ripplerpc] ==
"2.0");
1272 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);