Skip to content

Commit 45baf0e

Browse files
committed
Make it possible to unconditionally RBF with mempoolreplacement=fee,-optin
1 parent 8247f07 commit 45baf0e

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

src/init.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ void SetupServerArgs(ArgsManager& argsman)
649649
MAX_OP_RETURN_RELAY),
650650
ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
651651
argsman.AddArg("-mempoolfullrbf", strprintf("Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
652-
argsman.AddArg("-mempoolreplacement", strprintf("Enable transaction replacement in the memory pool (default: %u)", DEFAULT_ENABLE_REPLACEMENT), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
652+
argsman.AddArg("-mempoolreplacement", strprintf("Enable transaction replacement in the memory pool (\"fee,-optin\" = ignore opt-out flag, default: %u)", DEFAULT_ENABLE_REPLACEMENT), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
653653
argsman.AddArg("-permitbaremultisig", strprintf("Relay transactions creating non-P2SH multisig outputs (default: %u)", DEFAULT_PERMIT_BAREMULTISIG), ArgsManager::ALLOW_ANY,
654654
OptionsCategory::NODE_RELAY);
655655
argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
@@ -894,6 +894,8 @@ bool AppInitBasicSetup(const ArgsManager& args, std::atomic<int>& exit_status)
894894
return true;
895895
}
896896

897+
static bool gReplacementHonourOptOut; // FIXME: Get rid of this
898+
897899
bool AppInitParameterInteraction(const ArgsManager& args)
898900
{
899901
const CChainParams& chainparams = Params();
@@ -1060,11 +1062,23 @@ bool AppInitParameterInteraction(const ArgsManager& args)
10601062
}
10611063

10621064
gEnableReplacement = args.GetBoolArg("-mempoolreplacement", DEFAULT_ENABLE_REPLACEMENT);
1065+
gReplacementHonourOptOut = !args.GetBoolArg("-mempoolfullrbf", DEFAULT_MEMPOOL_FULL_RBF);
10631066
if ((!gEnableReplacement) && args.IsArgSet("-mempoolreplacement")) {
10641067
// Minimal effort at forwards compatibility
10651068
std::string replacement_opt = args.GetArg("-mempoolreplacement", ""); // default is impossible
1066-
std::vector<std::string> replacement_modes = util::SplitString(replacement_opt, ",");
1069+
std::vector<std::string> replacement_modes = util::SplitString(replacement_opt, ",+");
10671070
gEnableReplacement = (std::find(replacement_modes.begin(), replacement_modes.end(), "fee") != replacement_modes.end());
1071+
if (gEnableReplacement) {
1072+
for (auto& opt : replacement_modes) {
1073+
if (opt == "optin") {
1074+
gReplacementHonourOptOut = true;
1075+
} else if (opt == "-optin") {
1076+
gReplacementHonourOptOut = false;
1077+
}
1078+
}
1079+
} else {
1080+
gReplacementHonourOptOut = true;
1081+
}
10681082
}
10691083

10701084
// Also report errors from parsing before daemonization
@@ -1540,6 +1554,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
15401554

15411555
CTxMemPool::Options mempool_opts{
15421556
.check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
1557+
.full_rbf = !gReplacementHonourOptOut,
15431558
.signals = &validation_signals,
15441559
};
15451560
auto result{ApplyArgsManOptions(args, chainparams, mempool_opts)};

0 commit comments

Comments
 (0)