From c4c4afb74a3ea9d22443266bdc80340d41e86721 Mon Sep 17 00:00:00 2001
From: Matthew Fosse <matt@fosse.co>
Date: Wed, 3 Jan 2024 16:00:00 -0500
Subject: [PATCH] tor updates

---
 assets/images/tor_icon.png                    | Bin 0 -> 1154 bytes
 lib/core/backup_service.dart                  |   6 +
 lib/di.dart                                   |   5 +-
 lib/entities/preferences_key.dart             |   2 +-
 lib/reactions/fiat_rate_update.dart           |   4 +-
 .../on_current_fiat_api_mode_change.dart      |   2 +-
 lib/reactions/on_current_fiat_change.dart     |   2 +-
 lib/reactions/on_current_wallet_change.dart   |   4 +-
 lib/src/screens/dashboard/dashboard_page.dart |  18 +++
 .../dashboard/widgets/sync_indicator.dart     | 133 ++++++++++--------
 .../settings/connection_sync_page.dart        |  25 ++--
 .../settings/widgets/settings_tor_status.dart |  18 +--
 lib/store/settings_store.dart                 |  48 +++----
 .../dashboard/dashboard_view_model.dart       |  20 ++-
 .../dashboard/home_settings_view_model.dart   |   2 +-
 lib/view_model/settings/tor_connection.dart   |  45 ++++--
 res/values/strings_ar.arb                     |   3 +-
 res/values/strings_bg.arb                     |   3 +-
 res/values/strings_cs.arb                     |   3 +-
 res/values/strings_de.arb                     |   3 +-
 res/values/strings_en.arb                     |   3 +-
 res/values/strings_es.arb                     |   3 +-
 res/values/strings_fr.arb                     |   3 +-
 res/values/strings_ha.arb                     |   3 +-
 res/values/strings_hi.arb                     |   3 +-
 res/values/strings_hr.arb                     |   3 +-
 res/values/strings_id.arb                     |   3 +-
 res/values/strings_it.arb                     |   3 +-
 res/values/strings_ja.arb                     |   3 +-
 res/values/strings_ko.arb                     |   3 +-
 res/values/strings_my.arb                     |   3 +-
 res/values/strings_nl.arb                     |   3 +-
 res/values/strings_pl.arb                     |   3 +-
 res/values/strings_pt.arb                     |   3 +-
 res/values/strings_ru.arb                     |   3 +-
 res/values/strings_th.arb                     |   3 +-
 res/values/strings_tl.arb                     |   3 +-
 res/values/strings_tr.arb                     |   3 +-
 res/values/strings_uk.arb                     |   3 +-
 res/values/strings_ur.arb                     |   3 +-
 res/values/strings_yo.arb                     |   3 +-
 res/values/strings_zh.arb                     |   3 +-
 42 files changed, 251 insertions(+), 161 deletions(-)
 create mode 100644 assets/images/tor_icon.png

