| 2486 | } |
| 2487 | |
| 2488 | bool CWallet::SetAddressBookWithDB(WalletBatch& batch, const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& new_purpose) |
| 2489 | { |
| 2490 | bool fUpdated = false; |
| 2491 | bool is_mine; |
| 2492 | std::optional<AddressPurpose> purpose; |
| 2493 | { |
| 2494 | LOCK(cs_wallet); |
| 2495 | std::map<CTxDestination, CAddressBookData>::iterator mi = m_address_book.find(address); |
| 2496 | fUpdated = mi != m_address_book.end() && !mi->second.IsChange(); |
| 2497 | |
| 2498 | CAddressBookData& record = mi != m_address_book.end() ? mi->second : m_address_book[address]; |
| 2499 | record.SetLabel(strName); |
| 2500 | is_mine = IsMine(address); |
| 2501 | if (new_purpose) { /* update purpose only if requested */ |
| 2502 | record.purpose = new_purpose; |
| 2503 | } |
| 2504 | purpose = record.purpose; |
| 2505 | } |
| 2506 | |
| 2507 | const std::string& encoded_dest = EncodeDestination(address); |
| 2508 | if (new_purpose && !batch.WritePurpose(encoded_dest, PurposeToString(*new_purpose))) { |
| 2509 | WalletLogPrintf("Error: fail to write address book 'purpose' entry\n"); |
| 2510 | return false; |
| 2511 | } |
| 2512 | if (!batch.WriteName(encoded_dest, strName)) { |
| 2513 | WalletLogPrintf("Error: fail to write address book 'name' entry\n"); |
| 2514 | return false; |
| 2515 | } |
| 2516 | |
| 2517 | // In very old wallets, address purpose may not be recorded so we derive it from IsMine |
| 2518 | NotifyAddressBookChanged(address, strName, is_mine, |
| 2519 | purpose.value_or(is_mine ? AddressPurpose::RECEIVE : AddressPurpose::SEND), |
| 2520 | (fUpdated ? CT_UPDATED : CT_NEW)); |
| 2521 | return true; |
| 2522 | } |
| 2523 | |
| 2524 | bool CWallet::SetAddressBook(const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& purpose) |
| 2525 | { |
nothing calls this directly
no test coverage detected