Cw 925 improve automatic subaddress generation behavior (#2217)

* fix: update usedAddresses for monero

* fix: subaddresses generation for bitcoin

* fix: minor fix

* fix: update receive address UI when used

* minor fix [skip ci]
This commit is contained in:
Serhii 2025-04-30 19:11:36 +03:00 committed by GitHub
parent b25cb527cb
commit 4448adb49d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 23 deletions

View file

@ -1,4 +1,5 @@
import 'dart:convert';
import 'package:mobx/mobx.dart';
import 'package:bitcoin_base/bitcoin_base.dart';
@ -16,7 +17,7 @@ abstract class BaseBitcoinAddressRecord {
}) : _txCount = txCount,
_balance = balance,
_name = name,
_isUsed = isUsed;
_isUsed = Observable(isUsed);
@override
bool operator ==(Object o) => o is BaseBitcoinAddressRecord && address == o.address;
@ -27,7 +28,7 @@ abstract class BaseBitcoinAddressRecord {
int _txCount;
int _balance;
String _name;
bool _isUsed;
final Observable<bool> _isUsed;
BasedUtxoNetwork? network;
int get txCount => _txCount;
@ -40,9 +41,9 @@ abstract class BaseBitcoinAddressRecord {
set balance(int value) => _balance = value;
bool get isUsed => _isUsed;
bool get isUsed => _isUsed.value;
void setAsUsed() => _isUsed = true;
void setAsUsed() => _isUsed.value = true;
void setNewName(String label) => _name = label;
int get hashCode => address.hashCode;

View file

@ -144,27 +144,32 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
return silentAddress.toString();
}
String receiveAddress;
final typeMatchingAddresses = _addresses.where((addr) => !addr.isHidden && _isAddressPageTypeMatch(addr)).toList();
final typeMatchingReceiveAddresses = typeMatchingAddresses.where((addr) => !addr.isUsed).toList();
final typeMatchingReceiveAddresses =
receiveAddresses.where(_isAddressPageTypeMatch).where((addr) => !addr.isUsed);
if ((isEnabledAutoGenerateSubaddress && receiveAddresses.isEmpty) ||
typeMatchingReceiveAddresses.isEmpty) {
receiveAddress = generateNewAddress().address;
} else {
final previousAddressMatchesType =
previousAddressRecord != null && previousAddressRecord!.type == addressPageType;
if (previousAddressMatchesType &&
typeMatchingReceiveAddresses.first.address != addressesByReceiveType.first.address) {
receiveAddress = previousAddressRecord!.address;
} else {
receiveAddress = typeMatchingReceiveAddresses.first.address;
if (!isEnabledAutoGenerateSubaddress) {
if (previousAddressRecord != null &&
previousAddressRecord!.type == addressPageType) {
return previousAddressRecord!.address;
}
if (typeMatchingAddresses.isNotEmpty) {
return typeMatchingAddresses.first.address;
}
return generateNewAddress().address;
}
return receiveAddress;
if (typeMatchingAddresses.isEmpty || typeMatchingReceiveAddresses.isEmpty) {
return generateNewAddress().address;
}
final prev = previousAddressRecord;
if (prev != null && prev.type == addressPageType && !prev.isUsed) {
return prev.address;
}
return typeMatchingReceiveAddresses.first.address;
}
@observable