diff --git a/assets/images/tor_icon.png b/assets/images/tor_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..44eecfc19de03861767b13edeb04e1ee32a305ec
GIT binary patch
literal 1154
zcmV-|1bzF7P)<h;3K|Lk000e1NJLTq000#L000;W1^@s66^XV;00009a7bBm000XU
z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP<VFdsH1Q$s}K~#7FrBq9c
z990zl?!8sjRXsDAo|qX38fkSSs4%`j145#pI~DQ+oP~?{LU)3oM#QBkZX#k3-MG+|
zy3p0Q2t*<>inwzz2{>e)J>6YhRk!ZTb82Q<aU^L-cVF(QzUO@RJKs5VfC)am4^DNi
zzWeaTFVEli(j@+J5~o^L-v%G%0Wm*`|3sjXl+!+VD1_D|{u6=vfGa8%aKN3D_)i2X
zM3`kzA@JnN(qiYPL3^K_>WCn_LQ14ZWCw|R`$jS1|AC(E7(IN7xIF@EmjXh^8Vgs~
z(8GYb#7a5PA89}R&B+UwcCHJ`V8s1ZZ|!TkEZZUk>75h7)~bE<7^?m*g7>Tkypb4g
z>1(<-x={9K-aGl#rScGH@5`kwT)FIY)wL#vlWFd%GFAfg6HzvI49?Ur#jvT|UZkLl
z0(z?(t3s*M_kaBB>R3|-6v8h%>$}z#h^J;?2RqYoJCjjsDq=SgwGd@9a4sO}%){9L
zl}#f%+QQr&$GgF~<;ySLdtwY~s_J|_DsQVtJ;d!P4F0-??3RVf^oux3+Te_Xam`Ay
zBPcdE(4JdBvAqo;V?^zMbatv6)#8hW|N19q&cspl^<Zlaom=OzyS9neR0?mUS1OU5
zrZWcF%<MnfuU$pw_z4(Yz?3Cj>Jgm6&Y$b#9!^W;!dX2UAkGq0gAu&*Xc618Ka{bG
zQ5U2?Gp)^dN&Y|25lf0G3S@1P%M@tMWaKK|lvL@*^PPc9vlRKx5G~q6?YyN_J-3mr
ziK=hxgC*(9m$99Y*5zP83?;=ToY(^r#>&9lLx8SoVxcIdS|U&)4BCLZ#vU&!R!x_&
ztwaP}YDC1|dc*2;B1Z?t`X+5tQ>zd-+cZDGXO_+)<*3E%SW~V%bxL#2zT6Q!7{Y#s
zMz(gSD+;2WQyBHNPqQQtnBp_8JOe9^+W#14OE^ueWm}MsYqW1#s(A<mmTL-Bq>q+H
zJG}?y8pa&V_Q9&OX>?_~pwwd-Aup;%mIl;W_hTBx*xJmYq_Rb2U<*S%1*<8T9nHSB
z2TOBS%#QVLqzij;RhA|AUg|1P3y=<8qMw&hA{F{WEn7lGe1W21{V%|hE>grY5ZI8|
zCB$+tst}W(q2kF%z98>;|Kder@_H&1X(C9Y&}dlJwh1%@#D!#5y!fI-NaWNhoCQC(
zs2X)%aprIF`#&BizrFm>ITHVk%K4b55ZAIrGqe$xq)L_K4VtPQlWl1iQV>I~nA`Qi
zzVqOxe|&go^sSs->;^B+QF)#-lnx)#h=QTGY_?5rS+PIWxp@RJ=GF_}QOd6zOsGSk
zWALTLZY}*2bog|fCb!@9%%gY5orSd8UeB-maCyUxs-Ma2ry>rYKX(52-hbo&1{N>2
UXcAeY5&!@I07*qoM6N<$g4B5-g8%>k

literal 0
HcmV?d00001

diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart
index 10aed11c2..310310ada 100644
--- a/lib/core/backup_service.dart
+++ b/lib/core/backup_service.dart
@@ -220,6 +220,7 @@ class BackupService {
     final currentLanguageCode = data[PreferencesKey.currentLanguageCode] as String?;
     final displayActionListMode = data[PreferencesKey.displayActionListModeKey] as int?;
     final fiatApiMode = data[PreferencesKey.currentFiatApiModeKey] as int?;
+    final torConnectionMode = data[PreferencesKey.currentTorConnectionModeKey] as int?;
     final shouldStartTorOnLaunch = data[PreferencesKey.shouldStartTorOnLaunch] as bool?;
     final currentPinLength = data[PreferencesKey.currentPinLength] as int?;
     final currentTheme = data[PreferencesKey.currentTheme] as int?;
@@ -317,6 +318,9 @@ class BackupService {
     if (fiatApiMode != null)
       await _sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey, fiatApiMode);
 
+    if (torConnectionMode != null)
+      await _sharedPreferences.setInt(PreferencesKey.currentTorConnectionModeKey, torConnectionMode);
+
     if (shouldStartTorOnLaunch != null)
       await _sharedPreferences.setBool(
           PreferencesKey.shouldStartTorOnLaunch, shouldStartTorOnLaunch);
@@ -556,6 +560,8 @@ class BackupService {
           _sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority),
       PreferencesKey.currentFiatApiModeKey:
           _sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey),
+      PreferencesKey.currentTorConnectionModeKey:
+          _sharedPreferences.getInt(PreferencesKey.currentTorConnectionModeKey),
       PreferencesKey.shouldStartTorOnLaunch:
           _sharedPreferences.getBool(PreferencesKey.shouldStartTorOnLaunch),
       PreferencesKey.selectedCake2FAPreset:
diff --git a/lib/di.dart b/lib/di.dart
index 25e8dd31c..d43b43f88 100644
--- a/lib/di.dart
+++ b/lib/di.dart
@@ -298,8 +298,9 @@ Future<void> setup({
   );
 
   if (DeviceInfo.instance.isMobile && settingsStore.shouldStartTorOnLaunch) {
-    Tor.instance.enable();
-    Tor.instance.start();
+    await Tor.init();
+    await Tor.instance.enable();
+    await Tor.instance.start();
   }
 
   if (_isSetupFinished) {
diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart
index 90787490c..85910a55d 100644
--- a/lib/entities/preferences_key.dart
+++ b/lib/entities/preferences_key.dart
@@ -48,7 +48,7 @@ class PreferencesKey {
   static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1';
   static const syncModeKey = 'sync_mode';
   static const syncAllKey = 'sync_all';
-  static const torConnectionKey = 'tor_connection';
+  static const currentTorConnectionModeKey = 'current_tor_connection_mode';
   static const pinTimeOutDuration = 'pin_timeout_duration';
   static const lastAuthTimeMilliseconds = 'last_auth_time_milliseconds';
   static const lastPopupDate = 'last_popup_date';
diff --git a/lib/reactions/fiat_rate_update.dart b/lib/reactions/fiat_rate_update.dart
index 42988ba1c..5ea60d5ea 100644
--- a/lib/reactions/fiat_rate_update.dart
+++ b/lib/reactions/fiat_rate_update.dart
@@ -34,7 +34,7 @@ Future<void> startFiatRateUpdate(
           crypto: appStore.wallet!.currency,
           fiat: settingsStore.fiatCurrency,
           torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly,
-          onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+          onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
         );
       }
 
@@ -56,7 +56,7 @@ Future<void> startFiatRateUpdate(
               crypto: currency,
               fiat: settingsStore.fiatCurrency,
               torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly,
-              onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+              onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
             );
           }.call();
         }
diff --git a/lib/reactions/on_current_fiat_api_mode_change.dart b/lib/reactions/on_current_fiat_api_mode_change.dart
index cf5688ff5..c56651661 100644
--- a/lib/reactions/on_current_fiat_api_mode_change.dart
+++ b/lib/reactions/on_current_fiat_api_mode_change.dart
@@ -21,7 +21,7 @@ void startCurrentFiatApiModeChangeReaction(
       crypto: appStore.wallet!.currency,
       fiat: settingsStore.fiatCurrency,
       torOnly: fiatApiMode == FiatApiMode.torOnly,
-      onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+      onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
     );
   });
 }
diff --git a/lib/reactions/on_current_fiat_change.dart b/lib/reactions/on_current_fiat_change.dart
index c1b66f099..7656ffce9 100644
--- a/lib/reactions/on_current_fiat_change.dart
+++ b/lib/reactions/on_current_fiat_change.dart
@@ -23,7 +23,7 @@ void startCurrentFiatChangeReaction(
       crypto: cryptoCurrency,
       fiat: fiatCurrency,
       torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly,
-      onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+      onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
     );
   });
 }
