keylet::nftpage -> keylet::nftokenPage

This commit is contained in:
Mayukha Vadari
2026-04-30 15:26:29 -04:00
parent f6c221085f
commit 93d0276483
12 changed files with 127 additions and 121 deletions

View File

@@ -221,14 +221,14 @@ payChannel(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexce
/** @{ */
/** A keylet for the owner's first possible NFT page. */
Keylet
nftpage_min(AccountID const& owner);
nftokenPage_min(AccountID const& owner);
/** A keylet for the owner's last possible NFT page. */
Keylet
nftpage_max(AccountID const& owner);
nftokenPage_max(AccountID const& owner);
Keylet
nftpage(Keylet const& k, uint256 const& token);
nftokenPage(Keylet const& k, uint256 const& token);
/** @} */
/** An offer from an account to buy or sell an NFT */
@@ -379,8 +379,12 @@ std::array<keyletDesc<AccountID const&>, 6> const directAccountKeylets{
{.function = &keylet::signerList, .expectedLEName = jss::SignerList, .includeInTests = true},
// It's normally impossible to create an item at nftpage_min, but
// test it anyway, since the invariant checks for it.
{.function = &keylet::nftpage_min, .expectedLEName = jss::NFTokenPage, .includeInTests = true},
{.function = &keylet::nftpage_max, .expectedLEName = jss::NFTokenPage, .includeInTests = true},
{.function = &keylet::nftokenPage_min,
.expectedLEName = jss::NFTokenPage,
.includeInTests = true},
{.function = &keylet::nftokenPage_max,
.expectedLEName = jss::NFTokenPage,
.includeInTests = true},
{.function = &keylet::did, .expectedLEName = jss::DID, .includeInTests = true}}};
MPTID

View File

