From d324b7a7312e4743c7f05970444a838e60265d34 Mon Sep 17 00:00:00 2001 From: yinyiqian1 Date: Wed, 8 Jul 2026 17:54:31 -0400 Subject: [PATCH] refactor: combine reassign/create in SponsorshipTransfer doApply (#7766) --- .../xrpl/protocol/detail/transactions.macro | 1 + .../tx/transactors/sponsor/SponsorshipSet.h | 6 +- .../transactors/sponsor/SponsorshipTransfer.h | 6 +- .../sponsor/SponsorshipTransfer.cpp | 159 +++++------------- 4 files changed, 47 insertions(+), 125 deletions(-) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index 951fe4a172..316fdbae4b 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -1164,6 +1164,7 @@ TRANSACTION(ttCONFIDENTIAL_MPT_CLAWBACK, 89, ConfidentialMPTClawback, {sfMPTAmount, SoeRequired}, {sfZKProof, SoeRequired}, }))/** This transaction transfer sponsorship */ + #if TRANSACTION_INCLUDE # include #endif diff --git a/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h b/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h index 6bda7367b5..3bc029d34f 100644 --- a/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h +++ b/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h @@ -10,7 +10,6 @@ #include #include -#include namespace xrpl { @@ -36,10 +35,7 @@ public: doApply() override; void - visitInvariantEntry( - bool isDelete, - std::shared_ptr const& before, - std::shared_ptr const& after) override; + visitInvariantEntry(bool isDelete, SLE::const_ref before, SLE::const_ref after) override; [[nodiscard]] bool finalizeInvariants( diff --git a/include/xrpl/tx/transactors/sponsor/SponsorshipTransfer.h b/include/xrpl/tx/transactors/sponsor/SponsorshipTransfer.h index 5bc43dc32f..cf0022ab72 100644 --- a/include/xrpl/tx/transactors/sponsor/SponsorshipTransfer.h +++ b/include/xrpl/tx/transactors/sponsor/SponsorshipTransfer.h @@ -10,7 +10,6 @@ #include #include -#include namespace xrpl { @@ -36,10 +35,7 @@ public: doApply() override; void - visitInvariantEntry( - bool isDelete, - std::shared_ptr const& before, - std::shared_ptr const& after) override; + visitInvariantEntry(bool isDelete, SLE::const_ref before, SLE::const_ref after) override; [[nodiscard]] bool finalizeInvariants( diff --git a/src/libxrpl/tx/transactors/sponsor/SponsorshipTransfer.cpp b/src/libxrpl/tx/transactors/sponsor/SponsorshipTransfer.cpp index 7abce5b774..907ac4a527 100644 --- a/src/libxrpl/tx/transactors/sponsor/SponsorshipTransfer.cpp +++ b/src/libxrpl/tx/transactors/sponsor/SponsorshipTransfer.cpp @@ -305,6 +305,9 @@ SponsorshipTransfer::doApply() return sle->getFieldAmount(sfBalance); }; + bool const isCreate = ctx_.tx.isFlag(tfSponsorshipCreate); + bool const isReassign = ctx_.tx.isFlag(tfSponsorshipReassign); + if (objectID.has_value()) { // Transfer object sponsor @@ -323,66 +326,13 @@ SponsorshipTransfer::doApply() auto const ownerCountDelta = static_cast(getLedgerEntryOwnerCount(objectSle)); auto const& sponsorField = getLedgerEntrySponsorField(objectSle, *ownerID); - if (ctx_.tx.isFlag(tfSponsorshipCreate)) + if (isCreate || isReassign) { - // Create object sponsor - auto const newSponsor = ctx_.tx[~sfSponsor]; - XRPL_ASSERT( - newSponsor.has_value(), - "xrpl::SponsorshipTransfer::doApply : sfSponsor present for object sponsor create"); - if (!newSponsor) - return tefINTERNAL; // LCOV_EXCL_LINE - auto const newSponsorID = *newSponsor; - auto const newSponsorSle = view().peek(keylet::account(newSponsorID)); - if (!newSponsorSle) - return tefINTERNAL; // LCOV_EXCL_LINE - - // Check if new sponsor has sufficient balance - // NOLINTNEXTLINE(readability-suspicious-call-argument) - if (auto const ter = checkReserve( - ctx_.getApplyViewContext(), - sponseeSle, - sponseeSle->getFieldAmount(sfBalance), - newSponsorSle, - {.ownerCountDelta = ownerCountDelta}, - ctx_.journal); - !isTesSuccess(ter)) - return ter; - - // Update owner's sponsored count - if (auto const ter = - incrementSponsorCount(view(), ownerSle, sfSponsoredOwnerCount, ownerCountDelta); - !isTesSuccess(ter)) - return ter; - - // Increment new sponsor's sponsoring count - if (auto const ter = incrementSponsorCount( - view(), newSponsorSle, sfSponsoringOwnerCount, ownerCountDelta); - !isTesSuccess(ter)) - return ter; - - // Object is now sponsored by new sponsor - objectSle->setAccountID(sponsorField, newSponsorID); - view().update(objectSle); - - auto const sponsorshipSle = view().peek(keylet::sponsorship(newSponsorID, sponseeID)); - if (sponsorshipSle) - { - // Update ReserveCount for sponsorship object if it exists - if (auto const ter = - decrementPrefundedReserveCount(view(), sponsorshipSle, ownerCountDelta); - !isTesSuccess(ter)) - return ter; - } - } - else if (ctx_.tx.isFlag(tfSponsorshipReassign)) - { - // Reassign object sponsor auto const newSponsor = ctx_.tx[~sfSponsor]; XRPL_ASSERT( newSponsor.has_value(), "xrpl::SponsorshipTransfer::doApply : sfSponsor present for object sponsor " - "reassign"); + "create/reassign"); if (!newSponsor) return tefINTERNAL; // LCOV_EXCL_LINE auto const newSponsorID = *newSponsor; @@ -390,13 +340,6 @@ SponsorshipTransfer::doApply() if (!newSponsorSle) return tefINTERNAL; // LCOV_EXCL_LINE - auto const oldSponsorID = objectSle->getAccountID(sponsorField); - if (!oldSponsorID) - return tefINTERNAL; // LCOV_EXCL_LINE - auto const oldSponsorSle = view().peek(keylet::account(oldSponsorID)); - if (!oldSponsorSle) - return tefINTERNAL; // LCOV_EXCL_LINE - // Check if new sponsor has sufficient balance // NOLINTNEXTLINE(readability-suspicious-call-argument) if (auto const ter = checkReserve( @@ -409,11 +352,29 @@ SponsorshipTransfer::doApply() !isTesSuccess(ter)) return ter; - // Decrement old sponsor's sponsoring count - if (auto const ter = decrementSponsorCount( - view(), oldSponsorSle, sfSponsoringOwnerCount, ownerCountDelta); - !isTesSuccess(ter)) - return ter; + if (isCreate) + { + // Update owner's sponsored count + if (auto const ter = incrementSponsorCount( + view(), ownerSle, sfSponsoredOwnerCount, ownerCountDelta); + !isTesSuccess(ter)) + return ter; + } + else if (isReassign) + { + auto const oldSponsorID = objectSle->getAccountID(sponsorField); + if (!oldSponsorID) + return tefINTERNAL; // LCOV_EXCL_LINE + auto const oldSponsorSle = view().peek(keylet::account(oldSponsorID)); + if (!oldSponsorSle) + return tefINTERNAL; // LCOV_EXCL_LINE + + // Decrement old sponsor's sponsoring count + if (auto const ter = decrementSponsorCount( + view(), oldSponsorSle, sfSponsoringOwnerCount, ownerCountDelta); + !isTesSuccess(ter)) + return ter; + } // Increment new sponsor's sponsoring count if (auto const ter = incrementSponsorCount( @@ -478,14 +439,13 @@ SponsorshipTransfer::doApply() { // Account-level sponsorship is always co-signed (preflight requires // sfSponsorSignature), so there is no pre-funded budget to draw down here. - if (ctx_.tx.isFlag(tfSponsorshipCreate)) + if (isCreate || isReassign) { - // Create account sponsor auto const newSponsor = ctx_.tx[~sfSponsor]; XRPL_ASSERT( newSponsor.has_value(), "xrpl::SponsorshipTransfer::doApply : sfSponsor present for account sponsor " - "create"); + "create/reassign"); if (!newSponsor) return tefINTERNAL; // LCOV_EXCL_LINE auto const newSponsorID = *newSponsor; @@ -503,40 +463,21 @@ SponsorshipTransfer::doApply() !isTesSuccess(ter)) return ter; - // Increment new sponsoring count - if (auto const ter = - incrementSponsorCount(view(), newSponsorSle, sfSponsoringAccountCount, 1); - !isTesSuccess(ter)) - return ter; + if (isReassign) + { + auto const oldSponsorID = sponseeSle->getAccountID(sfSponsor); + if (!oldSponsorID) + return tefINTERNAL; // LCOV_EXCL_LINE + auto const oldSponsorSle = view().peek(keylet::account(oldSponsorID)); + if (!oldSponsorSle) + return tefINTERNAL; // LCOV_EXCL_LINE - // Account is now sponsored by new sponsor - sponseeSle->setAccountID(sfSponsor, newSponsorID); - view().update(sponseeSle); - } - else if (ctx_.tx.isFlag(tfSponsorshipReassign)) - { - // Reassign account sponsor - auto const newSponsor = ctx_.tx[~sfSponsor]; - XRPL_ASSERT( - newSponsor.has_value(), - "xrpl::SponsorshipTransfer::doApply : sfSponsor present for account sponsor " - "reassign"); - if (!newSponsor) - return tefINTERNAL; // LCOV_EXCL_LINE - auto const newSponsorID = *newSponsor; - auto const newSponsorSle = view().peek(keylet::account(newSponsorID)); - if (!newSponsorSle) - return tefINTERNAL; // LCOV_EXCL_LINE - - if (auto const ter = checkReserve( - ctx_.getApplyViewContext(), - sponseeSle, - sponseeSle->getFieldAmount(sfBalance), - newSponsorSle, - {.accountCountDelta = 1}, - ctx_.journal); - !isTesSuccess(ter)) - return ter; + // Decrement old sponsoring count + if (auto const ter = + decrementSponsorCount(view(), oldSponsorSle, sfSponsoringAccountCount, 1); + !isTesSuccess(ter)) + return ter; + } // Increment new sponsoring count if (auto const ter = @@ -544,18 +485,6 @@ SponsorshipTransfer::doApply() !isTesSuccess(ter)) return ter; - // Decrement old sponsoring count - auto const oldSponsorID = sponseeSle->getAccountID(sfSponsor); - if (!oldSponsorID) - return tefINTERNAL; // LCOV_EXCL_LINE - auto const oldSponsorSle = view().peek(keylet::account(oldSponsorID)); - if (!oldSponsorSle) - return tefINTERNAL; // LCOV_EXCL_LINE - if (auto const ter = - decrementSponsorCount(view(), oldSponsorSle, sfSponsoringAccountCount, 1); - !isTesSuccess(ter)) - return ter; - // Account is now sponsored by new sponsor sponseeSle->setAccountID(sfSponsor, newSponsorID); view().update(sponseeSle);