From 72a99ab7dd28ff07772faae09f594e275a5236e3 Mon Sep 17 00:00:00 2001 From: OmarHatem <omarh.ismail1@gmail.com> Date: Tue, 4 Jul 2023 04:09:17 +0300 Subject: [PATCH] Fix Enabling/Disabling tokens Fix sorting by fiat once app is opened Improve token availability mechanism --- cw_core/lib/erc20_token.dart | 5 +-- cw_ethereum/lib/ethereum_wallet.dart | 45 ++++++++++++------- lib/reactions/on_current_wallet_change.dart | 13 +++++- .../screens/dashboard/home_settings_page.dart | 2 +- .../dashboard/balance_view_model.dart | 4 +- .../dashboard/home_settings_view_model.dart | 27 +++++++---- 6 files changed, 63 insertions(+), 33 deletions(-) diff --git a/cw_core/lib/erc20_token.dart b/cw_core/lib/erc20_token.dart index 60858953b..bfa60fc03 100644 --- a/cw_core/lib/erc20_token.dart +++ b/cw_core/lib/erc20_token.dart @@ -20,10 +20,7 @@ class Erc20Token extends CryptoCurrency with HiveObjectMixin { bool get enabled => _enabled; - set enabled(bool value) { - _enabled = value; - this.save(); - } + set enabled(bool value) => _enabled = value; Erc20Token({ required this.name, diff --git a/cw_ethereum/lib/ethereum_wallet.dart b/cw_ethereum/lib/ethereum_wallet.dart index c3fc94fac..febdc57b1 100644 --- a/cw_ethereum/lib/ethereum_wallet.dart +++ b/cw_ethereum/lib/ethereum_wallet.dart @@ -305,16 +305,25 @@ abstract class EthereumWalletBase .iconPath; } catch (_) {} - await erc20TokensBox.put(token.contractAddress, Erc20Token( - name: token.name, - symbol: token.symbol, - contractAddress: token.contractAddress, - decimal: token.decimal, - enabled: token.enabled, - iconPath: iconPath, - )); + await erc20TokensBox.put( + token.contractAddress, + Erc20Token( + name: token.name, + symbol: token.symbol, + contractAddress: token.contractAddress, + decimal: token.decimal, + enabled: token.enabled, + iconPath: iconPath, + )); - _updateBalance(); + if (token.enabled) { + balance[token] = await _client.fetchERC20Balances( + _privateKey.address, + token.contractAddress, + ); + } else { + balance.remove(token); + } } Future<void> deleteErc20Token(Erc20Token token) async { @@ -349,14 +358,16 @@ abstract class EthereumWalletBase }; for (var currency in _initialErc20Currencies.keys) { - erc20TokensBox.put(_initialErc20Currencies[currency]!['contractAddress'], Erc20Token( - name: currency.fullName ?? currency.title, - symbol: currency.title, - contractAddress: _initialErc20Currencies[currency]!['contractAddress'], - decimal: _initialErc20Currencies[currency]!['decimal'], - enabled: true, - iconPath: currency.iconPath, - )); + erc20TokensBox.put( + _initialErc20Currencies[currency]!['contractAddress'], + Erc20Token( + name: currency.fullName ?? currency.title, + symbol: currency.title, + contractAddress: _initialErc20Currencies[currency]!['contractAddress'], + decimal: _initialErc20Currencies[currency]!['decimal'], + enabled: true, + iconPath: currency.iconPath, + )); } } } diff --git a/lib/reactions/on_current_wallet_change.dart b/lib/reactions/on_current_wallet_change.dart index 7fdb6b84f..450ca726d 100644 --- a/lib/reactions/on_current_wallet_change.dart +++ b/lib/reactions/on_current_wallet_change.dart @@ -1,6 +1,6 @@ import 'package:cake_wallet/entities/fiat_api_mode.dart'; -import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/entities/update_haven_rate.dart'; +import 'package:cake_wallet/ethereum/ethereum.dart'; import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/balance.dart'; import 'package:cw_core/transaction_info.dart'; @@ -97,6 +97,17 @@ void startCurrentWalletChangeReaction(AppStore appStore, crypto: wallet.currency, fiat: settingsStore.fiatCurrency, torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); + + if (wallet.type == WalletType.ethereum) { + final currencies = ethereum!.getERC20Currencies(appStore.wallet!); + + for (final currency in currencies) { + fiatConversionStore.prices[currency] = await FiatConversionService.fetchPrice( + crypto: currency, + fiat: settingsStore.fiatCurrency, + torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); + } + } } catch (e) { print(e.toString()); } diff --git a/lib/src/screens/dashboard/home_settings_page.dart b/lib/src/screens/dashboard/home_settings_page.dart index 63cd18c8d..465820455 100644 --- a/lib/src/screens/dashboard/home_settings_page.dart +++ b/lib/src/screens/dashboard/home_settings_page.dart @@ -112,7 +112,7 @@ class HomeSettingsPage extends BasePage { "(${token.symbol})", value: token.enabled, onValueChange: (_, bool value) { - _homeSettingsViewModel.changeTokenAvailability(index, value); + _homeSettingsViewModel.changeTokenAvailability(token, value); }, onTap: (_) { Navigator.pushNamed(context, Routes.editToken, arguments: { diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index 22896df55..a9671c917 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -310,10 +310,10 @@ abstract class BalanceViewModelBase with Store { switch (sortBalanceBy) { case SortBalanceBy.FiatBalance: return double.parse(_getFiatBalance( - price: fiatConvertationStore.prices[b.asset]!, + price: fiatConvertationStore.prices[b.asset] ?? 0, cryptoAmount: b.availableBalance)) .compareTo(double.parse(_getFiatBalance( - price: fiatConvertationStore.prices[a.asset]!, + price: fiatConvertationStore.prices[a.asset] ?? 0, cryptoAmount: a.availableBalance))); case SortBalanceBy.GrossBalance: return double.parse(b.availableBalance) diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index 52171bf05..165ae6f4f 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -13,11 +13,16 @@ part 'home_settings_view_model.g.dart'; class HomeSettingsViewModel = HomeSettingsViewModelBase with _$HomeSettingsViewModel; abstract class HomeSettingsViewModelBase with Store { - HomeSettingsViewModelBase(this._settingsStore, this._balanceViewModel); + HomeSettingsViewModelBase(this._settingsStore, this._balanceViewModel) + : tokens = ObservableSet<Erc20Token>() { + _updateTokensList(); + } final SettingsStore _settingsStore; final BalanceViewModel _balanceViewModel; + final ObservableSet<Erc20Token> tokens; + @observable String searchText = ''; @@ -57,14 +62,15 @@ abstract class HomeSettingsViewModelBase with Store { } catch (_) {} } - void changeTokenAvailability(int index, bool value) async { - tokens.elementAt(index).enabled = value; - _balanceViewModel.wallet.updateBalance(); + void changeTokenAvailability(Erc20Token token, bool value) async { + token.enabled = value; + ethereum!.addErc20Token(_balanceViewModel.wallet, token); + _refreshTokensList(); } - @computed - Set<Erc20Token> get tokens { - final Set<Erc20Token> tokens = {}; + @action + void _updateTokensList() { + tokens.clear(); _balanceViewModel.formattedBalances.forEach((e) { if (e.asset is Erc20Token && _matchesSearchText(e.asset as Erc20Token)) { @@ -75,8 +81,13 @@ abstract class HomeSettingsViewModelBase with Store { tokens.addAll(ethereum! .getERC20Currencies(_balanceViewModel.wallet) .where((element) => _matchesSearchText(element))); + } - return tokens; + @action + void _refreshTokensList() { + final _tokens = Set.of(tokens); + tokens.clear(); + tokens.addAll(_tokens); } @action