Compare commits

..

20 Commits

Author SHA1 Message Date
Ed Hennis
3d41fabf48 Merge branch 'ximinez/lending-XLS-66-ongoing' into ximinez/lending-shortages 2025-12-05 21:29:49 -05:00
Ed Hennis
5aab5de8cd Merge branch 'ximinez/lending-XLS-66-ongoing' into ximinez/lending-shortages 2025-12-05 21:13:55 -05:00
Ed Hennis
89d17442e2 Merge branch 'ximinez/lending-XLS-66-ongoing' into ximinez/lending-shortages 2025-12-03 15:34:17 -05:00
Ed Hennis
bb5585e34b Merge branch 'ximinez/lending-XLS-66-2' into ximinez/lending-shortages 2025-12-02 12:33:19 -05:00
Ed Hennis
abff92d52c Merge branch 'ximinez/lending-XLS-66-2' into ximinez/lending-shortages 2025-12-01 16:50:45 -05:00
Ed Hennis
b9ca539c49 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-12-01 14:41:36 -05:00
Ed Hennis
3b1bc3d497 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-28 15:53:14 -05:00
Ed Hennis
c58f5abcc9 Merge remote-tracking branch 'XRPLF/ximinez/lending-XLS-66' into ximinez/lending-shortages
* XRPLF/ximinez/lending-XLS-66:
  ci: Trigger clio pipeline on PRs targeting release branches (6080)
  Review feedback from @shawnxie999: MPT Clawback
  Move the ValidPseudoAccounts class back to its original location
  Fix formatting again
  refactor: Retire Flow and FlowSortStrands amendments (6054)
  Add additional documentation to Lending Protocol (6037)
2025-11-26 00:30:06 -05:00
Ed Hennis
4760885955 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-24 21:49:54 -05:00
Ed Hennis
3249461379 Merge remote-tracking branch 'XRPLF/ximinez/lending-XLS-66' into ximinez/lending-shortages
* XRPLF/ximinez/lending-XLS-66: (48 commits)
  Fix formatting
  Review feedback from @gregtatcam: typo
  Review feedback from @Tapanito, @gregtatcam, and @shawnxie999
  Update src/xrpld/app/tx/detail/LoanBrokerCoverClawback.cpp
  Fix formatting
  Add deep freeze check to LoanBrokerDelete (6053)
  Fix build error with LoanBroker invariant
  Address a couple of feedback items from @Tapanito and @shawnxie999:
  Review feedback from @shawnxie999: removeEmptyHolding
  Review feedback from @shawnxie999: broker owner count
  Update src/xrpld/app/tx/detail/LoanBrokerCoverClawback.cpp
  Update src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp
  Update src/xrpld/app/tx/detail/LoanBrokerSet.cpp
  Add a LoanBroker invariant to compare CoverAvailable to balance
  refactor: Retire RequireFullyCanonicalSig amendment (6035)
  refactor: Retire DeletableAccounts amendment (6056)
  refactor: Retire CryptoConditionsSuite amendment (6036)
  Review feedback from @gregtatcam: variable name
  Review feedback from @gregtatcam: readability
  From discussion with @gregtatcam: Revert "Payment"
  ...
2025-11-24 21:47:45 -05:00
Ed Hennis
11479cdf68 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-21 14:38:54 -05:00
Ed Hennis
27af46b111 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-18 22:51:48 -05:00
Ed Hennis
5e860ec749 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-15 03:13:07 -05:00
Ed Hennis
4719e05d89 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-13 14:46:25 -05:00
Ed Hennis
c8394eb52f Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-13 12:21:27 -05:00
Ed Hennis
5a3df22cea Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-13 01:53:46 -05:00
Ed Hennis
b44859ff15 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-12 20:12:43 -05:00
Ed Hennis
fe8d931992 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-shortages 2025-11-12 14:17:31 -05:00
Ed Hennis
0008e2d1db Revert "Partially revert aed8e2b166 Fill in payment computation shortages (#5941)"
This reverts commit 95fdbe520f.
2025-11-10 19:54:56 -05:00
Ed Hennis
060b6d3231 Revert "Remove the shortage code completely"
This reverts commit 165478b929.
2025-11-10 19:54:56 -05:00
5 changed files with 46 additions and 44 deletions

View File

@@ -3176,24 +3176,6 @@ requireAuth(
!isTesSuccess(err))
return err;
}
// requireAuth is also recursive if the _account_ is a vault
auto const sleAccount = view.read(keylet::account(account));
if (!sleAccount)
return tefINTERNAL; // LCOV_EXCL_LINE
if (sleAccount->isFieldPresent(sfVaultID))
{
auto const sleVault =
view.read(keylet::vault(sleAccount->getFieldH256(sfVaultID)));
if (!sleVault)
return tefINTERNAL; // LCOV_EXCL_LINE
auto const ownerAcct = sleVault->getAccountID(sfOwner);
if (auto const err =
requireAuth(view, mptIssue, ownerAcct, authType, depth + 1);
!isTesSuccess(err))
return err;
}
}
auto const mptokenID = keylet::mptoken(mptID.key, account);