diff --git a/lib/reactions/on_current_wallet_change.dart b/lib/reactions/on_current_wallet_change.dart
index 243f4ab85..0eb20bdc3 100644
--- a/lib/reactions/on_current_wallet_change.dart
+++ b/lib/reactions/on_current_wallet_change.dart
@@ -96,7 +96,7 @@ void startCurrentWalletChangeReaction(
         crypto: wallet.currency,
         fiat: settingsStore.fiatCurrency,
         torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly,
-        onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+        onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
       );
 
       Iterable<Erc20Token>? currencies;
@@ -115,7 +115,7 @@ void startCurrentWalletChangeReaction(
               crypto: currency,
               fiat: settingsStore.fiatCurrency,
               torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly,
-              onionOnly: settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+              onionOnly: settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
             );
           }.call();
         }
diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart
index 356c69c00..0dedef736 100644
--- a/lib/src/screens/dashboard/dashboard_page.dart
+++ b/lib/src/screens/dashboard/dashboard_page.dart
@@ -101,6 +101,24 @@ class _DashboardPageView extends BasePage {
   @override
   Widget get endDrawer => MenuWidget(dashboardViewModel);
 
+  // @override
+  // Widget leading(BuildContext context) {
+  //   final torButton = Image.asset(
+  //     'assets/images/tor_icon.png',
+  //     // color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
+  //   );
+
+  //   return Container(
+  //     alignment: Alignment.centerRight,
+  //     width: 40,
+  //     child: TextButton(
+
+  //       onPressed: () => Navigator.of(context, rootNavigator: true).pushNamed(Routes.connectionSync),
+  //       child: Semantics(label: S.of(context).tor_connection, child: torButton),
+  //     ),
+  //   );
+  // }
+
   @override
   Widget middle(BuildContext context) {
     return SyncIndicator(
diff --git a/lib/src/screens/dashboard/widgets/sync_indicator.dart b/lib/src/screens/dashboard/widgets/sync_indicator.dart
index 52e596a83..9ff626658 100644
--- a/lib/src/screens/dashboard/widgets/sync_indicator.dart
+++ b/lib/src/screens/dashboard/widgets/sync_indicator.dart
@@ -1,10 +1,14 @@
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cake_wallet/routes.dart';
 import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
+import 'package:cake_wallet/view_model/settings/tor_connection.dart';
 import 'package:flutter/material.dart';
 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
 import 'package:cake_wallet/core/sync_status_title.dart';
 import 'package:flutter_mobx/flutter_mobx.dart';
 import 'package:cw_core/sync_status.dart';
 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator_icon.dart';
+import 'package:tor/tor.dart';
 
 class SyncIndicator extends StatelessWidget {
   SyncIndicator({required this.dashboardViewModel, required this.onTap});
@@ -14,71 +18,80 @@ class SyncIndicator extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return Observer(
-      builder: (_) {
-        final syncIndicatorWidth = 237.0;
-        final status = dashboardViewModel.status;
-        final statusText = status != null ? syncStatusTitle(status) : '';
-        final progress = status != null ? status.progress() : 0.0;
-        final indicatorOffset = progress * syncIndicatorWidth;
-        final indicatorWidth = progress < 1
-            ? indicatorOffset > 0 ? indicatorOffset : 0.0
-            : syncIndicatorWidth;
+    return Observer(builder: (_) {
+      final syncIndicatorWidth = 237.0;
+      final status = dashboardViewModel.status;
+      final statusText = status != null ? syncStatusTitle(status) : '';
+      final progress = status != null ? status.progress() : 0.0;
+      final indicatorOffset = progress * syncIndicatorWidth;
+      final indicatorWidth = progress < 1
+          ? indicatorOffset > 0
+              ? indicatorOffset
+              : 0.0
+          : syncIndicatorWidth;
 
-
-        return ClipRRect(
+      return ClipRRect(
           borderRadius: BorderRadius.all(Radius.circular(15)),
-          child:  GestureDetector(
+          child: GestureDetector(
             onTap: onTap,
-          child: Container(
-            height: 30,
-            width: syncIndicatorWidth,
-            color: Theme.of(context).extension<SyncIndicatorTheme>()!.notSyncedBackgroundColor,
-            child: Stack(
-              alignment: Alignment.center,
-              children: <Widget>[
-                progress <= 1
-                ? Positioned(
-                    left: 0,
-                    top: 0,
-                    bottom: 0,
-                    child: Container(
-                      width: indicatorWidth,
-                      height: 30,
-                      color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
-                    )
-                )
-                : Offstage(),
-                Padding(
-                  padding: EdgeInsets.only(
-                    left: 24,
-                    right: 24
-                  ),
-                  child: Row(
-                    mainAxisSize: MainAxisSize.max,
-                    mainAxisAlignment: MainAxisAlignment.center,
-                    crossAxisAlignment: CrossAxisAlignment.center,
-                    children: <Widget>[
-                      SyncIndicatorIcon(isSynced:status is SyncedSyncStatus),
-                      Padding(
-                        padding: EdgeInsets.only(left: 6),
-                        child: Text(
-                          statusText,
-                          style: TextStyle(
-                            fontSize: 12,
-                            fontWeight: FontWeight.w500,
-                            color: Theme.of(context).extension<SyncIndicatorTheme>()!.textColor
-                          ),
+            child: Container(
+              height: 30,
+              width: syncIndicatorWidth,
+              color: Theme.of(context).extension<SyncIndicatorTheme>()!.notSyncedBackgroundColor,
+              child: Stack(
+                alignment: Alignment.center,
+                children: <Widget>[
+                  progress <= 1
+                      ? Positioned(
+                          left: 0,
+                          top: 0,
+                          bottom: 0,
+                          child: Container(
+                            width: indicatorWidth,
+                            height: 30,
+                            color: Theme.of(context)
+                                .extension<SyncIndicatorTheme>()!
+                                .syncedBackgroundColor,
+                          ))
+                      : Offstage(),
+                  Row(
+                    children: [
+                      Container(
+                        width: 15,
+                        margin: EdgeInsets.only(left: 12, bottom: 2),
+                        child: Image.asset(
+                          'assets/images/tor_icon.png',
+                          color: dashboardViewModel.isTorConnected ? null : Colors.white,
                         ),
-                      )
+                      ),
                     ],
                   ),
-                )
-              ],
+                  Padding(
+                    padding: EdgeInsets.only(left: 24, right: 24),
+                    child: Row(
+                      mainAxisSize: MainAxisSize.max,
+                      mainAxisAlignment: MainAxisAlignment.center,
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: <Widget>[
+                        SyncIndicatorIcon(isSynced: status is SyncedSyncStatus),
+                        Padding(
+                          padding: EdgeInsets.only(left: 6),
+                          child: Text(
+                            statusText,
+                            style: TextStyle(
+                                fontSize: 12,
+                                fontWeight: FontWeight.w500,
+                                color:
+                                    Theme.of(context).extension<SyncIndicatorTheme>()!.textColor),
+                          ),
+                        )
+                      ],
+                    ),
+                  )
+                ],
+              ),
             ),
-          ),
-        ));
-      }
-    );
+          ));
+    });
   }
-}
\ No newline at end of file
+}
diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart
index 650d4761f..05d8e4f4b 100644
--- a/lib/src/screens/settings/connection_sync_page.dart
+++ b/lib/src/screens/settings/connection_sync_page.dart
@@ -103,20 +103,25 @@ class ConnectionSyncPage extends BasePage {
                     selectedItem: dashboardViewModel.torConnection,
                     onItemSelected: dashboardViewModel.setTorConnection,
                     decoration: BoxDecoration(
-                      borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
+                      borderRadius: BorderRadius.only(
+                          topLeft: Radius.circular(25), topRight: Radius.circular(25)),
                       color: const Color.fromARGB(255, 236, 244, 255),
                     ),
                   );
                 }),
-                TorStatus(
-                  decoration: BoxDecoration(
-                    borderRadius: BorderRadius.only(bottomLeft: Radius.circular(25), bottomRight: Radius.circular(25)),
-                    color: const Color.fromARGB(255, 236, 244, 255),
-                  ),
-                  title: S.current.tor_status,
-                  isSelected: false,
-                  onTap: (context) {},
-                ),
+                Observer(builder: (context) {
+                  return TorStatus(
+                    connected: dashboardViewModel.isTorConnected,
+                    decoration: BoxDecoration(
+                      borderRadius: BorderRadius.only(
+                          bottomLeft: Radius.circular(25), bottomRight: Radius.circular(25)),
+                      color: const Color.fromARGB(255, 236, 244, 255),
+                    ),
+                    title: S.current.tor_status,
+                    isSelected: false,
+                    onTap: (context) {},
+                  );
+                }),
               ]),
             ),
           ],
