mirror of
https://github.com/XRPLF/rippled.git
synced 2026-06-03 16:56:48 +00:00
return tecHAS_OBLIGATIONS for any conditions when deleting account linked to ltSponsorship
This commit is contained in:
@@ -27,10 +27,6 @@ public:
|
||||
|
||||
TER
|
||||
doApply() override;
|
||||
|
||||
// Interface used by DeleteAccount
|
||||
static TER
|
||||
deleteSponsorship(ApplyView& view, std::shared_ptr<SLE> const& sle, beast::Journal j);
|
||||
};
|
||||
|
||||
} // namespace xrpl
|
||||
|
||||
@@ -332,39 +332,4 @@ SponsorshipSet::doApply()
|
||||
return tesSUCCESS;
|
||||
}
|
||||
|
||||
TER
|
||||
SponsorshipSet::deleteSponsorship(
|
||||
ApplyView& view,
|
||||
std::shared_ptr<SLE> 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
|
||||
|
||||
@@ -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<SLE> 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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user