mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-29 01:50:43 +00:00
fix: AccountDelete works with sponsored objects
This commit is contained in:
@@ -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,9 +407,13 @@ 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
|
||||
|
||||
XRPL_ASSERT(
|
||||
sponsorSle->isFieldPresent(sfSponsoringAccountCount),
|
||||
"xrpl::AccountDelete::doApply : sponsoring account count is present");
|
||||
|
||||
auto const sponsoringAccountCount = sponsorSle->getFieldU32(sfSponsoringAccountCount);
|
||||
|
||||
if (sponsoringAccountCount == 0)
|
||||
|
||||
@@ -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,30 @@ 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));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user