fix Sponsor able to provide sponsorship with just base reserve

This commit is contained in:
tequ
2026-04-13 14:03:37 +09:00
parent b6b317597f
commit 84e84fbadf
2 changed files with 30 additions and 2 deletions

View File

@@ -479,7 +479,15 @@ Transactor::checkFee(PreclaimContext const& ctx, XRPAmount baseFee)
if (payerSle->getType() != ltACCOUNT_ROOT)
return tefINTERNAL; // LCOV_EXCL_LINE
maxSpendable = payerSle->getFieldAmount(payer.balanceField).xrp();
if (payer.type == FeePayerType::SponsorCoSigned)
{
STAmount const sponsorReserve = calculateReserve(payerSle, ctx.view.fees());
maxSpendable = payerSle->getFieldAmount(sfBalance).xrp() - sponsorReserve.xrp();
}
else
{
maxSpendable = payerSle->getFieldAmount(payer.balanceField).xrp();
}
}
// NOTE: Because preclaim evaluates against a static readview, it

View File

@@ -1444,6 +1444,27 @@ public:
BEAST_EXPECT(env.balance(bob) == bobBalance);
BEAST_EXPECT(env.balance(sponsor) == sponsorBalance - feeAmt);
}
{
// below reserve
adjustAccountXRPBalance(env, sponsor, env.current()->fees().reserve);
env.close();
auto const feeAmt = XRP(4);
env(noop(alice),
fee(env.current()->fees().base),
sponsor::as(sponsor, spfSponsorFee),
sig(sfSponsorSignature, sponsor),
ter(terINSUF_FEE_B));
env.close();
env(noop(alice),
fee(XRP(10)),
sponsor::as(sponsor, spfSponsorFee),
sig(sfSponsorSignature, sponsor),
ter(terINSUF_FEE_B));
env.close();
}
}
{
@@ -1595,7 +1616,6 @@ public:
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),