Compare commits

...

23 Commits

Author SHA1 Message Date
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
da9a483b79 Merge branch 'ximinez/develop-nolending' into ximinez/lending-XLS-66-2 2025-12-01 16:49:54 -05:00
Vito Tumas
f447827474 Fix overpayment asserts (#6084) 2025-12-01 14:59:12 -05:00
Ed Hennis
ff39388b93 Merge branch 'develop' into ximinez/develop-nolending 2025-12-01 14:41:46 -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
07497322de Merge branch 'ximinez/develop-nolending' into ximinez/lending-XLS-66-2 2025-12-01 14:40:27 -05:00
Ed Hennis
86e71daa86 Placeholder 2025-12-01 12:20:02 -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 51 additions and 18 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

@@ -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

@@ -187,9 +187,9 @@ class Feature_test : public beast::unit_test::suite
BEAST_EXPECTS(jrr[jss::status] == jss::success, "status");
jrr.removeMember(jss::status);
BEAST_EXPECT(jrr.size() == 1);
BEAST_EXPECT(
jrr.isMember("12523DF04B553A0B1AD74F42DDB741DE8DC06A03FC089A0EF197E"
"2A87F1D8107"));
BEAST_EXPECT(jrr.isMember(
"740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D6"
"28A06927F11"));
auto feature = *(jrr.begin());
BEAST_EXPECTS(feature[jss::name] == "fixAMMOverflowOffer", "name");

View File

@@ -547,6 +547,14 @@ tryOverpayment(
auto const deltas = rounded - newRounded;
// The change in loan management fee is equal to the change between the old
// and the new outstanding management fees
XRPL_ASSERT_PARTS(
deltas.managementFee ==
rounded.managementFeeDue - managementFeeOutstanding,
"ripple::detail::tryOverpayment",
"no fee change");
auto const hypotheticalValueOutstanding =
rounded.valueOutstanding - deltas.principal;
@@ -561,7 +569,6 @@ tryOverpayment(
"the loan. Ignore the overpayment";
return Unexpected(tesSUCCESS);
}
return LoanPaymentParts{
// Principal paid is the reduction in principal outstanding
.principalPaid = deltas.principal,
@@ -676,12 +683,6 @@ doOverpayment(
"ripple::detail::doOverpayment",
"principal change agrees");
XRPL_ASSERT_PARTS(
overpaymentComponents.trackedManagementFeeDelta ==
managementFeeOutstandingProxy - managementFeeOutstanding,
"ripple::detail::doOverpayment",
"no fee change");
// I'm not 100% sure the following asserts are correct. If in doubt, and
// everything else works, remove any that cause trouble.
@@ -712,13 +713,6 @@ doOverpayment(
"ripple::detail::doOverpayment",
"principal payment matches");
XRPL_ASSERT_PARTS(
loanPaymentParts.feePaid ==
overpaymentComponents.untrackedManagementFee +
overpaymentComponents.trackedManagementFeeDelta,
"ripple::detail::doOverpayment",
"fee payment matches");
// All validations passed, so update the proxy objects (which will
// modify the actual Loan ledger object)
totalValueOutstandingProxy = totalValueOutstanding;

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(),