368 testcase(
"unsteppedThenSteppedWithNFTs");
377 auto const usD1 = gw1[
"USD"];
378 auto const usD2 = gw2[
"USD"];
380 env.
fund(
XRP(1000), gw1, gw2, bob);
387 params[jss::account] = bob.
human();
388 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
389 BEAST_EXPECT(!resp.isMember(jss::marker));
390 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
393 params[jss::limit] = 1;
394 resp = env.
rpc(
"json",
"account_objects",
to_string(params));
395 BEAST_EXPECT(!resp.isMember(jss::marker));
396 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
408 params[jss::account] = bob.
human();
409 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
410 BEAST_EXPECT(!resp.isMember(jss::marker));
412 unpaged = resp[jss::result][jss::account_objects];
413 BEAST_EXPECT(unpaged.
size() == 1);
418 params[jss::account] = bob.
human();
419 params[jss::type] = jss::nft_page;
420 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
421 BEAST_EXPECT(!resp.isMember(jss::marker));
422 json::Value& aobjs = resp[jss::result][jss::account_objects];
423 BEAST_EXPECT(aobjs.
size() == 1);
424 BEAST_EXPECT(aobjs[0u][sfLedgerEntryType.jsonName] == jss::NFTokenPage);
425 BEAST_EXPECT(aobjs[0u][sfNFTokens.jsonName].
size() == 1);
430 params[jss::account] = bob.
human();
431 params[jss::limit] = 1;
434 json::Value& aobjs = resp[jss::result][jss::account_objects];
435 BEAST_EXPECT(aobjs.
size() == 1);
436 auto& aobj = aobjs[0U];
437 BEAST_EXPECT(!resp[jss::result].isMember(jss::limit));
438 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
440 BEAST_EXPECT(aobj == unpaged[0u]);
444 env.
trust(usD1(1000), bob);
445 env.
trust(usD2(1000), bob);
447 env(
pay(gw1, bob, usD1(1000)));
448 env(
pay(gw2, bob, usD2(1000)));
457 params[jss::account] = bob.
human();
458 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
459 BEAST_EXPECT(!resp.isMember(jss::marker));
461 unpaged = resp[jss::result][jss::account_objects];
462 BEAST_EXPECT(unpaged.
size() == 5);
467 params[jss::account] = bob.
human();
468 params[jss::type] = jss::nft_page;
469 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
470 BEAST_EXPECT(!resp.isMember(jss::marker));
471 json::Value& aobjs = resp[jss::result][jss::account_objects];
472 BEAST_EXPECT(aobjs.
size() == 1);
473 BEAST_EXPECT(aobjs[0u][sfLedgerEntryType.jsonName] == jss::NFTokenPage);
474 BEAST_EXPECT(aobjs[0u][sfNFTokens.jsonName].
size() == 1);
479 params[jss::account] = bob.
human();
480 params[jss::limit] = 1;
481 for (
int i = 0; i < 5; ++i)
484 json::Value& aobjs = resp[jss::result][jss::account_objects];
485 BEAST_EXPECT(aobjs.
size() == 1);
486 auto& aobj = aobjs[0U];
489 BEAST_EXPECT(resp[jss::result][jss::limit] == 1);
490 BEAST_EXPECT(resp[jss::result].isMember(jss::marker));
494 BEAST_EXPECT(!resp[jss::result].isMember(jss::limit));
495 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
498 BEAST_EXPECT(aobj == unpaged[i]);
500 params[jss::marker] = resp[jss::result][jss::marker];
505 for (
int i = 0; i < 32; ++i)
513 params[jss::account] = bob.
human();
514 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
515 BEAST_EXPECT(!resp.isMember(jss::marker));
517 unpaged = resp[jss::result][jss::account_objects];
518 BEAST_EXPECT(unpaged.
size() == 6);
523 params[jss::account] = bob.
human();
524 params[jss::type] = jss::nft_page;
525 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
526 BEAST_EXPECT(!resp.isMember(jss::marker));
527 json::Value const& aobjs = resp[jss::result][jss::account_objects];
528 BEAST_EXPECT(aobjs.
size() == 2);
533 params[jss::account] = bob.
human();
534 params[jss::limit] = 1;
535 for (
int i = 0; i < 6; ++i)
538 json::Value& aobjs = resp[jss::result][jss::account_objects];
539 BEAST_EXPECT(aobjs.
size() == 1);
540 auto& aobj = aobjs[0U];
543 BEAST_EXPECT(resp[jss::result][jss::limit] == 1);
544 BEAST_EXPECT(resp[jss::result].isMember(jss::marker));
548 BEAST_EXPECT(!resp[jss::result].isMember(jss::limit));
549 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
552 BEAST_EXPECT(aobj == unpaged[i]);
554 params[jss::marker] = resp[jss::result][jss::marker];
570 auto const usd = gw[
"USD"];
572 auto const features =
574 Env env(*
this, features);
577 auto acctObjs = [&env](
585 params[jss::type] = *type;
587 params[jss::limit] = *limit;
589 params[jss::marker] = *marker;
590 params[jss::ledger_index] =
"validated";
591 return env.
rpc(
"json",
"account_objects",
to_string(params));
595 auto acctObjsIsSize = [](
json::Value const& resp,
unsigned size) {
596 return resp[jss::result][jss::account_objects].
isArray() &&
597 (resp[jss::result][jss::account_objects].
size() == size);
601 auto acctObjsTypeIsInvalid = [](
json::Value const& resp) {
602 return resp[jss::result].
isMember(jss::error) &&
603 resp[jss::result][jss::error_message] ==
"Invalid field \'type\'.";
606 env.
fund(
XRP(10000), gw, alice);
611 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::account), 0));
612 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::check), 0));
613 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::deposit_preauth), 0));
614 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::escrow), 0));
615 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::nft_page), 0));
616 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::offer), 0));
617 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::payment_channel), 0));
618 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::signer_list), 0));
619 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::state), 0));
620 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::ticket), 0));
621 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::amm), 0));
622 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::did), 0));
623 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::permissioned_domain), 0));
624 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::sponsorship), 0));
627 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::amendments)));
628 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::directory)));
629 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::fee)));
630 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::hashes)));
631 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::NegativeUNL)));
639 json::Value const resp = acctObjs(gw, jss::nft_page);
640 BEAST_EXPECT(acctObjsIsSize(resp, 1));
642 auto const& nftPage = resp[jss::result][jss::account_objects][0u];
643 BEAST_EXPECT(nftPage[sfNFTokens.jsonName].size() == 1);
645 nftPage[sfNFTokens.jsonName][0u][sfNFToken.jsonName][sfNFTokenID.jsonName] ==
650 env.
trust(usd(1000), alice);
652 env(
pay(gw, alice, usd(5)));
657 BEAST_EXPECT(acctObjsIsSize(resp, 1));
659 auto const& state = resp[jss::result][jss::account_objects][0u];
660 BEAST_EXPECT(state[sfBalance.jsonName][jss::value].asInt() == -5);
661 BEAST_EXPECT(state[sfHighLimit.jsonName][jss::value].asUInt() == 1000);
669 BEAST_EXPECT(acctObjsIsSize(resp, 1));
671 auto const&
check = resp[jss::result][jss::account_objects][0u];
672 BEAST_EXPECT(
check[sfAccount.jsonName] == gw.
human());
673 BEAST_EXPECT(
check[sfDestination.jsonName] == alice.
human());
674 BEAST_EXPECT(
check[sfSendMax.jsonName][jss::value].asUInt() == 10);
681 json::Value const resp = acctObjs(gw, jss::deposit_preauth);
682 BEAST_EXPECT(acctObjsIsSize(resp, 1));
684 auto const& preauth = resp[jss::result][jss::account_objects][0u];
685 BEAST_EXPECT(preauth[sfAccount.jsonName] == gw.
human());
686 BEAST_EXPECT(preauth[sfAuthorize.jsonName] == alice.
human());
691 jvEscrow[jss::TransactionType] = jss::EscrowCreate;
692 jvEscrow[jss::Account] = gw.
human();
693 jvEscrow[jss::Destination] = gw.
human();
701 json::Value const resp = acctObjs(gw, jss::escrow);
702 BEAST_EXPECT(acctObjsIsSize(resp, 1));
704 auto const&
escrow = resp[jss::result][jss::account_objects][0u];
705 BEAST_EXPECT(
escrow[sfAccount.jsonName] == gw.
human());
706 BEAST_EXPECT(
escrow[sfDestination.jsonName] == gw.
human());
707 BEAST_EXPECT(
escrow[sfAmount.jsonName].asUInt() == 100'000'000);
712 Account const issuer(
"issuer");
716 env(
pdomain::setTx(gw, {{.issuer = issuer, .credType = credentialType1}}));
720 json::Value const resp = acctObjs(gw, jss::permissioned_domain);
721 BEAST_EXPECT(acctObjsIsSize(resp, 1));
723 auto const& permissionedDomain = resp[jss::result][jss::account_objects][0u];
725 permissionedDomain.isMember(jss::Owner) &&
726 (permissionedDomain[jss::Owner] == gw.
human()));
727 bool const check1 = BEAST_EXPECT(
728 permissionedDomain.isMember(jss::AcceptedCredentials) &&
729 permissionedDomain[jss::AcceptedCredentials].isArray() &&
730 (permissionedDomain[jss::AcceptedCredentials].size() == 1) &&
731 (permissionedDomain[jss::AcceptedCredentials][0u].isMember(jss::Credential)));
735 auto const& credential =
736 permissionedDomain[jss::AcceptedCredentials][0u][jss::Credential];
738 credential.isMember(sfIssuer.jsonName) &&
739 (credential[sfIssuer.jsonName] == issuer.
human()));
741 credential.isMember(sfCredentialType.jsonName) &&
742 (credential[sfCredentialType.jsonName] ==
strHex(credentialType1)));
752 auto scEnvAcctObjs = [&](
Account const& acct,
char const* type) {
754 params[jss::account] = acct.
human();
755 params[jss::type] = type;
756 params[jss::ledger_index] =
"validated";
757 return scEnv.
rpc(
"json",
"account_objects",
to_string(params));
762 BEAST_EXPECT(acctObjsIsSize(resp, 1));
763 auto const& acctBridge = resp[jss::result][jss::account_objects][0u];
765 BEAST_EXPECT(acctBridge[sfLedgerEntryType.getJsonName()] ==
"Bridge");
766 BEAST_EXPECT(acctBridge[sfXChainClaimID.getJsonName()].asUInt() == 0);
767 BEAST_EXPECT(acctBridge[sfXChainAccountClaimCount.getJsonName()].asUInt() == 0);
768 BEAST_EXPECT(acctBridge[sfXChainAccountCreateCount.getJsonName()].asUInt() == 0);
769 BEAST_EXPECT(acctBridge[sfMinAccountCreateAmount.getJsonName()].asUInt() == 20000000);
770 BEAST_EXPECT(acctBridge[sfSignatureReward.getJsonName()].asUInt() == 1000000);
771 BEAST_EXPECT(acctBridge[sfXChainBridge.getJsonName()] == x.
jvb);
785 auto scEnvAcctObjs = [&](
Account const& acct,
char const* type) {
787 params[jss::account] = acct.
human();
788 params[jss::type] = type;
789 params[jss::ledger_index] =
"validated";
790 return scEnv.
rpc(
"json",
"account_objects",
to_string(params));
796 BEAST_EXPECT(acctObjsIsSize(resp, 1));
798 auto const& xchainSeq = resp[jss::result][jss::account_objects][0u];
799 BEAST_EXPECT(xchainSeq[sfAccount.jsonName] == x.
scAlice.
human());
800 BEAST_EXPECT(xchainSeq[sfXChainClaimID.getJsonName()].asUInt() == 1);
804 json::Value const resp = scEnvAcctObjs(x.
scBob, jss::xchain_owned_claim_id);
805 BEAST_EXPECT(acctObjsIsSize(resp, 1));
807 auto const& xchainSeq = resp[jss::result][jss::account_objects][0u];
808 BEAST_EXPECT(xchainSeq[sfAccount.jsonName] == x.
scBob.
human());
809 BEAST_EXPECT(xchainSeq[sfXChainClaimID.getJsonName()].asUInt() == 2);
816 auto const amt =
XRP(1000);
836 auto scEnvAcctObjs = [&](
Account const& acct,
char const* type) {
838 params[jss::account] = acct.
human();
839 params[jss::type] = type;
840 params[jss::ledger_index] =
"validated";
841 return scEnv.
rpc(
"json",
"account_objects",
to_string(params));
848 BEAST_EXPECT(acctObjsIsSize(resp, 1));
850 auto const& xchainCreateAccountClaimId =
851 resp[jss::result][jss::account_objects][0u];
853 xchainCreateAccountClaimId[sfAccount.jsonName] ==
Account::kMaster.human());
855 xchainCreateAccountClaimId[sfXChainAccountCreateCount.getJsonName()].asUInt() ==
866 BEAST_EXPECT(acctObjsIsSize(resp, 1));
868 auto const&
offer = resp[jss::result][jss::account_objects][0u];
869 BEAST_EXPECT(
offer[sfAccount.jsonName] == gw.
human());
870 BEAST_EXPECT(
offer[sfTakerGets.jsonName].asUInt() == 14'000'000);
871 BEAST_EXPECT(
offer[sfTakerPays.jsonName][jss::value].asUInt() == 7);
877 jvPayChan[jss::TransactionType] = jss::PaymentChannelCreate;
878 jvPayChan[jss::Account] = gw.
human();
879 jvPayChan[jss::Destination] = alice.
human();
881 jvPayChan[sfSettleDelay.jsonName] = 24 * 60 * 60;
888 json::Value const resp = acctObjs(gw, jss::payment_channel);
889 BEAST_EXPECT(acctObjsIsSize(resp, 1));
891 auto const& payChan = resp[jss::result][jss::account_objects][0u];
892 BEAST_EXPECT(payChan[sfAccount.jsonName] == gw.
human());
893 BEAST_EXPECT(payChan[sfAmount.jsonName].asUInt() == 300'000'000);
894 BEAST_EXPECT(payChan[sfSettleDelay.jsonName].asUInt() == 24 * 60 * 60);
900 jvDID[jss::TransactionType] = jss::DIDSet;
901 jvDID[jss::Account] = gw.
human();
909 BEAST_EXPECT(acctObjsIsSize(resp, 1));
911 auto const&
did = resp[jss::result][jss::account_objects][0u];
912 BEAST_EXPECT(
did[sfAccount.jsonName] == gw.
human());
920 json::Value const resp = acctObjs(gw, jss::signer_list);
921 BEAST_EXPECT(acctObjsIsSize(resp, 1));
923 auto const& signerList = resp[jss::result][jss::account_objects][0u];
924 BEAST_EXPECT(signerList[sfSignerQuorum.jsonName] == 6);
925 auto const& entry = signerList[sfSignerEntries.jsonName][0u][sfSignerEntry.jsonName];
926 BEAST_EXPECT(entry[sfAccount.jsonName] == alice.
human());
927 BEAST_EXPECT(entry[sfSignerWeight.jsonName].
asUInt() == 7);
931 auto const seq = env.
seq(gw);
937 json::Value const resp = acctObjs(gw, jss::ticket);
938 BEAST_EXPECT(acctObjsIsSize(resp, 1));
940 auto const&
ticket = resp[jss::result][jss::account_objects][0u];
941 BEAST_EXPECT(
ticket[sfAccount.jsonName] == gw.
human());
942 BEAST_EXPECT(
ticket[sfLedgerEntryType.jsonName] == jss::Ticket);
943 BEAST_EXPECT(
ticket[sfTicketSequence.jsonName].asUInt() == seq + 1);
953 for (
auto const& acct : {alice, gw})
955 json::Value const resp = acctObjs(acct, jss::sponsorship);
956 BEAST_EXPECT(acctObjsIsSize(resp, 1));
958 auto const& sponsorship = resp[jss::result][jss::account_objects][0u];
960 BEAST_EXPECT(sponsorship[sfOwner.jsonName] == alice.
human());
961 BEAST_EXPECT(sponsorship[sfSponsee.jsonName] == gw.
human());
963 sponsorship[sfFlags.jsonName].asUInt() == tfSponsorshipSetRequireSignForFee);
964 BEAST_EXPECT(sponsorship[sfRemainingOwnerCount.jsonName].asUInt() == 200);
965 BEAST_EXPECT(sponsorship[sfFeeAmount.jsonName].asUInt() == 100000000);
966 BEAST_EXPECT(sponsorship[sfMaxFee.jsonName].asUInt() == 10);
973 params[jss::account] = gw.
human();
974 params[jss::deletion_blockers_only] =
true;
975 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
981 jss::NFTokenPage.cStr(),
982 jss::RippleState.cStr(),
983 jss::PayChannel.cStr(),
984 jss::PermissionedDomain.cStr(),
985 jss::Sponsorship.cStr()};
993 if (BEAST_EXPECT(acctObjsIsSize(resp, expectedAccountObjects)))
995 auto const& aobjs = resp[jss::result][jss::account_objects];
997 gotLedgerTypes.
reserve(expectedAccountObjects);
1000 gotLedgerTypes.
push_back(aobjs[i][
"LedgerEntryType"].asString());
1003 BEAST_EXPECT(gotLedgerTypes == expectedLedgerTypes);
1010 params[jss::account] = gw.
human();
1011 params[jss::deletion_blockers_only] =
true;
1012 params[jss::type] = jss::escrow;
1013 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1015 if (BEAST_EXPECT(acctObjsIsSize(resp, 1u)))
1017 auto const& aobjs = resp[jss::result][jss::account_objects];
1018 BEAST_EXPECT(aobjs[0u][
"LedgerEntryType"] == jss::Escrow);
1024 auto const objs = resp[jss::result][jss::account_objects];
1025 for (
auto const& obj : resp[jss::result][jss::account_objects])
1026 typesOut.push_back(obj[sfLedgerEntryType.fieldName].asString());
1033 if (!acctObjsIsSize(resp, types.
size()))
1036 getTypes(resp, typesOut);
1037 return types == typesOut;
1040 AMM amm(env, gw,
XRP(1'000), usd(1'000));
1041 amm.deposit(alice, usd(1));
1044 BEAST_EXPECT(
lines[jss::lines].size() == 3);
1046 BEAST_EXPECT(acctObjsIsSize(acctObjs(
amm.ammAccount(), jss::amm), 1));
1048 auto resp = acctObjs(
amm.ammAccount(), std::nullopt, 2);
1050 getTypes(resp, typesOut);
1053 amm.ammAccount(), std::nullopt, 10, resp[jss::result][jss::marker].
asString());
1054 getTypes(resp, typesOut);
1059 jss::RippleState.cStr(),
1060 jss::RippleState.cStr(),
1061 jss::RippleState.cStr()}));
1063 resp = acctObjs(
amm.ammAccount(), jss::state, 10);
1064 BEAST_EXPECT(expectObjects(
1065 resp, {jss::RippleState.cStr(), jss::RippleState.cStr(), jss::RippleState.cStr()}));
1067 BEAST_EXPECT(acctObjsIsSize(acctObjs(
amm.ammAccount(), jss::offer), 0));
1069 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::amm), 0));
1073 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::amendments)));
1074 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::directory)));
1075 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::fee)));
1076 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::hashes)));
1077 BEAST_EXPECT(acctObjsTypeIsInvalid(acctObjs(gw, jss::NegativeUNL)));
1081 for (
int d = 1'000'032; d >= 1'000'000; --d)
1088 BEAST_EXPECT(acctObjsIsSize(acctObjs(gw, jss::account), 0));
1236 using namespace jtx;
1242 env.
fund(
XRP(10000), alice, bob, carol);
1244 unsigned const accountObjectSize = 30;
1245 for (
unsigned i = 0; i < accountObjectSize; i++)
1248 for (
unsigned i = 0; i < 10; i++)
1253 unsigned const limit = 11;
1259 params[jss::account] = bob.
human();
1260 params[jss::limit] = limit;
1261 params[jss::ledger_index] =
"validated";
1262 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1263 auto& accountObjects = resp[jss::result][jss::account_objects];
1264 marker = resp[jss::result][jss::marker];
1265 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1266 BEAST_EXPECT(accountObjects.size() == limit);
1272 params[jss::account] = bob.
human();
1273 params[jss::limit] = limit;
1274 params[jss::marker] = marker;
1275 params[jss::ledger_index] =
"validated";
1276 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1277 auto& accountObjects = resp[jss::result][jss::account_objects];
1278 marker = resp[jss::result][jss::marker];
1279 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1280 BEAST_EXPECT(accountObjects.size() == limit);
1284 auto testInvalidMarker = [&](
std::string& marker) {
1286 params[jss::account] = bob.
human();
1287 params[jss::limit] = limit;
1288 params[jss::ledger_index] = jss::validated;
1289 params[jss::marker] = marker;
1291 return resp[jss::result][jss::error_message] ==
"Invalid field \'marker\'.";
1294 auto const markerStr = marker.
asString();
1295 auto const& idx = markerStr.
find(
',');
1296 auto const dirIndex = markerStr.substr(0, idx);
1297 auto const entryIndex = markerStr.substr(idx + 1);
1302 BEAST_EXPECT(testInvalidMarker(s));
1309 BEAST_EXPECT(testInvalidMarker(s));
1317 BEAST_EXPECT(testInvalidMarker(s));
1325 s = dirIndex +
',' + s;
1326 BEAST_EXPECT(testInvalidMarker(s));
1333 BEAST_EXPECT(testInvalidMarker(s));
1342 params[jss::account] = bob.
human();
1343 params[jss::limit] = limit;
1344 params[jss::marker] = s;
1345 params[jss::ledger_index] =
"validated";
1346 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1347 auto& accountObjects = resp[jss::result][jss::account_objects];
1348 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1349 BEAST_EXPECT(accountObjects.size() == limit);
1356 BEAST_EXPECT(testInvalidMarker(s));
1363 BEAST_EXPECT(testInvalidMarker(s));
1370 params[jss::account] = bob.
human();
1371 params[jss::limit] = limit;
1372 params[jss::marker] = marker;
1373 params[jss::ledger_index] =
"validated";
1374 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1375 auto& accountObjects = resp[jss::result][jss::account_objects];
1376 BEAST_EXPECT(!resp[jss::result].isMember(jss::error));
1377 BEAST_EXPECT(accountObjects.size() == accountObjectSize - (limit * 2));
1378 BEAST_EXPECT(!resp[jss::result].isMember(jss::marker));
1385 params[jss::account] = carol.
human();
1386 params[jss::limit] = 10;
1387 params[jss::marker] =
"0," + entryIndex;
1388 params[jss::ledger_index] =
"validated";
1389 auto resp = env.
rpc(
"json",
"account_objects",
to_string(params));
1390 auto& accountObjects = resp[jss::result][jss::account_objects];
1391 BEAST_EXPECT(accountObjects.size() == 0);
1399 using namespace jtx;
1404 Account const sponsor1(
"sponsor1");
1406 auto const usd = gw[
"USD"];
1408 env.
fund(
XRP(10000), alice, bob, sponsor1, gw);
1412 auto acctObjsSponsored = [](
Env& testEnv,
1418 params[jss::sponsored] = sponsored;
1420 params[jss::type] = *type;
1421 params[jss::ledger_index] =
"validated";
1422 return testEnv.
rpc(
"json",
"account_objects",
to_string(params));
1426 env(
trust(bob, usd(1000)));
1431 auto const resp = acctObjsSponsored(env, bob.
id(),
true);
1432 auto const& objs = resp[jss::result][jss::account_objects];
1433 BEAST_EXPECT(objs.size() == 0);
1438 if (!BEAST_EXPECT(env.
le(trustId)))
1443 Sig(sfSponsorSignature, sponsor1));
1448 auto const sle = env.
le(trustId);
1449 if (!BEAST_EXPECT(sle))
1451 BEAST_EXPECT(sle->isFieldPresent(sfHighSponsor) || sle->isFieldPresent(sfLowSponsor));
1456 auto const resp = acctObjsSponsored(env, bob.
id(),
true);
1457 auto const& objs = resp[jss::result][jss::account_objects];
1458 if (!BEAST_EXPECT(objs.size() == 1))
1461 auto const& obj = objs[0u];
1462 BEAST_EXPECT(obj[sfLedgerEntryType.jsonName] == jss::RippleState);
1464 obj.isMember(sfHighSponsor.jsonName) || obj.isMember(sfLowSponsor.jsonName));
1469 auto const resp = acctObjsSponsored(env, bob.
id(),
false);
1470 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
1477 Account const issuer(
"issuer");
1480 auto const usd = issuer[
"USD"];
1485 env(
trust(issuer, user[
"USD"](100)));
1488 env(
trust(user, usd(100)));
1492 if (!BEAST_EXPECT(env.
le(trustId)))
1500 auto const line = env.
le(trustId);
1501 if (!BEAST_EXPECT(line))
1504 auto const userIsHigh = line->getFieldAmount(sfHighLimit).getIssuer() == user.
id();
1505 auto const& userSponsorField = userIsHigh ? sfHighSponsor : sfLowSponsor;
1506 auto const& issuerSponsorField = userIsHigh ? sfLowSponsor : sfHighSponsor;
1508 BEAST_EXPECT(line->isFieldPresent(userSponsorField));
1509 BEAST_EXPECT(!line->isFieldPresent(issuerSponsorField));
1512 auto const resp = acctObjsSponsored(env, user.
id(),
true, jss::state);
1513 auto const& objs = resp[jss::result][jss::account_objects];
1514 if (BEAST_EXPECT(objs.size() == 1))
1515 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::RippleState);
1518 auto const resp = acctObjsSponsored(env, user.
id(),
false, jss::state);
1519 auto const& objs = resp[jss::result][jss::account_objects];
1520 BEAST_EXPECT(objs.size() == 0);
1523 auto const resp = acctObjsSponsored(env, issuer.
id(),
true, jss::state);
1524 auto const& objs = resp[jss::result][jss::account_objects];
1525 if (BEAST_EXPECT(objs.size() == 1))
1526 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::RippleState);
1529 auto const resp = acctObjsSponsored(env, issuer.
id(),
false, jss::state);
1530 auto const& objs = resp[jss::result][jss::account_objects];
1531 BEAST_EXPECT(objs.size() == 0);
1546 auto const checkSeq = env.
seq(owner);
1551 if (!BEAST_EXPECT(env.
le(checkId)))
1560 auto const sle = env.
le(checkId);
1561 if (!BEAST_EXPECT(sle))
1563 BEAST_EXPECT(sle->isFieldPresent(sfSponsor));
1566 for (
auto const& acct : {owner.
id(), dest.
id()})
1569 auto const resp = acctObjsSponsored(env, acct,
true, jss::check);
1570 auto const& objs = resp[jss::result][jss::account_objects];
1571 if (BEAST_EXPECT(objs.size() == 1))
1572 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::Check);
1575 auto const resp = acctObjsSponsored(env, acct,
false, jss::check);
1576 BEAST_EXPECT(resp[jss::result][jss::account_objects].size() == 0);
1585 Account const sponsee(
"sponsee");
1587 env.
fund(
XRP(10000), owner, sponsee);
1594 if (!BEAST_EXPECT(env.
le(sponsorshipKeylet)))
1598 auto const resp = acctObjsSponsored(env, owner.
id(),
false, jss::sponsorship);
1599 auto const& objs = resp[jss::result][jss::account_objects];
1600 if (BEAST_EXPECT(objs.size() == 1))
1601 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::Sponsorship);
1604 auto const resp = acctObjsSponsored(env, sponsee.
id(),
false, jss::sponsorship);
1605 auto const& objs = resp[jss::result][jss::account_objects];
1606 if (BEAST_EXPECT(objs.size() == 1))
1607 BEAST_EXPECT(objs[0u][sfLedgerEntryType.jsonName] == jss::Sponsorship);
1610 auto const resp = acctObjsSponsored(env, owner.
id(),
true, jss::sponsorship);
1611 auto const& objs = resp[jss::result][jss::account_objects];
1612 BEAST_EXPECT(objs.size() == 0);
1615 auto const resp = acctObjsSponsored(env, sponsee.
id(),
true, jss::sponsorship);
1616 auto const& objs = resp[jss::result][jss::account_objects];
1617 BEAST_EXPECT(objs.size() == 0);