Add EnsureLegacyScriptPubKeyMan and use in rpcwallet.cpp

This also fixes unused variable warnings in rpcdump.cpp
This commit is contained in:
Russell Yanofsky 2019-11-05 10:13:43 -05:00
parent e204dc11b5
commit b07b07cd87
3 changed files with 27 additions and 31 deletions

View File

@ -87,15 +87,6 @@ static void RescanWallet(CWallet& wallet, const WalletRescanReserver& reserver,
} }
} }
static LegacyScriptPubKeyMan& GetLegacyScriptPubKeyMan(CWallet& wallet)
{
LegacyScriptPubKeyMan* spk_man = wallet.GetLegacyScriptPubKeyMan();
if (!spk_man) {
throw JSONRPCError(RPC_WALLET_ERROR, "This type of wallet does not support this command");
}
return *spk_man;
}
UniValue importprivkey(const JSONRPCRequest& request) UniValue importprivkey(const JSONRPCRequest& request)
{ {
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request); std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
@ -134,7 +125,7 @@ UniValue importprivkey(const JSONRPCRequest& request)
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled"); throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
} }
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*wallet); EnsureLegacyScriptPubKeyMan(*wallet);
WalletRescanReserver reserver(pwallet); WalletRescanReserver reserver(pwallet);
bool fRescan = true; bool fRescan = true;
@ -262,7 +253,7 @@ UniValue importaddress(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*pwallet); EnsureLegacyScriptPubKeyMan(*pwallet);
std::string strLabel; std::string strLabel;
if (!request.params[1].isNull()) if (!request.params[1].isNull())
@ -465,7 +456,7 @@ UniValue importpubkey(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*wallet); EnsureLegacyScriptPubKeyMan(*wallet);
std::string strLabel; std::string strLabel;
if (!request.params[1].isNull()) if (!request.params[1].isNull())
@ -549,7 +540,7 @@ UniValue importwallet(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*wallet); EnsureLegacyScriptPubKeyMan(*wallet);
if (pwallet->chain().havePruned()) { if (pwallet->chain().havePruned()) {
// Exit early and print an error. // Exit early and print an error.
@ -708,7 +699,7 @@ UniValue dumpprivkey(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*wallet); LegacyScriptPubKeyMan& spk_man = EnsureLegacyScriptPubKeyMan(*wallet);
auto locked_chain = pwallet->chain().lock(); auto locked_chain = pwallet->chain().lock();
LOCK(pwallet->cs_wallet); LOCK(pwallet->cs_wallet);
@ -759,7 +750,7 @@ UniValue dumpwallet(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*wallet); LegacyScriptPubKeyMan& spk_man = EnsureLegacyScriptPubKeyMan(*wallet);
auto locked_chain = pwallet->chain().lock(); auto locked_chain = pwallet->chain().lock();
LOCK(pwallet->cs_wallet); LOCK(pwallet->cs_wallet);
@ -1346,7 +1337,7 @@ UniValue importmulti(const JSONRPCRequest& mainRequest)
RPCTypeCheck(mainRequest.params, {UniValue::VARR, UniValue::VOBJ}); RPCTypeCheck(mainRequest.params, {UniValue::VARR, UniValue::VOBJ});
LegacyScriptPubKeyMan& spk_man = GetLegacyScriptPubKeyMan(*wallet); EnsureLegacyScriptPubKeyMan(*wallet);
const UniValue& requests = mainRequest.params[0]; const UniValue& requests = mainRequest.params[0];

View File

@ -124,6 +124,15 @@ void EnsureWalletIsUnlocked(const CWallet* pwallet)
} }
} }
LegacyScriptPubKeyMan& EnsureLegacyScriptPubKeyMan(CWallet& wallet)
{
LegacyScriptPubKeyMan* spk_man = wallet.GetLegacyScriptPubKeyMan();
if (!spk_man) {
throw JSONRPCError(RPC_WALLET_ERROR, "This type of wallet does not support this command");
}
return *spk_man;
}
static void WalletTxToJSON(interfaces::Chain& chain, interfaces::Chain::Lock& locked_chain, const CWalletTx& wtx, UniValue& entry) static void WalletTxToJSON(interfaces::Chain& chain, interfaces::Chain::Lock& locked_chain, const CWalletTx& wtx, UniValue& entry)
{ {
int confirms = wtx.GetDepthInMainChain(locked_chain); int confirms = wtx.GetDepthInMainChain(locked_chain);
@ -966,10 +975,7 @@ static UniValue addmultisigaddress(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan* spk_man = pwallet->GetLegacyScriptPubKeyMan(); LegacyScriptPubKeyMan& spk_man = EnsureLegacyScriptPubKeyMan(*pwallet);
if (!spk_man) {
throw JSONRPCError(RPC_WALLET_ERROR, "This type of wallet does not support this command");
}
auto locked_chain = pwallet->chain().lock(); auto locked_chain = pwallet->chain().lock();
LOCK(pwallet->cs_wallet); LOCK(pwallet->cs_wallet);
@ -987,7 +993,7 @@ static UniValue addmultisigaddress(const JSONRPCRequest& request)
if (IsHex(keys_or_addrs[i].get_str()) && (keys_or_addrs[i].get_str().length() == 66 || keys_or_addrs[i].get_str().length() == 130)) { if (IsHex(keys_or_addrs[i].get_str()) && (keys_or_addrs[i].get_str().length() == 66 || keys_or_addrs[i].get_str().length() == 130)) {
pubkeys.push_back(HexToPubKey(keys_or_addrs[i].get_str())); pubkeys.push_back(HexToPubKey(keys_or_addrs[i].get_str()));
} else { } else {
pubkeys.push_back(AddrToPubKey(spk_man, keys_or_addrs[i].get_str())); pubkeys.push_back(AddrToPubKey(&spk_man, keys_or_addrs[i].get_str()));
} }
} }
@ -1000,7 +1006,7 @@ static UniValue addmultisigaddress(const JSONRPCRequest& request)
// Construct using pay-to-script-hash: // Construct using pay-to-script-hash:
CScript inner; CScript inner;
CTxDestination dest = AddAndGetMultisigDestination(required, pubkeys, output_type, *spk_man, inner); CTxDestination dest = AddAndGetMultisigDestination(required, pubkeys, output_type, spk_man, inner);
pwallet->SetAddressBook(dest, label, "send"); pwallet->SetAddressBook(dest, label, "send");
UniValue result(UniValue::VOBJ); UniValue result(UniValue::VOBJ);
@ -3933,10 +3939,7 @@ UniValue sethdseed(const JSONRPCRequest& request)
}, },
}.Check(request); }.Check(request);
LegacyScriptPubKeyMan* spk_man = pwallet->GetLegacyScriptPubKeyMan(); LegacyScriptPubKeyMan& spk_man = EnsureLegacyScriptPubKeyMan(*pwallet);
if (!spk_man) {
throw JSONRPCError(RPC_WALLET_ERROR, "This type of wallet does not support this command");
}
if (pwallet->chain().isInitialBlockDownload()) { if (pwallet->chain().isInitialBlockDownload()) {
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Cannot set a new HD seed while still in Initial Block Download"); throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Cannot set a new HD seed while still in Initial Block Download");
@ -3963,22 +3966,22 @@ UniValue sethdseed(const JSONRPCRequest& request)
CPubKey master_pub_key; CPubKey master_pub_key;
if (request.params[1].isNull()) { if (request.params[1].isNull()) {
master_pub_key = spk_man->GenerateNewSeed(); master_pub_key = spk_man.GenerateNewSeed();
} else { } else {
CKey key = DecodeSecret(request.params[1].get_str()); CKey key = DecodeSecret(request.params[1].get_str());
if (!key.IsValid()) { if (!key.IsValid()) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key"); throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
} }
if (HaveKey(*spk_man, key)) { if (HaveKey(spk_man, key)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Already have this key (either as an HD seed or as a loose private key)"); throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Already have this key (either as an HD seed or as a loose private key)");
} }
master_pub_key = spk_man->DeriveNewSeed(key); master_pub_key = spk_man.DeriveNewSeed(key);
} }
spk_man->SetHDSeed(master_pub_key); spk_man.SetHDSeed(master_pub_key);
if (flush_key_pool) spk_man->NewKeyPool(); if (flush_key_pool) spk_man.NewKeyPool();
return NullUniValue; return NullUniValue;
} }

View File

@ -12,6 +12,7 @@
class CRPCTable; class CRPCTable;
class CWallet; class CWallet;
class JSONRPCRequest; class JSONRPCRequest;
class LegacyScriptPubKeyMan;
class UniValue; class UniValue;
struct PartiallySignedTransaction; struct PartiallySignedTransaction;
class CTransaction; class CTransaction;
@ -40,6 +41,7 @@ std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& reques
std::string HelpRequiringPassphrase(const CWallet*); std::string HelpRequiringPassphrase(const CWallet*);
void EnsureWalletIsUnlocked(const CWallet*); void EnsureWalletIsUnlocked(const CWallet*);
bool EnsureWalletIsAvailable(const CWallet*, bool avoidException); bool EnsureWalletIsAvailable(const CWallet*, bool avoidException);
LegacyScriptPubKeyMan& EnsureLegacyScriptPubKeyMan(CWallet& wallet);
UniValue getaddressinfo(const JSONRPCRequest& request); UniValue getaddressinfo(const JSONRPCRequest& request);
UniValue signrawtransactionwithwallet(const JSONRPCRequest& request); UniValue signrawtransactionwithwallet(const JSONRPCRequest& request);