From a115d73c56385e8a0df28fb1e88b985408f35a4d Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 10 Apr 2026 14:13:25 +0900 Subject: [PATCH] return `tecHAS_OBLIGATIONS` for any conditions when deleting account linked to l`tSponsorship` --- .../tx/transactors/sponsor/SponsorshipSet.h | 4 -- .../tx/transactors/Sponsor/SponsorshipSet.cpp | 35 ---------------- .../tx/transactors/account/AccountDelete.cpp | 14 ------- src/test/app/Sponsor_test.cpp | 42 ++----------------- 4 files changed, 3 insertions(+), 92 deletions(-) diff --git a/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h b/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h index d1cf244f8b..7ebd34e127 100644 --- a/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h +++ b/include/xrpl/tx/transactors/sponsor/SponsorshipSet.h @@ -27,10 +27,6 @@ public: TER doApply() override; - - // Interface used by DeleteAccount - static TER - deleteSponsorship(ApplyView& view, std::shared_ptr const& sle, beast::Journal j); }; } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp index 805a51dbb7..f5e9f333f6 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp @@ -332,39 +332,4 @@ SponsorshipSet::doApply() return tesSUCCESS; } -TER -SponsorshipSet::deleteSponsorship( - ApplyView& view, - std::shared_ptr const& sle, - beast::Journal j) -{ - auto const sponsorAccountID = sle->getAccountID(sfOwner); - auto const sponseeAccountID = sle->getAccountID(sfSponsee); - - // adjust balance - auto const sponsorAccSle = view.peek(keylet::account(sponsorAccountID)); - if (!sponsorAccSle) - return tecINTERNAL; // LCOV_EXCL_LINE - - if (sle->isFieldPresent(sfFeeAmount)) - { - auto const feeAmount = sle->getFieldAmount(sfFeeAmount); - (*sponsorAccSle)[sfBalance] += feeAmount; - } - - auto const reserveSponsor = getLedgerEntryReserveSponsor(view, sle); - adjustOwnerCount(view, sponsorAccSle, reserveSponsor, -1, j); - - view.update(sponsorAccSle); - - // delete sponsor node - view.dirRemove(keylet::ownerDir(sponsorAccountID), (*sle)[sfOwnerNode], sle->key(), false); - // delete sponsee node - view.dirRemove(keylet::ownerDir(sponseeAccountID), (*sle)[sfSponseeNode], sle->key(), false); - - view.erase(sle); - - return tesSUCCESS; -} - } // namespace xrpl diff --git a/src/libxrpl/tx/transactors/account/AccountDelete.cpp b/src/libxrpl/tx/transactors/account/AccountDelete.cpp index a436b4ba8a..4bb66034d7 100644 --- a/src/libxrpl/tx/transactors/account/AccountDelete.cpp +++ b/src/libxrpl/tx/transactors/account/AccountDelete.cpp @@ -169,18 +169,6 @@ removeDelegateFromLedger( return DelegateSet::deleteDelegate(view, sleDel, account, j); } -TER -removeSponsorshipFromLedger( - ServiceRegistry& registry, - ApplyView& view, - AccountID const&, - uint256 const& delIndex, - std::shared_ptr const& sleDel, - beast::Journal j) -{ - return SponsorshipSet::deleteSponsorship(view, sleDel, j); -} - // Return nullptr if the LedgerEntryType represents an obligation that can't // be deleted. Otherwise return the pointer to the function that can delete // the non-obligation @@ -207,8 +195,6 @@ nonObligationDeleter(LedgerEntryType t) return removeCredentialFromLedger; case ltDELEGATE: return removeDelegateFromLedger; - case ltSPONSORSHIP: - return removeSponsorshipFromLedger; default: return nullptr; } diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index caf08ad8a2..3b63c7aefe 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -4953,37 +4953,7 @@ public: Account const sponsor("sponsor"); { - // Delete Sponsee Account with ltSponsorship - Env env{*this, testable_amendments()}; - env.fund(XRP(1000000), alice, bob, sponsor); - env.close(); - - // set sponsor - env(sponsor::set(sponsor, 0, 100, XRP(100)), - sponsor::sponseeAcc(alice), - ter(tesSUCCESS)); - env.close(); - - incLgrSeqForAccDel(env, alice); - - auto const keylet = keylet::sponsor(sponsor, alice); - auto const sponsorObj = env.le(keylet); - BEAST_EXPECT(sponsorObj); - - // AccountDelete - auto const requiredFee = drops(env.current()->fees().increment); - env(acctdelete(alice, bob), fee(requiredFee), ter(tesSUCCESS)); - env.close(); - - BEAST_EXPECT(!env.le(keylet)); - auto const jv = sponsor::ledgerEntry(env, sponsor, alice); - BEAST_EXPECT( - jv.isObject() && jv.isMember(jss::result) && jv[jss::result].isMember(jss::error) && - jv[jss::result][jss::error] == "entryNotFound"); - } - - { - // Delete Sponsor Account with ltSponsorship + // Delete Sponsor/Sponsee Account with ltSponsorship (tecHAS_OBLIGATIONS) Env env{*this, testable_amendments()}; env.fund(XRP(1000000), alice, bob, sponsor); env.close(); @@ -5002,14 +4972,8 @@ public: // AccountDelete auto const requiredFee = drops(env.current()->fees().increment); - env(acctdelete(sponsor, alice), fee(requiredFee), ter(tesSUCCESS)); - env.close(); - - BEAST_EXPECT(!env.le(keylet)); - auto const jv = sponsor::ledgerEntry(env, sponsor, alice); - BEAST_EXPECT( - jv.isObject() && jv.isMember(jss::result) && jv[jss::result].isMember(jss::error) && - jv[jss::result][jss::error] == "entryNotFound"); + env(acctdelete(alice, bob), fee(requiredFee), ter(tecHAS_OBLIGATIONS)); + env(acctdelete(sponsor, bob), fee(requiredFee), ter(tecHAS_OBLIGATIONS)); } {