ammAccountHolds MPT optimization

This commit is contained in:
Gregory Tsipenyuk
2026-04-29 10:33:08 -04:00
parent 46b997b774
commit 017256e235
5 changed files with 68 additions and 6 deletions

View File

@@ -58,6 +58,12 @@ isVaultPseudoAccountFrozen(
AccountID const& account,
MPTIssue const& mptShare,
int depth);
[[nodiscard]] bool
isVaultPseudoAccountFrozen(
ReadView const& view,
AccountID const& account,
SLE const& mptSLE,
int depth);
[[nodiscard]] bool
isLPTokenFrozen(

View File

@@ -26,9 +26,15 @@ isGlobalFrozen(ReadView const& view, MPTIssue const& mptIssue);
[[nodiscard]] bool
isIndividualFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue);
[[nodiscard]] bool
isIndividualFrozen(ReadView const& view, AccountID const& account, SLE const& mptSLE);
[[nodiscard]] bool
isFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue, int depth = 0);
[[nodiscard]] bool
isFrozen(ReadView const& view, AccountID const& account, SLE const& mptSLE, int depth = 0);
[[nodiscard]] bool
isAnyFrozen(
ReadView const& view,

View File

@@ -52,11 +52,13 @@ hasExpired(ReadView const& view, std::optional<std::uint32_t> const& exp)
return exp && (view.parentCloseTime() >= tp{d{*exp}});
}
template <typename T>
requires(std::is_same_v<T, MPTIssue> || std::is_same_v<T, SLE>)
bool
isVaultPseudoAccountFrozen(
ReadView const& view,
T const& mptShare,
AccountID const& account,
MPTIssue const& mptShare,
int depth)
{
if (!view.rules().enabled(featureSingleAssetVault))
@@ -65,11 +67,17 @@ isVaultPseudoAccountFrozen(
if (depth >= maxAssetCheckDepth)
return true; // LCOV_EXCL_LINE
auto const mptIssuance = view.read(keylet::mptIssuance(mptShare.getMptID()));
if (mptIssuance == nullptr)
return false; // zero MPToken won't block deletion of MPTokenIssuance
auto const issuer = [&]() {
if constexpr (std::is_same_v<T, MPTIssue>)
{
return mptShare.getIssuer();
}
if constexpr (std::is_same_v<T, SLE>)
{
return mptShare[sfAccount];
}
}();
auto const issuer = mptIssuance->getAccountID(sfIssuer);
auto const mptIssuer = view.read(keylet::account(issuer));
if (mptIssuer == nullptr)
{
@@ -82,6 +90,13 @@ isVaultPseudoAccountFrozen(
if (!mptIssuer->isFieldPresent(sfVaultID))
return false; // not a Vault pseudo-account, common case
if constexpr (std::is_same_v<T, MPTIssue>)
{
auto const mptIssuance = view.read(keylet::mptIssuance(mptShare.getMptID()));
if (mptIssuance == nullptr)
return false; // zero MPToken won't block deletion of MPTokenIssuance
}
auto const vault = view.read(keylet::vault(mptIssuer->getFieldH256(sfVaultID)));
if (vault == nullptr)
{ // LCOV_EXCL_START
@@ -93,6 +108,26 @@ isVaultPseudoAccountFrozen(
return isAnyFrozen(view, {issuer, account}, vault->at(sfAsset), depth + 1);
}
bool
isVaultPseudoAccountFrozen(
ReadView const& view,
AccountID const& account,
MPTIssue const& mptShare,
int depth)
{
return isVaultPseudoAccountFrozen(view, mptShare, account, depth);
}
bool
isVaultPseudoAccountFrozen(
ReadView const& view,
AccountID const& account,
SLE const& mptShareSLE,
int depth)
{
return isVaultPseudoAccountFrozen(view, mptShareSLE, account, depth);
}
bool
isLPTokenFrozen(
ReadView const& view,

View File

@@ -12,6 +12,7 @@
#include <xrpl/ledger/ReadView.h>
#include <xrpl/ledger/Sandbox.h>
#include <xrpl/ledger/View.h>
#include <xrpl/ledger/helpers/MPTokenHelpers.h>
#include <xrpl/ledger/helpers/RippleStateHelpers.h>
#include <xrpl/ledger/helpers/TokenHelpers.h>
#include <xrpl/protocol/AMMCore.h>
@@ -598,7 +599,7 @@ ammAccountHolds(ReadView const& view, AccountID const& ammAccountID, Asset const
return asset.visit(
[&](MPTIssue const& issue) {
if (auto const sle = view.read(keylet::mptoken(issue, ammAccountID));
sle && !isFrozen(view, ammAccountID, issue))
sle && !isFrozen(view, ammAccountID, *sle.get()))
return STAmount{issue, (*sle)[sfMPTAmount]};
return STAmount{asset};
},

View File

@@ -54,6 +54,12 @@ isIndividualFrozen(ReadView const& view, AccountID const& account, MPTIssue cons
return false;
}
bool
isIndividualFrozen(ReadView const& view, AccountID const& account, SLE const& mptSLE)
{
return mptSLE.isFlag(lsfMPTLocked);
}
bool
isFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssue, int depth)
{
@@ -61,6 +67,14 @@ isFrozen(ReadView const& view, AccountID const& account, MPTIssue const& mptIssu
isVaultPseudoAccountFrozen(view, account, mptIssue, depth);
}
bool
isFrozen(ReadView const& view, AccountID const& account, SLE const& mptSLE, int depth)
{
MPTIssue const mptIssue{mptSLE[sfMPTokenIssuanceID]};
return isGlobalFrozen(view, mptIssue) || isIndividualFrozen(view, account, mptSLE) ||
isVaultPseudoAccountFrozen(view, account, mptSLE, depth);
}
[[nodiscard]] bool
isAnyFrozen(
ReadView const& view,