@@ -84,7 +84,7 @@ LEDGER_ENTRY(ltNEGATIVE_UNL, 0x004e, NegativeUNL, nunl, ({
/** A ledger object which contains a list of NFTs
\sa keylet::nftpage_min, keylet::nftpage_max, keylet::nftpage
\sa keylet::nftokenPage_min, keylet::nftokenPage_max, keylet::nftokenPage
*/
LEDGER_ENTRY(ltNFTOKEN_PAGE, 0x0050, NFTokenPage, nft_page, ({
{sfPreviousPageMin, soeOPTIONAL},

View File

@@ -43,8 +43,8 @@ namespace xrpl::nft {
static std::shared_ptr<SLE const>
locatePage(ReadView const& view, AccountID const& owner, uint256 const& id)
{
auto const first = keylet::nftpage(keylet::nftpage_min(owner), id);
auto const last = keylet::nftpage_max(owner);
auto const first = keylet::nftokenPage(keylet::nftokenPage_min(owner), id);
auto const last = keylet::nftokenPage_max(owner);
// This NFT can only be found in the first page with a key that's strictly
// greater than `first`, so look for that, up until the maximum possible
@@ -56,8 +56,8 @@ locatePage(ReadView const& view, AccountID const& owner, uint256 const& id)
static std::shared_ptr<SLE>
locatePage(ApplyView& view, AccountID const& owner, uint256 const& id)
{
auto const first = keylet::nftpage(keylet::nftpage_min(owner), id);
auto const last = keylet::nftpage_max(owner);
auto const first = keylet::nftokenPage(keylet::nftokenPage_min(owner), id);
auto const last = keylet::nftokenPage_max(owner);
// This NFT can only be found in the first page with a key that's strictly
// greater than `first`, so look for that, up until the maximum possible
@@ -73,9 +73,9 @@ getPageForToken(
uint256 const& id,
std::function<void(ApplyView&, AccountID const&)> const& createCallback)
{
auto const base = keylet::nftpage_min(owner);
auto const first = keylet::nftpage(base, id);
auto const last = keylet::nftpage_max(owner);
auto const base = keylet::nftokenPage_min(owner);
auto const first = keylet::nftokenPage(base, id);
auto const last = keylet::nftokenPage_max(owner);
// This NFT can only be found in the first page with a key that's strictly
// greater than `first`, so look for that, up until the maximum possible
@@ -181,7 +181,7 @@ getPageForToken(
? narr[dirMaxTokensPerPage - 1].getFieldH256(sfNFTokenID).next()
: carr[0].getFieldH256(sfNFTokenID);
auto np = std::make_shared<SLE>(keylet::nftpage(base, tokenIDForNewPage));
auto np = std::make_shared<SLE>(keylet::nftokenPage(base, tokenIDForNewPage));
XRPL_ASSERT(np->key() > base.key, "xrpl::nft::getPageForToken : valid NFT page index");
np->setFieldArray(sfNFTokens, narr);
np->setFieldH256(sfNextPageMin, cp->key());
@@ -654,11 +654,11 @@ repairNFTokenDirectoryLinks(ApplyView& view, AccountID const& owner)
{
bool didRepair = false;
auto const last = keylet::nftpage_max(owner);
auto const last = keylet::nftokenPage_max(owner);
std::shared_ptr<SLE> page = view.peek(Keylet(
ltNFTOKEN_PAGE,
view.succ(keylet::nftpage_min(owner).key, last.key.next()).value_or(last.key)));
view.succ(keylet::nftokenPage_min(owner).key, last.key.next()).value_or(last.key)));
if (!page)
return didRepair;

View File

@@ -382,7 +382,7 @@ payChannel(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexce
}
Keylet
nftpage_min(AccountID const& owner)
nftokenPage_min(AccountID const& owner)
{
std::array<std::uint8_t, 32> buf{};
std::memcpy(buf.data(), owner.data(), owner.size());
@@ -390,7 +390,7 @@ nftpage_min(AccountID const& owner)
}
Keylet
nftpage_max(AccountID const& owner)
nftokenPage_max(AccountID const& owner)
{
uint256 id = nft::pageMask;
std::memcpy(id.data(), owner.data(), owner.size());
@@ -398,9 +398,9 @@ nftpage_max(AccountID const& owner)
}
Keylet
nftpage(Keylet const& k, uint256 const& token)
nftokenPage(Keylet const& k, uint256 const& token)
{
XRPL_ASSERT(k.type == ltNFTOKEN_PAGE, "xrpl::keylet::nftpage : valid input type");
XRPL_ASSERT(k.type == ltNFTOKEN_PAGE, "xrpl::keylet::nftokenPage : valid input type");
return {ltNFTOKEN_PAGE, (k.key & ~nft::pageMask) + (token & nft::pageMask)};
}

View File

@@ -537,8 +537,8 @@ AccountRootsDeletedClean::finalize(
// checked above as entries in directAccountKeylets. This uses
// view.succ() to check for any NFT pages in between the two
// endpoints.
Keylet const first = keylet::nftpage_min(accountID);
Keylet const last = keylet::nftpage_max(accountID);
Keylet const first = keylet::nftokenPage_min(accountID);
Keylet const last = keylet::nftokenPage_max(accountID);
std::optional<uint256> key = view.succ(first.key, last.key.next());

View File

@@ -261,8 +261,8 @@ AccountDelete::preclaim(PreclaimContext const& ctx)
return tecHAS_OBLIGATIONS;
// If the account owns any NFTs it cannot be deleted.
Keylet const first = keylet::nftpage_min(account);
Keylet const last = keylet::nftpage_max(account);
Keylet const first = keylet::nftokenPage_min(account);
Keylet const last = keylet::nftokenPage_max(account);
auto const cp = ctx.view.read(
Keylet(ltNFTOKEN_PAGE, ctx.view.succ(first.key, last.key.next()).value_or(last.key)));

View File

@@ -260,7 +260,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Get the index of the middle page.
uint256 const aliceMiddleNFTokenPageIndex = [&env, &alice]() {
auto lastNFTokenPage = env.le(keylet::nftpage_max(alice));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
return lastNFTokenPage->at(sfPreviousPageMin);
}();
@@ -283,12 +283,12 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Removing the last token from the last page deletes the last
// page. This is a bug. The contents of the next-to-last page
// should have been moved into the last page.
BEAST_EXPECT(!env.le(keylet::nftpage_max(alice)));
BEAST_EXPECT(!env.le(keylet::nftokenPage_max(alice)));
// alice's "middle" page is still present, but has no links.
{
auto aliceMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), aliceMiddleNFTokenPageIndex));
auto aliceMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), aliceMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
return;
@@ -308,7 +308,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Get the index of the middle page.
uint256 const bobMiddleNFTokenPageIndex = [&env, &bob]() {
auto lastNFTokenPage = env.le(keylet::nftpage_max(bob));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(bob));
return lastNFTokenPage->at(sfPreviousPageMin);
}();
@@ -325,13 +325,13 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Removing the last token from the last page deletes the last
// page. This is a bug. The contents of the next-to-last page
// should have been moved into the last page.
BEAST_EXPECT(!env.le(keylet::nftpage_max(bob)));
BEAST_EXPECT(!env.le(keylet::nftokenPage_max(bob)));
// bob's "middle" page is still present, but has lost the
// NextPageMin field.
{
auto bobMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(bob), bobMiddleNFTokenPageIndex));
auto bobMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(bob), bobMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(bobMiddleNFTokenPage))
return;
@@ -351,7 +351,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Get the index of the middle page.
uint256 const carolMiddleNFTokenPageIndex = [&env, &carol]() {
auto lastNFTokenPage = env.le(keylet::nftpage_max(carol));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(carol));
return lastNFTokenPage->at(sfPreviousPageMin);
}();
@@ -376,12 +376,12 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Removing the last token from the last page deletes the last
// page. This is a bug. The contents of the next-to-last page
// should have been moved into the last page.
BEAST_EXPECT(!env.le(keylet::nftpage_max(carol)));
BEAST_EXPECT(!env.le(keylet::nftokenPage_max(carol)));
// carol's "middle" page is still present, but has lost the
// NextPageMin field.
auto carolMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(carol), carolMiddleNFTokenPageIndex));
auto carolMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(carol), carolMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(carolMiddleNFTokenPage))
return;
@@ -411,8 +411,8 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// carol's "middle" page is present and still has no NextPageMin field.
{
auto carolMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(carol), carolMiddleNFTokenPageIndex));
auto carolMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(carol), carolMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(carolMiddleNFTokenPage))
return;
@@ -421,7 +421,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
}
// carol has a "last" page again, but it has no PreviousPageMin field.
{
auto carolLastNFTokenPage = env.le(keylet::nftpage_max(carol));
auto carolLastNFTokenPage = env.le(keylet::nftokenPage_max(carol));
BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
@@ -449,12 +449,12 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Verify that alice's NFToken directory is still damaged.
// alice's last page should still be missing.
BEAST_EXPECT(!env.le(keylet::nftpage_max(alice)));
BEAST_EXPECT(!env.le(keylet::nftokenPage_max(alice)));
// alice's "middle" page is still present and has no links.
{
auto aliceMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), aliceMiddleNFTokenPageIndex));
auto aliceMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), aliceMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(aliceMiddleNFTokenPage))
return;
@@ -473,7 +473,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// alice's last page should now be present and include no links.
{
auto aliceLastNFTokenPage = env.le(keylet::nftpage_max(alice));
auto aliceLastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(aliceLastNFTokenPage))
return;
@@ -482,8 +482,8 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
}
// alice's middle page should be gone.
BEAST_EXPECT(
!env.le(keylet::nftpage(keylet::nftpage_min(alice), aliceMiddleNFTokenPageIndex)));
BEAST_EXPECT(!env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), aliceMiddleNFTokenPageIndex)));
BEAST_EXPECT(nftCount(env, alice) == 32);
BEAST_EXPECT(ownerCount(env, alice) == 1);
@@ -495,12 +495,12 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// Verify that bob's NFToken directory is still damaged.
// bob's last page should still be missing.
BEAST_EXPECT(!env.le(keylet::nftpage_max(bob)));
BEAST_EXPECT(!env.le(keylet::nftokenPage_max(bob)));
// bob's "middle" page is still present and missing NextPageMin.
{
auto bobMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(bob), bobMiddleNFTokenPageIndex));
auto bobMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(bob), bobMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(bobMiddleNFTokenPage))
return;
@@ -515,7 +515,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// bob's last page should now be present and include a previous
// link but no next link.
{
auto const lastPageKeylet = keylet::nftpage_max(bob);
auto const lastPageKeylet = keylet::nftokenPage_max(bob);
auto const bobLastNFTokenPage = env.le(lastPageKeylet);
if (!BEAST_EXPECT(bobLastNFTokenPage))
return;
@@ -525,8 +525,8 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
BEAST_EXPECT(!bobLastNFTokenPage->isFieldPresent(sfNextPageMin));
auto const bobNewFirstNFTokenPage = env.le(
keylet::nftpage(
keylet::nftpage_min(bob), bobLastNFTokenPage->at(sfPreviousPageMin)));
keylet::nftokenPage(
keylet::nftokenPage_min(bob), bobLastNFTokenPage->at(sfPreviousPageMin)));
if (!BEAST_EXPECT(bobNewFirstNFTokenPage))
return;
@@ -537,7 +537,8 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
}
// bob's middle page should be gone.
BEAST_EXPECT(!env.le(keylet::nftpage(keylet::nftpage_min(bob), bobMiddleNFTokenPageIndex)));
BEAST_EXPECT(
!env.le(keylet::nftokenPage(keylet::nftokenPage_min(bob), bobMiddleNFTokenPageIndex)));
BEAST_EXPECT(nftCount(env, bob) == 64);
BEAST_EXPECT(ownerCount(env, bob) == 2);
@@ -550,8 +551,8 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// carol's "middle" page is present and has no NextPageMin field.
{
auto carolMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(carol), carolMiddleNFTokenPageIndex));
auto carolMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(carol), carolMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(carolMiddleNFTokenPage))
return;
@@ -560,7 +561,7 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
}
// carol has a "last" page, but it has no PreviousPageMin field.
{
auto carolLastNFTokenPage = env.le(keylet::nftpage_max(carol));
auto carolLastNFTokenPage = env.le(keylet::nftokenPage_max(carol));
BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfPreviousPageMin));
BEAST_EXPECT(!carolLastNFTokenPage->isFieldPresent(sfNextPageMin));
@@ -572,9 +573,9 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
{
// carol's "middle" page is present and now has a NextPageMin field.
auto const lastPageKeylet = keylet::nftpage_max(carol);
auto carolMiddleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(carol), carolMiddleNFTokenPageIndex));
auto const lastPageKeylet = keylet::nftokenPage_max(carol);
auto carolMiddleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(carol), carolMiddleNFTokenPageIndex));
if (!BEAST_EXPECT(carolMiddleNFTokenPage))
return;
@@ -595,8 +596,8 @@ class FixNFTokenPageLinks_test : public beast::unit_test::suite
// carol also has a "first" page that includes a NextPageMin field.
auto carolFirstNFTokenPage = env.le(
keylet::nftpage(
keylet::nftpage_min(carol), carolMiddleNFTokenPage->at(sfPreviousPageMin)));
keylet::nftokenPage(
keylet::nftokenPage_min(carol), carolMiddleNFTokenPage->at(sfPreviousPageMin)));
if (!BEAST_EXPECT(carolFirstNFTokenPage))
return;

