mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-10 10:52:31 -05:00
Have importaddress use ImportScripts and ImportScriptPubKeys
Also removes the now unused ImportAddress and ImportScript from rpcdump.cpp Behavior changes: * No errors will be thrown when the script or key already exists in the wallet. * If the key or script is already in the wallet, their labels will be updated.
This commit is contained in:
parent
a00d1e5ec5
commit
94bf156f39
1 changed files with 14 additions and 38 deletions
|
@ -235,42 +235,6 @@ UniValue abortrescan(const JSONRPCRequest& request)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImportAddress(CWallet*, const CTxDestination& dest, const std::string& strLabel);
|
|
||||||
static void ImportScript(CWallet* const pwallet, const CScript& script, const std::string& strLabel, bool isRedeemScript) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
|
||||||
{
|
|
||||||
if (!isRedeemScript && ::IsMine(*pwallet, script) == ISMINE_SPENDABLE) {
|
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "The wallet already contains the private key for this address or script");
|
|
||||||
}
|
|
||||||
|
|
||||||
pwallet->MarkDirty();
|
|
||||||
|
|
||||||
if (!pwallet->HaveWatchOnly(script) && !pwallet->AddWatchOnly(script, 0 /* nCreateTime */)) {
|
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isRedeemScript) {
|
|
||||||
const CScriptID id(script);
|
|
||||||
if (!pwallet->HaveCScript(id) && !pwallet->AddCScript(script)) {
|
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding p2sh redeemScript to wallet");
|
|
||||||
}
|
|
||||||
ImportAddress(pwallet, ScriptHash(id), strLabel);
|
|
||||||
} else {
|
|
||||||
CTxDestination destination;
|
|
||||||
if (ExtractDestination(script, destination)) {
|
|
||||||
pwallet->SetAddressBook(destination, strLabel, "receive");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ImportAddress(CWallet* const pwallet, const CTxDestination& dest, const std::string& strLabel) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
|
||||||
{
|
|
||||||
CScript script = GetScriptForDestination(dest);
|
|
||||||
ImportScript(pwallet, script, strLabel, false);
|
|
||||||
// add to address book or update label
|
|
||||||
if (IsValidDestination(dest))
|
|
||||||
pwallet->SetAddressBook(dest, strLabel, "receive");
|
|
||||||
}
|
|
||||||
|
|
||||||
UniValue importaddress(const JSONRPCRequest& request)
|
UniValue importaddress(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
||||||
|
@ -343,10 +307,22 @@ UniValue importaddress(const JSONRPCRequest& request)
|
||||||
if (fP2SH) {
|
if (fP2SH) {
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot use the p2sh flag with an address - use a script instead");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Cannot use the p2sh flag with an address - use a script instead");
|
||||||
}
|
}
|
||||||
ImportAddress(pwallet, dest, strLabel);
|
|
||||||
|
pwallet->MarkDirty();
|
||||||
|
|
||||||
|
pwallet->ImportScriptPubKeys(strLabel, {GetScriptForDestination(dest)}, false /* have_solving_data */, true /* apply_label */, 1 /* timestamp */);
|
||||||
} else if (IsHex(request.params[0].get_str())) {
|
} else if (IsHex(request.params[0].get_str())) {
|
||||||
std::vector<unsigned char> data(ParseHex(request.params[0].get_str()));
|
std::vector<unsigned char> data(ParseHex(request.params[0].get_str()));
|
||||||
ImportScript(pwallet, CScript(data.begin(), data.end()), strLabel, fP2SH);
|
CScript redeem_script(data.begin(), data.end());
|
||||||
|
|
||||||
|
std::set<CScript> scripts = {redeem_script};
|
||||||
|
pwallet->ImportScripts(scripts);
|
||||||
|
|
||||||
|
if (fP2SH) {
|
||||||
|
scripts.insert(GetScriptForDestination(ScriptHash(CScriptID(redeem_script))));
|
||||||
|
}
|
||||||
|
|
||||||
|
pwallet->ImportScriptPubKeys(strLabel, scripts, false /* have_solving_data */, true /* apply_label */, 1 /* timestamp */);
|
||||||
} else {
|
} else {
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address or script");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address or script");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue