diff --git a/include/xrpl/ledger/helpers/AccountRootHelpers.h b/include/xrpl/ledger/helpers/AccountRootHelpers.h index 6c8233fa61..1b87710f62 100644 --- a/include/xrpl/ledger/helpers/AccountRootHelpers.h +++ b/include/xrpl/ledger/helpers/AccountRootHelpers.h @@ -129,82 +129,135 @@ checkInsufficientReserve( std::uint32_t ownerCount(SLE::const_ref sle, beast::Journal j, std::int32_t ownerCountAdj = 0); -/** Adjust the owner counters of the account up or down. If sponsor provided adjust its counters - * too. +/** Increase owner-count fields when the caller supplies the sponsor. + * + * This helper does not create a ledger object. It updates reserve accounting + * after the caller has created/updated an object. + * If sponsorSle is provided, this also adjusts the account's sponsored count + * and the sponsor's sponsoring count. * * @param view The apply view for making changes * @param accountSle The account's ledger entry * @param sponsorSle The sponsor's ledger entry (if applicable) - * @param accountCountAdj Adjustment amount for the account count - * @param j Journal for logging (default: null sink) + * @param count Amount to add to the owner count + * @param j Journal for logging */ void -adjustOwnerCount( +increaseOwnerCount( ApplyView& view, SLE::ref accountSle, SLE::ref sponsorSle, - std::int32_t accountCountAdj, - beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + std::uint32_t count, + beast::Journal j); /** Convenience overload that accepts AccountID instead of SLE references. * * @param view The apply view for making changes * @param account The account ID * @param sponsor The optional sponsor account ID - * @param accountCountAdj Adjustment amount for the account count - * @param j Journal for logging (default: null sink) + * @param count Amount to add to the owner count + * @param j Journal for logging */ inline void -adjustOwnerCount( +increaseOwnerCount( ApplyView& view, AccountID const& account, std::optional const& sponsor, - std::int32_t accountCountAdj, - beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) + std::uint32_t count, + beast::Journal j) { - adjustOwnerCount( + increaseOwnerCount( view, view.peek(keylet::account(account)), sponsor ? view.peek(keylet::account(*sponsor)) : SLE::pointer(), - accountCountAdj, + count, j); } -/** Adjust the owner counters of the account up or down. If object has sponsor adjust its counters - * too. Used primarily just before deleting the object. +/** Decrease owner-count fields when the caller supplies the sponsor. + * + * This helper does not delete a ledger object. It updates reserve accounting + * after the caller has removed an owner-counted reserve, or for special + * owner-count changes whose sponsor cannot be derived from an object's + * sfSponsor field. + * + * @param view The apply view for making changes + * @param accountSle The account's ledger entry + * @param sponsorSle The sponsor's ledger entry (if applicable) + * @param count Amount to remove from the owner count + * @param j Journal for logging + */ +void +decreaseOwnerCount( + ApplyView& view, + SLE::ref accountSle, + SLE::ref sponsorSle, + std::uint32_t count, + beast::Journal j); + +/** Convenience overload that accepts AccountID instead of SLE references. + * + * @param view The apply view for making changes + * @param account The account ID + * @param sponsor The optional sponsor account ID + * @param count Amount to remove from the owner count + * @param j Journal for logging + */ +inline void +decreaseOwnerCount( + ApplyView& view, + AccountID const& account, + std::optional const& sponsor, + std::uint32_t count, + beast::Journal j) +{ + decreaseOwnerCount( + view, + view.peek(keylet::account(account)), + sponsor ? view.peek(keylet::account(*sponsor)) : SLE::pointer(), + count, + j); +} + +/** Decrease owner-count fields for an existing ledger object. + * + * This helper derives the reserve sponsor from objectSle's sfSponsor field, + * then updates the same owner-count fields as decreaseOwnerCount. Use this + * when removing an existing object whose reserve sponsor is stored on that + * object. * * @param view The apply view for making changes * @param accountSle The account's ledger entry * @param objectSle The object's ledger entry - * @param accountCountAdj Adjustment amount for the account count - * @param j Journal for logging (default: null sink) + * @param count Amount to remove from the owner count + * @param j Journal for logging */ void -adjustOwnerCountObj( +decreaseOwnerCountForObject( ApplyView& view, SLE::ref accountSle, SLE::ref objectSle, - std::int32_t accountCountAdj, - beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + std::uint32_t count, + beast::Journal j); /** Convenience overload that accepts AccountID instead of account SLE reference. * * @param view The apply view for making changes * @param account The account ID * @param objectSle The object's ledger entry - * @param accountCountAdj Adjustment amount for the account count - * @param j Journal for logging (default: null sink) + * @param count Amount to remove from the owner count + * @param j Journal for logging */ inline void -adjustOwnerCountObj( +decreaseOwnerCountForObject( ApplyView& view, AccountID const& account, SLE::ref objectSle, - std::int32_t accountCountAdj, - beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) + std::uint32_t count, + beast::Journal j) { SLE::ref accountSle = view.peek(keylet::account(account)); - adjustOwnerCountObj(view, accountSle, objectSle, accountCountAdj, j); + decreaseOwnerCountForObject(view, accountSle, objectSle, count, j); } /** Returns IOU issuer transfer fee as Rate. Rate specifies diff --git a/include/xrpl/ledger/helpers/EscrowHelpers.h b/include/xrpl/ledger/helpers/EscrowHelpers.h index bd27f17223..f9bc05d18f 100644 --- a/include/xrpl/ledger/helpers/EscrowHelpers.h +++ b/include/xrpl/ledger/helpers/EscrowHelpers.h @@ -205,7 +205,7 @@ escrowUnlockApplyHelper( } // update owner count. - adjustOwnerCount(view, sleDest, *sponsorSle, 1, journal); + increaseOwnerCount(view, sleDest, *sponsorSle, 1, journal); auto mptSle = view.peek(mptKeylet); addSponsorToLedgerEntry(mptSle, *sponsorSle); } diff --git a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp index 26a3a0fabf..ead48488a7 100644 --- a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp +++ b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp @@ -212,66 +212,106 @@ adjustOwnerCountImpl( view.update(sle); } -void -adjustOwnerCount( +static void +adjustOwnerCountSigned( ApplyView& view, SLE::ref accountSle, SLE::ref sponsorSle, - std::int32_t ownerCountAdj, + std::int32_t adjustment, beast::Journal j) { + XRPL_ASSERT(accountSle, "xrpl::adjustOwnerCountSigned : valid account sle"); if (!accountSle) - Throw("xrpl::adjustOwnerCount : valid account sle"); + return; // LCOV_EXCL_LINE auto const sleType = accountSle->getType(); bool const validType = sponsorSle ? sleType == ltACCOUNT_ROOT : sleType == ltLOAN_BROKER || sleType == ltACCOUNT_ROOT; + XRPL_ASSERT(validType, "xrpl::adjustOwnerCountSigned : valid account sle type"); if (!validType) - Throw("xrpl::adjustOwnerCount : valid account sle type"); + return; // LCOV_EXCL_LINE - XRPL_ASSERT(ownerCountAdj, "xrpl::adjustOwnerCount : nonzero ownerCountAdj input"); - if (ownerCountAdj == 0) - return; + XRPL_ASSERT(adjustment, "xrpl::adjustOwnerCountSigned : nonzero adjustment input"); auto const accountID = accountSle->getAccountID(sfAccount); if (sponsorSle) { - if (sponsorSle->getType() != ltACCOUNT_ROOT) - Throw("xrpl::adjustOwnerCount : valid sponsor sle type"); + bool const validSponsorType = sponsorSle->getType() == ltACCOUNT_ROOT; + XRPL_ASSERT(validSponsorType, "xrpl::adjustOwnerCountSigned : valid sponsor sle type"); + if (!validSponsorType) + return; // LCOV_EXCL_LINE auto const sponsorID = sponsorSle->getAccountID(sfAccount); - adjustOwnerCountImpl(view, accountSle, sfSponsoredOwnerCount, accountID, ownerCountAdj, j); - adjustOwnerCountImpl(view, sponsorSle, sfSponsoringOwnerCount, sponsorID, ownerCountAdj, j); + adjustOwnerCountImpl(view, accountSle, sfSponsoredOwnerCount, accountID, adjustment, j); + adjustOwnerCountImpl(view, sponsorSle, sfSponsoringOwnerCount, sponsorID, adjustment, j); auto sponsorshipSle = view.peek(keylet::sponsorship(sponsorID, accountID)); - if (sponsorshipSle && ownerCountAdj > 0) + if (sponsorshipSle && adjustment > 0) { // Only decrease the pre-funded ReserveCount on Sponsorship if we assign new objects. // Removing/reassigning ownership of the object doesn't increase RemainingOwnerCount - // back. Don't call hook because this counter is not something that require reserve + // back. Don't call hook because this counter is not something that requires reserve // (like other sf...OwnerCounts do). adjustOwnerCountImpl( - view, sponsorshipSle, sfRemainingOwnerCount, sponsorID, -ownerCountAdj, j, false); + view, sponsorshipSle, sfRemainingOwnerCount, sponsorID, -adjustment, j, false); } } - adjustOwnerCountImpl(view, accountSle, sfOwnerCount, accountID, ownerCountAdj, j); + adjustOwnerCountImpl(view, accountSle, sfOwnerCount, accountID, adjustment, j); } void -adjustOwnerCountObj( +increaseOwnerCount( + ApplyView& view, + SLE::ref accountSle, + SLE::ref sponsorSle, + std::uint32_t count, + beast::Journal j) +{ + XRPL_ASSERT( + count != 0 && count <= std::numeric_limits::max(), + "xrpl::increaseOwnerCount : count in signed delta range"); + if (count == 0 || count > std::numeric_limits::max()) + return; // LCOV_EXCL_LINE + + adjustOwnerCountSigned(view, accountSle, sponsorSle, static_cast(count), j); +} + +void +decreaseOwnerCount( + ApplyView& view, + SLE::ref accountSle, + SLE::ref sponsorSle, + std::uint32_t count, + beast::Journal j) +{ + XRPL_ASSERT( + count != 0 && count <= std::numeric_limits::max(), + "xrpl::decreaseOwnerCount : count in signed delta range"); + if (count == 0 || count > std::numeric_limits::max()) + return; // LCOV_EXCL_LINE + + adjustOwnerCountSigned(view, accountSle, sponsorSle, -static_cast(count), j); +} + +void +decreaseOwnerCountForObject( ApplyView& view, SLE::ref accountSle, SLE::ref objectSle, - std::int32_t accountCountAdj, + std::uint32_t count, beast::Journal j) { + XRPL_ASSERT(objectSle, "xrpl::decreaseOwnerCountForObject : valid object sle"); if (!objectSle) - Throw("xrpl::adjustOwnerCount : valid object sle"); - if (objectSle->getType() == ltACCOUNT_ROOT) - Throw("xrpl::adjustOwnerCount : valid object sle type"); + return; // LCOV_EXCL_LINE + + bool const validObjectType = objectSle->getType() != ltACCOUNT_ROOT; + XRPL_ASSERT(validObjectType, "xrpl::decreaseOwnerCountForObject : valid object sle type"); + if (!validObjectType) + return; // LCOV_EXCL_LINE SLE::ref sponsorSle = getLedgerEntryReserveSponsor(view, objectSle); - adjustOwnerCount(view, accountSle, sponsorSle, accountCountAdj, j); + decreaseOwnerCount(view, accountSle, sponsorSle, count, j); } XRPAmount diff --git a/src/libxrpl/ledger/helpers/CredentialHelpers.cpp b/src/libxrpl/ledger/helpers/CredentialHelpers.cpp index 7638558bbf..ea81b449d8 100644 --- a/src/libxrpl/ledger/helpers/CredentialHelpers.cpp +++ b/src/libxrpl/ledger/helpers/CredentialHelpers.cpp @@ -97,7 +97,7 @@ deleteSLE(ApplyView& view, SLE::ref sleCredential, beast::Journal j) } if (isOwner) - adjustOwnerCount(view, sleAccount, {}, -1, j); + decreaseOwnerCount(view, sleAccount, {}, 1, j); return tesSUCCESS; }; diff --git a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp index c98f2c7cd5..c44264fe65 100644 --- a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp @@ -184,7 +184,7 @@ authorizeMPToken( keylet::ownerDir(account), (*sleMpt)[sfOwnerNode], sleMpt->key(), false)) return tecINTERNAL; // LCOV_EXCL_LINE - adjustOwnerCountObj(view, sleAcct, sleMpt, -1, journal); + decreaseOwnerCountForObject(view, sleAcct, sleMpt, 1, journal); view.erase(sleMpt); return tesSUCCESS; @@ -241,7 +241,7 @@ authorizeMPToken( view.insert(mptoken); // Update owner count. - adjustOwnerCount(view, sleAcct, sponsorSle, 1, journal); + increaseOwnerCount(view, sleAcct, sponsorSle, 1, journal); addSponsorToLedgerEntry(mptoken, sponsorSle); return tesSUCCESS; @@ -968,7 +968,7 @@ checkCreateMPT( return tecINTERNAL; } - adjustOwnerCount(view, sleAcct, sponsorSle, 1, j); + increaseOwnerCount(view, sleAcct, sponsorSle, 1, j); } return tesSUCCESS; } diff --git a/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp b/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp index 93dbae0467..6b08717691 100644 --- a/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/NFTokenHelpers.cpp @@ -269,7 +269,7 @@ insertToken(ApplyView& view, AccountID owner, STObject&& nft) // the NFT. SLE::pointer const page = getPageForToken(view, owner, nft[sfNFTokenID], [](ApplyView& view, AccountID const& owner) { - adjustOwnerCount(view, owner, {}, 1, beast::Journal{beast::Journal::getNullSink()}); + increaseOwnerCount(view, owner, {}, 1, beast::Journal{beast::Journal::getNullSink()}); }); if (!page) @@ -407,17 +407,17 @@ removeToken(ApplyView& view, AccountID const& owner, uint256 const& nftokenID, S curr->setFieldArray(sfNFTokens, arr); view.update(curr); - int cnt = 0; + std::uint32_t cnt = 0; if (prev && mergePages(view, prev, curr)) - cnt--; + ++cnt; if (next && mergePages(view, curr, next)) - cnt--; + ++cnt; if (cnt != 0) { - adjustOwnerCount(view, owner, {}, cnt, beast::Journal{beast::Journal::getNullSink()}); + decreaseOwnerCount(view, owner, {}, cnt, beast::Journal{beast::Journal::getNullSink()}); } return tesSUCCESS; @@ -452,7 +452,7 @@ removeToken(ApplyView& view, AccountID const& owner, uint256 const& nftokenID, S curr->makeFieldAbsent(sfPreviousPageMin); } - adjustOwnerCount(view, owner, {}, -1, beast::Journal{beast::Journal::getNullSink()}); + decreaseOwnerCount(view, owner, {}, 1, beast::Journal{beast::Journal::getNullSink()}); view.update(curr); view.erase(prev); @@ -490,7 +490,7 @@ removeToken(ApplyView& view, AccountID const& owner, uint256 const& nftokenID, S view.erase(curr); - int cnt = 1; + uint32_t cnt = 1; // Since we're here, try to consolidate the previous and current pages // of the page we removed (if any) into one. mergePages() _should_ @@ -507,7 +507,7 @@ removeToken(ApplyView& view, AccountID const& owner, uint256 const& nftokenID, S view.peek(Keylet(ltNFTOKEN_PAGE, next->key())))) cnt++; - adjustOwnerCount(view, owner, {}, -1 * cnt, beast::Journal{beast::Journal::getNullSink()}); + decreaseOwnerCount(view, owner, {}, cnt, beast::Journal{beast::Journal::getNullSink()}); return tesSUCCESS; } @@ -623,7 +623,7 @@ deleteTokenOffer(ApplyView& view, SLE::ref offer) false)) return false; - adjustOwnerCount(view, owner, {}, -1, beast::Journal{beast::Journal::getNullSink()}); + decreaseOwnerCount(view, owner, {}, 1, beast::Journal{beast::Journal::getNullSink()}); view.erase(offer); return true; @@ -965,7 +965,7 @@ tokenOfferCreateApply( } // Update owner count. - adjustOwnerCount(view, acctID, {}, 1, j); + increaseOwnerCount(view, acctID, {}, 1, j); return tesSUCCESS; } diff --git a/src/libxrpl/ledger/helpers/OfferHelpers.cpp b/src/libxrpl/ledger/helpers/OfferHelpers.cpp index b7b52e82b9..d1c83f752e 100644 --- a/src/libxrpl/ledger/helpers/OfferHelpers.cpp +++ b/src/libxrpl/ledger/helpers/OfferHelpers.cpp @@ -55,7 +55,7 @@ offerDelete(ApplyView& view, SLE::ref sle, beast::Journal j) } } - adjustOwnerCountObj(view, owner, sle, -1, j); + decreaseOwnerCountForObject(view, owner, sle, 1, j); view.erase(sle); diff --git a/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp b/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp index a3b194586b..d5a0b25681 100644 --- a/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp +++ b/src/libxrpl/ledger/helpers/PaymentChannelHelpers.cpp @@ -58,7 +58,7 @@ closeChannel(SLE::ref slep, ApplyView& view, uint256 const& key, beast::Journal XRPL_ASSERT( (*slep)[sfAmount] >= (*slep)[sfBalance], "xrpl::closeChannel : minimum channel amount"); (*sle)[sfBalance] = (*sle)[sfBalance] + (*slep)[sfAmount] - (*slep)[sfBalance]; - adjustOwnerCountObj(view, sle, slep, -1, j); + decreaseOwnerCountForObject(view, sle, slep, 1, j); view.update(sle); // Remove PayChan from ledger diff --git a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp index 8f5b3f0563..f6f58d1bb8 100644 --- a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp +++ b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp @@ -285,7 +285,7 @@ trustCreate( } sleRippleState->setFieldU32(sfFlags, uFlags); - adjustOwnerCount(view, sleAccount, sponsorSle, 1, j); + increaseOwnerCount(view, sleAccount, sponsorSle, 1, j); addSponsorToLedgerEntry(sleRippleState, sponsorSle, bSetHigh ? sfHighSponsor : sfLowSponsor); @@ -380,7 +380,7 @@ updateTrustLine( // Clear the reserve of the sender, possibly delete the line! auto const currentSponsor = getLedgerEntryReserveSponsor(view, state, !bSenderHigh ? sfLowSponsor : sfHighSponsor); - adjustOwnerCount(view, sle, currentSponsor, -1, j); + decreaseOwnerCount(view, sle, currentSponsor, 1, j); // Clear reserve flag. state->clearFlag(senderReserveFlag); @@ -740,7 +740,7 @@ removeEmptyHolding( auto const currentLowSponsor = getLedgerEntryReserveSponsor(view, line, sfLowSponsor); - adjustOwnerCount(view, sleLowAccount, currentLowSponsor, -1, journal); + decreaseOwnerCount(view, sleLowAccount, currentLowSponsor, 1, journal); // It's not really necessary to clear the reserve flag, since the line // is about to be deleted, but this will make the metadata reflect an // accurate state at the time of deletion. @@ -757,7 +757,7 @@ removeEmptyHolding( auto const currentHighSponsor = getLedgerEntryReserveSponsor(view, line, sfHighSponsor); - adjustOwnerCount(view, sleHighAccount, currentHighSponsor, -1, journal); + decreaseOwnerCount(view, sleHighAccount, currentHighSponsor, 1, journal); // It's not really necessary to clear the reserve flag, since the line // is about to be deleted, but this will make the metadata reflect an // accurate state at the time of deletion. @@ -815,7 +815,7 @@ deleteAMMTrustLine( if (!sleState->isFlag(uFlags)) return tecINTERNAL; // LCOV_EXCL_LINE - adjustOwnerCount(view, !ammLow ? sleLow : sleHigh, sponsorSle, -1, j); + decreaseOwnerCount(view, !ammLow ? sleLow : sleHigh, sponsorSle, 1, j); return tesSUCCESS; } diff --git a/src/libxrpl/ledger/helpers/TokenHelpers.cpp b/src/libxrpl/ledger/helpers/TokenHelpers.cpp index beb5413bc0..226fd68c6f 100644 --- a/src/libxrpl/ledger/helpers/TokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/TokenHelpers.cpp @@ -632,7 +632,7 @@ directSendNoFeeIOU( // Clear the reserve of the sender, possibly delete the line! auto const currentSponsor = getLedgerEntryReserveSponsor( view, sleRippleState, !bSenderHigh ? sfLowSponsor : sfHighSponsor); - adjustOwnerCount(view, view.peek(keylet::account(uSenderID)), currentSponsor, -1, j); + decreaseOwnerCount(view, view.peek(keylet::account(uSenderID)), currentSponsor, 1, j); removeSponsorFromLedgerEntry( sleRippleState, !bSenderHigh ? sfLowSponsor : sfHighSponsor); diff --git a/src/libxrpl/tx/Transactor.cpp b/src/libxrpl/tx/Transactor.cpp index 8ce60f214b..d19e00c56a 100644 --- a/src/libxrpl/tx/Transactor.cpp +++ b/src/libxrpl/tx/Transactor.cpp @@ -847,7 +847,7 @@ Transactor::ticketDelete( } // Update the Ticket owner's reserve. - adjustOwnerCountObj(view, sleAccount, sleTicket, -1, j); + decreaseOwnerCountForObject(view, sleAccount, sleTicket, 1, j); // Remove Ticket from ledger. view.erase(sleTicket); diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp index f752d0a3a5..5cf64a5100 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp @@ -160,7 +160,7 @@ deleteSponsorship(ApplyView& view, SLE::ref sle, beast::Journal j) // LCOV_EXCL_STOP } - adjustOwnerCountObj(view, sponsorAccSle, sle, -1, j); + decreaseOwnerCountForObject(view, sponsorAccSle, sle, 1, j); // Return any prefunded fee amount to the sponsor before erasing the object. if (sle->isFieldPresent(sfFeeAmount)) @@ -270,7 +270,7 @@ SponsorshipSet::doApply() (*newSle)[sfSponseeNode] = *sponseePage; // NOLINTNEXTLINE(readability-suspicious-call-argument) - adjustOwnerCount(view(), sponsorAccSle, *reserveSponsorAccSle, 1, ctx_.journal); + increaseOwnerCount(view(), sponsorAccSle, *reserveSponsorAccSle, 1, ctx_.journal); addSponsorToLedgerEntry(newSle, *reserveSponsorAccSle); ctx_.view().insert(newSle); diff --git a/src/libxrpl/tx/transactors/account/SignerListSet.cpp b/src/libxrpl/tx/transactors/account/SignerListSet.cpp index d92194900c..b0db5952df 100644 --- a/src/libxrpl/tx/transactors/account/SignerListSet.cpp +++ b/src/libxrpl/tx/transactors/account/SignerListSet.cpp @@ -148,9 +148,7 @@ SignerListSet::preCompute() Transactor::preCompute(); } -// The return type is signed so it is compatible with the 3rd argument -// of adjustOwnerCount() (which must be signed). -static int +static std::uint32_t signerCountBasedOwnerCountDelta(std::size_t entryCount, Rules const& rules) { // We always compute the full change in OwnerCount, taking into account: @@ -166,7 +164,7 @@ signerCountBasedOwnerCountDelta(std::size_t entryCount, Rules const& rules) // units. A SignerList with 8 entries would cost 10 OwnerCount units. // // The static_cast should always be safe since entryCount should always - // be in the range from 1 to 32. + // be in the range from 1 to 32, so the result is always positive. // We've got a lot of room to grow. XRPL_ASSERT( entryCount >= STTx::kMinMultiSigners, @@ -197,12 +195,11 @@ removeSignersFromLedger( // There are two different ways that the OwnerCount could be managed. // If the lsfOneOwnerCount bit is set then remove just one owner count. // Otherwise use the pre-MultiSignReserve amendment calculation. - int removeFromOwnerCount = -1; + std::uint32_t removeFromOwnerCount = 1; if (!signers->isFlag(lsfOneOwnerCount)) { STArray const& actualList = signers->getFieldArray(sfSignerEntries); - removeFromOwnerCount = - signerCountBasedOwnerCountDelta(actualList.size(), view.rules()) * -1; + removeFromOwnerCount = signerCountBasedOwnerCountDelta(actualList.size(), view.rules()); } // Remove the node from the account directory. @@ -216,7 +213,7 @@ removeSignersFromLedger( // LCOV_EXCL_STOP } - adjustOwnerCountObj( + decreaseOwnerCountForObject( view, view.peek(accountKeylet), signers, removeFromOwnerCount, registry.getJournal("View")); view.erase(signers); @@ -357,7 +354,7 @@ SignerListSet::replaceSignerList() // If we succeeded, the new entry counts against the // creator's reserve. - adjustOwnerCount(view(), sle, *sponsorSle, kAddedOwnerCount, viewJ); + increaseOwnerCount(view(), sle, *sponsorSle, kAddedOwnerCount, viewJ); addSponsorToLedgerEntry(signerList, *sponsorSle); return tesSUCCESS; } diff --git a/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp b/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp index 2a02dc232e..77c36ef250 100644 --- a/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp +++ b/src/libxrpl/tx/transactors/bridge/XChainBridge.cpp @@ -728,7 +728,7 @@ finalizeClaimHelper( // Remove the claim id from the ledger outerSb.erase(sleClaimID); - adjustOwnerCount(outerSb, sleOwner, {}, -1, j); + decreaseOwnerCount(outerSb, sleOwner, {}, 1, j); } } @@ -1137,7 +1137,7 @@ applyCreateAccountAttestations( return tecINTERNAL; // LCOV_EXCL_LINE // Reserve was already checked - adjustOwnerCount(psb, sleDoor, {}, 1, j); + increaseOwnerCount(psb, sleDoor, {}, 1, j); psb.insert(createdSleClaimID); psb.update(sleDoor); } @@ -1480,7 +1480,7 @@ XChainCreateBridge::doApply() (*sleBridge)[sfOwnerNode] = *page; } - adjustOwnerCount(ctx_.view(), sleAcct, {}, 1, ctx_.journal); + increaseOwnerCount(ctx_.view(), sleAcct, {}, 1, ctx_.journal); ctx_.view().insert(sleBridge); ctx_.view().update(sleAcct); @@ -2041,7 +2041,7 @@ XChainCreateClaimID::doApply() (*sleClaimID)[sfOwnerNode] = *page; } - adjustOwnerCount(ctx_.view(), sleAcct, {}, 1, ctx_.journal); + increaseOwnerCount(ctx_.view(), sleAcct, {}, 1, ctx_.journal); ctx_.view().insert(sleClaimID); ctx_.view().update(sleBridge); diff --git a/src/libxrpl/tx/transactors/check/CheckCancel.cpp b/src/libxrpl/tx/transactors/check/CheckCancel.cpp index e7bd2b23a2..ed60817224 100644 --- a/src/libxrpl/tx/transactors/check/CheckCancel.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCancel.cpp @@ -91,7 +91,7 @@ CheckCancel::doApply() } // If we succeeded, update the check owner's reserve. - adjustOwnerCountObj(view(), srcId, sleCheck, -1, viewJ); + decreaseOwnerCountForObject(view(), srcId, sleCheck, 1, viewJ); // Remove check from ledger. view().erase(sleCheck); diff --git a/src/libxrpl/tx/transactors/check/CheckCash.cpp b/src/libxrpl/tx/transactors/check/CheckCash.cpp index ab46f186f1..7a65d6f615 100644 --- a/src/libxrpl/tx/transactors/check/CheckCash.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCash.cpp @@ -591,8 +591,7 @@ CheckCash::doApply() } // If we succeeded, update the check owner's reserve. - - adjustOwnerCount(psb, psb.peek(keylet::account(srcId)), sponsorCheckSle, -1, viewJ); + decreaseOwnerCountForObject(psb, srcId, sleCheck, 1, viewJ); // Remove check from ledger. psb.erase(sleCheck); diff --git a/src/libxrpl/tx/transactors/check/CheckCreate.cpp b/src/libxrpl/tx/transactors/check/CheckCreate.cpp index e9f3e175c6..c2aacdb29b 100644 --- a/src/libxrpl/tx/transactors/check/CheckCreate.cpp +++ b/src/libxrpl/tx/transactors/check/CheckCreate.cpp @@ -255,7 +255,7 @@ CheckCreate::doApply() } // If we succeeded, the new entry counts against the creator's reserve. - adjustOwnerCount(view(), sle, *sponsorSle, 1, viewJ); + increaseOwnerCount(view(), sle, *sponsorSle, 1, viewJ); addSponsorToLedgerEntry(sleCheck, *sponsorSle); return tesSUCCESS; } diff --git a/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp b/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp index 8cc9beba69..e0d5da1ecc 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialAccept.cpp @@ -116,8 +116,8 @@ CredentialAccept::doApply() sleCred->setFieldU32(sfFlags, lsfAccepted); view().update(sleCred); - adjustOwnerCount(view(), sleIssuer, {}, -1, j_); - adjustOwnerCount(view(), sleSubject, {}, 1, j_); + decreaseOwnerCount(view(), sleIssuer, {}, 1, j_); + increaseOwnerCount(view(), sleSubject, {}, 1, j_); return tesSUCCESS; } diff --git a/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp b/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp index 074a9fd9bf..4491099e43 100644 --- a/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp +++ b/src/libxrpl/tx/transactors/credentials/CredentialCreate.cpp @@ -152,7 +152,7 @@ CredentialCreate::doApply() return tecDIR_FULL; sleCred->setFieldU64(sfIssuerNode, *page); - adjustOwnerCount(view(), sleIssuer, {}, 1, j_); + increaseOwnerCount(view(), sleIssuer, {}, 1, j_); } if (subject == accountID_) diff --git a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp index ff58e9a2c8..91ff57fa81 100644 --- a/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp +++ b/src/libxrpl/tx/transactors/delegate/DelegateSet.cpp @@ -129,7 +129,7 @@ DelegateSet::doApply() (*sle)[sfDestinationNode] = *destPage; ctx_.view().insert(sle); - adjustOwnerCount(ctx_.view(), sleOwner, *sponsorSle, 1, ctx_.journal); + increaseOwnerCount(ctx_.view(), sleOwner, *sponsorSle, 1, ctx_.journal); addSponsorToLedgerEntry(sle, *sponsorSle); return tesSUCCESS; @@ -170,7 +170,7 @@ DelegateSet::deleteDelegate(ApplyView& view, SLE::ref sle, beast::Journal j) if (!sleOwner) return tecINTERNAL; // LCOV_EXCL_LINE - adjustOwnerCountObj(view, sleOwner, sle, -1, j); + decreaseOwnerCountForObject(view, sleOwner, sle, 1, j); view.erase(sle); diff --git a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp index d2eb101861..73ff390d2e 100644 --- a/src/libxrpl/tx/transactors/dex/OfferCreate.cpp +++ b/src/libxrpl/tx/transactors/dex/OfferCreate.cpp @@ -866,7 +866,7 @@ OfferCreate::applyGuts(Sandbox& sb, Sandbox& sbCancel) } // Update owner count. - adjustOwnerCount(sb, sleCreator, {}, 1, viewJ); + increaseOwnerCount(sb, sleCreator, {}, 1, viewJ); JLOG(j_.trace()) << "adding to book: " << to_string(saTakerPays.asset()) << " : " << to_string(saTakerGets.asset()) diff --git a/src/libxrpl/tx/transactors/did/DIDDelete.cpp b/src/libxrpl/tx/transactors/did/DIDDelete.cpp index 1617f880c9..8c5d036272 100644 --- a/src/libxrpl/tx/transactors/did/DIDDelete.cpp +++ b/src/libxrpl/tx/transactors/did/DIDDelete.cpp @@ -50,7 +50,7 @@ DIDDelete::deleteSLE(ApplyView& view, SLE::pointer sle, AccountID const owner, b if (!sleOwner) return tecINTERNAL; // LCOV_EXCL_LINE - adjustOwnerCount(view, sleOwner, {}, -1, j); + decreaseOwnerCount(view, sleOwner, {}, 1, j); view.update(sleOwner); // Remove object from ledger diff --git a/src/libxrpl/tx/transactors/did/DIDSet.cpp b/src/libxrpl/tx/transactors/did/DIDSet.cpp index 1157167082..88084f2d63 100644 --- a/src/libxrpl/tx/transactors/did/DIDSet.cpp +++ b/src/libxrpl/tx/transactors/did/DIDSet.cpp @@ -89,7 +89,7 @@ addSLE(ApplyContext& ctx, SLE::ref sle, AccountID const& owner) return tecDIR_FULL; // LCOV_EXCL_LINE (*sle)[sfOwnerNode] = *page; } - adjustOwnerCount(ctx.view(), sleAccount, {}, 1, ctx.journal); + increaseOwnerCount(ctx.view(), sleAccount, {}, 1, ctx.journal); ctx.view().update(sleAccount); return tesSUCCESS; diff --git a/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp b/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp index 2d515b9581..e65e6bc8ed 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCancel.cpp @@ -210,7 +210,7 @@ EscrowCancel::doApply() } } - adjustOwnerCountObj(ctx_.view(), sle, slep, -1, ctx_.journal); + decreaseOwnerCountForObject(ctx_.view(), sle, slep, 1, ctx_.journal); // Remove escrow from ledger ctx_.view().erase(slep); diff --git a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp index 89142baf8a..c4b755a6b0 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp @@ -563,7 +563,7 @@ EscrowCreate::doApply() } // increment owner count - adjustOwnerCount(ctx_.view(), sle, *sponsorSle, 1, ctx_.journal); + increaseOwnerCount(ctx_.view(), sle, *sponsorSle, 1, ctx_.journal); addSponsorToLedgerEntry(slep, *sponsorSle); ctx_.view().update(sle); return tesSUCCESS; diff --git a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp index 4bc12fbe56..da4fbfaad2 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp @@ -397,7 +397,7 @@ EscrowFinish::doApply() ctx_.view().update(sled); // Adjust source owner count - adjustOwnerCountObj(ctx_.view(), account, slep, -1, ctx_.journal); + decreaseOwnerCountForObject(ctx_.view(), account, slep, 1, ctx_.journal); // Remove escrow from ledger ctx_.view().erase(slep); diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp index 0a8123e110..2344303a05 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerDelete.cpp @@ -195,8 +195,7 @@ LoanBrokerDelete::doApply() // Decreases the owner count by two: one for the LoanBroker object, and // one for the pseudo-account. - // LoanBroker object can be sponsored - adjustOwnerCount(view(), owner, {}, -2, j_); + decreaseOwnerCount(view(), owner, {}, 2, j_); } associateAsset(*broker, vaultAsset); diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp index 6509eb0ec0..40857956f4 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp @@ -238,7 +238,7 @@ LoanBrokerSet::doApply() // Increases the owner count by two: one for the LoanBroker object, and // one for the pseudo-account. - adjustOwnerCount(view, owner, {}, 2, j_); + increaseOwnerCount(view, owner, {}, 2, j_); if (preFeeBalance_ < accountReserve(view, owner, j_)) return tecINSUFFICIENT_RESERVE; diff --git a/src/libxrpl/tx/transactors/lending/LoanDelete.cpp b/src/libxrpl/tx/transactors/lending/LoanDelete.cpp index 37ecc04b09..3132b6aced 100644 --- a/src/libxrpl/tx/transactors/lending/LoanDelete.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanDelete.cpp @@ -109,7 +109,7 @@ LoanDelete::doApply() // Decrement the LoanBroker's owner count. // The broker's owner count is solely for the number of outstanding loans, // and is distinct from the broker's pseudo-account's owner count - adjustOwnerCount(view, brokerSle, {}, -1, j_); + decreaseOwnerCount(view, brokerSle, {}, 1, j_); // If there are no loans left, then any remaining debt must be forgiven, // because there is no other way to pay it back. @@ -130,7 +130,7 @@ LoanDelete::doApply() } } // Decrement the borrower's owner count - adjustOwnerCount(view, borrowerSle, {}, -1, j_); + decreaseOwnerCount(view, borrowerSle, {}, 1, j_); // These associations shouldn't do anything, but do them just to be safe associateAsset(*loanSle, vaultAsset); diff --git a/src/libxrpl/tx/transactors/lending/LoanSet.cpp b/src/libxrpl/tx/transactors/lending/LoanSet.cpp index 3f38a4f4d3..c3b4504929 100644 --- a/src/libxrpl/tx/transactors/lending/LoanSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanSet.cpp @@ -519,7 +519,7 @@ LoanSet::doApply() } } - adjustOwnerCount(view, borrowerSle, {}, 1, j_); + increaseOwnerCount(view, borrowerSle, {}, 1, j_); { auto const balance = @@ -641,7 +641,7 @@ LoanSet::doApply() adjustImpreciseNumber(brokerSle->at(sfDebtTotal), newDebtDelta, vaultAsset, vaultScale); // The broker's owner count is solely for the number of outstanding loans, // and is distinct from the broker's pseudo-account's owner count - adjustOwnerCount(view, brokerSle, {}, 1, j_); + increaseOwnerCount(view, brokerSle, {}, 1, j_); loanSequenceProxy += 1; // The sequence should be extremely unlikely to roll over, but fail if it // does diff --git a/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp b/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp index 823a69b101..e1974a0bcd 100644 --- a/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp +++ b/src/libxrpl/tx/transactors/oracle/OracleDelete.cpp @@ -13,6 +13,8 @@ #include #include +#include + namespace xrpl { NotTEC @@ -68,8 +70,8 @@ OracleDelete::deleteOracle( if (!sleOwner) return tecINTERNAL; // LCOV_EXCL_LINE - auto const count = sle->getFieldArray(sfPriceDataSeries).size() > 5 ? -2 : -1; - adjustOwnerCount(view, sleOwner, {}, count, j); + std::uint32_t const count = sle->getFieldArray(sfPriceDataSeries).size() > 5 ? 2 : 1; + decreaseOwnerCount(view, sleOwner, {}, count, j); view.erase(sle); return tesSUCCESS; diff --git a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp index dd5bcbb117..151d50b7d6 100644 --- a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp +++ b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -179,11 +180,20 @@ OracleSet::preclaim(PreclaimContext const& ctx) } static bool -adjustOwnerCount(ApplyContext& ctx, int count) +adjustOracleOwnerCount(ApplyContext& ctx, int count) { if (auto const sleAccount = ctx.view().peek(keylet::account(ctx.tx[sfAccount]))) { - adjustOwnerCount(ctx.view(), sleAccount, {}, count, ctx.journal); + if (count > 0) + { + increaseOwnerCount( + ctx.view(), sleAccount, {}, static_cast(count), ctx.journal); + } + else if (count < 0) + { + decreaseOwnerCount( + ctx.view(), sleAccount, {}, static_cast(-count), ctx.journal); + } return true; } @@ -269,7 +279,7 @@ OracleSet::doApply() auto const newCount = calculateOracleReserve(pairs.size()); int32_t const adjust = newCount - oldCount; - if (adjust != 0 && !adjustOwnerCount(ctx_, adjust)) + if (adjust != 0 && !adjustOracleOwnerCount(ctx_, adjust)) return tefINTERNAL; // LCOV_EXCL_LINE ctx_.view().update(sle); @@ -319,7 +329,7 @@ OracleSet::doApply() (*sle)[sfOwnerNode] = *page; auto const count = calculateOracleReserve(series.size()); - if (!adjustOwnerCount(ctx_, count)) + if (!adjustOracleOwnerCount(ctx_, count)) return tefINTERNAL; // LCOV_EXCL_LINE ctx_.view().insert(sle); diff --git a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp index 61f3366174..044183e57c 100644 --- a/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp +++ b/src/libxrpl/tx/transactors/payment/DepositPreauth.cpp @@ -191,7 +191,7 @@ DepositPreauth::doApply() slePreauth->setFieldU64(sfOwnerNode, *page); // If we succeeded, the new entry counts against the creator's reserve. - adjustOwnerCount(view(), sleOwner, *sponsorSle, 1, j_); + increaseOwnerCount(view(), sleOwner, *sponsorSle, 1, j_); addSponsorToLedgerEntry(slePreauth, *sponsorSle); } else if (ctx_.tx.isFieldPresent(sfUnauthorize)) @@ -253,7 +253,7 @@ DepositPreauth::doApply() slePreauth->setFieldU64(sfOwnerNode, *page); // If we succeeded, the new entry counts against the creator's reserve. - adjustOwnerCount(view(), sleOwner, *sponsorSle, 1, j_); + increaseOwnerCount(view(), sleOwner, *sponsorSle, 1, j_); addSponsorToLedgerEntry(slePreauth, *sponsorSle); } else if (ctx_.tx.isFieldPresent(sfUnauthorizeCredentials)) @@ -292,7 +292,7 @@ DepositPreauth::removeFromLedger(ApplyView& view, uint256 const& preauthIndex, b if (!sleOwner) return tefINTERNAL; // LCOV_EXCL_LINE - adjustOwnerCountObj(view, sleOwner, slePreauth, -1, j); + decreaseOwnerCountForObject(view, sleOwner, slePreauth, 1, j); // Remove DepositPreauth from ledger. view.erase(slePreauth); diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp index f65bc33056..3a47e31de8 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp @@ -220,7 +220,7 @@ PaymentChannelCreate::doApply() // Deduct owner's balance, increment owner count (*sle)[sfBalance] = (*sle)[sfBalance] - ctx_.tx[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, *sponsorSle, 1, ctx_.journal); + increaseOwnerCount(ctx_.view(), sle, *sponsorSle, 1, ctx_.journal); addSponsorToLedgerEntry(slep, *sponsorSle); ctx_.view().update(sle); diff --git a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp index b02073f981..ccbf95be75 100644 --- a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp +++ b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainDelete.cpp @@ -65,7 +65,7 @@ PermissionedDomainDelete::doApply() XRPL_ASSERT( ownerSle && ownerSle->getFieldU32(sfOwnerCount) > 0, "xrpl::PermissionedDomainDelete::doApply : nonzero owner count"); - adjustOwnerCount(view(), ownerSle, {}, -1, ctx_.journal); + decreaseOwnerCount(view(), ownerSle, {}, 1, ctx_.journal); view().erase(slePd); return tesSUCCESS; diff --git a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp index 658c59f984..f1ce1aa551 100644 --- a/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp +++ b/src/libxrpl/tx/transactors/permissioned_domain/PermissionedDomainSet.cpp @@ -125,7 +125,7 @@ PermissionedDomainSet::doApply() slePd->setFieldU64(sfOwnerNode, *page); // If we succeeded, the new entry counts against the creator's reserve. - adjustOwnerCount(view(), ownerSle, {}, 1, ctx_.journal); + increaseOwnerCount(view(), ownerSle, {}, 1, ctx_.journal); view().insert(slePd); } diff --git a/src/libxrpl/tx/transactors/system/TicketCreate.cpp b/src/libxrpl/tx/transactors/system/TicketCreate.cpp index e8483998d9..f6f01d474a 100644 --- a/src/libxrpl/tx/transactors/system/TicketCreate.cpp +++ b/src/libxrpl/tx/transactors/system/TicketCreate.cpp @@ -121,7 +121,7 @@ TicketCreate::doApply() sleAccountRoot->setFieldU32(sfTicketCount, oldTicketCount + ticketCount); // Every added Ticket counts against the creator's reserve. - adjustOwnerCount(view(), accountID_, {}, ticketCount, viewJ); + increaseOwnerCount(view(), accountID_, {}, ticketCount, viewJ); // TicketCreate is the only transaction that can cause an account root's // Sequence field to increase by more than one. October 2018. diff --git a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp index 6f041980f1..ca0df005f2 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceCreate.cpp @@ -188,7 +188,7 @@ MPTokenIssuanceCreate::create( } // Update owner count. - adjustOwnerCount(view, acct, sponsorSle, 1, journal); + increaseOwnerCount(view, acct, sponsorSle, 1, journal); return mptId; } diff --git a/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp b/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp index 62b4da4c19..ea90fabd39 100644 --- a/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp +++ b/src/libxrpl/tx/transactors/token/MPTokenIssuanceDestroy.cpp @@ -49,7 +49,7 @@ MPTokenIssuanceDestroy::doApply() if (!view().dirRemove(keylet::ownerDir(accountID_), (*mpt)[sfOwnerNode], mpt->key(), false)) return tefBAD_LEDGER; // LCOV_EXCL_LINE - adjustOwnerCountObj(view(), accountID_, mpt, -1, j_); + decreaseOwnerCountForObject(view(), accountID_, mpt, 1, j_); view().erase(mpt); return tesSUCCESS; diff --git a/src/libxrpl/tx/transactors/token/TrustSet.cpp b/src/libxrpl/tx/transactors/token/TrustSet.cpp index 6961b40bd1..55b4439464 100644 --- a/src/libxrpl/tx/transactors/token/TrustSet.cpp +++ b/src/libxrpl/tx/transactors/token/TrustSet.cpp @@ -535,16 +535,16 @@ TrustSet::doApply() if (bLowReserveSet && !bLowReserved) { - // should be checked PreFunded Sponsor before adjustOwnerCount() + // should be checked PreFunded Sponsor before increaseOwnerCount() // For PreFunded sponsors, we need to check if there are sufficient reserves before - // calling adjustOwnerCount(). + // calling increaseOwnerCount(). if (auto const ret = checkInsufficientReserve( view(), ctx_.tx, sleLowAccount, preFeeBalance_, *sponsorSle, 1, 0, j_); *sponsorSle && !isTesSuccess(ret)) return tecINSUF_RESERVE_LINE; // Set reserve for low account. - adjustOwnerCount(view(), sleLowAccount, *sponsorSle, 1, viewJ); + increaseOwnerCount(view(), sleLowAccount, *sponsorSle, 1, viewJ); uFlagsOut |= lsfLowReserve; addSponsorToLedgerEntry(sleRippleState, *sponsorSle, sfLowSponsor); @@ -556,7 +556,7 @@ TrustSet::doApply() if (bLowReserveClear && bLowReserved) { // Clear reserve for low account. - adjustOwnerCount(view(), sleLowAccount, currentLowSponsor, -1, viewJ); + decreaseOwnerCount(view(), sleLowAccount, currentLowSponsor, 1, viewJ); uFlagsOut &= ~lsfLowReserve; removeSponsorFromLedgerEntry(sleRippleState, sfLowSponsor); @@ -564,16 +564,16 @@ TrustSet::doApply() if (bHighReserveSet && !bHighReserved) { - // should be checked PreFunded Sponsor before adjustOwnerCount() + // should be checked PreFunded Sponsor before increaseOwnerCount() // For PreFunded sponsors, we need to check if there are sufficient reserves before - // calling adjustOwnerCount(). + // calling increaseOwnerCount(). if (auto const ret = checkInsufficientReserve( view(), ctx_.tx, sleHighAccount, preFeeBalance_, *sponsorSle, 1, 0, j_); *sponsorSle && !isTesSuccess(ret)) return tecINSUF_RESERVE_LINE; // Set reserve for high account. - adjustOwnerCount(view(), sleHighAccount, *sponsorSle, 1, viewJ); + increaseOwnerCount(view(), sleHighAccount, *sponsorSle, 1, viewJ); uFlagsOut |= lsfHighReserve; addSponsorToLedgerEntry(sleRippleState, *sponsorSle, sfHighSponsor); @@ -585,7 +585,7 @@ TrustSet::doApply() if (bHighReserveClear && bHighReserved) { // Clear reserve for high account. - adjustOwnerCount(view(), sleHighAccount, currentHighSponsor, -1, viewJ); + decreaseOwnerCount(view(), sleHighAccount, currentHighSponsor, 1, viewJ); uFlagsOut &= ~lsfHighReserve; removeSponsorFromLedgerEntry(sleRippleState, sfHighSponsor); diff --git a/src/libxrpl/tx/transactors/vault/VaultCreate.cpp b/src/libxrpl/tx/transactors/vault/VaultCreate.cpp index 711bf275d7..7d4447468f 100644 --- a/src/libxrpl/tx/transactors/vault/VaultCreate.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultCreate.cpp @@ -156,7 +156,7 @@ VaultCreate::doApply() if (auto ter = dirLink(view(), accountID_, vault)) return ter; // We will create Vault and PseudoAccount, hence increase OwnerCount by 2 - adjustOwnerCount(view(), owner, {}, 2, j_); + increaseOwnerCount(view(), owner, {}, 2, j_); if (preFeeBalance_ < accountReserve(view(), owner, j_)) return tecINSUFFICIENT_RESERVE; diff --git a/src/libxrpl/tx/transactors/vault/VaultDelete.cpp b/src/libxrpl/tx/transactors/vault/VaultDelete.cpp index 8df8e73f12..bbca333db5 100644 --- a/src/libxrpl/tx/transactors/vault/VaultDelete.cpp +++ b/src/libxrpl/tx/transactors/vault/VaultDelete.cpp @@ -145,7 +145,7 @@ VaultDelete::doApply() return tefBAD_LEDGER; // LCOV_EXCL_STOP } - adjustOwnerCount(view(), pseudoAcct, {}, -1, j_); + decreaseOwnerCount(view(), pseudoAcct, {}, 1, j_); view().erase(mpt); @@ -204,7 +204,7 @@ VaultDelete::doApply() } // We are destroying Vault and PseudoAccount, hence decrease by 2 - adjustOwnerCount(view(), owner, {}, -2, j_); + decreaseOwnerCount(view(), owner, {}, 2, j_); // Destroy the vault. view().erase(vault); diff --git a/src/test/app/Invariants_test.cpp b/src/test/app/Invariants_test.cpp index 84a4dfddac..b690dda82a 100644 --- a/src/test/app/Invariants_test.cpp +++ b/src/test/app/Invariants_test.cpp @@ -336,7 +336,7 @@ class Invariants_test : public beast::unit_test::Suite // check. sleA1->at(sfBalance) = beast::kZero; BEAST_EXPECT(sleA1->at(sfOwnerCount) == 0); - adjustOwnerCount(ac.view(), sleA1, {}, 1, ac.journal); + increaseOwnerCount(ac.view(), sleA1, {}, 1, ac.journal); ac.view().erase(sleA1); diff --git a/src/test/app/MPToken_test.cpp b/src/test/app/MPToken_test.cpp index b6c6ef5d93..918a0e99d4 100644 --- a/src/test/app/MPToken_test.cpp +++ b/src/test/app/MPToken_test.cpp @@ -7561,7 +7561,7 @@ class MPToken_test : public beast::unit_test::Suite void testFixDoubleOwnerCount(FeatureBitset all) { - testcase("Fix Double adjustOwnerCount in AMMWithdraw"); + testcase("Fix Double OwnerCount in AMMWithdraw"); using namespace jtx;