From 1a85ca1dff1f51561608ab463dee4d03912291d9 Mon Sep 17 00:00:00 2001 From: rkrux Date: Fri, 24 Apr 2026 14:18:39 +0530 Subject: [PATCH] rpc, mempool: rpcdeprecate `bip125-replaceable` key in mempool RPCs reponses RPCs: getrawmempool, getmempoolancestors, getmempooldescendants, getmempoolentry This key has been marked deprecated since v29, it can be removed from the RPC response now unless the user requests it via the -deprecatedrpc=bip125 node argument. --- src/rpc/mempool.cpp | 26 +++++++++++++++----------- test/functional/feature_rbf.py | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp index 1b76f7d858a..e762c6ab9ba 100644 --- a/src/rpc/mempool.cpp +++ b/src/rpc/mempool.cpp @@ -430,7 +430,7 @@ static std::vector ClusterDescription() static std::vector MempoolEntryDescription() { - return { + std::vector list = { RPCResult{RPCResult::Type::NUM, "vsize", "virtual transaction size as defined in BIP 141. This is different from actual serialized size for witness transactions as witness data is discounted."}, RPCResult{RPCResult::Type::NUM, "weight", "transaction weight as defined in BIP 141."}, RPCResult{RPCResult::Type::NUM_TIME, "time", "local time transaction entered pool in seconds since 1 Jan 1970 GMT"}, @@ -453,9 +453,12 @@ static std::vector MempoolEntryDescription() {RPCResult{RPCResult::Type::STR_HEX, "transactionid", "parent transaction id"}}}, RPCResult{RPCResult::Type::ARR, "spentby", "unconfirmed transactions spending outputs from this transaction", {RPCResult{RPCResult::Type::STR_HEX, "transactionid", "child transaction id"}}}, - RPCResult{RPCResult::Type::BOOL, "bip125-replaceable", "Whether this transaction signals BIP125 replaceability or has an unconfirmed ancestor signaling BIP125 replaceability. (DEPRECATED)\n"}, RPCResult{RPCResult::Type::BOOL, "unbroadcast", "Whether this transaction is currently unbroadcast (initial broadcast not yet acknowledged by any peers)"}, }; + if (IsDeprecatedRPCEnabled("bip125")) { + list.emplace_back(RPCResult::Type::BOOL, "bip125-replaceable", "Whether this transaction signals BIP125 replaceability or has an unconfirmed ancestor signaling BIP125 replaceability. (DEPRECATED)\n"); + } + return list; } void AppendChunkInfo(UniValue& all_chunks, FeePerWeight chunk_feerate, std::vector chunk_txs) @@ -554,18 +557,19 @@ static void entryToJSON(const CTxMemPool& pool, UniValue& info, const CTxMemPool } info.pushKV("spentby", std::move(spent)); + info.pushKV("unbroadcast", pool.IsUnbroadcastTx(tx.GetHash())); // Add opt-in RBF status - bool rbfStatus = false; - RBFTransactionState rbfState = IsRBFOptIn(tx, pool); - if (rbfState == RBFTransactionState::UNKNOWN) { - throw JSONRPCError(RPC_MISC_ERROR, "Transaction is not in mempool"); - } else if (rbfState == RBFTransactionState::REPLACEABLE_BIP125) { - rbfStatus = true; + if (IsDeprecatedRPCEnabled("bip125")) { + bool rbfStatus = false; + RBFTransactionState rbfState = IsRBFOptIn(tx, pool); + if (rbfState == RBFTransactionState::UNKNOWN) { + throw JSONRPCError(RPC_MISC_ERROR, "Transaction is not in mempool"); + } else if (rbfState == RBFTransactionState::REPLACEABLE_BIP125) { + rbfStatus = true; + } + info.pushKV("bip125-replaceable", rbfStatus); } - - info.pushKV("bip125-replaceable", rbfStatus); - info.pushKV("unbroadcast", pool.IsUnbroadcastTx(tx.GetHash())); } UniValue MempoolToJSON(const CTxMemPool& pool, bool verbose, bool include_mempool_sequence) diff --git a/test/functional/feature_rbf.py b/test/functional/feature_rbf.py index 5527f7a946c..b26d59ab5d7 100755 --- a/test/functional/feature_rbf.py +++ b/test/functional/feature_rbf.py @@ -28,7 +28,7 @@ class ReplaceByFeeTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 2 self.uses_wallet = None - self.extra_args = [["-deprecatedrpc=fullrbf"], []] + self.extra_args = [["-deprecatedrpc=fullrbf", "-deprecatedrpc=bip125"], []] def run_test(self): self.wallet = MiniWallet(self.nodes[0])