Skip to content

Commit c2e53ff

Browse files
author
MarcoFalke
committed
Merge #18467: rpc: Improve documentation and return value of settxfee
3867727 rpc: settxfee respects -maxtxfee wallet setting (Fabian Jahr) bda84a0 rpc: Add documentation for deactivating settxfee (Fabian Jahr) Pull request description: ~~Closes 18315~~ `settxfee` can be deactivated by passing 0 as the fee. That does not seem to be documented for the user so this PR adds it in the description. The return value of a simple boolean seems also too simplified given the multiple dimensions that this deactivation feature enables. I.e. it does not seem intuitive if the returned boolean shows that the call succeeded or if means that `settxfee` is active. My suggested solution is to change the return value to a JSON object that included the "active" state and the currently set fee rate. Examples: ``` $ src/bitcoin-cli settxfee 0.0000000 { "active": false, "fee_rate": "0.00000000 BTC/kB" } $ src/bitcoin-cli settxfee 0.0001 { "active": true, "fee_rate": "0.00010000 BTC/kB" } ``` ACKs for top commit: MarcoFalke: ACK 3867727, seems useful to error out early instead of later #16257 🕍 jonatack: ACK 3867727 meshcollider: LGTM, utACK 3867727 Tree-SHA512: 642813b5cf6612abb4b6cb63728081a6bd1659d809e0149c8f56060b6da7253fee989b3b202854f3051df3773c966799af30b612648c466b099f00590f356548
2 parents c189bfd + 3867727 commit c2e53ff

File tree

3 files changed

+16
-5
lines changed

3 files changed

+16
-5
lines changed

src/wallet/rpcwallet.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2325,7 +2325,8 @@ static UniValue settxfee(const JSONRPCRequest& request)
23252325
}
23262326

23272327
RPCHelpMan{"settxfee",
2328-
"\nSet the transaction fee per kB for this wallet. Overrides the global -paytxfee command line parameter.\n",
2328+
"\nSet the transaction fee per kB for this wallet. Overrides the global -paytxfee command line parameter.\n"
2329+
"Can be deactivated by passing 0 as the fee. In that case automatic fee selection will be used by default.\n",
23292330
{
23302331
{"amount", RPCArg::Type::AMOUNT, RPCArg::Optional::NO, "The transaction fee in " + CURRENCY_UNIT + "/kB"},
23312332
},
@@ -2343,12 +2344,15 @@ static UniValue settxfee(const JSONRPCRequest& request)
23432344

23442345
CAmount nAmount = AmountFromValue(request.params[0]);
23452346
CFeeRate tx_fee_rate(nAmount, 1000);
2347+
CFeeRate max_tx_fee_rate(pwallet->m_default_max_tx_fee, 1000);
23462348
if (tx_fee_rate == CFeeRate(0)) {
23472349
// automatic selection
23482350
} else if (tx_fee_rate < pwallet->chain().relayMinFee()) {
23492351
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("txfee cannot be less than min relay tx fee (%s)", pwallet->chain().relayMinFee().ToString()));
23502352
} else if (tx_fee_rate < pwallet->m_min_fee) {
23512353
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("txfee cannot be less than wallet min fee (%s)", pwallet->m_min_fee.ToString()));
2354+
} else if (tx_fee_rate > max_tx_fee_rate) {
2355+
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("txfee cannot be more than wallet max tx fee (%s)", max_tx_fee_rate.ToString()));
23522356
}
23532357

23542358
pwallet->m_pay_tx_fee = tx_fee_rate;

test/functional/wallet_bumpfee.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,14 @@ def run_test(self):
8282
test_notmine_bumpfee_fails(self, rbf_node, peer_node, dest_address)
8383
test_bumpfee_with_descendant_fails(self, rbf_node, rbf_node_address, dest_address)
8484
test_dust_to_fee(self, rbf_node, dest_address)
85-
test_settxfee(self, rbf_node, dest_address)
8685
test_watchonly_psbt(self, peer_node, rbf_node, dest_address)
8786
test_rebumping(self, rbf_node, dest_address)
8887
test_rebumping_not_replaceable(self, rbf_node, dest_address)
8988
test_unconfirmed_not_spendable(self, rbf_node, rbf_node_address)
9089
test_bumpfee_metadata(self, rbf_node, dest_address)
9190
test_locked_wallet_fails(self, rbf_node, dest_address)
9291
test_change_script_match(self, rbf_node, dest_address)
92+
test_settxfee(self, rbf_node, dest_address)
9393
test_maxtxfee_fails(self, rbf_node, dest_address)
9494
# These tests wipe out a number of utxos that are expected in other tests
9595
test_small_output_with_feerate_succeeds(self, rbf_node, dest_address)
@@ -286,9 +286,15 @@ def test_settxfee(self, rbf_node, dest_address):
286286
assert_greater_than(Decimal("0.00001000"), abs(requested_feerate - actual_feerate))
287287
rbf_node.settxfee(Decimal("0.00000000")) # unset paytxfee
288288

289+
# check that settxfee respects -maxtxfee
290+
self.restart_node(1, ['-maxtxfee=0.000025'] + self.extra_args[1])
291+
assert_raises_rpc_error(-8, "txfee cannot be more than wallet max tx fee", rbf_node.settxfee, Decimal('0.00003'))
292+
self.restart_node(1, self.extra_args[1])
293+
rbf_node.walletpassphrase(WALLET_PASSPHRASE, WALLET_PASSPHRASE_TIMEOUT)
294+
289295

290296
def test_maxtxfee_fails(self, rbf_node, dest_address):
291-
self.log.info('Test that bumpfee fails when it hits -matxfee')
297+
self.log.info('Test that bumpfee fails when it hits -maxtxfee')
292298
# size of bumped transaction (p2wpkh, 1 input, 2 outputs): 141 vbytes
293299
# expected bump fee of 141 vbytes * 0.00200000 BTC / 1000 vbytes = 0.00002820 BTC
294300
# which exceeds maxtxfee and is expected to raise

test/functional/wallet_multiwallet.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
Verify that a bitcoind node can load multiple wallet files
88
"""
9+
from decimal import Decimal
910
import os
1011
import shutil
1112
import time
@@ -193,9 +194,9 @@ def wallet_file(name):
193194
self.log.info('Check for per-wallet settxfee call')
194195
assert_equal(w1.getwalletinfo()['paytxfee'], 0)
195196
assert_equal(w2.getwalletinfo()['paytxfee'], 0)
196-
w2.settxfee(4.0)
197+
w2.settxfee(0.001)
197198
assert_equal(w1.getwalletinfo()['paytxfee'], 0)
198-
assert_equal(w2.getwalletinfo()['paytxfee'], 4.0)
199+
assert_equal(w2.getwalletinfo()['paytxfee'], Decimal('0.00100000'))
199200

200201
self.log.info("Test dynamic wallet loading")
201202

0 commit comments

Comments
 (0)