From 13c98004487afe2b21d0e4e028f4abaaf8ebcc5e Mon Sep 17 00:00:00 2001 From: Vito <5780819+Tapanito@users.noreply.github.com> Date: Wed, 15 Jul 2026 14:56:57 +0200 Subject: [PATCH] refactor: Address review feedback on payment-type split Extract loanRatesFor() to replace the identical 4-line managementFeeRate/interestRate/periodicRate preamble repeated in makeFullPayment, makeLatePayment, and makeRegularPayment. Clarify the constructLoanState(SLE::const_ref) doc comment to note it's an overload of the 3-Number constructLoanState() above it, rather than reading as a standalone function. --- include/xrpl/ledger/helpers/LendingHelpers.h | 5 +-- src/libxrpl/ledger/helpers/LendingHelpers.cpp | 32 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/include/xrpl/ledger/helpers/LendingHelpers.h b/include/xrpl/ledger/helpers/LendingHelpers.h index 5f146c52df..8e0d11cccb 100644 --- a/include/xrpl/ledger/helpers/LendingHelpers.h +++ b/include/xrpl/ledger/helpers/LendingHelpers.h @@ -263,8 +263,9 @@ constructLoanState( Number const& principalOutstanding, Number const& managementFeeOutstanding); -// Constructs a valid LoanState object from a Loan object, which always has -// rounded values +// Overload of constructLoanState() that reads the three tracked fields +// directly from a Loan ledger object, which always holds rounded values, +// rather than taking them as separate Number arguments. LoanState constructLoanState(SLE::const_ref loan); diff --git a/src/libxrpl/ledger/helpers/LendingHelpers.cpp b/src/libxrpl/ledger/helpers/LendingHelpers.cpp index de2f29b8c3..0bd3befe16 100644 --- a/src/libxrpl/ledger/helpers/LendingHelpers.cpp +++ b/src/libxrpl/ledger/helpers/LendingHelpers.cpp @@ -1408,6 +1408,20 @@ computeOverpaymentComponents( return result; } +/* Derives the two rate values every make*Payment() helper needs: the + * broker's management fee rate, and the loan's periodic (per-payment-period) + * interest rate. + */ +std::pair +loanRatesFor(SLE::const_ref loan, SLE::const_ref brokerSle) +{ + TenthBips16 const managementFeeRate{brokerSle->at(sfManagementFeeRate)}; + TenthBips32 const interestRate{loan->at(sfInterestRate)}; + Number const periodicRate = loanPeriodicRate(interestRate, loan->at(sfPaymentInterval)); + XRPL_ASSERT(interestRate == 0 || periodicRate > 0, "xrpl::detail::loanRatesFor : valid rate"); + return {managementFeeRate, periodicRate}; +} + /* Handles a full (early payoff) payment. Implements the "full payment" * branch of the make_payment function from the XLS-66 spec, Section * 3.2.4.4. @@ -1421,11 +1435,7 @@ makeFullPayment( STAmount const& amount, beast::Journal j) { - TenthBips16 const managementFeeRate{brokerSle->at(sfManagementFeeRate)}; - TenthBips32 const interestRate{loan->at(sfInterestRate)}; - Number const periodicRate = loanPeriodicRate(interestRate, loan->at(sfPaymentInterval)); - XRPL_ASSERT( - interestRate == 0 || periodicRate > 0, "xrpl::detail::makeFullPayment : valid rate"); + auto const [managementFeeRate, periodicRate] = loanRatesFor(loan, brokerSle); auto const fullPaymentComponents = computeFullPayment(asset, view, loan, periodicRate, amount, managementFeeRate, j); @@ -1450,11 +1460,7 @@ makeLatePayment( STAmount const& amount, beast::Journal j) { - TenthBips16 const managementFeeRate{brokerSle->at(sfManagementFeeRate)}; - TenthBips32 const interestRate{loan->at(sfInterestRate)}; - Number const periodicRate = loanPeriodicRate(interestRate, loan->at(sfPaymentInterval)); - XRPL_ASSERT( - interestRate == 0 || periodicRate > 0, "xrpl::detail::makeLatePayment : valid rate"); + auto const [managementFeeRate, periodicRate] = loanRatesFor(loan, brokerSle); Number const serviceFee = loan->at(sfLoanServiceFee); ExtendedPaymentComponents const periodic{ @@ -1496,11 +1502,7 @@ makeRegularPayment( "xrpl::detail::makeRegularPayment", "regular payment type"); - TenthBips16 const managementFeeRate{brokerSle->at(sfManagementFeeRate)}; - TenthBips32 const interestRate{loan->at(sfInterestRate)}; - Number const periodicRate = loanPeriodicRate(interestRate, loan->at(sfPaymentInterval)); - XRPL_ASSERT( - interestRate == 0 || periodicRate > 0, "xrpl::detail::makeRegularPayment : valid rate"); + auto const [managementFeeRate, periodicRate] = loanRatesFor(loan, brokerSle); std::int32_t const loanScale = loan->at(sfLoanScale); Number const serviceFee = loan->at(sfLoanServiceFee);