From 3ba43ede62666f8d3640b5041edc8daa6ba35e7c Mon Sep 17 00:00:00 2001 From: cyan Date: Thu, 27 Aug 2026 05:58:22 +0300 Subject: [PATCH] Cyjan zec mutex 2 (#3569) * fix: mutex on zec * refactor: simplify orchard migratable balance checks and update related methods --- cw_zcash/lib/src/zcash_wallet.dart | 36 ++++++++----------- .../dashboard/dashboard_view_model.dart | 26 ++------------ lib/zcash/cw_zcash.dart | 2 +- tool/configure.dart | 2 +- 4 files changed, 19 insertions(+), 47 deletions(-) diff --git a/cw_zcash/lib/src/zcash_wallet.dart b/cw_zcash/lib/src/zcash_wallet.dart index 14cdf8f66..0a6e192d8 100644 --- a/cw_zcash/lib/src/zcash_wallet.dart +++ b/cw_zcash/lib/src/zcash_wallet.dart @@ -81,6 +81,9 @@ abstract class ZcashWalletBase CryptoCurrency.zec: ZcashBalance.zero(), }); + @observable + bool _orchardMigratable = false; + static const int _autoShieldMinSweep = 30000; // zkool's migrate::MIN_SD. @@ -1251,22 +1254,7 @@ abstract class ZcashWalletBase return migratable; } - Future hasOrchardMigratableBalance() async { - - final (active, migratableOrchard) = await runWithCoin( - accountId: accountId, - func: (final coin) async => ( - await zkool_network.isIronwoodActive(c: coin), - await _migratableOrchardTotal(coin), - ), - ); - - if(!active) { - return false; - } - - return migratableOrchard > BigInt.zero; - } + bool hasOrchardMigratableBalance() => _orchardMigratable; Future _$autoShield() async { if (syncStatus is! SyncedSyncStatus) { @@ -1449,11 +1437,15 @@ abstract class ZcashWalletBase unavailableAmount = sweepable <= BigInt.from(minSweep) ? BigInt.zero : sweepable; } - balance[currency] = ZcashBalance( - Money(availableAmount, currency), - Money(unavailableAmount, currency), - frozen: Money.zero(currency), - ); + runInAction(() { + _orchardMigratable = + ironwoodActive == true && migratableOrchard > BigInt.zero; + balance[currency] = ZcashBalance( + Money(availableAmount, currency), + Money(unavailableAmount, currency), + frozen: Money.zero(currency), + ); + }); } catch (e, stackTrace) { printV("Balance update error: $e"); printV("Stack trace: $stackTrace"); @@ -1784,6 +1776,7 @@ abstract class ZcashWalletBase required final int accountId, required final FutureOr Function(zkool_coin.Coin c) func, }) async { + await runWithCoinMutex.acquire(); var newC = zkool_coin.Coin(); newC = await newC.openDatabase(dbFilepath: c.dbFilepath); newC = await newC.setAccount(account: accountId); @@ -1792,7 +1785,6 @@ abstract class ZcashWalletBase runWithCoinCount++; printV("run with coin: $runWithCoinCount"); - await runWithCoinMutex.acquire(); try { newC = await newC.setAccount(account: accountId); return await func(newC); diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index e74771b1b..994121a90 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -96,7 +96,6 @@ abstract class DashboardViewModelBase with Store { isShowFirstYatIntroduction = false, isShowSecondYatIntroduction = false, isShowThirdYatIntroduction = false, - isMigratingToIronwood = false, filterItems = [], exchangeFilterItems = [], subname = '', @@ -251,8 +250,6 @@ abstract class DashboardViewModelBase with Store { reaction((_) => tradesStore.trades, (_) => tradeMonitor.monitorActiveTrades(wallet.id)); - addZcashMigrationReaction(); - tradeMonitor.monitorActiveTrades(wallet.id); } @@ -377,21 +374,9 @@ abstract class DashboardViewModelBase with Store { ); } - @observable - ReactionDisposer? zcashMigrationReactionDisposer; - - @action - void addZcashMigrationReaction() { - zcashMigrationReactionDisposer?.reaction.dispose(); - zcashMigrationReactionDisposer = null; - - if (wallet.type == WalletType.zcash) { - zcashMigrationReactionDisposer = reaction((_) => wallet.balance.values.first, (_) async { - isMigratingToIronwood = - wallet.type == WalletType.zcash && await zcash!.hasOrchardMigratableBalance(wallet); - }); - } - } + @computed + bool get isMigratingToIronwood => + wallet.type == WalletType.zcash && (zcash?.hasOrchardMigratableBalance(wallet) ?? false); @computed bool get isSyncHeavy { @@ -1289,8 +1274,6 @@ abstract class DashboardViewModelBase with Store { name = wallet.name; loadFilterItems(); - addZcashMigrationReaction(); - if (wallet.type == WalletType.monero) { subname = monero!.getCurrentAccount(wallet).label; @@ -1572,9 +1555,6 @@ abstract class DashboardViewModelBase with Store { } } - @observable - bool isMigratingToIronwood; - String getTransactionType(TransactionInfo tx) { if (wallet.type == WalletType.bitcoin) { if (tx.isReplaced == true) return ' (replaced)'; diff --git a/lib/zcash/cw_zcash.dart b/lib/zcash/cw_zcash.dart index 8abef07dc..525dac193 100644 --- a/lib/zcash/cw_zcash.dart +++ b/lib/zcash/cw_zcash.dart @@ -223,7 +223,7 @@ class CWZcash extends Zcash { } @override - Future hasOrchardMigratableBalance(WalletBase wallet) { + bool hasOrchardMigratableBalance(WalletBase wallet) { return (wallet as ZcashWallet).hasOrchardMigratableBalance(); } } diff --git a/tool/configure.dart b/tool/configure.dart index e3f5f385c..a741c2024 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -1777,7 +1777,7 @@ abstract class Zcash { bool showMissingFundsCard(WalletBase wallet); Future rescanInternalChange(WalletBase wallet); bool ironwoodActive(WalletAddresses walletAddresses); - Future hasOrchardMigratableBalance(WalletBase wallet); + bool hasOrchardMigratableBalance(WalletBase wallet); } """;