import 'package:hash_wallet/bitcoin/bitcoin.dart'; import 'package:hash_wallet/di.dart'; import 'package:hash_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:hash_wallet/entities/fiat_api_mode.dart'; import 'package:hash_wallet/entities/wallet_manager.dart'; import 'package:hash_wallet/evm/evm.dart'; import 'package:hash_wallet/reactions/wallet_connect.dart'; import 'package:hash_wallet/utils/tor.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/sync_status.dart'; import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/balance.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; import 'package:hash_wallet/reactions/check_connection.dart'; import 'package:hash_wallet/reactions/on_wallet_sync_status_change.dart'; import 'package:hash_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:hash_wallet/store/app_store.dart'; import 'package:hash_wallet/store/settings_store.dart'; import 'package:hash_wallet/core/fiat_conversion_service.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; ReactionDisposer? _onCurrentWalletChangeReaction; ReactionDisposer? _onCurrentWalletChangeFiatRateUpdateReaction; //ReactionDisposer _onCurrentWalletAddressChangeReaction; void startCurrentWalletChangeReaction( AppStore appStore, SettingsStore settingsStore, FiatConversionStore fiatConversionStore) { _onCurrentWalletChangeReaction?.reaction.dispose(); _onCurrentWalletChangeFiatRateUpdateReaction?.reaction.dispose(); //_onCurrentWalletAddressChangeReaction?.reaction?dispose(); //_onCurrentWalletAddressChangeReaction = reaction((_) => appStore.wallet.walletAddresses.address, //(String address) async { //if (address == appStore.wallet.walletInfo.yatLastUsedAddress) { // return; //} //try { // final yatStore = getIt.get(); // await updateEmojiIdAddress( // appStore.wallet.walletInfo.yatEmojiId, // appStore.wallet.walletAddresses.address, // yatStore.apiKey, // appStore.wallet.type // ); // appStore.wallet.walletInfo.yatLastUsedAddress = address; // await appStore.wallet.walletInfo.save(); //} catch (e) { // printV(e.toString()); //} //}); _onCurrentWalletChangeReaction = reaction((_) => appStore.wallet, (WalletBase, TransactionInfo>? wallet) async { try { if (wallet == null) { return; } await getIt.get().ensureGroupHasHashedIdentifier(wallet); int? chainId; if (isEVMCompatibleChain(wallet.type)) { chainId = evm!.getSelectedChainId(wallet); } final node = settingsStore.getCurrentNode(wallet.type, chainId: chainId); startWalletSyncStatusChangeReaction(wallet, settingsStore); startCheckConnectionReaction(wallet, settingsStore); await Future.delayed(Duration.zero); if (wallet.type == WalletType.monero || wallet.type == WalletType.wownero || wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin || wallet.type == WalletType.bitcoinCash || wallet.type == WalletType.dogecoin) { _setAutoGenerateSubaddressStatus(wallet, settingsStore); } if (wallet.type == WalletType.bitcoin) { bitcoin!.updatePayjoinState(wallet, settingsStore.usePayjoin); } if (settingsStore.currentBuiltinTor) { await ensureTorStarted(context: null); } await wallet.connectToNode(node: node); SyncingSyncStatus.blockHistory.clear(); if (wallet.type == WalletType.nano || wallet.type == WalletType.banano) { final powNode = settingsStore.getCurrentPowNode(wallet.type); await wallet.connectToPowNode(node: powNode); } if (wallet.walletInfo.address.isEmpty) { wallet.walletInfo.address = wallet.walletAddresses.address; await wallet.walletInfo.save(); } if (isEVMCompatibleChain(wallet.type)) { await evm!.discoverAndAddWalletTokens(wallet); } } catch (e) { printV(e.toString()); } }); _onCurrentWalletChangeFiatRateUpdateReaction = reaction((_) => appStore.wallet, (WalletBase, TransactionInfo>? wallet) async { try { if (wallet == null || settingsStore.fiatApiMode == FiatApiMode.disabled) { return; } fiatConversionStore.prices[wallet.currency] = 0; fiatConversionStore.prices[wallet.currency] = await FiatConversionService.fetchPrice( crypto: wallet.currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); Iterable? currencies; if (isEVMCompatibleChain(wallet.type)) { currencies = evm!.getERC20Currencies(appStore.wallet!).where((element) => element.enabled); } if (currencies != null) { for (final currency in currencies) { () async { fiatConversionStore.prices[currency] = await FiatConversionService.fetchPrice( crypto: currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); }.call(); } } } catch (e) { printV(e.toString()); } }); } void _setAutoGenerateSubaddressStatus( WalletBase, TransactionInfo> wallet, SettingsStore settingsStore, ) async { wallet.isEnabledAutoGenerateSubaddress = settingsStore.autoGenerateSubaddressStatus == AutoGenerateSubaddressStatus.enabled || settingsStore.autoGenerateSubaddressStatus == AutoGenerateSubaddressStatus.initialized; }