feat: always construct wallet addresses with 5+ sp addresses (#2487)

rafael_xmr committed Aug 28, 2025 at 21:22 UTC f450bae82ddbe89acf537031d2881c37a945c3ca
1 file changed +17 -14
cw_bitcoin/lib/electrum_wallet_addresses.dart
+17 -14
@@ -80,7 +80,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
80 network: network,
81 );
82
83 - if (silentAddresses.length == 0) {
83 + if (!silentAddresses.any((addr) => addr.index == 0 && addr.isHidden == false))
84 silentAddresses.add(BitcoinSilentPaymentAddressRecord(
85 silentAddress.toString(),
86 index: 0,
@@ -90,15 +90,17 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
90 network: network,
91 type: SilentPaymentsAddresType.p2sp,
92 ));
93 - silentAddresses.add(BitcoinSilentPaymentAddressRecord(
94 - silentAddress!.toLabeledSilentPaymentAddress(0).toString(),
95 - index: 0,
96 - isHidden: true,
97 - name: "",
98 - silentPaymentTweak: BytesUtils.toHexString(silentAddress!.generateLabel(0)),
99 - network: network,
100 - type: SilentPaymentsAddresType.p2sp,
101 - ));
93 + for (var i = 0; i < 5; i++) {
94 + if (!silentAddresses.any((addr) => addr.index == i && addr.isHidden == (i == 0)))
95 + silentAddresses.add(BitcoinSilentPaymentAddressRecord(
96 + silentAddress!.toLabeledSilentPaymentAddress(i).toString(),
97 + index: i,
98 + isHidden: i == 0,
99 + name: "",
100 + silentPaymentTweak: BytesUtils.toHexString(silentAddress!.generateLabel(i)),
101 + network: network,
102 + type: SilentPaymentsAddresType.p2sp,
103 + ));
104 }
105 }
106
@@ -151,12 +153,13 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
153 return silentAddress.toString();
154 }
155
154 - final typeMatchingAddresses = _addresses.where((addr) => !addr.isHidden && _isAddressPageTypeMatch(addr)).toList();
155 - final typeMatchingReceiveAddresses = typeMatchingAddresses.where((addr) => !addr.isUsed).toList();
156 + final typeMatchingAddresses =
157 + _addresses.where((addr) => !addr.isHidden && _isAddressPageTypeMatch(addr)).toList();
158 + final typeMatchingReceiveAddresses =
159 + typeMatchingAddresses.where((addr) => !addr.isUsed).toList();
160
161 if (!isEnabledAutoGenerateSubaddress) {
158 - if (previousAddressRecord != null &&
159 - previousAddressRecord!.type == addressPageType) {
162 + if (previousAddressRecord != null && previousAddressRecord!.type == addressPageType) {
163 return previousAddressRecord!.address;
164 }
165