diff --git a/include/xrpl/ledger/View.h b/include/xrpl/ledger/View.h index 0e0aea4da0..51a46f20ee 100644 --- a/include/xrpl/ledger/View.h +++ b/include/xrpl/ledger/View.h @@ -553,6 +553,9 @@ areCompatible( uint32_t ownerCount(std::shared_ptr const& sponsorSle); +XRPAmount +calculateReserve(std::shared_ptr const& sle, Fees const& fees); + bool isReserveSponsored(STTx const& tx); diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index a24090454c..256241f569 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -732,20 +732,10 @@ xrpLiquid( std::uint32_t const ownerCount = confineOwnerCount( view.ownerCountHook(id, sle->getFieldU32(sfOwnerCount)), ownerCountAdj); - std::size_t sponsoredOwnerCount = sle->getFieldU32(sfSponsoredOwnerCount); - std::size_t sponsoringOwnerCount = sle->getFieldU32(sfSponsoringOwnerCount); - bool isAccountSponsored = sle->isFieldPresent(sfSponsorAccount); - std::size_t sponsoringAccountCount = - sle->getFieldU32(sfSponsoringAccountCount); - // Pseudo-accounts have no reserve requirement - auto const reserve = isPseudoAccount(sle) ? XRPAmount{0} - : view.fees().accountReserve( - ownerCount, - sponsoredOwnerCount, - sponsoringOwnerCount, - isAccountSponsored, - sponsoringAccountCount); + auto const reserve = isPseudoAccount(sle) + ? XRPAmount{0} + : calculateReserve(sle, view.fees()); auto const fullBalance = sle->getFieldAmount(sfBalance); @@ -1146,6 +1136,21 @@ ownerCount(std::shared_ptr const& sponsorSle) return ownerCount + sponsoringOwnerCount - sponsoredOwnerCount; } +XRPAmount +calculateReserve(std::shared_ptr const& sle, Fees const& fees) +{ + XRPL_ASSERT( + sle->getType() == ltACCOUNT_ROOT, + "xrpl::calculateReserve : valid sle type"); + + return fees.accountReserve( + sle->getFieldU32(sfOwnerCount), + sle->getFieldU32(sfSponsoredOwnerCount), + sle->getFieldU32(sfSponsoringOwnerCount), + sle->isFieldPresent(sfSponsorAccount), + sle->getFieldU32(sfSponsoringAccountCount)); +} + bool isReserveSponsored(STTx const& tx) { diff --git a/src/xrpld/app/tx/detail/Payment.cpp b/src/xrpld/app/tx/detail/Payment.cpp index 4c1bdf02a8..f85840269c 100644 --- a/src/xrpld/app/tx/detail/Payment.cpp +++ b/src/xrpld/app/tx/detail/Payment.cpp @@ -612,24 +612,9 @@ Payment::doApply() if (!sleSrc) return tefINTERNAL; // LCOV_EXCL_LINE - // ownerCount is the number of entries in this ledger for this - // account that require a reserve. - auto const ownerCount = sleSrc->getFieldU32(sfOwnerCount); - - // This is the total reserve in drops. - std::size_t sponsoredOwnerCount = - sleSrc->getFieldU32(sfSponsoredOwnerCount); - std::size_t sponsoringOwnerCount = - sleSrc->getFieldU32(sfSponsoringOwnerCount); - bool isAccountSponsored = sleSrc->isFieldPresent(sfSponsorAccount); - std::size_t sponsoringAccountCount = - sleSrc->getFieldU32(sfSponsoringAccountCount); - auto const reserve = view().fees().accountReserve( - ownerCount, - sponsoredOwnerCount, - sponsoringOwnerCount, - isAccountSponsored, - sponsoringAccountCount); + // the number of reserves in this ledger for this account that require a + // reserve. + auto const reserve = calculateReserve(sleSrc, view().fees()); // mPriorBalance is the balance on the sending account BEFORE the // fees were charged. We want to make sure we have enough reserve diff --git a/src/xrpld/app/tx/detail/XChainBridge.cpp b/src/xrpld/app/tx/detail/XChainBridge.cpp index 12f0514032..de7f21252f 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.cpp +++ b/src/xrpld/app/tx/detail/XChainBridge.cpp @@ -428,20 +428,7 @@ transferHelper( return tecINTERNAL; // LCOV_EXCL_LINE { - auto const ownerCount = sleSrc->getFieldU32(sfOwnerCount); - std::size_t sponsoredOwnerCount = - sleSrc->getFieldU32(sfSponsoredOwnerCount); - std::size_t sponsoringOwnerCount = - sleSrc->getFieldU32(sfSponsoringOwnerCount); - bool isAccountSponsored = sleSrc->isFieldPresent(sfSponsorAccount); - std::size_t sponsoringAccountCount = - sleSrc->getFieldU32(sfSponsoringAccountCount); - auto const reserve = psb.fees().accountReserve( - ownerCount, - sponsoredOwnerCount, - sponsoringOwnerCount, - isAccountSponsored, - sponsoringAccountCount); + auto const reserve = calculateReserve(sleSrc, psb.fees()); auto const availableBalance = [&]() -> STAmount { STAmount const curBal = (*sleSrc)[sfBalance];