diff --git a/lib/src/screens/settings/widgets/settings_tor_status.dart b/lib/src/screens/settings/widgets/settings_tor_status.dart
index 394b18997..75c82764f 100644
--- a/lib/src/screens/settings/widgets/settings_tor_status.dart
+++ b/lib/src/screens/settings/widgets/settings_tor_status.dart
@@ -9,29 +9,19 @@ class TorStatus extends StandardListRow {
       {required String title,
       required void Function(BuildContext context) onTap,
       required bool isSelected,
+      required this.connected,
       BoxDecoration? decoration})
       : super(title: title, onTap: onTap, isSelected: isSelected, decoration: decoration);
 
+  final bool connected;
+
   @override
   Widget buildTrailing(BuildContext context) {
     return NodeIndicator(
-      isLive: Tor.instance.started && Tor.instance.enabled,
+      isLive: connected,
       showText: true,
     );
   }
-
-  // @override
-  // Widget buildTrailing(BuildContext context) {
-  //   return GestureDetector(
-  //       onTap: () {},
-  //       child: Container(
-  //           padding: EdgeInsets.all(10),
-  //           decoration: BoxDecoration(
-  //               shape: BoxShape.circle,
-  //               color: Theme.of(context).extension<ReceivePageTheme>()!.iconsBackgroundColor),
-  //           child: Icon(Icons.edit,
-  //               size: 14, color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor)));
-  // }
 }
 
 class NodeHeaderListRow extends StandardListRow {
diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart
index 1bba0eba2..285bad992 100644
--- a/lib/store/settings_store.dart
+++ b/lib/store/settings_store.dart
@@ -60,6 +60,7 @@ abstract class SettingsStoreBase with Store {
       required WalletListOrderType initialWalletListOrder,
       required bool initialWalletListAscending,
       required FiatApiMode initialFiatMode,
+      required TorConnectionMode initialTorConnectionMode,
       required bool initialShouldStartTorOnLaunch,
       required bool initialAllowBiometricalAuthentication,
       required String initialTotpSecretKey,
@@ -71,7 +72,6 @@ abstract class SettingsStoreBase with Store {
       required String initialLanguageCode,
       required SyncMode initialSyncMode,
       required bool initialSyncAll,
-      required TorConnection initialTorConnection,
       // required String initialCurrentLocale,
       required this.appVersion,
       required this.deviceName,
@@ -121,6 +121,7 @@ abstract class SettingsStoreBase with Store {
         autoGenerateSubaddressStatus = initialAutoGenerateSubaddressStatus,
         moneroSeedType = initialMoneroSeedType,
         fiatApiMode = initialFiatMode,
+        torConnectionMode = initialTorConnectionMode,
         shouldStartTorOnLaunch = initialShouldStartTorOnLaunch,
         allowBiometricalAuthentication = initialAllowBiometricalAuthentication,
         selectedCake2FAPreset = initialCake2FAPresetOptions,
@@ -153,7 +154,6 @@ abstract class SettingsStoreBase with Store {
             initialShouldRequireTOTP2FAForAllSecurityAndBackupSettings,
         currentSyncMode = initialSyncMode,
         currentSyncAll = initialSyncAll,
-        currentTorConnection = initialTorConnection,
         priority = ObservableMap<WalletType, TransactionPriority>(),
         defaultBuyProviders = ObservableMap<WalletType, ProviderType>(),
         defaultSellProviders = ObservableMap<WalletType, ProviderType>() {
@@ -317,6 +317,21 @@ abstract class SettingsStoreBase with Store {
         (FiatApiMode mode) =>
             sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey, mode.serialize()));
 
+    reaction((_) => torConnectionMode, (TorConnectionMode mode) async {
+      await sharedPreferences.setInt(PreferencesKey.currentTorConnectionModeKey, mode.serialize());
+
+      if (mode == TorConnectionMode.enabled || mode == TorConnectionMode.onionOnly) {
+        // init and start the proxy
+        await Tor.init();
+        await Tor.instance.enable();
+
+        shouldStartTorOnLaunch = true;
+      } else {
+        Tor.instance.disable();
+        shouldStartTorOnLaunch = false;
+      }
+    });
+
     reaction((_) => shouldStartTorOnLaunch,
         (bool value) => sharedPreferences.setBool(PreferencesKey.shouldStartTorOnLaunch, value));
 
@@ -436,21 +451,6 @@ abstract class SettingsStoreBase with Store {
       _backgroundTasks.registerSyncTask(changeExisting: true);
     });
 
-    reaction((_) => currentTorConnection, (TorConnection torConnection) async {
-      sharedPreferences.setInt(PreferencesKey.torConnectionKey, torConnection.type.index);
-
-      if (torConnection.type == TorConnectionType.enabled) {
-        // Start the proxy
-        await Tor.init();
-        await Tor.instance.start();
-
-        shouldStartTorOnLaunch = true;
-      } else {
-        Tor.instance.disable();
-        shouldStartTorOnLaunch = false;
-      }
-    });
-
     reaction(
         (_) => exchangeStatus,
         (ExchangeApiMode mode) =>
@@ -549,6 +549,9 @@ abstract class SettingsStoreBase with Store {
   @observable
   FiatApiMode fiatApiMode;
 
+  @observable
+  TorConnectionMode torConnectionMode;
+
   @observable
   bool shouldStartTorOnLaunch;
 
@@ -690,9 +693,6 @@ abstract class SettingsStoreBase with Store {
   @observable
   SyncMode currentSyncMode;
 
-  @observable
-  TorConnection currentTorConnection;
-
   @observable
   bool currentSyncAll;
 
@@ -802,6 +802,9 @@ abstract class SettingsStoreBase with Store {
     final currentFiatApiMode = FiatApiMode.deserialize(
         raw: sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey) ??
             FiatApiMode.enabled.raw);
+    final currentTorConnectionMode = TorConnectionMode.deserialize(
+        raw: sharedPreferences.getInt(PreferencesKey.currentTorConnectionModeKey) ??
+            FiatApiMode.enabled.raw);
     final shouldStartTorOnLaunch =
         sharedPreferences.getBool(PreferencesKey.shouldStartTorOnLaunch) ?? false;
     final allowBiometricalAuthentication =
@@ -963,10 +966,6 @@ abstract class SettingsStoreBase with Store {
     });
     final savedSyncAll = sharedPreferences.getBool(PreferencesKey.syncAllKey) ?? true;
 
-    final savedTorConnection = TorConnection.all.firstWhere((element) {
-      return element.type.index == (sharedPreferences.getInt(PreferencesKey.torConnectionKey) ?? 0);
-    });
-
     return SettingsStore(
         sharedPreferences: sharedPreferences,
         initialShouldShowMarketPlaceInDashboard: shouldShowMarketPlaceInDashboard,
@@ -986,6 +985,7 @@ abstract class SettingsStoreBase with Store {
         initialWalletListOrder: walletListOrder,
         initialWalletListAscending: walletListAscending,
         initialFiatMode: currentFiatApiMode,
+        initialTorConnectionMode: currentTorConnectionMode,
         initialShouldStartTorOnLaunch: shouldStartTorOnLaunch,
         initialAllowBiometricalAuthentication: allowBiometricalAuthentication,
         initialCake2FAPresetOptions: selectedCake2FAPreset,
diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart
index 55db250c2..5a8e3545f 100644
--- a/lib/view_model/dashboard/dashboard_view_model.dart
+++ b/lib/view_model/dashboard/dashboard_view_model.dart
@@ -44,6 +44,7 @@ import 'package:eth_sig_util/util/utils.dart';
 import 'package:flutter/services.dart';
 import 'package:mobx/mobx.dart';
 import 'package:cake_wallet/entities/provider_types.dart';
+import 'package:tor/tor.dart';
 
 part 'dashboard_view_model.g.dart';
 
@@ -336,15 +337,13 @@ abstract class DashboardViewModelBase with Store {
   bool hasExchangeAction;
 
   @computed
-  bool get isEnabledBuyAction =>
-      !settingsStore.disableBuy && availableBuyProviders.isNotEmpty;
+  bool get isEnabledBuyAction => !settingsStore.disableBuy && availableBuyProviders.isNotEmpty;
 
   @observable
   bool hasBuyAction;
 
   @computed
-  bool get isEnabledSellAction =>
-      !settingsStore.disableSell && availableSellProviders.isNotEmpty;
+  bool get isEnabledSellAction => !settingsStore.disableSell && availableSellProviders.isNotEmpty;
 
   @observable
   bool hasSellAction;
@@ -462,10 +461,16 @@ abstract class DashboardViewModelBase with Store {
   void setSyncMode(SyncMode syncMode) => settingsStore.currentSyncMode = syncMode;
 
   @computed
-  TorConnection get torConnection => settingsStore.currentTorConnection;
+  TorConnectionMode get torConnectionMode => settingsStore.torConnectionMode;
 
   @action
-  void setTorConnection(TorConnection torConnection) => settingsStore.currentTorConnection = torConnection;
+  void setTorConnectionMode(TorConnectionMode mode) => settingsStore.torConnectionMode = mode;
+
+  @computed
+  bool get isTorConnected =>
+      (settingsStore.torConnectionMode == TorConnectionMode.enabled ||
+          settingsStore.torConnectionMode == TorConnectionMode.onionOnly) &&
+      (Tor.instance.port != -1);
 
   @computed
   bool get syncAll => settingsStore.currentSyncAll;
@@ -475,7 +480,8 @@ abstract class DashboardViewModelBase with Store {
 
   Future<List<String>> checkAffectedWallets() async {
     // await load file
-    final vulnerableSeedsString = await rootBundle.loadString('assets/text/cakewallet_weak_bitcoin_seeds_hashed_sorted_version1.txt');
+    final vulnerableSeedsString = await rootBundle
+        .loadString('assets/text/cakewallet_weak_bitcoin_seeds_hashed_sorted_version1.txt');
     final vulnerableSeeds = vulnerableSeedsString.split("\n");
 
     final walletInfoSource = await CakeHive.openBox<WalletInfo>(WalletInfo.boxName);
diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart
index e78da747d..8dff30fa6 100644
--- a/lib/view_model/dashboard/home_settings_view_model.dart
+++ b/lib/view_model/dashboard/home_settings_view_model.dart
@@ -90,7 +90,7 @@ abstract class HomeSettingsViewModelBase with Store {
         crypto: token,
         fiat: _settingsStore.fiatCurrency,
         torOnly: _settingsStore.fiatApiMode == FiatApiMode.torOnly,
-        onionOnly: _settingsStore.currentTorConnection == TorConnectionType.onionOnly,
+        onionOnly: _settingsStore.torConnectionMode == TorConnectionMode.onionOnly,
       );
     } catch (_) {}
   }
diff --git a/lib/view_model/settings/tor_connection.dart b/lib/view_model/settings/tor_connection.dart
index c0dc628bb..5b3b3b3ae 100644
--- a/lib/view_model/settings/tor_connection.dart
+++ b/lib/view_model/settings/tor_connection.dart
@@ -1,14 +1,39 @@
-enum TorConnectionType { enabled, disabled, onionOnly }
+import 'package:cake_wallet/generated/i18n.dart';
+import 'package:cw_core/enumerable_item.dart';
 
-class TorConnection {
-  TorConnection(this.name, this.type);
+class TorConnectionMode extends EnumerableItem<int> with Serializable<int> {
+  const TorConnectionMode({required String title, required int raw}) : super(title: title, raw: raw);
 
-  final String name;
-  final TorConnectionType type;
+  static const all = [TorConnectionMode.enabled, TorConnectionMode.disabled, TorConnectionMode.onionOnly];
 
-  static final all = [
-    TorConnection("Enabled", TorConnectionType.enabled),
-    TorConnection("Disabled", TorConnectionType.disabled),
-    TorConnection("Onion Only", TorConnectionType.onionOnly),
-  ];
+  static const enabled = TorConnectionMode(raw: 0, title: 'Enabled');
+  static const disabled = TorConnectionMode(raw: 1, title: 'Disabled');
+  static const onionOnly = TorConnectionMode(raw: 2, title: 'Onion only');
+
+  static TorConnectionMode deserialize({required int raw}) {
+    switch (raw) {
+      case 0:
+        return enabled;
+      case 1:
+        return disabled;
+      case 2:
+        return onionOnly;
+      default:
+        throw Exception('Unexpected token: $raw for TorConnectionMode deserialize');
+    }
+  }
+
+  @override
+  String toString() {
+    switch (this) {
+      case TorConnectionMode.enabled:
+        return S.current.enabled;
+      case TorConnectionMode.disabled:
+        return S.current.disabled;
+      case TorConnectionMode.onionOnly:
+        return S.current.onion_only;
+      default:
+        return '';
+    }
+  }
 }
diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb
index 4558fbb8c..3a100f72b 100644
--- a/res/values/strings_ar.arb
+++ b/res/values/strings_ar.arb
@@ -763,5 +763,6 @@
   "start_tor_on_launch": "ابدأ في الإطلاق",
   "tor_status": "وضع تور",
   "connected": "متصل",
-  "disconnected": "انقطع الاتصال"
+  "disconnected": "انقطع الاتصال",
+  "onion_only": "البصل فقط"
 }
\ No newline at end of file
diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb
index 7f62a47c1..8e204ff35 100644
--- a/res/values/strings_bg.arb
+++ b/res/values/strings_bg.arb
@@ -759,5 +759,6 @@
   "start_tor_on_launch": "Стартирайте Tor при стартиране",
   "tor_status": "TOR статус",
   "connected": "Свързани",
-  "disconnected": "Изключен"
+  "disconnected": "Изключен",
+  "onion_only": "Само лук"
 }
\ No newline at end of file
diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb
index 6c0bcbc87..0312f3931 100644
--- a/res/values/strings_cs.arb
+++ b/res/values/strings_cs.arb
@@ -759,5 +759,6 @@
   "start_tor_on_launch": "Začněte tor při spuštění",
   "tor_status": "TOR status",
   "connected": "Připojeno",
-  "disconnected": "Odpojené"
+  "disconnected": "Odpojené",
+  "onion_only": "Pouze cibule"
 }
\ No newline at end of file
diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb
index 4369fb492..f7ded37f5 100644
--- a/res/values/strings_de.arb
+++ b/res/values/strings_de.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Starten Sie den Start",
   "tor_status": "Torstatus",
   "connected": "In Verbindung gebracht",
-  "disconnected": "Getrennt"
+  "disconnected": "Getrennt",
+  "onion_only": "Nur Zwiebel"
 }
\ No newline at end of file
diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb
index 7644d187e..459e66f74 100644
--- a/res/values/strings_en.arb
+++ b/res/values/strings_en.arb
@@ -768,5 +768,6 @@
   "start_tor_on_launch": "Start Tor on launch",
   "tor_status": "Tor status",
   "connected": "Connected",
-  "disconnected": "Disconnected"
+  "disconnected": "Disconnected",
+  "onion_only": "Onion only"
 }
\ No newline at end of file
diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb
index c015f59e5..d592b01b2 100644
--- a/res/values/strings_es.arb
+++ b/res/values/strings_es.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Iniciar tor en el lanzamiento",
   "tor_status": "Estado de Tor",
   "connected": "Conectado",
-  "disconnected": "Desconectado"
+  "disconnected": "Desconectado",
+  "onion_only": "Solo cebolla"
 }
\ No newline at end of file
diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb
index 01243e78d..ec7014239 100644
--- a/res/values/strings_fr.arb
+++ b/res/values/strings_fr.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Démarrez Tor sur le lancement",
   "tor_status": "Statut",
   "connected": "Connecté",
-  "disconnected": "Débranché"
+  "disconnected": "Débranché",
+  "onion_only": "Oignon seulement"
 }
\ No newline at end of file
diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb
index 61d06ad9a..b18721676 100644
--- a/res/values/strings_ha.arb
+++ b/res/values/strings_ha.arb
@@ -749,5 +749,6 @@
   "start_tor_on_launch": "Fara tor a kan shimfiɗa",
   "tor_status": "State State",
   "connected": "Wanda aka haɗa",
-  "disconnected": "Katse"
+  "disconnected": "Katse",
+  "onion_only": "Albasa kawai"
 }
\ No newline at end of file
diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb
index 6c34a93ba..6c0b4a017 100644
--- a/res/values/strings_hi.arb
+++ b/res/values/strings_hi.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "लॉन्च पर टोर शुरू करें",
   "tor_status": "टोर की स्थिति",
   "connected": "जुड़े हुए",
-  "disconnected": "डिस्कनेक्ट किया गया"
+  "disconnected": "डिस्कनेक्ट किया गया",
+  "onion_only": "केवल प्याज"
 }
\ No newline at end of file
diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb
index 8d1532cc8..397eac5ac 100644
--- a/res/values/strings_hr.arb
+++ b/res/values/strings_hr.arb
@@ -765,5 +765,6 @@
   "start_tor_on_launch": "Započnite s lansiranjem",
   "tor_status": "Status tor",
   "connected": "Povezan",
-  "disconnected": "Isključen"
+  "disconnected": "Isključen",
+  "onion_only": "Samo luk"
 }
\ No newline at end of file
diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb
index 091780360..9588922c7 100644
--- a/res/values/strings_id.arb
+++ b/res/values/strings_id.arb
@@ -755,5 +755,6 @@
   "start_tor_on_launch": "Mulailah untuk peluncuran",
   "tor_status": "Status Tor",
   "connected": "Terhubung",
-  "disconnected": "Terputus"
+  "disconnected": "Terputus",
+  "onion_only": "Bawang saja"
 }
