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);