From cf03c4cb8f5c8c4944b82d90640a49fbe9c5b255 Mon Sep 17 00:00:00 2001 From: tequ Date: Wed, 7 Jan 2026 12:31:01 +0900 Subject: [PATCH] change Sponsor related fields to `soeDEFAULT` --- .../xrpl/protocol/detail/ledger_entries.macro | 10 ++++----- src/libxrpl/ledger/View.cpp | 5 ++++- src/test/app/Sponsor_test.cpp | 21 ++++++++++++++++++- src/xrpld/app/tx/detail/SponsorshipSet.cpp | 4 ---- src/xrpld/app/tx/detail/Transactor.cpp | 10 +++++++-- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 75b9aa49e3..20cff0e41b 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -150,9 +150,9 @@ LEDGER_ENTRY(ltACCOUNT_ROOT, 0x0061, AccountRoot, account, ({ {sfAMMID, soeOPTIONAL}, // pseudo-account designator {sfVaultID, soeOPTIONAL}, // pseudo-account designator {sfLoanBrokerID, soeOPTIONAL}, // pseudo-account designator - {sfSponsoredOwnerCount, soeOPTIONAL}, - {sfSponsoringOwnerCount, soeOPTIONAL}, - {sfSponsoringAccountCount,soeOPTIONAL}, + {sfSponsoredOwnerCount, soeDEFAULT}, + {sfSponsoringOwnerCount, soeDEFAULT}, + {sfSponsoringAccountCount,soeDEFAULT}, })) /** A ledger object which contains a list of object identifiers. @@ -616,9 +616,9 @@ LEDGER_ENTRY(ltSPONSORSHIP, 0x0090, Sponsorship, sponsorship, ({ {sfPreviousTxnLgrSeq, soeREQUIRED}, {sfOwner, soeREQUIRED}, {sfSponsee, soeREQUIRED}, - {sfFeeAmount, soeOPTIONAL}, + {sfFeeAmount, soeDEFAULT}, {sfMaxFee, soeOPTIONAL}, - {sfReserveCount, soeOPTIONAL}, + {sfReserveCount, soeDEFAULT}, {sfOwnerNode, soeREQUIRED}, {sfSponseeNode, soeREQUIRED}, })) diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index 802aeb9a4b..e4238b199b 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -1387,7 +1387,10 @@ adjustOwnerCount( currentReserveCount >= amount, "xrpl::adjustOwnerCount : enough reserve count"); - sle->setFieldU32(sfReserveCount, currentReserveCount - amount); + if (currentReserveCount - amount > 0) + sle->setFieldU32(sfReserveCount, currentReserveCount - amount); + else + sle->makeFieldAbsent(sfReserveCount); view.update(sle); } } diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 6c642af5cd..45c8f30d19 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -990,7 +990,7 @@ public: auto sponsorFee = sponsorFeeBalance(sponsor, alice); env(pay(alice, bob, XRP(100)), - fee(XRP(100) + drops(1)), + fee(XRP(90) + drops(1)), sponsor::as(sponsor, tfSponsorFee), ter(terINSUF_FEE_B)); env.close(); @@ -1001,6 +1001,25 @@ public: BEAST_EXPECT( sponsorFeeBalance(sponsor, alice) == sponsorFee); } + // use all FeeAmount + { + // = FeeAmount + auto aliceBalance = env.balance(alice); + auto bobBalance = env.balance(bob); + auto sponsorBalance = env.balance(sponsor); + + env(pay(alice, bob, XRP(100)), + fee(XRP(90)), + sponsor::as(sponsor, tfSponsorFee), + ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT(env.balance(alice) == aliceBalance - XRP(100)); + BEAST_EXPECT(env.balance(bob) == bobBalance + XRP(100)); + BEAST_EXPECT(env.balance(sponsor) == sponsorBalance); + BEAST_EXPECT(!env.le(keylet::sponsor(sponsor, alice)) + ->isFieldPresent(sfFeeAmount)); + } // reset FeeAmount and MaxFee env(sponsor::del(sponsor), sponsor::sponseeAcc(alice)); diff --git a/src/xrpld/app/tx/detail/SponsorshipSet.cpp b/src/xrpld/app/tx/detail/SponsorshipSet.cpp index cdb84292ac..8f61f86b44 100644 --- a/src/xrpld/app/tx/detail/SponsorshipSet.cpp +++ b/src/xrpld/app/tx/detail/SponsorshipSet.cpp @@ -271,13 +271,9 @@ SponsorshipSet::doApply() (*newSle)[sfFeeAmount] = *feeAmount; } if (maxFee) - { (*newSle)[sfMaxFee] = *maxFee; - } if (reserveCount) - { (*newSle)[sfReserveCount] = *reserveCount; - } auto flags = 0; if (ctx_.tx.isFlag(tfSponsorshipSetRequireSignForFee)) diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index 0398c15284..34c6c48fab 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -501,8 +501,14 @@ Transactor::payFee() if (!sle) return tefINTERNAL; // LCOV_EXCL_LINE - sle->setFieldAmount( - result.field, sle->getFieldAmount(result.field) - feePaid); + auto const feeAmountAfter = sle->getFieldAmount(result.field) - feePaid; + + if (feeAmountAfter == beast::zero && + result.field.fieldMeta == SField::sMD_Default) + // for ltSponsorship.sfFeeAmount + sle->makeFieldAbsent(result.field); + else + sle->setFieldAmount(result.field, feeAmountAfter); view().update(sle);