\ No newline at end of file
diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb
index fc610c835..cc58cd2c9 100644
--- a/res/values/strings_it.arb
+++ b/res/values/strings_it.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Inizia Tor al lancio",
   "tor_status": "Stato di tor",
   "connected": "Collegato",
-  "disconnected": "Disconnesso"
+  "disconnected": "Disconnesso",
+  "onion_only": "Solo cipolla"
 }
\ No newline at end of file
diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb
index 9a510f0a0..7bdcb9557 100644
--- a/res/values/strings_ja.arb
+++ b/res/values/strings_ja.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "起動時にTORを開始します",
   "tor_status": "TORステータス",
   "connected": "接続",
-  "disconnected": "切断された"
+  "disconnected": "切断された",
+  "onion_only": "オニオンのみ"
 }
\ No newline at end of file
diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb
index 955ec1229..1cc1187c6 100644
--- a/res/values/strings_ko.arb
+++ b/res/values/strings_ko.arb
@@ -765,5 +765,6 @@
   "start_tor_on_launch": "출시시 TOR를 시작하십시오",
   "tor_status": "Tor 상태",
   "connected": "연결",
-  "disconnected": "연결이 끊어졌습니다"
+  "disconnected": "연결이 끊어졌습니다",
+  "onion_only": "양파 만"
 }
