diff options
author | Ava Chow <github@achow101.com> | 2024-02-02 14:16:54 -0500 |
---|---|---|
committer | Ava Chow <github@achow101.com> | 2024-02-16 14:36:10 -0500 |
commit | edf4e73a163739a64eb9a54cd95413583a0e5c1f (patch) | |
tree | d4edc5aa8ca3cb390d251ffcf9309738e8f87511 /src/wallet | |
parent | 37232332bd7253422ea92a8c9eeb36b12fc84b56 (diff) |
wallet: Use scriptPubKey cache in IsMine
Diffstat (limited to 'src/wallet')
-rw-r--r-- | src/wallet/wallet.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index a416276d05..0c61a9b3fa 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1571,11 +1571,22 @@ isminetype CWallet::IsMine(const CTxDestination& dest) const isminetype CWallet::IsMine(const CScript& script) const { AssertLockHeld(cs_wallet); - isminetype result = ISMINE_NO; - for (const auto& spk_man_pair : m_spk_managers) { - result = std::max(result, spk_man_pair.second->IsMine(script)); + + // Search the cache so that IsMine is called only on the relevant SPKMs instead of on everything in m_spk_managers + const auto& it = m_cached_spks.find(script); + if (it != m_cached_spks.end()) { + isminetype res = ISMINE_NO; + for (const auto& spkm : it->second) { + res = std::max(res, spkm->IsMine(script)); + } + Assume(res == ISMINE_SPENDABLE); + return res; } - return result; + + // Legacy wallet + if (IsLegacy()) return GetLegacyScriptPubKeyMan()->IsMine(script); + + return ISMINE_NO; } bool CWallet::IsMine(const CTransaction& tx) const |