Move validateaddress
from rpcwallet to rpcmisc
Enables it in --disable-wallet compiles. Delimit wallet-using part using #ifdef ENABLE_WALLET.
This commit is contained in:
parent
cd7fa8bb43
commit
452955f5be
3 changed files with 86 additions and 82 deletions
|
@ -86,4 +86,89 @@ Value getinfo(const Array& params, bool fHelp)
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_WALLET
|
||||||
|
class DescribeAddressVisitor : public boost::static_visitor<Object>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Object operator()(const CNoDestination &dest) const { return Object(); }
|
||||||
|
|
||||||
|
Object operator()(const CKeyID &keyID) const {
|
||||||
|
Object obj;
|
||||||
|
CPubKey vchPubKey;
|
||||||
|
pwalletMain->GetPubKey(keyID, vchPubKey);
|
||||||
|
obj.push_back(Pair("isscript", false));
|
||||||
|
obj.push_back(Pair("pubkey", HexStr(vchPubKey)));
|
||||||
|
obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed()));
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object operator()(const CScriptID &scriptID) const {
|
||||||
|
Object obj;
|
||||||
|
obj.push_back(Pair("isscript", true));
|
||||||
|
CScript subscript;
|
||||||
|
pwalletMain->GetCScript(scriptID, subscript);
|
||||||
|
std::vector<CTxDestination> addresses;
|
||||||
|
txnouttype whichType;
|
||||||
|
int nRequired;
|
||||||
|
ExtractDestinations(subscript, whichType, addresses, nRequired);
|
||||||
|
obj.push_back(Pair("script", GetTxnOutputType(whichType)));
|
||||||
|
obj.push_back(Pair("hex", HexStr(subscript.begin(), subscript.end())));
|
||||||
|
Array a;
|
||||||
|
BOOST_FOREACH(const CTxDestination& addr, addresses)
|
||||||
|
a.push_back(CBitcoinAddress(addr).ToString());
|
||||||
|
obj.push_back(Pair("addresses", a));
|
||||||
|
if (whichType == TX_MULTISIG)
|
||||||
|
obj.push_back(Pair("sigsrequired", nRequired));
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Value validateaddress(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw runtime_error(
|
||||||
|
"validateaddress \"bitcoinaddress\"\n"
|
||||||
|
"\nReturn information about the given bitcoin address.\n"
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. \"bitcoinaddress\" (string, required) The bitcoin address to validate\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n"
|
||||||
|
" \"address\" : \"bitcoinaddress\", (string) The bitcoin address validated\n"
|
||||||
|
" \"ismine\" : true|false, (boolean) If the address is yours or not\n"
|
||||||
|
" \"isscript\" : true|false, (boolean) If the key is a script\n"
|
||||||
|
" \"pubkey\" : \"publickeyhex\", (string) The hex value of the raw public key\n"
|
||||||
|
" \"iscompressed\" : true|false, (boolean) If the address is compressed\n"
|
||||||
|
" \"account\" : \"account\" (string) The account associated with the address, \"\" is the default account\n"
|
||||||
|
"}\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")
|
||||||
|
+ HelpExampleRpc("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")
|
||||||
|
);
|
||||||
|
|
||||||
|
CBitcoinAddress address(params[0].get_str());
|
||||||
|
bool isValid = address.IsValid();
|
||||||
|
|
||||||
|
Object ret;
|
||||||
|
ret.push_back(Pair("isvalid", isValid));
|
||||||
|
if (isValid)
|
||||||
|
{
|
||||||
|
CTxDestination dest = address.Get();
|
||||||
|
string currentAddress = address.ToString();
|
||||||
|
ret.push_back(Pair("address", currentAddress));
|
||||||
|
#ifdef ENABLE_WALLET
|
||||||
|
bool fMine = pwalletMain ? IsMine(*pwalletMain, dest) : false;
|
||||||
|
ret.push_back(Pair("ismine", fMine));
|
||||||
|
if (fMine) {
|
||||||
|
Object detail = boost::apply_visitor(DescribeAddressVisitor(), dest);
|
||||||
|
ret.insert(ret.end(), detail.begin(), detail.end());
|
||||||
|
}
|
||||||
|
if (pwalletMain && pwalletMain->mapAddressBook.count(dest))
|
||||||
|
ret.push_back(Pair("account", pwalletMain->mapAddressBook[dest].name));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -252,6 +252,7 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "getmininginfo", &getmininginfo, true, false, false },
|
{ "getmininginfo", &getmininginfo, true, false, false },
|
||||||
{ "getblocktemplate", &getblocktemplate, true, false, false },
|
{ "getblocktemplate", &getblocktemplate, true, false, false },
|
||||||
{ "submitblock", &submitblock, false, false, false },
|
{ "submitblock", &submitblock, false, false, false },
|
||||||
|
{ "validateaddress", &validateaddress, true, false, false },
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
/* Wallet */
|
/* Wallet */
|
||||||
|
@ -272,7 +273,6 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "walletpassphrasechange", &walletpassphrasechange, false, false, true },
|
{ "walletpassphrasechange", &walletpassphrasechange, false, false, true },
|
||||||
{ "walletlock", &walletlock, true, false, true },
|
{ "walletlock", &walletlock, true, false, true },
|
||||||
{ "encryptwallet", &encryptwallet, false, false, true },
|
{ "encryptwallet", &encryptwallet, false, false, true },
|
||||||
{ "validateaddress", &validateaddress, true, false, false },
|
|
||||||
{ "getbalance", &getbalance, false, false, true },
|
{ "getbalance", &getbalance, false, false, true },
|
||||||
{ "move", &movecmd, false, false, true },
|
{ "move", &movecmd, false, false, true },
|
||||||
{ "sendfrom", &sendfrom, false, false, true },
|
{ "sendfrom", &sendfrom, false, false, true },
|
||||||
|
|
|
@ -1862,87 +1862,6 @@ Value encryptwallet(const Array& params, bool fHelp)
|
||||||
return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed, you need to make a new backup.";
|
return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed, you need to make a new backup.";
|
||||||
}
|
}
|
||||||
|
|
||||||
class DescribeAddressVisitor : public boost::static_visitor<Object>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Object operator()(const CNoDestination &dest) const { return Object(); }
|
|
||||||
|
|
||||||
Object operator()(const CKeyID &keyID) const {
|
|
||||||
Object obj;
|
|
||||||
CPubKey vchPubKey;
|
|
||||||
pwalletMain->GetPubKey(keyID, vchPubKey);
|
|
||||||
obj.push_back(Pair("isscript", false));
|
|
||||||
obj.push_back(Pair("pubkey", HexStr(vchPubKey)));
|
|
||||||
obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed()));
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
Object operator()(const CScriptID &scriptID) const {
|
|
||||||
Object obj;
|
|
||||||
obj.push_back(Pair("isscript", true));
|
|
||||||
CScript subscript;
|
|
||||||
pwalletMain->GetCScript(scriptID, subscript);
|
|
||||||
std::vector<CTxDestination> addresses;
|
|
||||||
txnouttype whichType;
|
|
||||||
int nRequired;
|
|
||||||
ExtractDestinations(subscript, whichType, addresses, nRequired);
|
|
||||||
obj.push_back(Pair("script", GetTxnOutputType(whichType)));
|
|
||||||
obj.push_back(Pair("hex", HexStr(subscript.begin(), subscript.end())));
|
|
||||||
Array a;
|
|
||||||
BOOST_FOREACH(const CTxDestination& addr, addresses)
|
|
||||||
a.push_back(CBitcoinAddress(addr).ToString());
|
|
||||||
obj.push_back(Pair("addresses", a));
|
|
||||||
if (whichType == TX_MULTISIG)
|
|
||||||
obj.push_back(Pair("sigsrequired", nRequired));
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Value validateaddress(const Array& params, bool fHelp)
|
|
||||||
{
|
|
||||||
if (fHelp || params.size() != 1)
|
|
||||||
throw runtime_error(
|
|
||||||
"validateaddress \"bitcoinaddress\"\n"
|
|
||||||
"\nReturn information about the given bitcoin address.\n"
|
|
||||||
"\nArguments:\n"
|
|
||||||
"1. \"bitcoinaddress\" (string, required) The bitcoin address to validate\n"
|
|
||||||
"\nResult:\n"
|
|
||||||
"{\n"
|
|
||||||
" \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n"
|
|
||||||
" \"address\" : \"bitcoinaddress\", (string) The bitcoin address validated\n"
|
|
||||||
" \"ismine\" : true|false, (boolean) If the address is yours or not\n"
|
|
||||||
" \"isscript\" : true|false, (boolean) If the key is a script\n"
|
|
||||||
" \"pubkey\" : \"publickeyhex\", (string) The hex value of the raw public key\n"
|
|
||||||
" \"iscompressed\" : true|false, (boolean) If the address is compressed\n"
|
|
||||||
" \"account\" : \"account\" (string) The account associated with the address, \"\" is the default account\n"
|
|
||||||
"}\n"
|
|
||||||
"\nExamples:\n"
|
|
||||||
+ HelpExampleCli("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")
|
|
||||||
+ HelpExampleRpc("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")
|
|
||||||
);
|
|
||||||
|
|
||||||
CBitcoinAddress address(params[0].get_str());
|
|
||||||
bool isValid = address.IsValid();
|
|
||||||
|
|
||||||
Object ret;
|
|
||||||
ret.push_back(Pair("isvalid", isValid));
|
|
||||||
if (isValid)
|
|
||||||
{
|
|
||||||
CTxDestination dest = address.Get();
|
|
||||||
string currentAddress = address.ToString();
|
|
||||||
ret.push_back(Pair("address", currentAddress));
|
|
||||||
bool fMine = pwalletMain ? IsMine(*pwalletMain, dest) : false;
|
|
||||||
ret.push_back(Pair("ismine", fMine));
|
|
||||||
if (fMine) {
|
|
||||||
Object detail = boost::apply_visitor(DescribeAddressVisitor(), dest);
|
|
||||||
ret.insert(ret.end(), detail.begin(), detail.end());
|
|
||||||
}
|
|
||||||
if (pwalletMain && pwalletMain->mapAddressBook.count(dest))
|
|
||||||
ret.push_back(Pair("account", pwalletMain->mapAddressBook[dest].name));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value lockunspent(const Array& params, bool fHelp)
|
Value lockunspent(const Array& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||||
|
|
Loading…
Reference in a new issue