138 cfg->fees.referenceFee = 10;
142 env.fund(
XRP(10000), a1);
152 return j.isMember(jss::result) && (j[jss::result][jss::status] ==
"success") &&
153 (j[jss::result][jss::transactions].size() == 2) &&
154 (j[jss::result][jss::transactions][0u][jss::tx][jss::TransactionType] ==
156 (j[jss::result][jss::transactions][1u][jss::tx][jss::TransactionType] ==
158 (j[jss::result][jss::transactions][1u][jss::tx][jss::DeliverMax] ==
160 (j[jss::result][jss::transactions][1u][jss::tx][jss::Amount] ==
161 j[jss::result][jss::transactions][1u][jss::tx][jss::DeliverMax]);
164 if (j.isMember(jss::result) && (j[jss::result][jss::status] ==
"success") &&
165 (j[jss::result][jss::transactions].size() == 2) &&
166 (j[jss::result][jss::transactions][0u][jss::tx_json]
167 [jss::TransactionType] == jss::AccountSet))
169 auto const& payment = j[jss::result][jss::transactions][1u];
171 return (payment.isMember(jss::tx_json)) &&
172 (payment[jss::tx_json][jss::TransactionType] == jss::Payment) &&
173 (payment[jss::tx_json][jss::DeliverMax] ==
"10000000010") &&
174 (!payment[jss::tx_json].isMember(jss::Amount)) &&
175 (!payment[jss::tx_json].isMember(jss::hash)) &&
176 (payment[jss::hash] ==
177 "9F3085D85F472D1CC29627F260DF68EDE59D42D1D0C33E345"
178 "ECF0D4CE981D0A8") &&
179 (payment[jss::validated] ==
true) &&
180 (payment[jss::ledger_index] == 3) &&
181 (payment[jss::ledger_hash] ==
182 "5476DCD816EA04CBBA57D47BBF1FC58A5217CC93A5ADD79CB"
183 "580A5AFDD727E33") &&
184 (payment[jss::close_time_iso] ==
"2000-01-01T00:00:10Z");
197 return j.isMember(jss::result) && (j[jss::result][jss::status] ==
"success") &&
198 (j[jss::result][jss::transactions].size() == 0);
207 jParams[jss::api_version] = apiVersion;
211 jParams[jss::account] =
"0xDEADBEEF";
215 jParams[jss::account] = a1.human();
216 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(jParams))));
221 p[jss::ledger_index_min] = -1;
222 p[jss::ledger_index_max] = -1;
223 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
225 p[jss::ledger_index_min] = 0;
226 p[jss::ledger_index_max] = 100;
229 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
237 p[jss::ledger_index_min] = 1;
238 p[jss::ledger_index_max] = 2;
241 BEAST_EXPECT(noTxs(env.rpc(
"json",
"account_tx",
to_string(p))));
249 p[jss::ledger_index_min] = 2;
250 p[jss::ledger_index_max] = 1;
252 env.rpc(
"json",
"account_tx",
to_string(p)),
258 p[jss::ledger_index_min] = -1;
259 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
261 p[jss::ledger_index_min] = 1;
264 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
272 p[jss::ledger_index_min] = env.current()->header().seq;
274 env.rpc(
"json",
"account_tx",
to_string(p)),
281 p[jss::ledger_index_max] = -1;
282 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
284 p[jss::ledger_index_max] = env.current()->header().seq;
287 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
295 p[jss::ledger_index_max] = 3;
296 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
298 p[jss::ledger_index_max] = env.closed()->header().seq;
299 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
301 p[jss::ledger_index_max] = env.closed()->header().seq - 1;
302 BEAST_EXPECT(noTxs(env.rpc(
"json",
"account_tx",
to_string(p))));
309 p[jss::ledger_index] = env.closed()->header().seq;
310 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
312 p[jss::ledger_index] = env.closed()->header().seq - 1;
313 BEAST_EXPECT(noTxs(env.rpc(
"json",
"account_tx",
to_string(p))));
315 p[jss::ledger_index] = env.current()->header().seq;
318 p[jss::ledger_index] = env.current()->header().seq + 1;
325 p[jss::ledger_index] =
"validated";
326 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
328 p[jss::ledger_index] =
"closed";
329 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
331 p[jss::ledger_index] =
"current";
334 p[jss::ledger_index] =
"";
342 p[jss::ledger_hash] =
to_string(env.closed()->header().hash);
343 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
345 p[jss::ledger_hash] =
to_string(env.closed()->header().parentHash);
346 BEAST_EXPECT(noTxs(env.rpc(
"json",
"account_tx",
to_string(p))));
352 jParams[jss::account] =
"0xDEADBEEF";
353 jParams[jss::account] = a1.human();
356 p[jss::ledger_index_max] = -1;
357 p[jss::ledger_index_min] = -1;
358 p[jss::ledger_index] = -1;
362 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
373 p[jss::ledger_index_max] = env.current()->header().seq;
376 BEAST_EXPECT(hasTxs(env.rpc(apiVersion,
"json",
"account_tx",
to_string(p))));
386 auto testInvalidAccountParam = [&](
auto const& param) {
388 params[jss::account] = param;
389 auto jrr = env.rpc(
"json",
"account_tx",
to_string(params))[jss::result];
390 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
391 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
394 testInvalidAccountParam(1);
395 testInvalidAccountParam(1.1);
396 testInvalidAccountParam(
true);
404 p[jss::binary] =
"asdf";
408 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
415 p[jss::binary] =
true;
417 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
419 p[jss::forward] =
"true";
422 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
429 p[jss::forward] =
false;
430 result = env.rpc(
"json",
"account_tx",
to_string(p));
431 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
444 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
448 p[jss::limit] =
"10";
450 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
454 p[jss::limit] =
true;
456 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
460 p[jss::limit] =
false;
462 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
468 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
474 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
480 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
484 p[jss::limit] =
"malformed";
486 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
491 p[jss::limit].
append(
"limit");
493 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
499 p[jss::limit][jss::limit] = 10;
501 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::error_message] ==
507 env.rpc(
"json",
"account_tx",
to_string(p))[jss::result][jss::status] ==
"success");
519 using namespace std::chrono_literals;
525 auto const usd{gw[
"USD"]};
527 env.
fund(
XRP(1000000), alice, gw);
534 env(
pay(alice, gw,
XRP(100)));
541 env(
trust(alice, usd(200)),
Sig(alie));
550 env(
signers(alice, 1, {{
"bogie", 1}, {
"demon", 1}}),
Sig(alie));
557 escrow[jss::TransactionType] = jss::EscrowCreate;
558 escrow[jss::Account] = account.human();
559 escrow[jss::Destination] = to.human();
567 escrowWithFinish[sfFinishAfter.jsonName] = nextTime.
time_since_epoch().count();
570 env(escrowWithFinish,
Sig(alie));
573 escrowWithCancel[sfFinishAfter.jsonName] = nextTime.
time_since_epoch().count();
574 escrowWithCancel[sfCancelAfter.jsonName] = nextTime.
time_since_epoch().count() + 1;
577 env(escrowWithCancel,
Sig(alie));
582 escrowFinish[jss::TransactionType] = jss::EscrowFinish;
583 escrowFinish[jss::Account] = alice.
human();
584 escrowFinish[sfOwner.jsonName] = alice.
human();
585 escrowFinish[sfOfferSequence.jsonName] = escrowFinishSeq;
586 env(escrowFinish,
Sig(alie));
590 escrowCancel[jss::TransactionType] = jss::EscrowCancel;
591 escrowCancel[jss::Account] = alice.
human();
592 escrowCancel[sfOwner.jsonName] = alice.
human();
593 escrowCancel[sfOfferSequence.jsonName] = escrowCancelSeq;
594 env(escrowCancel,
Sig(alie));
603 payChanCreate[jss::TransactionType] = jss::PaymentChannelCreate;
604 payChanCreate[jss::Account] = alice.
human();
605 payChanCreate[jss::Destination] = gw.
human();
608 payChanCreate[sfPublicKey.jsonName] =
strHex(alice.
pk().
slice());
609 env(payChanCreate,
Sig(alie));
617 payChanFund[jss::TransactionType] = jss::PaymentChannelFund;
618 payChanFund[jss::Account] = alice.
human();
619 payChanFund[sfChannel.jsonName] = payChanIndex;
621 env(payChanFund,
Sig(alie));
626 payChanClaim[jss::TransactionType] = jss::PaymentChannelClaim;
627 payChanClaim[jss::Flags] = tfClose;
628 payChanClaim[jss::Account] = gw.
human();
629 payChanClaim[sfChannel.jsonName] = payChanIndex;
630 payChanClaim[sfPublicKey.jsonName] =
strHex(alice.
pk().
slice());
638 auto const aliceCheckId =
662 params[jss::account] = alice.
human();
663 params[jss::ledger_index_min] = -1;
664 params[jss::ledger_index_max] = -1;
668 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
669 BEAST_EXPECT(result[jss::result][jss::transactions].isArray());
671 json::Value const& txs{result[jss::result][jss::transactions]};
678 {0, jss::DepositPreauth, {jss::DepositPreauth}, {jss::Ticket}, {jss::AccountRoot, jss::DirectoryNode}},
679 {1, jss::TicketCreate, {jss::Ticket}, {}, {jss::AccountRoot, jss::DirectoryNode}},
680 {2, jss::CheckCancel, {}, {jss::Check}, {jss::AccountRoot, jss::AccountRoot, jss::DirectoryNode, jss::DirectoryNode}},
681 {3, jss::CheckCash, {}, {jss::Check}, {jss::AccountRoot, jss::AccountRoot, jss::DirectoryNode, jss::DirectoryNode}},
682 {4, jss::CheckCreate, {jss::Check}, {}, {jss::AccountRoot, jss::AccountRoot, jss::DirectoryNode, jss::DirectoryNode}},
683 {5, jss::CheckCreate, {jss::Check}, {}, {jss::AccountRoot, jss::AccountRoot, jss::DirectoryNode, jss::DirectoryNode}},
684 {6, jss::PaymentChannelClaim, {}, {jss::PayChannel}, {jss::AccountRoot, jss::AccountRoot, jss::DirectoryNode, jss::DirectoryNode}},
685 {7, jss::PaymentChannelFund, {}, {}, {jss::AccountRoot, jss::PayChannel}},
686 {8, jss::PaymentChannelCreate, {jss::PayChannel}, {}, {jss::AccountRoot, jss::AccountRoot, jss::DirectoryNode, jss::DirectoryNode}},
687 {9, jss::EscrowCancel, {}, {jss::Escrow}, {jss::AccountRoot, jss::DirectoryNode}},
688 {10, jss::EscrowFinish, {}, {jss::Escrow}, {jss::AccountRoot, jss::DirectoryNode}},
689 {11, jss::EscrowCreate, {jss::Escrow}, {}, {jss::AccountRoot, jss::DirectoryNode}},
690 {12, jss::EscrowCreate, {jss::Escrow}, {}, {jss::AccountRoot, jss::DirectoryNode}},
691 {13, jss::SignerListSet, {jss::SignerList}, {}, {jss::AccountRoot, jss::DirectoryNode}},
692 {14, jss::OfferCancel, {}, {jss::Offer, jss::DirectoryNode}, {jss::AccountRoot, jss::DirectoryNode}},
693 {15, jss::OfferCreate, {jss::Offer, jss::DirectoryNode}, {}, {jss::AccountRoot, jss::DirectoryNode}},
694 {16, jss::TrustSet, {jss::RippleState, jss::DirectoryNode, jss::DirectoryNode}, {}, {jss::AccountRoot, jss::AccountRoot}},
695 {17, jss::SetRegularKey, {}, {}, {jss::AccountRoot}},
696 {18, jss::Payment, {}, {}, {jss::AccountRoot, jss::AccountRoot}},
697 {19, jss::AccountSet, {}, {}, {jss::AccountRoot}},
698 {20, jss::AccountSet, {}, {}, {jss::AccountRoot}},
699 {21, jss::Payment, {jss::AccountRoot}, {}, {jss::AccountRoot}},
703 BEAST_EXPECT(
std::size(kSanity) == result[jss::result][jss::transactions].size());
705 for (
unsigned int index{0}; index <
std::size(kSanity); ++index)
720 using namespace std::chrono_literals;
726 env.
fund(
XRP(10000), alice, becky);
731 BEAST_EXPECT(env.
closed()->exists(beckyAcctKey));
742 auto const beckyPreDelBalance{env.
balance(becky)};
744 auto const acctDelFee{
drops(env.
current()->fees().increment)};
749 BEAST_EXPECT(!env.
closed()->exists(beckyAcctKey));
761 { 0, jss::Payment, {}, {}, {jss::AccountRoot, jss::AccountRoot}},
762 { 1, jss::Payment, {jss::AccountRoot}, {}, {jss::AccountRoot}},
763 { 2, jss::AccountDelete, {}, {jss::AccountRoot}, {jss::AccountRoot}},
764 { 3, jss::AccountSet, {}, {}, {jss::AccountRoot}},
765 { 4, jss::AccountSet, {}, {}, {jss::AccountRoot}},
766 { 5, jss::Payment, {jss::AccountRoot}, {}, {jss::AccountRoot}}
774 params[jss::account] = becky.
human();
775 params[jss::ledger_index_min] = -1;
776 params[jss::ledger_index_max] = -1;
780 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
781 BEAST_EXPECT(result[jss::result][jss::transactions].isArray());
784 static constexpr unsigned int kBeckyDeletedOffset = 2;
787 result[jss::result][jss::transactions].size() + kBeckyDeletedOffset);
789 json::Value const& txs{result[jss::result][jss::transactions]};
791 for (
unsigned int index = kBeckyDeletedOffset; index <
std::size(kSanity); ++index)
793 checkSanity(txs[index - kBeckyDeletedOffset], kSanity[index]);
804 env(
pay(alice, becky,
XRP(45)));
808 BEAST_EXPECT(env.
closed()->exists(beckyAcctKey));
812 env(
pay(becky, alice,
XRP(20)));
818 params[jss::account] = becky.
human();
819 params[jss::ledger_index_min] = -1;
820 params[jss::ledger_index_max] = -1;
824 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
825 BEAST_EXPECT(result[jss::result][jss::transactions].isArray());
827 BEAST_EXPECT(
std::size(kSanity) == result[jss::result][jss::transactions].size());
829 json::Value const& txs{result[jss::result][jss::transactions]};
831 for (
unsigned int index = 0; index <
std::size(kSanity); ++index)
843 using namespace std::chrono_literals;
846 cfg->fees.referenceFee = 10;
847 Env env(*
this, std::move(cfg));
853 MPTTester mptAlice(env, alice, {.holders = {bob, carol}});
858 params[jss::account] = alice.
human();
859 params[jss::limit] = 100;
860 auto const jv = env.
rpc(
"json",
"account_tx",
to_string(params))[jss::result];
862 BEAST_EXPECT(jv[jss::transactions].size() == size);
863 auto const& tx0(jv[jss::transactions][0u][jss::tx]);
864 BEAST_EXPECT(tx0[jss::TransactionType] == txType);
868 BEAST_EXPECT(tx0[jss::hash] == txHash);
875 .flags = tfMPTCanClawback | tfMPTRequireAuth | tfMPTCanTransfer});
877 checkAliceAcctTx(3, jss::MPTokenIssuanceCreate);
880 mptAlice.authorize({.account = bob});
881 checkAliceAcctTx(4, jss::MPTokenAuthorize);
894 mptAlice.authorize({.account = alice, .holder = bob});
895 checkAliceAcctTx(5, jss::MPTokenAuthorize);
898 mptAlice.authorize({.account = carol});
899 checkAliceAcctTx(6, jss::MPTokenAuthorize);
902 mptAlice.authorize({.account = alice, .holder = carol});
903 checkAliceAcctTx(7, jss::MPTokenAuthorize);
906 mptAlice.pay(alice, bob, 100);
907 checkAliceAcctTx(8, jss::Payment);
910 mptAlice.pay(bob, carol, 10);
911 checkAliceAcctTx(9, jss::Payment);
926 env.
fund(
XRP(10000), alice, bob, carol);
930 env(
pay(alice, carol,
XRP(10)));
942 env(
pay(bob, carol,
XRP(30)));
945 auto const countTxs = [&](
AccountID const& account,
950 bool haveMarker =
false;
956 params[jss::account] =
toBase58(account);
957 params[jss::ledger_index_min] = -1;
958 params[jss::ledger_index_max] = -1;
960 if (!delegateParams.isNull())
961 params[jss::delegate] = delegateParams;
963 params[jss::limit] = *limit;
965 params[jss::marker] = marker;
967 auto const res = env.
rpc(
"json",
"account_tx",
to_string(params));
968 auto const& result = res[jss::result];
970 if (result.isMember(jss::transactions))
971 count += result[jss::transactions].size();
973 if (!limit || !result.isMember(jss::marker))
976 marker = result[jss::marker];
979 if (!BEAST_EXPECT(pages < 20))
986 auto const checkError = [&](
json::Value const& delegateParams,
989 params[jss::account] = alice.
human();
990 params[jss::delegate] = delegateParams;
991 auto res = env.
rpc(
"json",
"account_tx",
to_string(params));
992 BEAST_EXPECT(res[jss::result][jss::error] == errToken);
998 p[jss::delegate_filter] =
"actor";
999 BEAST_EXPECT(countTxs(alice.
id(), p) == 1);
1005 p[jss::delegate_filter] =
"actor";
1006 p[jss::counter_party] = bob.
human();
1007 BEAST_EXPECT(countTxs(alice.
id(), p) == 1);
1013 p[jss::delegate_filter] =
"actor";
1014 p[jss::counter_party] = carol.
human();
1015 BEAST_EXPECT(countTxs(alice.
id(), p) == 0);
1022 p[jss::delegate_filter] =
"authorizer";
1023 BEAST_EXPECT(countTxs(bob.
id(), p) == 1);
1029 p[jss::delegate_filter] =
"authorizer";
1030 p[jss::counter_party] = alice.
human();
1031 BEAST_EXPECT(countTxs(bob.
id(), p) == 1);
1039 p[jss::delegate_filter] =
"authorizer";
1040 BEAST_EXPECT(countTxs(alice.
id(), p) == 0);
1047 p[jss::delegate_filter] =
"authorizer";
1048 p[jss::counter_party] = carol.
human();
1049 BEAST_EXPECT(countTxs(bob.
id(), p) == 0);
1056 p[jss::delegate_filter] =
"actor";
1057 BEAST_EXPECT(countTxs(bob.
id(), p) == 0);
1063 checkError(p,
"invalidParams");
1069 checkError(p,
"invalidParams");
1075 p[jss::delegate_filter] = 123;
1076 checkError(p,
"invalidParams");
1082 p[jss::delegate_filter] =
"random_string";
1083 checkError(p,
"invalidParams");
1089 p[jss::delegate_filter] =
"actor";
1090 p[jss::counter_party] = 123;
1091 checkError(p,
"invalidParams");
1097 p[jss::delegate_filter] =
"actor";
1098 p[jss::counter_party] =
"not_an_account";
1099 checkError(p,
"actMalformed");
1107 Account const edward{
"edward"};
1108 env.
fund(
XRP(1000), daria, edward);
1110 env(
signers(alice, 2, {{daria, 1}, {edward, 1}}));
1112 env(
pay(alice, carol,
XRP(1)),
1114 Msig(daria, edward));
1120 p[jss::delegate_filter] =
"actor";
1121 BEAST_EXPECT(countTxs(alice.
id(), p) == 1);
1129 env(
pay(alice, bob,
XRP(1)));
1133 actorFilter[jss::delegate_filter] =
"actor";
1134 BEAST_EXPECT(countTxs(alice.
id(), actorFilter) == 1);
1136 BEAST_EXPECT(countTxs(alice.
id(), actorFilter, 1) == 1);
1138 actorFilter[jss::counter_party] = bob.
human();
1139 BEAST_EXPECT(countTxs(alice.
id(), actorFilter) == 1);
1140 BEAST_EXPECT(countTxs(alice.
id(), actorFilter, 1) == 1);
1143 authorizerFilter[jss::delegate_filter] =
"authorizer";
1144 BEAST_EXPECT(countTxs(bob.
id(), authorizerFilter) == 1);
1145 BEAST_EXPECT(countTxs(bob.
id(), authorizerFilter, 1) == 1);
1147 authorizerFilter[jss::counter_party] = alice.
human();
1148 BEAST_EXPECT(countTxs(bob.
id(), authorizerFilter) == 1);
1149 BEAST_EXPECT(countTxs(bob.
id(), authorizerFilter, 1) == 1);
1158 actorFilter[jss::delegate_filter] =
"actor";
1162 dp[jss::account] = alice.
human();
1163 dp[jss::ledger_index_min] = -1;
1164 dp[jss::ledger_index_max] = -1;
1165 dp[jss::delegate] = actorFilter;
1167 auto const dRes = env.
rpc(
"json",
"account_tx",
to_string(dp));
1168 BEAST_EXPECT(dRes[jss::result].isMember(jss::marker));
1169 json::Value const delegateMarker = dRes[jss::result][jss::marker];
1171 delegateMarker.
isMember(jss::delegate) && delegateMarker[jss::delegate].
asBool());
1176 p[jss::account] = alice.
human();
1177 p[jss::ledger_index_min] = -1;
1178 p[jss::ledger_index_max] = -1;
1180 p[jss::marker] = delegateMarker;
1181 auto const r = env.
rpc(
"json",
"account_tx",
to_string(p));
1182 BEAST_EXPECT(r[jss::result][jss::error] ==
"invalidParams");
1187 np[jss::account] = alice.
human();
1188 np[jss::ledger_index_min] = -1;
1189 np[jss::ledger_index_max] = -1;
1191 auto const nRes = env.
rpc(
"json",
"account_tx",
to_string(np));
1192 BEAST_EXPECT(nRes[jss::result].isMember(jss::marker));
1193 json::Value const normalMarker = nRes[jss::result][jss::marker];
1194 BEAST_EXPECT(!normalMarker.
isMember(jss::delegate));
1199 p[jss::account] = alice.
human();
1200 p[jss::ledger_index_min] = -1;
1201 p[jss::ledger_index_max] = -1;
1203 p[jss::delegate] = actorFilter;
1204 p[jss::marker] = normalMarker;
1205 auto const r = env.
rpc(
"json",
"account_tx",
to_string(p));
1206 BEAST_EXPECT(r[jss::result][jss::error] ==
"invalidParams");