diff options
author | Luke Dashjr <luke-jr+git@utopios.org> | 2020-02-22 04:16:36 +0000 |
---|---|---|
committer | Luke Dashjr <luke-jr+git@utopios.org> | 2020-04-02 16:25:17 +0000 |
commit | c751d886f499257627b308b11ffaa51c22db6cc0 (patch) | |
tree | da16f6fe7552691501c4ae52e191c2e8f0931a4f /src | |
parent | 8e64b8c84bcbd63caea06f3af087af1f0609eaf5 (diff) |
Wallet: Avoid treating change-in-the-addressbook as non-change everywhere
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/wallet.cpp | 3 | ||||
-rw-r--r-- | src/qt/addresstablemodel.cpp | 2 | ||||
-rw-r--r-- | src/wallet/rpcdump.cpp | 5 | ||||
-rw-r--r-- | src/wallet/rpcwallet.cpp | 30 | ||||
-rw-r--r-- | src/wallet/wallet.cpp | 6 |
5 files changed, 28 insertions, 18 deletions
diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 673d5d498f..d55b92a5ff 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -152,7 +152,7 @@ public: { LOCK(m_wallet->cs_wallet); auto it = m_wallet->m_address_book.find(dest); - if (it == m_wallet->m_address_book.end()) { + if (it == m_wallet->m_address_book.end() || it->second.IsChange()) { return false; } if (name) { @@ -171,6 +171,7 @@ public: LOCK(m_wallet->cs_wallet); std::vector<WalletAddress> result; for (const auto& item : m_wallet->m_address_book) { + if (item.second.IsChange()) continue; result.emplace_back(item.first, m_wallet->IsMine(item.first), item.second.name, item.second.purpose); } return result; diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp index 7794a91beb..3869318fea 100644 --- a/src/qt/addresstablemodel.cpp +++ b/src/qt/addresstablemodel.cpp @@ -55,7 +55,7 @@ struct AddressTableEntryLessThan static AddressTableEntry::Type translateTransactionType(const QString &strPurpose, bool isMine) { AddressTableEntry::Type addressType = AddressTableEntry::Hidden; - // "refund" addresses aren't shown, and change addresses aren't in m_address_book at all. + // "refund" addresses aren't shown, and change addresses aren't returned by getAddresses at all. if (strPurpose == "send") addressType = AddressTableEntry::Sending; else if (strPurpose == "receive") diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index 1348f6091b..40ea51e464 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -60,7 +60,8 @@ static bool GetWalletAddressesForKey(LegacyScriptPubKeyMan* spk_man, const CWall CKey key; spk_man->GetKey(keyid, key); for (const auto& dest : GetAllDestinationsForKey(key.GetPubKey())) { - if (pwallet->m_address_book.count(dest)) { + const auto* address_book_entry = pwallet->FindAddressBookEntry(dest); + if (address_book_entry) { if (!strAddr.empty()) { strAddr += ","; } @@ -168,7 +169,7 @@ UniValue importprivkey(const JSONRPCRequest& request) // label all new addresses, and label existing addresses if a // label was passed. for (const auto& dest : GetAllDestinationsForKey(pubkey)) { - if (!request.params[1].isNull() || pwallet->m_address_book.count(dest) == 0) { + if (!request.params[1].isNull() || !pwallet->FindAddressBookEntry(dest)) { pwallet->SetAddressBook(dest, strLabel, "receive"); } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7a67163a85..464371a15f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -505,7 +505,8 @@ static UniValue listaddressgroupings(const JSONRPCRequest& request) addressInfo.push_back(EncodeDestination(address)); addressInfo.push_back(ValueFromAmount(balances[address])); { - if (pwallet->m_address_book.find(address) != pwallet->m_address_book.end()) { + const auto* address_book_entry = pwallet->FindAddressBookEntry(address); + if (address_book_entry) { addressInfo.push_back(pwallet->m_address_book.find(address)->second.name); } } @@ -1112,6 +1113,7 @@ static UniValue ListReceived(interfaces::Chain::Lock& locked_chain, const CWalle for (auto item_it = start; item_it != end; ++item_it) { + if (item_it->second.IsChange()) continue; const CTxDestination& address = item_it->first; const std::string& label = item_it->second.name; auto it = mapTally.find(address); @@ -1313,7 +1315,8 @@ static void ListTransactions(interfaces::Chain::Lock& locked_chain, const CWalle MaybePushAddress(entry, s.destination); entry.pushKV("category", "send"); entry.pushKV("amount", ValueFromAmount(-s.amount)); - if (pwallet->m_address_book.count(s.destination)) { + const auto* address_book_entry = pwallet->FindAddressBookEntry(s.destination); + if (address_book_entry) { entry.pushKV("label", pwallet->m_address_book.at(s.destination).name); } entry.pushKV("vout", s.vout); @@ -1330,7 +1333,8 @@ static void ListTransactions(interfaces::Chain::Lock& locked_chain, const CWalle for (const COutputEntry& r : listReceived) { std::string label; - if (pwallet->m_address_book.count(r.destination)) { + const auto* address_book_entry = pwallet->FindAddressBookEntry(r.destination); + if (address_book_entry) { label = pwallet->m_address_book.at(r.destination).name; } if (filter_label && label != *filter_label) { @@ -1355,7 +1359,7 @@ static void ListTransactions(interfaces::Chain::Lock& locked_chain, const CWalle entry.pushKV("category", "receive"); } entry.pushKV("amount", ValueFromAmount(r.amount)); - if (pwallet->m_address_book.count(r.destination)) { + if (address_book_entry) { entry.pushKV("label", label); } entry.pushKV("vout", r.vout); @@ -2955,9 +2959,9 @@ static UniValue listunspent(const JSONRPCRequest& request) if (fValidAddress) { entry.pushKV("address", EncodeDestination(address)); - auto i = pwallet->m_address_book.find(address); - if (i != pwallet->m_address_book.end()) { - entry.pushKV("label", i->second.name); + const auto* address_book_entry = pwallet->FindAddressBookEntry(address); + if (address_book_entry) { + entry.pushKV("label", address_book_entry->name); } std::unique_ptr<SigningProvider> provider = pwallet->GetSolvingProvider(scriptPubKey); @@ -3814,7 +3818,8 @@ UniValue getaddressinfo(const JSONRPCRequest& request) // DEPRECATED: Return label field if existing. Currently only one label can // be associated with an address, so the label should be equivalent to the // value of the name key/value pair in the labels array below. - if ((pwallet->chain().rpcEnableDeprecated("label")) && (pwallet->m_address_book.count(dest))) { + const auto* address_book_entry = pwallet->FindAddressBookEntry(dest); + if (pwallet->chain().rpcEnableDeprecated("label") && address_book_entry) { ret.pushKV("label", pwallet->m_address_book.at(dest).name); } @@ -3838,14 +3843,13 @@ UniValue getaddressinfo(const JSONRPCRequest& request) // stable if we allow multiple labels to be associated with an address in // the future. UniValue labels(UniValue::VARR); - std::map<CTxDestination, CAddressBookData>::const_iterator mi = pwallet->m_address_book.find(dest); - if (mi != pwallet->m_address_book.end()) { + if (address_book_entry) { // DEPRECATED: The previous behavior of returning an array containing a // JSON object of `name` and `purpose` key/value pairs is deprecated. if (pwallet->chain().rpcEnableDeprecated("labelspurpose")) { - labels.push_back(AddressBookDataToJSON(mi->second, true)); + labels.push_back(AddressBookDataToJSON(*address_book_entry, true)); } else { - labels.push_back(mi->second.name); + labels.push_back(address_book_entry->name); } } ret.pushKV("labels", std::move(labels)); @@ -3890,6 +3894,7 @@ static UniValue getaddressesbylabel(const JSONRPCRequest& request) UniValue ret(UniValue::VOBJ); std::set<std::string> addresses; for (const std::pair<const CTxDestination, CAddressBookData>& item : pwallet->m_address_book) { + if (item.second.IsChange()) continue; if (item.second.name == label) { std::string address = EncodeDestination(item.first); // CWallet::m_address_book is not expected to contain duplicate @@ -3954,6 +3959,7 @@ static UniValue listlabels(const JSONRPCRequest& request) // Add to a set to sort by label name, then insert into Univalue array std::set<std::string> label_set; for (const std::pair<const CTxDestination, CAddressBookData>& entry : pwallet->m_address_book) { + if (entry.second.IsChange()) continue; if (purpose.empty() || entry.second.purpose == purpose) { label_set.insert(entry.second.name); } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ab36dacf37..b4cbcfd005 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1237,8 +1237,9 @@ bool CWallet::IsChange(const CScript& script) const return true; LOCK(cs_wallet); - if (!m_address_book.count(address)) + if (!FindAddressBookEntry(address)) { return true; + } } return false; } @@ -3192,7 +3193,7 @@ bool CWallet::SetAddressBookWithDB(WalletBatch& batch, const CTxDestination& add { LOCK(cs_wallet); std::map<CTxDestination, CAddressBookData>::iterator mi = m_address_book.find(address); - fUpdated = mi != m_address_book.end(); + fUpdated = (mi != m_address_book.end() && !mi->second.IsChange()); m_address_book[address].SetLabel(strName); if (!strPurpose.empty()) /* update purpose only if requested */ m_address_book[address].purpose = strPurpose; @@ -3459,6 +3460,7 @@ std::set<CTxDestination> CWallet::GetLabelAddresses(const std::string& label) co std::set<CTxDestination> result; for (const std::pair<const CTxDestination, CAddressBookData>& item : m_address_book) { + if (item.second.IsChange()) continue; const CTxDestination& address = item.first; const std::string& strName = item.second.name; if (strName == label) |