#35433 wallet: deprecate replaceable argument from transaction (and psbt) creation (and modification) RPCs
| Reviewability | Reviews | Agreement | Size | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| #35433 wallet: deprecate replaceable argument from transaction (and psbt) creation (and modification) RPCs | Ready | 0 | Strong | 53 + 125 tests | ||||||
|
|
|
|
| ||||||
Reviewability: ReadyStalePaused Agreement: StrongPositivePositive w/ caveatsNeutralMildDisputedBlockedCrickets Reviews: current code-review ACKs, then (+stale ACKs) and -NACKs; greener = more ACKs. Size: lines added or modified outside tests, then in tests; greener = smaller. | ||||||||||
Goal
Deprecates the `replaceable` argument across ten transaction and PSBT creation and modification RPCs (`createrawtransaction`, `createpsbt`, `fundrawtransaction`, `walletcreatefundedpsbt`, `send`, `sendtoaddress`, `sendmany`, `sendall`, `bumpfee`, and `psbtbumpfee`). Supplying this argument now returns an `RPC_METHOD_DEPRECATED` error unless the node is started with `-deprecatedrpc=bip125`. It also updates functional tests to avoid passing the argument and documents the deprecation in the release notes.
Problem: Since Bitcoin Core v28 enabled full-RBF by default, transactions are replaceable across the network regardless of BIP 125 opt-in sequence signaling. Offering an explicit `replaceable` argument across wallet and raw transaction RPCs is redundant and clutters the RPC interface.
Evidence of importance:
- PR description: "This builds upon the existing issue of removing the option for users to signal replaceability because fullrbf is the default policy and prevalent in the network (since bitcoin core v28 was released in late 2024) that makes every transaction replaceable by default, making this user option unnecessary."
- Linked issue #32661: "wallet, node: Redundant opt-in RBF wallet config and RPC parameters"
Scope: Follows the standard RPC deprecation pattern using `IsDeprecatedRPCEnabled` and `rpcEnableDeprecated` checks; touches RPC argument handlers in `spend.cpp` and `rawtransaction.cpp` alongside test adjustments.
Risk of a mistake: medium (wallet, rpc_api). Mistakes in RPC argument handling or deprecation checks could break transaction creation for external scripts and wallet integrations.
Changed since the previous assessment: Functional test coverage was significantly expanded in `test/functional/wallet_deprecated_rbf.py` to cover raw transaction, PSBT, and send RPCs under both default and deprecated startup configurations, while existing tests were updated to omit explicit `replaceable` parameters.
Reviewability
Ready
Nothing known that would invalidate a review now.
Waiting on (from the thread read):
- reviewer: re-review from polespinasa following author's updates and rebase 2026-10-26
Agreement
Strong
substantive support, no open objection (polespinasa)
Thread notes: Author addressed all remaining comments from polespinasa regarding commit atomicity, replaceable=False test coverage, release note categorization, and test assertions, and rebased. / Author replied to and resolved remaining review items from polespinasa during rebase on 2026-10-26.
Objections, suggestions, and questions:
| Reviewer | Type | Harm, request, or question | Status | Must be | Author replied | Quote |
|---|---|---|---|---|---|---|
| polespinasa (member) | objection, interface | deprecated options would be silently ignored when flag is not set instead of alerting user | fixed · fix pushed · author implemented error throwing when flag is missing | changed | yes | 2026-07-06: 'If a user does add a replaceable argument but does not enable the deprecated flag it will be ignored without the user noticing. I think all deprecated fields should throw if used when the deprecated flag is not set.' Status from: 2026-07-07: rkrux: 'Done' |
| achow101 (member) | objection, maintenance | mass renaming rbf_node to node in test breaks git blame unnecessarily | fixed · fix pushed · author dropped the rename commit | answered | yes | 2026-07-06: 'seems entirely unnecessary. Mass renaming things in that file breaks git blame, and I don't really see the benefit for changing the name.' Status from: 2026-07-07: rkrux: 'Dropped' |
| achow101 (member) | objection, interface | release notes entry used an invalid section header | fixed · fix pushed · author fixed the section header | answered | yes | 2026-07-06: 'This is not a valid section header for release notes. This could either be a standalone Notable Change, in which case this section header should be a title that describes what the change, or it should' Status from: 2026-07-07: rkrux: 'Fixed' |
| w0xlt (contributor) | objection, interface | RPC help examples would fail on default nodes because they include the deprecated argument | fixed · fix pushed · author updated the RPC help examples | answered | yes | 2026-08-11: 'On a node started without -deprecatedrpc=bip125 (the default), three sendtoaddress examples in this help block still supply the deprecated option.' Status from: 2026-08-12: rkrux: 'Applied the suggestion.' |
| polespinasa (member) | objection, correctness | testing bumpfee with replaceable=False was removed without being added elsewhere, reducing test coverage | fixed · fix pushed · author added test coverage for replaceable=False in bumpfee | answered | yes | 2026-08-12: 'testing bumpfee with replaceable = False is removed and not added in any other place later. This removes test coverage.' Status from: 2026-10-26: rkrux: 'Not that important to test this field in bumpfee but added coverage for it.' |
| polespinasa (member) | objection, correctness | FundTxDoc documents replaceable as deprecated across all spend RPCs before those RPCs actually implement the deprecation check | fixed · fix pushed · author merged the commits affecting the 4 RPCs to maintain commit atomicity | answered | yes | 2026-08-12: 'This docs replaceable as deprecated for all RPC calls using FundTxDoc, but in this commit only sendall has the flag check and the error throw. For the other calls send, fundrawtransaction, walletcreat' Status from: 2026-10-26: rkrux: 'Merged the two commits affecting the 4 RPCs.' |
| polespinasa (member) | suggestion, correctness | ensure the test asserts the RPC error is actually enforced rather than only checking error fields if an exception happens to be thrown | fixed · fix pushed · author added an assertion in the try block | answered | yes | 2026-08-12: 'This tests feels wrong, it is not testing that the RPC error is enforced, only that, in case it fails, the error is the expected one.' Status from: 2026-10-26: rkrux: 'Added an assertion in the try block in case the exception is not thrown.' |
| polespinasa (member) | objection, correctness | tests do not check replaceable=False for send, sendtoaddress, sendmany, and sendall, reducing test coverage while deprecated | fixed · fix pushed · author added test coverage for replaceable=False | answered | yes | 2026-08-12: 'This is a bit a duplicated comment from others I left, but just to summarize, this is not covering the cases for Replaceable=False for send, sendtoaddress, sendmany and sendall' Status from: 2026-10-26: rkrux: 'Addressed.' |
| polespinasa (member) | objection, interface | createpsbt and createrawtransaction are categorized under wallet RPCs in release notes when they are rawtransaction/node RPCs | fixed · fix pushed · author addressed the RPC categorization during rebase | answered | yes | 2026-08-12: 'If I am not wrong, createpsbt, and createrawtransaction are not Wallet rpc' Status from: 2026-10-26: rkrux: 'Addressed during rebase.' |
Support:
- polespinasa (member) (Concept ACK, 2026-07-06) [read: 020560e00a4b49e5ceb4365def4f2e07b60eee57 wallet, test: add test cases for deprec, src/wallet/rpc/spend.cpp, test/functional/wallet_deprecated_rbf.py]: supports deprecating the replaceable RPC arguments
Participants:
- pablomartin4btc (member, neutral, 2 statements 2026-06-12 to 2026-06-12): suggested doc/release note heading tweak and asked about description update
- maflcko (member, neutral, 2 statements 2026-06-15 to 2026-06-15): reviewed commit structure regarding MAX_BIP125_RBF_SEQUENCE deprecation comment
- achow101 (member, objection, 4 statements 2026-07-06 to 2026-07-06): pointed out deprecated arguments must throw when supplied without -deprecatedrpc=bip125, opposed unnecessary test rename
- polespinasa (member, support, 17 statements 2026-07-06 to 2026-08-12): Concept ACK; raised multiple review comments regarding missing test coverage for replaceable=False, commit atomicity, and release note categorization
- w0xlt (contributor, objection, 1 statements 2026-08-11 to 2026-08-11): noted help examples still included replaceable=true
- sedited (member, neutral, 1 statements 2026-09-23 to 2026-09-23): pinged author for rebase
Dependencies
Enables:
- Complete removal of the `replaceable` RPC argument and associated opt-in RBF signaling logic in a future major release (#32661).
Files
185 lines under test/bench/ci.
- test/functional/wallet_deprecated_rbf.py +111/-17
- src/wallet/rpc/spend.cpp +28/-10
- test/functional/wallet_bumpfee.py +0/-21
- doc/release-notes-35433.md +13/-0
- test/functional/rpc_psbt.py +5/-8
- test/functional/rpc_rawtransaction.py +2/-7
- src/rpc/rawtransaction.cpp +7/-1
- src/wallet/spend.cpp +0/-6
- src/util/rbf.h +5/-0
- test/functional/feature_notifications.py +2/-2
- test/functional/data/rpc_psbt.json +1/-1
- test/functional/wallet_balance.py +1/-1
- test/functional/wallet_fundrawtransaction.py +1/-1
- test/functional/wallet_sendall.py +1/-1
- test/functional/wallet_signer.py +1/-1
Card
The short text the ranking pass compares across PRs.
Deprecates the replaceable argument across ten transaction and PSBT creation and modification RPCs, throwing an RPC_METHOD_DEPRECATED error unless the node is started with -deprecatedrpc=bip125. Because full-RBF has been the default network policy since Bitcoin Core v28, transactions are replaceable regardless of BIP 125 opt-in sequence numbers, making the parameter redundant. This addresses issue 32661 and prepares the RPC interface for the argument's complete removal in a future release.
Data
thread read through 2026-10-26 (59 statements), head dc62ab2ca9
labels: Wallet
Categories
RPC / REST / ZMQ
P3 · cleanup
Enforces RPC deprecation discipline for obsolete bip125 arguments across transaction creation RPCs following network-wide full-RBF defaults. While breaking callers who still pass replaceable unless the deprecated flag is used, deprecating redundant parameters is standard API hygiene and reasonably deferrable.
Membership: Changes argument handling in src/rpc/rawtransaction.cpp for createrawtransaction and createpsbt, enforcing standard RPC deprecation behavior via -deprecatedrpc=bip125.
Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 1
Wallet
P3 · cleanup (ranking pass: Moved down: RPC surface deprecation with no behavior fix, grouped with the other cleanups.)
Deprecates redundant opt-in replaceability parameters across wallet transaction and PSBT creation methods as transactions are replaceable by default since v28. This provides valuable cleanup and unblocks eventual code removal (#32661), but does not affect fund safety or core wallet mechanics.
Membership: Wallet label and modifications to src/wallet/rpc/spend.cpp and src/wallet/spend.cpp deprecating the replaceable parameter across wallet spend RPCs.
Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 1