Merge 24162 via rpc_deriveaddr_wo_checksum-26

This commit is contained in:
Luke Dashjr 2025-03-05 03:27:08 +00:00
commit d9cb2a45b9
2 changed files with 29 additions and 5 deletions

View File

@ -89,6 +89,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "sendmany", 8, "fee_rate"}, { "sendmany", 8, "fee_rate"},
{ "sendmany", 9, "verbose" }, { "sendmany", 9, "verbose" },
{ "deriveaddresses", 1, "range" }, { "deriveaddresses", 1, "range" },
{ "deriveaddresses", 2, "options" },
{ "deriveaddresses", 2, "require_checksum" },
{ "scanblocks", 1, "scanobjects" }, { "scanblocks", 1, "scanobjects" },
{ "scanblocks", 2, "start_height" }, { "scanblocks", 2, "start_height" },
{ "scanblocks", 3, "stop_height" }, { "scanblocks", 3, "stop_height" },

View File

@ -225,6 +225,12 @@ static RPCHelpMan deriveaddresses()
{ {
{"descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The descriptor."}, {"descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The descriptor."},
{"range", RPCArg::Type::RANGE, RPCArg::Optional::OMITTED, "If a ranged descriptor is used, this specifies the end or the range (in [begin,end] notation) to derive."}, {"range", RPCArg::Type::RANGE, RPCArg::Optional::OMITTED, "If a ranged descriptor is used, this specifies the end or the range (in [begin,end] notation) to derive."},
{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
{
{"require_checksum", RPCArg::Type::BOOL, RPCArg::Default{true}, "Require a checksum. If a checksum is provided it will be verified regardless of this parameter."},
},
RPCArgOptions{.oneline_description="options"}
},
}, },
RPCResult{ RPCResult{
RPCResult::Type::ARR, "", "", RPCResult::Type::ARR, "", "",
@ -233,13 +239,29 @@ static RPCHelpMan deriveaddresses()
} }
}, },
RPCExamples{ RPCExamples{
"First three native segwit receive addresses\n" + "First three native segwit receive addresses:\n" +
HelpExampleCli("deriveaddresses", "\"" + EXAMPLE_DESCRIPTOR + "\" \"[0,2]\"") + HelpExampleCli("deriveaddresses", "\"" + EXAMPLE_DESCRIPTOR + "\" \"[0,2]\"") +
HelpExampleRpc("deriveaddresses", "\"" + EXAMPLE_DESCRIPTOR + "\", \"[0,2]\"") HelpExampleRpc("deriveaddresses", "\"" + EXAMPLE_DESCRIPTOR + "\", \"[0,2]\"") +
"Derive the PKH address from a WIF, which has a built-in checksum:\n" +
HelpExampleCli("deriveaddresses", "\"pkh(cPsQTSmMZ8e3AEUWGjS73f5R364yJxH6RxcgnwbHjbKbFPUP2Dtu)\" null '{\"require_checksum\": false}'")
}, },
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{ {
const std::string desc_str = request.params[0].get_str(); const std::string desc_str = request.params[0].get_str();
bool require_checksum = true;
if (!request.params[2].isNull()) {
const UniValue& options = request.params[2];
RPCTypeCheckObj(options,
{
{"require_checksum", UniValueType(UniValue::VBOOL)},
},
true, true);
if (options.exists("require_checksum")) {
require_checksum = options["require_checksum"].get_bool();
}
}
int64_t range_begin = 0; int64_t range_begin = 0;
int64_t range_end = 0; int64_t range_end = 0;
@ -250,16 +272,16 @@ static RPCHelpMan deriveaddresses()
FlatSigningProvider key_provider; FlatSigningProvider key_provider;
std::string error; std::string error;
auto desc = Parse(desc_str, key_provider, error, /* require_checksum = */ true); auto desc = Parse(desc_str, key_provider, error, require_checksum);
if (!desc) { if (!desc) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error); throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
} }
if (!desc->IsRange() && request.params.size() > 1) { if (!desc->IsRange() && !request.params[1].isNull()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Range should not be specified for an un-ranged descriptor");
} }
if (desc->IsRange() && request.params.size() == 1) { if (desc->IsRange() && request.params[1].isNull()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Range must be specified for a ranged descriptor"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Range must be specified for a ranged descriptor");
} }