refactor: Retire DisallowIncomingV1 fix (#7364)

This commit is contained in:
Timothy Banks
2026-07-02 10:17:32 -04:00
committed by GitHub
parent 8e378c4f47
commit 4c619e8a85
3 changed files with 37 additions and 52 deletions

View File

@@ -60,7 +60,6 @@ XRPL_FEATURE(PriceOracle, Supported::Yes, VoteBehavior::DefaultNo
XRPL_FIX (AMMOverflowOffer, Supported::Yes, VoteBehavior::DefaultYes)
XRPL_FIX (FillOrKill, Supported::Yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(DID, Supported::Yes, VoteBehavior::DefaultNo)
XRPL_FIX (DisallowIncomingV1, Supported::Yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(XChainBridge, Supported::Yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(AMM, Supported::Yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(XRPFees, Supported::Yes, VoteBehavior::DefaultNo)
@@ -100,6 +99,7 @@ XRPL_RETIRE_FIX(1623)
XRPL_RETIRE_FIX(1781)
XRPL_RETIRE_FIX(AmendmentMajorityCalc)
XRPL_RETIRE_FIX(CheckThreading)
XRPL_RETIRE_FIX(DisallowIncomingV1)
XRPL_RETIRE_FIX(InnerObjTemplate)
XRPL_RETIRE_FIX(MasterKeyAsRegularKey)
XRPL_RETIRE_FIX(NonFungibleTokensV1_2)

View File

@@ -184,22 +184,10 @@ TrustSet::preclaim(PreclaimContext const& ctx)
// If the destination has opted to disallow incoming trustlines
// then honour that flag
if (sleDst->isFlag(lsfDisallowIncomingTrustline))
if (sleDst && sleDst->isFlag(lsfDisallowIncomingTrustline) &&
!ctx.view.exists(keylet::trustLine(id, uDstAccountID, currency)))
{
// The original implementation of featureDisallowIncoming was
// too restrictive. If
// o fixDisallowIncomingV1 is enabled and
// o The trust line already exists
// Then allow the TrustSet.
if (ctx.view.rules().enabled(fixDisallowIncomingV1) &&
ctx.view.exists(keylet::trustLine(id, uDstAccountID, currency)))
{
// pass
}
else
{
return tecNO_PERMISSION;
}
return tecNO_PERMISSION;
}
// In general, trust lines to pseudo accounts are not permitted, unless

View File

@@ -474,6 +474,38 @@ public:
checkQuality(!createQuality);
}
void
testDisallowIncomingWithRequireAuth()
{
testcase("Create trustline with disallow incoming requiring auth");
using namespace test::jtx;
Env env{*this};
auto const dist = Account("dist");
auto const gw = Account("gw");
auto const usd = gw["USD"];
auto const distUSD = dist["USD"];
env.fund(XRP(1000), gw, dist);
env.close();
env(fset(gw, asfRequireAuth));
env.close();
env(fset(dist, asfDisallowIncomingTrustline));
env.close();
env(trust(dist, usd(10000)));
env.close();
env(trust(gw, distUSD(10000)), Txflags(tfSetfAuth), Ter(tesSUCCESS));
env.close();
env(pay(gw, dist, usd(1000)), Ter(tesSUCCESS));
env.close();
}
void
testDisallowIncoming(FeatureBitset features)
{
@@ -481,42 +513,6 @@ public:
using namespace test::jtx;
// fixDisallowIncomingV1
{
for (bool const withFix : {true, false})
{
auto const amend = withFix ? features : features - fixDisallowIncomingV1;
Env env{*this, amend};
auto const dist = Account("dist");
auto const gw = Account("gw");
auto const usd = gw["USD"];
auto const distUSD = dist["USD"];
env.fund(XRP(1000), gw, dist);
env.close();
env(fset(gw, asfRequireAuth));
env.close();
env(fset(dist, asfDisallowIncomingTrustline));
env.close();
env(trust(dist, usd(10000)));
env.close();
// withFix: can set trustline
// withOutFix: cannot set trustline
auto const trustResult = withFix ? Ter(tesSUCCESS) : Ter(tecNO_PERMISSION);
env(trust(gw, distUSD(10000)), Txflags(tfSetfAuth), trustResult);
env.close();
auto const txResult = withFix ? Ter(tesSUCCESS) : Ter(tecPATH_DRY);
env(pay(gw, dist, usd(1000)), txResult);
env.close();
}
}
Env env{*this, features};
auto const gw = Account{"gateway"};
@@ -601,6 +597,7 @@ public:
testModifyQualityOfTrustline(features, false, true);
testModifyQualityOfTrustline(features, true, false);
testModifyQualityOfTrustline(features, true, true);
testDisallowIncomingWithRequireAuth();
testDisallowIncoming(features);
testTrustLineResetWithAuthFlag();
testTrustLineDelete();