fix reset() Does Not makeFieldAbsent for Zero FeeAmount

This commit is contained in:
tequ
2026-04-10 18:28:28 +09:00
parent 16e4f24226
commit 525adf122f
2 changed files with 27 additions and 3 deletions

View File

@@ -1211,7 +1211,12 @@ Transactor::reset(XRPAmount fee)
// If for some reason we are unable to consume the ticket or sequence
// then the ledger is corrupted. Rather than make things worse we
// reject the transaction.
payerSle->setFieldAmount(payer.balanceField, balance - fee);
auto const feeAmountAfter = balance - fee;
if (feeAmountAfter == beast::zero && payer.balanceField == sfFeeAmount)
// Because ltSponsorship.sfFeeAmount is soeOptional
payerSle->makeFieldAbsent(payer.balanceField);
else
payerSle->setFieldAmount(payer.balanceField, feeAmountAfter);
TER const ter{consumeSeqProxy(txnAcct)};
XRPL_ASSERT(isTesSuccess(ter), "xrpl::Transactor::reset : result is tesSUCCESS");

View File

@@ -7,6 +7,7 @@
#include <xrpl/basics/strHex.h>
#include <xrpl/protocol/Feature.h>
#include "test/jtx/check.h"
#include "test/jtx/did.h"
namespace xrpl {
@@ -1448,8 +1449,8 @@ public:
env.fund(XRP(10000), alice, bob, sponsor);
env.close();
auto const sponsorFeeBalance = [&](Account const& sponsor, Account const& alice) {
return env.le(keylet::sponsor(sponsor, alice))->getFieldAmount(sfFeeAmount).xrp();
auto const sponsorFeeBalance = [&](Account const& sponsor, Account const& sponsee) {
return env.le(keylet::sponsor(sponsor, sponsee))->getFieldAmount(sfFeeAmount).xrp();
};
{
@@ -1578,6 +1579,24 @@ public:
BEAST_EXPECT(env.balance(sponsor) == sponsorBalance);
BEAST_EXPECT(sponsorFeeBalance(sponsor, alice) == sponsorFee - feeAmt);
}
// make sfFeeAmount absent if tec error and all fee is paid
{
// reset FeeAmount and MaxFee
env(sponsor::del(sponsor), sponsor::sponseeAcc(alice));
env(sponsor::set_fee(sponsor, 0, XRP(10)), sponsor::sponseeAcc(alice));
env.close();
BEAST_EXPECT(env.le(keylet::sponsor(sponsor, alice))->isFieldPresent(sfFeeAmount));
auto sponsorAvailableFee = sponsorFeeBalance(sponsor, alice);
printf("sponsorAvailableFee: %s\n", to_string(sponsorAvailableFee).c_str());
env(check::cancel(alice, uint256(1)),
fee(sponsorAvailableFee),
sponsor::as(sponsor, spfSponsorFee),
ter(tecNO_ENTRY));
env.close();
BEAST_EXPECT(!env.le(keylet::sponsor(sponsor, alice))->isFieldPresent(sfFeeAmount));
}
}
// test lsfSponsorshipRequireSignForFee