diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -108,9 +108,8 @@ virtual bool delAddressBook(const CTxDestination &dest) = 0; //! Look up address in wallet, return whether exists. - virtual bool getAddress(const CTxDestination &dest, - std::string *name = nullptr, - isminetype *is_mine = nullptr) = 0; + virtual bool getAddress(const CTxDestination &dest, std::string *name, + isminetype *is_mine, std::string *purpose) = 0; //! Get wallet address list. virtual std::vector getAddresses() = 0; diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -163,7 +163,7 @@ return m_wallet.DelAddressBook(dest); } bool getAddress(const CTxDestination &dest, std::string *name, - isminetype *is_mine) override { + isminetype *is_mine, std::string *purpose) override { LOCK(m_wallet.cs_wallet); auto it = m_wallet.mapAddressBook.find(dest); if (it == m_wallet.mapAddressBook.end()) { @@ -175,6 +175,9 @@ if (is_mine) { *is_mine = IsMine(m_wallet, dest); } + if (purpose) { + *purpose = it->second.purpose; + } return true; } std::vector getAddresses() override { diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp --- a/src/qt/addresstablemodel.cpp +++ b/src/qt/addresstablemodel.cpp @@ -252,7 +252,9 @@ // Check for duplicate addresses to prevent accidental deletion of // addresses, if you try to paste an existing address over another // address (with a different label) - if (walletModel->wallet().getAddress(newAddress)) { + if (walletModel->wallet().getAddress( + newAddress, /* name= */ nullptr, /* is_mine= */ nullptr, + /* purpose= */ nullptr)) { editStatus = DUPLICATE_ADDRESS; return false; } @@ -330,7 +332,9 @@ } // Check for duplicate addresses if (walletModel->wallet().getAddress( - DecodeDestination(strAddress, walletModel->getChainParams()))) { + DecodeDestination(strAddress, walletModel->getChainParams()), + /* name= */ nullptr, /* is_mine= */ nullptr, + /* purpose= */ nullptr)) { editStatus = DUPLICATE_ADDRESS; return QString(); } @@ -387,7 +391,9 @@ CTxDestination destination = DecodeDestination(address.toStdString(), walletModel->getChainParams()); std::string name; - if (walletModel->wallet().getAddress(destination, &name)) { + if (walletModel->wallet().getAddress(destination, &name, + /* is_mine= */ nullptr, + /* purpose= */ nullptr)) { return QString::fromStdString(name); } return QString(); diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -99,7 +99,8 @@ if (IsValidDestination(address)) { std::string name; isminetype ismine; - if (wallet.getAddress(address, &name, &ismine)) { + if (wallet.getAddress(address, &name, &ismine, + /* purpose= */ nullptr)) { strHTML += "" + tr("From") + ": " + tr("unknown") + "
"; strHTML += "" + tr("To") + ": "; @@ -129,7 +130,9 @@ CTxDestination dest = DecodeDestination(strAddress, wallet.getChainParams()); std::string name; - if (wallet.getAddress(dest, &name) && !name.empty()) { + if (wallet.getAddress(dest, &name, /* is_mine= */ nullptr, + /* purpose= */ nullptr) && + !name.empty()) { strHTML += GUIUtil::HtmlEscape(name) + " "; } strHTML += GUIUtil::HtmlEscape(strAddress) + "
"; @@ -202,7 +205,9 @@ if (ExtractDestination(txout.scriptPubKey, address)) { strHTML += "" + tr("To") + ": "; std::string name; - if (wallet.getAddress(address, &name) && + if (wallet.getAddress(address, &name, + /* is_mine= */ nullptr, + /* purpose= */ nullptr) && !name.empty()) { strHTML += GUIUtil::HtmlEscape(name) + " "; } @@ -370,7 +375,10 @@ CTxDestination address; if (ExtractDestination(vout.scriptPubKey, address)) { std::string name; - if (wallet.getAddress(address, &name) && !name.empty()) { + if (wallet.getAddress(address, &name, + /* is_mine= */ nullptr, + /* purpose= */ nullptr) && + !name.empty()) { strHTML += GUIUtil::HtmlEscape(name) + " "; } strHTML += QString::fromStdString( diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -267,7 +267,8 @@ std::string strLabel = rcp.label.toStdString(); // Check if we have a new address or an updated label std::string name; - if (!m_wallet->getAddress(dest, &name)) { + if (!m_wallet->getAddress(dest, &name, /* is_mine= */ nullptr, + /* purpose= */ nullptr)) { m_wallet->setAddressBook(dest, strLabel, "send"); } else if (name != strLabel) { // "" means don't change purpose