From 1fbdc98242fb3b5ae95c72c9b17d229fb2dcf01d Mon Sep 17 00:00:00 2001 From: JCW Date: Mon, 27 Jul 2026 15:54:05 +0100 Subject: [PATCH] Refactor `checkLoanFreeze` --- src/libxrpl/ledger/helpers/LendingHelpers.cpp | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/libxrpl/ledger/helpers/LendingHelpers.cpp b/src/libxrpl/ledger/helpers/LendingHelpers.cpp index 3aa107601f..a09f89da25 100644 --- a/src/libxrpl/ledger/helpers/LendingHelpers.cpp +++ b/src/libxrpl/ledger/helpers/LendingHelpers.cpp @@ -2158,8 +2158,16 @@ checkLoanFreeze( if (auto const ter = canAddHolding(view, asset)) return ter; - // vaultPseudo is going to send funds, so it can't be frozen. - if (auto const ret = checkFrozen(view, vaultPseudo, asset)) + // A global freeze on the asset blocks every leg of the loan regardless of + // which account is involved, so check it once up front. + if (auto const ret = checkGlobalFrozen(view, asset)) + { + JLOG(j.warn()) << "Loan asset is globally frozen."; + return ret; + } + + // vaultPseudo is going to send funds, so it can't be individually frozen. + if (auto const ret = checkIndividualFrozen(view, vaultPseudo, asset)) { JLOG(j.warn()) << "Vault pseudo-account is frozen."; return ret; @@ -2175,10 +2183,10 @@ checkLoanFreeze( } // borrower is eventually going to have to pay back the loan, so it can't be - // frozen now. It is also going to receive funds, so it can't be deep - // frozen, but being frozen is a prerequisite for being deep frozen, so - // checking the one is sufficient. - if (auto const ret = checkFrozen(view, borrower, asset)) + // individually frozen now. It is also going to receive funds, so it can't + // be deep frozen, but being individually frozen is a prerequisite for being + // deep frozen, so checking the one is sufficient. + if (auto const ret = checkIndividualFrozen(view, borrower, asset)) { JLOG(j.warn()) << "Borrower account is frozen."; return ret;