View File

@@ -1175,7 +1175,7 @@ class Invariants_test : public beast::unit_test::suite
doInvariantCheck(
{{"NFT page has invalid size"}},
[&makeNFTokenIDs](Account const& A1, Account const&, ApplyContext& ac) {
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, makeNFTokenIDs(0));
ac.view().insert(nftPage);
@@ -1185,7 +1185,7 @@ class Invariants_test : public beast::unit_test::suite
doInvariantCheck(
{{"NFT page has invalid size"}},
[&makeNFTokenIDs](Account const& A1, Account const&, ApplyContext& ac) {
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, makeNFTokenIDs(33));
ac.view().insert(nftPage);
@@ -1198,7 +1198,7 @@ class Invariants_test : public beast::unit_test::suite
STArray nfTokens = makeNFTokenIDs(2);
std::iter_swap(nfTokens.begin(), nfTokens.begin() + 1);
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, nfTokens);
ac.view().insert(nftPage);
@@ -1211,7 +1211,7 @@ class Invariants_test : public beast::unit_test::suite
STArray nfTokens = makeNFTokenIDs(1);
nfTokens[0].setFieldVL(sfURI, Blob{});
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, nfTokens);
ac.view().insert(nftPage);
@@ -1221,9 +1221,9 @@ class Invariants_test : public beast::unit_test::suite
doInvariantCheck(
{{"NFT page is improperly linked"}},
[&makeNFTokenIDs](Account const& A1, Account const&, ApplyContext& ac) {
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, makeNFTokenIDs(1));
nftPage->setFieldH256(sfPreviousPageMin, keylet::nftpage_max(A1).key);
nftPage->setFieldH256(sfPreviousPageMin, keylet::nftokenPage_max(A1).key);
ac.view().insert(nftPage);
return true;
@@ -1232,9 +1232,9 @@ class Invariants_test : public beast::unit_test::suite
doInvariantCheck(
{{"NFT page is improperly linked"}},
[&makeNFTokenIDs](Account const& A1, Account const& A2, ApplyContext& ac) {
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, makeNFTokenIDs(1));
nftPage->setFieldH256(sfPreviousPageMin, keylet::nftpage_min(A2).key);
nftPage->setFieldH256(sfPreviousPageMin, keylet::nftokenPage_min(A2).key);
ac.view().insert(nftPage);
return true;
@@ -1243,7 +1243,7 @@ class Invariants_test : public beast::unit_test::suite
doInvariantCheck(
{{"NFT page is improperly linked"}},
[&makeNFTokenIDs](Account const& A1, Account const&, ApplyContext& ac) {
auto nftPage = std::make_shared<SLE>(keylet::nftpage_max(A1));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage_max(A1));
nftPage->setFieldArray(sfNFTokens, makeNFTokenIDs(1));
nftPage->setFieldH256(sfNextPageMin, nftPage->key());
@@ -1255,10 +1255,10 @@ class Invariants_test : public beast::unit_test::suite
{{"NFT page is improperly linked"}},
[&makeNFTokenIDs](Account const& A1, Account const& A2, ApplyContext& ac) {
STArray nfTokens = makeNFTokenIDs(1);
auto nftPage = std::make_shared<SLE>(keylet::nftpage(
keylet::nftpage_max(A1), ++(nfTokens[0].getFieldH256(sfNFTokenID))));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage(
keylet::nftokenPage_max(A1), ++(nfTokens[0].getFieldH256(sfNFTokenID))));
nftPage->setFieldArray(sfNFTokens, nfTokens);
nftPage->setFieldH256(sfNextPageMin, keylet::nftpage_max(A2).key);
nftPage->setFieldH256(sfNextPageMin, keylet::nftokenPage_max(A2).key);
ac.view().insert(nftPage);
return true;
@@ -1268,8 +1268,8 @@ class Invariants_test : public beast::unit_test::suite
{{"NFT found in incorrect page"}},
[&makeNFTokenIDs](Account const& A1, Account const&, ApplyContext& ac) {
STArray nfTokens = makeNFTokenIDs(2);
auto nftPage = std::make_shared<SLE>(keylet::nftpage(
keylet::nftpage_max(A1), (nfTokens[1].getFieldH256(sfNFTokenID))));
auto nftPage = std::make_shared<SLE>(keylet::nftokenPage(
keylet::nftokenPage_max(A1), (nfTokens[1].getFieldH256(sfNFTokenID))));
nftPage->setFieldArray(sfNFTokens, nfTokens);
ac.view().insert(nftPage);

View File

@@ -472,19 +472,19 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify that that all three pages are present and remember the
// indexes.
auto lastNFTokenPage = env.le(keylet::nftpage_max(alice));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
uint256 const middleNFTokenPageIndex = lastNFTokenPage->at(sfPreviousPageMin);
auto middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
uint256 const firstNFTokenPageIndex = middleNFTokenPage->at(sfPreviousPageMin);
auto firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
if (!BEAST_EXPECT(firstNFTokenPage))
return;
@@ -498,7 +498,7 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify that the last page is still present and contains just one
// NFT.
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
@@ -517,21 +517,21 @@ class NFTokenBurn_test : public beast::unit_test::suite
// _previous_ page because we need to preserve that last
// page an an anchor. The contents of the next-to-last page
// are moved into the last page.
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
BEAST_EXPECT(lastNFTokenPage);
BEAST_EXPECT(lastNFTokenPage->at(~sfPreviousPageMin) == firstNFTokenPageIndex);
BEAST_EXPECT(!lastNFTokenPage->isFieldPresent(sfNextPageMin));
BEAST_EXPECT(lastNFTokenPage->getFieldArray(sfNFTokens).size() == 32);
// The "middle" page should be gone.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
middleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
BEAST_EXPECT(!middleNFTokenPage);
// The "first" page should still be present and linked to
// the last page.
firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
firstNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
BEAST_EXPECT(firstNFTokenPage);
BEAST_EXPECT(!firstNFTokenPage->isFieldPresent(sfPreviousPageMin));
BEAST_EXPECT(firstNFTokenPage->at(~sfNextPageMin) == lastNFTokenPage->key());
@@ -542,13 +542,13 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Removing the last token from the last page deletes the last
// page. This is a bug. The contents of the next-to-last page
// should have been moved into the last page.
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
BEAST_EXPECT(!lastNFTokenPage);
// The "middle" page is still present, but has lost the
// NextPageMin field.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
middleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
BEAST_EXPECT(middleNFTokenPage->isFieldPresent(sfPreviousPageMin));
@@ -576,19 +576,19 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify that that all three pages are present and remember the
// indexes.
auto lastNFTokenPage = env.le(keylet::nftpage_max(alice));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
uint256 const middleNFTokenPageIndex = lastNFTokenPage->at(sfPreviousPageMin);
auto middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
uint256 const firstNFTokenPageIndex = middleNFTokenPage->at(sfPreviousPageMin);
auto firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
if (!BEAST_EXPECT(firstNFTokenPage))
return;
@@ -604,17 +604,18 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify that middle page is gone and the links in the two
// remaining pages are correct.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
BEAST_EXPECT(!middleNFTokenPage);
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
BEAST_EXPECT(!lastNFTokenPage->isFieldPresent(sfNextPageMin));
BEAST_EXPECT(lastNFTokenPage->getFieldH256(sfPreviousPageMin) == firstNFTokenPageIndex);
firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
BEAST_EXPECT(
firstNFTokenPage->getFieldH256(sfNextPageMin) == keylet::nftpage_max(alice).key);
firstNFTokenPage->getFieldH256(sfNextPageMin) ==
keylet::nftokenPage_max(alice).key);
BEAST_EXPECT(!firstNFTokenPage->isFieldPresent(sfPreviousPageMin));
// Burn the remaining nfts.
@@ -637,19 +638,19 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify that that all three pages are present and remember the
// indexes.
auto lastNFTokenPage = env.le(keylet::nftpage_max(alice));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
uint256 const middleNFTokenPageIndex = lastNFTokenPage->at(sfPreviousPageMin);
auto middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
uint256 const firstNFTokenPageIndex = middleNFTokenPage->at(sfPreviousPageMin);
auto firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
if (!BEAST_EXPECT(firstNFTokenPage))
return;
@@ -664,18 +665,18 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify the first page is gone.
firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
BEAST_EXPECT(!firstNFTokenPage);
// Check the links in the other two pages.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
BEAST_EXPECT(!middleNFTokenPage->isFieldPresent(sfPreviousPageMin));
BEAST_EXPECT(middleNFTokenPage->isFieldPresent(sfNextPageMin));
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
BEAST_EXPECT(lastNFTokenPage->isFieldPresent(sfPreviousPageMin));
@@ -696,20 +697,20 @@ class NFTokenBurn_test : public beast::unit_test::suite
// _previous_ page because we need to preserve that last
// page an an anchor. The contents of the next-to-last page
// are moved into the last page.
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
BEAST_EXPECT(lastNFTokenPage);
BEAST_EXPECT(!lastNFTokenPage->isFieldPresent(sfPreviousPageMin));
BEAST_EXPECT(!lastNFTokenPage->isFieldPresent(sfNextPageMin));
BEAST_EXPECT(lastNFTokenPage->getFieldArray(sfNFTokens).size() == 32);
// The "middle" page should be gone.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
middleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
BEAST_EXPECT(!middleNFTokenPage);
// The "first" page should still be gone.
firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
firstNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
BEAST_EXPECT(!firstNFTokenPage);
}
else
@@ -717,13 +718,13 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Removing the last token from the last page deletes the last
// page. This is a bug. The contents of the next-to-last page
// should have been moved into the last page.
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
BEAST_EXPECT(!lastNFTokenPage);
// The "middle" page is still present, but has lost the
// NextPageMin field.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
middleNFTokenPage = env.le(
keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
BEAST_EXPECT(!middleNFTokenPage->isFieldPresent(sfPreviousPageMin));
@@ -777,7 +778,7 @@ class NFTokenBurn_test : public beast::unit_test::suite
env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, jlog};
// Verify that the last page is present and contains one NFT.
auto lastNFTokenPage = ac.view().peek(keylet::nftpage_max(alice));
auto lastNFTokenPage = ac.view().peek(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
BEAST_EXPECT(lastNFTokenPage->getFieldArray(sfNFTokens).size() == 1);
@@ -810,10 +811,10 @@ class NFTokenBurn_test : public beast::unit_test::suite
env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, jlog};
// Verify that the middle page is present.
auto lastNFTokenPage = ac.view().peek(keylet::nftpage_max(alice));
auto lastNFTokenPage = ac.view().peek(keylet::nftokenPage_max(alice));
auto middleNFTokenPage = ac.view().peek(
keylet::nftpage(
keylet::nftpage_min(alice),
keylet::nftokenPage(
keylet::nftokenPage_min(alice),
lastNFTokenPage->getFieldH256(sfPreviousPageMin)));
BEAST_EXPECT(middleNFTokenPage);
@@ -1093,19 +1094,19 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Verify that that all three pages are present and remember the
// indexes.
auto lastNFTokenPage = env.le(keylet::nftpage_max(alice));
auto lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
if (!BEAST_EXPECT(lastNFTokenPage))
return;
uint256 const middleNFTokenPageIndex = lastNFTokenPage->at(sfPreviousPageMin);
auto middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
uint256 const firstNFTokenPageIndex = middleNFTokenPage->at(sfPreviousPageMin);
auto firstNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), firstNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), firstNFTokenPageIndex));
if (!BEAST_EXPECT(firstNFTokenPage))
return;
@@ -1129,14 +1130,14 @@ class NFTokenBurn_test : public beast::unit_test::suite
// Removing the last token from the last page deletes alice's last
// page. This is a bug. The contents of the next-to-last page
// should have been moved into the last page.
lastNFTokenPage = env.le(keylet::nftpage_max(alice));
lastNFTokenPage = env.le(keylet::nftokenPage_max(alice));
BEAST_EXPECT(!lastNFTokenPage);
BEAST_EXPECT(ownerCount(env, alice) == 2);
// The "middle" page is still present, but has lost the
// NextPageMin field.
middleNFTokenPage =
env.le(keylet::nftpage(keylet::nftpage_min(alice), middleNFTokenPageIndex));
env.le(keylet::nftokenPage(keylet::nftokenPage_min(alice), middleNFTokenPageIndex));
if (!BEAST_EXPECT(middleNFTokenPage))
return;
BEAST_EXPECT(middleNFTokenPage->isFieldPresent(sfPreviousPageMin));