View File

@@ -2738,8 +2738,12 @@ protected:
broker.params.managementFeeRate);
BEAST_EXPECT(
paymentComponents.trackedValueDelta <=
roundedPeriodicPayment);
paymentComponents.trackedValueDelta ==
roundedPeriodicPayment ||
(paymentComponents.specialCase ==
detail::PaymentSpecialCase::final &&
paymentComponents.trackedValueDelta <
roundedPeriodicPayment));
ripple::LoanState const nextTrueState = computeRawLoanState(
state.periodicPayment,

View File

@@ -2358,18 +2358,6 @@ class Vault_test : public beast::unit_test::suite
.amount = asset(100)});
env(tx, ter(tecNO_AUTH));
// Withdrawal to other (authorized) accounts doesn't work.
// Issuer would have to VaultClawback
tx[sfDestination] = issuer.human();
env(tx, ter(tecNO_AUTH));
tx[sfDestination] = owner.human();
env(tx, ter(tecNO_AUTH));
env.close();
// Issuer reauthorizes
mptt.authorize({.account = issuer, .holder = depositor});
env.close();
// Withdrawal to other (authorized) accounts works
tx[sfDestination] = issuer.human();
env(tx);
@@ -2380,13 +2368,6 @@ class Vault_test : public beast::unit_test::suite
env.close();
}
// Re-unauthorize
mptt.authorize(
{.account = issuer,
.holder = depositor,
.flags = tfMPTUnauthorize});
env.close();
{
// Cannot deposit some more
auto tx = vault.deposit(

View File

@@ -1075,6 +1075,23 @@ computePaymentComponents(
"ripple::detail::computePaymentComponents",
"excess non-negative");
};
auto giveTo =
[](Number& component, Number& shortage, Number const& maximum) {
if (shortage > beast::zero)
{
// Put as much of the shortage as we can into the provided part
// and the total
auto part = std::min(maximum - component, shortage);
component += part;
shortage -= part;
}
// If the shortage goes negative, we put too much, which should be
// impossible
XRPL_ASSERT_PARTS(
shortage >= beast::zero,
"ripple::detail::computePaymentComponents",
"excess non-negative");
};
// Helper to reduce deltas when they collectively exceed a limit.
// Order matters: we prefer to reduce interest first (most flexible),
// then management fee, then principal (least flexible).
@@ -1084,6 +1101,19 @@ computePaymentComponents(
takeFrom(deltas.managementFee, excess);
takeFrom(deltas.principal, excess);
};
// Helper to increase deltas when they collectively do not reach an
// expected value.
// Order matters: we prefer to increase interest first (most flexible),
// then management fee, then principal (least flexible).
auto addressShortage = [&giveTo](
LoanDeltas& deltas,
Number& shortage,
LoanState const& current) {
giveTo(deltas.interestDueDelta, shortage, current.interestDue);
giveTo(
deltas.managementFeeDueDelta, shortage, current.managementFeeDue);
giveTo(deltas.principalDelta, shortage, current.principalOutstanding);
};
// Check if deltas exceed the total outstanding value. This should never
// happen due to earlier caps, but handle it defensively.
@@ -1115,12 +1145,19 @@ computePaymentComponents(
addressExcess(deltas, excess);
shortage = -excess;
}
else if (shortage > beast::zero && totalOverpayment < beast::zero)
{
// If there's a shortage, and there's room in the loan itself, we can
// top up the parts to make the payment correct.
shortage = std::min(-totalOverpayment, shortage);
addressShortage(deltas, shortage, currentLedgerState);
}
// At this point, shortage >= 0 means we're paying less than the full
// periodic payment (due to rounding or component caps).
// shortage < 0 would mean we're trying to pay more than allowed (bug).
// shortage < 0 means mean we're trying to pay more than allowed (bug).
XRPL_ASSERT_PARTS(
shortage >= beast::zero,
shortage == beast::zero,
"ripple::detail::computePaymentComponents",
"no shortage or excess");

View File

@@ -1,6 +1,4 @@
#include <xrpld/app/tx/detail/VaultWithdraw.h>
//
#include <xrpld/app/tx/detail/Payment.h>
#include <xrpl/ledger/CredentialHelpers.h>
#include <xrpl/ledger/View.h>
@@ -199,7 +197,7 @@ VaultWithdraw::doApply()
assetsAvailable -= assetsWithdrawn;
view().update(vault);
AccountID const& vaultAccount = vault->at(sfAccount);
auto const& vaultAccount = vault->at(sfAccount);
// Transfer shares from depositor to vault.
if (auto const ter = accountSend(
view(),