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);
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 "Invalid field 'ledger_index', not string or number.");
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 LedgerHeader const ledger4Info = env.closed()->header();
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 LedgerHeader const ledger58Info = env.closed()->header();
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);
195 params[jss::account] = alice.human();
197 params[jss::ledger_index] = ledger58Info.
seq;
198 auto const lines = env.rpc(
199 "json",
"account_lines",
to_string(params))[jss::result];
200 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
202 lines[jss::error_message] ==
203 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
209 params[jss::account] = alice.human();
211 auto const lines = env.rpc(
212 "json",
"account_lines",
to_string(params))[jss::result];
213 BEAST_EXPECT(lines[jss::error] ==
"invalidParams");
215 lines[jss::error_message] ==
216 "Invalid field 'ledger_index', not string or number.");
221 params[jss::account] = alice.human();
223 env.rpc(
"json",
"account_lines",
to_string(params));
224 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
225 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
230 params[jss::account] = alice.human();
231 params[jss::peer] = gw1.human();
233 env.rpc(
"json",
"account_lines",
to_string(params));
234 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
235 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
238 auto const& line = lines[jss::result][jss::lines][0u];
239 BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
244 params[jss::account] = alice.human();
246 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
248 env.rpc(
"json",
"account_lines",
to_string(params));
250 lines[jss::result][jss::error_message] ==
256 params[jss::account] = alice.human();
257 params[jss::limit] = -1;
259 env.rpc(
"json",
"account_lines",
to_string(params));
261 lines[jss::result][jss::error_message] ==
267 paramsA[jss::account] = alice.human();
268 paramsA[jss::limit] = 1;
270 env.rpc(
"json",
"account_lines",
to_string(paramsA));
271 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
272 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
275 auto marker = linesA[jss::result][jss::marker].asString();
277 paramsB[jss::account] = alice.human();
278 paramsB[jss::marker] = marker;
280 env.rpc(
"json",
"account_lines",
to_string(paramsB));
281 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
282 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
286 paramsC[jss::account] = alice.human();
287 paramsC[jss::limit] = 3;
288 paramsC[jss::marker] = marker;
290 env.rpc(
"json",
"account_lines",
to_string(paramsC));
291 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
292 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
295 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
297 paramsD[jss::account] = alice.human();
298 paramsD[jss::marker] = marker;
300 env.rpc(
"json",
"account_lines",
to_string(paramsD));
302 linesD[jss::result][jss::error_message] ==
308 params[jss::account] = alice.human();
309 params[jss::marker] =
true;
311 env.rpc(
"json",
"account_lines",
to_string(params));
313 lines[jss::result][jss::error_message] ==
319 params[jss::account] = alice.human();
320 params[jss::limit] = 10;
321 params[jss::peer] = gw2.human();
323 env.rpc(
"json",
"account_lines",
to_string(params));
324 auto const& line = lines[jss::result][jss::lines][0u];
325 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
326 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
327 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
328 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
333 paramsA[jss::account] = gw2.human();
334 paramsA[jss::limit] = 1;
335 paramsA[jss::peer] = alice.human();
337 env.rpc(
"json",
"account_lines",
to_string(paramsA));
338 auto const& lineA = linesA[jss::result][jss::lines][0u];
339 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
340 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
341 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
342 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
345 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
346 auto const marker = linesA[jss::result][jss::marker].asString();
348 paramsB[jss::account] = gw2.human();
349 paramsB[jss::limit] = 25;
350 paramsB[jss::marker] = marker;
351 paramsB[jss::peer] = alice.human();
353 env.rpc(
"json",
"account_lines",
to_string(paramsB));
354 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
355 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
356 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
521 testcase(
"Marker can point to any appropriate ledger entry type");
522 using namespace test::jtx;
523 using namespace std::chrono_literals;
532 Account
const alice{
"alice"};
533 Account
const becky{
"becky"};
534 Account
const gw1{
"gw1"};
535 env.fund(XRP(10000), alice, becky, gw1);
538 auto payChan = [](Account
const& account,
544 jv[jss::TransactionType] = jss::PaymentChannelCreate;
545 jv[jss::Account] = account.human();
546 jv[jss::Destination] = to.human();
548 jv[
"SettleDelay"] = settleDelay.count();
549 jv[
"PublicKey"] =
strHex(pk.slice());
558 Account
const bogie{
"bogie"};
559 env(signers(alice, 2, {{bogie, 3}}));
563 env(signers(becky, 2, {{alice, 3}}));
567 auto const EUR = gw1[
"EUR"];
568 env(trust(alice, EUR(200)));
569 env(trust(becky, EUR(200)));
573 env(escrow::create(alice, becky, XRP(1000)),
574 escrow::finish_time(env.now() + 1s));
575 env(escrow::create(becky, alice, XRP(1000)),
576 escrow::finish_time(env.now() + 1s));
579 env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
580 env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
592 env(token::createOffer(alice, beckyNFtokenID, drops(1)),
593 token::owner(becky));
594 env(token::createOffer(becky, aliceNFtokenID, drops(1)),
595 token::owner(alice));
597 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
599 token::destination(alice));
600 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
602 token::destination(becky));
604 env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
606 token::destination(alice));
607 env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
609 token::destination(becky));
611 env(token::createOffer(becky, beckyNFtokenID, drops(1)),
613 env(token::createOffer(alice, aliceNFtokenID, drops(1)),
617 env(check::create(alice, becky, XRP(50)));
618 env(check::create(becky, alice, XRP(50)));
621 env(deposit::auth(alice, becky));
622 env(deposit::auth(becky, alice));
626 auto const USDalice = alice[
"USD"];
627 env(offer(alice, EUR(10), XRP(100)));
628 env(offer(becky, USDalice(10), XRP(100)));
631 env(ticket::create(alice, 2));
634 auto const BTCbecky = becky[
"BTC"];
635 env(trust(alice, BTCbecky(200)));
643 auto getNextLine = [](Env& env,
644 Account
const& alice,
647 params[jss::account] = alice.human();
648 params[jss::limit] = 1;
650 params[jss::marker] = *marker;
652 return env.rpc(
"json",
"account_lines",
to_string(params));
655 auto aliceLines = getNextLine(env, alice,
std::nullopt);
661 auto hasMarker = [](
auto const& aliceLines) {
662 return aliceLines[jss::result].isMember(jss::marker);
664 auto marker = [](
auto const& aliceLines) {
665 return aliceLines[jss::result][jss::marker].asString();
667 auto checkLines = [](
auto const& aliceLines) {
668 return aliceLines.isMember(jss::result) &&
669 !aliceLines[jss::result].isMember(jss::error_message) &&
670 aliceLines[jss::result].isMember(jss::lines) &&
671 aliceLines[jss::result][jss::lines].isArray() &&
672 aliceLines[jss::result][jss::lines].size() <= 1;
675 BEAST_EXPECT(hasMarker(aliceLines));
676 BEAST_EXPECT(checkLines(aliceLines));
677 BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
681 while (hasMarker(aliceLines))
684 aliceLines = getNextLine(env, alice, marker(aliceLines));
685 BEAST_EXPECT(checkLines(aliceLines));
686 foundLines += aliceLines[jss::result][jss::lines].size();
689 BEAST_EXPECT(expectedLines == foundLines);
692 aliceObjectsParams2[jss::account] = alice.human();
693 aliceObjectsParams2[jss::limit] = 200;
695 "json",
"account_objects",
to_string(aliceObjectsParams2));
696 BEAST_EXPECT(aliceObjects.
isMember(jss::result));
698 !aliceObjects[jss::result].isMember(jss::error_message));
700 aliceObjects[jss::result].isMember(jss::account_objects));
702 aliceObjects[jss::result][jss::account_objects].isArray());
707 aliceObjects[jss::result][jss::account_objects].size() ==
708 iterations + expectedNFTs);
716 beckyObjectsParams[jss::account] = becky.human();
717 beckyObjectsParams[jss::limit] = 200;
719 "json",
"account_objects",
to_string(beckyObjectsParams));
720 BEAST_EXPECT(beckyObjects.
isMember(jss::result));
722 !beckyObjects[jss::result].isMember(jss::error_message));
724 beckyObjects[jss::result].isMember(jss::account_objects));
726 beckyObjects[jss::result][jss::account_objects].isArray());
730 beckyObjects[jss::result][jss::account_objects].size() ==
731 aliceObjects[jss::result][jss::account_objects].size() - 2);
741 using namespace test::jtx;
746 request[jss::method] =
"account_lines";
747 request[jss::jsonrpc] =
"2.0";
748 request[jss::ripplerpc] =
"2.0";
749 auto const lines = env.rpc(
"json2",
to_string(request));
751 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
753 lines.isMember(jss::ripplerpc) &&
754 lines[jss::ripplerpc] ==
"2.0");
759 request[jss::method] =
"account_lines";
760 request[jss::jsonrpc] =
"2.0";
761 request[jss::ripplerpc] =
"2.0";
762 request[jss::id] = 5;
763 auto const lines = env.rpc(
"json2",
to_string(request));
765 lines[jss::error][jss::message] ==
768 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
770 lines.isMember(jss::ripplerpc) &&
771 lines[jss::ripplerpc] ==
"2.0");
772 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
777 params[jss::account] =
778 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
780 request[jss::method] =
"account_lines";
781 request[jss::jsonrpc] =
"2.0";
782 request[jss::ripplerpc] =
"2.0";
783 request[jss::id] = 5;
784 request[jss::params] = params;
785 auto const lines = env.rpc(
"json2",
to_string(request));
787 lines[jss::error][jss::message] ==
790 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
792 lines.isMember(jss::ripplerpc) &&
793 lines[jss::ripplerpc] ==
"2.0");
794 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
796 Account
const alice{
"alice"};
800 params[jss::account] = alice.human();
802 request[jss::method] =
"account_lines";
803 request[jss::jsonrpc] =
"2.0";
804 request[jss::ripplerpc] =
"2.0";
805 request[jss::id] = 5;
806 request[jss::params] = params;
807 auto const lines = env.rpc(
"json2",
to_string(request));
809 lines[jss::error][jss::message] ==
812 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
814 lines.isMember(jss::ripplerpc) &&
815 lines[jss::ripplerpc] ==
"2.0");
816 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
818 env.fund(XRP(10000), alice);
820 LedgerHeader const ledger3Info = env.closed()->header();
821 BEAST_EXPECT(ledger3Info.
seq == 3);
826 params[jss::account] = alice.human();
828 request[jss::method] =
"account_lines";
829 request[jss::jsonrpc] =
"2.0";
830 request[jss::ripplerpc] =
"2.0";
831 request[jss::id] = 5;
832 request[jss::params] = params;
833 auto const lines = env.rpc(
"json2",
to_string(request));
834 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
835 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
837 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
839 lines.isMember(jss::ripplerpc) &&
840 lines[jss::ripplerpc] ==
"2.0");
841 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
846 params[jss::account] = alice.human();
847 params[jss::ledger_index] =
"nonsense";
849 request[jss::method] =
"account_lines";
850 request[jss::jsonrpc] =
"2.0";
851 request[jss::ripplerpc] =
"2.0";
852 request[jss::id] = 5;
853 request[jss::params] = params;
854 auto const lines = env.rpc(
"json2",
to_string(request));
856 lines[jss::error][jss::message] ==
857 "Invalid field 'ledger_index', not string or number.");
859 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
861 lines.isMember(jss::ripplerpc) &&
862 lines[jss::ripplerpc] ==
"2.0");
863 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
868 params[jss::account] = alice.human();
869 params[jss::ledger_index] = 50000;
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;
876 auto const lines = env.rpc(
"json2",
to_string(request));
877 BEAST_EXPECT(lines[jss::error][jss::message] ==
"ledgerNotFound");
879 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
881 lines.isMember(jss::ripplerpc) &&
882 lines[jss::ripplerpc] ==
"2.0");
883 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
886 Account
const gw1{
"gw1"};
887 env.fund(XRP(10000), gw1);
890 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
894 gw1[
std::string(
"YA") +
static_cast<char>(
'A' + c)]);
895 IOU
const& gw1Currency = gw1Currencies.
back();
898 env(trust(alice, gw1Currency(100 + c)));
899 env(pay(gw1, alice, gw1Currency(50 + c)));
902 LedgerHeader const ledger4Info = env.closed()->header();
903 BEAST_EXPECT(ledger4Info.
seq == 4);
907 Account
const gw2{
"gw2"};
908 env.fund(XRP(10000), gw2);
915 for (
char c = 0; c <= (
'Z' -
'A'); ++c)
919 gw2[
std::string(
"ZA") +
static_cast<char>(
'A' + c)]);
920 IOU
const& gw2Currency = gw2Currencies.
back();
923 env(trust(alice, gw2Currency(200 + c)));
924 env(trust(gw2, gw2Currency(0), alice,
tfSetfAuth));
926 env(pay(gw2, alice, gw2Currency(100 + c)));
937 LedgerHeader const ledger58Info = env.closed()->header();
938 BEAST_EXPECT(ledger58Info.
seq == 58);
941 auto testAccountLinesHistory = [
this, &env](
942 Account
const& account,
947 paramsSeq[jss::account] = account.human();
948 paramsSeq[jss::ledger_index] = info.seq;
950 requestSeq[jss::method] =
"account_lines";
951 requestSeq[jss::jsonrpc] =
"2.0";
952 requestSeq[jss::ripplerpc] =
"2.0";
953 requestSeq[jss::id] = 5;
954 requestSeq[jss::params] = paramsSeq;
955 auto const linesSeq = env.rpc(
"json2",
to_string(requestSeq));
956 BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
957 BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
959 linesSeq.isMember(jss::jsonrpc) &&
960 linesSeq[jss::jsonrpc] ==
"2.0");
962 linesSeq.isMember(jss::ripplerpc) &&
963 linesSeq[jss::ripplerpc] ==
"2.0");
964 BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
968 paramsHash[jss::account] = account.human();
969 paramsHash[jss::ledger_hash] =
to_string(info.hash);
971 requestHash[jss::method] =
"account_lines";
972 requestHash[jss::jsonrpc] =
"2.0";
973 requestHash[jss::ripplerpc] =
"2.0";
974 requestHash[jss::id] = 5;
975 requestHash[jss::params] = paramsHash;
976 auto const linesHash = env.rpc(
"json2",
to_string(requestHash));
977 BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
978 BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
980 linesHash.isMember(jss::jsonrpc) &&
981 linesHash[jss::jsonrpc] ==
"2.0");
983 linesHash.isMember(jss::ripplerpc) &&
984 linesHash[jss::ripplerpc] ==
"2.0");
986 linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
990 testAccountLinesHistory(alice, ledger3Info, 0);
993 testAccountLinesHistory(alice, ledger4Info, 26);
996 testAccountLinesHistory(alice, ledger58Info, 52);
1002 params[jss::account] = alice.human();
1004 params[jss::ledger_index] = ledger58Info.
seq;
1006 request[jss::method] =
"account_lines";
1007 request[jss::jsonrpc] =
"2.0";
1008 request[jss::ripplerpc] =
"2.0";
1009 request[jss::id] = 5;
1010 request[jss::params] = params;
1011 auto const lines = env.rpc(
"json2",
to_string(request));
1012 BEAST_EXPECT(lines[jss::error][jss::error] ==
"invalidParams");
1014 lines[jss::error][jss::message] ==
1015 "Exactly one of 'ledger_hash' or 'ledger_index' can be "
1018 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1020 lines.isMember(jss::ripplerpc) &&
1021 lines[jss::ripplerpc] ==
"2.0");
1022 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1027 params[jss::account] = alice.human();
1029 request[jss::method] =
"account_lines";
1030 request[jss::jsonrpc] =
"2.0";
1031 request[jss::ripplerpc] =
"2.0";
1032 request[jss::id] = 5;
1033 request[jss::params] = params;
1034 auto const lines = env.rpc(
"json2",
to_string(request));
1035 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1036 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
1038 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1040 lines.isMember(jss::ripplerpc) &&
1041 lines[jss::ripplerpc] ==
"2.0");
1042 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1047 params[jss::account] = alice.human();
1048 params[jss::peer] = gw1.human();
1050 request[jss::method] =
"account_lines";
1051 request[jss::jsonrpc] =
"2.0";
1052 request[jss::ripplerpc] =
"2.0";
1053 request[jss::id] = 5;
1054 request[jss::params] = params;
1055 auto const lines = env.rpc(
"json2",
to_string(request));
1056 BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
1057 BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
1059 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1061 lines.isMember(jss::ripplerpc) &&
1062 lines[jss::ripplerpc] ==
"2.0");
1063 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1068 params[jss::account] = alice.human();
1070 "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
1072 request[jss::method] =
"account_lines";
1073 request[jss::jsonrpc] =
"2.0";
1074 request[jss::ripplerpc] =
"2.0";
1075 request[jss::id] = 5;
1076 request[jss::params] = params;
1077 auto const lines = env.rpc(
"json2",
to_string(request));
1079 lines[jss::error][jss::message] ==
1082 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1084 lines.isMember(jss::ripplerpc) &&
1085 lines[jss::ripplerpc] ==
"2.0");
1086 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1091 params[jss::account] = alice.human();
1092 params[jss::limit] = -1;
1094 request[jss::method] =
"account_lines";
1095 request[jss::jsonrpc] =
"2.0";
1096 request[jss::ripplerpc] =
"2.0";
1097 request[jss::id] = 5;
1098 request[jss::params] = params;
1099 auto const lines = env.rpc(
"json2",
to_string(request));
1101 lines[jss::error][jss::message] ==
1104 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1106 lines.isMember(jss::ripplerpc) &&
1107 lines[jss::ripplerpc] ==
"2.0");
1108 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1113 paramsA[jss::account] = alice.human();
1114 paramsA[jss::limit] = 1;
1116 requestA[jss::method] =
"account_lines";
1117 requestA[jss::jsonrpc] =
"2.0";
1118 requestA[jss::ripplerpc] =
"2.0";
1119 requestA[jss::id] = 5;
1120 requestA[jss::params] = paramsA;
1121 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1122 BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
1123 BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
1125 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1127 linesA.isMember(jss::ripplerpc) &&
1128 linesA[jss::ripplerpc] ==
"2.0");
1129 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1132 auto marker = linesA[jss::result][jss::marker].asString();
1134 paramsB[jss::account] = alice.human();
1135 paramsB[jss::marker] = marker;
1137 requestB[jss::method] =
"account_lines";
1138 requestB[jss::jsonrpc] =
"2.0";
1139 requestB[jss::ripplerpc] =
"2.0";
1140 requestB[jss::id] = 5;
1141 requestB[jss::params] = paramsB;
1142 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1143 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1144 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
1146 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1148 linesB.isMember(jss::ripplerpc) &&
1149 linesB[jss::ripplerpc] ==
"2.0");
1150 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
1154 paramsC[jss::account] = alice.human();
1155 paramsC[jss::limit] = 3;
1156 paramsC[jss::marker] = marker;
1158 requestC[jss::method] =
"account_lines";
1159 requestC[jss::jsonrpc] =
"2.0";
1160 requestC[jss::ripplerpc] =
"2.0";
1161 requestC[jss::id] = 5;
1162 requestC[jss::params] = paramsC;
1163 auto const linesC = env.rpc(
"json2",
to_string(requestC));
1164 BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
1165 BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
1167 linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] ==
"2.0");
1169 linesC.isMember(jss::ripplerpc) &&
1170 linesC[jss::ripplerpc] ==
"2.0");
1171 BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
1174 marker[5] = marker[5] ==
'7' ?
'8' :
'7';
1176 paramsD[jss::account] = alice.human();
1177 paramsD[jss::marker] = marker;
1179 requestD[jss::method] =
"account_lines";
1180 requestD[jss::jsonrpc] =
"2.0";
1181 requestD[jss::ripplerpc] =
"2.0";
1182 requestD[jss::id] = 5;
1183 requestD[jss::params] = paramsD;
1184 auto const linesD = env.rpc(
"json2",
to_string(requestD));
1186 linesD[jss::error][jss::message] ==
1189 linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] ==
"2.0");
1191 linesD.isMember(jss::ripplerpc) &&
1192 linesD[jss::ripplerpc] ==
"2.0");
1193 BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
1198 params[jss::account] = alice.human();
1199 params[jss::marker] =
true;
1201 request[jss::method] =
"account_lines";
1202 request[jss::jsonrpc] =
"2.0";
1203 request[jss::ripplerpc] =
"2.0";
1204 request[jss::id] = 5;
1205 request[jss::params] = params;
1206 auto const lines = env.rpc(
"json2",
to_string(request));
1208 lines[jss::error][jss::message] ==
1211 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1213 lines.isMember(jss::ripplerpc) &&
1214 lines[jss::ripplerpc] ==
"2.0");
1215 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1220 params[jss::account] = alice.human();
1221 params[jss::limit] = 10;
1222 params[jss::peer] = gw2.human();
1224 request[jss::method] =
"account_lines";
1225 request[jss::jsonrpc] =
"2.0";
1226 request[jss::ripplerpc] =
"2.0";
1227 request[jss::id] = 5;
1228 request[jss::params] = params;
1229 auto const lines = env.rpc(
"json2",
to_string(request));
1230 auto const& line = lines[jss::result][jss::lines][0u];
1231 BEAST_EXPECT(line[jss::freeze].asBool() ==
true);
1232 BEAST_EXPECT(line[jss::deep_freeze].asBool() ==
true);
1233 BEAST_EXPECT(line[jss::no_ripple].asBool() ==
true);
1234 BEAST_EXPECT(line[jss::peer_authorized].asBool() ==
true);
1236 lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] ==
"2.0");
1238 lines.isMember(jss::ripplerpc) &&
1239 lines[jss::ripplerpc] ==
"2.0");
1240 BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
1245 paramsA[jss::account] = gw2.human();
1246 paramsA[jss::limit] = 1;
1247 paramsA[jss::peer] = alice.human();
1249 requestA[jss::method] =
"account_lines";
1250 requestA[jss::jsonrpc] =
"2.0";
1251 requestA[jss::ripplerpc] =
"2.0";
1252 requestA[jss::id] = 5;
1253 requestA[jss::params] = paramsA;
1254 auto const linesA = env.rpc(
"json2",
to_string(requestA));
1255 auto const& lineA = linesA[jss::result][jss::lines][0u];
1256 BEAST_EXPECT(lineA[jss::freeze_peer].asBool() ==
true);
1257 BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() ==
true);
1258 BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() ==
true);
1259 BEAST_EXPECT(lineA[jss::authorized].asBool() ==
true);
1261 linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] ==
"2.0");
1263 linesA.isMember(jss::ripplerpc) &&
1264 linesA[jss::ripplerpc] ==
"2.0");
1265 BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
1268 BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
1269 auto const marker = linesA[jss::result][jss::marker].asString();
1271 paramsB[jss::account] = gw2.human();
1272 paramsB[jss::limit] = 25;
1273 paramsB[jss::marker] = marker;
1274 paramsB[jss::peer] = alice.human();
1276 requestB[jss::method] =
"account_lines";
1277 requestB[jss::jsonrpc] =
"2.0";
1278 requestB[jss::ripplerpc] =
"2.0";
1279 requestB[jss::id] = 5;
1280 requestB[jss::params] = paramsB;
1281 auto const linesB = env.rpc(
"json2",
to_string(requestB));
1282 BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
1283 BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
1284 BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
1286 linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] ==
"2.0");
1288 linesB.isMember(jss::ripplerpc) &&
1289 linesB[jss::ripplerpc] ==
"2.0");
1290 BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);