View File

@@ -1561,7 +1561,7 @@ class LedgerEntry_test : public beast::unit_test::suite
env(token::mint(issuer, 0), txflags(tfTransferable));
env.close();
auto const nftpage = keylet::nftpage_max(issuer);
auto const nftpage = keylet::nftokenPage_max(issuer);
BEAST_EXPECT(env.le(nftpage) != nullptr);
{

View File

@@ -74,8 +74,8 @@ doAccountNFTs(RPC::JsonContext& context)
return RPC::invalid_field_error(jss::marker);
}
auto const first = keylet::nftpage(keylet::nftpage_min(accountID), marker);
auto const last = keylet::nftpage_max(accountID);
auto const first = keylet::nftokenPage(keylet::nftokenPage_min(accountID), marker);
auto const last = keylet::nftokenPage_max(accountID);
auto cp = ledger->read(
Keylet(ltNFTOKEN_PAGE, ledger->succ(first.key, last.key.next()).value_or(last.key)));

View File

@@ -61,7 +61,7 @@ getAccountObjects(
(!typeFilter.has_value() || typeMatchesFilter(typeFilter.value(), ltNFTOKEN_PAGE)) &&
dirIndex == beast::zero;
Keylet const firstNFTPage = keylet::nftpage_min(account);
Keylet const firstNFTPage = keylet::nftokenPage_min(account);
// we need to check the marker to see if it is an NFTTokenPage index.
if (iterateNFTPages && entryIndex != beast::zero)
@@ -85,7 +85,7 @@ getAccountObjects(
Keylet const first =
entryIndex == beast::zero ? firstNFTPage : Keylet{ltNFTOKEN_PAGE, entryIndex};
Keylet const last = keylet::nftpage_max(account);
Keylet const last = keylet::nftokenPage_max(account);
// current key
uint256 ck = ledger.succ(first.key, last.key.next()).value_or(last.key);