From f8a8c2301cb4386ae1d9302fe7530f8ba92a0280 Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 19 Mar 2026 14:33:55 +0900 Subject: [PATCH] fix M2 --- .../tx/transactors/Sponsor/SponsorshipSet.cpp | 10 +++++-- src/test/app/Sponsor_test.cpp | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp index 15e8d3b1b3..6a1d1822c6 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp @@ -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) { diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 890e232487..a83362258b 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -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