CW-1152-Enable-selecting-used-addresses (#2483)

* allow selecting used Electrum addresses

* fix ci issue
This commit is contained in:
Serhii
2025-08-28 06:23:26 +03:00
committed by GitHub
parent 8528941e1b
commit ef85f512f9
2 changed files with 26 additions and 0 deletions
+2
View File
@@ -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);
}
}
@@ -71,6 +71,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
currentSilentAddressIndex = initialSilentAddressIndex,
mwebAddresses =
ObservableList<BitcoinAddressRecord>.of((initialMwebAddresses ?? []).toSet()),
lockedReceiveAddressByType = ObservableMap<BitcoinAddressType, String>(),
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<BitcoinAddressType, String> 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);