From 24a884b390595d8b39b0aab96e95d75e317b207e Mon Sep 17 00:00:00 2001 From: Serhii <17529954+serhii-bor@users.noreply.github.com> Date: Sun, 26 Jul 2026 01:52:41 +0300 Subject: [PATCH] fix btc address lookup (#3422) --- cw_bitcoin/lib/electrum_wallet.dart | 42 +++++++++++++++++++---------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 641feb673..6396abedb 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -2507,10 +2507,16 @@ abstract class ElectrumWalletBase Map historiesWithDetails, BitcoinAddressType type, ) async { - final addressesByType = walletAddresses.allAddresses.where((addr) => addr.type == type); - final hiddenAddresses = addressesByType.where((addr) => addr.isHidden == true); - final receiveAddresses = addressesByType.where((addr) => addr.isHidden == false); - walletAddresses.hiddenAddresses.addAll(hiddenAddresses.map((e) => e.address)); + + final addressesByType = + walletAddresses.allAddresses.where((addr) => addr.type == type).toList(); + + final receiveStandard = getAddressBranchByType(hidden: false, legacy: false, type: type); + final changeStandard = getAddressBranchByType(hidden: true, legacy: false, type: type); + final receiveLegacy = getAddressBranchByType(hidden: false, legacy: true, type: type); + final changeLegacy = getAddressBranchByType(hidden: true, legacy: true, type: type); + + walletAddresses.hiddenAddresses.addAll([...changeStandard, ...changeLegacy].map((e) => e.address)); await walletAddresses.saveAddressesInBox(); await Future.wait(addressesByType.map((addressRecord) async { final history = await _fetchAddressHistory(addressRecord, await getCurrentChainTip()); @@ -2519,7 +2525,9 @@ abstract class ElectrumWalletBase addressRecord.txCount = history.length; historiesWithDetails.addAll(history); - final matchedAddresses = addressRecord.isHidden ? hiddenAddresses : receiveAddresses; + final matchedAddresses = addressRecord.isHidden + ? (addressRecord.isLegacyDerivation ? changeLegacy : changeStandard) + : (addressRecord.isLegacyDerivation ? receiveLegacy : receiveStandard); final isUsedAddressAboveGap = matchedAddresses.toList().indexOf(addressRecord) >= matchedAddresses.length - (addressRecord.isHidden @@ -2623,18 +2631,19 @@ abstract class ElectrumWalletBase Future fetchTransactionsForAddressTypeBatch( Map historiesWithDetails, BitcoinAddressType type) async { - final addressesByType = - walletAddresses.allAddresses.where((addr) => addr.type == type).toList(); - final receiveAddresses = addressesByType.where((addr) => !addr.isHidden).toList(); - final hiddenAddresses = addressesByType.where((addr) => addr.isHidden).toList(); - walletAddresses.hiddenAddresses.addAll(hiddenAddresses.map((e) => e.address)); + final receiveStandard = getAddressBranchByType(hidden: false, legacy: false, type: type); + final changeStandard = getAddressBranchByType(hidden: true, legacy: false, type: type); + final receiveLegacy = getAddressBranchByType(hidden: false, legacy: true, type: type); + final changeLegacy = getAddressBranchByType(hidden: true, legacy: true, type: type); + + walletAddresses.hiddenAddresses.addAll([...changeStandard, ...changeLegacy].map((e) => e.address)); await walletAddresses.saveAddressesInBox(); await fetchTransactionsForAddressesBranchBatch( historiesWithDetails, type, - receiveAddresses, + receiveStandard, isHidden: false, isLegacyDerivation: false, ); @@ -2642,7 +2651,7 @@ abstract class ElectrumWalletBase await fetchTransactionsForAddressesBranchBatch( historiesWithDetails, type, - hiddenAddresses, + changeStandard, isHidden: true, isLegacyDerivation: false, ); @@ -2650,7 +2659,7 @@ abstract class ElectrumWalletBase await fetchTransactionsForAddressesBranchBatch( historiesWithDetails, type, - receiveAddresses, + receiveLegacy, isHidden: false, isLegacyDerivation: true, ); @@ -2658,7 +2667,7 @@ abstract class ElectrumWalletBase await fetchTransactionsForAddressesBranchBatch( historiesWithDetails, type, - hiddenAddresses, + changeLegacy, isHidden: true, isLegacyDerivation: true, ); @@ -2734,6 +2743,11 @@ abstract class ElectrumWalletBase } } + List getAddressBranchByType({required bool hidden, required bool legacy, required BitcoinAddressType + type}) => walletAddresses.allAddresses.where((addr) => addr.type == type && addr.isHidden == hidden && addr.isLegacyDerivation == legacy) + .toList() + ..sort((a, b) => a.index.compareTo(b.index)); + int _highestUsedIndex(List addresses) { for (int i = addresses.length - 1; i >= 0; i--) { if (addresses[i].isUsed) return i;