fix btc address lookup (#3422)

Serhii committed Jul 26, 2026 at 01:52 UTC 24a884b390595d8b39b0aab96e95d75e317b207e
1 file changed +28 -14
cw_bitcoin/lib/electrum_wallet.dart
+28 -14
@@ -2507,10 +2507,16 @@ abstract class ElectrumWalletBase
2507 Map<String, ElectrumTransactionInfo> historiesWithDetails,
2508 BitcoinAddressType type,
2509 ) async {
2510 - final addressesByType = walletAddresses.allAddresses.where((addr) => addr.type == type);
2511 - final hiddenAddresses = addressesByType.where((addr) => addr.isHidden == true);
2512 - final receiveAddresses = addressesByType.where((addr) => addr.isHidden == false);
2513 - walletAddresses.hiddenAddresses.addAll(hiddenAddresses.map((e) => e.address));
2510 +
2511 + final addressesByType =
2512 + walletAddresses.allAddresses.where((addr) => addr.type == type).toList();
2513 +
2514 + final receiveStandard = getAddressBranchByType(hidden: false, legacy: false, type: type);
2515 + final changeStandard = getAddressBranchByType(hidden: true, legacy: false, type: type);
2516 + final receiveLegacy = getAddressBranchByType(hidden: false, legacy: true, type: type);
2517 + final changeLegacy = getAddressBranchByType(hidden: true, legacy: true, type: type);
2518 +
2519 + walletAddresses.hiddenAddresses.addAll([...changeStandard, ...changeLegacy].map((e) => e.address));
2520 await walletAddresses.saveAddressesInBox();
2521 await Future.wait(addressesByType.map((addressRecord) async {
2522 final history = await _fetchAddressHistory(addressRecord, await getCurrentChainTip());
@@ -2519,7 +2525,9 @@ abstract class ElectrumWalletBase
2525 addressRecord.txCount = history.length;
2526 historiesWithDetails.addAll(history);
2527
2522 - final matchedAddresses = addressRecord.isHidden ? hiddenAddresses : receiveAddresses;
2528 + final matchedAddresses = addressRecord.isHidden
2529 + ? (addressRecord.isLegacyDerivation ? changeLegacy : changeStandard)
2530 + : (addressRecord.isLegacyDerivation ? receiveLegacy : receiveStandard);
2531 final isUsedAddressAboveGap = matchedAddresses.toList().indexOf(addressRecord) >=
2532 matchedAddresses.length -
2533 (addressRecord.isHidden
@@ -2623,18 +2631,19 @@ abstract class ElectrumWalletBase
2631
2632 Future<void> fetchTransactionsForAddressTypeBatch(
2633 Map<String, ElectrumTransactionInfo> historiesWithDetails, BitcoinAddressType type) async {
2626 - final addressesByType =
2627 - walletAddresses.allAddresses.where((addr) => addr.type == type).toList();
2628 - final receiveAddresses = addressesByType.where((addr) => !addr.isHidden).toList();
2629 - final hiddenAddresses = addressesByType.where((addr) => addr.isHidden).toList();
2634
2631 - walletAddresses.hiddenAddresses.addAll(hiddenAddresses.map((e) => e.address));
2635 + final receiveStandard = getAddressBranchByType(hidden: false, legacy: false, type: type);
2636 + final changeStandard = getAddressBranchByType(hidden: true, legacy: false, type: type);
2637 + final receiveLegacy = getAddressBranchByType(hidden: false, legacy: true, type: type);
2638 + final changeLegacy = getAddressBranchByType(hidden: true, legacy: true, type: type);
2639 +
2640 + walletAddresses.hiddenAddresses.addAll([...changeStandard, ...changeLegacy].map((e) => e.address));
2641 await walletAddresses.saveAddressesInBox();
2642
2643 await fetchTransactionsForAddressesBranchBatch(
2644 historiesWithDetails,
2645 type,
2637 - receiveAddresses,
2646 + receiveStandard,
2647 isHidden: false,
2648 isLegacyDerivation: false,
2649 );
@@ -2642,7 +2651,7 @@ abstract class ElectrumWalletBase
2651 await fetchTransactionsForAddressesBranchBatch(
2652 historiesWithDetails,
2653 type,
2645 - hiddenAddresses,
2654 + changeStandard,
2655 isHidden: true,
2656 isLegacyDerivation: false,
2657 );
@@ -2650,7 +2659,7 @@ abstract class ElectrumWalletBase
2659 await fetchTransactionsForAddressesBranchBatch(
2660 historiesWithDetails,
2661 type,
2653 - receiveAddresses,
2662 + receiveLegacy,
2663 isHidden: false,
2664 isLegacyDerivation: true,
2665 );
@@ -2658,7 +2667,7 @@ abstract class ElectrumWalletBase
2667 await fetchTransactionsForAddressesBranchBatch(
2668 historiesWithDetails,
2669 type,
2661 - hiddenAddresses,
2670 + changeLegacy,
2671 isHidden: true,
2672 isLegacyDerivation: true,
2673 );
@@ -2734,6 +2743,11 @@ abstract class ElectrumWalletBase
2743 }
2744 }
2745
2746 + List<BitcoinAddressRecord> getAddressBranchByType({required bool hidden, required bool legacy, required BitcoinAddressType
2747 + type}) => walletAddresses.allAddresses.where((addr) => addr.type == type && addr.isHidden == hidden && addr.isLegacyDerivation == legacy)
2748 + .toList()
2749 + ..sort((a, b) => a.index.compareTo(b.index));
2750 +
2751 int _highestUsedIndex(List<BitcoinAddressRecord> addresses) {
2752 for (int i = addresses.length - 1; i >= 0; i--) {
2753 if (addresses[i].isUsed) return i;