Skip to content

Commit b52cb63

Browse files
committed
Add getdescriptorinfo to compute checksum
1 parent 3b40bff commit b52cb63

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/rpc/misc.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,46 @@ static UniValue createmultisig(const JSONRPCRequest& request)
143143
return result;
144144
}
145145

146+
UniValue getdescriptorinfo(const JSONRPCRequest& request)
147+
{
148+
if (request.fHelp || request.params.size() != 1) {
149+
throw std::runtime_error(
150+
RPCHelpMan{"getdescriptorinfo",
151+
{"\nAnalyses a descriptor.\n"},
152+
{
153+
{"descriptor", RPCArg::Type::STR, RPCArg::Optional::NO, "The descriptor."},
154+
},
155+
RPCResult{
156+
"{\n"
157+
" \"descriptor\" : \"desc\", (string) The descriptor in canonical form, without private keys\n"
158+
" \"isrange\" : true|false, (boolean) Whether the descriptor is ranged\n"
159+
" \"issolvable\" : true|false, (boolean) Whether the descriptor is solvable\n"
160+
" \"hasprivatekeys\" : true|false, (boolean) Whether the input descriptor contained at least one private key\n"
161+
"}\n"
162+
},
163+
RPCExamples{
164+
"Analyse a descriptor\n" +
165+
HelpExampleCli("getdescriptorinfo", "\"wpkh([d34db33f/84h/0h/0h]0279be667ef9dcbbac55a06295Ce870b07029Bfcdb2dce28d959f2815b16f81798)\"")
166+
}}.ToString()
167+
);
168+
}
169+
170+
RPCTypeCheck(request.params, {UniValue::VSTR});
171+
172+
FlatSigningProvider provider;
173+
auto desc = Parse(request.params[0].get_str(), provider);
174+
if (!desc) {
175+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor"));
176+
}
177+
178+
UniValue result(UniValue::VOBJ);
179+
result.pushKV("descriptor", desc->ToString());
180+
result.pushKV("isrange", desc->IsRange());
181+
result.pushKV("issolvable", desc->IsSolvable());
182+
result.pushKV("hasprivatekeys", provider.keys.size() > 0);
183+
return result;
184+
}
185+
146186
UniValue deriveaddresses(const JSONRPCRequest& request)
147187
{
148188
if (request.fHelp || request.params.empty() || request.params.size() > 3) {
@@ -564,6 +604,7 @@ static const CRPCCommand commands[] =
564604
{ "util", "validateaddress", &validateaddress, {"address"} },
565605
{ "util", "createmultisig", &createmultisig, {"nrequired","keys","address_type"} },
566606
{ "util", "deriveaddresses", &deriveaddresses, {"descriptor", "begin", "end"} },
607+
{ "util", "getdescriptorinfo", &getdescriptorinfo, {"descriptor"} },
567608
{ "util", "verifymessage", &verifymessage, {"address","signature","message"} },
568609
{ "util", "signmessagewithprivkey", &signmessagewithprivkey, {"privkey","message"} },
569610

test/functional/wallet_address_types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ def test_desc(self, node, address, multisig, typ, utxo):
175175
assert(descsum_check(info['desc']))
176176
# Verify that stripping the checksum and recreating it using Python roundtrips
177177
assert(info['desc'] == descsum_create(info['desc'][:-9]))
178+
# Verify that stripping the checksum and feeding it to getdescriptorinfo roundtrips
179+
assert(info['desc'] == self.nodes[0].getdescriptorinfo(info['desc'][:-9])['descriptor'])
178180

179181
if not multisig and typ == 'legacy':
180182
# P2PKH

0 commit comments

Comments
 (0)