From 66dbc05a9fad9f336b995301cff35b51b7952efe Mon Sep 17 00:00:00 2001 From: Ed Hennis Date: Fri, 10 Oct 2025 12:54:39 -0400 Subject: [PATCH] Update ValidVault to allow LoanPay to change LossUnrealized - Making a payment on an impaired loan will unimpair the loan, which changes Vault.LossUnrealized. - Add a step in unit tests to impair a loan before making a payment, to verify, and prevent future similar regressions. - Resolves regression RIPD-3650 --- src/test/app/Loan_test.cpp | 6 ++++++ src/xrpld/app/tx/detail/InvariantCheck.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/app/Loan_test.cpp b/src/test/app/Loan_test.cpp index 7627289dc0..c7c601de3d 100644 --- a/src/test/app/Loan_test.cpp +++ b/src/test/app/Loan_test.cpp @@ -1856,6 +1856,12 @@ class Loan_test : public beast::unit_test::suite auto const borrowerBalanceBeforePayment = env.balance(borrower, broker.asset); + if (canImpairLoan(env, broker, state)) + // Making a payment will unimpair the loan + env(manage(lender, loanKeylet.key, tfLoanImpair)); + + env.close(); + // Make the payment env(pay(borrower, loanKeylet.key, transactionAmount)); diff --git a/src/xrpld/app/tx/detail/InvariantCheck.cpp b/src/xrpld/app/tx/detail/InvariantCheck.cpp index 67a09f1104..fa43579bd5 100644 --- a/src/xrpld/app/tx/detail/InvariantCheck.cpp +++ b/src/xrpld/app/tx/detail/InvariantCheck.cpp @@ -2857,7 +2857,7 @@ ValidVault::finalize( if (!beforeVault_.empty() && afterVault.lossUnrealized != beforeVault_[0].lossUnrealized && - tx.getTxnType() != ttLOAN_MANAGE) + txnType != ttLOAN_MANAGE && txnType != ttLOAN_PAY) { JLOG(j.fatal()) << // "Invariant failed: vault transaction must not change loss "