fix: Implement totp on exchange to external ticket as well as update UI properly when a preset is selected (#1156)

Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>

Adegoke David committed Nov 2, 2023 at 19:17 UTC 9aede1f3c18c1cdacc039b50fe41f1b5ac43c4e8
32 files changed +88 -9
lib/entities/cake_2fa_preset_options.dart
+1
@@ -33,6 +33,7 @@ enum VerboseControlSettings {
33 sendsToNonContacts,
34 sendsToInternalWallets,
35 exchangesToInternalWallets,
36 + exchangesToExternalWallets,
37 securityAndBackupSettings,
38 creatingNewWallets,
39 }
lib/entities/preferences_key.dart
+2
@@ -71,6 +71,8 @@ class PreferencesKey {
71 'should_require_totp_2fa_for_sends_to_internal_wallets';
72 static const shouldRequireTOTP2FAForExchangesToInternalWallets =
73 'should_require_totp_2fa_for_exchanges_to_internal_wallets';
74 + static const shouldRequireTOTP2FAForExchangesToExternalWallets =
75 + 'should_require_totp_2fa_for_exchanges_to_external_wallets';
76 static const shouldRequireTOTP2FAForAddingContacts =
77 'should_require_totp_2fa_for_adding_contacts';
78 static const shouldRequireTOTP2FAForCreatingNewWallets =
lib/src/screens/setup_2fa/modify_2fa_page.dart
+11
@@ -133,6 +133,17 @@ class _2FAControlsWidget extends StatelessWidget {
133 },
134 ),
135 StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
136 + Observer(
137 + builder: (context) {
138 + return SettingsSwitcherCell(
139 + title: S.current.require_for_exchanges_to_external_wallets,
140 + value: setup2FAViewModel.shouldRequireTOTP2FAForExchangesToExternalWallets,
141 + onValueChange: (context, value) async =>
142 + setup2FAViewModel.switchShouldRequireTOTP2FAForExchangesToExternalWallets(value),
143 + );
144 + },
145 + ),
146 + StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
147 Observer(
148 builder: (context) {
149 return SettingsSwitcherCell(
lib/store/settings_store.dart
+20
@@ -76,6 +76,7 @@ abstract class SettingsStoreBase with Store {
76 required bool initialShouldRequireTOTP2FAForSendsToNonContact,
77 required bool initialShouldRequireTOTP2FAForSendsToInternalWallets,
78 required bool initialShouldRequireTOTP2FAForExchangesToInternalWallets,
79 + required bool initialShouldRequireTOTP2FAForExchangesToExternalWallets,
80 required bool initialShouldRequireTOTP2FAForAddingContacts,
81 required bool initialShouldRequireTOTP2FAForCreatingNewWallets,
82 required bool initialShouldRequireTOTP2FAForAllSecurityAndBackupSettings,
@@ -118,6 +119,8 @@ abstract class SettingsStoreBase with Store {
119 initialShouldRequireTOTP2FAForSendsToInternalWallets,
120 shouldRequireTOTP2FAForExchangesToInternalWallets =
121 initialShouldRequireTOTP2FAForExchangesToInternalWallets,
122 + shouldRequireTOTP2FAForExchangesToExternalWallets =
123 + initialShouldRequireTOTP2FAForExchangesToExternalWallets,
124 shouldRequireTOTP2FAForAddingContacts = initialShouldRequireTOTP2FAForAddingContacts,
125 shouldRequireTOTP2FAForCreatingNewWallets =
126 initialShouldRequireTOTP2FAForCreatingNewWallets,
@@ -271,6 +274,12 @@ abstract class SettingsStoreBase with Store {
274 PreferencesKey.shouldRequireTOTP2FAForExchangesToInternalWallets,
275 requireTOTP2FAForExchangesToInternalWallets));
276
277 + reaction(
278 + (_) => shouldRequireTOTP2FAForExchangesToExternalWallets,
279 + (bool requireTOTP2FAForExchangesToExternalWallets) => sharedPreferences.setBool(
280 + PreferencesKey.shouldRequireTOTP2FAForExchangesToExternalWallets,
281 + requireTOTP2FAForExchangesToExternalWallets));
282 +
283 reaction(
284 (_) => shouldRequireTOTP2FAForAddingContacts,
285 (bool requireTOTP2FAForAddingContacts) => sharedPreferences.setBool(
@@ -425,6 +434,9 @@ abstract class SettingsStoreBase with Store {
434 @observable
435 bool shouldRequireTOTP2FAForExchangesToInternalWallets;
436
437 + @observable
438 + bool shouldRequireTOTP2FAForExchangesToExternalWallets;
439 +
440 @observable
441 Cake2FAPresetsOptions selectedCake2FAPreset;
442
@@ -597,6 +609,9 @@ abstract class SettingsStoreBase with Store {
609 final shouldRequireTOTP2FAForExchangesToInternalWallets = sharedPreferences
610 .getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToInternalWallets) ??
611 false;
612 + final shouldRequireTOTP2FAForExchangesToExternalWallets = sharedPreferences
613 + .getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToExternalWallets) ??
614 + false;
615 final shouldRequireTOTP2FAForAddingContacts =
616 sharedPreferences.getBool(PreferencesKey.shouldRequireTOTP2FAForAddingContacts) ?? false;
617 final shouldRequireTOTP2FAForCreatingNewWallets =
@@ -751,6 +766,8 @@ abstract class SettingsStoreBase with Store {
766 shouldRequireTOTP2FAForSendsToInternalWallets,
767 initialShouldRequireTOTP2FAForExchangesToInternalWallets:
768 shouldRequireTOTP2FAForExchangesToInternalWallets,
769 + initialShouldRequireTOTP2FAForExchangesToExternalWallets:
770 + shouldRequireTOTP2FAForExchangesToExternalWallets,
771 initialShouldRequireTOTP2FAForAddingContacts: shouldRequireTOTP2FAForAddingContacts,
772 initialShouldRequireTOTP2FAForCreatingNewWallets: shouldRequireTOTP2FAForCreatingNewWallets,
773 initialShouldRequireTOTP2FAForAllSecurityAndBackupSettings:
@@ -835,6 +852,9 @@ abstract class SettingsStoreBase with Store {
852 shouldRequireTOTP2FAForExchangesToInternalWallets = sharedPreferences
853 .getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToInternalWallets) ??
854 false;
855 + shouldRequireTOTP2FAForExchangesToExternalWallets = sharedPreferences
856 + .getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToExternalWallets) ??
857 + false;
858 shouldRequireTOTP2FAForAddingContacts =
859 sharedPreferences.getBool(PreferencesKey.shouldRequireTOTP2FAForAddingContacts) ?? false;
860 shouldRequireTOTP2FAForCreatingNewWallets =
lib/view_model/exchange/exchange_view_model.dart
+14 -9
@@ -237,15 +237,21 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
237 bool get shouldDisplayTOTP2FAForExchangesToInternalWallet =>
238 _settingsStore.shouldRequireTOTP2FAForExchangesToInternalWallets;
239
240 + @computed
241 + bool get shouldDisplayTOTP2FAForExchangesToExternalWallet =>
242 + _settingsStore.shouldRequireTOTP2FAForExchangesToExternalWallets;
243 +
244 //* Still open to further optimize these checks
245 //* It works but can be made better
246 @action
247 bool shouldDisplayTOTP() {
248 final isInternalWallet = checkIfWalletIsAnInternalWallet(receiveAddress);
249 +
250 if (isInternalWallet) {
251 return shouldDisplayTOTP2FAForExchangesToInternalWallet;
252 + } else {
253 + return shouldDisplayTOTP2FAForExchangesToExternalWallet;
254 }
248 - return false;
255 }
256
257 @computed
@@ -263,7 +269,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
269 (wallet.type == WalletType.bitcoin ||
270 wallet.type == WalletType.litecoin ||
271 wallet.type == WalletType.bitcoinCash) &&
266 - depositCurrency == wallet.currency;
272 + depositCurrency == wallet.currency;
273
274 bool get isMoneroWallet => wallet.type == WalletType.monero;
275
@@ -275,14 +281,11 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
281 case WalletType.bitcoin:
282 return transactionPriority == bitcoin!.getBitcoinTransactionPrioritySlow();
283 case WalletType.litecoin:
278 - return transactionPriority ==
279 - bitcoin!.getLitecoinTransactionPrioritySlow();
284 + return transactionPriority == bitcoin!.getLitecoinTransactionPrioritySlow();
285 case WalletType.ethereum:
281 - return transactionPriority ==
282 - ethereum!.getEthereumTransactionPrioritySlow();
286 + return transactionPriority == ethereum!.getEthereumTransactionPrioritySlow();
287 case WalletType.bitcoinCash:
284 - return transactionPriority ==
285 - bitcoinCash!.getBitcoinCashTransactionPrioritySlow();
288 + return transactionPriority == bitcoinCash!.getBitcoinCashTransactionPrioritySlow();
289 default:
290 return false;
291 }
@@ -535,7 +538,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
538
539 @action
540 void calculateDepositAllAmount() {
538 - if (wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin || wallet.type == WalletType.bitcoinCash) {
541 + if (wallet.type == WalletType.bitcoin ||
542 + wallet.type == WalletType.litecoin ||
543 + wallet.type == WalletType.bitcoinCash) {
544 final availableBalance = wallet.balance[wallet.currency]!.available;
545 final priority = _settingsStore.priority[wallet.type]!;
546 final fee = wallet.calculateEstimatedFee(priority, null);
lib/view_model/set_up_2fa_viewmodel.dart
+14
@@ -74,6 +74,10 @@ abstract class Setup2FAViewModelBase with Store {
74 bool get shouldRequireTOTP2FAForExchangesToInternalWallets =>
75 _settingsStore.shouldRequireTOTP2FAForExchangesToInternalWallets;
76
77 + @computed
78 + bool get shouldRequireTOTP2FAForExchangesToExternalWallets =>
79 + _settingsStore.shouldRequireTOTP2FAForExchangesToExternalWallets;
80 +
81 @computed
82 bool get shouldRequireTOTP2FAForAddingContacts =>
83 _settingsStore.shouldRequireTOTP2FAForAddingContacts;
@@ -277,6 +281,7 @@ abstract class Setup2FAViewModelBase with Store {
281 switchShouldRequireTOTP2FAForAddingContacts(false);
282 switchShouldRequireTOTP2FAForCreatingNewWallet(false);
283 switchShouldRequireTOTP2FAForExchangesToInternalWallets(false);
284 + switchShouldRequireTOTP2FAForExchangesToExternalWallets(false);
285 switchShouldRequireTOTP2FAForSendsToInternalWallets(false);
286 switchShouldRequireTOTP2FAForAllSecurityAndBackupSettings(false);
287 selected2FASettings.clear();
@@ -306,6 +311,7 @@ abstract class Setup2FAViewModelBase with Store {
311
312 @action
313 void selectCakePreset(Cake2FAPresetsOptions preset) {
314 + setAllControlsToFalse();
315 presetsMap[preset]?.forEach(toggleControl);
316 _settingsStore.selectedCake2FAPreset = preset;
317 }
@@ -324,6 +330,8 @@ abstract class Setup2FAViewModelBase with Store {
330 switchShouldRequireTOTP2FAForAllSecurityAndBackupSettings,
331 VerboseControlSettings.exchangesToInternalWallets:
332 switchShouldRequireTOTP2FAForExchangesToInternalWallets,
333 + VerboseControlSettings.exchangesToExternalWallets:
334 + switchShouldRequireTOTP2FAForExchangesToExternalWallets,
335 };
336
337 methodsMap[control]?.call(value);
@@ -359,6 +367,12 @@ abstract class Setup2FAViewModelBase with Store {
367 updateSelectedSettings(VerboseControlSettings.exchangesToInternalWallets, value);
368 }
369
370 + @action
371 + void switchShouldRequireTOTP2FAForExchangesToExternalWallets(bool value) {
372 + _settingsStore.shouldRequireTOTP2FAForExchangesToExternalWallets = value;
373 + updateSelectedSettings(VerboseControlSettings.exchangesToExternalWallets, value);
374 + }
375 +
376 @action
377 void switchShouldRequireTOTP2FAForAddingContacts(bool value) {
378 _settingsStore.shouldRequireTOTP2FAForAddingContacts = value;
res/values/strings_ar.arb
+1
@@ -723,6 +723,7 @@
723 "enter_seed_phrase": "أدخل عبارة البذور الخاصة بك",
724 "add_contact": "ﻝﺎﺼﺗﺍ ﺔﻬﺟ ﺔﻓﺎﺿﺇ",
725 "exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
726 + "require_for_exchanges_to_external_wallets": "ﺔﻴﺟﺭﺎﺧ ﻆﻓﺎﺤﻣ ﻰﻟﺇ ﺕﻻﺩﺎﺒﺘﻟﺍ ﺐﻠﻄﺘﺗ",
727 "camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ",
728 "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ"
729 }
res/values/strings_bg.arb
+1
@@ -719,6 +719,7 @@
719 "enter_seed_phrase": "Въведете вашата фраза за семена",
720 "add_contact": "Добави контакт",
721 "exchange_provider_unsupported": "${providerName} вече не се поддържа!",
722 + "require_for_exchanges_to_external_wallets": "Изискване за обмен към външни портфейли",
723 "camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.",
724 "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново"
725 }
res/values/strings_cs.arb
+1
@@ -719,6 +719,7 @@
719 "enter_seed_phrase": "Zadejte svou frázi semen",
720 "add_contact": "Přidat kontakt",
721 "exchange_provider_unsupported": "${providerName} již není podporováno!",
722 + "require_for_exchanges_to_external_wallets": "Vyžadovat pro výměny do externích peněženek",
723 "camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.",
724 "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu"
725 }
res/values/strings_de.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Geben Sie Ihre Seed-Phrase ein",
728 "add_contact": "Kontakt hinzufügen",
729 "exchange_provider_unsupported": "${providerName} wird nicht mehr unterstützt!",
730 + "require_for_exchanges_to_external_wallets": "Erforderlich für den Umtausch in externe Wallets",
731 "camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.",
732 "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut"
733 }
res/values/strings_en.arb
+1
@@ -728,6 +728,7 @@
728 "enter_seed_phrase": "Enter your seed phrase",
729 "add_contact": "Add contact",
730 "exchange_provider_unsupported": "${providerName} is no longer supported!",
731 + "require_for_exchanges_to_external_wallets": "Require for exchanges to external wallets",
732 "camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.",
733 "switchToETHWallet": "Please switch to an Ethereum wallet and try again"
734 }
res/values/strings_es.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Ingrese su frase de semillas",
728 "add_contact": "Agregar contacto",
729 "exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
730 + "require_for_exchanges_to_external_wallets": "Requerido para intercambios a billeteras externas",
731 "camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.",
732 "switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente."
733 }
res/values/strings_fr.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Entrez votre phrase de semence",
728 "add_contact": "Ajouter le contact",
729 "exchange_provider_unsupported": "${providerName} n'est plus pris en charge!",
730 + "require_for_exchanges_to_external_wallets": "Exiger des échanges vers des portefeuilles externes",
731 "camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.",
732 "switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer"
733 }
res/values/strings_ha.arb
+1
@@ -705,6 +705,7 @@
705 "enter_seed_phrase": "Shigar da Sert Sentarku",
706 "add_contact": "Ƙara lamba",
707 "exchange_provider_unsupported": "${providerName}",
708 + "require_for_exchanges_to_external_wallets": "Bukatar musanya zuwa wallet na waje",
709 "camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.",
710 "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa"
711 }
res/values/strings_hi.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें",
728 "add_contact": "संपर्क जोड़ें",
729 "exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
730 + "require_for_exchanges_to_external_wallets": "बाहरी वॉलेट में एक्सचेंज की आवश्यकता है",
731 "camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।",
732 "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें"
733 }
res/values/strings_hr.arb
+1
@@ -725,6 +725,7 @@
725 "enter_seed_phrase": "Unesite svoju sjemensku frazu",
726 "add_contact": "Dodaj kontakt",
727 "exchange_provider_unsupported": "${providerName} više nije podržan!",
728 + "require_for_exchanges_to_external_wallets": "Zahtijeva razmjene na vanjske novčanike",
729 "camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.",
730 "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno"
731 }
res/values/strings_id.arb
+1
@@ -715,6 +715,7 @@
715 "enter_seed_phrase": "Masukkan frasa benih Anda",
716 "add_contact": "Tambah kontak",
717 "exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
718 + "require_for_exchanges_to_external_wallets": "Memerlukan pertukaran ke dompet eksternal",
719 "camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.",
720 "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi"
721 }
res/values/strings_it.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Inserisci la tua frase di semi",
728 "add_contact": "Aggiungi contatto",
729 "exchange_provider_unsupported": "${providerName} non è più supportato!",
730 + "require_for_exchanges_to_external_wallets": "Richiede scambi con portafogli esterni",
731 "camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.",
732 "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova"
733 }
res/values/strings_ja.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "シードフレーズを入力してください",
728 "add_contact": "連絡先を追加",
729 "exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
730 + "require_for_exchanges_to_external_wallets": "外部ウォレットへの交換に必要",
731 "camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。",
732 "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください"
733 }
res/values/strings_ko.arb
+1
@@ -725,6 +725,7 @@
725 "enter_seed_phrase": "시드 문구를 입력하십시오",
726 "add_contact": "주소록에 추가",
727 "exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!",
728 + "require_for_exchanges_to_external_wallets": "외부 지갑으로의 교환을 위해 필요",
729 "camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.",
730 "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요."
731 }
res/values/strings_my.arb
+1
@@ -725,6 +725,7 @@
725 "enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ",
726 "add_contact": "အဆက်အသွယ်ထည့်ပါ။",
727 "exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!",
728 + "require_for_exchanges_to_external_wallets": "ပြင်ပပိုက်ဆံအိတ်များသို့ လဲလှယ်ရန် လိုအပ်သည်။",
729 "camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။",
730 "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။"
731 }
res/values/strings_nl.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Voer uw zaadzin in",
728 "add_contact": "Contactpersoon toevoegen",
729 "exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
730 + "require_for_exchanges_to_external_wallets": "Vereist voor uitwisselingen naar externe portemonnees",
731 "camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.",
732 "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw"
733 }
res/values/strings_pl.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Wprowadź swoją frazę nasienną",
728 "add_contact": "Dodaj kontakt",
729 "exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
730 + "require_for_exchanges_to_external_wallets": "Wymagaj wymiany na portfele zewnętrzne",
731 "camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.",
732 "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie"
733 }
res/values/strings_pt.arb
+1
@@ -726,6 +726,7 @@
726 "enter_seed_phrase": "Digite sua frase de semente",
727 "add_contact": "Adicionar contato",
728 "exchange_provider_unsupported": "${providerName} não é mais suportado!",
729 + "require_for_exchanges_to_external_wallets": "Exigir trocas para carteiras externas",
730 "camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.",
731 "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente"
732 }
res/values/strings_ru.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Введите свою семенную фразу",
728 "add_contact": "Добавить контакт",
729 "exchange_provider_unsupported": "${providerName} больше не поддерживается!",
730 + "require_for_exchanges_to_external_wallets": "Требовать обмена на внешние кошельки",
731 "camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.",
732 "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку."
733 }
res/values/strings_th.arb
+1
@@ -725,6 +725,7 @@
725 "enter_seed_phrase": "ป้อนวลีเมล็ดพันธุ์ของคุณ",
726 "add_contact": "เพิ่มผู้ติดต่อ",
727 "exchange_provider_unsupported": "${providerName} ไม่ได้รับการสนับสนุนอีกต่อไป!",
728 + "require_for_exchanges_to_external_wallets": "จำเป็นต้องแลกเปลี่ยนกับกระเป๋าเงินภายนอก",
729 "camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป",
730 "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง"
731 }
res/values/strings_tl.arb
+1
@@ -722,6 +722,7 @@
722 "enter_seed_phrase": "Ipasok ang iyong pariralang binhi",
723 "add_contact": "Magdagdag ng contact",
724 "exchange_provider_unsupported": "Ang ${providerName} ay hindi na suportado!",
725 + "require_for_exchanges_to_external_wallets": "Kinakailangan para sa mga palitan sa mga panlabas na wallet",
726 "camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.",
727 "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli"
728 }
res/values/strings_tr.arb
+1
@@ -725,6 +725,7 @@
725 "enter_seed_phrase": "Tohum ifadenizi girin",
726 "add_contact": "Kişi ekle",
727 "exchange_provider_unsupported": "${providerName} artık desteklenmiyor!",
728 + "require_for_exchanges_to_external_wallets": "Harici cüzdanlara geçiş yapılmasını zorunlu kılın",
729 "camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.",
730 "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin"
731 }
res/values/strings_uk.arb
+1
@@ -727,6 +727,7 @@
727 "enter_seed_phrase": "Введіть свою насіннєву фразу",
728 "add_contact": "Додати контакт",
729 "exchange_provider_unsupported": "${providerName} більше не підтримується!",
730 + "require_for_exchanges_to_external_wallets": "Потрібен для обміну на зовнішні гаманці",
731 "camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.",
732 "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу"
733 }
res/values/strings_ur.arb
+1
@@ -719,6 +719,7 @@
719 "enter_seed_phrase": "اپنے بیج کا جملہ درج کریں",
720 "add_contact": "۔ﮟﯾﺮﮐ ﻞﻣﺎﺷ ﮧﻄﺑﺍﺭ",
721 "exchange_provider_unsupported": "${providerName} اب تعاون نہیں کیا جاتا ہے!",
722 + "require_for_exchanges_to_external_wallets": "۔ﮯﮨ ﺕﺭﻭﺮﺿ ﯽﮐ ﮯﻟﺩﺎﺒﺗ ﮟﯿﻣ ﮮﻮﭩﺑ ﯽﻧﻭﺮﯿﺑ",
723 "camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ",
724 "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ"
725 }
res/values/strings_yo.arb
+1
@@ -721,6 +721,7 @@
721 "enter_seed_phrase": "Tẹ ọrọ-iru irugbin rẹ",
722 "add_contact": "Fi olubasọrọ kun",
723 "exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!",
724 + "require_for_exchanges_to_external_wallets": "Beere fun awọn paṣipaarọ si awọn apamọwọ ita",
725 "camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.",
726 "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi"
727 }
res/values/strings_zh.arb
+1
@@ -726,6 +726,7 @@
726 "enter_seed_phrase": "输入您的种子短语",
727 "add_contact": "增加联系人",
728 "exchange_provider_unsupported": "${providerName}不再支持!",
729 + "require_for_exchanges_to_external_wallets": "需要兑换到外部钱包",
730 "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。",
731 "switchToETHWallet": "请切换到以太坊钱包并重试"
732 }