diff --git a/assets/images/2.0x/pre_seed_dark.png b/assets/images/2.0x/pre_seed_dark.png new file mode 100755 index 000000000..2bb3b8e65 Binary files /dev/null and b/assets/images/2.0x/pre_seed_dark.png differ diff --git a/assets/images/2.0x/pre_seed_light.png b/assets/images/2.0x/pre_seed_light.png new file mode 100755 index 000000000..b198effad Binary files /dev/null and b/assets/images/2.0x/pre_seed_light.png differ diff --git a/assets/images/3.0x/pre_seed_dark.png b/assets/images/3.0x/pre_seed_dark.png new file mode 100755 index 000000000..632f2bb1e Binary files /dev/null and b/assets/images/3.0x/pre_seed_dark.png differ diff --git a/assets/images/3.0x/pre_seed_light.png b/assets/images/3.0x/pre_seed_light.png new file mode 100755 index 000000000..329fce10b Binary files /dev/null and b/assets/images/3.0x/pre_seed_light.png differ diff --git a/assets/images/pre_seed_dark.png b/assets/images/pre_seed_dark.png new file mode 100755 index 000000000..ed12c730a Binary files /dev/null and b/assets/images/pre_seed_dark.png differ diff --git a/assets/images/pre_seed_light.png b/assets/images/pre_seed_light.png new file mode 100755 index 000000000..bb95a6567 Binary files /dev/null and b/assets/images/pre_seed_light.png differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 091116f43..ca92f3f09 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -354,7 +354,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -371,7 +371,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.8; + MARKETING_VERSION = 4.0.9; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -494,7 +494,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -511,7 +511,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.8; + MARKETING_VERSION = 4.0.9; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -528,7 +528,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -545,7 +545,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.0.8; + MARKETING_VERSION = 4.0.9; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index ccc8b83ab..c0eae3189 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -60,7 +60,7 @@ class AddressValidator extends TextValidator { case CryptoCurrency.bnb: return [42]; case CryptoCurrency.btc: - return [33, 34, 42]; + return [33, 34, 42, 62]; case CryptoCurrency.dai: return [42]; case CryptoCurrency.dash: diff --git a/lib/core/execution_state.dart b/lib/core/execution_state.dart index d4e3faeec..18dc81030 100644 --- a/lib/core/execution_state.dart +++ b/lib/core/execution_state.dart @@ -4,7 +4,11 @@ class InitialExecutionState extends ExecutionState {} class IsExecutingState extends ExecutionState {} -class ExecutedSuccessfullyState extends ExecutionState {} +class ExecutedSuccessfullyState extends ExecutionState { + ExecutedSuccessfullyState({this.payload}); + + final dynamic payload; +} class FailureState extends ExecutionState { FailureState(this.error); diff --git a/lib/core/monero_account_label_validator.dart b/lib/core/monero_account_label_validator.dart index dcbac668f..2bc0fcccc 100644 --- a/lib/core/monero_account_label_validator.dart +++ b/lib/core/monero_account_label_validator.dart @@ -7,7 +7,7 @@ class MoneroLabelValidator extends TextValidator { MoneroLabelValidator({@required CryptoCurrency type}) : super( errorMessage: S.current.error_text_account_name, - pattern: '^[a-zA-Z0-9_]{1,15}\$', + pattern: '^[a-zA-Z0-9_ ]{1,15}\$', minLength: 1, maxLength: 15); } diff --git a/lib/di.dart b/lib/di.dart index 59562cad4..12828300d 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -22,6 +22,7 @@ import 'package:cake_wallet/src/screens/nodes/nodes_list_page.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart'; import 'package:cake_wallet/src/screens/rescan/rescan_page.dart'; import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart'; +import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart'; import 'package:cake_wallet/src/screens/send/send_template_page.dart'; import 'package:cake_wallet/src/screens/settings/change_language.dart'; @@ -49,6 +50,7 @@ import 'package:cake_wallet/store/wallet_list_store.dart'; import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart'; import 'package:cake_wallet/view_model/contact_list/contact_view_model.dart'; import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart'; +import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart'; import 'package:cake_wallet/view_model/node_list/node_list_view_model.dart'; import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/rescan_view_model.dart'; @@ -274,7 +276,7 @@ Future setup( getIt.registerFactory(() => MoneroAccountListPage( accountListViewModel: getIt.get())); - getIt.registerFactory(() { + /*getIt.registerFactory(() { final wallet = getIt.get().wallet; if (wallet is MoneroWallet) { @@ -287,7 +289,19 @@ Future setup( getIt.registerFactory(() => MoneroAccountEditOrCreatePage( moneroAccountCreationViewModel: - getIt.get())); + getIt.get()));*/ + + getIt.registerFactoryParam( + (AccountListItem account, _) => MoneroAccountEditOrCreateViewModel( + (getIt.get().wallet as MoneroWallet).accountList, + accountListItem: account)); + + getIt.registerFactoryParam( + (AccountListItem account, _) => MoneroAccountEditOrCreatePage( + moneroAccountCreationViewModel: + getIt.get(param1: account))); getIt.registerFactory(() { final appStore = getIt.get(); @@ -411,4 +425,6 @@ Future setup( void Function(BuildContext, WalletType), bool>( (para1, param2) => NewWalletTypePage(getIt.get(), onTypeSelected: para1, isNewWallet: param2)); + + getIt.registerFactory(() => PreSeedPage()); } diff --git a/lib/entities/node.dart b/lib/entities/node.dart index f307111d2..48f3c9d8e 100644 --- a/lib/entities/node.dart +++ b/lib/entities/node.dart @@ -14,7 +14,8 @@ class Node extends HiveObject with Keyable { {@required this.uri, @required WalletType type, this.login, - this.password}) { + this.password, + this.useSSL}) { this.type = type; } @@ -22,7 +23,8 @@ class Node extends HiveObject with Keyable { : uri = map['uri'] as String ?? '', login = map['login'] as String, password = map['password'] as String, - typeRaw = map['typeRaw'] as int; + typeRaw = map['typeRaw'] as int, + useSSL = map['useSSL'] as bool; static const boxName = 'Nodes'; @@ -38,6 +40,11 @@ class Node extends HiveObject with Keyable { @HiveField(3) int typeRaw; + @HiveField(4) + bool useSSL; + + bool get isSSL => useSSL ?? false; + @override dynamic get keyIndex { _keyIndex ??= key; diff --git a/lib/exchange/exchange_trade_state.dart b/lib/exchange/exchange_trade_state.dart index 324ae9338..109293bec 100644 --- a/lib/exchange/exchange_trade_state.dart +++ b/lib/exchange/exchange_trade_state.dart @@ -14,7 +14,8 @@ class TradeIsCreatedSuccessfully extends ExchangeTradeState { } class TradeIsCreatedFailure extends ExchangeTradeState { - TradeIsCreatedFailure({@required this.error}); + TradeIsCreatedFailure({@required this.title, @required this.error}); + final String title; final String error; } \ No newline at end of file diff --git a/lib/exchange/xmrto/xmrto_exchange_provider.dart b/lib/exchange/xmrto/xmrto_exchange_provider.dart index c57529823..26adaedef 100644 --- a/lib/exchange/xmrto/xmrto_exchange_provider.dart +++ b/lib/exchange/xmrto/xmrto_exchange_provider.dart @@ -12,6 +12,7 @@ import 'package:cake_wallet/exchange/xmrto/xmrto_trade_request.dart'; import 'package:cake_wallet/exchange/trade_not_created_exeption.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/exchange/trade_not_found_exeption.dart'; +import 'package:cake_wallet/generated/i18n.dart'; class XMRTOExchangeProvider extends ExchangeProvider { XMRTOExchangeProvider() @@ -90,12 +91,25 @@ class XMRTOExchangeProvider extends ExchangeProvider { Future createTrade({TradeRequest request}) async { final _request = request as XMRTOTradeRequest; final url = originalApiUri + _orderCreateUriSuffix; + final _amount = _request.isBTCRequest + ? _request.receiveAmount + : _request.amount; + + final _amountCurrency = _request.isBTCRequest + ? _request.to.toString() + : _request.from.toString(); + + final pattern = '^([0-9]+([.\,][0-9]{0,8})?|[.\,][0-9]{1,8})\$'; + final isValid = RegExp(pattern).hasMatch(_amount); + + if (!isValid) { + throw TradeNotCreatedException(description, + description: S.current.xmr_to_error_description); + } + final body = { - 'amount': - _request.isBTCRequest ? _request.receiveAmount : _request.amount, - 'amount_currency': _request.isBTCRequest - ? _request.to.toString() - : _request.from.toString(), + 'amount': _amount, + 'amount_currency': _amountCurrency, 'btc_dest_address': _request.address }; final response = await post(url, diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 7b1ceecc3..beaba8fb3 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -50,6 +50,7 @@ class S implements WidgetsLocalizations { String get card_address => "Address:"; String get change => "Change"; String get change_currency => "Change Currency"; + String get change_current_node_title => "Change current node"; String get change_exchange_provider => "Change Exchange Provider"; String get change_language => "Change language"; String get change_wallet_alert_title => "Change current wallet"; @@ -108,14 +109,18 @@ class S implements WidgetsLocalizations { String get incorrect_seed => "The text entered is not valid."; String get loading_your_wallet => "Loading your wallet"; String get login => "Login"; + String get new_node_testing => "New node testing"; String get new_subaddress_create => "Create"; String get new_subaddress_label_name => "Label name"; String get new_subaddress_title => "New address"; String get new_wallet => "New Wallet"; String get node_address => "Node Address"; + String get node_connection_failed => "Connection was failed"; + String get node_connection_successful => "Connection was successful"; String get node_new => "New Node"; String get node_port => "Node port"; String get node_reset_settings_title => "Reset settings"; + String get node_test => "Test"; String get nodes => "Nodes"; String get nodes_list_reset_to_default_message => "Are you sure that you want to reset settings to default?"; String get offer_expires_in => "Offer expires in: "; @@ -133,6 +138,9 @@ class S implements WidgetsLocalizations { String get please_make_selection => "Please make selection below to create or recover your wallet."; String get please_select => "Please select:"; String get please_try_to_connect_to_another_node => "Please try to connect to another node"; + String get pre_seed_button_text => "I understand. Show me my seed"; + String get pre_seed_description => "On the next page you will see a series of 25 words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app."; + String get pre_seed_title => "IMPORTANT"; String get private_key => "Private key"; String get public_key => "Public key"; String get receive => "Receive"; @@ -295,6 +303,7 @@ class S implements WidgetsLocalizations { String get transactions => "Transactions"; String get transactions_by_date => "Transactions by date"; String get use => "Switch to "; + String get use_ssl => "Use SSL"; String get view_key_private => "View key (private)"; String get view_key_public => "View key (public)"; String get wallet_keys => "Wallet seed/keys"; @@ -317,6 +326,8 @@ class S implements WidgetsLocalizations { String get xmr_available_balance => "Available Balance"; String get xmr_full_balance => "Full Balance"; String get xmr_hidden => "Hidden"; + String get xmr_to_error => "XMR.TO error"; + String get xmr_to_error_description => "Invalid amount. Maximum limit 8 digits after the decimal point"; String get yesterday => "Yesterday"; String get you_will_get => "Convert to"; String get you_will_send => "Convert from"; @@ -337,6 +348,7 @@ class S implements WidgetsLocalizations { String min_value(String value, String currency) => "Min: ${value} ${currency}"; String openalias_alert_content(String recipient_name) => "You will be sending funds to\n${recipient_name}"; String powered_by(String title) => "Powered by ${title}"; + String provider_error(String provider) => "${provider} error"; String router_no_route(String name) => "No route defined for ${name}"; String send_address(String cryptoCurrency) => "${cryptoCurrency} address"; String send_priority(String transactionPriority) => "Currently the fee is set at ${transactionPriority} priority.\nTransaction priority can be adjusted in the settings"; @@ -492,14 +504,22 @@ class $de extends S { @override String get trade_details_pair => "Paar"; @override + String get use_ssl => "Verwenden Sie SSL"; + @override String get choose_wallet_currency => "Bitte wählen Sie die Brieftaschenwährung:"; @override + String get pre_seed_description => "Auf der nächsten Seite sehen Sie eine Reihe von 25 Wörtern. Dies ist Ihr einzigartiger und privater Samen und der EINZIGE Weg, um Ihren Geldbeutel im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet App aufzubewahren."; + @override + String get node_connection_successful => "Die Verbindung war erfolgreich"; + @override String get confirm => "Bestätigen"; @override String get settings_display_balance_as => "Kontostand anzeigen als"; @override String get change_wallet_alert_title => "Ändern Sie die aktuelle Brieftasche"; @override + String get pre_seed_button_text => "Ich verstehe. Zeig mir meinen Samen"; + @override String get placeholder_transactions => "Ihre Transaktionen werden hier angezeigt"; @override String get trade_details_provider => "Anbieter"; @@ -534,6 +554,8 @@ class $de extends S { @override String get contact => "Kontakt"; @override + String get change_current_node_title => "Ändern Sie den aktuellen Knoten"; + @override String get openalias_alert_title => "XMR-Empfänger erkannt"; @override String get auth_store_incorrect_password => "Falsches PIN"; @@ -566,6 +588,8 @@ class $de extends S { @override String get xmr_hidden => "Versteckt"; @override + String get node_connection_failed => "Verbindung fehlgeschlagen"; + @override String get send_xmr => "Senden XMR"; @override String get exchange => "Austausch"; @@ -642,6 +666,8 @@ class $de extends S { @override String get widgets_restore_from_blockheight => "Aus Blockhöhe wiederherstellen"; @override + String get new_node_testing => "Neuer Knotentest"; + @override String get seed_language_chinese => "Chinesisch"; @override String get new_subaddress_label_name => "Markenname"; @@ -750,6 +776,8 @@ class $de extends S { @override String get seed_language_dutch => "Niederländisch"; @override + String get xmr_to_error => "XMR.TO-Fehler"; + @override String get restore_description_from_seed_keys => "Holen Sie sich Ihr Wallet von Seed / Schlüsseln zurück, die Sie an einem sicheren Ort aufbewahrt haben"; @override String get copy => "Kopieren"; @@ -774,6 +802,8 @@ class $de extends S { @override String get change => "Veränderung"; @override + String get node_test => "Test"; + @override String get trade_state_finished => "Fertig"; @override String get pin_is_incorrect => "PIN ist falsch"; @@ -852,6 +882,8 @@ class $de extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Ungültiger Betrag. Höchstgrenze 8 Stellen nach dem Dezimalpunkt"; + @override String get trade_state_confirming => "Bestätigung"; @override String get send => "Senden"; @@ -942,6 +974,8 @@ class $de extends S { @override String get restore_title_from_seed => "Aus Seed wiederherstellen"; @override + String get pre_seed_title => "WICHTIG"; + @override String get restore_description_from_backup => "Sie können die gesamte Cake Wallet-App von wiederherstellen Ihre Sicherungsdatei"; @override String get error_text_node_port => "Der Knotenport kann nur Nummern zwischen 0 und 65535 enthalten"; @@ -1014,6 +1048,8 @@ class $de extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Fehler beim Entfernen ${wallet_name} Wallet. ${error}"; @override + String provider_error(String provider) => "${provider} Error"; + @override String copied_key_to_clipboard(String key) => "Kopiert ${key} Zur Zwischenablage"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "Laden fehlgeschlagen ${wallet_name} Wallet. ${error}"; @@ -1160,14 +1196,22 @@ class $hi extends S { @override String get trade_details_pair => "जोड़ा"; @override + String get use_ssl => "उपयोग SSL"; + @override String get choose_wallet_currency => "कृपया बटुआ मुद्रा चुनें:"; @override + String get pre_seed_description => "अगले पेज पर आपको 25 शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।"; + @override + String get node_connection_successful => "कनेक्शन सफल रहा"; + @override String get confirm => "की पुष्टि करें"; @override String get settings_display_balance_as => "के रूप में संतुलन प्रदर्शित करें"; @override String get change_wallet_alert_title => "वर्तमान बटुआ बदलें"; @override + String get pre_seed_button_text => "मै समझता हुँ। मुझे अपना बीज दिखाओ"; + @override String get placeholder_transactions => "आपके लेनदेन यहां प्रदर्शित होंगे"; @override String get trade_details_provider => "प्रदाता"; @@ -1202,6 +1246,8 @@ class $hi extends S { @override String get contact => "संपर्क करें"; @override + String get change_current_node_title => "वर्तमान नोड बदलें"; + @override String get openalias_alert_title => "XMR प्राप्तकर्ता का पता लगाया"; @override String get auth_store_incorrect_password => "गलत पिन"; @@ -1234,6 +1280,8 @@ class $hi extends S { @override String get xmr_hidden => "छिपा हुआ"; @override + String get node_connection_failed => "कनेक्शन विफल रहा"; + @override String get send_xmr => "संदेश XMR"; @override String get exchange => "अदला बदली"; @@ -1310,6 +1358,8 @@ class $hi extends S { @override String get widgets_restore_from_blockheight => "ब्लॉकचेन से पुनर्स्थापित करें"; @override + String get new_node_testing => "नई नोड परीक्षण"; + @override String get seed_language_chinese => "चीनी"; @override String get new_subaddress_label_name => "लेबल का नाम"; @@ -1418,6 +1468,8 @@ class $hi extends S { @override String get seed_language_dutch => "डच"; @override + String get xmr_to_error => "XMR.TO त्रुटि"; + @override String get restore_description_from_seed_keys => "अपने बटुए को बीज से वापस लें/वे कुंजियाँ जिन्हें आपने सुरक्षित स्थान पर सहेजा है"; @override String get copy => "प्रतिलिपि"; @@ -1442,6 +1494,8 @@ class $hi extends S { @override String get change => "परिवर्तन"; @override + String get node_test => "परीक्षा"; + @override String get trade_state_finished => "ख़त्म होना"; @override String get pin_is_incorrect => "पिन गलत है"; @@ -1520,6 +1574,8 @@ class $hi extends S { @override String get trade_details_id => "आईडी"; @override + String get xmr_to_error_description => "अवैध राशि। दशमलव बिंदु के बाद अधिकतम सीमा 8 अंक"; + @override String get trade_state_confirming => "पुष्टि"; @override String get send => "संदेश"; @@ -1610,6 +1666,8 @@ class $hi extends S { @override String get restore_title_from_seed => "बीज से पुनर्स्थापित करें"; @override + String get pre_seed_title => "महत्वपूर्ण"; + @override String get restore_description_from_backup => "आप से पूरे केक वॉलेट एप्लिकेशन को पुनर्स्थापित कर सकते हैं आपकी बैक-अप फ़ाइल"; @override String get error_text_node_port => "नोड पोर्ट में केवल 0 और 65535 के बीच संख्याएँ हो सकती हैं"; @@ -1682,6 +1740,8 @@ class $hi extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "निकालने में विफल ${wallet_name} बटुआ. ${error}"; @override + String provider_error(String provider) => "${provider} त्रुटि"; + @override String copied_key_to_clipboard(String key) => "की नकल की ${key} क्लिपबोर्ड पर"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "लोड करने में विफल ${wallet_name} बटुआ. ${error}"; @@ -1828,14 +1888,22 @@ class $ru extends S { @override String get trade_details_pair => "Пара"; @override + String get use_ssl => "Использовать SSL"; + @override String get choose_wallet_currency => "Пожалуйста, выберите валюту кошелька:"; @override + String get pre_seed_description => "На следующей странице вы увидите серию из 25 слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet."; + @override + String get node_connection_successful => "Подключение прошло успешно"; + @override String get confirm => "Подтвердить"; @override String get settings_display_balance_as => "Отображать баланс как"; @override String get change_wallet_alert_title => "Изменить текущий кошелек"; @override + String get pre_seed_button_text => "Понятно. Покажите мнемоническую фразу"; + @override String get placeholder_transactions => "Ваши транзакции будут отображаться здесь"; @override String get trade_details_provider => "Провайдер"; @@ -1870,6 +1938,8 @@ class $ru extends S { @override String get contact => "Контакт"; @override + String get change_current_node_title => "Изменить текущую ноду"; + @override String get openalias_alert_title => "Получатель XMR обнаружен"; @override String get auth_store_incorrect_password => "Некорректный PIN"; @@ -1902,6 +1972,8 @@ class $ru extends S { @override String get xmr_hidden => "Скрыто"; @override + String get node_connection_failed => "Подключение не удалось"; + @override String get send_xmr => "Отправить XMR"; @override String get exchange => "Обмен"; @@ -1978,6 +2050,8 @@ class $ru extends S { @override String get widgets_restore_from_blockheight => "Восстановить на высоте блока"; @override + String get new_node_testing => "Тестирование новой ноды"; + @override String get seed_language_chinese => "Китайский"; @override String get new_subaddress_label_name => "Имя"; @@ -2086,6 +2160,8 @@ class $ru extends S { @override String get seed_language_dutch => "Нидерландский"; @override + String get xmr_to_error => "Ошибка XMR.TO"; + @override String get restore_description_from_seed_keys => "Вы можете восстановить кошелёк из мнемонической фразы/ключей, которые вы сохранили ранее"; @override String get copy => "Скопировать"; @@ -2110,6 +2186,8 @@ class $ru extends S { @override String get change => "Изменить"; @override + String get node_test => "Тест"; + @override String get trade_state_finished => "Завершена"; @override String get pin_is_incorrect => "Некорректный PIN"; @@ -2188,6 +2266,8 @@ class $ru extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Недопустимая сумма. Максимум 8 цифр после десятичной точки"; + @override String get trade_state_confirming => "Подтверждение"; @override String get send => "Отправить"; @@ -2278,6 +2358,8 @@ class $ru extends S { @override String get restore_title_from_seed => "Восстановить из мнемонической фразы"; @override + String get pre_seed_title => "ВАЖНО"; + @override String get restore_description_from_backup => "Вы можете восстановить Cake Wallet из вашего back-up файла"; @override String get error_text_node_port => "Порт ноды может содержать только цифры от 0 до 65535"; @@ -2350,6 +2432,8 @@ class $ru extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Ошибка при удалении ${wallet_name} кошелька. ${error}"; @override + String provider_error(String provider) => "${provider} ошибка"; + @override String copied_key_to_clipboard(String key) => "Скопировано ${key} в буфер обмена"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "Ошибка при загрузке ${wallet_name} кошелька. ${error}"; @@ -2496,14 +2580,22 @@ class $ko extends S { @override String get trade_details_pair => "쌍"; @override + String get use_ssl => "SSL 사용"; + @override String get choose_wallet_currency => "지갑 통화를 선택하십시오:"; @override + String get pre_seed_description => "다음 페이지에서 25 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다."; + @override + String get node_connection_successful => "성공적으로 연결되었습니다."; + @override String get confirm => "확인"; @override String get settings_display_balance_as => "잔액 표시"; @override String get change_wallet_alert_title => "현재 지갑 변경"; @override + String get pre_seed_button_text => "이해 했어요. 내 씨앗을 보여줘"; + @override String get placeholder_transactions => "거래가 여기에 표시됩니다"; @override String get trade_details_provider => "공급자"; @@ -2538,6 +2630,8 @@ class $ko extends S { @override String get contact => "접촉"; @override + String get change_current_node_title => "현재 노드 변경"; + @override String get openalias_alert_title => "XMR 수신자 감지"; @override String get auth_store_incorrect_password => "잘못된 PIN"; @@ -2570,6 +2664,8 @@ class $ko extends S { @override String get xmr_hidden => "숨김"; @override + String get node_connection_failed => "연결 실패"; + @override String get send_xmr => "보내다 XMR"; @override String get exchange => "교환"; @@ -2646,6 +2742,8 @@ class $ko extends S { @override String get widgets_restore_from_blockheight => "블록 높이에서 복원"; @override + String get new_node_testing => "새로운 노드 테스트"; + @override String get seed_language_chinese => "중국말"; @override String get new_subaddress_label_name => "라벨 이름"; @@ -2754,6 +2852,8 @@ class $ko extends S { @override String get seed_language_dutch => "네덜란드 사람"; @override + String get xmr_to_error => "XMR.TO 오류"; + @override String get restore_description_from_seed_keys => "안전한 장소에 저장 한 종자 / 키로 지갑을 되 찾으십시오."; @override String get copy => "부"; @@ -2778,6 +2878,8 @@ class $ko extends S { @override String get change => "변화"; @override + String get node_test => "테스트"; + @override String get trade_state_finished => "끝마친"; @override String get pin_is_incorrect => "PIN이 잘못되었습니다"; @@ -2856,6 +2958,8 @@ class $ko extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "금액이 잘못되었습니다. 소수점 이하 최대 8 자리"; + @override String get trade_state_confirming => "확인 중"; @override String get send => "보내다"; @@ -2946,6 +3050,8 @@ class $ko extends S { @override String get restore_title_from_seed => "종자에서 복원"; @override + String get pre_seed_title => "중대한"; + @override String get restore_description_from_backup => "백업 파일에서 전체 Cake Wallet 앱을 복원 할 수 있습니다."; @override String get error_text_node_port => "노드 포트는 0에서 65535 사이의 숫자 만 포함 할 수 있습니다"; @@ -3018,6 +3124,8 @@ class $ko extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "제거하지 못했습니다 ${wallet_name} 지갑. ${error}"; @override + String provider_error(String provider) => "${provider} 오류"; + @override String copied_key_to_clipboard(String key) => "복사 ${key} 클립 보드로"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "불러 오지 못했습니다 ${wallet_name} 지갑. ${error}"; @@ -3164,14 +3272,22 @@ class $pt extends S { @override String get trade_details_pair => "Par"; @override + String get use_ssl => "Use SSL"; + @override String get choose_wallet_currency => "Escolha a moeda da carteira:"; @override + String get pre_seed_description => "Na próxima página, você verá uma série de 25 palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet."; + @override + String get node_connection_successful => "A conexão foi bem sucedida"; + @override String get confirm => "Confirmar"; @override String get settings_display_balance_as => "Saldo a exibir"; @override String get change_wallet_alert_title => "Alterar carteira atual"; @override + String get pre_seed_button_text => "Compreendo. Me mostre minha semente"; + @override String get placeholder_transactions => "Suas transações serão exibidas aqui"; @override String get trade_details_provider => "Provedor"; @@ -3206,6 +3322,8 @@ class $pt extends S { @override String get contact => "Contato"; @override + String get change_current_node_title => "Mudar o nó atual"; + @override String get openalias_alert_title => "Destinatário XMR detectado"; @override String get auth_store_incorrect_password => "PIN incorreto"; @@ -3238,6 +3356,8 @@ class $pt extends S { @override String get xmr_hidden => "Esconder saldo"; @override + String get node_connection_failed => "A conexão falhou"; + @override String get send_xmr => "Enviar XMR"; @override String get exchange => "Trocar"; @@ -3314,6 +3434,8 @@ class $pt extends S { @override String get widgets_restore_from_blockheight => "Restaurar a partir de altura do bloco"; @override + String get new_node_testing => "Teste de novo nó"; + @override String get seed_language_chinese => "Chinesa"; @override String get new_subaddress_label_name => "Nome"; @@ -3422,6 +3544,8 @@ class $pt extends S { @override String get seed_language_dutch => "Holandesa"; @override + String get xmr_to_error => "Erro XMR.TO"; + @override String get restore_description_from_seed_keys => "Restaure a sua carteira a partir de sementes/chaves que você salvou em um local seguro"; @override String get copy => "Copiar"; @@ -3446,6 +3570,8 @@ class $pt extends S { @override String get change => "Mudar"; @override + String get node_test => "Teste"; + @override String get trade_state_finished => "Finalizada"; @override String get pin_is_incorrect => "PIN incorreto"; @@ -3524,6 +3650,8 @@ class $pt extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Montante inválido. Limite máximo de 8 dígitos após o ponto decimal"; + @override String get trade_state_confirming => "Confirmando"; @override String get send => "Enviar"; @@ -3614,6 +3742,8 @@ class $pt extends S { @override String get restore_title_from_seed => "Restaurar a partir de semente"; @override + String get pre_seed_title => "IMPORTANTE"; + @override String get restore_description_from_backup => "Você pode restaurar todo o aplicativo Cake Wallet de seu arquivo de backup"; @override String get error_text_node_port => "A porta do nó deve conter apenas números entre 0 e 65535"; @@ -3686,6 +3816,8 @@ class $pt extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Falha ao remover a carteira ${wallet_name}. ${error}"; @override + String provider_error(String provider) => "${provider} erro"; + @override String copied_key_to_clipboard(String key) => "${key} copiada para a área de transferência"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "Falha ao abrir a carteira ${wallet_name}. ${error}"; @@ -3832,14 +3964,22 @@ class $uk extends S { @override String get trade_details_pair => "Пара"; @override + String get use_ssl => "Використати SSL"; + @override String get choose_wallet_currency => "Будь ласка, виберіть валюту гаманця:"; @override + String get pre_seed_description => "На наступній сторінці ви побачите серію з 25 слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet."; + @override + String get node_connection_successful => "З'єднання було успішним"; + @override String get confirm => "Підтвердити"; @override String get settings_display_balance_as => "Відображати баланс як"; @override String get change_wallet_alert_title => "Змінити поточний гаманець"; @override + String get pre_seed_button_text => "Зрозуміло. Покажіть мнемонічну фразу"; + @override String get placeholder_transactions => "Тут відображатимуться ваші транзакції"; @override String get trade_details_provider => "Провайдер"; @@ -3874,6 +4014,8 @@ class $uk extends S { @override String get contact => "Контакт"; @override + String get change_current_node_title => "Змінити поточний вузол"; + @override String get openalias_alert_title => "Отримувача XMR виявлено"; @override String get auth_store_incorrect_password => "Некоректний PIN"; @@ -3906,6 +4048,8 @@ class $uk extends S { @override String get xmr_hidden => "Приховано"; @override + String get node_connection_failed => "Помилка з’єднання"; + @override String get send_xmr => "Відправити XMR"; @override String get exchange => "Обмін"; @@ -3982,6 +4126,8 @@ class $uk extends S { @override String get widgets_restore_from_blockheight => "Відновити на висоті блоку"; @override + String get new_node_testing => "Тестування нового вузла"; + @override String get seed_language_chinese => "Китайська"; @override String get new_subaddress_label_name => "Ім'я"; @@ -4090,6 +4236,8 @@ class $uk extends S { @override String get seed_language_dutch => "Голландська"; @override + String get xmr_to_error => "Помилка XMR.TO"; + @override String get restore_description_from_seed_keys => "Ви можете відновити гаманець з мнемонічної фрази/ключів, які ви зберегли раніше"; @override String get copy => "Скопіювати"; @@ -4114,6 +4262,8 @@ class $uk extends S { @override String get change => "Змінити"; @override + String get node_test => "Тест"; + @override String get trade_state_finished => "Завершена"; @override String get pin_is_incorrect => "Некоректний PIN"; @@ -4192,6 +4342,8 @@ class $uk extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Неприпустима сума. Максимум 8 цифр після десяткової коми"; + @override String get trade_state_confirming => "Підтвердження"; @override String get send => "Відправити"; @@ -4282,6 +4434,8 @@ class $uk extends S { @override String get restore_title_from_seed => "Відновити з мнемонічної фрази"; @override + String get pre_seed_title => "ВАЖЛИВО"; + @override String get restore_description_from_backup => "Ви можете відновити Cake Wallet з вашого резервного файлу"; @override String get error_text_node_port => "Порт вузла може містити тільки цифри від 0 до 65535"; @@ -4354,6 +4508,8 @@ class $uk extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Помилка при видаленні ${wallet_name} гаманця. ${error}"; @override + String provider_error(String provider) => "${provider} помилка"; + @override String copied_key_to_clipboard(String key) => "Скопійовано ${key} в буфер обміну"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "Помилка при завантаженні ${wallet_name} гаманця. ${error}"; @@ -4500,14 +4656,22 @@ class $ja extends S { @override String get trade_details_pair => "ペア"; @override + String get use_ssl => "SSLを使用する"; + @override String get choose_wallet_currency => "ウォレット通貨を選択してください:"; @override + String get pre_seed_description => "次のページでは、一連の25語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。"; + @override + String get node_connection_successful => "接続に成功しました"; + @override String get confirm => "確認する"; @override String get settings_display_balance_as => "残高を表示"; @override String get change_wallet_alert_title => "現在のウォレットを変更する"; @override + String get pre_seed_button_text => "わかります。 種を見せて"; + @override String get placeholder_transactions => "あなたの取引はここに表示されます"; @override String get trade_details_provider => "プロバイダー"; @@ -4542,6 +4706,8 @@ class $ja extends S { @override String get contact => "接触"; @override + String get change_current_node_title => "現在のノードを変更する"; + @override String get openalias_alert_title => "XMR受信者が検出されました"; @override String get auth_store_incorrect_password => "間違ったPIN"; @@ -4574,6 +4740,8 @@ class $ja extends S { @override String get xmr_hidden => "非表示"; @override + String get node_connection_failed => "接続に失敗しました"; + @override String get send_xmr => "送る XMR"; @override String get exchange => "交換する"; @@ -4650,6 +4818,8 @@ class $ja extends S { @override String get widgets_restore_from_blockheight => "ブロックの高さから復元"; @override + String get new_node_testing => "新しいノードのテスト"; + @override String get seed_language_chinese => "中国語"; @override String get new_subaddress_label_name => "ラベル名"; @@ -4758,6 +4928,8 @@ class $ja extends S { @override String get seed_language_dutch => "オランダの"; @override + String get xmr_to_error => "XMR.TOエラー"; + @override String get restore_description_from_seed_keys => "安全な場所に保存したシード/キーから財布を取り戻す"; @override String get copy => "コピー"; @@ -4782,6 +4954,8 @@ class $ja extends S { @override String get change => "変化する"; @override + String get node_test => "テスト"; + @override String get trade_state_finished => "完成した"; @override String get pin_is_incorrect => "PINが間違っています"; @@ -4860,6 +5034,8 @@ class $ja extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "金額が無効です。 小数点以下8桁の上限"; + @override String get trade_state_confirming => "確認中"; @override String get send => "送る"; @@ -4950,6 +5126,8 @@ class $ja extends S { @override String get restore_title_from_seed => "シードから復元"; @override + String get pre_seed_title => "重要"; + @override String get restore_description_from_backup => "Cake Walletアプリ全体を復元できますバックアップファイル"; @override String get error_text_node_port => "ノードポートには、0〜65535の数字のみを含めることができます"; @@ -5022,6 +5200,8 @@ class $ja extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "削除できませんでした ${wallet_name} 財布. ${error}"; @override + String provider_error(String provider) => "${provider} エラー"; + @override String copied_key_to_clipboard(String key) => "コピー済み ${key} クリップボードへ"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "読み込みに失敗しました ${wallet_name} 財布. ${error}"; @@ -5172,14 +5352,22 @@ class $pl extends S { @override String get trade_details_pair => "Para"; @override + String get use_ssl => "Użyj SSL"; + @override String get choose_wallet_currency => "Wybierz walutę portfela:"; @override + String get pre_seed_description => "Na następnej stronie zobaczysz serię 25 słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet."; + @override + String get node_connection_successful => "Połączenie powiodło się"; + @override String get confirm => "Potwierdzać"; @override String get settings_display_balance_as => "Wyświetl saldo jako"; @override String get change_wallet_alert_title => "Zmień obecny portfel"; @override + String get pre_seed_button_text => "Rozumiem. Pokaż mi moje nasienie"; + @override String get placeholder_transactions => "Twoje transakcje zostaną wyświetlone tutaj"; @override String get trade_details_provider => "Dostawca"; @@ -5214,6 +5402,8 @@ class $pl extends S { @override String get contact => "Kontakt"; @override + String get change_current_node_title => "Zmień bieżący węzeł"; + @override String get openalias_alert_title => "Wykryto odbiorcę XMR"; @override String get auth_store_incorrect_password => "Niepoprawny PIN"; @@ -5246,6 +5436,8 @@ class $pl extends S { @override String get xmr_hidden => "Ukryty"; @override + String get node_connection_failed => "Połączenie nie powiodło się"; + @override String get send_xmr => "Wysłać XMR"; @override String get exchange => "Wymieniać się"; @@ -5322,6 +5514,8 @@ class $pl extends S { @override String get widgets_restore_from_blockheight => "Przywróć z wysokości bloku"; @override + String get new_node_testing => "Testowanie nowych węzłów"; + @override String get seed_language_chinese => "Chiński"; @override String get new_subaddress_label_name => "Nazwa etykiety"; @@ -5430,6 +5624,8 @@ class $pl extends S { @override String get seed_language_dutch => "Holenderski"; @override + String get xmr_to_error => "Pomyłka XMR.TO"; + @override String get restore_description_from_seed_keys => "Odzyskaj swój portfel z nasion / kluczy, które zapisałeś w bezpiecznym miejscu"; @override String get copy => "Kopiuj"; @@ -5454,6 +5650,8 @@ class $pl extends S { @override String get change => "Zmiana"; @override + String get node_test => "Test"; + @override String get trade_state_finished => "Skończone"; @override String get pin_is_incorrect => "PPIN jest niepoprawny"; @@ -5532,6 +5730,8 @@ class $pl extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Nieprawidłowa kwota. Maksymalny limit 8 cyfr po przecinku"; + @override String get trade_state_confirming => "Potwierdzam"; @override String get send => "Wysłać"; @@ -5622,6 +5822,8 @@ class $pl extends S { @override String get restore_title_from_seed => "Przywróć z nasion"; @override + String get pre_seed_title => "WAŻNY"; + @override String get restore_description_from_backup => "Możesz przywrócić całą aplikację Cake Wallet z plik kopii zapasowej"; @override String get error_text_node_port => "Port węzła może zawierać tylko liczby od 0 do 65535"; @@ -5694,6 +5896,8 @@ class $pl extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Nie udało się usunąć ${wallet_name} portfel. ${error}"; @override + String provider_error(String provider) => "${provider} pomyłka"; + @override String copied_key_to_clipboard(String key) => "Skopiowane ${key} do schowka"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "Nie udało się załadować ${wallet_name} portfel. ${error}"; @@ -5840,14 +6044,22 @@ class $es extends S { @override String get trade_details_pair => "Par"; @override + String get use_ssl => "Utilice SSL"; + @override String get choose_wallet_currency => "Por favor, elija la moneda de la billetera:"; @override + String get pre_seed_description => "En la página siguiente verá una serie de 25 palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es SU responsabilidad escribirlo y guardarlo en un lugar seguro fuera de la aplicación Cake Wallet."; + @override + String get node_connection_successful => "La conexión fue exitosa"; + @override String get confirm => "Confirmar"; @override String get settings_display_balance_as => "Mostrar saldo como"; @override String get change_wallet_alert_title => "Cambiar billetera actual"; @override + String get pre_seed_button_text => "Entiendo. Muéstrame mi semilla"; + @override String get placeholder_transactions => "Sus transacciones se mostrarán aquí"; @override String get trade_details_provider => "Proveedor"; @@ -5882,6 +6094,8 @@ class $es extends S { @override String get contact => "Contacto"; @override + String get change_current_node_title => "Cambiar el nodo actual"; + @override String get openalias_alert_title => "Destinatario XMR detectado"; @override String get auth_store_incorrect_password => "Contraseña PIN"; @@ -5914,6 +6128,8 @@ class $es extends S { @override String get xmr_hidden => "Oculto"; @override + String get node_connection_failed => "La conexión falló"; + @override String get send_xmr => "Enviar XMR"; @override String get exchange => "Intercambiar"; @@ -5990,6 +6206,8 @@ class $es extends S { @override String get widgets_restore_from_blockheight => "Restaurar desde blockheight"; @override + String get new_node_testing => "Prueba de nuevos nodos"; + @override String get seed_language_chinese => "Chino"; @override String get new_subaddress_label_name => "Nombre de etiqueta"; @@ -6098,6 +6316,8 @@ class $es extends S { @override String get seed_language_dutch => "Holandés"; @override + String get xmr_to_error => "Error de XMR.TO"; + @override String get restore_description_from_seed_keys => "Recupere su billetera de las semillas/claves que ha guardado en un lugar seguro"; @override String get copy => "Dupdo"; @@ -6122,6 +6342,8 @@ class $es extends S { @override String get change => "Cambio"; @override + String get node_test => "Prueba"; + @override String get trade_state_finished => "Terminado"; @override String get pin_is_incorrect => "PIN es incorrecto"; @@ -6200,6 +6422,8 @@ class $es extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Monto invalido. Límite máximo de 8 dígitos después del punto decimal"; + @override String get trade_state_confirming => "Confirmando"; @override String get send => "Enviar"; @@ -6290,6 +6514,8 @@ class $es extends S { @override String get restore_title_from_seed => "De la semilla"; @override + String get pre_seed_title => "IMPORTANTE"; + @override String get restore_description_from_backup => "Puede restaurar toda la aplicación Cake Wallet desde ysu archivo de respaldo"; @override String get error_text_node_port => "El puerto de nodo solo puede contener números entre 0 y 65535"; @@ -6362,6 +6588,8 @@ class $es extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Error al elimina ${wallet_name} billetera. ${error}"; @override + String provider_error(String provider) => "${provider} error"; + @override String copied_key_to_clipboard(String key) => "Copiado ${key} al portapapeles"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "No se pudo cargar ${wallet_name} la billetera. ${error}"; @@ -6508,14 +6736,22 @@ class $nl extends S { @override String get trade_details_pair => "Paar"; @override + String get use_ssl => "Gebruik SSL"; + @override String get choose_wallet_currency => "Kies een portemonnee-valuta:"; @override + String get pre_seed_description => "Op de volgende pagina ziet u een reeks van 25 woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app."; + @override + String get node_connection_successful => "Verbinding is gelukt"; + @override String get confirm => "Bevestigen"; @override String get settings_display_balance_as => "Toon saldo als"; @override String get change_wallet_alert_title => "Wijzig huidige portemonnee"; @override + String get pre_seed_button_text => "Ik begrijp het. Laat me mijn zaad zien"; + @override String get placeholder_transactions => "Uw transacties worden hier weergegeven"; @override String get trade_details_provider => "Leverancier"; @@ -6550,6 +6786,8 @@ class $nl extends S { @override String get contact => "Contact"; @override + String get change_current_node_title => "Wijzig het huidige knooppunt"; + @override String get openalias_alert_title => "XMR-ontvanger gedetecteerd"; @override String get auth_store_incorrect_password => "Incorrect PIN"; @@ -6582,6 +6820,8 @@ class $nl extends S { @override String get xmr_hidden => "Verborgen"; @override + String get node_connection_failed => "De verbinding is mislukt"; + @override String get send_xmr => "Sturen XMR"; @override String get exchange => "Uitwisseling"; @@ -6658,6 +6898,8 @@ class $nl extends S { @override String get widgets_restore_from_blockheight => "Herstel vanaf blockheight"; @override + String get new_node_testing => "Nieuwe knooppunttest"; + @override String get seed_language_chinese => "Chinese"; @override String get new_subaddress_label_name => "Label naam"; @@ -6766,6 +7008,8 @@ class $nl extends S { @override String get seed_language_dutch => "Nederlands"; @override + String get xmr_to_error => "XMR.TO-fout"; + @override String get restore_description_from_seed_keys => "Ontvang uw portemonnee terug uit seed / keys die u hebt opgeslagen op een veilige plaats"; @override String get copy => "Kopiëren"; @@ -6790,6 +7034,8 @@ class $nl extends S { @override String get change => "Verandering"; @override + String get node_test => "Test"; + @override String get trade_state_finished => "Afgewerkt"; @override String get pin_is_incorrect => "PIN is onjuist"; @@ -6868,6 +7114,8 @@ class $nl extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "Ongeldige hoeveelheid. Maximaal 8 cijfers achter de komma"; + @override String get trade_state_confirming => "Bevestiging"; @override String get send => "Sturen"; @@ -6958,6 +7206,8 @@ class $nl extends S { @override String get restore_title_from_seed => "Herstel van zaad"; @override + String get pre_seed_title => "BELANGRIJK"; + @override String get restore_description_from_backup => "Je kunt de hele Cake Wallet-app herstellen van uw back-upbestand"; @override String get error_text_node_port => "Knooppuntpoort kan alleen nummers tussen 0 en 65535 bevatten"; @@ -7030,6 +7280,8 @@ class $nl extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "Verwijderen mislukt ${wallet_name} portemonnee. ${error}"; @override + String provider_error(String provider) => "${provider} fout"; + @override String copied_key_to_clipboard(String key) => "Gekopieerd ${key} naar het klembord"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "Laden mislukt ${wallet_name} portemonnee. ${error}"; @@ -7176,14 +7428,22 @@ class $zh extends S { @override String get trade_details_pair => "对"; @override + String get use_ssl => "使用SSL"; + @override String get choose_wallet_currency => "請選擇錢包貨幣:"; @override + String get pre_seed_description => "在下一頁上,您將看到一系列25個單詞。 這是您獨特的私人種子,是丟失或出現故障時恢復錢包的唯一方法。 您有責任將其寫下並存儲在Cake Wallet應用程序外部的安全地方。"; + @override + String get node_connection_successful => "連接成功"; + @override String get confirm => "确认"; @override String get settings_display_balance_as => "将余额显示为"; @override String get change_wallet_alert_title => "更換當前錢包"; @override + String get pre_seed_button_text => "我明白。 給我看我的種子"; + @override String get placeholder_transactions => "您的交易將顯示在這裡"; @override String get trade_details_provider => "提供者"; @@ -7218,6 +7478,8 @@ class $zh extends S { @override String get contact => "联系"; @override + String get change_current_node_title => "更改當前節點"; + @override String get openalias_alert_title => "檢測到XMR收件人"; @override String get auth_store_incorrect_password => "PIN码错误"; @@ -7250,6 +7512,8 @@ class $zh extends S { @override String get xmr_hidden => "隱"; @override + String get node_connection_failed => "連接失敗"; + @override String get send_xmr => "发送 XMR"; @override String get exchange => "交换"; @@ -7326,6 +7590,8 @@ class $zh extends S { @override String get widgets_restore_from_blockheight => "从块高还原"; @override + String get new_node_testing => "新節點測試"; + @override String get seed_language_chinese => "中文"; @override String get new_subaddress_label_name => "标签名称"; @@ -7434,6 +7700,8 @@ class $zh extends S { @override String get seed_language_dutch => "荷蘭人"; @override + String get xmr_to_error => "XMR.TO錯誤"; + @override String get restore_description_from_seed_keys => "从保存到安全地方的种子/钥匙取回钱包"; @override String get copy => "复制"; @@ -7458,6 +7726,8 @@ class $zh extends S { @override String get change => "更改"; @override + String get node_test => "測試"; + @override String get trade_state_finished => "已完成"; @override String get pin_is_incorrect => "PIN码不正确"; @@ -7536,6 +7806,8 @@ class $zh extends S { @override String get trade_details_id => "ID"; @override + String get xmr_to_error_description => "無效的金額。 小數點後最多8位數字"; + @override String get trade_state_confirming => "确认中"; @override String get send => "发送"; @@ -7626,6 +7898,8 @@ class $zh extends S { @override String get restore_title_from_seed => "从种子还原"; @override + String get pre_seed_title => "重要"; + @override String get restore_description_from_backup => "您可以从还原整个Cake Wallet应用您的备份文件"; @override String get error_text_node_port => "节点端口只能包含0到65535之间的数字"; @@ -7698,6 +7972,8 @@ class $zh extends S { @override String wallet_list_failed_to_remove(String wallet_name, String error) => "删除失败 ${wallet_name} 钱包. ${error}"; @override + String provider_error(String provider) => "${provider} 錯誤"; + @override String copied_key_to_clipboard(String key) => "复制 ${key} 到剪贴板"; @override String wallet_list_failed_to_load(String wallet_name, String error) => "加载失败 ${wallet_name} 钱包. ${error}"; diff --git a/lib/monero/monero_wallet.dart b/lib/monero/monero_wallet.dart index 2d4878b4c..c7e2cff44 100644 --- a/lib/monero/monero_wallet.dart +++ b/lib/monero/monero_wallet.dart @@ -40,6 +40,10 @@ abstract class MoneroWalletBase extends WalletBase with Store { fullBalance: monero_wallet.getFullBalance(accountIndex: 0), unlockedBalance: monero_wallet.getFullBalance(accountIndex: 0)); _onAccountChangeReaction = reaction((_) => account, (Account account) { + balance = MoneroBalance( + fullBalance: monero_wallet.getFullBalance(accountIndex: account.id), + unlockedBalance: + monero_wallet.getUnlockedBalance(accountIndex: account.id)); subaddressList.update(accountIndex: account.id); subaddress = subaddressList.subaddresses.first; address = subaddress.address; @@ -94,7 +98,7 @@ abstract class MoneroWalletBase extends WalletBase with Store { bool _isSavingAfterNewTransaction; Future init() async { - await accountList.update(); + accountList.update(); account = accountList.accounts.first; subaddressList.update(accountIndex: account.id ?? 0); subaddress = subaddressList.getAll().first; @@ -147,8 +151,7 @@ abstract class MoneroWalletBase extends WalletBase with Store { address: node.uri, login: node.login, password: node.password, - useSSL: false, - // FIXME: hardcoded value + useSSL: node.isSSL, isLightWallet: false); // FIXME: hardcoded value syncStatus = ConnectedSyncStatus(); } catch (e) { @@ -256,6 +259,7 @@ abstract class MoneroWalletBase extends WalletBase with Store { monero_wallet.rescanBlockchainAsync(); await startSync(); _askForUpdateBalance(); + accountList.update(); await _askForUpdateTransactionHistory(); await save(); await walletInfo.save(); @@ -363,17 +367,20 @@ abstract class MoneroWalletBase extends WalletBase with Store { void _onNewBlock(int height, int blocksLeft, double ptc) async { if (walletInfo.isRecovery) { - _askForUpdateTransactionHistory(); + await _askForUpdateTransactionHistory(); _askForUpdateBalance(); + accountList.update(); } if (blocksLeft < 100) { + await _askForUpdateTransactionHistory(); _askForUpdateBalance(); + accountList.update(); syncStatus = SyncedSyncStatus(); await _afterSyncSave(); if (walletInfo.isRecovery) { - setAsRecovered(); + await setAsRecovered(); } } else { syncStatus = SyncingSyncStatus(blocksLeft, ptc); diff --git a/lib/router.dart b/lib/router.dart index 43c1ebc05..d2122a031 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -2,7 +2,9 @@ import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/entities/transaction_description.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart'; import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart'; +import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/store/settings_store.dart'; +import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; @@ -70,7 +72,7 @@ Route createRoute(RouteSettings settings) { return CupertinoPageRoute( builder: (_) => getIt.get( param1: (BuildContext context, WalletType _) => - Navigator.of(context).pushNamed(Routes.seed, arguments: true), + Navigator.of(context).pushNamed(Routes.preSeed, arguments: true), param2: true)); case Routes.newWallet: @@ -245,7 +247,8 @@ Route createRoute(RouteSettings settings) { case Routes.accountCreation: return CupertinoPageRoute( - builder: (_) => getIt.get()); + builder: (_) => getIt.get( + param1: settings.arguments as AccountListItem)); case Routes.addressBook: return MaterialPageRoute( @@ -306,6 +309,10 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get()); + case Routes.preSeed: + return MaterialPageRoute( + builder: (_) => getIt.get()); + default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/routes.dart b/lib/routes.dart index 13a365990..a9c9a5b34 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -47,4 +47,5 @@ class Routes { static const exchangeTemplate = '/exchange_template'; static const restoreWalletType = '/restore_wallet_type'; static const restoreWallet = '/restore_wallet'; + static const preSeed = '/pre_seed'; } \ No newline at end of file diff --git a/lib/src/screens/dashboard/widgets/address_page.dart b/lib/src/screens/dashboard/widgets/address_page.dart index c50b1b566..a31269a2b 100644 --- a/lib/src/screens/dashboard/widgets/address_page.dart +++ b/lib/src/screens/dashboard/widgets/address_page.dart @@ -39,7 +39,7 @@ class AddressPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - S.of(context).addresses, + S.of(context).accounts_subaddresses, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, diff --git a/lib/src/screens/dashboard/widgets/menu_widget.dart b/lib/src/screens/dashboard/widgets/menu_widget.dart index 7701d0ad3..f8de5ba8d 100644 --- a/lib/src/screens/dashboard/widgets/menu_widget.dart +++ b/lib/src/screens/dashboard/widgets/menu_widget.dart @@ -5,6 +5,7 @@ import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/entities/wallet_type.dart'; import 'package:cake_wallet/src/screens/dashboard/wallet_menu.dart'; import 'package:flutter/rendering.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; // FIXME: terrible design. @@ -147,7 +148,7 @@ class MenuWidgetState extends State { ), if (widget.dashboardViewModel.subname != null) - Text( + Observer(builder: (_) => Text( widget.dashboardViewModel.subname, style: TextStyle( color: Theme.of(context) @@ -156,7 +157,7 @@ class MenuWidgetState extends State { .decorationColor, fontWeight: FontWeight.w500, fontSize: 12), - ) + )) ], ), )) diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 7d90c177c..e3260c91a 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -547,7 +547,7 @@ class ExchangePage extends BasePage { context: context, builder: (BuildContext context) { return AlertWithOneAction( - alertTitle: S.of(context).error, + alertTitle: S.of(context).provider_error(state.title), alertContent: state.error, buttonText: S.of(context).ok, buttonAction: () => Navigator.of(context).pop()); @@ -555,6 +555,7 @@ class ExchangePage extends BasePage { }); } if (state is TradeIsCreatedSuccessfully) { + exchangeViewModel.reset(); Navigator.of(context).pushNamed(Routes.exchangeConfirm); } }); diff --git a/lib/src/screens/monero_accounts/monero_account_list_page.dart b/lib/src/screens/monero_accounts/monero_account_list_page.dart index 623f3cb90..47404e443 100644 --- a/lib/src/screens/monero_accounts/monero_account_list_page.dart +++ b/lib/src/screens/monero_accounts/monero_account_list_page.dart @@ -103,7 +103,12 @@ class MoneroAccountListPage extends StatelessWidget { accountListViewModel .select(account); Navigator.of(context).pop(); - }); + }, + onEdit: () async => + await Navigator.of(context) + .pushNamed( + Routes.accountCreation, + arguments: account)); }, ), isAlwaysShowScrollThumb diff --git a/lib/src/screens/monero_accounts/widgets/account_tile.dart b/lib/src/screens/monero_accounts/widgets/account_tile.dart index eb9c7f25d..f07539333 100644 --- a/lib/src/screens/monero_accounts/widgets/account_tile.dart +++ b/lib/src/screens/monero_accounts/widgets/account_tile.dart @@ -1,15 +1,19 @@ import 'package:flutter/material.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:cake_wallet/generated/i18n.dart'; class AccountTile extends StatelessWidget { AccountTile({ @required this.isCurrent, @required this.accountName, - @required this.onTap + @required this.onTap, + @required this.onEdit }); final bool isCurrent; final String accountName; - final VoidCallback onTap; + final Function() onTap; + final Function() onEdit; @override Widget build(BuildContext context) { @@ -20,7 +24,7 @@ class AccountTile extends StatelessWidget { ? Theme.of(context).textTheme.subtitle.color : Theme.of(context).textTheme.display4.color; - return GestureDetector( + final Widget cell = GestureDetector( onTap: onTap, child: Container( height: 77, @@ -39,5 +43,17 @@ class AccountTile extends StatelessWidget { ), ), ); + + return isCurrent ? cell : Slidable( + key: Key(accountName), + child: cell, + actionPane: SlidableDrawerActionPane(), + secondaryActions: [ + IconSlideAction( + caption: S.of(context).edit, + color: Colors.blue, + icon: Icons.edit, + onTap: () => onEdit?.call()) + ]); } } \ No newline at end of file diff --git a/lib/src/screens/nodes/node_create_or_edit_page.dart b/lib/src/screens/nodes/node_create_or_edit_page.dart index ee13984c5..6cfa67285 100644 --- a/lib/src/screens/nodes/node_create_or_edit_page.dart +++ b/lib/src/screens/nodes/node_create_or_edit_page.dart @@ -1,3 +1,7 @@ +import 'package:cake_wallet/core/execution_state.dart'; +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; +import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -67,6 +71,39 @@ class NodeCreateOrEditPage extends BasePage { @override Widget body(BuildContext context) { + + reaction((_) => nodeCreateOrEditViewModel.connectionState, + (ExecutionState state) { + if (state is ExecutedSuccessfullyState) { + WidgetsBinding.instance.addPostFrameCallback((_) { + showPopUp( + context: context, + builder: (BuildContext context) => + AlertWithOneAction( + alertTitle: S.of(context).new_node_testing, + alertContent: state.payload as bool + ? S.of(context).node_connection_successful + : S.of(context).node_connection_failed, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop())); + }); + } + + if (state is FailureState) { + WidgetsBinding.instance.addPostFrameCallback((_) { + showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithOneAction( + alertTitle: S.of(context).error, + alertContent: state.error, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop()); + }); + }); + } + }); + return Container( padding: EdgeInsets.only(left: 24, right: 24), child: ScrollableWithBottomSection( @@ -122,7 +159,22 @@ class NodeCreateOrEditPage extends BasePage { ) ) ], - ) + ), + Padding( + padding: EdgeInsets.only(top: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Observer( + builder: (_) => StandardCheckbox( + value: nodeCreateOrEditViewModel.useSSL, + onChanged: (value) => + nodeCreateOrEditViewModel.useSSL = value, + caption: S.of(context).use_ssl, + )) + ], + )) ] ], )), @@ -133,9 +185,18 @@ class NodeCreateOrEditPage extends BasePage { Flexible( child: Container( padding: EdgeInsets.only(right: 8.0), - child: PrimaryButton( - onPressed: () => nodeCreateOrEditViewModel.reset(), - text: S.of(context).reset, + child: LoadingPrimaryButton( + onPressed: () async { + if (!_formKey.currentState.validate()) { + return; + } + + await nodeCreateOrEditViewModel.connect(); + }, + isLoading: nodeCreateOrEditViewModel + .connectionState is IsExecutingState, + text: S.of(context).node_test, + isDisabled: !nodeCreateOrEditViewModel.isReady, color: Colors.orange, textColor: Colors.white), )), @@ -154,7 +215,9 @@ class NodeCreateOrEditPage extends BasePage { text: S.of(context).save, color: Theme.of(context).accentTextTheme.body2.color, textColor: Colors.white, - isDisabled: !nodeCreateOrEditViewModel.isReady, + isDisabled: (!nodeCreateOrEditViewModel.isReady)|| + (nodeCreateOrEditViewModel + .connectionState is IsExecutingState), ), )), ], diff --git a/lib/src/screens/nodes/nodes_list_page.dart b/lib/src/screens/nodes/nodes_list_page.dart index 20abdae32..80697afad 100644 --- a/lib/src/screens/nodes/nodes_list_page.dart +++ b/lib/src/screens/nodes/nodes_list_page.dart @@ -99,9 +99,9 @@ class NodeListPage extends BasePage { await showPopUp( context: context, builder: (BuildContext context) { - // FIXME: Add translation. return AlertWithTwoActions( - alertTitle: 'Change current node', + alertTitle: S.of(context) + .change_current_node_title, alertContent: S .of(context) .change_current_node(node.uri), diff --git a/lib/src/screens/receive/receive_page.dart b/lib/src/screens/receive/receive_page.dart index 30d2b7cea..5126a1527 100644 --- a/lib/src/screens/receive/receive_page.dart +++ b/lib/src/screens/receive/receive_page.dart @@ -117,7 +117,7 @@ class ReceivePage extends BasePage { Icons.arrow_forward_ios, size: 14, color: - Theme.of(context).textTheme.display1.color, + Theme.of(context).textTheme.display1.color, )); } @@ -130,7 +130,7 @@ class ReceivePage extends BasePage { Icons.add, size: 20, color: - Theme.of(context).textTheme.display1.color, + Theme.of(context).textTheme.display1.color, )); } @@ -140,13 +140,13 @@ class ReceivePage extends BasePage { addressListViewModel.address.address; final backgroundColor = isCurrent ? Theme.of(context) - .textTheme - .display3 - .decorationColor + .textTheme + .display3 + .decorationColor : Theme.of(context) - .textTheme - .display2 - .decorationColor; + .textTheme + .display2 + .decorationColor; final textColor = isCurrent ? Theme.of(context).textTheme.display3.color : Theme.of(context).textTheme.display2.color; @@ -155,8 +155,7 @@ class ReceivePage extends BasePage { isCurrent: isCurrent, backgroundColor: backgroundColor, textColor: textColor, - onTap: (_) => - addressListViewModel.setAddress(item), + onTap: (_) => addressListViewModel.setAddress(item), onEdit: () => Navigator.of(context).pushNamed( Routes.newSubaddress, arguments: item)); @@ -166,11 +165,11 @@ class ReceivePage extends BasePage { return index != 0 ? cell : ClipRRect( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(30), - topRight: Radius.circular(30)), - child: cell, - ); + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30)), + child: cell, + ); })), ], ), diff --git a/lib/src/screens/receive/widgets/address_cell.dart b/lib/src/screens/receive/widgets/address_cell.dart index 6306ae209..703067dcf 100644 --- a/lib/src/screens/receive/widgets/address_cell.dart +++ b/lib/src/screens/receive/widgets/address_cell.dart @@ -14,6 +14,7 @@ class AddressCell extends StatelessWidget { address: item.address, name: item.name, isCurrent: isCurrent, + isPrimary: item.isPrimary, backgroundColor: backgroundColor, textColor: textColor, onTap: onTap, @@ -23,6 +24,7 @@ class AddressCell extends StatelessWidget { {@required this.address, @required this.name, @required this.isCurrent, + @required this.isPrimary, @required this.backgroundColor, @required this.textColor, this.onTap, @@ -31,6 +33,7 @@ class AddressCell extends StatelessWidget { final String address; final String name; final bool isCurrent; + final bool isPrimary; final Color backgroundColor; final Color textColor; final Function(String) onTap; @@ -56,7 +59,7 @@ class AddressCell extends StatelessWidget { ), )); - return isCurrent + return (isCurrent || isPrimary) ? cell : Slidable( key: Key(address), diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index ba2101d93..e94351266 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -52,19 +52,9 @@ class QRWidget extends StatelessWidget { ))))), Spacer(flex: 3) ]), - Padding( - padding: EdgeInsets.only(top: 20), - child: Text( - S.of(context).scan_qr_code, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.w500, - color: Theme.of(context).indicatorColor), - ), - ), isAmountFieldShow ? Padding( - padding: EdgeInsets.only(top: 40), + padding: EdgeInsets.only(top: 60), child: Row( children: [ Expanded( diff --git a/lib/src/screens/seed/pre_seed_page.dart b/lib/src/screens/seed/pre_seed_page.dart new file mode 100644 index 000000000..b9ea48eae --- /dev/null +++ b/lib/src/screens/seed/pre_seed_page.dart @@ -0,0 +1,67 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/store/settings_store.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/src/widgets/primary_button.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; + +class PreSeedPage extends BasePage { + static final imageLight = Image.asset('assets/images/pre_seed_light.png'); + static final imageDark = Image.asset('assets/images/pre_seed_dark.png'); + + @override + Widget leading(BuildContext context) => null; + + @override + String get title => S.current.pre_seed_title; + + @override + Widget body(BuildContext context) { + final image = + getIt.get().isDarkTheme ? imageDark : imageLight; + + return WillPopScope( + onWillPop: () async => false, + child: Container( + padding: EdgeInsets.all(24), + child: Column( + children: [ + Flexible( + flex: 2, + child: AspectRatio( + aspectRatio: 1, + child: FittedBox(child: image, fit: BoxFit.contain))), + Flexible( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.only(top: 70, left: 16, right: 16), + child: Text( + S.of(context).pre_seed_description, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: Theme.of(context) + .primaryTextTheme + .caption + .color), + ), + ), + PrimaryButton( + onPressed: () => Navigator.of(context) + .popAndPushNamed(Routes.seed, arguments: true), + text: S.of(context).pre_seed_button_text, + color: Theme.of(context).accentTextTheme.body2.color, + textColor: Colors.white) + ], + )) + ], + ), + )); + } +} diff --git a/lib/src/screens/seed/wallet_seed_page.dart b/lib/src/screens/seed/wallet_seed_page.dart index 72c80d503..0e47ee676 100644 --- a/lib/src/screens/seed/wallet_seed_page.dart +++ b/lib/src/screens/seed/wallet_seed_page.dart @@ -86,7 +86,7 @@ class WalletSeedPage extends BasePage { final image = getIt.get().isDarkTheme ? imageDark : imageLight; - return Container( + return WillPopScope(onWillPop: () async => false, child: Container( padding: EdgeInsets.all(24), child: Column( children: [ @@ -194,6 +194,6 @@ class WalletSeedPage extends BasePage { ], )) ], - )); + ))); } } diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 37745cdec..a247cb0a8 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -243,7 +243,7 @@ class WalletListBodyState extends State { changeProcessText(S.of(context).creating_new_wallet); await widget.walletListViewModel.walletNewVM.create(options: 'English'); // FIXME: Unnamed constant hideProgressText(); - await Navigator.of(context).pushNamed(Routes.seed, arguments: true); + await Navigator.of(context).pushNamed(Routes.preSeed); } catch(e) { changeProcessText(S.of(context).creating_new_wallet_error(e.toString())); } diff --git a/lib/src/widgets/standard_checkbox.dart b/lib/src/widgets/standard_checkbox.dart new file mode 100644 index 000000000..774acc9b7 --- /dev/null +++ b/lib/src/widgets/standard_checkbox.dart @@ -0,0 +1,76 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class StandardCheckbox extends StatefulWidget { + StandardCheckbox({ + @required this.value, + this.caption = '', + @required this.onChanged}); + + final bool value; + final String caption; + final Function(bool) onChanged; + + @override + StandardCheckboxState createState() => + StandardCheckboxState(value, caption, onChanged); +} + +class StandardCheckboxState extends State { + StandardCheckboxState(this.value, this.caption, this.onChanged); + + bool value; + String caption; + Function(bool) onChanged; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + value = !value; + onChanged(value); + setState(() {}); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + height: 24.0, + width: 24.0, + margin: EdgeInsets.only( + right: 10.0, + ), + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context) + .primaryTextTheme + .caption + .color, + width: 1.0), + borderRadius: BorderRadius.all( + Radius.circular(8.0)), + color: Theme.of(context).backgroundColor), + child: value + ? Icon( + Icons.check, + color: Colors.blue, + size: 20.0, + ) + : Offstage(), + ), + Text( + caption, + style: TextStyle( + fontSize: 16.0, + color: Theme.of(context) + .primaryTextTheme + .title + .color), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/store/dashboard/trade_filter_store.dart b/lib/store/dashboard/trade_filter_store.dart index 46e1193bb..02ad383e7 100644 --- a/lib/store/dashboard/trade_filter_store.dart +++ b/lib/store/dashboard/trade_filter_store.dart @@ -3,7 +3,7 @@ import 'package:mobx/mobx.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart'; -part 'trade_filter_store.g.dart'; +part'trade_filter_store.g.dart'; class TradeFilterStore = TradeFilterStoreBase with _$TradeFilterStore; diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 5c1b33304..3b7471cf3 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -1,5 +1,10 @@ import 'package:cake_wallet/bitcoin/bitcoin_transaction_info.dart'; import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart'; +import 'package:cake_wallet/entities/transaction_history.dart'; +import 'package:cake_wallet/monero/account.dart'; +import 'package:cake_wallet/monero/monero_balance.dart'; +import 'package:cake_wallet/monero/monero_transaction_history.dart'; +import 'package:cake_wallet/monero/monero_transaction_info.dart'; import 'package:cake_wallet/monero/monero_wallet.dart'; import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/crypto_currency.dart'; @@ -74,28 +79,53 @@ abstract class DashboardViewModelBase with Store { wallet ??= appStore.wallet; type = wallet.type; - transactions = ObservableList.of(wallet - .transactionHistory.transactions.values - .map((transaction) => TransactionListItem( - transaction: transaction, - balanceViewModel: balanceViewModel, - settingsStore: appStore.settingsStore))); - _reaction = reaction((_) => appStore.wallet, _onWalletChange); - // FIXME: fixme + + final _wallet = wallet; + + if (_wallet is MoneroWallet) { + subname = _wallet.account?.label; + + _onMoneroAccountChangeReaction = reaction((_) => _wallet.account, + (Account account) => _onMoneroAccountChange(_wallet)); + + _onMoneroBalanceChangeReaction = reaction((_) => _wallet.balance, + (MoneroBalance balance) => _onMoneroTransactionsUpdate(_wallet)); + + final _accountTransactions = _wallet + .transactionHistory.transactions.values + .where((tx) => tx.accountIndex == _wallet.account.id) + .toList(); + + transactions = ObservableList.of(_accountTransactions.map((transaction) => + TransactionListItem( + transaction: transaction, + balanceViewModel: balanceViewModel, + settingsStore: appStore.settingsStore))); + } else { + transactions = ObservableList.of(wallet + .transactionHistory.transactions.values + .map((transaction) => TransactionListItem( + transaction: transaction, + balanceViewModel: balanceViewModel, + settingsStore: appStore.settingsStore))); + } + connectMapToListWithTransform( appStore.wallet.transactionHistory.transactions, transactions, (TransactionInfo val) => TransactionListItem( transaction: val, balanceViewModel: balanceViewModel, - settingsStore: appStore.settingsStore)); + settingsStore: appStore.settingsStore), + filter: (TransactionInfo tx) { + final wallet = _wallet; + if (tx is MoneroTransactionInfo && wallet is MoneroWallet) { + return tx.accountIndex == wallet.account.id; + } - final _wallet = wallet; - - if (_wallet is MoneroWallet) { - subname = _wallet.account?.label; - } + return true; + }); } @observable @@ -170,6 +200,10 @@ abstract class DashboardViewModelBase with Store { ReactionDisposer _reaction; + ReactionDisposer _onMoneroAccountChangeReaction; + + ReactionDisposer _onMoneroBalanceChangeReaction; + Future reconnect() async { final node = appStore.settingsStore.getCurrentNode(wallet.type); await wallet.connectToNode(node: node); @@ -180,9 +214,47 @@ abstract class DashboardViewModelBase with Store { this.wallet = wallet; type = wallet.type; name = wallet.name; + + if (wallet is MoneroWallet) { + subname = wallet.account?.label; + + _onMoneroAccountChangeReaction?.reaction?.dispose(); + _onMoneroBalanceChangeReaction?.reaction?.dispose(); + + _onMoneroAccountChangeReaction = reaction((_) => wallet.account, + (Account account) => _onMoneroAccountChange(wallet)); + + _onMoneroBalanceChangeReaction = reaction((_) => wallet.balance, + (MoneroBalance balance) => _onMoneroTransactionsUpdate(wallet)); + + _onMoneroTransactionsUpdate(wallet); + } else { + transactions.clear(); + + transactions.addAll(wallet.transactionHistory.transactions.values.map( + (transaction) => TransactionListItem( + transaction: transaction, + balanceViewModel: balanceViewModel, + settingsStore: appStore.settingsStore))); + } + } + + @action + void _onMoneroAccountChange(MoneroWallet wallet) { + subname = wallet.account?.label; + _onMoneroTransactionsUpdate(wallet); + } + + @action + void _onMoneroTransactionsUpdate(MoneroWallet wallet) { transactions.clear(); - transactions.addAll(wallet.transactionHistory.transactions.values.map( - (transaction) => TransactionListItem( + + final _accountTransactions = wallet.transactionHistory.transactions.values + .where((tx) => tx.accountIndex == wallet.account.id) + .toList(); + + transactions.addAll(_accountTransactions.map((transaction) => + TransactionListItem( transaction: transaction, balanceViewModel: balanceViewModel, settingsStore: appStore.settingsStore))); diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 1b14980dd..e533e1e93 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -174,7 +174,7 @@ abstract class ExchangeViewModelBase with Store { return; } - final _amount = double.parse(amount.replaceAll(',', '.')); + final _amount = double.parse(amount.replaceAll(',', '.')) ?? 0; provider .calculateAmount( from: depositCurrency, @@ -247,10 +247,12 @@ abstract class ExchangeViewModelBase with Store { if (limitsState is LimitsLoadedSuccessfully && amount != null) { if (double.parse(amount) < limits.min) { tradeState = TradeIsCreatedFailure( + title: provider.title, error: S.current.error_text_minimal_limit('${provider.description}', '${limits.min}', currency.toString())); } else if (limits.max != null && double.parse(amount) > limits.max) { tradeState = TradeIsCreatedFailure( + title: provider.title, error: S.current.error_text_maximum_limit('${provider.description}', '${limits.max}', currency.toString())); } else { @@ -262,11 +264,14 @@ abstract class ExchangeViewModelBase with Store { await trades.add(trade); tradeState = TradeIsCreatedSuccessfully(trade: trade); } catch (e) { - tradeState = TradeIsCreatedFailure(error: e.toString()); + tradeState = TradeIsCreatedFailure( + title: provider.title, + error: e.toString()); } } } else { tradeState = TradeIsCreatedFailure( + title: provider.title, error: S.current .error_text_limits_loading_failed('${provider.description}')); } diff --git a/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart b/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart index 33e9dd1e5..d32f8eadd 100644 --- a/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart +++ b/lib/view_model/monero_account_list/monero_account_edit_or_create_view_model.dart @@ -13,6 +13,7 @@ abstract class MoneroAccountEditOrCreateViewModelBase with Store { {AccountListItem accountListItem}) : state = InitialExecutionState(), isEdit = accountListItem != null, + label = accountListItem?.label??'', _accountListItem = accountListItem; final bool isEdit; diff --git a/lib/view_model/node_list/node_create_or_edit_view_model.dart b/lib/view_model/node_list/node_create_or_edit_view_model.dart index fb6cd195e..0a5e07266 100644 --- a/lib/view_model/node_list/node_create_or_edit_view_model.dart +++ b/lib/view_model/node_list/node_create_or_edit_view_model.dart @@ -12,7 +12,9 @@ class NodeCreateOrEditViewModel = NodeCreateOrEditViewModelBase abstract class NodeCreateOrEditViewModelBase with Store { NodeCreateOrEditViewModelBase(this._nodeSource, this._wallet) - : state = InitialExecutionState(); + : state = InitialExecutionState(), + connectionState = InitialExecutionState(), + useSSL = false; @observable ExecutionState state; @@ -29,6 +31,12 @@ abstract class NodeCreateOrEditViewModelBase with Store { @observable String password; + @observable + ExecutionState connectionState; + + @observable + bool useSSL; + @computed bool get isReady => (address?.isNotEmpty ?? false) && (port?.isNotEmpty ?? false); @@ -54,6 +62,7 @@ abstract class NodeCreateOrEditViewModelBase with Store { port = ''; login = ''; password = ''; + useSSL = false; } @action @@ -61,11 +70,25 @@ abstract class NodeCreateOrEditViewModelBase with Store { try { state = IsExecutingState(); final node = - Node(uri: uri, type: _wallet.type, login: login, password: password); + Node(uri: uri, type: _wallet.type, login: login, password: password, + useSSL: useSSL); await _nodeSource.add(node); state = ExecutedSuccessfullyState(); } catch (e) { state = FailureState(e.toString()); } } + + @action + Future connect() async { + try { + connectionState = IsExecutingState(); + final node = + Node(uri: uri, type: _wallet.type, login: login, password: password); + final isAlive = await node.requestNode(); + connectionState = ExecutedSuccessfullyState(payload: isAlive); + } catch (e) { + connectionState = FailureState(e.toString()); + } + } } diff --git a/lib/view_model/wallet_address_list/wallet_address_list_item.dart b/lib/view_model/wallet_address_list/wallet_address_list_item.dart index c6d8915ab..286cb8f94 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_item.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_item.dart @@ -2,10 +2,11 @@ import 'package:flutter/foundation.dart'; import 'package:cake_wallet/utils/list_item.dart'; class WalletAddressListItem extends ListItem { - const WalletAddressListItem({@required this.address, this.name, this.id}) - : super(); + const WalletAddressListItem({@required this.address, @required this.isPrimary, + this.name, this.id}) : super(); final int id; + final bool isPrimary; final String address; final String name; diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index e8c897bfc..aca1ef808 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -97,16 +97,28 @@ abstract class WalletAddressListViewModelBase with Store { final addressList = ObservableList(); if (wallet is MoneroWallet) { - addressList.addAll(wallet.subaddressList.subaddresses.map((subaddress) => - WalletAddressListItem( - id: subaddress.id, - name: subaddress.label, - address: subaddress.address))); + final primaryAddress = wallet.subaddressList.subaddresses.first; + addressList.addAll(wallet.subaddressList.subaddresses.map((subaddress) { + final isPrimary = subaddress == primaryAddress; + + return WalletAddressListItem( + id: subaddress.id, + isPrimary: isPrimary, + name: subaddress.label, + address: subaddress.address); + })); } if (wallet is BitcoinWallet) { - final bitcoinAddresses = wallet.addresses.map((addr) => - WalletAddressListItem(name: addr.label, address: addr.address)); + final primaryAddress = wallet.addresses.first; + final bitcoinAddresses = wallet.addresses.map((addr) { + final isPrimary = addr == primaryAddress; + + return WalletAddressListItem( + isPrimary: isPrimary, + name: addr.label, + address: addr.address); + }); addressList.addAll(bitcoinAddresses); } diff --git a/pubspec.yaml b/pubspec.yaml index b59ba287b..a4b35f14a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Cake Wallet. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 4.0.8+20 +version: 4.0.9+21 environment: sdk: ">=2.7.0 <3.0.0" diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index cf74c18aa..eb0a6080b 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Wechseln Sie den Exchange-Anbieter", "you_will_send" : "Konvertieren von", "you_will_get" : "Konvertieren zu", - "amount_is_guaranteed" : "WICHTIG:\nWenn Sie einen garantierten BTC-Betrag erhalten möchten, geben Sie diesen Betrag in das Feld BTC ein. Wenn Sie stattdessen einen XMR-Betrag eingeben, handelt es sich bei dem erhaltenen BTC-Betrag um eine Schätzung, die je nach Kurs schwanken kann.", + "amount_is_guaranteed" : "Geben Sie in xmr.to den BTC-Betrag und nicht den oben genannten XMR-Betrag ein, um einen garantierten BTC-Betrag zu erhalten", "amount_is_estimate" : "Der empfangene Betrag ist eine Schätzung", "powered_by" : "Unterstützt von ${title}", "error" : "Error", @@ -129,6 +129,11 @@ "remove" : "Löschen", "delete" : "Löschen", "add_new_node" : "Neuen Knoten hinzufügen", + "change_current_node_title" : "Ändern Sie den aktuellen Knoten", + "node_test" : "Test", + "node_connection_successful" : "Die Verbindung war erfolgreich", + "node_connection_failed" : "Verbindung fehlgeschlagen", + "new_node_testing" : "Neuer Knotentest", "use" : "Verwenden Sie ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Geh zurück", "seed_alert_yes" : "Ja, habe ich", - "exchange_sync_alert_content" : "Bitte warten Sie, bis Ihre Brieftasche synchronisiert ist" + "exchange_sync_alert_content" : "Bitte warten Sie, bis Ihre Brieftasche synchronisiert ist", + + "pre_seed_title" : "WICHTIG", + "pre_seed_description" : "Auf der nächsten Seite sehen Sie eine Reihe von 25 Wörtern. Dies ist Ihr einzigartiger und privater Samen und der EINZIGE Weg, um Ihren Geldbeutel im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet App aufzubewahren.", + "pre_seed_button_text" : "Ich verstehe. Zeig mir meinen Samen", + + "xmr_to_error" : "XMR.TO-Fehler", + "xmr_to_error_description" : "Ungültiger Betrag. Höchstgrenze 8 Stellen nach dem Dezimalpunkt", + + "provider_error" : "${provider} Error", + + "use_ssl" : "Verwenden Sie SSL" } \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index b3a30feac..8a1267236 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Change Exchange Provider", "you_will_send" : "Convert from", "you_will_get" : "Convert to", - "amount_is_guaranteed" : "IMPORTANT:\nIf you want to receive a guaranteed amount of BTC, please enter that amount in the BTC field. If you enter an XMR amount instead, then the BTC amount received is an estimate and can fluctuate depending on the rates.", + "amount_is_guaranteed" : "In xmr.to, to receive a guaranteed BTC amount, enter the BTC amount and not the XMR amount above", "amount_is_estimate" : "The receive amount is an estimate", "powered_by" : "Powered by ${title}", "error" : "Error", @@ -129,6 +129,11 @@ "remove" : "Remove", "delete" : "Delete", "add_new_node" : "Add new node", + "change_current_node_title" : "Change current node", + "node_test" : "Test", + "node_connection_successful" : "Connection was successful", + "node_connection_failed" : "Connection was failed", + "new_node_testing" : "New node testing", "use" : "Switch to ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Go back", "seed_alert_yes" : "Yes, I have", - "exchange_sync_alert_content" : "Please wait until your wallet is synchronized" + "exchange_sync_alert_content" : "Please wait until your wallet is synchronized", + + "pre_seed_title" : "IMPORTANT", + "pre_seed_description" : "On the next page you will see a series of 25 words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.", + "pre_seed_button_text" : "I understand. Show me my seed", + + "xmr_to_error" : "XMR.TO error", + "xmr_to_error_description" : "Invalid amount. Maximum limit 8 digits after the decimal point", + + "provider_error" : "${provider} error", + + "use_ssl" : "Use SSL" } \ No newline at end of file diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 59258df5b..00acdcb0c 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Cambiar proveedor de intercambio", "you_will_send" : "Convertir de", "you_will_get" : "Convertir a", - "amount_is_guaranteed" : "IMPORTANTE:\nSi desea recibir una cantidad garantizada de BTC, ingrese esa cantidad en el campo BTC. Si ingresa una cantidad de XMR en su lugar, la cantidad de BTC recibida es una estimación y puede variar según las tarifas.", + "amount_is_guaranteed" : "En xmr.to, para recibir una cantidad BTC garantizada, ingrese la cantidad BTC y no la cantidad XMR arriba", "amount_is_estimate" : "El monto recibido es un estimado", "powered_by" : "Energizado por ${title}", "error" : "Error", @@ -129,6 +129,11 @@ "remove" : "Retirar", "delete" : "Borrar", "add_new_node" : "Agregar nuevo nodo", + "change_current_node_title" : "Cambiar el nodo actual", + "node_test" : "Prueba", + "node_connection_successful" : "La conexión fue exitosa", + "node_connection_failed" : "La conexión falló", + "new_node_testing" : "Prueba de nuevos nodos", "use" : "Utilizar a ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Regresa", "seed_alert_yes" : "Sí tengo", - "exchange_sync_alert_content" : "Espere hasta que su billetera esté sincronizada" + "exchange_sync_alert_content" : "Espere hasta que su billetera esté sincronizada", + + "pre_seed_title" : "IMPORTANTE", + "pre_seed_description" : "En la página siguiente verá una serie de 25 palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es SU responsabilidad escribirlo y guardarlo en un lugar seguro fuera de la aplicación Cake Wallet.", + "pre_seed_button_text" : "Entiendo. Muéstrame mi semilla", + + "xmr_to_error" : "Error de XMR.TO", + "xmr_to_error_description" : "Monto invalido. Límite máximo de 8 dígitos después del punto decimal", + + "provider_error" : "${provider} error", + + "use_ssl" : "Utilice SSL" } \ No newline at end of file diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 58212a819..9a9545c5d 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "एक्सचेंज प्रदाता बदलें", "you_will_send" : "से रूपांतरित करें", "you_will_get" : "में बदलें", - "amount_is_guaranteed" : "महत्वपूर्ण:\nयदि आप BTC की गारंटीकृत राशि प्राप्त करना चाहते हैं, तो कृपया उस राशि को BTC फ़ील्ड में दर्ज करें। यदि आप इसके बजाय एक एक्सएमआर राशि दर्ज करते हैं, तो प्राप्त बीटीसी राशि एक अनुमान है और दरों के आधार पर इसमें उतार-चढ़ाव हो सकता है।", + "amount_is_guaranteed" : "Xmr.to में, गारंटीशुदा BTC राशि प्राप्त करने के लिए, BTC राशि दर्ज करें और ऊपर XMR राशि नहीं", "amount_is_estimate" : "प्राप्त राशि एक अनुमान है", "powered_by" : "द्वारा संचालित ${title}", "error" : "त्रुटि", @@ -129,6 +129,11 @@ "remove" : "हटाना", "delete" : "हटाएं", "add_new_node" : "नया नोड जोड़ें", + "change_current_node_title" : "वर्तमान नोड बदलें", + "node_test" : "परीक्षा", + "node_connection_successful" : "कनेक्शन सफल रहा", + "node_connection_failed" : "कनेक्शन विफल रहा", + "new_node_testing" : "नई नोड परीक्षण", "use" : "उपयोग ", @@ -407,5 +412,16 @@ "seed_alert_back" : "वापस जाओ", "seed_alert_yes" : "हाँ मेरे पास है", - "exchange_sync_alert_content" : "कृपया प्रतीक्षा करें जब तक आपका बटुआ सिंक्रनाइज़ नहीं किया जाता है" + "exchange_sync_alert_content" : "कृपया प्रतीक्षा करें जब तक आपका बटुआ सिंक्रनाइज़ नहीं किया जाता है", + + "pre_seed_title" : "महत्वपूर्ण", + "pre_seed_description" : "अगले पेज पर आपको 25 शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।", + "pre_seed_button_text" : "मै समझता हुँ। मुझे अपना बीज दिखाओ", + + "xmr_to_error" : "XMR.TO त्रुटि", + "xmr_to_error_description" : "अवैध राशि। दशमलव बिंदु के बाद अधिकतम सीमा 8 अंक", + + "provider_error" : "${provider} त्रुटि", + + "use_ssl" : "उपयोग SSL" } \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 7a6ff8994..cb4b63414 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Exchangeプロバイダーの変更", "you_will_send" : "から変換", "you_will_get" : "に変換", - "amount_is_guaranteed" : "重要:\n保証された金額のBTCを受け取りたい場合は、その金額を[BTC]フィールドに入力してください。 代わりにXMR金額を入力した場合、受け取ったBTC金額は見積もりであり、レートに応じて変動する可能性があります。", + "amount_is_guaranteed" : "xmr.toで、保証されたBTC金額を受け取るには、上記のXMR金額ではなく、BTC金額を入力します", "amount_is_estimate" : "受け取り金額は見積もりです", "powered_by" : "搭載 ${title}", "error" : "エラー", @@ -129,6 +129,11 @@ "remove" : "削除する", "delete" : "削除する", "add_new_node" : "新しいノードを追加", + "change_current_node_title" : "現在のノードを変更する", + "node_test" : "テスト", + "node_connection_successful" : "接続に成功しました", + "node_connection_failed" : "接続に失敗しました", + "new_node_testing" : "新しいノードのテスト", "use" : "使用する ", @@ -407,5 +412,16 @@ "seed_alert_back" : "戻る", "seed_alert_yes" : "はい、あります", - "exchange_sync_alert_content" : "ウォレットが同期されるまでお待ちください" + "exchange_sync_alert_content" : "ウォレットが同期されるまでお待ちください", + + "pre_seed_title" : "重要", + "pre_seed_description" : "次のページでは、一連の25語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。", + "pre_seed_button_text" : "わかります。 種を見せて", + + "xmr_to_error" : "XMR.TOエラー", + "xmr_to_error_description" : "金額が無効です。 小数点以下8桁の上限", + + "provider_error" : "${provider} エラー", + + "use_ssl" : "SSLを使用する" } \ No newline at end of file diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 3665491fd..c14898fd9 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "교환 공급자 변경", "you_will_send" : "다음에서 변환", "you_will_get" : "로 변환하다", - "amount_is_guaranteed" : "중대한:\n보장 된 BTC 금액을 받으려면 BTC 필드에 해당 금액을 입력하십시오. 대신 XMR 금액을 입력하면 수령 한 BTC 금액이 추정치이며 요율에 따라 변동될 수 있습니다.", + "amount_is_guaranteed" : "xmr.to에서 보장 된 BTC 금액을 받으려면 위의 XMR 금액이 아닌 BTC 금액을 입력하십시오.", "amount_is_estimate" : "수신 금액은 견적입니다", "powered_by" : "에 의해 구동 ${title}", "error" : "오류", @@ -129,6 +129,11 @@ "remove" : "없애다", "delete" : "지우다", "add_new_node" : "새 노드 추가", + "change_current_node_title" : "현재 노드 변경", + "node_test" : "테스트", + "node_connection_successful" : "성공적으로 연결되었습니다.", + "node_connection_failed" : "연결 실패", + "new_node_testing" : "새로운 노드 테스트", "use" : "사용하다 ", @@ -407,5 +412,16 @@ "seed_alert_back" : "돌아 가기", "seed_alert_yes" : "네, 있어요", - "exchange_sync_alert_content" : "지갑이 동기화 될 때까지 기다리십시오" + "exchange_sync_alert_content" : "지갑이 동기화 될 때까지 기다리십시오", + + "pre_seed_title" : "중대한", + "pre_seed_description" : "다음 페이지에서 25 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다.", + "pre_seed_button_text" : "이해 했어요. 내 씨앗을 보여줘", + + "xmr_to_error" : "XMR.TO 오류", + "xmr_to_error_description" : "금액이 잘못되었습니다. 소수점 이하 최대 8 자리", + + "provider_error" : "${provider} 오류", + + "use_ssl" : "SSL 사용" } \ No newline at end of file diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index c8fd4a351..e5093a406 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Wijzig Exchange Provider", "you_will_send" : "Converteren van", "you_will_get" : "Converteren naar", - "amount_is_guaranteed" : "BELANGRIJK:\nAls u een gegarandeerd bedrag aan BTC wilt ontvangen, voert u dat bedrag in het BTC-veld in. Als u in plaats daarvan een XMR-bedrag invoert, is het ontvangen BTC-bedrag een schatting en kan het fluctueren afhankelijk van de tarieven.", + "amount_is_guaranteed" : "Om een gegarandeerd BTC-bedrag te ontvangen, voert u in xmr.to het BTC-bedrag in en niet het bovenstaande XMR-bedrag", "amount_is_estimate" : "Het ontvangen bedrag is een schatting", "powered_by" : "Aangedreven door ${title}", "error" : "Fout", @@ -129,6 +129,11 @@ "remove" : "Verwijderen", "delete" : "Delete", "add_new_node" : "Voeg een nieuw knooppunt toe", + "change_current_node_title" : "Wijzig het huidige knooppunt", + "node_test" : "Test", + "node_connection_successful" : "Verbinding is gelukt", + "node_connection_failed" : "De verbinding is mislukt", + "new_node_testing" : "Nieuwe knooppunttest", "use" : "Gebruik ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Ga terug", "seed_alert_yes" : "Ja ik heb", - "exchange_sync_alert_content" : "Wacht tot uw portemonnee is gesynchroniseerd" + "exchange_sync_alert_content" : "Wacht tot uw portemonnee is gesynchroniseerd", + + "pre_seed_title" : "BELANGRIJK", + "pre_seed_description" : "Op de volgende pagina ziet u een reeks van 25 woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app.", + "pre_seed_button_text" : "Ik begrijp het. Laat me mijn zaad zien", + + "xmr_to_error" : "XMR.TO-fout", + "xmr_to_error_description" : "Ongeldige hoeveelheid. Maximaal 8 cijfers achter de komma", + + "provider_error" : "${provider} fout", + + "use_ssl" : "Gebruik SSL" } \ No newline at end of file diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 4e458021d..e6b098360 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Zmień dostawcę programu Exchange", "you_will_send" : "Konwertuj z", "you_will_get" : "Konwertuj na", - "amount_is_guaranteed" : "WAŻNY:\nJeśli chcesz otrzymać gwarantowaną kwotę BTC, wprowadź tę kwotę w polu BTC. Jeśli zamiast tego wpiszesz kwotę XMR, otrzymana kwota BTC jest szacunkowa i może się zmieniać w zależności od stawek.", + "amount_is_guaranteed" : "W xmr.to, aby otrzymać gwarantowaną kwotę BTC, wprowadź kwotę BTC, a nie kwotę XMR powyżej", "amount_is_estimate" : "Otrzymana kwota jest wartością szacunkową", "powered_by" : "Zasilany przez ${title}", "error" : "Błąd", @@ -129,6 +129,11 @@ "remove" : "Usunąć", "delete" : "Kasować", "add_new_node" : "Dodaj nowy węzeł", + "change_current_node_title" : "Zmień bieżący węzeł", + "node_test" : "Test", + "node_connection_successful" : "Połączenie powiodło się", + "node_connection_failed" : "Połączenie nie powiodło się", + "new_node_testing" : "Testowanie nowych węzłów", "use" : "Używać ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Wróć", "seed_alert_yes" : "Tak", - "exchange_sync_alert_content" : "Poczekaj, aż portfel zostanie zsynchronizowany" + "exchange_sync_alert_content" : "Poczekaj, aż portfel zostanie zsynchronizowany", + + "pre_seed_title" : "WAŻNY", + "pre_seed_description" : "Na następnej stronie zobaczysz serię 25 słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet.", + "pre_seed_button_text" : "Rozumiem. Pokaż mi moje nasienie", + + "xmr_to_error" : "Pomyłka XMR.TO", + "xmr_to_error_description" : "Nieprawidłowa kwota. Maksymalny limit 8 cyfr po przecinku", + + "provider_error" : "${provider} pomyłka", + + "use_ssl" : "Użyj SSL" } \ No newline at end of file diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index cb7a3bd2d..e82032d7b 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Alterar o provedor de troca", "you_will_send" : "Converter de", "you_will_get" : "Converter para", - "amount_is_guaranteed" : "IMPORTANTE:\nSe você deseja receber um valor garantido de BTC, insira esse valor no campo BTC. Se, em vez disso, você inserir um valor XMR, o valor BTC recebido é uma estimativa e pode flutuar dependendo das taxas.", + "amount_is_guaranteed" : "Em xmr.to, para receber um valor BTC garantido, insira o valor BTC e não o valor XMR acima", "amount_is_estimate" : "O valor a ser recebido informado acima é uma estimativa", "powered_by" : "Troca realizada por ${title}", "error" : "Erro", @@ -129,6 +129,11 @@ "remove" : "Remover", "delete" : "Excluir", "add_new_node" : "Adicionar novo nó", + "change_current_node_title" : "Mudar o nó atual", + "node_test" : "Teste", + "node_connection_successful" : "A conexão foi bem sucedida", + "node_connection_failed" : "A conexão falhou", + "new_node_testing" : "Teste de novo nó", "use" : "Use PIN de ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Volte", "seed_alert_yes" : "Sim, eu tenho", - "exchange_sync_alert_content" : "Por favor, espere até que sua carteira seja sincronizada" + "exchange_sync_alert_content" : "Por favor, espere até que sua carteira seja sincronizada", + + "pre_seed_title" : "IMPORTANTE", + "pre_seed_description" : "Na próxima página, você verá uma série de 25 palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet.", + "pre_seed_button_text" : "Compreendo. Me mostre minha semente", + + "xmr_to_error" : "Erro XMR.TO", + "xmr_to_error_description" : "Montante inválido. Limite máximo de 8 dígitos após o ponto decimal", + + "provider_error" : "${provider} erro", + + "use_ssl" : "Use SSL" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 5ad7568ed..b78b86ff1 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Изменить провайдера обмена", "you_will_send" : "Конвертировать из", "you_will_get" : "Конвертировать в", - "amount_is_guaranteed" : "ВАЖНО:\nЕсли вы хотите получить гарантированную сумму BTC, введите эту сумму в поле BTC. Если вместо этого вы вводите сумму XMR, полученная сумма BTC является приблизительной и может колебаться в зависимости от курса.", + "amount_is_guaranteed" : "В xmr.to, чтобы получить гарантированную сумму BTC, введите сумму BTC, а не сумму XMR выше", "amount_is_estimate" : "Полученная сумма является приблизительной", "powered_by" : "Используя ${title}", "error" : "Ошибка", @@ -129,6 +129,11 @@ "remove" : "Удалить", "delete" : "Удалить", "add_new_node" : "Добавить новую ноду", + "change_current_node_title" : "Изменить текущую ноду", + "node_test" : "Тест", + "node_connection_successful" : "Подключение прошло успешно", + "node_connection_failed" : "Подключение не удалось", + "new_node_testing" : "Тестирование новой ноды", "use" : "Использовать ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Назад", "seed_alert_yes" : "Да", - "exchange_sync_alert_content" : "Подождите, пока ваш кошелек синхронизируется" + "exchange_sync_alert_content" : "Подождите, пока ваш кошелек синхронизируется", + + "pre_seed_title" : "ВАЖНО", + "pre_seed_description" : "На следующей странице вы увидите серию из 25 слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet.", + "pre_seed_button_text" : "Понятно. Покажите мнемоническую фразу", + + "xmr_to_error" : "Ошибка XMR.TO", + "xmr_to_error_description" : "Недопустимая сумма. Максимум 8 цифр после десятичной точки", + + "provider_error" : "${provider} ошибка", + + "use_ssl" : "Использовать SSL" } \ No newline at end of file diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 480685e08..be77cd293 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "Змінити провайдера обміну", "you_will_send" : "Конвертувати з", "you_will_get" : "Конвертувати в", - "amount_is_guaranteed" : "ВАЖЛИВО:\nЯкщо ви хочете отримати гарантовану суму BTC, введіть цю суму в поле BTC. Якщо замість цього ввести суму XMR, отримана сума BTC є приблизною і може коливатися залежно від курсу.", + "amount_is_guaranteed" : "У xmr.to, щоб отримати гарантовану суму BTC, введіть суму BTC, а не XMR вище", "amount_is_estimate" : "Отримана сума є приблизною", "powered_by" : "Використовуючи ${title}", "error" : "Помилка", @@ -129,6 +129,11 @@ "remove" : "Видалити", "delete" : "Видалити", "add_new_node" : "Додати новий вузол", + "change_current_node_title" : "Змінити поточний вузол", + "node_test" : "Тест", + "node_connection_successful" : "З'єднання було успішним", + "node_connection_failed" : "Помилка з’єднання", + "new_node_testing" : "Тестування нового вузла", "use" : "Використати ", @@ -407,5 +412,16 @@ "seed_alert_back" : "Назад", "seed_alert_yes" : "Так", - "exchange_sync_alert_content" : "Зачекайте, поки ваш гаманець не синхронізується" + "exchange_sync_alert_content" : "Зачекайте, поки ваш гаманець не синхронізується", + + "pre_seed_title" : "ВАЖЛИВО", + "pre_seed_description" : "На наступній сторінці ви побачите серію з 25 слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet.", + "pre_seed_button_text" : "Зрозуміло. Покажіть мнемонічну фразу", + + "xmr_to_error" : "Помилка XMR.TO", + "xmr_to_error_description" : "Неприпустима сума. Максимум 8 цифр після десяткової коми", + + "provider_error" : "${provider} помилка", + + "use_ssl" : "Використати SSL" } \ No newline at end of file diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 38d807906..ee633aae8 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -65,7 +65,7 @@ "change_exchange_provider" : "更改交易所提供商", "you_will_send" : "從轉換", "you_will_get" : "轉換成", - "amount_is_guaranteed" : "重要:\n如果您想獲得保證的BTC金額,請在BTC字段中輸入該金額。 如果您輸入的是XMR金額,則收到的BTC金額只是估算值,可能會隨匯率而波動。", + "amount_is_guaranteed" : "在xmr.to中,要接收保证的BTC数量,请输入BTC数量,而不要输入上方的XMR数量", "amount_is_estimate" : "收款金额为估算值", "powered_by" : "供电 ${title}", "error" : "错误", @@ -129,6 +129,11 @@ "remove" : "去掉", "delete" : "删除", "add_new_node" : "添加新節點", + "change_current_node_title" : "更改當前節點", + "node_test" : "測試", + "node_connection_successful" : "連接成功", + "node_connection_failed" : "連接失敗", + "new_node_testing" : "新節點測試", "use" : "採用 ", @@ -407,5 +412,16 @@ "seed_alert_back" : "回去", "seed_alert_yes" : "是的,我有", - "exchange_sync_alert_content" : "請等待,直到您的錢包同步" + "exchange_sync_alert_content" : "請等待,直到您的錢包同步", + + "pre_seed_title" : "重要", + "pre_seed_description" : "在下一頁上,您將看到一系列25個單詞。 這是您獨特的私人種子,是丟失或出現故障時恢復錢包的唯一方法。 您有責任將其寫下並存儲在Cake Wallet應用程序外部的安全地方。", + "pre_seed_button_text" : "我明白。 給我看我的種子", + + "xmr_to_error" : "XMR.TO錯誤", + "xmr_to_error_description" : "無效的金額。 小數點後最多8位數字", + + "provider_error" : "${provider} 錯誤", + + "use_ssl" : "使用SSL" } \ No newline at end of file