Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 19 additions & 29 deletions src/libxrpl/ledger/helpers/NFTokenHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
#include <cstddef>
#include <cstdint>
#include <expected>
#include <functional>
#include <iterator>
#include <memory>
#include <optional>
Expand Down Expand Up @@ -77,9 +76,7 @@ getPageForToken(
STTx const& tx,
AccountID const& owner,
SLE::ref sponsorSle,
uint256 const& id,
std::function<TER(ApplyView&, STTx const&, SLE::ref, AccountID const&, SLE::ref)> const&
createCallback)
uint256 const& id)
{
auto const base = keylet::nftpageMin(owner);
auto const first = keylet::nftpage(base, id);
Expand All @@ -91,6 +88,21 @@ getPageForToken(
auto cp =
view.peek(Keylet(ltNFTOKEN_PAGE, view.succ(first.key, last.key.next()).value_or(last.key)));

auto const onNewPage = [&](SLE::ref newPage) -> TER {
if (isReserveSponsored(tx))
{
auto const ownerSle = view.read(keylet::account(owner));
auto const ownerBalance = ownerSle->getFieldAmount(sfBalance);
if (auto const ret =
checkInsufficientReserve(view, tx, ownerSle, ownerBalance, sponsorSle, 1);
!isTesSuccess(ret))
return ret;
}
adjustOwnerCount(view, view.peek(keylet::account(owner)), sponsorSle, 1);
addSponsorToLedgerEntry(newPage, sponsorSle);
return tesSUCCESS;
};

// A suitable page doesn't exist; we'll have to create one.
if (!cp)
{
Expand All @@ -99,7 +111,7 @@ getPageForToken(
cp->setFieldArray(sfNFTokens, arr);
view.insert(cp);

if (auto const ret = createCallback(view, tx, cp, owner, sponsorSle); !isTesSuccess(ret))
if (auto const ret = onNewPage(cp); !isTesSuccess(ret))
return std::unexpected(ret);
return cp;
}
Expand Down Expand Up @@ -213,7 +225,7 @@ getPageForToken(
cp->setFieldH256(sfPreviousPageMin, np->key());
view.update(cp);

if (auto const ret = createCallback(view, tx, np, owner, sponsorSle); ret != tesSUCCESS)
if (auto const ret = onNewPage(np); !isTesSuccess(ret))
return std::unexpected(ret);

return (first.key < np->key()) ? np : cp;
Expand Down Expand Up @@ -277,29 +289,7 @@ insertToken(ApplyView& view, STTx const& tx, AccountID owner, SLE::ref sponsorSl
// First, we need to locate the page the NFT belongs to, creating it
// if necessary. This operation may fail if it is impossible to insert
// the NFT.
auto createCallback = [](ApplyView& view,
STTx const& tx,
std::shared_ptr<SLE> const& newPage,
AccountID const& owner,
SLE::ref sponsorSle) -> TER {
if (isReserveSponsored(tx))
{
auto const ownerSle = view.read(keylet::account(owner));
auto const ownerBalance = ownerSle->getFieldAmount(sfBalance);
if (auto const ret =
checkInsufficientReserve(view, tx, ownerSle, ownerBalance, sponsorSle, 1);
!isTesSuccess(ret))
return ret;
}

adjustOwnerCount(view, view.peek(keylet::account(owner)), sponsorSle, 1);

addSponsorToLedgerEntry(newPage, sponsorSle);
return tesSUCCESS;
};

auto const page =
getPageForToken(view, tx, owner, sponsorSle, nft[sfNFTokenID], createCallback);
auto const page = getPageForToken(view, tx, owner, sponsorSle, nft[sfNFTokenID]);

if (!page.has_value())
return page.error();
Expand Down
Loading