mirror of
https://github.com/Xahau/xahaud.git
synced 2025-11-18 17:45:48 +00:00
Add featureImmediateOfferKilled for tfImmediateOrCancel offers:
Fixes #4115; https://github.com/ripple/rippled/issues/4115
This commit is contained in:
committed by
manojsdoshi
parent
7e9e9104ea
commit
649ab872ff
@@ -1107,6 +1107,12 @@ CreateOffer::applyGuts(Sandbox& sb, Sandbox& sbCancel)
|
||||
if (bImmediateOrCancel)
|
||||
{
|
||||
JLOG(j_.trace()) << "Immediate or cancel: offer canceled";
|
||||
if (!crossed && sb.rules().enabled(featureImmediateOfferKilled))
|
||||
// If the ImmediateOfferKilled amendment is enabled, any
|
||||
// ImmediateOrCancel offer that transfers absolutely no funds
|
||||
// returns tecKILLED rather than tesSUCCESS. Motivation for the
|
||||
// change is here: https://github.com/ripple/rippled/issues/4115
|
||||
return {tecKILLED, false};
|
||||
return {tesSUCCESS, true};
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace detail {
|
||||
// Feature.cpp. Because it's only used to reserve storage, and determine how
|
||||
// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
|
||||
// the actual number of amendments. A LogicError on startup will verify this.
|
||||
static constexpr std::size_t numFeatures = 51;
|
||||
static constexpr std::size_t numFeatures = 53;
|
||||
|
||||
/** Amendments that this server supports and the default voting behavior.
|
||||
Whether they are enabled depends on the Rules defined in the validated
|
||||
@@ -339,6 +339,7 @@ extern uint256 const fixNFTokenNegOffer;
|
||||
extern uint256 const featureNonFungibleTokensV1_1;
|
||||
extern uint256 const fixTrustLinesToSelf;
|
||||
extern uint256 const fixRemoveNFTokenAutoTrustLine;
|
||||
extern uint256 const featureImmediateOfferKilled;
|
||||
|
||||
} // namespace ripple
|
||||
|
||||
|
||||
@@ -449,6 +449,7 @@ REGISTER_FIX (fixNFTokenNegOffer, Supported::yes, DefaultVote::no)
|
||||
REGISTER_FEATURE(NonFungibleTokensV1_1, Supported::yes, DefaultVote::no);
|
||||
REGISTER_FIX (fixTrustLinesToSelf, Supported::yes, DefaultVote::no);
|
||||
REGISTER_FIX (fixRemoveNFTokenAutoTrustLine, Supported::yes, DefaultVote::yes);
|
||||
REGISTER_FEATURE(ImmediateOfferKilled, Supported::yes, DefaultVote::no);
|
||||
|
||||
// The following amendments have been active for at least two years. Their
|
||||
// pre-amendment code has been removed and the identifiers are deprecated.
|
||||
|
||||
@@ -77,7 +77,7 @@ transResults()
|
||||
MAKE_ERROR(tecINVARIANT_FAILED, "One or more invariants for the transaction were not satisfied."),
|
||||
MAKE_ERROR(tecEXPIRED, "Expiration time is passed."),
|
||||
MAKE_ERROR(tecDUPLICATE, "Ledger object already exists."),
|
||||
MAKE_ERROR(tecKILLED, "FillOrKill offer killed."),
|
||||
MAKE_ERROR(tecKILLED, "No funds transferred and no offer created."),
|
||||
MAKE_ERROR(tecHAS_OBLIGATIONS, "The account cannot be deleted since it has obligations."),
|
||||
MAKE_ERROR(tecTOO_SOON, "It is too early to attempt the requested operation. Please wait."),
|
||||
MAKE_ERROR(tecMAX_SEQUENCE_REACHED, "The maximum sequence number was reached."),
|
||||
|
||||
@@ -950,9 +950,14 @@ public:
|
||||
env(pay(gw, alice, USD(1000)), ter(tesSUCCESS));
|
||||
|
||||
// No cross:
|
||||
env(offer(alice, XRP(1000), USD(1000)),
|
||||
txflags(tfImmediateOrCancel),
|
||||
ter(tesSUCCESS));
|
||||
{
|
||||
TER const expectedCode = features[featureImmediateOfferKilled]
|
||||
? static_cast<TER>(tecKILLED)
|
||||
: static_cast<TER>(tesSUCCESS);
|
||||
env(offer(alice, XRP(1000), USD(1000)),
|
||||
txflags(tfImmediateOrCancel),
|
||||
ter(expectedCode));
|
||||
}
|
||||
|
||||
env.require(
|
||||
balance(alice, startBalance - f - f),
|
||||
@@ -5165,11 +5170,12 @@ public:
|
||||
FeatureBitset const flowCross{featureFlowCross};
|
||||
FeatureBitset const takerDryOffer{fixTakerDryOfferRemoval};
|
||||
FeatureBitset const rmSmallIncreasedQOffers{fixRmSmallIncreasedQOffers};
|
||||
FeatureBitset const immediateOfferKilled{featureImmediateOfferKilled};
|
||||
|
||||
testAll(all - takerDryOffer);
|
||||
testAll(all - flowCross - takerDryOffer);
|
||||
testAll(all - flowCross);
|
||||
testAll(all - rmSmallIncreasedQOffers);
|
||||
testAll(all - takerDryOffer - immediateOfferKilled);
|
||||
testAll(all - flowCross - takerDryOffer - immediateOfferKilled);
|
||||
testAll(all - flowCross - immediateOfferKilled);
|
||||
testAll(all - rmSmallIncreasedQOffers - immediateOfferKilled);
|
||||
testAll(all);
|
||||
testFalseAssert();
|
||||
}
|
||||
@@ -5184,11 +5190,12 @@ class Offer_manual_test : public Offer_test
|
||||
FeatureBitset const all{supported_amendments()};
|
||||
FeatureBitset const flowCross{featureFlowCross};
|
||||
FeatureBitset const f1513{fix1513};
|
||||
FeatureBitset const immediateOfferKilled{featureImmediateOfferKilled};
|
||||
FeatureBitset const takerDryOffer{fixTakerDryOfferRemoval};
|
||||
|
||||
testAll(all - flowCross - f1513);
|
||||
testAll(all - flowCross);
|
||||
testAll(all - f1513);
|
||||
testAll(all - flowCross - f1513 - immediateOfferKilled);
|
||||
testAll(all - flowCross - immediateOfferKilled);
|
||||
testAll(all - immediateOfferKilled);
|
||||
testAll(all);
|
||||
|
||||
testAll(all - flowCross - takerDryOffer);
|
||||
|
||||
Reference in New Issue
Block a user