mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 22:50:59 +01:00
Merge bitcoin/bitcoin#25337: refactor: encapsulate wallet's address book access
d69045e291test: add coverage for 'listreceivedbyaddress' no change addrs return (furszy)324f00a642refactor: 'ListReceived' use optional for filtered address (furszy)b459fc122frefactor: RPC 'ListReceived', encapsulate m_address_book access (furszy)fa9f2ab8fdrefactor: RPC 'listlabels', encapsulate 'CWallet::ListAddrBookLabels' functionality (furszy)83e42c4b94refactor: use 'ForEachAddrBookEntry' in RPC 'getaddressesbylabel' (furszy)2b48642499refactor: use ForEachAddrBookEntry in interfaces::getAddresses (furszy)032842ae41wallet: implement ForEachAddrBookEntry method (furszy)09649bc95drefactor: implement general 'ListAddrBookAddresses' for addressbook destinations lookup (furszy)192eb1e61crefactor: getAddress don't access m_address_book, use FindAddressEntry function (furszy) Pull request description: ### Context The wallet's `m_address_book` field is being accessed directly from several places across the sources. ### Problem Code structure wise, we shouldn't be accessing it directly. It could end up being modified by mistake (from a place that has nothing to do with the wallet like an RPC command or the GUI) and cause a bigger issue: like an address book entry 'purpose' string change, which if done badly (from 'send' to 'receive'), could end up in a user sharing a "receive" address that he/she doesn't own. ### Solution Encapsulate `m_address_book` access inside the wallet. ------------------------------------------------------- Extra Note: This is the initial step towards decoupling the address book functionality from the wallet's sources. In other words, the creation of the `AddressBookManager` (which will be coming in a follow-up PR). ACKs for top commit: achow101: ACKd69045e291theStack: ACKd69045e291✅ w0xlt: ACKd69045e291Tree-SHA512: dba17acd86f171b4e9af0223bbbcad380048570f6a2f6a92732a51f01abe8806debaf65c9e9e5569fa76a541903cbb50adcb5f56ef77858151c698ae6b218e2a
This commit is contained in:
@@ -191,29 +191,27 @@ public:
|
||||
std::string* purpose) override
|
||||
{
|
||||
LOCK(m_wallet->cs_wallet);
|
||||
auto it = m_wallet->m_address_book.find(dest);
|
||||
if (it == m_wallet->m_address_book.end() || it->second.IsChange()) {
|
||||
return false;
|
||||
}
|
||||
const auto& entry = m_wallet->FindAddressBookEntry(dest, /*allow_change=*/false);
|
||||
if (!entry) return false; // addr not found
|
||||
if (name) {
|
||||
*name = it->second.GetLabel();
|
||||
*name = entry->GetLabel();
|
||||
}
|
||||
if (is_mine) {
|
||||
*is_mine = m_wallet->IsMine(dest);
|
||||
}
|
||||
if (purpose) {
|
||||
*purpose = it->second.purpose;
|
||||
*purpose = entry->purpose;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
std::vector<WalletAddress> getAddresses() override
|
||||
std::vector<WalletAddress> getAddresses() const override
|
||||
{
|
||||
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.GetLabel(), item.second.purpose);
|
||||
}
|
||||
m_wallet->ForEachAddrBookEntry([&](const CTxDestination& dest, const std::string& label, const std::string& purpose, bool is_change) EXCLUSIVE_LOCKS_REQUIRED(m_wallet->cs_wallet) {
|
||||
if (is_change) return;
|
||||
result.emplace_back(dest, m_wallet->IsMine(dest), label, purpose);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
std::vector<std::string> getAddressReceiveRequests() override {
|
||||
|
||||
Reference in New Issue
Block a user