mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-03 17:54:19 +02:00
Merge bitcoin/bitcoin#22929: wallet: Automatically add receiving destinations to the address book
3d71d16d1etest: listtranscations with externally generated addresses (S3RK)d04566415eAdd to spends only transcations from me (S3RK)9f3a622b1cAutomatically add labels to detected receiving addresses (S3RK)c1b99c088cReturn used destinations from ScriptPubKeyMan::MarkUnusedAddresses (S3RK)03840c2064Add CWallet::IsInternalScriptPubKeyMan (S3RK)456e350926wallet: resolve ambiguity of two ScriptPubKey managers providing same script (S3RK) Pull request description: This PR fixes certain use-cases when **send-to-self** transactions are missing from `listtransactions` output. 1. When a receiving address is generated externally to the wallet (e.g. same wallet running on two nodes, or by 3rd party from xpub) 2. When restoring backup with lost metadata, but keypool gap is not exceeded yet When the block is connected or tx added to mempool we already mark used keys. This PR extends this logic to determine whether the destination is a receiving one and if yes add it to the address book with empty label. Works both for legacy and descriptors wallets. - For legacy it uses the internal flag from the keypool entry. Caveat: because we don't know which script type would be used we add all possible destinations for such keys. - For descriptor wallets it uses internal flag for the script pub key manager. Caveat: it only works for active descriptors. fixes #19856 fixes #20293 ACKs for top commit: laanwj: Code review ACK3d71d16d1eTree-SHA512: 03fafd5548ead0c4ffe9ebcc9eb2849f1d2fa7270fda4166419b86877d4e57dcf04460e465fbb9c90b42031f3c05d1b83f1b67a9f82c2a42980825ed1e7b52e6
This commit is contained in:
@@ -149,6 +149,12 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
struct WalletDestination
|
||||
{
|
||||
CTxDestination dest;
|
||||
std::optional<bool> internal;
|
||||
};
|
||||
|
||||
/*
|
||||
* A class implementing ScriptPubKeyMan manages some (or all) scriptPubKeys used in a wallet.
|
||||
* It contains the scripts and keys related to the scriptPubKeys it manages.
|
||||
@@ -181,8 +187,14 @@ public:
|
||||
*/
|
||||
virtual bool TopUp(unsigned int size = 0) { return false; }
|
||||
|
||||
//! Mark unused addresses as being used
|
||||
virtual void MarkUnusedAddresses(const CScript& script) {}
|
||||
/** Mark unused addresses as being used
|
||||
* Affects all keys up to and including the one determined by provided script.
|
||||
*
|
||||
* @param script determines the last key to mark as used
|
||||
*
|
||||
* @return All of the addresses affected
|
||||
*/
|
||||
virtual std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) { return {}; }
|
||||
|
||||
/** Sets up the key generation stuff, i.e. generates new HD seeds and sets them as active.
|
||||
* Returns false if already setup or setup fails, true if setup is successful
|
||||
@@ -357,7 +369,7 @@ public:
|
||||
|
||||
bool TopUp(unsigned int size = 0) override;
|
||||
|
||||
void MarkUnusedAddresses(const CScript& script) override;
|
||||
std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
|
||||
|
||||
//! Upgrade stored CKeyMetadata objects to store key origin info as KeyOriginInfo
|
||||
void UpgradeKeyMetadata();
|
||||
@@ -482,9 +494,13 @@ public:
|
||||
void LearnAllRelatedScripts(const CPubKey& key);
|
||||
|
||||
/**
|
||||
* Marks all keys in the keypool up to and including reserve_key as used.
|
||||
* Marks all keys in the keypool up to and including the provided key as used.
|
||||
*
|
||||
* @param keypool_id determines the last key to mark as used
|
||||
*
|
||||
* @return All affected keys
|
||||
*/
|
||||
void MarkReserveKeysAsUsed(int64_t keypool_id) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
||||
std::vector<CKeyPool> MarkReserveKeysAsUsed(int64_t keypool_id) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
||||
const std::map<CKeyID, int64_t>& GetAllReserveKeys() const { return m_pool_key_to_index; }
|
||||
|
||||
std::set<CKeyID> GetKeys() const override;
|
||||
@@ -564,7 +580,7 @@ public:
|
||||
// (with or without private keys), the "keypool" is a single xpub.
|
||||
bool TopUp(unsigned int size = 0) override;
|
||||
|
||||
void MarkUnusedAddresses(const CScript& script) override;
|
||||
std::vector<WalletDestination> MarkUnusedAddresses(const CScript& script) override;
|
||||
|
||||
bool IsHDEnabled() const override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user