safeguards for monero subaddress list (#3242)
malik1004x committed
May 19, 2026 at 01:58 UTC
0fadbac08959ec326c8bb56add1e206d7e4b0e08
3 files changed
+12
-4
cw_monero/lib/monero_subaddress_list.dart
+2
-1
@@ -34,8 +34,9 @@ abstract class MoneroSubaddressListBase with Store {
34
try {
35
_isUpdating = true;
36
refresh(accountIndex: accountIndex);
37
+ final newAddrs = await getAll();
38
subaddresses.clear();
38
- subaddresses.addAll(await getAll());
39
+ subaddresses.addAll(newAddrs);
40
_isUpdating = false;
41
} catch (e) {
42
_isUpdating = false;
lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
+1
-1
@@ -214,7 +214,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
214
final addressList = ObservableList<ListItem>();
215
216
if (wallet.type == WalletType.monero) {
217
- final primaryAddress = monero!.getSubaddressList(wallet).subaddresses.first;
217
+ final primaryAddress = monero!.getSubaddressList(wallet).subaddresses.firstOrNull;
218
final addressItems = monero!.getSubaddressList(wallet).subaddresses.map((subaddress) {
219
final isPrimary = subaddress == primaryAddress;
220
lib/view_model/wallet_address_list/wallet_address_util.dart
+9
-2
@@ -25,9 +25,16 @@ Future<void> createNewAddress(WalletBase wallet, String label) async {
25
await monero!
26
.getSubaddressList(wallet)
27
.addSubaddress(wallet, accountIndex: monero!.getCurrentAccount(wallet).id, label: label);
28
- final addr = await monero!
28
+ final subaddressList = await monero!
29
.getSubaddressList(wallet)
30
- .subaddresses
30
+ .subaddresses;
31
+ if(subaddressList.isEmpty) {
32
+ // this shouldn't happen, we just added an addr.
33
+ // somehow, it happened once in prod regardless.
34
+ // we just return instead of crashing, user can press the button again ig
35
+ return;
36
+ }
37
+ final addr = subaddressList
38
.first
39
.address; // first because the order is reversed
40
wallet.walletAddresses.manualAddresses.add(addr);