Add importpubkey method to import a watch-only pubkey
This commit is contained in:
parent
907a425aa5
commit
a1d7df3236
4 changed files with 60 additions and 0 deletions
|
@ -88,6 +88,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "importprivkey", 2 },
|
{ "importprivkey", 2 },
|
||||||
{ "importaddress", 2 },
|
{ "importaddress", 2 },
|
||||||
{ "importaddress", 3 },
|
{ "importaddress", 3 },
|
||||||
|
{ "importpubkey", 2 },
|
||||||
{ "verifychain", 0 },
|
{ "verifychain", 0 },
|
||||||
{ "verifychain", 1 },
|
{ "verifychain", 1 },
|
||||||
{ "keypoolrefill", 0 },
|
{ "keypoolrefill", 0 },
|
||||||
|
|
|
@ -359,6 +359,7 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "wallet", "importprivkey", &importprivkey, true },
|
{ "wallet", "importprivkey", &importprivkey, true },
|
||||||
{ "wallet", "importwallet", &importwallet, true },
|
{ "wallet", "importwallet", &importwallet, true },
|
||||||
{ "wallet", "importaddress", &importaddress, true },
|
{ "wallet", "importaddress", &importaddress, true },
|
||||||
|
{ "wallet", "importpubkey", &importpubkey, true },
|
||||||
{ "wallet", "keypoolrefill", &keypoolrefill, true },
|
{ "wallet", "keypoolrefill", &keypoolrefill, true },
|
||||||
{ "wallet", "listaccounts", &listaccounts, false },
|
{ "wallet", "listaccounts", &listaccounts, false },
|
||||||
{ "wallet", "listaddressgroupings", &listaddressgroupings, false },
|
{ "wallet", "listaddressgroupings", &listaddressgroupings, false },
|
||||||
|
|
|
@ -161,6 +161,7 @@ extern UniValue clearbanned(const UniValue& params, bool fHelp);
|
||||||
extern UniValue dumpprivkey(const UniValue& params, bool fHelp); // in rpcdump.cpp
|
extern UniValue dumpprivkey(const UniValue& params, bool fHelp); // in rpcdump.cpp
|
||||||
extern UniValue importprivkey(const UniValue& params, bool fHelp);
|
extern UniValue importprivkey(const UniValue& params, bool fHelp);
|
||||||
extern UniValue importaddress(const UniValue& params, bool fHelp);
|
extern UniValue importaddress(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue importpubkey(const UniValue& params, bool fHelp);
|
||||||
extern UniValue dumpwallet(const UniValue& params, bool fHelp);
|
extern UniValue dumpwallet(const UniValue& params, bool fHelp);
|
||||||
extern UniValue importwallet(const UniValue& params, bool fHelp);
|
extern UniValue importwallet(const UniValue& params, bool fHelp);
|
||||||
|
|
||||||
|
|
|
@ -237,6 +237,63 @@ UniValue importaddress(const UniValue& params, bool fHelp)
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue importpubkey(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
|
return NullUniValue;
|
||||||
|
|
||||||
|
if (fHelp || params.size() < 1 || params.size() > 4)
|
||||||
|
throw runtime_error(
|
||||||
|
"importpubkey \"pubkey\" ( \"label\" rescan )\n"
|
||||||
|
"\nAdds a public key (in hex) that can be watched as if it were in your wallet but cannot be used to spend.\n"
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. \"pubkey\" (string, required) The hex-encoded public key\n"
|
||||||
|
"2. \"label\" (string, optional, default=\"\") An optional label\n"
|
||||||
|
"3. rescan (boolean, optional, default=true) Rescan the wallet for transactions\n"
|
||||||
|
"\nNote: This call can take minutes to complete if rescan is true.\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
"\nImport a public key with rescan\n"
|
||||||
|
+ HelpExampleCli("importpubkey", "\"mypubkey\"") +
|
||||||
|
"\nImport using a label without rescan\n"
|
||||||
|
+ HelpExampleCli("importpubkey", "\"mypubkey\" \"testing\" false") +
|
||||||
|
"\nAs a JSON-RPC call\n"
|
||||||
|
+ HelpExampleRpc("importpubkey", "\"mypubkey\", \"testing\", false")
|
||||||
|
);
|
||||||
|
|
||||||
|
if (fPruneMode)
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "Importing public keys is disabled in pruned mode");
|
||||||
|
|
||||||
|
string strLabel = "";
|
||||||
|
if (params.size() > 1)
|
||||||
|
strLabel = params[1].get_str();
|
||||||
|
|
||||||
|
// Whether to perform rescan after import
|
||||||
|
bool fRescan = true;
|
||||||
|
if (params.size() > 2)
|
||||||
|
fRescan = params[2].get_bool();
|
||||||
|
|
||||||
|
if (!IsHex(params[0].get_str()))
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Pubkey must be a hex string");
|
||||||
|
std::vector<unsigned char> data(ParseHex(params[0].get_str()));
|
||||||
|
CPubKey pubKey(data.begin(), data.end());
|
||||||
|
if (!pubKey.IsFullyValid())
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Pubkey is not a valid public key");
|
||||||
|
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
|
||||||
|
ImportAddress(CBitcoinAddress(pubKey.GetID()), strLabel);
|
||||||
|
ImportScript(GetScriptForRawPubKey(pubKey), strLabel, false);
|
||||||
|
|
||||||
|
if (fRescan)
|
||||||
|
{
|
||||||
|
pwalletMain->ScanForWalletTransactions(chainActive.Genesis(), true);
|
||||||
|
pwalletMain->ReacceptWalletTransactions();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NullUniValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
UniValue importwallet(const UniValue& params, bool fHelp)
|
UniValue importwallet(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (!EnsureWalletIsAvailable(fHelp))
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
|
|
Loading…
Reference in a new issue