mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-26 17:52:13 +01:00
RPC: Allow RPC methods accepting options to take named parameters
Co-authored-by: Andrew Chow <github@achow101.com>
This commit is contained in:
parent
702b56d2a8
commit
96233146dd
16
doc/release-notes-26485.md
Normal file
16
doc/release-notes-26485.md
Normal file
@ -0,0 +1,16 @@
|
||||
JSON-RPC
|
||||
---
|
||||
|
||||
For RPC methods which accept `options` parameters ((`importmulti`, `listunspent`, `fundrawtransaction`, `bumpfee`, `send`, `sendall`, `walletcreatefundedpsbt`, `simulaterawtransaction`), it is now possible to pass the options as named parameters without the need for a nested object. (#26485)
|
||||
|
||||
This means it is possible make calls like:
|
||||
|
||||
```sh
|
||||
src/bitcoin-cli -named bumpfee txid fee_rate=100
|
||||
```
|
||||
|
||||
instead of
|
||||
|
||||
```sh
|
||||
src/bitcoin-cli -named bumpfee txid options='{"fee_rate": 100}'
|
||||
```
|
@ -101,6 +101,11 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||
{ "listunspent", 2, "addresses" },
|
||||
{ "listunspent", 3, "include_unsafe" },
|
||||
{ "listunspent", 4, "query_options" },
|
||||
{ "listunspent", 4, "minimumAmount" },
|
||||
{ "listunspent", 4, "maximumAmount" },
|
||||
{ "listunspent", 4, "maximumCount" },
|
||||
{ "listunspent", 4, "minimumSumAmount" },
|
||||
{ "listunspent", 4, "include_immature_coinbase" },
|
||||
{ "getblock", 1, "verbosity" },
|
||||
{ "getblock", 1, "verbose" },
|
||||
{ "getblockheader", 1, "verbose" },
|
||||
@ -124,11 +129,38 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||
{ "submitpackage", 0, "package" },
|
||||
{ "combinerawtransaction", 0, "txs" },
|
||||
{ "fundrawtransaction", 1, "options" },
|
||||
{ "fundrawtransaction", 1, "add_inputs"},
|
||||
{ "fundrawtransaction", 1, "include_unsafe"},
|
||||
{ "fundrawtransaction", 1, "minconf"},
|
||||
{ "fundrawtransaction", 1, "maxconf"},
|
||||
{ "fundrawtransaction", 1, "changePosition"},
|
||||
{ "fundrawtransaction", 1, "includeWatching"},
|
||||
{ "fundrawtransaction", 1, "lockUnspents"},
|
||||
{ "fundrawtransaction", 1, "fee_rate"},
|
||||
{ "fundrawtransaction", 1, "feeRate"},
|
||||
{ "fundrawtransaction", 1, "subtractFeeFromOutputs"},
|
||||
{ "fundrawtransaction", 1, "input_weights"},
|
||||
{ "fundrawtransaction", 1, "conf_target"},
|
||||
{ "fundrawtransaction", 1, "replaceable"},
|
||||
{ "fundrawtransaction", 1, "solving_data"},
|
||||
{ "fundrawtransaction", 2, "iswitness" },
|
||||
{ "walletcreatefundedpsbt", 0, "inputs" },
|
||||
{ "walletcreatefundedpsbt", 1, "outputs" },
|
||||
{ "walletcreatefundedpsbt", 2, "locktime" },
|
||||
{ "walletcreatefundedpsbt", 3, "options" },
|
||||
{ "walletcreatefundedpsbt", 3, "add_inputs"},
|
||||
{ "walletcreatefundedpsbt", 3, "include_unsafe"},
|
||||
{ "walletcreatefundedpsbt", 3, "minconf"},
|
||||
{ "walletcreatefundedpsbt", 3, "maxconf"},
|
||||
{ "walletcreatefundedpsbt", 3, "changePosition"},
|
||||
{ "walletcreatefundedpsbt", 3, "includeWatching"},
|
||||
{ "walletcreatefundedpsbt", 3, "lockUnspents"},
|
||||
{ "walletcreatefundedpsbt", 3, "fee_rate"},
|
||||
{ "walletcreatefundedpsbt", 3, "feeRate"},
|
||||
{ "walletcreatefundedpsbt", 3, "subtractFeeFromOutputs"},
|
||||
{ "walletcreatefundedpsbt", 3, "conf_target"},
|
||||
{ "walletcreatefundedpsbt", 3, "replaceable"},
|
||||
{ "walletcreatefundedpsbt", 3, "solving_data"},
|
||||
{ "walletcreatefundedpsbt", 4, "bip32derivs" },
|
||||
{ "walletprocesspsbt", 1, "sign" },
|
||||
{ "walletprocesspsbt", 3, "bip32derivs" },
|
||||
@ -154,18 +186,49 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||
{ "send", 1, "conf_target" },
|
||||
{ "send", 3, "fee_rate"},
|
||||
{ "send", 4, "options" },
|
||||
{ "send", 4, "add_inputs"},
|
||||
{ "send", 4, "include_unsafe"},
|
||||
{ "send", 4, "minconf"},
|
||||
{ "send", 4, "maxconf"},
|
||||
{ "send", 4, "add_to_wallet"},
|
||||
{ "send", 4, "change_position"},
|
||||
{ "send", 4, "fee_rate"},
|
||||
{ "send", 4, "include_watching"},
|
||||
{ "send", 4, "inputs"},
|
||||
{ "send", 4, "locktime"},
|
||||
{ "send", 4, "lock_unspents"},
|
||||
{ "send", 4, "psbt"},
|
||||
{ "send", 4, "subtract_fee_from_outputs"},
|
||||
{ "send", 4, "conf_target"},
|
||||
{ "send", 4, "replaceable"},
|
||||
{ "send", 4, "solving_data"},
|
||||
{ "sendall", 0, "recipients" },
|
||||
{ "sendall", 1, "conf_target" },
|
||||
{ "sendall", 3, "fee_rate"},
|
||||
{ "sendall", 4, "options" },
|
||||
{ "sendall", 4, "add_to_wallet"},
|
||||
{ "sendall", 4, "fee_rate"},
|
||||
{ "sendall", 4, "include_watching"},
|
||||
{ "sendall", 4, "inputs"},
|
||||
{ "sendall", 4, "locktime"},
|
||||
{ "sendall", 4, "lock_unspents"},
|
||||
{ "sendall", 4, "psbt"},
|
||||
{ "sendall", 4, "send_max"},
|
||||
{ "sendall", 4, "minconf"},
|
||||
{ "sendall", 4, "maxconf"},
|
||||
{ "sendall", 4, "conf_target"},
|
||||
{ "sendall", 4, "replaceable"},
|
||||
{ "sendall", 4, "solving_data"},
|
||||
{ "simulaterawtransaction", 0, "rawtxs" },
|
||||
{ "simulaterawtransaction", 1, "options" },
|
||||
{ "simulaterawtransaction", 1, "include_watchonly"},
|
||||
{ "importprivkey", 2, "rescan" },
|
||||
{ "importaddress", 2, "rescan" },
|
||||
{ "importaddress", 3, "p2sh" },
|
||||
{ "importpubkey", 2, "rescan" },
|
||||
{ "importmulti", 0, "requests" },
|
||||
{ "importmulti", 1, "options" },
|
||||
{ "importmulti", 1, "rescan" },
|
||||
{ "importdescriptors", 0, "requests" },
|
||||
{ "listdescriptors", 0, "private" },
|
||||
{ "verifychain", 0, "checklevel" },
|
||||
@ -189,7 +252,15 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||
{ "getmempooldescendants", 1, "verbose" },
|
||||
{ "gettxspendingprevout", 0, "outputs" },
|
||||
{ "bumpfee", 1, "options" },
|
||||
{ "bumpfee", 1, "conf_target"},
|
||||
{ "bumpfee", 1, "fee_rate"},
|
||||
{ "bumpfee", 1, "replaceable"},
|
||||
{ "bumpfee", 1, "outputs"},
|
||||
{ "psbtbumpfee", 1, "options" },
|
||||
{ "psbtbumpfee", 1, "conf_target"},
|
||||
{ "psbtbumpfee", 1, "fee_rate"},
|
||||
{ "psbtbumpfee", 1, "replaceable"},
|
||||
{ "psbtbumpfee", 1, "outputs"},
|
||||
{ "logging", 0, "include" },
|
||||
{ "logging", 1, "exclude" },
|
||||
{ "disconnectnode", 1, "nodeid" },
|
||||
|
@ -1298,7 +1298,7 @@ RPCHelpMan importmulti()
|
||||
},
|
||||
},
|
||||
RPCArgOptions{.oneline_description="\"requests\""}},
|
||||
{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
|
||||
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
{
|
||||
{"rescan", RPCArg::Type::BOOL, RPCArg::Default{true}, "Scan the chain and mempool for wallet transactions after all imports."},
|
||||
},
|
||||
|
@ -513,7 +513,7 @@ RPCHelpMan listunspent()
|
||||
},
|
||||
{"include_unsafe", RPCArg::Type::BOOL, RPCArg::Default{true}, "Include outputs that are not safe to spend\n"
|
||||
"See description of \"safe\" attribute below."},
|
||||
{"query_options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "JSON with query options",
|
||||
{"query_options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
{
|
||||
{"minimumAmount", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(0)}, "Minimum value of each UTXO in " + CURRENCY_UNIT + ""},
|
||||
{"maximumAmount", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"unlimited"}, "Maximum value of each UTXO in " + CURRENCY_UNIT + ""},
|
||||
|
@ -758,7 +758,7 @@ RPCHelpMan fundrawtransaction()
|
||||
"Only pay-to-pubkey, multisig, and P2SH versions thereof are currently supported for watch-only\n",
|
||||
{
|
||||
{"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of the raw transaction"},
|
||||
{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "for backward compatibility: passing in a true instead of an object will result in {\"includeWatching\":true}",
|
||||
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "For backward compatibility: passing in a true instead of an object will result in {\"includeWatching\":true}",
|
||||
Cat<std::vector<RPCArg>>(
|
||||
{
|
||||
{"add_inputs", RPCArg::Type::BOOL, RPCArg::Default{true}, "For a transaction with existing inputs, automatically include more if they are not enough."},
|
||||
@ -997,7 +997,7 @@ static RPCHelpMan bumpfee_helper(std::string method_name)
|
||||
"* WARNING: before version 0.21, fee_rate was in " + CURRENCY_UNIT + "/kvB. As of 0.21, fee_rate is in " + CURRENCY_ATOM + "/vB. *\n",
|
||||
{
|
||||
{"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The txid to be bumped"},
|
||||
{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
|
||||
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
{
|
||||
{"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks\n"},
|
||||
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"},
|
||||
@ -1187,7 +1187,7 @@ RPCHelpMan send()
|
||||
{"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n"
|
||||
"\"" + FeeModes("\"\n\"") + "\""},
|
||||
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
|
||||
{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
|
||||
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
Cat<std::vector<RPCArg>>(
|
||||
{
|
||||
{"add_inputs", RPCArg::Type::BOOL, RPCArg::DefaultHint{"false when \"inputs\" are specified, true otherwise"},"Automatically include coins from the wallet to cover the target amount.\n"},
|
||||
@ -1302,7 +1302,7 @@ RPCHelpMan sendall()
|
||||
"\"" + FeeModes("\"\n\"") + "\""},
|
||||
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
|
||||
{
|
||||
"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
|
||||
"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
Cat<std::vector<RPCArg>>(
|
||||
{
|
||||
{"add_to_wallet", RPCArg::Type::BOOL, RPCArg::Default{true}, "When false, returns the serialized transaction without broadcasting or adding it to the wallet"},
|
||||
@ -1635,7 +1635,7 @@ RPCHelpMan walletcreatefundedpsbt()
|
||||
OutputsDoc(),
|
||||
RPCArgOptions{.skip_type_check = true}},
|
||||
{"locktime", RPCArg::Type::NUM, RPCArg::Default{0}, "Raw locktime. Non-0 value also locktime-activates inputs"},
|
||||
{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
|
||||
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
Cat<std::vector<RPCArg>>(
|
||||
{
|
||||
{"add_inputs", RPCArg::Type::BOOL, RPCArg::DefaultHint{"false when \"inputs\" are specified, true otherwise"}, "Automatically include coins from the wallet to cover the target amount.\n"},
|
||||
|
@ -645,7 +645,7 @@ RPCHelpMan simulaterawtransaction()
|
||||
{"rawtx", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, ""},
|
||||
},
|
||||
},
|
||||
{"options", RPCArg::Type::OBJ_USER_KEYS, RPCArg::Optional::OMITTED, "Options",
|
||||
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
|
||||
{
|
||||
{"include_watchonly", RPCArg::Type::BOOL, RPCArg::DefaultHint{"true for watch-only wallets, otherwise false"}, "Whether to include watch-only addresses (see RPC importaddress)"},
|
||||
},
|
||||
|
@ -85,8 +85,8 @@ class HelpRpcTest(BitcoinTestFramework):
|
||||
|
||||
for argname, convert in converts_by_argname.items():
|
||||
if all(convert) != any(convert):
|
||||
# Only allow dummy to fail consistency check
|
||||
assert argname == 'dummy', ('WARNING: conversion mismatch for argument named %s (%s)' % (argname, list(zip(all_methods_by_argname[argname], converts_by_argname[argname]))))
|
||||
# Only allow dummy and psbt to fail consistency check
|
||||
assert argname in ['dummy', "psbt"], ('WARNING: conversion mismatch for argument named %s (%s)' % (argname, list(zip(all_methods_by_argname[argname], converts_by_argname[argname]))))
|
||||
|
||||
def test_categories(self):
|
||||
node = self.nodes[0]
|
||||
|
Loading…
x
Reference in New Issue
Block a user