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;