fix: Use account ledger entry when canceling token escrows (#6171)

This commit is contained in:
Denis Angell
2026-05-18 22:08:48 +02:00
committed by GitHub
parent ad7232cbc5
commit ad3d172a1f
2 changed files with 67 additions and 1 deletions

View File

@@ -184,7 +184,7 @@ EscrowCancel::doApply()
return escrowUnlockApplyHelper<T>(
ctx_.view(),
kParityRate,
slep,
ctx_.view().rules().enabled(fixCleanup3_2_0) ? sle : slep,
preFeeBalance_,
amount,
issuer,

View File

@@ -886,6 +886,70 @@ struct EscrowToken_test : public beast::unit_test::Suite
}
}
void
testIOUCancelDoApply(FeatureBitset features)
{
testcase("IOU Cancel DoApply");
using namespace jtx;
using namespace std::literals;
{
Env env{*this, features};
auto const baseFee = env.current()->fees().base;
auto const alice = Account("alice");
auto const bob = Account("bob");
auto const gw = Account("gw");
auto const usd = gw["USD"];
env.fund(XRP(10'000), alice, bob, gw);
env.close();
env(fset(gw, asfAllowTrustLineLocking));
env.close();
env.trust(usd(100'000), alice);
env.trust(usd(100'000), bob);
env.close();
env(pay(gw, alice, usd(10'000)));
env.close();
auto const seq = env.seq(alice);
env(escrow::create(alice, bob, usd(1'000)),
escrow::kFinishTime(env.now() + 1s),
escrow::kCancelTime(env.now() + 2s),
Fee(baseFee));
env.close();
BEAST_EXPECT(env.balance(alice, usd) == usd(9'000));
env(pay(alice, gw, usd(9'000)));
env.close();
env(trust(alice, usd(0)));
env.close();
auto const trustLineKey = keylet::line(alice.id(), gw.id(), usd.currency);
BEAST_EXPECT(!env.current()->exists(trustLineKey));
env.close();
env.close();
auto const expectedResult = env.current()->rules().enabled(fixCleanup3_2_0)
? Ter(tesSUCCESS)
: Ter(tefEXCEPTION);
env(escrow::cancel(alice, alice, seq), Fee(baseFee), expectedResult);
env.close();
if (env.current()->rules().enabled(fixCleanup3_2_0))
{
BEAST_EXPECT(!env.le(keylet::escrow(alice.id(), seq)));
BEAST_EXPECT(env.current()->exists(trustLineKey));
BEAST_EXPECT(env.balance(alice, usd) == usd(1'000));
}
}
}
void
testIOUBalances(FeatureBitset features)
{
@@ -3887,6 +3951,7 @@ struct EscrowToken_test : public beast::unit_test::Suite
testIOUFinishPreclaim(features);
testIOUFinishDoApply(features);
testIOUCancelPreclaim(features);
testIOUCancelDoApply(features);
testIOUBalances(features);
testIOUMetaAndOwnership(features);
testIOURippleState(features);
@@ -3928,6 +3993,7 @@ public:
{all - featureSingleAssetVault - featureLendingProtocol, all})
{
testIOUWithFeats(feats);
testIOUWithFeats(feats - fixCleanup3_2_0);
testMPTWithFeats(feats);
testMPTWithFeats(feats - fixTokenEscrowV1);
}