From 1e21180332fed61d864acd5769e438c7cbf17a12 Mon Sep 17 00:00:00 2001 From: Valentin Balaschenko <13349202+vlntb@users.noreply.github.com> Date: Wed, 24 Dec 2025 12:16:21 +0000 Subject: [PATCH] extra checks after sync with target --- src/libxrpl/ledger/View.cpp | 3 +++ .../app/tx/detail/LoanBrokerCoverDeposit.cpp | 5 ----- .../app/tx/detail/LoanBrokerCoverWithdraw.cpp | 15 +++++++++------ src/xrpld/app/tx/detail/VaultDeposit.cpp | 3 ++- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index 7d47e0b378..5480ecbf85 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -257,6 +257,9 @@ isFrozen( MPTIssue const& mptIssue, int depth) { + if (account == mptIssue.getIssuer()) + return false; + return isGlobalFrozen(view, mptIssue) || isIndividualFrozen(view, account, mptIssue) || isVaultPseudoAccountFrozen(view, account, mptIssue, depth); diff --git a/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp b/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp index d7cb8beafc..360f525f2d 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp @@ -41,11 +41,6 @@ LoanBrokerCoverDeposit::preclaim(PreclaimContext const& ctx) JLOG(ctx.j.warn()) << "LoanBroker does not exist."; return tecNO_ENTRY; } - if (account != sleBroker->at(sfOwner)) - { - JLOG(ctx.j.warn()) << "Account is not the owner of the LoanBroker."; - return tecNO_PERMISSION; - } auto const vault = ctx.view.read(keylet::vault(sleBroker->at(sfVaultID))); if (!vault) { diff --git a/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp b/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp index 830f9e26c1..f40a1751b1 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp @@ -59,11 +59,6 @@ LoanBrokerCoverWithdraw::preclaim(PreclaimContext const& ctx) JLOG(ctx.j.warn()) << "LoanBroker does not exist."; return tecNO_ENTRY; } - if (account != sleBroker->at(sfOwner)) - { - JLOG(ctx.j.warn()) << "Account is not the owner of the LoanBroker."; - return tecNO_PERMISSION; - } auto const vault = ctx.view.read(keylet::vault(sleBroker->at(sfVaultID))); if (!vault) { @@ -131,11 +126,19 @@ LoanBrokerCoverWithdraw::preclaim(PreclaimContext const& ctx) if ((coverAvail - amount) < minimumCover) return tecINSUFFICIENT_FUNDS; + // Allow returning frozen/locked assets to issuer for both IOUs and MPTs. + // When withdrawing to the issuer, ignore freeze since frozen IOUs and + // locked MPTs can both be sent back to their issuer. + FreezeHandling const freezeHandling = + (dstAcct == vaultAsset.getIssuer() || account == vaultAsset.getIssuer()) + ? FreezeHandling::fhIGNORE_FREEZE + : FreezeHandling::fhZERO_IF_FROZEN; + if (accountHolds( ctx.view, pseudoAccountID, vaultAsset, - FreezeHandling::fhZERO_IF_FROZEN, + freezeHandling, AuthHandling::ahZERO_IF_UNAUTHORIZED, ctx.j) < amount) return tecINSUFFICIENT_FUNDS; diff --git a/src/xrpld/app/tx/detail/VaultDeposit.cpp b/src/xrpld/app/tx/detail/VaultDeposit.cpp index 0ededc37a3..dc7f90cd4d 100644 --- a/src/xrpld/app/tx/detail/VaultDeposit.cpp +++ b/src/xrpld/app/tx/detail/VaultDeposit.cpp @@ -86,7 +86,8 @@ VaultDeposit::preclaim(PreclaimContext const& ctx) return vaultAsset.holds() ? tecFROZEN : tecLOCKED; // Cannot deposit if the shares of the vault are frozen - if (isFrozen(ctx.view, account, vaultShare)) + bool const isAssetIssuer = (account == vaultAsset.getIssuer()); + if (!isAssetIssuer && isFrozen(ctx.view, account, vaultShare)) return tecLOCKED; if (vault->isFlag(lsfVaultPrivate) && account != vault->at(sfOwner))