370 testcase(
"unsteppedThenSteppedWithNFTs");
379 auto const usD1 = gw1[
"USD"];
380 auto const usD2 = gw2[
"USD"];
382 env.
fund(
XRP(1000), gw1, gw2, bob);
389 params[jss::account] = bob.
human();
390 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
391 BEAST_EXPECT(!resp.isMember(jss::marker));
392 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
395 params[jss::limit] = 1;
396 resp = env.
rpc(
"json",
"account_objects",
to_string(params));
397 BEAST_EXPECT(!resp.isMember(jss::marker));
398 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
410 params[jss::account] = bob.
human();
411 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
412 BEAST_EXPECT(!resp.isMember(jss::marker));
414 unpaged = resp[jss::result][jss::account_objects];
415 BEAST_EXPECT(unpaged.
size() == 1);
420 params[jss::account] = bob.
human();
421 params[jss::type] = jss::nft_page;
422 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
423 BEAST_EXPECT(!resp.isMember(jss::marker));
424 json::Value& aobjs = resp[jss::result][jss::account_objects];
425 BEAST_EXPECT(aobjs.
size() == 1);
426 BEAST_EXPECT(aobjs[0u][sfLedgerEntryType.jsonName] == jss::NFTokenPage);
427 BEAST_EXPECT(aobjs[0u][sfNFTokens.jsonName].
size() == 1);
432 params[jss::account] = bob.
human();
433 params[jss::limit] = 1;
436 json::Value& aobjs = resp[jss::result][jss::account_objects];
437 BEAST_EXPECT(aobjs.
size() == 1);
438 auto& aobj = aobjs[0U];
439 BEAST_EXPECT(!resp[jss::result].isMember(jss::limit));
440 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
442 BEAST_EXPECT(aobj == unpaged[0u]);
446 env.
trust(usD1(1000), bob);
447 env.
trust(usD2(1000), bob);
449 env(
pay(gw1, bob, usD1(1000)));
450 env(
pay(gw2, bob, usD2(1000)));
459 params[jss::account] = bob.
human();
460 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
461 BEAST_EXPECT(!resp.isMember(jss::marker));
463 unpaged = resp[jss::result][jss::account_objects];
464 BEAST_EXPECT(unpaged.
size() == 5);
469 params[jss::account] = bob.
human();
470 params[jss::type] = jss::nft_page;
471 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
472 BEAST_EXPECT(!resp.isMember(jss::marker));
473 json::Value& aobjs = resp[jss::result][jss::account_objects];
474 BEAST_EXPECT(aobjs.
size() == 1);
475 BEAST_EXPECT(aobjs[0u][sfLedgerEntryType.jsonName] == jss::NFTokenPage);
476 BEAST_EXPECT(aobjs[0u][sfNFTokens.jsonName].
size() == 1);
481 params[jss::account] = bob.
human();
482 params[jss::limit] = 1;
483 for (
int i = 0; i < 5; ++i)
486 json::Value& aobjs = resp[jss::result][jss::account_objects];
487 BEAST_EXPECT(aobjs.
size() == 1);
488 auto& aobj = aobjs[0U];
491 BEAST_EXPECT(resp[jss::result][jss::limit] == 1);
492 BEAST_EXPECT(resp[jss::result].isMember(jss::marker));
496 BEAST_EXPECT(!resp[jss::result].isMember(jss::limit));
497 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
500 BEAST_EXPECT(aobj == unpaged[i]);
502 params[jss::marker] = resp[jss::result][jss::marker];
507 for (
int i = 0; i < 32; ++i)
515 params[jss::account] = bob.
human();
516 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
517 BEAST_EXPECT(!resp.isMember(jss::marker));
519 unpaged = resp[jss::result][jss::account_objects];
520 BEAST_EXPECT(unpaged.
size() == 6);
525 params[jss::account] = bob.
human();
526 params[jss::type] = jss::nft_page;
527 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
528 BEAST_EXPECT(!resp.isMember(jss::marker));
529 json::Value const& aobjs = resp[jss::result][jss::account_objects];
530 BEAST_EXPECT(aobjs.
size() == 2);
535 params[jss::account] = bob.
human();
536 params[jss::limit] = 1;
537 for (
int i = 0; i < 6; ++i)
540 json::Value& aobjs = resp[jss::result][jss::account_objects];
541 BEAST_EXPECT(aobjs.
size() == 1);
542 auto& aobj = aobjs[0U];
545 BEAST_EXPECT(resp[jss::result][jss::limit] == 1);
546 BEAST_EXPECT(resp[jss::result].isMember(jss::marker));
550 BEAST_EXPECT(!resp[jss::result].isMember(jss::limit));
551 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
554 BEAST_EXPECT(aobj == unpaged[i]);
556 params[jss::marker] = resp[jss::result][jss::marker];
572 auto const usd = gw[
"USD"];
574 auto const features =
576 Env env(*
this, features);
579 auto acctObjs = [&env](
587 params[jss::type] = *type;
589 params[jss::limit] = *limit;
591 params[jss::marker] = *marker;
592 params[jss::ledger_index] =
"validated";
593 return env.
rpc(
"json",
"account_objects",
to_string(params));
597 auto acctObjsIsSize = [](
json::Value const& resp,
unsigned size) {
598 return resp[jss::result][jss::account_objects].
isArray() &&
599 (resp[jss::result][jss::account_objects].
size() == size);
603 auto acctObjsTypeIsInvalid = [](
json::Value const& resp) {
604 return resp[jss::result].
isMember(jss::error) &&
605 resp[jss::result][jss::error_message] ==
"Invalid field \'type\'.";
608 env.
fund(
XRP(10000), gw, alice);
613 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::account), 0));
614 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::check), 0));
615 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::deposit_preauth), 0));
616 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::escrow), 0));
617 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::nft_page), 0));
618 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::offer), 0));
619 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::payment_channel), 0));
620 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::signer_list), 0));
621 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::state), 0));
622 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::ticket), 0));
623 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::amm), 0));
624 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::did), 0));
625 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::permissioned_domain), 0));
626 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::sponsorship), 0));
629 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::amendments)));
630 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::directory)));
631 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::fee)));
632 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::hashes)));
633 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::NegativeUNL)));
641 json::Value const resp = acctObjs(gw, jss::nft_page);
642 BEAST_EXPECT(acctObjsIsSize(resp, 1));
644 auto const& nftPage = resp[jss::result][jss::account_objects][0u];
645 BEAST_EXPECT(nftPage[sfNFTokens.jsonName].size() == 1);
647 nftPage[sfNFTokens.jsonName][0u][sfNFToken.jsonName][sfNFTokenID.jsonName] ==
652 env.
trust(usd(1000), alice);
654 env(
pay(gw, alice, usd(5)));
659 BEAST_EXPECT(acctObjsIsSize(resp, 1));
661 auto const& state = resp[jss::result][jss::account_objects][0u];
662 BEAST_EXPECT(state[sfBalance.jsonName][jss::value].asInt() == -5);
663 BEAST_EXPECT(state[sfHighLimit.jsonName][jss::value].asUInt() == 1000);
671 BEAST_EXPECT(acctObjsIsSize(resp, 1));
673 auto const&
check = resp[jss::result][jss::account_objects][0u];
674 BEAST_EXPECT(
check[sfAccount.jsonName] == gw.
human());
675 BEAST_EXPECT(
check[sfDestination.jsonName] == alice.
human());
676 BEAST_EXPECT(
check[sfSendMax.jsonName][jss::value].asUInt() == 10);
683 json::Value const resp = acctObjs(gw, jss::deposit_preauth);
684 BEAST_EXPECT(acctObjsIsSize(resp, 1));
686 auto const& preauth = resp[jss::result][jss::account_objects][0u];
687 BEAST_EXPECT(preauth[sfAccount.jsonName] == gw.
human());
688 BEAST_EXPECT(preauth[sfAuthorize.jsonName] == alice.
human());
693 jvEscrow[jss::TransactionType] = jss::EscrowCreate;
694 jvEscrow[jss::Account] = gw.
human();
695 jvEscrow[jss::Destination] = gw.
human();
703 json::Value const resp = acctObjs(gw, jss::escrow);
704 BEAST_EXPECT(acctObjsIsSize(resp, 1));
706 auto const&
escrow = resp[jss::result][jss::account_objects][0u];
707 BEAST_EXPECT(
escrow[sfAccount.jsonName] == gw.
human());
708 BEAST_EXPECT(
escrow[sfDestination.jsonName] == gw.
human());
709 BEAST_EXPECT(
escrow[sfAmount.jsonName].asUInt() == 100'000'000);
714 Account const issuer(
"issuer");
718 env(
pdomain::setTx(gw, {{.issuer = issuer, .credType = credentialType1}}));
722 json::Value const resp = acctObjs(gw, jss::permissioned_domain);
723 BEAST_EXPECT(acctObjsIsSize(resp, 1));
725 auto const& permissionedDomain = resp[jss::result][jss::account_objects][0u];
727 permissionedDomain.isMember(jss::Owner) &&
728 (permissionedDomain[jss::Owner] == gw.
human()));
729 bool const check1 = BEAST_EXPECT(
730 permissionedDomain.isMember(jss::AcceptedCredentials) &&
731 permissionedDomain[jss::AcceptedCredentials].isArray() &&
732 (permissionedDomain[jss::AcceptedCredentials].size() == 1) &&
733 (permissionedDomain[jss::AcceptedCredentials][0u].isMember(jss::Credential)));
737 auto const& credential =
738 permissionedDomain[jss::AcceptedCredentials][0u][jss::Credential];
740 credential.isMember(sfIssuer.jsonName) &&
741 (credential[sfIssuer.jsonName] == issuer.
human()));
743 credential.isMember(sfCredentialType.jsonName) &&
744 (credential[sfCredentialType.jsonName] ==
strHex(credentialType1)));
754 auto scEnvAcctObjs = [&](
Account const& acct,
char const* type) {
756 params[jss::account] = acct.
human();
757 params[jss::type] = type;
758 params[jss::ledger_index] =
"validated";
759 return scEnv.
rpc(
"json",
"account_objects",
to_string(params));
764 BEAST_EXPECT(acctObjsIsSize(resp, 1));
765 auto const& acctBridge = resp[jss::result][jss::account_objects][0u];
767 BEAST_EXPECT(acctBridge[sfLedgerEntryType.getJsonName()] ==
"Bridge");
768 BEAST_EXPECT(acctBridge[sfXChainClaimID.getJsonName()].asUInt() == 0);
769 BEAST_EXPECT(acctBridge[sfXChainAccountClaimCount.getJsonName()].asUInt() == 0);
770 BEAST_EXPECT(acctBridge[sfXChainAccountCreateCount.getJsonName()].asUInt() == 0);
771 BEAST_EXPECT(acctBridge[sfMinAccountCreateAmount.getJsonName()].asUInt() == 20000000);
772 BEAST_EXPECT(acctBridge[sfSignatureReward.getJsonName()].asUInt() == 1000000);
773 BEAST_EXPECT(acctBridge[sfXChainBridge.getJsonName()] == x.
jvb);
787 auto scEnvAcctObjs = [&](
Account const& acct,
char const* type) {
789 params[jss::account] = acct.
human();
790 params[jss::type] = type;
791 params[jss::ledger_index] =
"validated";
792 return scEnv.
rpc(
"json",
"account_objects",
to_string(params));
798 BEAST_EXPECT(acctObjsIsSize(resp, 1));
800 auto const& xchainSeq = resp[jss::result][jss::account_objects][0u];
801 BEAST_EXPECT(xchainSeq[sfAccount.jsonName] == x.
scAlice.
human());
802 BEAST_EXPECT(xchainSeq[sfXChainClaimID.getJsonName()].asUInt() == 1);
806 json::Value const resp = scEnvAcctObjs(x.
scBob, jss::xchain_owned_claim_id);
807 BEAST_EXPECT(acctObjsIsSize(resp, 1));
809 auto const& xchainSeq = resp[jss::result][jss::account_objects][0u];
810 BEAST_EXPECT(xchainSeq[sfAccount.jsonName] == x.
scBob.
human());
811 BEAST_EXPECT(xchainSeq[sfXChainClaimID.getJsonName()].asUInt() == 2);
818 auto const amt =
XRP(1000);
838 auto scEnvAcctObjs = [&](
Account const& acct,
char const* type) {
840 params[jss::account] = acct.
human();
841 params[jss::type] = type;
842 params[jss::ledger_index] =
"validated";
843 return scEnv.
rpc(
"json",
"account_objects",
to_string(params));
850 BEAST_EXPECT(acctObjsIsSize(resp, 1));
852 auto const& xchainCreateAccountClaimId =
853 resp[jss::result][jss::account_objects][0u];
855 xchainCreateAccountClaimId[sfAccount.jsonName] ==
Account::kMaster.human());
857 xchainCreateAccountClaimId[sfXChainAccountCreateCount.getJsonName()].asUInt() ==
868 BEAST_EXPECT(acctObjsIsSize(resp, 1));
870 auto const&
offer = resp[jss::result][jss::account_objects][0u];
871 BEAST_EXPECT(
offer[sfAccount.jsonName] == gw.
human());
872 BEAST_EXPECT(
offer[sfTakerGets.jsonName].asUInt() == 14'000'000);
873 BEAST_EXPECT(
offer[sfTakerPays.jsonName][jss::value].asUInt() == 7);
879 jvPayChan[jss::TransactionType] = jss::PaymentChannelCreate;
880 jvPayChan[jss::Account] = gw.
human();
881 jvPayChan[jss::Destination] = alice.
human();
883 jvPayChan[sfSettleDelay.jsonName] = 24 * 60 * 60;
890 json::Value const resp = acctObjs(gw, jss::payment_channel);
891 BEAST_EXPECT(acctObjsIsSize(resp, 1));
893 auto const& payChan = resp[jss::result][jss::account_objects][0u];
894 BEAST_EXPECT(payChan[sfAccount.jsonName] == gw.
human());
895 BEAST_EXPECT(payChan[sfAmount.jsonName].asUInt() == 300'000'000);
896 BEAST_EXPECT(payChan[sfSettleDelay.jsonName].asUInt() == 24 * 60 * 60);
902 jvDID[jss::TransactionType] = jss::DIDSet;
903 jvDID[jss::Account] = gw.
human();
911 BEAST_EXPECT(acctObjsIsSize(resp, 1));
913 auto const&
did = resp[jss::result][jss::account_objects][0u];
914 BEAST_EXPECT(
did[sfAccount.jsonName] == gw.
human());
922 json::Value const resp = acctObjs(gw, jss::signer_list);
923 BEAST_EXPECT(acctObjsIsSize(resp, 1));
925 auto const& signerList = resp[jss::result][jss::account_objects][0u];
926 BEAST_EXPECT(signerList[sfSignerQuorum.jsonName] == 6);
927 auto const& entry = signerList[sfSignerEntries.jsonName][0u][sfSignerEntry.jsonName];
928 BEAST_EXPECT(entry[sfAccount.jsonName] == alice.
human());
929 BEAST_EXPECT(entry[sfSignerWeight.jsonName].
asUInt() == 7);
933 auto const seq = env.
seq(gw);
939 json::Value const resp = acctObjs(gw, jss::ticket);
940 BEAST_EXPECT(acctObjsIsSize(resp, 1));
942 auto const&
ticket = resp[jss::result][jss::account_objects][0u];
943 BEAST_EXPECT(
ticket[sfAccount.jsonName] == gw.
human());
944 BEAST_EXPECT(
ticket[sfLedgerEntryType.jsonName] == jss::Ticket);
945 BEAST_EXPECT(
ticket[sfTicketSequence.jsonName].asUInt() == seq + 1);
955 for (
auto const& acct : {alice, gw})
957 json::Value const resp = acctObjs(acct, jss::sponsorship);
958 BEAST_EXPECT(acctObjsIsSize(resp, 1));
960 auto const& sponsorship = resp[jss::result][jss::account_objects][0u];
962 BEAST_EXPECT(sponsorship[sfOwner.jsonName] == alice.
human());
963 BEAST_EXPECT(sponsorship[sfSponsee.jsonName] == gw.
human());
965 sponsorship[sfFlags.jsonName].asUInt() == tfSponsorshipSetRequireSignForFee);
966 BEAST_EXPECT(sponsorship[sfRemainingOwnerCount.jsonName].asUInt() == 200);
967 BEAST_EXPECT(sponsorship[sfFeeAmount.jsonName].asUInt() == 100000000);
968 BEAST_EXPECT(sponsorship[sfMaxFee.jsonName].asUInt() == 10);
975 params[jss::account] = gw.
human();
976 params[jss::deletion_blockers_only] =
true;
977 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
983 jss::NFTokenPage.cStr(),
984 jss::RippleState.cStr(),
985 jss::PayChannel.cStr(),
986 jss::PermissionedDomain.cStr(),
987 jss::Sponsorship.cStr()};
995 if (BEAST_EXPECT(acctObjsIsSize(resp, expectedAccountObjects)))
997 auto const& aobjs = resp[jss::result][jss::account_objects];
999 gotLedgerTypes.
reserve(expectedAccountObjects);
1002 gotLedgerTypes.
push_back(aobjs[i][
"LedgerEntryType"].asString());
1005 BEAST_EXPECT(gotLedgerTypes == expectedLedgerTypes);
1012 params[jss::account] = gw.
human();
1013 params[jss::deletion_blockers_only] =
true;
1014 params[jss::type] = jss::escrow;
1015 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1017 if (BEAST_EXPECT(acctObjsIsSize(resp, 1u)))
1019 auto const& aobjs = resp[jss::result][jss::account_objects];
1020 BEAST_EXPECT(aobjs[0u][
"LedgerEntryType"] == jss::Escrow);
1026 auto const objs = resp[jss::result][jss::account_objects];
1027 for (
auto const& obj : resp[jss::result][jss::account_objects])
1028 typesOut.push_back(obj[sfLedgerEntryType.fieldName].asString());
1035 if (!acctObjsIsSize(resp, types.
size()))
1038 getTypes(resp, typesOut);
1039 return types == typesOut;
1042 AMM amm(env, gw,
XRP(1'000), usd(1'000));
1043 amm.deposit(alice, usd(1));
1046 BEAST_EXPECT(lines[jss::lines].size() == 3);
1048 BEAST_EXPECT(acctObjsIsSize(acctObjs(
amm.ammAccount(), jss::amm), 1));
1050 auto resp = acctObjs(
amm.ammAccount(), std::nullopt, 2);
1052 getTypes(resp, typesOut);
1055 amm.ammAccount(), std::nullopt, 10, resp[jss::result][jss::marker].
asString());
1056 getTypes(resp, typesOut);
1061 jss::RippleState.cStr(),
1062 jss::RippleState.cStr(),
1063 jss::RippleState.cStr()}));
1065 resp = acctObjs(
amm.ammAccount(), jss::state, 10);
1066 BEAST_EXPECT(expectObjects(
1067 resp, {jss::RippleState.cStr(), jss::RippleState.cStr(), jss::RippleState.cStr()}));
1069 BEAST_EXPECT(acctObjsIsSize(acctObjs(
amm.ammAccount(), jss::offer), 0));
1071 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::amm), 0));
1075 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::amendments)));
1076 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::directory)));
1077 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::fee)));
1078 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::hashes)));
1079 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::NegativeUNL)));
1083 for (
int d = 1'000'032; d >= 1'000'000; --d)
1090 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::account), 0));
1238 using namespace jtx;
1244 env.
fund(
XRP(10000), alice, bob, carol);
1246 unsigned const accountObjectSize = 30;
1247 for (
unsigned i = 0; i < accountObjectSize; i++)
1250 for (
unsigned i = 0; i < 10; i++)
1255 unsigned const limit = 11;
1261 params[jss::account] = bob.
human();
1262 params[jss::limit] = limit;
1263 params[jss::ledger_index] =
"validated";
1264 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1265 auto& accountObjects = resp[jss::result][jss::account_objects];
1266 marker = resp[jss::result][jss::marker];
1267 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1268 BEAST_EXPECT(accountObjects.size() == limit);
1274 params[jss::account] = bob.
human();
1275 params[jss::limit] = limit;
1276 params[jss::marker] = marker;
1277 params[jss::ledger_index] =
"validated";
1278 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1279 auto& accountObjects = resp[jss::result][jss::account_objects];
1280 marker = resp[jss::result][jss::marker];
1281 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1282 BEAST_EXPECT(accountObjects.size() == limit);
1286 auto testInvalidMarker = [&](
std::string& marker) {
1288 params[jss::account] = bob.
human();
1289 params[jss::limit] = limit;
1290 params[jss::ledger_index] = jss::validated;
1291 params[jss::marker] = marker;
1293 return resp[jss::result][jss::error_message] ==
"Invalid field \'marker\'.";
1296 auto const markerStr = marker.
asString();
1297 auto const& idx = markerStr.
find(
',');
1298 auto const dirIndex = markerStr.substr(0, idx);
1299 auto const entryIndex = markerStr.substr(idx + 1);
1304 BEAST_EXPECT(testInvalidMarker(s));
1311 BEAST_EXPECT(testInvalidMarker(s));
1319 BEAST_EXPECT(testInvalidMarker(s));
1327 s = dirIndex +
',' + s;
1328 BEAST_EXPECT(testInvalidMarker(s));
1335 BEAST_EXPECT(testInvalidMarker(s));
1344 params[jss::account] = bob.
human();
1345 params[jss::limit] = limit;
1346 params[jss::marker] = s;
1347 params[jss::ledger_index] =
"validated";
1348 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1349 auto& accountObjects = resp[jss::result][jss::account_objects];
1350 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1351 BEAST_EXPECT(accountObjects.size() == limit);
1358 BEAST_EXPECT(testInvalidMarker(s));
1365 BEAST_EXPECT(testInvalidMarker(s));
1372 params[jss::account] = bob.
human();
1373 params[jss::limit] = limit;
1374 params[jss::marker] = marker;
1375 params[jss::ledger_index] =
"validated";
1376 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1377 auto& accountObjects = resp[jss::result][jss::account_objects];
1378 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1379 BEAST_EXPECT(accountObjects.size() == accountObjectSize - (limit * 2));
1380 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
1387 params[jss::account] = carol.
human();
1388 params[jss::limit] = 10;
1389 params[jss::marker] =
"0," + entryIndex;
1390 params[jss::ledger_index] =
"validated";
1391 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1392 auto& accountObjects = resp[jss::result][jss::account_objects];
1393 BEAST_EXPECT(accountObjects.size() == 0);
1401 using namespace jtx;
1406 Account const sponsor1(
"sponsor1");
1408 auto const usd = gw[
"USD"];
1410 env.
fund(
XRP(10000), alice, bob, sponsor1, gw);
1414 auto acctObjsSponsored = [](
Env& testEnv,
1420 params[jss::sponsored] = sponsored;
1422 params[jss::type] = *type;
1423 params[jss::ledger_index] =
"validated";
1424 return testEnv.
rpc(
"json",
"account_objects",
to_string(params));
1428 env(
trust(bob, usd(1000)));
1433 auto const resp = acctObjsSponsored(env, bob.
id(),
true);
1434 auto const& objs = resp[jss::result][jss::account_objects];
1435 BEAST_EXPECT(objs.size() == 0);
1440 if (!BEAST_EXPECT(env.
le(trustId)))
1445 Sig(sfSponsorSignature, sponsor1));
1450 auto const sle = env.
le(trustId);
1451 if (!BEAST_EXPECT(sle))
1453 BEAST_EXPECT(sle->isFieldPresent(sfHighSponsor) || sle->isFieldPresent(sfLowSponsor));
1458 auto const resp = acctObjsSponsored(env, bob.
id(),
true);
1459 auto const& objs = resp[jss::result][jss::account_objects];
1460 if (!BEAST_EXPECT(objs.size() == 1))
1463 auto const& obj = objs[0u];
1464 BEAST_EXPECT(obj[sfLedgerEntryType.jsonName] == jss::RippleState);
1466 obj.isMember(sfHighSponsor.jsonName) || obj.isMember(sfLowSponsor.jsonName));
1471 auto const resp = acctObjsSponsored(env, bob.
id(),
false);
1472 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
1479 Account const issuer(
"issuer");
1482 auto const usd = issuer[
"USD"];
1487 env(
trust(issuer, user[
"USD"](100)));
1490 env(
trust(user, usd(100)));
1494 if (!BEAST_EXPECT(env.
le(trustId)))
1502 auto const line = env.
le(trustId);
1503 if (!BEAST_EXPECT(line))
1506 auto const userIsHigh = line->getFieldAmount(sfHighLimit).getIssuer() == user.
id();
1507 auto const& userSponsorField = userIsHigh ? sfHighSponsor : sfLowSponsor;
1508 auto const& issuerSponsorField = userIsHigh ? sfLowSponsor : sfHighSponsor;
1510 BEAST_EXPECT(line->isFieldPresent(userSponsorField));
1511 BEAST_EXPECT(!line->isFieldPresent(issuerSponsorField));
1514 auto const resp = acctObjsSponsored(env, user.
id(),
true, jss::state);
1515 auto const& objs = resp[jss::result][jss::account_objects];
1516 if (BEAST_EXPECT(objs.size() == 1))
1517 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::RippleState);
1520 auto const resp = acctObjsSponsored(env, user.
id(),
false, jss::state);
1521 auto const& objs = resp[jss::result][jss::account_objects];
1522 BEAST_EXPECT(objs.size() == 0);
1525 auto const resp = acctObjsSponsored(env, issuer.
id(),
true, jss::state);
1526 auto const& objs = resp[jss::result][jss::account_objects];
1527 if (BEAST_EXPECT(objs.size() == 1))
1528 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::RippleState);
1531 auto const resp = acctObjsSponsored(env, issuer.
id(),
false, jss::state);
1532 auto const& objs = resp[jss::result][jss::account_objects];
1533 BEAST_EXPECT(objs.size() == 0);
1548 auto const checkSeq = env.
seq(owner);
1553 if (!BEAST_EXPECT(env.
le(checkId)))
1562 auto const sle = env.
le(checkId);
1563 if (!BEAST_EXPECT(sle))
1565 BEAST_EXPECT(sle->isFieldPresent(sfSponsor));
1568 for (
auto const& acct : {owner.
id(), dest.
id()})
1571 auto const resp = acctObjsSponsored(env, acct,
true, jss::check);
1572 auto const& objs = resp[jss::result][jss::account_objects];
1573 if (BEAST_EXPECT(objs.size() == 1))
1574 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::Check);
1577 auto const resp = acctObjsSponsored(env, acct,
false, jss::check);
1578 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
1587 Account const sponsee(
"sponsee");
1589 env.
fund(
XRP(10000), owner, sponsee);
1596 if (!BEAST_EXPECT(env.
le(sponsorshipKeylet)))
1600 auto const resp = acctObjsSponsored(env, owner.
id(),
false, jss::sponsorship);
1601 auto const& objs = resp[jss::result][jss::account_objects];
1602 if (BEAST_EXPECT(objs.size() == 1))
1603 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::Sponsorship);
1606 auto const resp = acctObjsSponsored(env, sponsee.
id(),
false, jss::sponsorship);
1607 auto const& objs = resp[jss::result][jss::account_objects];
1608 if (BEAST_EXPECT(objs.size() == 1))
1609 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::Sponsorship);
1612 auto const resp = acctObjsSponsored(env, owner.
id(),
true, jss::sponsorship);
1613 auto const& objs = resp[jss::result][jss::account_objects];
1614 BEAST_EXPECT(objs.size() == 0);
1617 auto const resp = acctObjsSponsored(env, sponsee.
id(),
true, jss::sponsorship);
1618 auto const& objs = resp[jss::result][jss::account_objects];
1619 BEAST_EXPECT(objs.size() == 0);