From 1c9168b29fd3e59e0c4c19f487f2041b17cf2ec6 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 1 Jul 2026 18:17:29 -0400 Subject: [PATCH] refactor: Adjustment struct (#7680) --- .../xrpl/ledger/helpers/AccountRootHelpers.h | 25 ++++++++----------- include/xrpl/ledger/helpers/EscrowHelpers.h | 8 +++--- .../ledger/helpers/AccountRootHelpers.cpp | 22 ++++++---------- src/libxrpl/ledger/helpers/MPTokenHelpers.cpp | 2 +- src/libxrpl/ledger/helpers/NFTokenHelpers.cpp | 3 ++- .../ledger/helpers/RippleStateHelpers.cpp | 4 +-- .../tx/transactors/Sponsor/SponsorshipSet.cpp | 6 ++--- .../Sponsor/SponsorshipTransfer.cpp | 18 +++++-------- .../tx/transactors/account/SignerListSet.cpp | 3 +-- .../tx/transactors/bridge/XChainBridge.cpp | 6 ++--- .../tx/transactors/check/CheckCash.cpp | 8 +++++- .../tx/transactors/check/CheckCreate.cpp | 8 +++++- .../credentials/CredentialAccept.cpp | 2 +- .../credentials/CredentialCreate.cpp | 2 +- .../tx/transactors/delegate/DelegateSet.cpp | 8 +++++- .../tx/transactors/dex/AMMWithdraw.cpp | 5 ++-- .../tx/transactors/dex/OfferCreate.cpp | 2 +- src/libxrpl/tx/transactors/did/DIDSet.cpp | 3 ++- .../tx/transactors/escrow/EscrowCreate.cpp | 7 +++--- .../tx/transactors/oracle/OracleSet.cpp | 3 ++- .../tx/transactors/payment/DepositPreauth.cpp | 4 +-- .../payment_channel/PaymentChannelCreate.cpp | 5 ++-- .../payment_channel/PaymentChannelFund.cpp | 4 +-- .../PermissionedDomainSet.cpp | 3 ++- .../tx/transactors/system/TicketCreate.cpp | 6 ++++- .../token/MPTokenIssuanceCreate.cpp | 2 +- src/libxrpl/tx/transactors/token/TrustSet.cpp | 22 ++++++++++++---- 27 files changed, 104 insertions(+), 87 deletions(-) diff --git a/include/xrpl/ledger/helpers/AccountRootHelpers.h b/include/xrpl/ledger/helpers/AccountRootHelpers.h index ca86293b34..ec4bebdd45 100644 --- a/include/xrpl/ledger/helpers/AccountRootHelpers.h +++ b/include/xrpl/ledger/helpers/AccountRootHelpers.h @@ -39,6 +39,12 @@ isGlobalFrozen(ReadView const& view, AccountID const& issuer); [[nodiscard]] XRPAmount xrpLiquid(ReadView const& view, AccountID const& id, std::int32_t ownerCountAdj, beast::Journal j); +struct Adjustment +{ + std::int32_t ownerCountDelta = 0; + std::int32_t accountCountDelta = 0; +}; + /** Returns the account reserve, in drops. * * Actual owner count can be adjusted by delta in ownerCountAdj @@ -55,12 +61,7 @@ xrpLiquid(ReadView const& view, AccountID const& id, std::int32_t ownerCountAdj, * @return The account reserve amount in drops */ [[nodiscard]] XRPAmount -accountReserve( - ReadView const& view, - SLE::const_ref sle, - beast::Journal j, - std::int32_t ownerCountAdj = 0, - std::int32_t accountCountAdj = 0); +accountReserve(ReadView const& view, SLE::const_ref sle, beast::Journal j, Adjustment adj = {}); /** Convenience overload that accepts AccountID instead of SLE. * @@ -72,14 +73,9 @@ accountReserve( * @return The account reserve amount in drops */ [[nodiscard]] inline XRPAmount -accountReserve( - ReadView const& view, - AccountID const& id, - beast::Journal j, - std::int32_t ownerCountAdj = 0, - std::int32_t accountCountAdj = 0) +accountReserve(ReadView const& view, AccountID const& id, beast::Journal j, Adjustment adj = {}) { - return accountReserve(view, view.read(keylet::account(id)), j, ownerCountAdj, accountCountAdj); + return accountReserve(view, view.read(keylet::account(id)), j, adj); } /** Check if an account has insufficient reserve. @@ -101,8 +97,7 @@ checkInsufficientReserve( SLE::const_ref accSle, STAmount const& accBalance, SLE::const_ref sponsorSle, - std::int32_t ownerCountAdj, - std::int32_t accountCountAdj = 0, + Adjustment adj, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); /** Return number of the objects which reserve is covered by the account(sle) (so called "owner diff --git a/include/xrpl/ledger/helpers/EscrowHelpers.h b/include/xrpl/ledger/helpers/EscrowHelpers.h index 49ae2e7cc7..228013d4d0 100644 --- a/include/xrpl/ledger/helpers/EscrowHelpers.h +++ b/include/xrpl/ledger/helpers/EscrowHelpers.h @@ -63,8 +63,8 @@ escrowUnlockApplyHelper( if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE - if (auto const ret = - checkInsufficientReserve(view, tx, sleDest, xrpBalance, *sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + view, tx, sleDest, xrpBalance, *sponsorSle, {.ownerCountDelta = 1}, journal); !isTesSuccess(ret)) { JLOG(journal.trace()) << "Trust line does not exist. " @@ -193,8 +193,8 @@ escrowUnlockApplyHelper( if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE - if (auto const ret = - checkInsufficientReserve(view, tx, sleDest, xrpBalance, *sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + view, tx, sleDest, xrpBalance, *sponsorSle, {.ownerCountDelta = 1}, journal); !isTesSuccess(ret)) return ret; diff --git a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp index 3d02c36abc..e7aaf94547 100644 --- a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp +++ b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp @@ -315,20 +315,15 @@ decreaseOwnerCountForObject( } XRPAmount -accountReserve( - ReadView const& view, - SLE::const_ref sle, - beast::Journal j, - std::int32_t ownerCountAdj, - std::int32_t accountCountAdj) +accountReserve(ReadView const& view, SLE::const_ref sle, beast::Journal j, Adjustment adj) { if (!sle) Throw("xrpl::accountReserve : valid sle"); if (sle->getType() != ltACCOUNT_ROOT) Throw("xrpl::accountReserve : valid sle type"); - std::uint32_t const currentOwnerCount = ownerCount(sle, j, ownerCountAdj); - std::uint32_t const currentAccountCount = accountCountImpl(sle, accountCountAdj, j); + std::uint32_t const currentOwnerCount = ownerCount(sle, j, adj.ownerCountDelta); + std::uint32_t const currentAccountCount = accountCountImpl(sle, adj.accountCountDelta, j); return view.fees().accountReserve(currentOwnerCount, currentAccountCount); } @@ -340,8 +335,7 @@ checkInsufficientReserve( SLE::const_ref accSle, STAmount const& accBalance, SLE::const_ref sponsorSle, - std::int32_t ownerCountAdj, - std::int32_t accountCountAdj, + Adjustment adj, beast::Journal j) { if (sponsorSle) @@ -359,20 +353,20 @@ checkInsufficientReserve( if (sle) { auto const ownerCountAllowed = sle->getFieldU32(sfRemainingOwnerCount); - if (ownerCountAllowed < ownerCountAdj) + if (adj.ownerCountDelta > 0 && + ownerCountAllowed < static_cast(adj.ownerCountDelta)) return tecINSUFFICIENT_RESERVE; } auto const sponsorBalance = sponsorSle->getFieldAmount(sfBalance); - STAmount const sponsorReserve = - accountReserve(view, sponsorSle, j, ownerCountAdj, accountCountAdj); + STAmount const sponsorReserve = accountReserve(view, sponsorSle, j, adj); if (sponsorBalance < sponsorReserve) return tecINSUFFICIENT_RESERVE; } else { - STAmount const reserve = accountReserve(view, accSle, j, ownerCountAdj, accountCountAdj); + STAmount const reserve = accountReserve(view, accSle, j, adj); if (accBalance < reserve) return tecINSUFFICIENT_RESERVE; } diff --git a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp index 49a43eca95..f930a7765d 100644 --- a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp @@ -214,7 +214,7 @@ authorizeMPToken( if (sponsorSle || ownerCount(sleAcct, journal) >= 2) { if (auto const ret = checkInsufficientReserve( - view, tx, sleAcct, priorBalance, sponsorSle, 1, 0, journal); + view, tx, sleAcct, priorBalance, sponsorSle, {.ownerCountDelta = 1}, journal); !isTesSuccess(ret)) return ret; } diff --git a/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp b/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp index e9272d2399..eb0c96f79f 100644 --- a/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp @@ -913,7 +913,8 @@ tokenOfferCreateApply( std::uint32_t txFlags) { Keylet const acctKeylet = keylet::account(acctID); - if (auto const acct = view.read(acctKeylet); priorBalance < accountReserve(view, acct, j, 1)) + if (auto const acct = view.read(acctKeylet); + priorBalance < accountReserve(view, acct, j, {.ownerCountDelta = 1})) return tecINSUFFICIENT_RESERVE; auto const offerID = keylet::nftokenOffer(acctID, seqProxy.value()); diff --git a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp index 4bbf303d81..ac9bf4ebcf 100644 --- a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp +++ b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp @@ -676,8 +676,8 @@ addEmptyHolding( } // Can the account cover the trust line reserve ? - if (auto const ret = - checkInsufficientReserve(view, tx, sleDst, priorBalance, sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + view, tx, sleDst, priorBalance, sponsorSle, {.ownerCountDelta = 1}, journal); !isTesSuccess(ret)) return tecNO_LINE_INSUF_RESERVE; diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp index 5cf64a5100..4b2c214ea6 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp @@ -231,8 +231,7 @@ SponsorshipSet::doApply() sponsorAccSle, STAmount{sponsorBalanceAfterFee}.xrp(), *reserveSponsorAccSle, - 1, - 0, + {.ownerCountDelta = 1}, ctx_.journal); !isTesSuccess(ret)) return tecUNFUNDED; @@ -299,8 +298,7 @@ SponsorshipSet::doApply() sponsorAccSle, STAmount{sponsorBalanceAfterFee}.xrp(), *reserveSponsorAccSle, - 0, - 0, + {}, ctx_.journal); !isTesSuccess(ret)) return tecUNFUNDED; diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp index 3840c390b1..e19a005925 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp @@ -327,8 +327,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - ownerCountDelta, - 0, + {.ownerCountDelta = ownerCountDelta}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -382,8 +381,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - ownerCountDelta, - 0, + {.ownerCountDelta = ownerCountDelta}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -432,8 +430,7 @@ SponsorshipTransfer::doApply() ownerSle, balanceBeforeFee(ownerSle), SLE::pointer(), - ownerCountDelta, - 0, + {.ownerCountDelta = ownerCountDelta}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -474,8 +471,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - 0, - 1, + {.accountCountDelta = 1}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -504,8 +500,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - 0, - 1, + {.accountCountDelta = 1}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -542,8 +537,7 @@ SponsorshipTransfer::doApply() sponseeSle, balanceBeforeFee(sponseeSle), SLE::pointer(), - 0, - 1, + {.accountCountDelta = 1}, ctx_.journal); !isTesSuccess(ter)) return ter; diff --git a/src/libxrpl/tx/transactors/account/SignerListSet.cpp b/src/libxrpl/tx/transactors/account/SignerListSet.cpp index 4c90a861f8..6bda37537f 100644 --- a/src/libxrpl/tx/transactors/account/SignerListSet.cpp +++ b/src/libxrpl/tx/transactors/account/SignerListSet.cpp @@ -328,8 +328,7 @@ SignerListSet::replaceSignerList() sle, preFeeBalance_, *sponsorSle, - kAddedOwnerCount, - 0, + {.ownerCountDelta = kAddedOwnerCount}, ctx_.journal); !isTesSuccess(ret)) return ret; diff --git a/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp b/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp index e519657b22..866ba5b6c3 100644 --- a/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp +++ b/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp @@ -1027,7 +1027,7 @@ applyCreateAccountAttestations( // Check reserve auto const balance = (*sleDoor)[sfBalance]; - auto const reserve = accountReserve(view, sleDoor, j, 1); + auto const reserve = accountReserve(view, sleDoor, j, {.ownerCountDelta = 1}); if (balance < reserve) return std::unexpected(tecINSUFFICIENT_RESERVE); @@ -1434,7 +1434,7 @@ XChainCreateBridge::preclaim(PreclaimContext const& ctx) return terNO_ACCOUNT; auto const balance = (*sleAcc)[sfBalance]; - auto const reserve = accountReserve(ctx.view, sleAcc, ctx.j, 1); + auto const reserve = accountReserve(ctx.view, sleAcc, ctx.j, {.ownerCountDelta = 1}); if (balance < reserve) return tecINSUFFICIENT_RESERVE; @@ -1982,7 +1982,7 @@ XChainCreateClaimID::preclaim(PreclaimContext const& ctx) return terNO_ACCOUNT; auto const balance = (*sleAcc)[sfBalance]; - auto const reserve = accountReserve(ctx.view, sleAcc, ctx.j, 1); + auto const reserve = accountReserve(ctx.view, sleAcc, ctx.j, {.ownerCountDelta = 1}); if (balance < reserve) return tecINSUFFICIENT_RESERVE; } diff --git a/src/libxrpl/tx/transactors/check/CheckCash.cpp b/src/libxrpl/tx/transactors/check/CheckCash.cpp index cb5fa0c93c..60053075ef 100644 --- a/src/libxrpl/tx/transactors/check/CheckCash.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCash.cpp @@ -399,7 +399,13 @@ CheckCash::doApply() // Can the account cover the trust line's or MPT reserve? if (auto const ret = checkInsufficientReserve( - psb, ctx_.tx, sleDst, preFeeBalance_, *sponsorSle, 1, 0, j_); + psb, + ctx_.tx, + sleDst, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + j_); !isTesSuccess(ret)) { JLOG(j_.trace()) << "Trust line does not exist. " diff --git a/src/libxrpl/tx/transactors/check/CheckCreate.cpp b/src/libxrpl/tx/transactors/check/CheckCreate.cpp index e66ac7b4d9..eacf9d238a 100644 --- a/src/libxrpl/tx/transactors/check/CheckCreate.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCreate.cpp @@ -199,7 +199,13 @@ CheckCreate::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, 1, 0, ctx_.journal); + view(), + ctx_.tx, + sle, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + ctx_.journal); !isTesSuccess(ret)) return ret; // Note that we use the value from the sequence or ticket as the diff --git a/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp b/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp index e0d5da1ecc..85befd51b1 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp @@ -94,7 +94,7 @@ CredentialAccept::doApply() return tefINTERNAL; // LCOV_EXCL_LINE { - STAmount const reserve{accountReserve(view(), sleSubject, j_, 1)}; + STAmount const reserve{accountReserve(view(), sleSubject, j_, {.ownerCountDelta = 1})}; if (preFeeBalance_ < reserve) return tecINSUFFICIENT_RESERVE; } diff --git a/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp b/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp index 4491099e43..57896aa025 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp @@ -131,7 +131,7 @@ CredentialCreate::doApply() return tefINTERNAL; // LCOV_EXCL_LINE { - STAmount const reserve{accountReserve(view(), sleIssuer, j_, 1)}; + STAmount const reserve{accountReserve(view(), sleIssuer, j_, {.ownerCountDelta = 1})}; if (preFeeBalance_ < reserve) return tecINSUFFICIENT_RESERVE; } diff --git a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp index dccb5fa9d3..653829a755 100644 --- a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp +++ b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp @@ -103,7 +103,13 @@ DelegateSet::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sleOwner, preFeeBalance_, *sponsorSle, 1, 0, ctx_.journal); + view(), + ctx_.tx, + sleOwner, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + ctx_.journal); !isTesSuccess(ret)) return ret; diff --git a/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp b/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp index 3df56369d8..4d6524bba3 100644 --- a/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp +++ b/src/libxrpl/tx/transactors/dex/AMMWithdraw.cpp @@ -664,8 +664,9 @@ AMMWithdraw::withdraw( std::uint32_t const currentOwnerCount = ownerCount(sleAccount, journal); // See also TrustSet::doApply() and MPTokenAuthorize::authorize() XRPAmount const reserve( - (currentOwnerCount < 2) ? XRPAmount(beast::kZero) - : accountReserve(view, sleAccount, journal, 1)); + (currentOwnerCount < 2) + ? XRPAmount(beast::kZero) + : accountReserve(view, sleAccount, journal, {.ownerCountDelta = 1})); auto const balanceAdj = isIssue ? std::max(priorBalance, balance) : priorBalance; if (balanceAdj < reserve) diff --git a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp index 811d188a4b..eb70b1c430 100644 --- a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp +++ b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp @@ -832,7 +832,7 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel) return {tefINTERNAL, false}; { - XRPAmount const reserve = accountReserve(sb, sleCreator, viewJ, 1); + XRPAmount const reserve = accountReserve(sb, sleCreator, viewJ, {.ownerCountDelta = 1}); if (preFeeBalance_ < reserve) { // If we are here, the signing account had an insufficient reserve diff --git a/src/libxrpl/tx/transactors/did/DIDSet.cpp b/src/libxrpl/tx/transactors/did/DIDSet.cpp index 88084f2d63..2659460b8d 100644 --- a/src/libxrpl/tx/transactors/did/DIDSet.cpp +++ b/src/libxrpl/tx/transactors/did/DIDSet.cpp @@ -72,7 +72,8 @@ addSLE(ApplyContext& ctx, SLE::ref sle, AccountID const& owner) // Check reserve availability for new object creation { auto const balance = STAmount((*sleAccount)[sfBalance]).xrp(); - auto const reserve = accountReserve(ctx.view(), sleAccount, ctx.journal, 1); + auto const reserve = + accountReserve(ctx.view(), sleAccount, ctx.journal, {.ownerCountDelta = 1}); if (balance < reserve) return tecINSUFFICIENT_RESERVE; diff --git a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp index 0179c38888..8fb386f3fe 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp @@ -445,8 +445,8 @@ EscrowCreate::doApply() // validates the sponsor's reserve + remaining credit. When // unsponsored this hits the source branch and validates the // source's pre-lock balance against base + (currentOC+1)*increment. - if (auto const ret = - checkInsufficientReserve(ctx_.view(), ctx_.tx, sle, balance, *sponsorSle, 1, 0, j_); + if (auto const ret = checkInsufficientReserve( + ctx_.view(), ctx_.tx, sle, balance, *sponsorSle, {.ownerCountDelta = 1}, j_); !isTesSuccess(ret)) return ret; @@ -468,8 +468,7 @@ EscrowCreate::doApply() sle, balance - STAmount(amount).xrp(), {}, - ownerCountAdj, - 0, + {.ownerCountDelta = ownerCountAdj}, j_); !isTesSuccess(ret)) return tecUNFUNDED; diff --git a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp index 151d50b7d6..8cb8730480 100644 --- a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp +++ b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp @@ -170,7 +170,8 @@ OracleSet::preclaim(PreclaimContext const& ctx) if (pairs.size() > kMaxOracleDataSeries) return tecARRAY_TOO_LARGE; - auto const reserve = accountReserve(ctx.view, sleSetter, ctx.j, adjustReserve); + auto const reserve = + accountReserve(ctx.view, sleSetter, ctx.j, {.ownerCountDelta = adjustReserve}); auto const& balance = sleSetter->getFieldAmount(sfBalance); if (balance < reserve) diff --git a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp index 044183e57c..734581192e 100644 --- a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp +++ b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp @@ -165,7 +165,7 @@ DepositPreauth::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sleOwner, preFeeBalance_, *sponsorSle, 1, 0, j_); + view(), ctx_.tx, sleOwner, preFeeBalance_, *sponsorSle, {.ownerCountDelta = 1}, j_); !isTesSuccess(ret)) return ret; @@ -213,7 +213,7 @@ DepositPreauth::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sleOwner, preFeeBalance_, *sponsorSle, 1, 0, j_); + view(), ctx_.tx, sleOwner, preFeeBalance_, *sponsorSle, {.ownerCountDelta = 1}, j_); !isTesSuccess(ret)) return ret; diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp index 69f86afd13..96a869af8f 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp @@ -147,7 +147,7 @@ PaymentChannelCreate::doApply() // unsponsored this hits the source branch and validates the // source's pre-lock balance against base + (currentOC+1)*increment. if (auto const ret = checkInsufficientReserve( - ctx_.view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, 1, 0, j_); + ctx_.view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, {.ownerCountDelta = 1}, j_); !isTesSuccess(ret)) return ret; @@ -166,8 +166,7 @@ PaymentChannelCreate::doApply() sle, preFeeBalance_ - ctx_.tx[sfAmount].xrp(), {}, - ownerCountAdj, - 0, + {.ownerCountDelta = ownerCountAdj}, j_); !isTesSuccess(ret)) return tecUNFUNDED; diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp index db14a9b06c..d0681718ce 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelFund.cpp @@ -94,12 +94,12 @@ PaymentChannelFund::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = - checkInsufficientReserve(ctx_.view(), ctx_.tx, sle, balance, *sponsorSle, 0, 0, j_); + checkInsufficientReserve(ctx_.view(), ctx_.tx, sle, balance, *sponsorSle, {}, j_); !isTesSuccess(ret)) return ret; if (auto const ret = checkInsufficientReserve( - ctx_.view(), ctx_.tx, sle, balance - ctx_.tx[sfAmount], {}, 0, 0, j_); + ctx_.view(), ctx_.tx, sle, balance - ctx_.tx[sfAmount], {}, {}, j_); !isTesSuccess(ret)) return tecUNFUNDED; } diff --git a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp index f1ce1aa551..c2df114e48 100644 --- a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp +++ b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp @@ -106,7 +106,8 @@ PermissionedDomainSet::doApply() // Create new permissioned domain. // Check reserve availability for new object creation auto const balance = STAmount((*ownerSle)[sfBalance]).xrp(); - auto const reserve = accountReserve(ctx_.view(), ownerSle, ctx_.journal, 1); + auto const reserve = + accountReserve(ctx_.view(), ownerSle, ctx_.journal, {.ownerCountDelta = 1}); if (balance < reserve) return tecINSUFFICIENT_RESERVE; diff --git a/src/libxrpl/tx/transactors/system/TicketCreate.cpp b/src/libxrpl/tx/transactors/system/TicketCreate.cpp index f7f7e275a1..d1cda85f4e 100644 --- a/src/libxrpl/tx/transactors/system/TicketCreate.cpp +++ b/src/libxrpl/tx/transactors/system/TicketCreate.cpp @@ -75,7 +75,11 @@ TicketCreate::doApply() // check the starting balance because we want to allow dipping into the // reserve to pay fees. std::uint32_t const ticketCount = ctx_.tx[sfTicketCount]; - if (preFeeBalance_ < accountReserve(view(), sleAccountRoot, j_, ticketCount)) + if (preFeeBalance_ < accountReserve( + view(), + sleAccountRoot, + j_, + {.ownerCountDelta = static_cast(ticketCount)})) return tecINSUFFICIENT_RESERVE; beast::Journal const viewJ{ctx_.registry.get().getJournal("View")}; diff --git a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp index 56fedb6fe6..7e3d4503de 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp @@ -137,7 +137,7 @@ MPTokenIssuanceCreate::create( if (args.priorBalance) { if (auto const ret = checkInsufficientReserve( - view, tx, acct, *(args.priorBalance), sponsorSle, 1, 0, journal); + view, tx, acct, *(args.priorBalance), sponsorSle, {.ownerCountDelta = 1}, journal); !isTesSuccess(ret)) return std::unexpected(ret); // tecINSUFFICIENT_RESERVE } diff --git a/src/libxrpl/tx/transactors/token/TrustSet.cpp b/src/libxrpl/tx/transactors/token/TrustSet.cpp index f966883c0b..32eb0ddda0 100644 --- a/src/libxrpl/tx/transactors/token/TrustSet.cpp +++ b/src/libxrpl/tx/transactors/token/TrustSet.cpp @@ -539,7 +539,13 @@ TrustSet::doApply() // For PreFunded sponsors, we need to check if there are sufficient reserves before // calling increaseOwnerCount(). if (auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sleLowAccount, preFeeBalance_, *sponsorSle, 1, 0, j_); + view(), + ctx_.tx, + sleLowAccount, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + j_); *sponsorSle && !isTesSuccess(ret)) return tecINSUF_RESERVE_LINE; @@ -568,7 +574,13 @@ TrustSet::doApply() // For PreFunded sponsors, we need to check if there are sufficient reserves before // calling increaseOwnerCount(). if (auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sleHighAccount, preFeeBalance_, *sponsorSle, 1, 0, j_); + view(), + ctx_.tx, + sleHighAccount, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + j_); *sponsorSle && !isTesSuccess(ret)) return tecINSUF_RESERVE_LINE; @@ -602,8 +614,8 @@ TrustSet::doApply() } // Reserve is not scaled by load. else if ( - auto const ret = checkInsufficientReserve( - view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, 0, 0, j_); + auto const ret = + checkInsufficientReserve(view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, {}, j_); !freeTrustLine && bReserveIncrease && !isTesSuccess(ret)) { JLOG(j_.trace()) << "Delay transaction: Insufficent reserve to " @@ -634,7 +646,7 @@ TrustSet::doApply() } else if ( auto const ret = checkInsufficientReserve( - ctx_.view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, 1, 0, j_); + ctx_.view(), ctx_.tx, sle, preFeeBalance_, *sponsorSle, {.ownerCountDelta = 1}, j_); !freeTrustLine && !isTesSuccess(ret)) // Reserve is not scaled by load. { JLOG(j_.trace()) << "Delay transaction: Line does not exist. "