test: AccountDelete works with sponsored objects (#7740)

This commit is contained in:
Mayukha Vadari
2026-07-07 11:06:31 -04:00
committed by GitHub
parent 7868d6ed79
commit af58fdac3c
2 changed files with 35 additions and 10 deletions

View File

@@ -396,9 +396,6 @@ AccountDelete::doApply()
if (!isTesSuccess(ter))
return ter;
if (src->isFieldPresent(sfSponsoredOwnerCount))
return tefINTERNAL; // LCOV_EXCL_LINE
// Transfer any XRP remaining after the fee is paid to the destination:
auto const remainingBalance = src->getFieldAmount(sfBalance).xrp();
(*dst)[sfBalance] = (*dst)[sfBalance] + remainingBalance;
@@ -410,11 +407,14 @@ AccountDelete::doApply()
auto const sponsorID = src->getAccountID(sfSponsor);
auto sponsorSle = view().peek(keylet::account(sponsorID));
if (!sponsorSle || !sponsorSle->isFieldPresent(sfSponsoringAccountCount))
if (!sponsorSle)
return tefINTERNAL; // LCOV_EXCL_LINE
auto const sponsoringAccountCount = sponsorSle->getFieldU32(sfSponsoringAccountCount);
XRPL_ASSERT(
sponsoringAccountCount != 0,
"xrpl::AccountDelete::doApply : sponsoring account count is present");
if (sponsoringAccountCount == 0)
{
// sanity check

View File

@@ -3897,12 +3897,6 @@ public:
auto const usd = gw["usd"];
// Create sponsorship allowing reserve sponsoring
env(sponsor::set(sponsor, 0, 100, XRP(100)),
sponsor::SponseeAcc(alice),
Ter(tesSUCCESS));
env.close();
// Create a trust line for alice
env(trust(alice, usd(1000)));
env.close();
@@ -3962,6 +3956,37 @@ public:
BEAST_EXPECT(
sponsorSleAfter->getFieldU32(sfSponsoringAccountCount) == sponsoringAccountCount);
}
{
// Account with sponsored objects should be deletable
Env env{*this, testableAmendments()};
env.fund(XRP(1000000), alice, bob, sponsor);
env.close();
// Create sponsored delegate (a non-deletion-blocker)
env(deposit::auth(alice, bob),
sponsor::As(sponsor, spfSponsorReserve),
Sig(sfSponsorSignature, sponsor));
{
auto const sponsorSle = env.le(keylet::account(sponsor));
auto const aliceSle = env.le(keylet::account(alice));
BEAST_EXPECT(sponsorSle->at(sfSponsoringOwnerCount) == 1);
BEAST_EXPECT(aliceSle->at(sfOwnerCount) == 1);
BEAST_EXPECT(aliceSle->at(sfSponsoredOwnerCount) == 1);
}
incLgrSeqForAccDel(env, alice);
// AccountDelete should succeed
{
auto const requiredFee = drops(env.current()->fees().increment);
env(acctdelete(alice, bob), Fee(requiredFee), Ter(tesSUCCESS));
BEAST_EXPECT(!env.le(keylet::account(alice)));
auto const sponsorSle = env.le(keylet::account(sponsor));
BEAST_EXPECT(sponsorSle->at(sfSponsoringOwnerCount) == 0);
}
}
}
void