Skip to content

Commit 39633ec

Browse files
jnewberyachow101
authored andcommitted
[rpc] split wallet and non-wallet parts of DescribeAddressVisitor
1 parent 3fa556a commit 39633ec

File tree

1 file changed

+63
-26
lines changed

1 file changed

+63
-26
lines changed

src/rpc/misc.cpp

Lines changed: 63 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,62 @@
3333

3434
#include <univalue.h>
3535

36-
#ifdef ENABLE_WALLET
3736
class DescribeAddressVisitor : public boost::static_visitor<UniValue>
3837
{
3938
public:
40-
CWallet * const pwallet;
39+
explicit DescribeAddressVisitor() {}
40+
41+
UniValue operator()(const CNoDestination &dest) const { return UniValue(UniValue::VOBJ); }
42+
43+
UniValue operator()(const CKeyID &keyID) const {
44+
UniValue obj(UniValue::VOBJ);
45+
obj.pushKV("isscript", false);
46+
obj.pushKV("iswitness", false);
47+
return obj;
48+
}
49+
50+
UniValue operator()(const CScriptID &scriptID) const {
51+
UniValue obj(UniValue::VOBJ);
52+
obj.pushKV("isscript", true);
53+
obj.pushKV("iswitness", false);
54+
return obj;
55+
}
56+
57+
UniValue operator()(const WitnessV0KeyHash& id) const
58+
{
59+
UniValue obj(UniValue::VOBJ);
60+
obj.pushKV("isscript", false);
61+
obj.pushKV("iswitness", true);
62+
obj.pushKV("witness_version", 0);
63+
obj.pushKV("witness_program", HexStr(id.begin(), id.end()));
64+
return obj;
65+
}
66+
67+
UniValue operator()(const WitnessV0ScriptHash& id) const
68+
{
69+
UniValue obj(UniValue::VOBJ);
70+
obj.pushKV("isscript", true);
71+
obj.pushKV("iswitness", true);
72+
obj.pushKV("witness_version", 0);
73+
obj.pushKV("witness_program", HexStr(id.begin(), id.end()));
74+
return obj;
75+
}
4176

42-
explicit DescribeAddressVisitor(CWallet *_pwallet) : pwallet(_pwallet) {}
77+
UniValue operator()(const WitnessUnknown& id) const
78+
{
79+
UniValue obj(UniValue::VOBJ);
80+
obj.pushKV("iswitness", true);
81+
obj.pushKV("witness_version", (int)id.version);
82+
obj.pushKV("witness_program", HexStr(id.program, id.program + id.length));
83+
return obj;
84+
}
85+
};
86+
87+
#ifdef ENABLE_WALLET
88+
class DescribeWalletAddressVisitor : public boost::static_visitor<UniValue>
89+
{
90+
public:
91+
CWallet * const pwallet;
4392

4493
void ProcessSubScript(const CScript& subscript, UniValue& obj, bool include_addresses = false) const
4594
{
@@ -54,7 +103,11 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
54103
UniValue a(UniValue::VARR);
55104
if (ExtractDestination(subscript, embedded)) {
56105
// Only when the script corresponds to an address.
57-
UniValue subobj = boost::apply_visitor(*this, embedded);
106+
UniValue subobj(UniValue::VOBJ);
107+
UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), embedded);
108+
subobj.pushKVs(detail);
109+
UniValue wallet_detail = boost::apply_visitor(*this, embedded);
110+
subobj.pushKVs(wallet_detail);
58111
subobj.pushKV("address", EncodeDestination(embedded));
59112
subobj.pushKV("scriptPubKey", HexStr(subscript.begin(), subscript.end()));
60113
// Always report the pubkey at the top level, so that `getnewaddress()['pubkey']` always works.
@@ -81,13 +134,13 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
81134
if (include_addresses) obj.pushKV("addresses", std::move(a));
82135
}
83136

137+
explicit DescribeWalletAddressVisitor(CWallet *_pwallet) : pwallet(_pwallet) {}
138+
84139
UniValue operator()(const CNoDestination &dest) const { return UniValue(UniValue::VOBJ); }
85140

86141
UniValue operator()(const CKeyID &keyID) const {
87142
UniValue obj(UniValue::VOBJ);
88143
CPubKey vchPubKey;
89-
obj.pushKV("isscript", false);
90-
obj.pushKV("iswitness", false);
91144
if (pwallet && pwallet->GetPubKey(keyID, vchPubKey)) {
92145
obj.pushKV("pubkey", HexStr(vchPubKey));
93146
obj.pushKV("iscompressed", vchPubKey.IsCompressed());
@@ -98,8 +151,6 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
98151
UniValue operator()(const CScriptID &scriptID) const {
99152
UniValue obj(UniValue::VOBJ);
100153
CScript subscript;
101-
obj.pushKV("isscript", true);
102-
obj.pushKV("iswitness", false);
103154
if (pwallet && pwallet->GetCScript(scriptID, subscript)) {
104155
ProcessSubScript(subscript, obj, true);
105156
}
@@ -110,10 +161,6 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
110161
{
111162
UniValue obj(UniValue::VOBJ);
112163
CPubKey pubkey;
113-
obj.pushKV("isscript", false);
114-
obj.pushKV("iswitness", true);
115-
obj.pushKV("witness_version", 0);
116-
obj.pushKV("witness_program", HexStr(id.begin(), id.end()));
117164
if (pwallet && pwallet->GetPubKey(CKeyID(id), pubkey)) {
118165
obj.pushKV("pubkey", HexStr(pubkey));
119166
}
@@ -124,10 +171,6 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
124171
{
125172
UniValue obj(UniValue::VOBJ);
126173
CScript subscript;
127-
obj.pushKV("isscript", true);
128-
obj.pushKV("iswitness", true);
129-
obj.pushKV("witness_version", 0);
130-
obj.pushKV("witness_program", HexStr(id.begin(), id.end()));
131174
CRIPEMD160 hasher;
132175
uint160 hash;
133176
hasher.Write(id.begin(), 32).Finalize(hash.begin());
@@ -137,15 +180,7 @@ class DescribeAddressVisitor : public boost::static_visitor<UniValue>
137180
return obj;
138181
}
139182

140-
UniValue operator()(const WitnessUnknown& id) const
141-
{
142-
UniValue obj(UniValue::VOBJ);
143-
CScript subscript;
144-
obj.pushKV("iswitness", true);
145-
obj.pushKV("witness_version", (int)id.version);
146-
obj.pushKV("witness_program", HexStr(id.program, id.program + id.length));
147-
return obj;
148-
}
183+
UniValue operator()(const WitnessUnknown& id) const { return UniValue(UniValue::VOBJ); }
149184
};
150185
#endif
151186

@@ -219,8 +254,10 @@ UniValue validateaddress(const JSONRPCRequest& request)
219254
isminetype mine = pwallet ? IsMine(*pwallet, dest) : ISMINE_NO;
220255
ret.pushKV("ismine", bool(mine & ISMINE_SPENDABLE));
221256
ret.pushKV("iswatchonly", bool(mine & ISMINE_WATCH_ONLY));
222-
UniValue detail = boost::apply_visitor(DescribeAddressVisitor(pwallet), dest);
257+
UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), dest);
223258
ret.pushKVs(detail);
259+
UniValue wallet_detail = boost::apply_visitor(DescribeWalletAddressVisitor(pwallet), dest);
260+
ret.pushKVs(wallet_detail);
224261
if (pwallet && pwallet->mapAddressBook.count(dest)) {
225262
ret.pushKV("account", pwallet->mapAddressBook[dest].name);
226263
}

0 commit comments

Comments
 (0)