Skip to content

Commit

Permalink
fix: Implement totp on exchange to external ticket as well as update …
Browse files Browse the repository at this point in the history
…UI properly when a preset is selected (#1156)

Co-authored-by: OmarHatem <[email protected]>
  • Loading branch information
Blazebrain and OmarHatem28 authored Nov 2, 2023
1 parent d997ee8 commit 9aede1f
Show file tree
Hide file tree
Showing 32 changed files with 88 additions and 9 deletions.
1 change: 1 addition & 0 deletions lib/entities/cake_2fa_preset_options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ enum VerboseControlSettings {
sendsToNonContacts,
sendsToInternalWallets,
exchangesToInternalWallets,
exchangesToExternalWallets,
securityAndBackupSettings,
creatingNewWallets,
}
2 changes: 2 additions & 0 deletions lib/entities/preferences_key.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ class PreferencesKey {
'should_require_totp_2fa_for_sends_to_internal_wallets';
static const shouldRequireTOTP2FAForExchangesToInternalWallets =
'should_require_totp_2fa_for_exchanges_to_internal_wallets';
static const shouldRequireTOTP2FAForExchangesToExternalWallets =
'should_require_totp_2fa_for_exchanges_to_external_wallets';
static const shouldRequireTOTP2FAForAddingContacts =
'should_require_totp_2fa_for_adding_contacts';
static const shouldRequireTOTP2FAForCreatingNewWallets =
Expand Down
11 changes: 11 additions & 0 deletions lib/src/screens/setup_2fa/modify_2fa_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,17 @@ class _2FAControlsWidget extends StatelessWidget {
},
),
StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
Observer(
builder: (context) {
return SettingsSwitcherCell(
title: S.current.require_for_exchanges_to_external_wallets,
value: setup2FAViewModel.shouldRequireTOTP2FAForExchangesToExternalWallets,
onValueChange: (context, value) async =>
setup2FAViewModel.switchShouldRequireTOTP2FAForExchangesToExternalWallets(value),
);
},
),
StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
Observer(
builder: (context) {
return SettingsSwitcherCell(
Expand Down
20 changes: 20 additions & 0 deletions lib/store/settings_store.dart
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ abstract class SettingsStoreBase with Store {
required bool initialShouldRequireTOTP2FAForSendsToNonContact,
required bool initialShouldRequireTOTP2FAForSendsToInternalWallets,
required bool initialShouldRequireTOTP2FAForExchangesToInternalWallets,
required bool initialShouldRequireTOTP2FAForExchangesToExternalWallets,
required bool initialShouldRequireTOTP2FAForAddingContacts,
required bool initialShouldRequireTOTP2FAForCreatingNewWallets,
required bool initialShouldRequireTOTP2FAForAllSecurityAndBackupSettings,
Expand Down Expand Up @@ -118,6 +119,8 @@ abstract class SettingsStoreBase with Store {
initialShouldRequireTOTP2FAForSendsToInternalWallets,
shouldRequireTOTP2FAForExchangesToInternalWallets =
initialShouldRequireTOTP2FAForExchangesToInternalWallets,
shouldRequireTOTP2FAForExchangesToExternalWallets =
initialShouldRequireTOTP2FAForExchangesToExternalWallets,
shouldRequireTOTP2FAForAddingContacts = initialShouldRequireTOTP2FAForAddingContacts,
shouldRequireTOTP2FAForCreatingNewWallets =
initialShouldRequireTOTP2FAForCreatingNewWallets,
Expand Down Expand Up @@ -271,6 +274,12 @@ abstract class SettingsStoreBase with Store {
PreferencesKey.shouldRequireTOTP2FAForExchangesToInternalWallets,
requireTOTP2FAForExchangesToInternalWallets));

reaction(
(_) => shouldRequireTOTP2FAForExchangesToExternalWallets,
(bool requireTOTP2FAForExchangesToExternalWallets) => sharedPreferences.setBool(
PreferencesKey.shouldRequireTOTP2FAForExchangesToExternalWallets,
requireTOTP2FAForExchangesToExternalWallets));

reaction(
(_) => shouldRequireTOTP2FAForAddingContacts,
(bool requireTOTP2FAForAddingContacts) => sharedPreferences.setBool(
Expand Down Expand Up @@ -425,6 +434,9 @@ abstract class SettingsStoreBase with Store {
@observable
bool shouldRequireTOTP2FAForExchangesToInternalWallets;

@observable
bool shouldRequireTOTP2FAForExchangesToExternalWallets;

@observable
Cake2FAPresetsOptions selectedCake2FAPreset;

Expand Down Expand Up @@ -597,6 +609,9 @@ abstract class SettingsStoreBase with Store {
final shouldRequireTOTP2FAForExchangesToInternalWallets = sharedPreferences
.getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToInternalWallets) ??
false;
final shouldRequireTOTP2FAForExchangesToExternalWallets = sharedPreferences
.getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToExternalWallets) ??
false;
final shouldRequireTOTP2FAForAddingContacts =
sharedPreferences.getBool(PreferencesKey.shouldRequireTOTP2FAForAddingContacts) ?? false;
final shouldRequireTOTP2FAForCreatingNewWallets =
Expand Down Expand Up @@ -751,6 +766,8 @@ abstract class SettingsStoreBase with Store {
shouldRequireTOTP2FAForSendsToInternalWallets,
initialShouldRequireTOTP2FAForExchangesToInternalWallets:
shouldRequireTOTP2FAForExchangesToInternalWallets,
initialShouldRequireTOTP2FAForExchangesToExternalWallets:
shouldRequireTOTP2FAForExchangesToExternalWallets,
initialShouldRequireTOTP2FAForAddingContacts: shouldRequireTOTP2FAForAddingContacts,
initialShouldRequireTOTP2FAForCreatingNewWallets: shouldRequireTOTP2FAForCreatingNewWallets,
initialShouldRequireTOTP2FAForAllSecurityAndBackupSettings:
Expand Down Expand Up @@ -835,6 +852,9 @@ abstract class SettingsStoreBase with Store {
shouldRequireTOTP2FAForExchangesToInternalWallets = sharedPreferences
.getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToInternalWallets) ??
false;
shouldRequireTOTP2FAForExchangesToExternalWallets = sharedPreferences
.getBool(PreferencesKey.shouldRequireTOTP2FAForExchangesToExternalWallets) ??
false;
shouldRequireTOTP2FAForAddingContacts =
sharedPreferences.getBool(PreferencesKey.shouldRequireTOTP2FAForAddingContacts) ?? false;
shouldRequireTOTP2FAForCreatingNewWallets =
Expand Down
23 changes: 14 additions & 9 deletions lib/view_model/exchange/exchange_view_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -237,15 +237,21 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
bool get shouldDisplayTOTP2FAForExchangesToInternalWallet =>
_settingsStore.shouldRequireTOTP2FAForExchangesToInternalWallets;

@computed
bool get shouldDisplayTOTP2FAForExchangesToExternalWallet =>
_settingsStore.shouldRequireTOTP2FAForExchangesToExternalWallets;

//* Still open to further optimize these checks
//* It works but can be made better
@action
bool shouldDisplayTOTP() {
final isInternalWallet = checkIfWalletIsAnInternalWallet(receiveAddress);

if (isInternalWallet) {
return shouldDisplayTOTP2FAForExchangesToInternalWallet;
} else {
return shouldDisplayTOTP2FAForExchangesToExternalWallet;
}
return false;
}

@computed
Expand All @@ -263,7 +269,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
(wallet.type == WalletType.bitcoin ||
wallet.type == WalletType.litecoin ||
wallet.type == WalletType.bitcoinCash) &&
depositCurrency == wallet.currency;
depositCurrency == wallet.currency;

bool get isMoneroWallet => wallet.type == WalletType.monero;

Expand All @@ -275,14 +281,11 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
case WalletType.bitcoin:
return transactionPriority == bitcoin!.getBitcoinTransactionPrioritySlow();
case WalletType.litecoin:
return transactionPriority ==
bitcoin!.getLitecoinTransactionPrioritySlow();
return transactionPriority == bitcoin!.getLitecoinTransactionPrioritySlow();
case WalletType.ethereum:
return transactionPriority ==
ethereum!.getEthereumTransactionPrioritySlow();
return transactionPriority == ethereum!.getEthereumTransactionPrioritySlow();
case WalletType.bitcoinCash:
return transactionPriority ==
bitcoinCash!.getBitcoinCashTransactionPrioritySlow();
return transactionPriority == bitcoinCash!.getBitcoinCashTransactionPrioritySlow();
default:
return false;
}
Expand Down Expand Up @@ -535,7 +538,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with

@action
void calculateDepositAllAmount() {
if (wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin || wallet.type == WalletType.bitcoinCash) {
if (wallet.type == WalletType.bitcoin ||
wallet.type == WalletType.litecoin ||
wallet.type == WalletType.bitcoinCash) {
final availableBalance = wallet.balance[wallet.currency]!.available;
final priority = _settingsStore.priority[wallet.type]!;
final fee = wallet.calculateEstimatedFee(priority, null);
Expand Down
14 changes: 14 additions & 0 deletions lib/view_model/set_up_2fa_viewmodel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ abstract class Setup2FAViewModelBase with Store {
bool get shouldRequireTOTP2FAForExchangesToInternalWallets =>
_settingsStore.shouldRequireTOTP2FAForExchangesToInternalWallets;

@computed
bool get shouldRequireTOTP2FAForExchangesToExternalWallets =>
_settingsStore.shouldRequireTOTP2FAForExchangesToExternalWallets;

@computed
bool get shouldRequireTOTP2FAForAddingContacts =>
_settingsStore.shouldRequireTOTP2FAForAddingContacts;
Expand Down Expand Up @@ -277,6 +281,7 @@ abstract class Setup2FAViewModelBase with Store {
switchShouldRequireTOTP2FAForAddingContacts(false);
switchShouldRequireTOTP2FAForCreatingNewWallet(false);
switchShouldRequireTOTP2FAForExchangesToInternalWallets(false);
switchShouldRequireTOTP2FAForExchangesToExternalWallets(false);
switchShouldRequireTOTP2FAForSendsToInternalWallets(false);
switchShouldRequireTOTP2FAForAllSecurityAndBackupSettings(false);
selected2FASettings.clear();
Expand Down Expand Up @@ -306,6 +311,7 @@ abstract class Setup2FAViewModelBase with Store {

@action
void selectCakePreset(Cake2FAPresetsOptions preset) {
setAllControlsToFalse();
presetsMap[preset]?.forEach(toggleControl);
_settingsStore.selectedCake2FAPreset = preset;
}
Expand All @@ -324,6 +330,8 @@ abstract class Setup2FAViewModelBase with Store {
switchShouldRequireTOTP2FAForAllSecurityAndBackupSettings,
VerboseControlSettings.exchangesToInternalWallets:
switchShouldRequireTOTP2FAForExchangesToInternalWallets,
VerboseControlSettings.exchangesToExternalWallets:
switchShouldRequireTOTP2FAForExchangesToExternalWallets,
};

methodsMap[control]?.call(value);
Expand Down Expand Up @@ -359,6 +367,12 @@ abstract class Setup2FAViewModelBase with Store {
updateSelectedSettings(VerboseControlSettings.exchangesToInternalWallets, value);
}

@action
void switchShouldRequireTOTP2FAForExchangesToExternalWallets(bool value) {
_settingsStore.shouldRequireTOTP2FAForExchangesToExternalWallets = value;
updateSelectedSettings(VerboseControlSettings.exchangesToExternalWallets, value);
}

@action
void switchShouldRequireTOTP2FAForAddingContacts(bool value) {
_settingsStore.shouldRequireTOTP2FAForAddingContacts = value;
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ar.arb
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,7 @@
"enter_seed_phrase": "أدخل عبارة البذور الخاصة بك",
"add_contact": "ﻝﺎﺼﺗﺍ ﺔﻬﺟ ﺔﻓﺎﺿﺇ",
"exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
"require_for_exchanges_to_external_wallets": "ﺔﻴﺟﺭﺎﺧ ﻆﻓﺎﺤﻣ ﻰﻟﺇ ﺕﻻﺩﺎﺒﺘﻟﺍ ﺐﻠﻄﺘﺗ",
"camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ",
"switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ"
}
1 change: 1 addition & 0 deletions res/values/strings_bg.arb
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,7 @@
"enter_seed_phrase": "Въведете вашата фраза за семена",
"add_contact": "Добави контакт",
"exchange_provider_unsupported": "${providerName} вече не се поддържа!",
"require_for_exchanges_to_external_wallets": "Изискване за обмен към външни портфейли",
"camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.",
"switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново"
}
1 change: 1 addition & 0 deletions res/values/strings_cs.arb
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,7 @@
"enter_seed_phrase": "Zadejte svou frázi semen",
"add_contact": "Přidat kontakt",
"exchange_provider_unsupported": "${providerName} již není podporováno!",
"require_for_exchanges_to_external_wallets": "Vyžadovat pro výměny do externích peněženek",
"camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.",
"switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu"
}
1 change: 1 addition & 0 deletions res/values/strings_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "Geben Sie Ihre Seed-Phrase ein",
"add_contact": "Kontakt hinzufügen",
"exchange_provider_unsupported": "${providerName} wird nicht mehr unterstützt!",
"require_for_exchanges_to_external_wallets": "Erforderlich für den Umtausch in externe Wallets",
"camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.",
"switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut"
}
1 change: 1 addition & 0 deletions res/values/strings_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,7 @@
"enter_seed_phrase": "Enter your seed phrase",
"add_contact": "Add contact",
"exchange_provider_unsupported": "${providerName} is no longer supported!",
"require_for_exchanges_to_external_wallets": "Require for exchanges to external wallets",
"camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.",
"switchToETHWallet": "Please switch to an Ethereum wallet and try again"
}
1 change: 1 addition & 0 deletions res/values/strings_es.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "Ingrese su frase de semillas",
"add_contact": "Agregar contacto",
"exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
"require_for_exchanges_to_external_wallets": "Requerido para intercambios a billeteras externas",
"camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.",
"switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente."
}
1 change: 1 addition & 0 deletions res/values/strings_fr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "Entrez votre phrase de semence",
"add_contact": "Ajouter le contact",
"exchange_provider_unsupported": "${providerName} n'est plus pris en charge!",
"require_for_exchanges_to_external_wallets": "Exiger des échanges vers des portefeuilles externes",
"camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.",
"switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer"
}
1 change: 1 addition & 0 deletions res/values/strings_ha.arb
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,7 @@
"enter_seed_phrase": "Shigar da Sert Sentarku",
"add_contact": "Ƙara lamba",
"exchange_provider_unsupported": "${providerName}",
"require_for_exchanges_to_external_wallets": "Bukatar musanya zuwa wallet na waje",
"camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.",
"switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa"
}
1 change: 1 addition & 0 deletions res/values/strings_hi.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें",
"add_contact": "संपर्क जोड़ें",
"exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
"require_for_exchanges_to_external_wallets": "बाहरी वॉलेट में एक्सचेंज की आवश्यकता है",
"camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।",
"switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें"
}
1 change: 1 addition & 0 deletions res/values/strings_hr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@
"enter_seed_phrase": "Unesite svoju sjemensku frazu",
"add_contact": "Dodaj kontakt",
"exchange_provider_unsupported": "${providerName} više nije podržan!",
"require_for_exchanges_to_external_wallets": "Zahtijeva razmjene na vanjske novčanike",
"camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.",
"switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno"
}
1 change: 1 addition & 0 deletions res/values/strings_id.arb
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,7 @@
"enter_seed_phrase": "Masukkan frasa benih Anda",
"add_contact": "Tambah kontak",
"exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
"require_for_exchanges_to_external_wallets": "Memerlukan pertukaran ke dompet eksternal",
"camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.",
"switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi"
}
1 change: 1 addition & 0 deletions res/values/strings_it.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "Inserisci la tua frase di semi",
"add_contact": "Aggiungi contatto",
"exchange_provider_unsupported": "${providerName} non è più supportato!",
"require_for_exchanges_to_external_wallets": "Richiede scambi con portafogli esterni",
"camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.",
"switchToETHWallet": "Passa a un portafoglio Ethereum e riprova"
}
1 change: 1 addition & 0 deletions res/values/strings_ja.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "シードフレーズを入力してください",
"add_contact": "連絡先を追加",
"exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
"require_for_exchanges_to_external_wallets": "外部ウォレットへの交換に必要",
"camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。",
"switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください"
}
1 change: 1 addition & 0 deletions res/values/strings_ko.arb
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@
"enter_seed_phrase": "시드 문구를 입력하십시오",
"add_contact": "주소록에 추가",
"exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!",
"require_for_exchanges_to_external_wallets": "외부 지갑으로의 교환을 위해 필요",
"camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.",
"switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요."
}
1 change: 1 addition & 0 deletions res/values/strings_my.arb
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@
"enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ",
"add_contact": "အဆက်အသွယ်ထည့်ပါ။",
"exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!",
"require_for_exchanges_to_external_wallets": "ပြင်ပပိုက်ဆံအိတ်များသို့ လဲလှယ်ရန် လိုအပ်သည်။",
"camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။",
"switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။"
}
1 change: 1 addition & 0 deletions res/values/strings_nl.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "Voer uw zaadzin in",
"add_contact": "Contactpersoon toevoegen",
"exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
"require_for_exchanges_to_external_wallets": "Vereist voor uitwisselingen naar externe portemonnees",
"camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.",
"switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw"
}
1 change: 1 addition & 0 deletions res/values/strings_pl.arb
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,7 @@
"enter_seed_phrase": "Wprowadź swoją frazę nasienną",
"add_contact": "Dodaj kontakt",
"exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
"require_for_exchanges_to_external_wallets": "Wymagaj wymiany na portfele zewnętrzne",
"camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.",
"switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie"
}
Loading

0 comments on commit 9aede1f

Please sign in to comment.