diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 7e64a49b0c..a7a62f0322 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -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) diff --git a/src/libxrpl/tx/transactors/token/TrustSet.cpp b/src/libxrpl/tx/transactors/token/TrustSet.cpp index 151e82bab9..e79e3cad5a 100644 --- a/src/libxrpl/tx/transactors/token/TrustSet.cpp +++ b/src/libxrpl/tx/transactors/token/TrustSet.cpp @@ -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 diff --git a/src/test/app/TrustSet_test.cpp b/src/test/app/TrustSet_test.cpp index e9f0553840..15abc3bd06 100644 --- a/src/test/app/TrustSet_test.cpp +++ b/src/test/app/TrustSet_test.cpp @@ -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();