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