Compare commits

..

22 Commits

Author SHA1 Message Date
Ed Hennis
3783861578 Merge branch 'ximinez/lending-XLS-66-ongoing' into ximinez/lending-vault-payments 2025-12-05 21:29:36 -05:00
Ed Hennis
8eabad42dd Merge branch 'ximinez/lending-XLS-66-ongoing' into ximinez/lending-vault-payments 2025-12-05 21:13:37 -05:00
Ed Hennis
89de2b55f6 Merge branch 'ximinez/lending-XLS-66-ongoing' into ximinez/lending-vault-payments 2025-12-03 15:34:03 -05:00
Ed Hennis
06689d9cb5 Merge branch 'ximinez/lending-XLS-66-2' into ximinez/lending-vault-payments 2025-12-02 12:33:34 -05:00
Ed Hennis
3eaddcc2bc Merge branch 'ximinez/lending-XLS-66-2' into ximinez/lending-vault-payments 2025-12-01 16:50:28 -05:00
Ed Hennis
d9a44dbbbc Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-12-01 14:41:14 -05:00
Ed Hennis
d5d6b0c7cb Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-28 15:52:56 -05:00
Ed Hennis
f665463050 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-26 00:25:47 -05:00
Ed Hennis
c7d73fb938 Merge remote-tracking branch 'XRPLF/ximinez/lending-XLS-66' into ximinez/lending-vault-payments
* XRPLF/ximinez/lending-XLS-66:
  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:23:44 -05:00
Ed Hennis
c6ff9882f8 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-24 21:49:39 -05:00
Ed Hennis
f9027bb88f Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-24 21:42:57 -05:00
Ed Hennis
992a62a95a Merge remote-tracking branch 'XRPLF/ximinez/lending-XLS-66' into ximinez/lending-vault-payments
* XRPLF/ximinez/lending-XLS-66: (47 commits)
  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"
  Review feedback from @gregtatcam: compute vs. calculate
  ...
2025-11-24 21:41:21 -05:00
Ed Hennis
1484ec6640 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-21 14:35:02 -05:00
Ed Hennis
0d119161cf Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-18 22:51:33 -05:00
Ed Hennis
a224e089e6 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-15 03:09:07 -05:00
Ed Hennis
295c8bddae Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-13 14:45:42 -05:00
Ed Hennis
c2b3cd4069 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-13 12:20:42 -05:00
Ed Hennis
ef3fa22144 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-13 01:53:32 -05:00
Ed Hennis
e961d85819 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-12 20:12:26 -05:00
Ed Hennis
12ceb8bc86 Merge branch 'ximinez/lending-XLS-66' into ximinez/lending-vault-payments 2025-11-12 14:17:14 -05:00
Ed Hennis
078afb51d9 WIP: Make requireAuth recursive if the sender is a vault 2025-11-10 19:54:14 -05:00
Ed Hennis
bfac68e308 Make VaultWithdraw with destination use the payment engine
- Calls the same functions as LoanBrokerCoverWithdraw
- See b34f59eafc, 10b73525be, 6b4236343a, and e6e6360c1a
- Many unit test failures. I'm not sure how accurate they are
2025-11-10 19:54:14 -05:00
5 changed files with 44 additions and 46 deletions

View File

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

View File

@@ -2358,6 +2358,18 @@ 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);
@@ -2368,6 +2380,13 @@ 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,23 +1075,6 @@ 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).
@@ -1101,19 +1084,6 @@ 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.
@@ -1145,19 +1115,12 @@ 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 means mean we're trying to pay more than allowed (bug).
// shortage < 0 would 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,4 +1,6 @@
#include <xrpld/app/tx/detail/VaultWithdraw.h>
//
#include <xrpld/app/tx/detail/Payment.h>
#include <xrpl/ledger/CredentialHelpers.h>
#include <xrpl/ledger/View.h>
@@ -197,7 +199,7 @@ VaultWithdraw::doApply()
assetsAvailable -= assetsWithdrawn;
view().update(vault);
auto const& vaultAccount = vault->at(sfAccount);
AccountID const& vaultAccount = vault->at(sfAccount);
// Transfer shares from depositor to vault.
if (auto const ter = accountSend(
view(),