mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 23:07:59 +01:00
Wallet: Avoid treating change-in-the-addressbook as non-change everywhere
This commit is contained in:
parent
8e64b8c84b
commit
c751d886f4
5 changed files with 28 additions and 18 deletions
|
@ -152,7 +152,7 @@ public:
|
||||||
{
|
{
|
||||||
LOCK(m_wallet->cs_wallet);
|
LOCK(m_wallet->cs_wallet);
|
||||||
auto it = m_wallet->m_address_book.find(dest);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
if (name) {
|
if (name) {
|
||||||
|
@ -171,6 +171,7 @@ public:
|
||||||
LOCK(m_wallet->cs_wallet);
|
LOCK(m_wallet->cs_wallet);
|
||||||
std::vector<WalletAddress> result;
|
std::vector<WalletAddress> result;
|
||||||
for (const auto& item : m_wallet->m_address_book) {
|
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);
|
result.emplace_back(item.first, m_wallet->IsMine(item.first), item.second.name, item.second.purpose);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -55,7 +55,7 @@ struct AddressTableEntryLessThan
|
||||||
static AddressTableEntry::Type translateTransactionType(const QString &strPurpose, bool isMine)
|
static AddressTableEntry::Type translateTransactionType(const QString &strPurpose, bool isMine)
|
||||||
{
|
{
|
||||||
AddressTableEntry::Type addressType = AddressTableEntry::Hidden;
|
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")
|
if (strPurpose == "send")
|
||||||
addressType = AddressTableEntry::Sending;
|
addressType = AddressTableEntry::Sending;
|
||||||
else if (strPurpose == "receive")
|
else if (strPurpose == "receive")
|
||||||
|
|
|
@ -60,7 +60,8 @@ static bool GetWalletAddressesForKey(LegacyScriptPubKeyMan* spk_man, const CWall
|
||||||
CKey key;
|
CKey key;
|
||||||
spk_man->GetKey(keyid, key);
|
spk_man->GetKey(keyid, key);
|
||||||
for (const auto& dest : GetAllDestinationsForKey(key.GetPubKey())) {
|
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()) {
|
if (!strAddr.empty()) {
|
||||||
strAddr += ",";
|
strAddr += ",";
|
||||||
}
|
}
|
||||||
|
@ -168,7 +169,7 @@ UniValue importprivkey(const JSONRPCRequest& request)
|
||||||
// label all new addresses, and label existing addresses if a
|
// label all new addresses, and label existing addresses if a
|
||||||
// label was passed.
|
// label was passed.
|
||||||
for (const auto& dest : GetAllDestinationsForKey(pubkey)) {
|
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");
|
pwallet->SetAddressBook(dest, strLabel, "receive");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -505,7 +505,8 @@ static UniValue listaddressgroupings(const JSONRPCRequest& request)
|
||||||
addressInfo.push_back(EncodeDestination(address));
|
addressInfo.push_back(EncodeDestination(address));
|
||||||
addressInfo.push_back(ValueFromAmount(balances[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);
|
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)
|
for (auto item_it = start; item_it != end; ++item_it)
|
||||||
{
|
{
|
||||||
|
if (item_it->second.IsChange()) continue;
|
||||||
const CTxDestination& address = item_it->first;
|
const CTxDestination& address = item_it->first;
|
||||||
const std::string& label = item_it->second.name;
|
const std::string& label = item_it->second.name;
|
||||||
auto it = mapTally.find(address);
|
auto it = mapTally.find(address);
|
||||||
|
@ -1313,7 +1315,8 @@ static void ListTransactions(interfaces::Chain::Lock& locked_chain, const CWalle
|
||||||
MaybePushAddress(entry, s.destination);
|
MaybePushAddress(entry, s.destination);
|
||||||
entry.pushKV("category", "send");
|
entry.pushKV("category", "send");
|
||||||
entry.pushKV("amount", ValueFromAmount(-s.amount));
|
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("label", pwallet->m_address_book.at(s.destination).name);
|
||||||
}
|
}
|
||||||
entry.pushKV("vout", s.vout);
|
entry.pushKV("vout", s.vout);
|
||||||
|
@ -1330,7 +1333,8 @@ static void ListTransactions(interfaces::Chain::Lock& locked_chain, const CWalle
|
||||||
for (const COutputEntry& r : listReceived)
|
for (const COutputEntry& r : listReceived)
|
||||||
{
|
{
|
||||||
std::string label;
|
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;
|
label = pwallet->m_address_book.at(r.destination).name;
|
||||||
}
|
}
|
||||||
if (filter_label && label != *filter_label) {
|
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("category", "receive");
|
||||||
}
|
}
|
||||||
entry.pushKV("amount", ValueFromAmount(r.amount));
|
entry.pushKV("amount", ValueFromAmount(r.amount));
|
||||||
if (pwallet->m_address_book.count(r.destination)) {
|
if (address_book_entry) {
|
||||||
entry.pushKV("label", label);
|
entry.pushKV("label", label);
|
||||||
}
|
}
|
||||||
entry.pushKV("vout", r.vout);
|
entry.pushKV("vout", r.vout);
|
||||||
|
@ -2955,9 +2959,9 @@ static UniValue listunspent(const JSONRPCRequest& request)
|
||||||
if (fValidAddress) {
|
if (fValidAddress) {
|
||||||
entry.pushKV("address", EncodeDestination(address));
|
entry.pushKV("address", EncodeDestination(address));
|
||||||
|
|
||||||
auto i = pwallet->m_address_book.find(address);
|
const auto* address_book_entry = pwallet->FindAddressBookEntry(address);
|
||||||
if (i != pwallet->m_address_book.end()) {
|
if (address_book_entry) {
|
||||||
entry.pushKV("label", i->second.name);
|
entry.pushKV("label", address_book_entry->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<SigningProvider> provider = pwallet->GetSolvingProvider(scriptPubKey);
|
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
|
// DEPRECATED: Return label field if existing. Currently only one label can
|
||||||
// be associated with an address, so the label should be equivalent to the
|
// 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.
|
// 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);
|
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
|
// stable if we allow multiple labels to be associated with an address in
|
||||||
// the future.
|
// the future.
|
||||||
UniValue labels(UniValue::VARR);
|
UniValue labels(UniValue::VARR);
|
||||||
std::map<CTxDestination, CAddressBookData>::const_iterator mi = pwallet->m_address_book.find(dest);
|
if (address_book_entry) {
|
||||||
if (mi != pwallet->m_address_book.end()) {
|
|
||||||
// DEPRECATED: The previous behavior of returning an array containing a
|
// DEPRECATED: The previous behavior of returning an array containing a
|
||||||
// JSON object of `name` and `purpose` key/value pairs is deprecated.
|
// JSON object of `name` and `purpose` key/value pairs is deprecated.
|
||||||
if (pwallet->chain().rpcEnableDeprecated("labelspurpose")) {
|
if (pwallet->chain().rpcEnableDeprecated("labelspurpose")) {
|
||||||
labels.push_back(AddressBookDataToJSON(mi->second, true));
|
labels.push_back(AddressBookDataToJSON(*address_book_entry, true));
|
||||||
} else {
|
} else {
|
||||||
labels.push_back(mi->second.name);
|
labels.push_back(address_book_entry->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret.pushKV("labels", std::move(labels));
|
ret.pushKV("labels", std::move(labels));
|
||||||
|
@ -3890,6 +3894,7 @@ static UniValue getaddressesbylabel(const JSONRPCRequest& request)
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
std::set<std::string> addresses;
|
std::set<std::string> addresses;
|
||||||
for (const std::pair<const CTxDestination, CAddressBookData>& item : pwallet->m_address_book) {
|
for (const std::pair<const CTxDestination, CAddressBookData>& item : pwallet->m_address_book) {
|
||||||
|
if (item.second.IsChange()) continue;
|
||||||
if (item.second.name == label) {
|
if (item.second.name == label) {
|
||||||
std::string address = EncodeDestination(item.first);
|
std::string address = EncodeDestination(item.first);
|
||||||
// CWallet::m_address_book is not expected to contain duplicate
|
// 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
|
// Add to a set to sort by label name, then insert into Univalue array
|
||||||
std::set<std::string> label_set;
|
std::set<std::string> label_set;
|
||||||
for (const std::pair<const CTxDestination, CAddressBookData>& entry : pwallet->m_address_book) {
|
for (const std::pair<const CTxDestination, CAddressBookData>& entry : pwallet->m_address_book) {
|
||||||
|
if (entry.second.IsChange()) continue;
|
||||||
if (purpose.empty() || entry.second.purpose == purpose) {
|
if (purpose.empty() || entry.second.purpose == purpose) {
|
||||||
label_set.insert(entry.second.name);
|
label_set.insert(entry.second.name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1237,8 +1237,9 @@ bool CWallet::IsChange(const CScript& script) const
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
if (!m_address_book.count(address))
|
if (!FindAddressBookEntry(address)) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3192,7 +3193,7 @@ bool CWallet::SetAddressBookWithDB(WalletBatch& batch, const CTxDestination& add
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
std::map<CTxDestination, CAddressBookData>::iterator mi = m_address_book.find(address);
|
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);
|
m_address_book[address].SetLabel(strName);
|
||||||
if (!strPurpose.empty()) /* update purpose only if requested */
|
if (!strPurpose.empty()) /* update purpose only if requested */
|
||||||
m_address_book[address].purpose = strPurpose;
|
m_address_book[address].purpose = strPurpose;
|
||||||
|
@ -3459,6 +3460,7 @@ std::set<CTxDestination> CWallet::GetLabelAddresses(const std::string& label) co
|
||||||
std::set<CTxDestination> result;
|
std::set<CTxDestination> result;
|
||||||
for (const std::pair<const CTxDestination, CAddressBookData>& item : m_address_book)
|
for (const std::pair<const CTxDestination, CAddressBookData>& item : m_address_book)
|
||||||
{
|
{
|
||||||
|
if (item.second.IsChange()) continue;
|
||||||
const CTxDestination& address = item.first;
|
const CTxDestination& address = item.first;
|
||||||
const std::string& strName = item.second.name;
|
const std::string& strName = item.second.name;
|
||||||
if (strName == label)
|
if (strName == label)
|
||||||
|
|
Loading…
Add table
Reference in a new issue