diff options
author | MarcoFalke <falke.marco@gmail.com> | 2019-04-16 07:55:06 -0400 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2019-04-16 07:55:31 -0400 |
commit | e57462c6ba6023e0ed5417067364dcea2f88b36d (patch) | |
tree | 974d850ceca0b5096c2b03898c88c727e620224e /src/wallet | |
parent | fa3993bfe856133ffd54bff1b7d77838321d372d (diff) | |
parent | 235550d01992555a316c9c4639f5bec6255a244f (diff) | |
download | bitcoin-e57462c6ba6023e0ed5417067364dcea2f88b36d.tar.xz |
Merge #15803: [0.18] Backport 15749: importmulti only imports origin info for PKH outputs
235550d019 Take non-importing keys into account for spendability warning in descriptor import (Pieter Wuille)
802dcd37d1 Import all origin info in importmulti; even for non-importing pubkeys (Pieter Wuille)
7fcbe7dc11 Keep full pubkeys in FlatSigningProvider::origins (Pieter Wuille)
Pull request description:
Clean backport of #15749 by sipa to 0.18
ACKs for commit 235550:
fanquake:
utACK 235550d
MarcoFalke:
ACK 235550d019 (Checked that they are clean cherry-picks)
Tree-SHA512: 1ccc19f51137ac4ef971c0bcca4c87ab2383610aa51c5d02680c485b9ce6abd698dddd7f4a45946d56b1aa741cc3fd94b4180ff15901824d20eeba89b4f12853
Diffstat (limited to 'src/wallet')
-rw-r--r-- | src/wallet/rpcdump.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index bdf901dee4..ed9742e6c2 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -896,7 +896,7 @@ struct ImportData // Output data std::set<CScript> import_scripts; std::map<CKeyID, bool> used_keys; //!< Import these private keys if available (the value indicates whether if the key is required for solvability) - std::map<CKeyID, KeyOriginInfo> key_origins; + std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> key_origins; }; enum class ScriptContext @@ -1193,6 +1193,9 @@ static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID bool spendable = std::all_of(pubkey_map.begin(), pubkey_map.end(), [&](const std::pair<CKeyID, CPubKey>& used_key) { return privkey_map.count(used_key.first) > 0; + }) && std::all_of(import_data.key_origins.begin(), import_data.key_origins.end(), + [&](const std::pair<CKeyID, std::pair<CPubKey, KeyOriginInfo>>& entry) { + return privkey_map.count(entry.first) > 0; }); if (!watch_only && !spendable) { warnings.push_back("Some private keys are missing, outputs will be considered watchonly. If this is intentional, specify the watchonly flag."); @@ -1270,7 +1273,10 @@ static UniValue ProcessImport(CWallet * const pwallet, const UniValue& data, con throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet"); } pwallet->UpdateTimeFirstKey(timestamp); - } + } + for (const auto& entry : import_data.key_origins) { + pwallet->AddKeyOrigin(entry.second.first, entry.second.second); + } for (const CKeyID& id : ordered_pubkeys) { auto entry = pubkey_map.find(id); if (entry == pubkey_map.end()) { @@ -1281,10 +1287,6 @@ static UniValue ProcessImport(CWallet * const pwallet, const UniValue& data, con if (!pwallet->GetPubKey(id, temp) && !pwallet->AddWatchOnly(GetScriptForRawPubKey(pubkey), timestamp)) { throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet"); } - const auto& key_orig_it = import_data.key_origins.find(id); - if (key_orig_it != import_data.key_origins.end()) { - pwallet->AddKeyOrigin(pubkey, key_orig_it->second); - } pwallet->mapKeyMetadata[id].nCreateTime = timestamp; // Add to keypool only works with pubkeys |