Summary
This PR removes the settxfee RPC and paytxfee setting (Bitcoin Core 31.0). These two features were deprecated in #31278.
Summary
This PR removes the settxfee RPC and paytxfee setting (Bitcoin Core 31.0). These two features were deprecated in #31278.
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.
For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/32138.
See the guideline for information on the review process.
If your review is incorrectly listed, please copy-paste <!–meta-tag:bot-skip–> into the comment that the bot should ignore.
Reviewers, this pull request conflicts with the following ones:
maxfeerate wallet startup option by ismaelsadeeq)If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.
Possible places where named args for integral literals may be used (e.g. func(x, /*named_arg=*/0) in C++, and func(x, named_arg=0) in Python):
2026-02-13 09:53:51
🚧 At least one of the CI tasks failed. Debug: https://github.com/bitcoin/bitcoin/runs/39393296960
Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
🚧 At least one of the CI tasks failed.
Task lint: https://github.com/bitcoin/bitcoin/runs/48937774714
LLM reason (✨ experimental): Lint failure caused by an invalid Python shebang in test/functional/wallet_txn_clone.py (syntax error).
Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
m_pay_tx_fee. It is just dead code now, no?
It is just dead code now, no? @maflcko I think you’re right. Will squash after review, think it’s easier this way.
101@@ -102,7 +102,7 @@ void NotifyWalletLoaded(WalletContext& context, const std::shared_ptr<CWallet>&
102 std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);
103
104 //! -paytxfee default (paytxfee RPC was removed in v31.0)
105-constexpr CAmount DEFAULT_PAY_TX_FEE = 0;
106+//constexpr CAmount DEFAULT_PAY_TX_FEE = 0;
Will squash after review, think it’s easier this way.
I’d say to either squash now, or create meaningful separate commits. E.g:
Concept ACK
This should have a release note, and IIUC, the following part of the PR description doesn’t apply anymore:
This PR does not remove the internal implementation of the default value of paytxfee=0 but removes the option for users to modify it.
ACK 76a5e97671177e6f0f08bfd7c2ce13e7b273415d
Tested behavior before and after this PR, code lgtm.
Prior to this PR, settxfee was callable (with deprecation warning). With this PR it is fully removed and returns “Method not found”:
0$ bitcoin-cli settxfee 0.001
1error code: -32601
2error message:
3Method not found
The -paytxfee startup option is also rejected after this PR:
0$ bitcoind -paytxfee=0.001
1Error: Error parsing command line arguments: Invalid parameter -paytxfee=0.001
0@@ -0,0 +1,3 @@
1+RPC and Startup Option
2+---
3+The `-paytxfee` startup option and the `settxfee` RPC are now deleted after being deprected in Bitcoin Core 30.0. They used to allow the user to set a static fee rate for wallet transactions, which could potentially lead to overpaying or underpaying. Users should instead rely on fee estimation or specify a fee rate per transaction using the `fee_rate` argument in RPCs such as `fundrawtransaction`, `sendtoaddress`, `send`, `sendall`, and `sendmany`. (#32138)
0The `-paytxfee` startup option and the `settxfee` RPC are now deleted after being deprecated in Bitcoin Core 30.0. They used to allow the user to set a static fee rate for wallet transactions, which could potentially lead to overpaying or underpaying. Users should instead rely on fee estimation or specify a fee rate per transaction using the `fee_rate` argument in RPCs such as `fundrawtransaction`, `sendtoaddress`, `send`, `sendall`, and `sendmany`. (#32138)
There is still a reference to the removed m_pay_tx_fee here:
0--- a/src/wallet/coincontrol.h
1+++ b/src/wallet/coincontrol.h
2@@ -93,7 +93,7 @@ public:
3 bool m_allow_other_inputs = true;
4 //! Override automatic min/max checks on fee, m_feerate must be set if true
5 bool fOverrideFeeRate = false;
6- //! Override the wallet's m_pay_tx_fee if set
7+ //! Override the default wallet fee rate if set
8 std::optional<CFeeRate> m_feerate;
9 //! Override the default confirmation target if set
10 std::optional<unsigned int> m_confirm_target;
There’s also a remaining reference in src/qt/bitcoinstrings.cpp, although that file is auto-generated.
0--- a/src/qt/bitcoinstrings.cpp
1+++ b/src/qt/bitcoinstrings.cpp
2@@ -14,7 +14,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "%s is set very high!"),
3 QT_TRANSLATE_NOOP("bitcoin-core", "%s is set very high! Fees this large could be paid on a single transaction."),
4 QT_TRANSLATE_NOOP("bitcoin-core", "%s request to listen on port %u. This port is considered \"bad\" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list."),
5 QT_TRANSLATE_NOOP("bitcoin-core", "-maxmempool must be at least %d MB"),
6-QT_TRANSLATE_NOOP("bitcoin-core", "-paytxfee is deprecated and will be fully removed in v31.0."),
7 QT_TRANSLATE_NOOP("bitcoin-core", "A fatal internal error occurred, see debug.log for details: "),
8 QT_TRANSLATE_NOOP("bitcoin-core", "Assumeutxo data not found for the given blockhash '%s'."),
There’s also a remaining reference in
src/qt/bitcoinstrings.cpp, although that file is auto-generated.
Is this something I should take into account? Or will it get solved automatically?
There’s also a remaining reference in
src/qt/bitcoinstrings.cpp, although that file is auto-generated.Is this something I should take into account? Or will it get solved automatically?
No those are cleaned up by the pre-release translations update
🚧 At least one of the CI tasks failed.
Task lint: https://github.com/bitcoin/bitcoin/actions/runs/21705105705/job/62594128574
LLM reason (✨ experimental): Lint check failed due to undocumented argument -paytxfee.
Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
Rebased to fix conflicts with master.
The conflict was caused by #32636 when moving the load args code to it’s own function CWallet::LoadWalletArgs.
68@@ -68,20 +69,22 @@ def test_tx_size_too_large(self):
69 lambda: self.nodes[0].fundrawtransaction(hexstring=raw_tx),
70 )
71
72- self.log.info('Check maxtxfee in combination with settxfee')
73- self.restart_node(0, expected_stderr='Warning: -paytxfee is deprecated and will be fully removed in v31.0.')
74- self.nodes[0].settxfee(0.01)
75+ # Hit maxtxfee with explicit fee rate
76+ self.log.info('Check maxtxfee in combination with explicit fee_rate=1000 sat/vB')
77+ self.restart_node(0)
In 2d09b4077d270a2caa94aee555fc2fe91e0bcc6e “wallet, rpc:remove settxfee and paytxfee”
This restart_node is no longer necessary.
I think the “need release note” label can be removed :)
Force pushed to remove an unnecessary restart_node see #32138 (review)
0$ git diff 2d09b4..a31455db31
1diff --git a/test/functional/wallet_create_tx.py b/test/functional/wallet_create_tx.py
2index 810b5a8423..a62759761f 100755
3--- a/test/functional/wallet_create_tx.py
4+++ b/test/functional/wallet_create_tx.py
5@@ -71,7 +71,6 @@ class CreateTxWalletTest(BitcoinTestFramework):
6
7 # Hit maxtxfee with explicit fee rate
8 self.log.info('Check maxtxfee in combination with explicit fee_rate=1000 sat/vB')
9- self.restart_node(0)
10
11 fee_rate_sats_per_vb = Decimal('0.01') * Decimal(1e8) / 1000 # Convert 0.01 BTC/kvB to sat/vB
In the enumeration that give the reason for returned fee estimate (in block_policy_estimator.h), I noticed that there is a PAYTXFEE element. I believe that since paytxfee is being deleted, this element should be erased. I eliminated the code where FeeReason::PAYTXFEE was present. Here I leave the code I changed:
0diff --git a/src/common/messages.cpp b/src/common/messages.cpp
1index 123db93cf6..ec20eeb2aa 100644
2--- a/src/common/messages.cpp
3+++ b/src/common/messages.cpp
4@@ -33,7 +33,6 @@ std::string StringForFeeReason(FeeReason reason)
5 {FeeReason::DOUBLE_ESTIMATE, "Double Target 95% Threshold"},
6 {FeeReason::CONSERVATIVE, "Conservative Double Target longer horizon"},
7 {FeeReason::MEMPOOL_MIN, "Mempool Min Fee"},
8- {FeeReason::PAYTXFEE, "PayTxFee set"},
9 {FeeReason::FALLBACK, "Fallback fee"},
10 {FeeReason::REQUIRED, "Minimum Required Fee"},
11 };
12diff --git a/src/policy/fees/block_policy_estimator.h b/src/policy/fees/block_policy_estimator.h
13index 505eed0867..ae7b440607 100644
14--- a/src/policy/fees/block_policy_estimator.h
15+++ b/src/policy/fees/block_policy_estimator.h
16@@ -64,7 +64,6 @@ enum class FeeReason {
17 DOUBLE_ESTIMATE,
18 CONSERVATIVE,
19 MEMPOOL_MIN,
20- PAYTXFEE,
21 FALLBACK,
22 REQUIRED,
23 };
24diff --git a/src/test/fuzz/fees.cpp b/src/test/fuzz/fees.cpp
25index f295dd12c8..1bd5c67a20 100644
26--- a/src/test/fuzz/fees.cpp
27+++ b/src/test/fuzz/fees.cpp
28@@ -26,6 +26,6 @@ FUZZ_TARGET(fees)
29 const CAmount rounded_fee = fee_filter_rounder.round(current_minimum_fee);
30 assert(MoneyRange(rounded_fee));
31 }
32- const FeeReason fee_reason = fuzzed_data_provider.PickValueInArray({FeeReason::NONE, FeeReason::HALF_ESTIMATE, FeeReason::FULL_ESTIMATE, FeeReason::DOUBLE_ESTIMATE, FeeReason::CONSERVATIVE, FeeReason::MEMPOOL_MIN, FeeReason::PAYTXFEE, FeeReason::FALLBACK, FeeReason::REQUIRED});
33+ const FeeReason fee_reason = fuzzed_data_provider.PickValueInArray({FeeReason::NONE, FeeReason::HALF_ESTIMATE, FeeReason::FULL_ESTIMATE, FeeReason::DOUBLE_ESTIMATE, FeeReason::CONSERVATIVE, FeeReason::MEMPOOL_MIN, FeeReason::FALLBACK, FeeReason::REQUIRED});
34 (void)StringForFeeReason(fee_reason);
35 }
36diff --git a/src/wallet/fees.cpp b/src/wallet/fees.cpp
37index d5e7140a2a..e2bb222791 100644
38--- a/src/wallet/fees.cpp
39+++ b/src/wallet/fees.cpp
40@@ -37,7 +37,6 @@ CFeeRate GetMinimumFeeRate(const CWallet& wallet, const CCoinControl& coin_contr
41 CFeeRate feerate_needed;
42 if (coin_control.m_feerate) { // 1.
43 feerate_needed = *(coin_control.m_feerate);
44- if (feeCalc) feeCalc->reason = FeeReason::PAYTXFEE;
45 // Allow to override automatic min/max check over coin control instance
46 if (coin_control.fOverrideFeeRate) return feerate_needed;
47 }
I run the unit tests: And the functional:
Thanks for the review, nice catch @Bicaru20 :)
Force pushed to add the changes proposed in #32138 (comment)
see the diff here https://github.com/bitcoin/bitcoin/compare/5772c2ea4cefc09a3e6341d20b2172247b3f7982..24f93c9af7f6627cd7d09a1a5f10667846b048eb
polespinasa
DrahtBot
maflcko
theStack
nebula-21
w0xlt
achow101
Bicaru20
Labels
Wallet
RPC/REST/ZMQ
Needs release note
Milestone
31.0