diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -357,6 +357,7 @@ rpc/net.cpp rpc/rawtransaction.cpp rpc/server.cpp + rpc/util.cpp script/scriptcache.cpp script/sigcache.cpp script/ismine.cpp diff --git a/src/Makefile.am b/src/Makefile.am --- a/src/Makefile.am +++ b/src/Makefile.am @@ -276,6 +276,7 @@ rpc/net.cpp \ rpc/rawtransaction.cpp \ rpc/server.cpp \ + rpc/util.cpp \ script/scriptcache.cpp \ script/sigcache.cpp \ script/ismine.cpp \ diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -33,27 +33,6 @@ #include #endif -class DescribeAddressVisitor : public boost::static_visitor { -public: - explicit DescribeAddressVisitor() {} - - UniValue operator()(const CNoDestination &dest) const { - return UniValue(UniValue::VOBJ); - } - - UniValue operator()(const CKeyID &keyID) const { - UniValue obj(UniValue::VOBJ); - obj.pushKV("isscript", false); - return obj; - } - - UniValue operator()(const CScriptID &scriptID) const { - UniValue obj(UniValue::VOBJ); - obj.pushKV("isscript", true); - return obj; - } -}; - #ifdef ENABLE_WALLET class DescribeWalletAddressVisitor : public boost::static_visitor { public: @@ -73,8 +52,7 @@ if (ExtractDestination(subscript, embedded)) { // Only when the script corresponds to an address. UniValue subobj(UniValue::VOBJ); - UniValue detail = - boost::apply_visitor(DescribeAddressVisitor(), embedded); + UniValue detail = DescribeAddress(embedded); subobj.pushKVs(detail); UniValue wallet_detail = boost::apply_visitor(*this, embedded); subobj.pushKVs(wallet_detail); @@ -142,6 +120,15 @@ return obj; } }; + +UniValue DescribeWalletAddress(CWallet *pwallet, const CTxDestination &dest) { + UniValue ret(UniValue::VOBJ); + UniValue detail = DescribeAddress(dest); + ret.pushKVs(detail); + ret.pushKVs( + boost::apply_visitor(DescribeWalletAddressVisitor(pwallet), dest)); + return ret; +} #endif static UniValue validateaddress(const Config &config, @@ -237,11 +224,8 @@ isminetype mine = pwallet ? IsMine(*pwallet, dest) : ISMINE_NO; ret.pushKV("ismine", bool(mine & ISMINE_SPENDABLE)); ret.pushKV("iswatchonly", bool(mine & ISMINE_WATCH_ONLY)); - UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), dest); + UniValue detail = DescribeWalletAddress(pwallet, dest); ret.pushKVs(detail); - UniValue wallet_detail = - boost::apply_visitor(DescribeWalletAddressVisitor(pwallet), dest); - ret.pushKVs(wallet_detail); if (pwallet && pwallet->mapAddressBook.count(dest)) { ret.pushKV("account", pwallet->mapAddressBook[dest].name); } @@ -269,6 +253,8 @@ } } } +#else + ret.pushKvs = DescribeAddress(dest); #endif } return ret; diff --git a/src/rpc/util.h b/src/rpc/util.h --- a/src/rpc/util.h +++ b/src/rpc/util.h @@ -12,6 +12,7 @@ class CKeyStore; class CPubKey; class CScript; +class UniValue; CPubKey HexToPubKey(const std::string &hex_in); CPubKey AddrToPubKey(const CChainParams &chainparams, CKeyStore *const keystore, @@ -19,4 +20,6 @@ CScript CreateMultisigRedeemscript(const int required, const std::vector &pubkeys); +UniValue DescribeAddress(const CTxDestination &dest); + #endif // BITCOIN_RPC_UTIL_H diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -11,6 +11,10 @@ #include #include +#include + +#include + // Converts a hex string to a public key if possible CPubKey HexToPubKey(const std::string &hex_in) { if (!IsHex(hex_in)) { @@ -84,3 +88,28 @@ return result; } + +class DescribeAddressVisitor : public boost::static_visitor { +public: + explicit DescribeAddressVisitor() {} + + UniValue operator()(const CNoDestination &dest) const { + return UniValue(UniValue::VOBJ); + } + + UniValue operator()(const CKeyID &keyID) const { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", false); + return obj; + } + + UniValue operator()(const CScriptID &scriptID) const { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", true); + return obj; + } +}; + +UniValue DescribeAddress(const CTxDestination &dest) { + return boost::apply_visitor(DescribeAddressVisitor(), dest); +}