From 9a6432dd66808ac159b80711925495f0d26876d7 Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 19 Mar 2026 14:50:09 +0900 Subject: [PATCH] fix M3 --- .../tx/transactors/Sponsor/SponsorshipSet.cpp | 19 ++++++++++++------- src/test/app/Sponsor_test.cpp | 10 +++++++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp index 6a1d1822c6..073226b96b 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp @@ -215,11 +215,6 @@ SponsorshipSet::doApply() // Create auto newSle = std::make_shared(sponsorKeylet); - if (auto const ret = checkInsufficientReserve( - ctx_.view(), ctx_.tx, sponsorAccSle, preFeeBalance_, reserveSponsorAccSle, 1); - !isTesSuccess(ret)) - return tecUNFUNDED; - (*newSle)[sfOwner] = sponsorAccountID; (*newSle)[sfSponsee] = sponseeAccountID; if (feeAmount && (*feeAmount).xrp() > (*sponsorAccSle)[sfBalance]) @@ -230,6 +225,17 @@ SponsorshipSet::doApply() (*sponsorAccSle)[sfBalance] -= *feeAmount; (*newSle)[sfFeeAmount] = *feeAmount; } + + if (auto const ret = checkInsufficientReserve( + ctx_.view(), + ctx_.tx, + sponsorAccSle, + STAmount{(*sponsorAccSle)[sfBalance]}.xrp(), + reserveSponsorAccSle, + 1); + !isTesSuccess(ret)) + return tecUNFUNDED; + if (maxFee && *maxFee > XRPAmount(0)) (*newSle)[sfMaxFee] = *maxFee; if (reserveCount && *reserveCount > 0) @@ -267,8 +273,7 @@ SponsorshipSet::doApply() auto const currentFeeAmount = (*sponsorObjSle)[~sfFeeAmount].value_or(XRPAmount(0)); auto feeAmountDelta = XRPAmount(*feeAmount - currentFeeAmount); - if (feeAmountDelta > beast::zero && - feeAmountDelta > (*sponsorAccSle)[sfBalance]) + if (feeAmountDelta > beast::zero && feeAmountDelta > (*sponsorAccSle)[sfBalance]) return tecUNFUNDED; // transfer feeAmount to ledger entry diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index a83362258b..2b83fc634f 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -187,8 +187,11 @@ public: env.close(); // insufficent reserve to create sponsorship - adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1)); - env(sponsor::set(sponsor, 0, 100, XRP(100)), sponsor::sponseeAcc(alice), ter(tecUNFUNDED)); + adjustAccountXRPBalance(env, sponsor, XRP(100) + XRP(1) + reserve(env, 1) - drops(1)); + env(sponsor::set(sponsor, 0, 100, XRP(100)), + sponsor::sponseeAcc(alice), + fee(XRP(1)), + ter(tecUNFUNDED)); env.close(); // FeeAmount + Fee > Balance @@ -208,7 +211,8 @@ public: env.close(); // create sponsor to use above tests - adjustAccountXRPBalance(env, sponsor, XRP(1001)); + // need feeAmount(1000) + fee(1) + reserve(~250) = ~1251 + adjustAccountXRPBalance(env, sponsor, XRP(1000) + XRP(1) + reserve(env, 1)); env(sponsor::set(sponsor, 0, 100, XRP(1000)), sponsor::sponseeAcc(alice), fee(XRP(1)),