diff --git a/include/xrpl/ledger/PaymentSandbox.h b/include/xrpl/ledger/PaymentSandbox.h index 223a3c0c5a..0c4e4bcd41 100644 --- a/include/xrpl/ledger/PaymentSandbox.h +++ b/include/xrpl/ledger/PaymentSandbox.h @@ -21,9 +21,8 @@ private: struct ValueIOU { explicit ValueIOU() = default; - - STAmount lowAcctCredits; - STAmount highAcctCredits; + STAmount lowAcctDebits; + STAmount highAcctDebits; STAmount lowAcctOrigBalance; }; @@ -230,13 +229,6 @@ public: apply(PaymentSandbox& to); /** @} */ - // Return a map of balance changes on trust lines. The low account is the - // first account in the key. If the two accounts are equal, the map contains - // the total changes in currency regardless of issuer. This is useful to get - // the total change in XRP balances. - std::map, STAmount> - balanceChanges(ReadView const& view) const; - XRPAmount xrpDestroyed() const; diff --git a/include/xrpl/tx/transactors/lending/LendingHelpers.h b/include/xrpl/ledger/helpers/LendingHelpers.h similarity index 99% rename from include/xrpl/tx/transactors/lending/LendingHelpers.h rename to include/xrpl/ledger/helpers/LendingHelpers.h index 1c938bbc8a..81d14477ef 100644 --- a/include/xrpl/tx/transactors/lending/LendingHelpers.h +++ b/include/xrpl/ledger/helpers/LendingHelpers.h @@ -1,15 +1,14 @@ #pragma once #include +#include #include namespace xrpl { -struct PreflightContext; - // Lending protocol has dependencies, so capture them here. bool -checkLendingProtocolDependencies(PreflightContext const& ctx); +checkLendingProtocolDependencies(Rules const& rules, STTx const& tx); static constexpr std::uint32_t secondsInYear = 365 * 24 * 60 * 60; diff --git a/include/xrpl/tx/paths/detail/FlowDebugInfo.h b/include/xrpl/tx/paths/detail/FlowDebugInfo.h index dd7a0bb9c5..0f4abae2fe 100644 --- a/include/xrpl/tx/paths/detail/FlowDebugInfo.h +++ b/include/xrpl/tx/paths/detail/FlowDebugInfo.h @@ -327,27 +327,4 @@ writeDiffs(std::ostringstream& ostr, Iter begin, Iter end) ostr << ']'; }; -using BalanceDiffs = - std::pair, STAmount>, XRPAmount>; - -inline BalanceDiffs -balanceDiffs(PaymentSandbox const& sb, ReadView const& rv) -{ - return {sb.balanceChanges(rv), sb.xrpDestroyed()}; -} - -inline std::string -balanceDiffsToString(std::optional const& bd) -{ - if (!bd) - return std::string{}; - auto const& diffs = bd->first; - auto const& xrpDestroyed = bd->second; - std::ostringstream ostr; - ostr << ", xrpDestroyed: " << to_string(xrpDestroyed); - ostr << ", balanceDiffs: "; - writeDiffs(ostr, diffs.begin(), diffs.end()); - return ostr.str(); -}; - } // namespace xrpl::path::detail diff --git a/include/xrpl/tx/paths/detail/StrandFlow.h b/include/xrpl/tx/paths/detail/StrandFlow.h index 306a0b33e7..6a8367f4df 100644 --- a/include/xrpl/tx/paths/detail/StrandFlow.h +++ b/include/xrpl/tx/paths/detail/StrandFlow.h @@ -527,14 +527,6 @@ public: { return cur_.size(); } - - void - removeIndex(std::size_t i) - { - if (i >= next_.size()) - return; - next_.erase(next_.begin() + i); - } }; /// @endcond @@ -661,11 +653,6 @@ flow( std::optional best; if (flowDebugInfo) flowDebugInfo->newLiquidityPass(); - // Index of strand to mark as inactive (remove from the active list) if - // the liquidity is used. This is used for strands that consume too many - // offers Constructed as `false,0` to workaround a gcc warning about - // uninitialized variables - std::optional markInactiveOnUse; for (size_t strandIndex = 0, sie = activeStrands.size(); strandIndex != sie; ++strandIndex) { Strand const* strand = activeStrands.get(strandIndex); @@ -729,11 +716,6 @@ flow( if (best) { - if (markInactiveOnUse) - { - activeStrands.removeIndex(*markInactiveOnUse); - markInactiveOnUse.reset(); - } savedIns.insert(best->in); savedOuts.insert(best->out); remainingOut = outReq - sum(savedOuts); diff --git a/include/xrpl/tx/transactors/lending/LoanSet.h b/include/xrpl/tx/transactors/lending/LoanSet.h index c778582ab0..3ede5adc4c 100644 --- a/include/xrpl/tx/transactors/lending/LoanSet.h +++ b/include/xrpl/tx/transactors/lending/LoanSet.h @@ -1,7 +1,7 @@ #pragma once +#include #include -#include namespace xrpl { diff --git a/src/libxrpl/ledger/PaymentSandbox.cpp b/src/libxrpl/ledger/PaymentSandbox.cpp index 6b38c4840c..ef6e4be8ad 100644 --- a/src/libxrpl/ledger/PaymentSandbox.cpp +++ b/src/libxrpl/ledger/PaymentSandbox.cpp @@ -4,20 +4,16 @@ #include #include #include -#include #include #include -#include #include #include -#include #include #include #include #include #include -#include #include #include #include @@ -58,14 +54,14 @@ DeferredCredits::creditIOU( if (sender < receiver) { - v.highAcctCredits = amount; - v.lowAcctCredits = amount.zeroed(); + v.lowAcctDebits = amount; + v.highAcctDebits = amount.zeroed(); v.lowAcctOrigBalance = preCreditSenderBalance; } else { - v.highAcctCredits = amount.zeroed(); - v.lowAcctCredits = amount; + v.lowAcctDebits = amount.zeroed(); + v.highAcctDebits = amount; v.lowAcctOrigBalance = -preCreditSenderBalance; } @@ -77,11 +73,11 @@ DeferredCredits::creditIOU( auto& v = i->second; if (sender < receiver) { - v.highAcctCredits += amount; + v.lowAcctDebits += amount; } else { - v.lowAcctCredits += amount; + v.highAcctDebits += amount; } } } @@ -212,11 +208,11 @@ DeferredCredits::adjustmentsIOU( if (main < other) { - result.emplace(v.highAcctCredits, v.lowAcctCredits, v.lowAcctOrigBalance); + result.emplace(v.lowAcctDebits, v.highAcctDebits, v.lowAcctOrigBalance); return result; } - result.emplace(v.lowAcctCredits, v.highAcctCredits, -v.lowAcctOrigBalance); + result.emplace(v.highAcctDebits, v.lowAcctDebits, -v.lowAcctOrigBalance); return result; } @@ -239,8 +235,8 @@ DeferredCredits::apply(DeferredCredits& to) { auto& toVal = r.first->second; auto const& fromVal = i.second; - toVal.lowAcctCredits += fromVal.lowAcctCredits; - toVal.highAcctCredits += fromVal.highAcctCredits; + toVal.lowAcctDebits += fromVal.lowAcctDebits; + toVal.highAcctDebits += fromVal.highAcctDebits; // Do not update the orig balance, it's already correct } } @@ -467,131 +463,6 @@ PaymentSandbox::apply(PaymentSandbox& to) tab_.apply(to.tab_); } -std::map, STAmount> -PaymentSandbox::balanceChanges(ReadView const& view) const -{ - using key_t = std::tuple; - // Map of delta trust lines. As a special case, when both ends of the trust - // line are the same currency, then it's delta currency for that issuer. To - // get the change in XRP balance, Account == root, issuer == root, currency - // == XRP - std::map result; - - // populate a dictionary with low/high/currency/delta. This can be - // compared with the other versions payment code. - auto each = [&result]( - uint256 const& key, - bool isDelete, - std::shared_ptr const& before, - std::shared_ptr const& after) { - STAmount oldBalance; - STAmount newBalance; - AccountID lowID; - AccountID highID; - - // before is read from prev view - if (isDelete) - { - if (!before) - return; - - auto const bt = before->getType(); - switch (bt) - { - case ltACCOUNT_ROOT: - lowID = xrpAccount(); - highID = (*before)[sfAccount]; - oldBalance = (*before)[sfBalance]; - newBalance = oldBalance.zeroed(); - break; - case ltRIPPLE_STATE: - lowID = (*before)[sfLowLimit].getIssuer(); - highID = (*before)[sfHighLimit].getIssuer(); - oldBalance = (*before)[sfBalance]; - newBalance = oldBalance.zeroed(); - break; - case ltOFFER: - // TBD - break; - default: - break; - } - } - else if (!before) - { - // insert - auto const at = after->getType(); - switch (at) - { - case ltACCOUNT_ROOT: - lowID = xrpAccount(); - highID = (*after)[sfAccount]; - newBalance = (*after)[sfBalance]; - oldBalance = newBalance.zeroed(); - break; - case ltRIPPLE_STATE: - lowID = (*after)[sfLowLimit].getIssuer(); - highID = (*after)[sfHighLimit].getIssuer(); - newBalance = (*after)[sfBalance]; - oldBalance = newBalance.zeroed(); - break; - case ltOFFER: - // TBD - break; - default: - break; - } - } - else - { - // modify - auto const at = after->getType(); - XRPL_ASSERT( - at == before->getType(), - "xrpl::PaymentSandbox::balanceChanges : after and before " - "types matching"); - switch (at) - { - case ltACCOUNT_ROOT: - lowID = xrpAccount(); - highID = (*after)[sfAccount]; - oldBalance = (*before)[sfBalance]; - newBalance = (*after)[sfBalance]; - break; - case ltRIPPLE_STATE: - lowID = (*after)[sfLowLimit].getIssuer(); - highID = (*after)[sfHighLimit].getIssuer(); - oldBalance = (*before)[sfBalance]; - newBalance = (*after)[sfBalance]; - break; - case ltOFFER: - // TBD - break; - default: - break; - } - } - // The following are now set, put them in the map - auto delta = newBalance - oldBalance; - auto const cur = newBalance.get().currency; - result[std::make_tuple(lowID, highID, cur)] = delta; - auto r = result.emplace(std::make_tuple(lowID, lowID, cur), delta); - if (r.second) - { - r.first->second += delta; - } - - delta.negate(); - r = result.emplace(std::make_tuple(highID, highID, cur), delta); - if (r.second) - { - r.first->second += delta; - } - }; - items_.visit(view, each); - return result; -} - XRPAmount PaymentSandbox::xrpDestroyed() const { diff --git a/src/libxrpl/tx/transactors/lending/LendingHelpers.cpp b/src/libxrpl/ledger/helpers/LendingHelpers.cpp similarity index 99% rename from src/libxrpl/tx/transactors/lending/LendingHelpers.cpp rename to src/libxrpl/ledger/helpers/LendingHelpers.cpp index dea8dbbd34..caccca752d 100644 --- a/src/libxrpl/tx/transactors/lending/LendingHelpers.cpp +++ b/src/libxrpl/ledger/helpers/LendingHelpers.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -7,18 +7,19 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include +#include +#include #include #include -#include #include #include @@ -28,9 +29,18 @@ namespace xrpl { bool -checkLendingProtocolDependencies(PreflightContext const& ctx) +checkLendingProtocolDependencies(Rules const& rules, STTx const& tx) { - return ctx.rules.enabled(featureSingleAssetVault) && VaultCreate::checkExtraFeatures(ctx); + if (!rules.enabled(featureSingleAssetVault)) + return false; + + if (!rules.enabled(featureMPTokensV1)) + return false; + + if (tx.isFieldPresent(sfDomainID) && !rules.enabled(featurePermissionedDomains)) + return false; + + return true; } LoanPaymentParts& diff --git a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp index d47b49e910..c3987ddb03 100644 --- a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp @@ -94,7 +94,11 @@ transferRate(ReadView const& view, MPTID const& issuanceID) // which represents 50% of 1,000,000,000 if (auto const sle = view.read(keylet::mptIssuance(issuanceID)); sle && sle->isFieldPresent(sfTransferFee)) - return Rate{1'000'000'000u + (10'000 * sle->getFieldU16(sfTransferFee))}; + { + auto const fee = sle->getFieldU16(sfTransferFee); + XRPL_ASSERT(fee <= maxTransferFee, "xrpl::transferRate : fee is too large"); + return Rate{1'000'000'000u + (10'000 * fee)}; + } return parityRate; } @@ -160,7 +164,7 @@ authorizeMPToken( // When a holder wants to unauthorize/delete a MPT, the ledger must // - delete mptokenKey from owner directory // - delete the MPToken - if ((flags & tfMPTUnauthorize) != 0) + if ((flags & tfMPTUnauthorize) != 0u) { auto const mptokenKey = keylet::mptoken(mptIssuanceID, account); auto const sleMpt = view.peek(mptokenKey); @@ -242,7 +246,7 @@ authorizeMPToken( // Issuer wants to unauthorize the holder, unset lsfMPTAuthorized on // their MPToken - if ((flags & tfMPTUnauthorize) != 0) + if ((flags & tfMPTUnauthorize) != 0u) { flagsOut &= ~lsfMPTAuthorized; } diff --git a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp index 2d21cebbe3..119f244185 100644 --- a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp +++ b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp @@ -631,7 +631,6 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel) return {tecEXPIRED, true}; } - bool const bOpenLedger = sb.open(); bool crossed = false; if (isTesSuccess(result)) @@ -720,7 +719,7 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel) stream << " out: " << format_amount(place_offer.out); } - if (result == tecFAILED_PROCESSING && bOpenLedger) + if (result == tecFAILED_PROCESSING && sb.open()) result = telFAILED_PROCESSING; if (!isTesSuccess(result)) diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp index 16f95dd357..36ff1cc2de 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverClawback.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include @@ -36,7 +36,7 @@ namespace xrpl { bool LoanBrokerCoverClawback::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp index 36b5cab618..9b43269ec3 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverDeposit.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -12,7 +13,6 @@ #include #include #include -#include #include @@ -21,7 +21,7 @@ namespace xrpl { bool LoanBrokerCoverDeposit::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp index c8479e941d..7061ec99c3 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerCoverWithdraw.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include #include @@ -26,7 +26,7 @@ namespace xrpl { bool LoanBrokerCoverWithdraw::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp index 6f774eaeae..6b1abe45aa 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -15,7 +16,6 @@ #include #include #include -#include #include @@ -24,7 +24,7 @@ namespace xrpl { bool LoanBrokerDelete::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp index 3322df9fe3..561890abbf 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -18,7 +19,6 @@ #include #include #include -#include #include #include @@ -28,7 +28,7 @@ namespace xrpl { bool LoanBrokerSet::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC diff --git a/src/libxrpl/tx/transactors/lending/LoanDelete.cpp b/src/libxrpl/tx/transactors/lending/LoanDelete.cpp index 28948a4139..784bef7d78 100644 --- a/src/libxrpl/tx/transactors/lending/LoanDelete.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanDelete.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include // IWYU pragma: keep @@ -14,7 +15,6 @@ #include #include #include -#include #include @@ -23,7 +23,7 @@ namespace xrpl { bool LoanDelete::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } NotTEC diff --git a/src/libxrpl/tx/transactors/lending/LoanManage.cpp b/src/libxrpl/tx/transactors/lending/LoanManage.cpp index 1b87421e71..87afc2d908 100644 --- a/src/libxrpl/tx/transactors/lending/LoanManage.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanManage.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -22,7 +23,6 @@ #include #include #include -#include #include #include @@ -33,7 +33,7 @@ namespace xrpl { bool LoanManage::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } std::uint32_t diff --git a/src/libxrpl/tx/transactors/lending/LoanPay.cpp b/src/libxrpl/tx/transactors/lending/LoanPay.cpp index 8360303fd8..c08518a93e 100644 --- a/src/libxrpl/tx/transactors/lending/LoanPay.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanPay.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -23,7 +24,6 @@ #include #include #include -#include #include #include @@ -36,7 +36,7 @@ namespace xrpl { bool LoanPay::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } std::uint32_t diff --git a/src/libxrpl/tx/transactors/lending/LoanSet.cpp b/src/libxrpl/tx/transactors/lending/LoanSet.cpp index 1027fdea9f..48a6005c7b 100644 --- a/src/libxrpl/tx/transactors/lending/LoanSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanSet.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include @@ -40,7 +40,7 @@ namespace xrpl { bool LoanSet::checkExtraFeatures(PreflightContext const& ctx) { - return checkLendingProtocolDependencies(ctx); + return checkLendingProtocolDependencies(ctx.rules, ctx.tx); } std::uint32_t diff --git a/src/libxrpl/tx/transactors/payment/Payment.cpp b/src/libxrpl/tx/transactors/payment/Payment.cpp index 644d5210c0..8ea79e0840 100644 --- a/src/libxrpl/tx/transactors/payment/Payment.cpp +++ b/src/libxrpl/tx/transactors/payment/Payment.cpp @@ -431,6 +431,7 @@ Payment::doApply() sleDst = std::make_shared(k); sleDst->setAccountID(sfAccount, dstAccountID); sleDst->setFieldU32(sfSequence, view().seq()); + sleDst->setFieldAmount(sfBalance, XRPAmount(beast::zero)); view().insert(sleDst); } diff --git a/src/test/app/LendingHelpers_test.cpp b/src/test/app/LendingHelpers_test.cpp index 1e43c45104..82c80f0158 100644 --- a/src/test/app/LendingHelpers_test.cpp +++ b/src/test/app/LendingHelpers_test.cpp @@ -6,8 +6,8 @@ #include #include +#include #include -#include #include #include diff --git a/src/test/app/Loan_test.cpp b/src/test/app/Loan_test.cpp index 8d919d7dd3..a6d642badc 100644 --- a/src/test/app/Loan_test.cpp +++ b/src/test/app/Loan_test.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -55,7 +56,6 @@ #include #include #include -#include #include #include