Cyjan zec mutex 2 (#3569)

* fix: mutex on zec

* refactor: simplify orchard migratable balance checks and update related methods
This commit is contained in:
cyan
2026-08-27 10:58:22 +08:00
committed by GitHub
parent 06e75551a7
commit 3ba43ede62
4 changed files with 19 additions and 47 deletions
+14 -22
View File
@@ -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<bool> 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<void> _$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<T> 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);
@@ -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)';
+1 -1
View File
@@ -223,7 +223,7 @@ class CWZcash extends Zcash {
}
@override
Future<bool> hasOrchardMigratableBalance(WalletBase wallet) {
bool hasOrchardMigratableBalance(WalletBase wallet) {
return (wallet as ZcashWallet).hasOrchardMigratableBalance();
}
}
+1 -1
View File
@@ -1777,7 +1777,7 @@ abstract class Zcash {
bool showMissingFundsCard(WalletBase wallet);
Future<void> rescanInternalChange(WalletBase wallet);
bool ironwoodActive(WalletAddresses walletAddresses);
Future<bool> hasOrchardMigratableBalance(WalletBase wallet);
bool hasOrchardMigratableBalance(WalletBase wallet);
}
""";