From 21847cd95806b5be3d581cadb510aa39dd258f42 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Thu, 16 Apr 2026 12:54:31 +0200 Subject: [PATCH] add missing mutex in monero (#3188) * add missing mutex in monero * wrap critical block in try-finally * Update lib/view_model/dashboard/dashboard_view_model.dart [skip ci] --------- Co-authored-by: Omar Hatem --- cw_monero/lib/api/subaddress_list.dart | 44 +++++++++++-------- cw_monero/lib/monero_subaddress_list.dart | 23 +++++----- lib/monero/cw_monero.dart | 6 +-- .../dashboard/dashboard_view_model.dart | 6 +-- tool/configure.dart | 2 +- 5 files changed, 43 insertions(+), 38 deletions(-) diff --git a/cw_monero/lib/api/subaddress_list.dart b/cw_monero/lib/api/subaddress_list.dart index 9a33dd12c..79bf01c55 100644 --- a/cw_monero/lib/api/subaddress_list.dart +++ b/cw_monero/lib/api/subaddress_list.dart @@ -65,25 +65,33 @@ int lastWptr = 0; int lastTxCount = 0; List ttDetails = []; -List getAllSubaddresses() { - txhistory = currentWallet!.history(); - final txCount = txhistory!.count(); - if (lastTxCount != txCount && lastWptr != currentWallet!.ffiAddress()) { - final List newttDetails = []; - lastTxCount = txCount; - lastWptr = currentWallet!.ffiAddress(); - for (var i = 0; i < txCount; i++) { - final tx = txhistory!.transaction(i); - if (tx.direction() == TransactionInfo_Direction.Out.index) continue; - final subaddrs = tx.subaddrIndex().split(","); - final account = tx.subaddrAccount(); - newttDetails.add(TinyTransactionDetails( - address: List.generate(subaddrs.length, (index) => getAddress(accountIndex: account, addressIndex: int.tryParse(subaddrs[index])??0)), - amount: tx.amount(), - )); +Future> getAllSubaddresses() async { + try { + await txHistoryMutex.acquire(); + txhistory = currentWallet!.history(); + final txCount = txhistory!.count(); + if (lastTxCount != txCount && lastWptr != currentWallet!.ffiAddress()) { + final List newttDetails = []; + lastTxCount = txCount; + lastWptr = currentWallet!.ffiAddress(); + for (var i = 0; i < txCount; i++) { + final tx = txhistory!.transaction(i); + if (tx.direction() == TransactionInfo_Direction.Out.index) continue; + final subaddrs = tx.subaddrIndex().split(","); + final account = tx.subaddrAccount(); + newttDetails.add(TinyTransactionDetails( + address: List.generate( + subaddrs.length, + (index) => getAddress( + accountIndex: account, addressIndex: int.tryParse(subaddrs[index]) ?? 0)), + amount: tx.amount(), + )); + } + ttDetails.clear(); + ttDetails.addAll(newttDetails); } - ttDetails.clear(); - ttDetails.addAll(newttDetails); + } finally { + txHistoryMutex.release(); } final size = currentWallet!.numSubaddresses(accountIndex: subaddress!.accountIndex); final list = List.generate(size, (index) { diff --git a/cw_monero/lib/monero_subaddress_list.dart b/cw_monero/lib/monero_subaddress_list.dart index bc6f223d7..779b1d303 100644 --- a/cw_monero/lib/monero_subaddress_list.dart +++ b/cw_monero/lib/monero_subaddress_list.dart @@ -2,7 +2,7 @@ import 'package:cw_core/subaddress.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_monero/api/coins_info.dart'; import 'package:cw_monero/api/subaddress_list.dart' as subaddress_list; -import 'package:cw_monero/api/wallet.dart'; + import 'package:flutter/services.dart'; import 'package:mobx/mobx.dart'; @@ -24,7 +24,7 @@ abstract class MoneroSubaddressListBase with Store { bool _isRefreshing; bool _isUpdating; - void update({required int accountIndex}) { + Future update({required int accountIndex}) async { refreshCoins(accountIndex); if (_isUpdating) { @@ -35,7 +35,7 @@ abstract class MoneroSubaddressListBase with Store { _isUpdating = true; refresh(accountIndex: accountIndex); subaddresses.clear(); - subaddresses.addAll(getAll()); + subaddresses.addAll(await getAll()); _isUpdating = false; } catch (e) { _isUpdating = false; @@ -43,8 +43,8 @@ abstract class MoneroSubaddressListBase with Store { } } - List getAll() { - var subaddresses = subaddress_list.getAllSubaddresses(); + Future> getAll() async { + var subaddresses = await subaddress_list.getAllSubaddresses(); if (subaddresses.length > 2) { final primary = subaddresses.first; @@ -122,7 +122,7 @@ abstract class MoneroSubaddressListBase with Store { Future> _getAllUnusedAddresses( {required int accountIndex, required String label}) async { - final allAddresses = subaddress_list.getAllSubaddresses(); + final allAddresses = await subaddress_list.getAllSubaddresses(); // first because addresses come in reversed order. if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.first.address)) { final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label); @@ -151,12 +151,9 @@ abstract class MoneroSubaddressListBase with Store { Future _newSubaddress({required int accountIndex, required String label}) async { await subaddress_list.addSubaddress(accountIndex: accountIndex, label: label); - return subaddress_list - .getAllSubaddresses() - .where((s) { - final address = s.address; - return !_usedAddresses.contains(address); - }) - .isNotEmpty; + return (await subaddress_list.getAllSubaddresses()).where((s) { + final address = s.address; + return !_usedAddresses.contains(address); + }).isNotEmpty; } } diff --git a/lib/monero/cw_monero.dart b/lib/monero/cw_monero.dart index d7be8fbd8..5cc0412b4 100644 --- a/lib/monero/cw_monero.dart +++ b/lib/monero/cw_monero.dart @@ -89,10 +89,10 @@ class CWMoneroSubaddressList extends MoneroSubaddressList { } @override - List getAll(Object wallet) { + Future> getAll(Object wallet) async { final moneroWallet = wallet as MoneroWallet; - return moneroWallet.walletAddresses.subaddressList - .getAll() + return (await moneroWallet.walletAddresses.subaddressList + .getAll()) .map((sub) => Subaddress( id: sub.id, label: sub.label, diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 1f2cb0faa..8b249c8cf 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -770,9 +770,9 @@ abstract class DashboardViewModelBase with Store { "public view key is 0", // if (wallet.seed == null) "wallet seed is null", // if (wallet.seed == "") "wallet seed is empty", - if (monero!.getSubaddressList(wallet).getAll(wallet)[0].address == - "41d7FXjswpK1111111111111111111111111111111111111111111111111111111111111111111111111111112KhNi4") - "primary address is invalid, you won't be able to receive / spend funds", + // if (monero!.getSubaddressList(wallet).getAll(wallet)[0].address == + // "41d7FXjswpK1111111111111111111111111111111111111111111111111111111111111111111111111111112KhNi4") + // "primary address is invalid, you won't be able to receive / spend funds", ]; return errors; } diff --git a/tool/configure.dart b/tool/configure.dart index 798febd61..81def5b22 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -492,7 +492,7 @@ abstract class MoneroSubaddressList { ObservableList get subaddresses; void update(Object wallet, {required int accountIndex}); void refresh(Object wallet, {required int accountIndex}); - List getAll(Object wallet); + Future> getAll(Object wallet); Future addSubaddress(Object wallet, {required int accountIndex, required String label}); Future setLabelSubaddress(Object wallet, {required int accountIndex, required int addressIndex, required String label});