\ No newline at end of file
diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb
index 0084a2140..7d302e1d4 100644
--- a/res/values/strings_my.arb
+++ b/res/values/strings_my.arb
@@ -765,5 +765,6 @@
   "start_tor_on_launch": "Tor ကိုဖွင့်ပါ",
   "tor_status": "Tor Status",
   "connected": "ချိတ်ဆက်ထားသော",
-  "disconnected": "ချို့ယွင်းချက်"
+  "disconnected": "ချို့ယွင်းချက်",
+  "onion_only": "သာကြက်သွန်"
 }
\ No newline at end of file
diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb
index e5267d2dc..069c0bdc5 100644
--- a/res/values/strings_nl.arb
+++ b/res/values/strings_nl.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Begin met de lancering",
   "tor_status": "Tor Status",
   "connected": "Verbonden",
-  "disconnected": "Losgekoppeld"
+  "disconnected": "Losgekoppeld",
+  "onion_only": "Alleen ui"
 }
\ No newline at end of file
diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb
index 927f973f9..f672d08ea 100644
--- a/res/values/strings_pl.arb
+++ b/res/values/strings_pl.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Rozpocznij TOR OD LATH",
   "tor_status": "Status TOR",
   "connected": "Połączony",
-  "disconnected": "Bezładny"
+  "disconnected": "Bezładny",
+  "onion_only": "Tylko cebula"
 }
