Merge #15996: rpc: Deprecate totalfee argument in bumpfee
2f7eb772f6
Add RPC bumpfee totalFee deprecation test (Jon Atack)a92d9ce8cf
deprecate totalFee argument in bumpfee RPC call (Gregory Sanders) Pull request description: totalFee argument is of questionable use, and should be removed in favor of feerate-based features. I first moved IsDeprecatedRPCEnabled because `bitcoin-wallet` doesn't link `libbitcoin_server`. ACKs for top commit: ryanofsky: utACK2f7eb772f6
. Only change since last review is leaving IsDeprecatedRPCEnabled in its happy home, and switching to rpcEnableDeprecated instead. (Thanks!) jonatack: ACK2f7eb772f6
. Built locally, manually tested rpc bumpfee, help output ([gist](https://gist.github.com/jonatack/863673eacc02f9da39ff6d6712f9d837)), all tests pass. Travis failures appears to be unrelated, the [bitcoin builds are green](https://bitcoinbuilds.org/index.php?build=121). meshcollider: Code Review ACK2f7eb772f6
Tree-SHA512: c97465205ee59575df37894bcbb6c4ecf8858dd8fe9d89503f9342b226768c1dcb553153bc9eb3055f7bf5eb41573e48b8efa57e083cd255793cbe5280f0026a
This commit is contained in:
commit
c606e6fc53
4 changed files with 62 additions and 3 deletions
|
@ -3263,12 +3263,12 @@ static UniValue bumpfee(const JSONRPCRequest& request)
|
|||
"\nBumps the fee of an opt-in-RBF transaction T, replacing it with a new transaction B.\n"
|
||||
"An opt-in RBF transaction with the given txid must be in the wallet.\n"
|
||||
"The command will pay the additional fee by reducing change outputs or adding inputs when necessary. It may add a new change output if one does not already exist.\n"
|
||||
"If `totalFee` is given, adding inputs is not supported, so there must be a single change output that is big enough or it will fail.\n"
|
||||
"If `totalFee` (DEPRECATED) is given, adding inputs is not supported, so there must be a single change output that is big enough or it will fail.\n"
|
||||
"All inputs in the original transaction will be included in the replacement transaction.\n"
|
||||
"The command will fail if the wallet or mempool contains a transaction that spends one of T's outputs.\n"
|
||||
"By default, the new fee will be calculated automatically using estimatesmartfee.\n"
|
||||
"The user can specify a confirmation target for estimatesmartfee.\n"
|
||||
"Alternatively, the user can specify totalFee, or use RPC settxfee to set a higher fee rate.\n"
|
||||
"Alternatively, the user can specify totalFee (DEPRECATED), or use RPC settxfee to set a higher fee rate.\n"
|
||||
"At a minimum, the new fee rate must be high enough to pay an additional new relay fee (incrementalfee\n"
|
||||
"returned by getnetworkinfo) to enter the node's mempool.\n",
|
||||
{
|
||||
|
@ -3276,7 +3276,7 @@ static UniValue bumpfee(const JSONRPCRequest& request)
|
|||
{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED_NAMED_ARG, "",
|
||||
{
|
||||
{"confTarget", RPCArg::Type::NUM, /* default */ "fallback to wallet's default", "Confirmation target (in blocks)"},
|
||||
{"totalFee", RPCArg::Type::NUM, /* default */ "fallback to 'confTarget'", "Total fee (NOT feerate) to pay, in satoshis.\n"
|
||||
{"totalFee", RPCArg::Type::NUM, /* default */ "fallback to 'confTarget'", "Total fee (NOT feerate) to pay, in satoshis. (DEPRECATED)\n"
|
||||
" In rare cases, the actual fee paid might be slightly higher than the specified\n"
|
||||
" totalFee if the tx change output has to be removed because it is too close to\n"
|
||||
" the dust threshold."},
|
||||
|
@ -3331,6 +3331,9 @@ static UniValue bumpfee(const JSONRPCRequest& request)
|
|||
} else if (options.exists("confTarget")) { // TODO: alias this to conf_target
|
||||
coin_control.m_confirm_target = ParseConfirmTarget(options["confTarget"], pwallet->chain().estimateMaxBlocks());
|
||||
} else if (options.exists("totalFee")) {
|
||||
if (!pwallet->chain().rpcEnableDeprecated("totalFee")) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "totalFee argument has been deprecated and will be removed in 0.20. Please use -deprecatedrpc=totalFee to continue using this argument until removal.");
|
||||
}
|
||||
totalFee = options["totalFee"].get_int64();
|
||||
if (totalFee <= 0) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid totalFee %s (must be greater than 0)", FormatMoney(totalFee)));
|
||||
|
|
|
@ -175,6 +175,7 @@ BASE_SCRIPTS = [
|
|||
'rpc_bind.py --nonloopback',
|
||||
'mining_basic.py',
|
||||
'wallet_bumpfee.py',
|
||||
'wallet_bumpfee_totalfee_deprecation.py',
|
||||
'rpc_named_arguments.py',
|
||||
'wallet_listsinceblock.py',
|
||||
'p2p_leak.py',
|
||||
|
|
|
@ -37,6 +37,7 @@ class BumpFeeTest(BitcoinTestFramework):
|
|||
self.extra_args = [[
|
||||
"-walletrbf={}".format(i),
|
||||
"-mintxfee=0.00002",
|
||||
"-deprecatedrpc=totalFee",
|
||||
] for i in range(self.num_nodes)]
|
||||
|
||||
def skip_test_if_missing_module(self):
|
||||
|
|
54
test/functional/wallet_bumpfee_totalfee_deprecation.py
Executable file
54
test/functional/wallet_bumpfee_totalfee_deprecation.py
Executable file
|
@ -0,0 +1,54 @@
|
|||
#!/usr/bin/env python3
|
||||
# Copyright (c) 2019 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test deprecation of passing `totalFee` to the bumpfee RPC."""
|
||||
from decimal import Decimal
|
||||
|
||||
from test_framework.messages import BIP125_SEQUENCE_NUMBER
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_raises_rpc_error
|
||||
|
||||
class BumpFeeWithTotalFeeArgumentDeprecationTest(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 2
|
||||
self.extra_args = [[
|
||||
"-walletrbf={}".format(i),
|
||||
"-mintxfee=0.00002",
|
||||
] for i in range(self.num_nodes)]
|
||||
|
||||
def skip_test_if_missing_module(self):
|
||||
self.skip_if_no_wallet()
|
||||
|
||||
def run_test(self):
|
||||
peer_node, rbf_node = self.nodes
|
||||
peer_node.generate(110)
|
||||
self.sync_all()
|
||||
peer_node.sendtoaddress(rbf_node.getnewaddress(), 0.001)
|
||||
self.sync_all()
|
||||
peer_node.generate(1)
|
||||
self.sync_all()
|
||||
rbfid = spend_one_input(rbf_node, peer_node.getnewaddress())
|
||||
|
||||
self.log.info("Testing bumpfee with totalFee argument raises RPC error with deprecation message")
|
||||
assert_raises_rpc_error(
|
||||
-8,
|
||||
"totalFee argument has been deprecated and will be removed in 0.20. " +
|
||||
"Please use -deprecatedrpc=totalFee to continue using this argument until removal.",
|
||||
rbf_node.bumpfee, rbfid, {"totalFee": 2000})
|
||||
|
||||
self.log.info("Testing bumpfee without totalFee argument does not raise")
|
||||
rbf_node.bumpfee(rbfid)
|
||||
|
||||
def spend_one_input(node, dest_address, change_size=Decimal("0.00049000")):
|
||||
tx_input = dict(sequence=BIP125_SEQUENCE_NUMBER,
|
||||
**next(u for u in node.listunspent() if u["amount"] == Decimal("0.00100000")))
|
||||
destinations = {dest_address: Decimal("0.00050000")}
|
||||
destinations[node.getrawchangeaddress()] = change_size
|
||||
rawtx = node.createrawtransaction([tx_input], destinations)
|
||||
signedtx = node.signrawtransactionwithwallet(rawtx)
|
||||
txid = node.sendrawtransaction(signedtx["hex"])
|
||||
return txid
|
||||
|
||||
if __name__ == "__main__":
|
||||
BumpFeeWithTotalFeeArgumentDeprecationTest().main()
|
Loading…
Add table
Reference in a new issue