refactor: combine reassign/create in SponsorshipTransfer doApply (#7766)

This commit is contained in:
yinyiqian1
2026-07-08 17:54:31 -04:00
committed by GitHub
parent 03d333855f
commit d324b7a731
4 changed files with 47 additions and 125 deletions

View File

@@ -1164,6 +1164,7 @@ TRANSACTION(ttCONFIDENTIAL_MPT_CLAWBACK, 89, ConfidentialMPTClawback,
{sfMPTAmount, SoeRequired},
{sfZKProof, SoeRequired},
}))/** This transaction transfer sponsorship */
#if TRANSACTION_INCLUDE
# include <xrpl/tx/transactors/sponsor/SponsorshipTransfer.h>
#endif

View File

@@ -10,7 +10,6 @@
#include <xrpl/tx/Transactor.h>
#include <cstdint>
#include <memory>
namespace xrpl {
@@ -36,10 +35,7 @@ public:
doApply() override;
void
visitInvariantEntry(
bool isDelete,
std::shared_ptr<SLE const> const& before,
std::shared_ptr<SLE const> const& after) override;
visitInvariantEntry(bool isDelete, SLE::const_ref before, SLE::const_ref after) override;
[[nodiscard]] bool
finalizeInvariants(

View File

@@ -10,7 +10,6 @@
#include <xrpl/tx/Transactor.h>
#include <cstdint>
#include <memory>
namespace xrpl {
@@ -36,10 +35,7 @@ public:
doApply() override;
void
visitInvariantEntry(
bool isDelete,
std::shared_ptr<SLE const> const& before,
std::shared_ptr<SLE const> const& after) override;
visitInvariantEntry(bool isDelete, SLE::const_ref before, SLE::const_ref after) override;
[[nodiscard]] bool
finalizeInvariants(

View File

@@ -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<std::int32_t>(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);