\ No newline at end of file
diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb
index f099c4fb6..48870811e 100644
--- a/res/values/strings_pt.arb
+++ b/res/values/strings_pt.arb
@@ -766,5 +766,6 @@
   "start_tor_on_launch": "Inicie o TOR no lançamento",
   "tor_status": "Status de tor",
   "connected": "Conectado",
-  "disconnected": "Desconectado"
+  "disconnected": "Desconectado",
+  "onion_only": "Apenas cebola"
 }
\ No newline at end of file
diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb
index 91c10bf13..252ddefab 100644
--- a/res/values/strings_ru.arb
+++ b/res/values/strings_ru.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Запустить",
   "tor_status": "ТОР Статус",
   "connected": "Связанный",
-  "disconnected": "Отключен"
+  "disconnected": "Отключен",
+  "onion_only": "Только лук"
 }
\ No newline at end of file
diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb
index 2389a5bc6..ddf7dd956 100644
--- a/res/values/strings_th.arb
+++ b/res/values/strings_th.arb
@@ -765,5 +765,6 @@
   "start_tor_on_launch": "เริ่มต้นเมื่อเปิดตัว",
   "tor_status": "สถานะ tor",
   "connected": "ซึ่งเชื่อมต่อกัน",
-  "disconnected": "ตัดการเชื่อมต่อ"
+  "disconnected": "ตัดการเชื่อมต่อ",
+  "onion_only": "หัวหอมเท่านั้น"
 }
