From 7f6b069017e5f09756067eb2a814c2d1a89435fc Mon Sep 17 00:00:00 2001 From: sneurlax <sneurlax@gmail.com> Date: Tue, 23 Jan 2024 14:12:27 -0600 Subject: [PATCH] replace simple return with an await open --- lib/wallets/wallet/impl/monero_wallet.dart | 13 +++++++++---- .../wallet/intermediate/cryptonote_wallet.dart | 16 +++++++++++++++- .../cw_based_interface.dart | 11 +++++++++-- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lib/wallets/wallet/impl/monero_wallet.dart b/lib/wallets/wallet/impl/monero_wallet.dart index 5e4bc2940..f4d654b08 100644 --- a/lib/wallets/wallet/impl/monero_wallet.dart +++ b/lib/wallets/wallet/impl/monero_wallet.dart @@ -55,7 +55,7 @@ class MoneroWallet extends CryptonoteWallet with CwBasedInterface { @override Future<void> exitCwWallet() async { - walletOpen = false; + resetWalletOpenCompleter(); (cwWalletBase as MoneroWalletBase?)?.onNewBlock = null; (cwWalletBase as MoneroWalletBase?)?.onNewTransaction = null; (cwWalletBase as MoneroWalletBase?)?.syncStatusChanged = null; @@ -64,7 +64,7 @@ class MoneroWallet extends CryptonoteWallet with CwBasedInterface { @override Future<void> open() async { - walletOpen = false; + resetWalletOpenCompleter(); String? password; try { @@ -91,7 +91,7 @@ class MoneroWallet extends CryptonoteWallet with CwBasedInterface { (_) async => await cwWalletBase?.save(), ); - walletOpen = true; + walletOpenCompleter?.complete(); } @override @@ -157,7 +157,12 @@ class MoneroWallet extends CryptonoteWallet with CwBasedInterface { @override Future<void> updateTransactions() async { - if (!walletOpen) return; + try { + await waitForWalletOpen().timeout(const Duration(seconds: 30)); + } catch (e, s) { + Logging.instance + .log("Failed to wait for wallet open: $e\n$s", level: LogLevel.Fatal); + } await (cwWalletBase as MoneroWalletBase?)?.updateTransactions(); final transactions = diff --git a/lib/wallets/wallet/intermediate/cryptonote_wallet.dart b/lib/wallets/wallet/intermediate/cryptonote_wallet.dart index 72c49e342..61a86aece 100644 --- a/lib/wallets/wallet/intermediate/cryptonote_wallet.dart +++ b/lib/wallets/wallet/intermediate/cryptonote_wallet.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:stackwallet/wallets/crypto_currency/intermediate/cryptonote_currency.dart'; import 'package:stackwallet/wallets/models/tx_data.dart'; import 'package:stackwallet/wallets/wallet/wallet.dart'; @@ -7,7 +9,19 @@ abstract class CryptonoteWallet<T extends CryptonoteCurrency> extends Wallet<T> with MnemonicInterface<T> { CryptonoteWallet(T currency) : super(currency); - bool walletOpen = false; + Completer<void>? walletOpenCompleter; + + void resetWalletOpenCompleter() { + if (walletOpenCompleter == null || walletOpenCompleter!.isCompleted) { + walletOpenCompleter = Completer<void>(); + } + } + + Future<void> waitForWalletOpen() async { + if (walletOpenCompleter != null && !walletOpenCompleter!.isCompleted) { + await walletOpenCompleter!.future; + } + } // ========== Overrides ====================================================== diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/cw_based_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/cw_based_interface.dart index 7f4508d80..47778a56b 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/cw_based_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/cw_based_interface.dart @@ -47,6 +47,8 @@ mixin CwBasedInterface<T extends CryptonoteCurrency> on CryptonoteWallet<T> Timer? autoSaveTimer; + static bool walletOperationWaiting = false; + Future<String> pathForWalletDir({ required String name, required WalletType type, @@ -244,7 +246,12 @@ mixin CwBasedInterface<T extends CryptonoteCurrency> on CryptonoteWallet<T> @override Future<void> updateBalance() async { - if (!walletOpen) return; + try { + await waitForWalletOpen().timeout(const Duration(seconds: 30)); + } catch (e, s) { + Logging.instance + .log("Failed to wait for wallet open: $e\n$s", level: LogLevel.Fatal); + } final total = await totalBalance; final available = await availableBalance; @@ -302,7 +309,7 @@ mixin CwBasedInterface<T extends CryptonoteCurrency> on CryptonoteWallet<T> @override Future<void> exit() async { if (!_hasCalledExit) { - walletOpen = false; + resetWalletOpenCompleter(); _hasCalledExit = true; autoSaveTimer?.cancel(); await exitCwWallet();