From 527d7bbedeab29ba84b420937dbd462f5b6256fa Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 30 Jan 2026 23:24:50 +0900 Subject: [PATCH] fix to return error if FeeAmount > Balance on SponsorshipSet --- src/test/app/Sponsor_test.cpp | 18 ++++++++++++++++-- src/xrpld/app/tx/detail/SponsorshipSet.cpp | 6 +++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 5e1bbea2dc..05923635c0 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -156,22 +156,36 @@ public: // Invalid Sponsee env(sponsor::set(sponsor, 0), sponsor::sponseeAcc(noFunded), ter(tecNO_DST)); + env.close(); // Invalid Sponsor env(sponsor::set(sponsor, tfDeleteObject), sponsor::sponsorAcc(noFunded), ter(tecNO_DST)); + env.close(); // Invalid Delete operation (sponsorship not found) env(sponsor::set(sponsor, tfDeleteObject), sponsor::sponseeAcc(alice), ter(tecNO_ENTRY)); + env.close(); // DisallowIncomingSponsor: tested in other testcase // 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)); + env.close(); + + // FeeAmount + Fee > Balance + /// Balance = 1000XRP, FeeAmount = 1001XRP + adjustAccountXRPBalance(env, sponsor, XRP(1000)); + env(sponsor::set_fee(sponsor, 0, XRP(1001)), sponsor::sponseeAcc(alice), fee(XRP(1)), ter(tecUNFUNDED)); + env.close(); + /// Balance = 1000XRP, FeeAmount = 999XRP, Fee=2XRP + adjustAccountXRPBalance(env, sponsor, XRP(1000)); + env(sponsor::set_fee(sponsor, 0, XRP(999)), sponsor::sponseeAcc(alice), fee(XRP(2)), ter(tecUNFUNDED)); + env.close(); // create sponsor to use above tests - adjustAccountXRPBalance(env, sponsor, reserve(env, 1)); - env(sponsor::set(sponsor, 0, 100, XRP(100)), sponsor::sponseeAcc(alice), ter(tesSUCCESS)); + adjustAccountXRPBalance(env, sponsor, XRP(1001)); + env(sponsor::set(sponsor, 0, 100, XRP(1000)), sponsor::sponseeAcc(alice), fee(XRP(1)), ter(tesSUCCESS)); env.close(); } diff --git a/src/xrpld/app/tx/detail/SponsorshipSet.cpp b/src/xrpld/app/tx/detail/SponsorshipSet.cpp index 2c6e6f6e36..2ae7dda8d9 100644 --- a/src/xrpld/app/tx/detail/SponsorshipSet.cpp +++ b/src/xrpld/app/tx/detail/SponsorshipSet.cpp @@ -147,7 +147,8 @@ SponsorshipSet::preclaim(PreclaimContext const& ctx) return tecINTERNAL; // LCOV_EXCL_LINE // check Sponsor - if (!ctx.view.exists(keylet::account(sponsor))) + auto const sponsorAccSle = ctx.view.read(keylet::account(sponsor)); + if (!sponsorAccSle) return tecNO_DST; // check Sponsee @@ -215,6 +216,9 @@ SponsorshipSet::doApply() auto reserveSponsorAccSle = getTxReserveSponsor(view(), ctx_.tx); + if (feeAmount && (*feeAmount).xrp() > (*sponsorAccSle)[sfBalance]) + return tecUNFUNDED; + if (!sponsorObjSle) { // Create