\ No newline at end of file
diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb
index 42f4b5118..63dffb759 100644
--- a/res/values/strings_tl.arb
+++ b/res/values/strings_tl.arb
@@ -761,5 +761,6 @@
   "start_tor_on_launch": "Simulan ang tor sa paglulunsad",
   "tor_status": "Katayuan ng tor",
   "connected": "Konektado",
-  "disconnected": "Naka -disconnect"
+  "disconnected": "Naka -disconnect",
+  "onion_only": "Onion lamang"
 }
\ No newline at end of file
diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb
index df7d2cff7..2d0989fdd 100644
--- a/res/values/strings_tr.arb
+++ b/res/values/strings_tr.arb
@@ -765,5 +765,6 @@
   "start_tor_on_launch": "Lansmanda Tor'a Başla",
   "tor_status": "Tor Durumu",
   "connected": "Bağlı",
-  "disconnected": "Bağlantı kesildi"
+  "disconnected": "Bağlantı kesildi",
+  "onion_only": "Sadece soğan"
 }
\ No newline at end of file
diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb
index c06edaea5..73ba160f8 100644
--- a/res/values/strings_uk.arb
+++ b/res/values/strings_uk.arb
@@ -767,5 +767,6 @@
   "start_tor_on_launch": "Почніть Тор на запуску",
   "tor_status": "Статус Tor",
   "connected": "З'єднаний",
-  "disconnected": "Роз'єднаний"
+  "disconnected": "Роз'єднаний",
+  "onion_only": "Тільки цибуля"
 }
\ No newline at end of file
diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb
index d0118d391..d1d78f58b 100644
--- a/res/values/strings_ur.arb
+++ b/res/values/strings_ur.arb
@@ -759,5 +759,6 @@
   "start_tor_on_launch": "لانچ پر ٹور شروع کریں",
   "tor_status": "ٹور کی حیثیت",
   "connected": "منسلک",
-  "disconnected": "منقطع"
+  "disconnected": "منقطع",
+  "onion_only": "صرف پیاز"
 }
\ No newline at end of file
diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb
index afd4519b9..79ea502c2 100644
--- a/res/values/strings_yo.arb
+++ b/res/values/strings_yo.arb
@@ -761,5 +761,6 @@
   "start_tor_on_launch": "Bẹrẹ tor lori ifilole",
   "tor_status": "Ipo Tor",
   "connected": "Sopọ",
-  "disconnected": "Ge asopọ"
+  "disconnected": "Ge asopọ",
+  "onion_only": "Alubosa nikan"
 }
\ No newline at end of file
diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb
index 864e78b09..0c47be069 100644
--- a/res/values/strings_zh.arb
+++ b/res/values/strings_zh.arb
@@ -766,5 +766,6 @@
   "start_tor_on_launch": "启动TOR发射",
   "tor_status": "TOR状态",
   "connected": "连接的",
-  "disconnected": "断开连接"
+  "disconnected": "断开连接",
+  "onion_only": "仅洋葱"
 }
\ No newline at end of file