diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 7eb1c7b34..c539eebcd 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -2147,6 +2147,7 @@ abstract class ElectrumWalletBase if (history.isNotEmpty) { addressRecord.setAsUsed(); + walletAddresses.clearLockIfMatches(addressRecord.type, addressRecord.address); await Future.wait(history.map((transaction) async { txid = transaction['tx_hash'] as String; @@ -2353,6 +2354,7 @@ abstract class ElectrumWalletBase addressRecord.balance = confirmed + unconfirmed; if (confirmed > 0 || unconfirmed > 0) { addressRecord.setAsUsed(); + walletAddresses.clearLockIfMatches(addressRecord.type, addressRecord.address); } } diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index a6ab2180d..b1b1c77fb 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -71,6 +71,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { currentSilentAddressIndex = initialSilentAddressIndex, mwebAddresses = ObservableList.of((initialMwebAddresses ?? []).toSet()), + lockedReceiveAddressByType = ObservableMap(), super(walletInfo) { if (masterHd != null) { silentAddress = SilentPaymentOwner.fromPrivateKeys( @@ -121,6 +122,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final Bip32Slip10Secp256k1 sideHd; final bool isHardwareWallet; + @observable + ObservableMap lockedReceiveAddressByType; + @observable SilentPaymentOwner? silentAddress; @@ -167,6 +171,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { return generateNewAddress().address; } + final locked = lockedReceiveAddressByType[addressPageType]; + if (locked != null) return locked; + final prev = previousAddressRecord; if (prev != null && prev.type == addressPageType && !prev.isUsed) { return prev.address; @@ -199,14 +206,31 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { (addressRecord) => addressRecord.address == addr, ); + lockedReceiveAddressByType.remove(addressPageType); + previousAddressRecord = addressRecord; receiveAddresses.remove(addressRecord); receiveAddresses.insert(0, addressRecord); + + if (isEnabledAutoGenerateSubaddress && + addressRecord.isUsed && + addressRecord.type == addressPageType) { + lockedReceiveAddressByType[addressPageType] = addr; + } + } catch (e) { printV("ElectrumWalletAddressBase: set address ($addr): $e"); } } + @action + void clearLockIfMatches(BitcoinAddressType type, String address) { + final locked = lockedReceiveAddressByType[type]; + if (locked != null && locked == address) { + lockedReceiveAddressByType.remove(type); + } + } + @override String get primaryAddress => getAddress(index: 0, hd: mainHd, addressType: addressPageType);