This commit is contained in:
tequ
2026-03-19 14:33:55 +09:00
parent e40e15a866
commit f8a8c2301c
2 changed files with 36 additions and 3 deletions

View File

@@ -210,9 +210,6 @@ SponsorshipSet::doApply()
auto reserveSponsorAccSle = getTxReserveSponsor(view(), ctx_.tx);
if (feeAmount && (*feeAmount).xrp() > (*sponsorAccSle)[sfBalance])
return tecUNFUNDED;
if (!sponsorObjSle)
{
// Create
@@ -225,6 +222,9 @@ SponsorshipSet::doApply()
(*newSle)[sfOwner] = sponsorAccountID;
(*newSle)[sfSponsee] = sponseeAccountID;
if (feeAmount && (*feeAmount).xrp() > (*sponsorAccSle)[sfBalance])
return tecUNFUNDED;
if (feeAmount && *feeAmount > XRPAmount(0))
{
(*sponsorAccSle)[sfBalance] -= *feeAmount;
@@ -267,6 +267,10 @@ SponsorshipSet::doApply()
auto const currentFeeAmount = (*sponsorObjSle)[~sfFeeAmount].value_or(XRPAmount(0));
auto feeAmountDelta = XRPAmount(*feeAmount - currentFeeAmount);
if (feeAmountDelta > beast::zero &&
feeAmountDelta > (*sponsorAccSle)[sfBalance])
return tecUNFUNDED;
// transfer feeAmount to ledger entry
if (feeAmountDelta != beast::zero)
{

View File

@@ -214,6 +214,35 @@ public:
fee(XRP(1)),
ter(tesSUCCESS));
env.close();
// delta-based balance check
// After create: sponsor balance ~ 0, feeAmount = XRP(1000)
// Decreasing feeAmount should succeed (refund, negative delta)
adjustAccountXRPBalance(env, sponsor, XRP(500));
env(sponsor::set_fee(sponsor, 0, XRP(800)),
sponsor::sponseeAcc(alice),
fee(XRP(1)),
ter(tesSUCCESS));
env.close();
// balance was 500, delta = 800-1000 = -200 (refund), balance = 500+200-1 = 699
// Increasing feeAmount within delta budget should succeed
adjustAccountXRPBalance(env, sponsor, XRP(500));
env(sponsor::set_fee(sponsor, 0, XRP(850)),
sponsor::sponseeAcc(alice),
fee(XRP(1)),
ter(tesSUCCESS));
env.close();
// balance was 500, delta = 850-800 = 50, balance = 500-50-1 = 449
// Increasing feeAmount where delta exceeds balance should fail
adjustAccountXRPBalance(env, sponsor, XRP(310));
env(sponsor::set_fee(sponsor, 0, XRP(1200)),
sponsor::sponseeAcc(alice),
fee(XRP(1)),
ter(tecUNFUNDED));
env.close();
}
void