diff --git a/include/xrpl/ledger/helpers/AccountRootHelpers.h b/include/xrpl/ledger/helpers/AccountRootHelpers.h index 66726e0d09..7d398fce5e 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. @@ -100,8 +96,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 3a632a6ef1..8e04815fe9 100644 --- a/include/xrpl/ledger/helpers/EscrowHelpers.h +++ b/include/xrpl/ledger/helpers/EscrowHelpers.h @@ -61,8 +61,8 @@ escrowUnlockApplyHelper( if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE - if (auto const ret = - checkInsufficientReserve(ctx, sleDest, xrpBalance, *sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + ctx, sleDest, xrpBalance, *sponsorSle, {.ownerCountDelta = 1}, journal); !isTesSuccess(ret)) { JLOG(journal.trace()) << "Trust line does not exist. " @@ -190,8 +190,8 @@ escrowUnlockApplyHelper( if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE - if (auto const ret = - checkInsufficientReserve(ctx, sleDest, xrpBalance, *sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + ctx, 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 655067bb71..e2678fa3df 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); } @@ -339,8 +334,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) @@ -358,21 +352,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(ctx.view, sponsorSle, j, ownerCountAdj, accountCountAdj); + STAmount const sponsorReserve = accountReserve(ctx.view, sponsorSle, j, adj); if (sponsorBalance < sponsorReserve) return tecINSUFFICIENT_RESERVE; } else { - STAmount const reserve = - accountReserve(ctx.view, accSle, j, ownerCountAdj, accountCountAdj); + STAmount const reserve = accountReserve(ctx.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 de1bbfc198..f87171a3b7 100644 --- a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp @@ -210,8 +210,8 @@ authorizeMPToken( // budget), so this check always runs for sponsored transactions. if (sponsorSle || ownerCount(sleAcct, journal) >= 2) { - if (auto const ret = - checkInsufficientReserve(ctx, sleAcct, priorBalance, sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + ctx, 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 076a34dfca..d6e1d499a4 100644 --- a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp +++ b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp @@ -674,8 +674,8 @@ addEmptyHolding( } // Can the account cover the trust line reserve ? - if (auto const ret = - checkInsufficientReserve(ctx, sleDst, priorBalance, sponsorSle, 1, 0, journal); + if (auto const ret = checkInsufficientReserve( + ctx, 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 7460b29502..4ad10112ae 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp @@ -230,8 +230,7 @@ SponsorshipSet::doApply() sponsorAccSle, STAmount{sponsorBalanceAfterFee}.xrp(), *reserveSponsorAccSle, - 1, - 0, + {.ownerCountDelta = 1}, ctx_.journal); !isTesSuccess(ret)) return tecUNFUNDED; @@ -297,8 +296,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 eb23d75aa1..a9b8504a97 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp @@ -326,8 +326,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - ownerCountDelta, - 0, + {.ownerCountDelta = ownerCountDelta}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -380,8 +379,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - ownerCountDelta, - 0, + {.ownerCountDelta = ownerCountDelta}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -429,8 +427,7 @@ SponsorshipTransfer::doApply() ownerSle, balanceBeforeFee(ownerSle), SLE::pointer(), - ownerCountDelta, - 0, + {.ownerCountDelta = ownerCountDelta}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -470,8 +467,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - 0, - 1, + {.accountCountDelta = 1}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -499,8 +495,7 @@ SponsorshipTransfer::doApply() sponseeSle, sponseeSle->getFieldAmount(sfBalance), newSponsorSle, - 0, - 1, + {.accountCountDelta = 1}, ctx_.journal); !isTesSuccess(ter)) return ter; @@ -536,8 +531,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 d1b5712ab2..457639195a 100644 --- a/src/libxrpl/tx/transactors/account/SignerListSet.cpp +++ b/src/libxrpl/tx/transactors/account/SignerListSet.cpp @@ -327,8 +327,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 806ee20bcd..3597dd8358 100644 --- a/src/libxrpl/tx/transactors/check/CheckCash.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCash.cpp @@ -401,7 +401,12 @@ CheckCash::doApply() // Can the account cover the trust line's or MPT reserve? if (auto const ret = checkInsufficientReserve( - applyViewContext, sleDst, preFeeBalance_, *sponsorSle, 1, 0, j_); + applyViewContext, + 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 84c7c7439a..10d5b778fd 100644 --- a/src/libxrpl/tx/transactors/check/CheckCreate.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCreate.cpp @@ -199,7 +199,12 @@ CheckCreate::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - ctx_.getApplyViewContext(), sle, preFeeBalance_, *sponsorSle, 1, 0, ctx_.journal); + ctx_.getApplyViewContext(), + 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 11edb5c6c3..9fc4a81029 100644 --- a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp +++ b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp @@ -103,7 +103,12 @@ DelegateSet::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - ctx_.getApplyViewContext(), sleOwner, preFeeBalance_, *sponsorSle, 1, 0, ctx_.journal); + ctx_.getApplyViewContext(), + 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 e6831932ab..4b2f853b1b 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp @@ -446,7 +446,7 @@ EscrowCreate::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_.getApplyViewContext(), sle, balance, *sponsorSle, 1, 0, j_); + ctx_.getApplyViewContext(), sle, balance, *sponsorSle, {.ownerCountDelta = 1}, j_); !isTesSuccess(ret)) return ret; @@ -467,8 +467,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 d50b209be4..195e4d2df7 100644 --- a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp +++ b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp @@ -166,7 +166,12 @@ DepositPreauth::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - applyViewContext, sleOwner, preFeeBalance_, *sponsorSle, 1, 0, j_); + applyViewContext, + sleOwner, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + j_); !isTesSuccess(ret)) return ret; @@ -214,7 +219,12 @@ DepositPreauth::doApply() if (!sponsorSle) return sponsorSle.error(); // LCOV_EXCL_LINE if (auto const ret = checkInsufficientReserve( - applyViewContext, sleOwner, preFeeBalance_, *sponsorSle, 1, 0, j_); + applyViewContext, + 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 a215a6dbb9..1b82fcf88f 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp @@ -147,7 +147,12 @@ 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_.getApplyViewContext(), sle, preFeeBalance_, *sponsorSle, 1, 0, j_); + ctx_.getApplyViewContext(), + sle, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + j_); !isTesSuccess(ret)) return ret; @@ -165,8 +170,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 0ded1776ad..ab0635068b 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_.getApplyViewContext(), sle, balance, *sponsorSle, 0, 0, j_); + ctx_.getApplyViewContext(), sle, balance, *sponsorSle, {}, j_); !isTesSuccess(ret)) return ret; if (auto const ret = checkInsufficientReserve( - ctx_.getApplyViewContext(), sle, balance - ctx_.tx[sfAmount], {}, 0, 0, j_); + ctx_.getApplyViewContext(), 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 b474a3bf72..a1a75ac531 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp @@ -136,7 +136,7 @@ MPTokenIssuanceCreate::create( if (args.priorBalance) { if (auto const ret = checkInsufficientReserve( - ctx, acct, *(args.priorBalance), sponsorSle, 1, 0, journal); + ctx, 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 851bfce7fe..cf3f05152d 100644 --- a/src/libxrpl/tx/transactors/token/TrustSet.cpp +++ b/src/libxrpl/tx/transactors/token/TrustSet.cpp @@ -543,8 +543,7 @@ TrustSet::doApply() sleLowAccount, preFeeBalance_, *sponsorSle, - 1, - 0, + {.ownerCountDelta = 1}, j_); *sponsorSle && !isTesSuccess(ret)) return tecINSUF_RESERVE_LINE; @@ -578,8 +577,7 @@ TrustSet::doApply() sleHighAccount, preFeeBalance_, *sponsorSle, - 1, - 0, + {.ownerCountDelta = 1}, j_); *sponsorSle && !isTesSuccess(ret)) return tecINSUF_RESERVE_LINE; @@ -615,7 +613,7 @@ TrustSet::doApply() // Reserve is not scaled by load. else if ( auto const ret = checkInsufficientReserve( - ctx_.getApplyViewContext(), sle, preFeeBalance_, *sponsorSle, 0, 0, j_); + ctx_.getApplyViewContext(), sle, preFeeBalance_, *sponsorSle, {}, j_); !freeTrustLine && bReserveIncrease && !isTesSuccess(ret)) { JLOG(j_.trace()) << "Delay transaction: Insufficent reserve to " @@ -646,7 +644,12 @@ TrustSet::doApply() } else if ( auto const ret = checkInsufficientReserve( - ctx_.getApplyViewContext(), sle, preFeeBalance_, *sponsorSle, 1, 0, j_); + ctx_.getApplyViewContext(), + sle, + preFeeBalance_, + *sponsorSle, + {.ownerCountDelta = 1}, + j_); !freeTrustLine && !isTesSuccess(ret)) // Reserve is not scaled by load. { JLOG(j_.trace()) << "Delay transaction: Line does not exist. "