From 18c2ba93668dce0239859809a141493f89006906 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 19 Jun 2025 19:00:16 +0200 Subject: [PATCH] CW-1090-ledger-issues (#2314) * build: bump ledger_flutter_plus dependencies * fix: handle connection errors occurring during connecting to a ledger device * fix: enhance ledger error handling and improve wallet connection reliability * fix: enhance ledger error handling and improve wallet connection reliability * feat: add localized strings for "Try again" and update Ledger error handling on auth * fix: handle rethrow behavior in onAuthenticationStateChange * fix: improve Ledger error handling and refine error code interpretation * fix: refine Ledger error code interpretation and enhance error handling [skip-ci] * add missing ledger error codes --------- Co-authored-by: Omar Hatem --- cw_evm/pubspec.yaml | 1 + lib/core/wallet_loading_service.dart | 3 + .../on_authentication_state_change.dart | 50 +++++++++++++--- .../connect_device/connect_device_page.dart | 5 +- lib/utils/exception_handler.dart | 57 ++++++++++++++++++- .../hardware_wallet/ledger_view_model.dart | 38 +++++++------ .../wallet_hardware_restore_view_model.dart | 4 +- pubspec_base.yaml | 4 +- res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + 36 files changed, 159 insertions(+), 31 deletions(-) diff --git a/cw_evm/pubspec.yaml b/cw_evm/pubspec.yaml index 2e37a3b6e..80788ca06 100644 --- a/cw_evm/pubspec.yaml +++ b/cw_evm/pubspec.yaml @@ -30,6 +30,7 @@ dependencies: git: url: https://github.com/cake-tech/ledger-flutter-plus-plugins path: packages/ledger-ethereum + ref: f4761cd5171d4c1e2e42fd3298261650539fb2db dependency_overrides: web3dart: diff --git a/lib/core/wallet_loading_service.dart b/lib/core/wallet_loading_service.dart index 382b1d6c2..f16bf7e14 100644 --- a/lib/core/wallet_loading_service.dart +++ b/lib/core/wallet_loading_service.dart @@ -73,8 +73,11 @@ class WalletLoadingService { return wallet; } catch (error, stack) { await ExceptionHandler.resetLastPopupDate(); + final isLedgerError = await ExceptionHandler.isLedgerError(error); + if (isLedgerError) rethrow; await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); + // try fetching the seeds of the corrupted wallet to show it to the user String corruptedWalletsSeeds = "Corrupted wallets seeds (if retrievable, empty otherwise):"; try { diff --git a/lib/reactions/on_authentication_state_change.dart b/lib/reactions/on_authentication_state_change.dart index 46ac481bb..8cde67731 100644 --- a/lib/reactions/on_authentication_state_change.dart +++ b/lib/reactions/on_authentication_state_change.dart @@ -9,6 +9,7 @@ import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; import 'package:cake_wallet/src/screens/wallet_connect/services/bottom_sheet_service.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/store/authentication_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/utils/exception_handler.dart'; @@ -63,14 +64,49 @@ void startAuthenticationStateChange( monero!.setGlobalLedgerConnection(ledgerVM.connection); showPopUp( context: context, - builder: (BuildContext context) => AlertWithOneAction( - alertTitle: S.of(context).proceed_on_device, - alertContent: S.of(context).proceed_on_device_description, - buttonText: S.of(context).cancel, - alertBarrierDismissible: false, - buttonAction: () => Navigator.of(context).pop()), + builder: (context) => AlertWithOneAction( + alertTitle: S.of(context).proceed_on_device, + alertContent: S.of(context).proceed_on_device_description, + buttonText: S.of(context).cancel, + alertBarrierDismissible: false, + buttonAction: () => Navigator.of(context).pop(), + ), ); - await loadCurrentWallet(); + bool tryOpening = true; + while (tryOpening) { + try { + await loadCurrentWallet(); + tryOpening = false; + } on Exception catch (e) { + final errorCode = RegExp(r'0x\S*?(?= )').firstMatch( + e.toString()); + + final errorMessage = ledgerVM.interpretErrorCode( + errorCode?.group(0).toString().replaceAll("0x", "") ?? + ""); + if (errorMessage != null) { + await showPopUp( + context: context, + builder: (context) => AlertWithTwoActions( + alertTitle: "Ledger Error", + alertContent: errorMessage, + leftButtonText: S.of(context).try_again, + alertBarrierDismissible: false, + actionLeftButton: () => Navigator.of(context).pop(), + rightButtonText: S.of(context).cancel, + actionRightButton: () { + tryOpening = false; + Navigator.of(context).pop(); + }, + ), + ); + } else { + tryOpening = false; + rethrow; + } + } + } + getIt.get().showNext(); await navigatorKey.currentState! .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); diff --git a/lib/src/screens/connect_device/connect_device_page.dart b/lib/src/screens/connect_device/connect_device_page.dart index 87c8e29a9..9e332369e 100644 --- a/lib/src/screens/connect_device/connect_device_page.dart +++ b/lib/src/screens/connect_device/connect_device_page.dart @@ -165,8 +165,9 @@ class ConnectDevicePageBodyState extends State { } Future _connectToDevice(LedgerDevice device) async { - await widget.ledgerVM.connectLedger(device, widget.walletType); - widget.onConnectDevice(context, widget.ledgerVM); + final isConnected = + await widget.ledgerVM.connectLedger(device, widget.walletType); + if (isConnected) widget.onConnectDevice(context, widget.ledgerVM); } String _getDeviceTileLeading(LedgerDeviceType deviceInfo) { diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index 954d4f532..a6d3774ce 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -4,8 +4,10 @@ import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/main.dart'; +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/store/app_store.dart'; +import 'package:cake_wallet/utils/package_info.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cw_core/root_dir.dart'; @@ -15,7 +17,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mailer/flutter_mailer.dart'; -import 'package:cake_wallet/utils/package_info.dart'; import 'package:shared_preferences/shared_preferences.dart'; class ExceptionHandler { @@ -113,6 +114,8 @@ class ExceptionHandler { } static Future onError(FlutterErrorDetails errorDetails) async { + if (await onLedgerError(errorDetails)) return; + if (kDebugMode || kProfileMode) { FlutterError.presentError(errorDetails); printV(errorDetails.toString()); @@ -183,6 +186,57 @@ class ExceptionHandler { _hasError = false; } + static const List _ledgerErrors = [ + 'Wrong Device Status', + 'PlatformException(133, Failed to write: (Unknown Error: 133), null, null)', + 'PlatformException(IllegalArgument, Unknown deviceId:', + 'ServiceNotSupportedException(ConnectionType.ble, Required service not supported. Write characteristic: false, Notify characteristic: false)', + 'Exception: 6e01', // Wrong App + 'Exception: 6d02', + 'Exception: 6511', + 'Exception: 6e00', + 'Exception: 6985', + 'Exception: 5515', + ]; + + static bool isLedgerError(Object exception) => + _ledgerErrors.any((element) => exception.toString().contains(element)); + + static Future onLedgerError(FlutterErrorDetails errorDetails) async { + if (!isLedgerError(errorDetails.exception)) return false; + + String? interpretErrorCode(String errorCode) { + if (errorCode.contains("6985")) { + return S.current.ledger_error_tx_rejected_by_user; + } else if (errorCode.contains("5515")) { + return S.current.ledger_error_device_locked; + } else + if (["6e01", "6d02", "6511", "6e00"].any((e) => errorCode.contains(e))) { + return S.current.ledger_error_wrong_app; + } + return null; + } + + printV(errorDetails.exception); + + if (navigatorKey.currentContext != null) { + await showPopUp( + context: navigatorKey.currentContext!, + builder: (context) => AlertWithOneAction( + alertTitle: "Ledger Error", + alertContent: + interpretErrorCode(errorDetails.exception.toString()) ?? + S.of(context).ledger_connection_error, + buttonText: S.of(context).close, + buttonAction: () => Navigator.of(context).pop(), + ), + ); + } + + _hasError = false; + return true; + } + /// Ignore User related errors or system errors static bool _ignoreError(String error) => _ignoredErrors.any((element) => error.contains(element)); @@ -227,6 +281,7 @@ class ExceptionHandler { "core/auth_service.dart:64", "core/key_service.dart:14", "core/wallet_loading_service.dart:139", + "Wrong Device Status: 0x5515 (UNKNOWN)", ]; static Future _addDeviceInfo(File file) async { diff --git a/lib/view_model/hardware_wallet/ledger_view_model.dart b/lib/view_model/hardware_wallet/ledger_view_model.dart index f555da0cf..132a5deb9 100644 --- a/lib/view_model/hardware_wallet/ledger_view_model.dart +++ b/lib/view_model/hardware_wallet/ledger_view_model.dart @@ -96,7 +96,8 @@ abstract class LedgerViewModelBase with Store { if (!Platform.isIOS) await ledgerPlusUSB.stopScanning(); } - Future connectLedger(sdk.LedgerDevice device, WalletType type) async { + Future connectLedger(sdk.LedgerDevice device, WalletType type) async { + if (_isConnecting) return false; _isConnecting = true; _connectingWalletType = type; if (isConnected) { @@ -110,17 +111,25 @@ abstract class LedgerViewModelBase with Store { : ledgerPlusUSB; if (_connectionChangeSubscription == null) { - _connectionChangeSubscription = - ledger.deviceStateChanges.listen(_connectionChangeListener); + _connectionChangeSubscription = ledger + .deviceStateChanges(device.id) + .listen(_connectionChangeListener); } - _connection = await ledger.connect(device); + try { + _connection = await ledger.connect(device); + _isConnecting = false; + return true; + } catch (e) { + printV(e); + } _isConnecting = false; + return false; } StreamSubscription? _connectionChangeSubscription; sdk.LedgerConnection? _connection; - bool _isConnecting = true; + bool _isConnecting = false; WalletType? _connectingWalletType; void _connectionChangeListener(sdk.BleConnectionState event) { @@ -168,17 +177,14 @@ abstract class LedgerViewModelBase with Store { } String? interpretErrorCode(String errorCode) { - switch (errorCode) { - case "6985": - return S.current.ledger_error_tx_rejected_by_user; - case "5515": - return S.current.ledger_error_device_locked; - case "6d02": // UNKNOWN_APDU - case "6511": - case "6e00": - return S.current.ledger_error_wrong_app; - default: - return null; + if (errorCode.contains("6985")) { + return S.current.ledger_error_tx_rejected_by_user; + } else if (errorCode.contains("5515")) { + return S.current.ledger_error_device_locked; + } else + if (["6e01", "6a87", "6d02", "6511", "6e00"].any((e) => errorCode.contains(e))) { + return S.current.ledger_error_wrong_app; } + return null; } } diff --git a/lib/view_model/wallet_hardware_restore_view_model.dart b/lib/view_model/wallet_hardware_restore_view_model.dart index 541e169d0..0cfc18c16 100644 --- a/lib/view_model/wallet_hardware_restore_view_model.dart +++ b/lib/view_model/wallet_hardware_restore_view_model.dart @@ -80,11 +80,9 @@ abstract class WalletHardwareRestoreViewModelBase extends WalletCreationVM with availableAccounts.addAll(accounts); _nextIndex += limit; - // } on LedgerException catch (e) { - // error = ledgerViewModel.interpretErrorCode(e.errorCode.toRadixString(16)); } catch (e) { printV(e); - error = S.current.ledger_connection_error; + error = ledgerViewModel.interpretErrorCode(e.toString()) ?? S.current.ledger_connection_error; } isLoadingMoreAccounts = false; diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 21166bd74..e11703607 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -110,7 +110,7 @@ dependencies: ledger_flutter_plus: git: url: https://github.com/vespr-wallet/ledger-flutter-plus - ref: c2e341d8038f1108690ad6f80f7b4b7156aacc76 + ref: 60817d4b20144f9da9029f5034790272795b9d38 hashlib: ^1.19.2 on_chain: git: @@ -165,7 +165,7 @@ dependency_overrides: ledger_flutter_plus: git: url: https://github.com/vespr-wallet/ledger-flutter-plus - ref: c2e341d8038f1108690ad6f80f7b4b7156aacc76 + ref: 60817d4b20144f9da9029f5034790272795b9d38 web_socket_channel: ^3.0.2 freezed_annotation: 2.4.4 diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index a30865b76..f12171f31 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -979,6 +979,7 @@ "transport_type": "نوع النقل", "trongrid_history": "تاريخ ترونغريد", "trusted": "موثوق به", + "try_again": "حاول ثانية", "tx_commit_exception_no_dust_on_change": "يتم رفض المعاملة مع هذا المبلغ. باستخدام هذه العملات المعدنية ، يمكنك إرسال ${min} دون تغيير أو ${max} الذي يعيد التغيير.", "tx_commit_failed": "فشل ارتكاب المعاملة. يرجى الاتصال بالدعم.", "tx_commit_failed_no_peers": "فشل المعاملة في البث ، يرجى المحاولة مرة أخرى في ثانية أو نحو ذلك", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index f0b992160..e1d364b95 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -979,6 +979,7 @@ "transport_type": "Тип транспорт", "trongrid_history": "Trongrid History", "trusted": "Надежден", + "try_again": "Опитайте отново", "tx_commit_exception_no_dust_on_change": "Сделката се отхвърля с тази сума. С тези монети можете да изпратите ${min} без промяна или ${max}, която връща промяна.", "tx_commit_failed": "Компетацията на транзакцията не успя. Моля, свържете се с поддръжката.", "tx_commit_failed_no_peers": "Сделката не успя да излъчи, моля, опитайте отново след секунда или така", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index e4b59562e..0a6693316 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -979,6 +979,7 @@ "transport_type": "Typ transportu", "trongrid_history": "Trongridní historie", "trusted": "Důvěřovat", + "try_again": "Zkuste to znovu", "tx_commit_exception_no_dust_on_change": "Transakce je zamítnuta s touto částkou. S těmito mincemi můžete odeslat ${min} bez změny nebo ${max}, které se vrátí změna.", "tx_commit_failed": "Transakce COMPORT selhala. Kontaktujte prosím podporu.", "tx_commit_failed_no_peers": "Transakce se nepodařilo vysílat, zkuste to prosím znovu za vteřinu", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 7e3f72e2a..5e9c2209c 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -980,6 +980,7 @@ "transport_type": "Transporttyp", "trongrid_history": "Trongrid-Historie", "trusted": "Vertrauenswürdige", + "try_again": "Erneut versuchen", "tx_commit_exception_no_dust_on_change": "Die Transaktion wird diesen Betrag abgelehnt. Mit diesen Münzen können Sie ${min} ohne Veränderung oder ${max} senden, die Änderungen zurückgeben.", "tx_commit_failed": "Transaktionsausschüsse ist fehlgeschlagen. Bitte wenden Sie sich an Support.", "tx_commit_failed_no_peers": "Transaktion konnte nicht übertragen werden. Bitte versuchen Sie es in einer Sekunde oder so erneut", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index a841c3041..ad4894238 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -980,6 +980,7 @@ "transport_type": "Transport Type", "trongrid_history": "TronGrid history", "trusted": "Trusted", + "try_again": "Try again", "tx_commit_exception_no_dust_on_change": "The transaction is rejected with this amount. With these coins you can send ${min} without change or ${max} that returns change.", "tx_commit_failed": "Transaction commit failed. Please contact support.", "tx_commit_failed_no_peers": "Transaction failed to broadcast, please try again in a second or so", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 17687e7c0..3f8657ec4 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -980,6 +980,7 @@ "transport_type": "Tipo de transporte", "trongrid_history": "Historia trongrid", "trusted": "de confianza", + "try_again": "Intentar otra vez", "tx_commit_exception_no_dust_on_change": "La transacción se rechaza con esta cantidad. Con estas monedas puede enviar ${min} sin cambios o ${max} que devuelve el cambio.", "tx_commit_failed": "La confirmación de transacción falló. Ponte en contacto con el soporte.", "tx_commit_failed_no_peers": "La transacción no se transmitió, intenta nuevamente en un segundo más o menos", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index e6b942f5c..ba3ae4859 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -979,6 +979,7 @@ "transport_type": "Type de transport", "trongrid_history": "Histoire de la trongride", "trusted": "de confiance", + "try_again": "Essayer à nouveau", "tx_commit_exception_no_dust_on_change": "La transaction est rejetée avec ce montant. Avec ces pièces, vous pouvez envoyer ${min} sans changement ou ${max} qui renvoie le changement.", "tx_commit_failed": "La validation de la transaction a échoué. Veuillez contacter l'assistance.", "tx_commit_failed_no_peers": "La transaction n'a pas été diffusée, veuillez réessayer dans une seconde environ", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index e38d03602..ebd236332 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -981,6 +981,7 @@ "transport_type": "Nau'in sufuri", "trongrid_history": "Tarihin Trongrid", "trusted": "Amintacce", + "try_again": "Gwada kuma", "tx_commit_exception_no_dust_on_change": "An ƙi ma'amala da wannan adadin. Tare da waɗannan tsabar kudi Zaka iya aika ${min}, ba tare da canji ba ko ${max} wanda ya dawo canzawa.", "tx_commit_failed": "Ma'amala ya kasa. Da fatan za a tuntuɓi goyan baya.", "tx_commit_failed_no_peers": "Kasuwanci ya kasa watsa, don Allah sake gwadawa a cikin na biyu ko", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index e9c3bca17..2e71b6685 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -981,6 +981,7 @@ "transport_type": "परिवहन प्रकार", "trongrid_history": "ट्रॉन्ग्रिड का इतिहास", "trusted": "भरोसा", + "try_again": "पुनः प्रयास करें", "tx_commit_exception_no_dust_on_change": "लेनदेन को इस राशि से खारिज कर दिया जाता है। इन सिक्कों के साथ आप चेंज या ${min} के बिना ${max} को भेज सकते हैं जो परिवर्तन लौटाता है।", "tx_commit_failed": "लेन -देन प्रतिबद्ध विफल। कृपया संपर्क समर्थन करें।", "tx_commit_failed_no_peers": "लेन -देन प्रसारित करने में विफल रहा, कृपया एक या दो सेकंड में पुनः प्रयास करें", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 3f52f5b66..b0aa12937 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -979,6 +979,7 @@ "transport_type": "Transportni tip", "trongrid_history": "Povijest Trongrida", "trusted": "vjerovao", + "try_again": "Pokušajte ponovo", "tx_commit_exception_no_dust_on_change": "Transakcija se odbija s tim iznosom. Pomoću ovih kovanica možete poslati ${min} bez promjene ili ${max} koja vraća promjenu.", "tx_commit_failed": "Obveza transakcije nije uspjela. Molimo kontaktirajte podršku.", "tx_commit_failed_no_peers": "Transakcija nije uspjela emitirati, pokušajte ponovo u sekundi ili tako", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index d1d661e7c..cafabe5a6 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -977,6 +977,7 @@ "transport_type": "Տրանսպորտի տեսակը", "trongrid_history": "TronGrid պատմություն", "trusted": "Վստահելի", + "try_again": "Կրկին փորձեք", "tx_commit_exception_no_dust_on_change": "Փոխանցումը մերժվել է այս գումարով: Այս արժույթներով կարող եք ուղարկել ${min} առանց փոփոխության կամ ${max} որը վերադարձնում է փոփոխությունը", "tx_commit_failed": "Փոխանցումը ձախողվել է: Խնդրում ենք դիմել աջակցությանը", "tx_commit_failed_no_peers": "Գործարքը չի հաջողվել հեռարձակել, խնդրում ենք կրկին փորձել մեկ վայրկյանում", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index eaccd3d99..e726ffb3c 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -982,6 +982,7 @@ "transport_type": "Jenis transportasi", "trongrid_history": "Sejarah Trongrid", "trusted": "Dipercayai", + "try_again": "Coba lagi", "tx_commit_exception_no_dust_on_change": "Transaksi ditolak dengan jumlah ini. Dengan koin ini Anda dapat mengirim ${min} tanpa perubahan atau ${max} yang mengembalikan perubahan.", "tx_commit_failed": "Transaksi Gagal. Silakan hubungi Dukungan.", "tx_commit_failed_no_peers": "Transaksi gagal untuk disiarkan, silakan coba lagi sebentar lagi", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 65c4085d1..4e94c349f 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -980,6 +980,7 @@ "transport_type": "Tipo di trasporto", "trongrid_history": "Cronologia TronGrid", "trusted": "Fidato", + "try_again": "Riprova", "tx_commit_exception_no_dust_on_change": "La transazione viene respinta con questo importo. Con queste monete è possibile inviare ${min} senza modifiche o ${max} che restituisce il cambiamento.", "tx_commit_failed": "Commit di transazione non riuscita. Si prega di contattare il supporto.", "tx_commit_failed_no_peers": "Errore nella trasmissione della transazione, si prega di provare nuovamente", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index f638c1850..960634e27 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -980,6 +980,7 @@ "transport_type": "輸送タイプ", "trongrid_history": "トロンリッドの歴史", "trusted": "信頼できる", + "try_again": "もう一度やり直してください", "tx_commit_exception_no_dust_on_change": "この金額ではトランザクションは拒否されます。 これらのコインを使用すると、おつりなしの ${min} またはおつりを返す ${max} を送信できます。", "tx_commit_failed": "トランザクションコミットは失敗しました。サポートに連絡してください。", "tx_commit_failed_no_peers": "トランザクションはブロードキャストに失敗しました。一瞬かそこらで再試行してください", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 1c0a4cee7..e107e1a29 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -980,6 +980,7 @@ "transport_type": "전송 유형", "trongrid_history": "TronGrid 내역", "trusted": "신뢰됨", + "try_again": "다시 시도하십시오", "tx_commit_exception_no_dust_on_change": "이 금액으로는 트랜잭션이 거부됩니다. 이 코인으로는 잔돈 없이 ${min}을(를) 보내거나 잔돈이 반환되는 ${max}을(를) 보낼 수 있습니다.", "tx_commit_failed": "트랜잭션 커밋 실패. 지원팀에 문의하세요.", "tx_commit_failed_no_peers": "트랜잭션 전파 실패. 잠시 후 다시 시도하세요.", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 6727c7fcf..d9f3c46da 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -979,6 +979,7 @@ "transport_type": "သယ်ယူပို့ဆောင်ရေးအမျိုးအစား", "trongrid_history": "Trongrid သမိုင်း", "trusted": "ယုံတယ်။", + "try_again": "ထပ်ကြိုးစားပါ", "tx_commit_exception_no_dust_on_change": "အဆိုပါငွေပေးငွေယူကဒီပမာဏနှင့်အတူပယ်ချခံရသည်။ ဤဒင်္ဂါးပြားများနှင့်အတူပြောင်းလဲမှုကိုပြန်လည်ပြောင်းလဲခြင်းသို့မဟုတ် ${min} မပါဘဲ ${max} ပေးပို့နိုင်သည်။", "tx_commit_failed": "ငွေပေးငွေယူကျူးလွန်မှုပျက်ကွက်။ ကျေးဇူးပြုပြီးပံ့ပိုးမှုဆက်သွယ်ပါ။", "tx_commit_failed_no_peers": "ငွေပေးငွေယူထုတ်လွှင့်ရန်ပျက်ကွက်ပါက ကျေးဇူးပြု. ဒုတိယသို့မဟုတ်ထိုအတိုင်းထပ်မံကြိုးစားပါ", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 4f925bc74..756f0b311 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -979,6 +979,7 @@ "transport_type": "Transporttype", "trongrid_history": "Trongrid geschiedenis", "trusted": "vertrouwd", + "try_again": "Probeer het opnieuw", "tx_commit_exception_no_dust_on_change": "De transactie wordt afgewezen met dit bedrag. Met deze munten kunt u ${min} verzenden zonder verandering of ${max} die wijziging retourneert.", "tx_commit_failed": "Transactiebewissing is mislukt. Neem contact op met de ondersteuning.", "tx_commit_failed_no_peers": "De transactie is niet uitgezonden, probeer het opnieuw binnen een seconde of zo", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index baf0f2502..78a1af410 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -979,6 +979,7 @@ "transport_type": "Typ transportu", "trongrid_history": "Historia Trongrida", "trusted": "Zaufany", + "try_again": "Spróbuj ponownie", "tx_commit_exception_no_dust_on_change": "Transakcja została odrzucana z tą kwotą. Za pomocą tych monet możesz wysłać ${min} bez reszty lub ${max}, które zwrócą resztę.", "tx_commit_failed": "Zatwierdzenie transakcji nie powiodło się. Skontaktuj się z obsługą.", "tx_commit_failed_no_peers": "Transakcja nie była transmitowana, spróbuj ponownie za około sekundę", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 375996c99..64c54916a 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -981,6 +981,7 @@ "transport_type": "Tipo de transporte", "trongrid_history": "História de Trongrid", "trusted": "confiável", + "try_again": "Tente novamente", "tx_commit_exception_no_dust_on_change": "A transação é rejeitada com esse valor. Com essas moedas, você pode enviar ${min} sem alteração ou ${max} que retorna alterações.", "tx_commit_failed": "A confirmação da transação falhou. Entre em contato com o suporte.", "tx_commit_failed_no_peers": "A transação não foi transmitida, tente novamente em um segundo", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 800201b27..7f0ce362a 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -980,6 +980,7 @@ "transport_type": "Транспортный тип", "trongrid_history": "История Тронгрида", "trusted": "доверенный", + "try_again": "Попробуйте еще раз", "tx_commit_exception_no_dust_on_change": "Транзакция отклоняется с этой суммой. С этими монетами вы можете отправлять ${min} без изменения или ${max}, которые возвращают изменение.", "tx_commit_failed": "Комплект транзакции не удался. Пожалуйста, свяжитесь с поддержкой.", "tx_commit_failed_no_peers": "Транзакция не смогла передать, попробуйте еще раз через секунду или около того", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index bfaa92b08..9908f93a0 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -979,6 +979,7 @@ "transport_type": "ประเภทการขนส่ง", "trongrid_history": "ประวัติศาสตร์ Trongrid", "trusted": "มั่นคง", + "try_again": "ลองอีกครั้ง", "tx_commit_exception_no_dust_on_change": "ธุรกรรมถูกปฏิเสธด้วยจำนวนเงินนี้ ด้วยเหรียญเหล่านี้คุณสามารถส่ง ${min} โดยไม่ต้องเปลี่ยนแปลงหรือ ${max} ที่ส่งคืนการเปลี่ยนแปลง", "tx_commit_failed": "การทำธุรกรรมล้มเหลว กรุณาติดต่อฝ่ายสนับสนุน", "tx_commit_failed_no_peers": "การทำธุรกรรมล้มเหลวในการออกอากาศโปรดลองอีกครั้งในวินาทีหรือมากกว่านั้น", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 8e571c3cb..9ad025aa7 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -979,6 +979,7 @@ "transport_type": "Uri ng transportasyon", "trongrid_history": "Kasaysayan ng TronGrid", "trusted": "Pinagkakatiwalaan", + "try_again": "Subukang muli", "tx_commit_exception_no_dust_on_change": "Ang transaksyon ay tinanggihan sa halagang ito. Sa mga barya na ito maaari kang magpadala ng ${min} nang walang sukli o ${max} na nagbabalik ng sukli.", "tx_commit_failed": "Nabigo ang transaksyon. Mangyaring makipag-ugnay sa suporta.", "tx_commit_failed_no_peers": "Nabigo ang transaksyon na mag -broadcast, mangyaring subukang muli sa isang segundo o higit pa", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 9a9690142..add8ee22f 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -979,6 +979,7 @@ "transport_type": "Taşıma tipi", "trongrid_history": "Trongrid tarihi", "trusted": "Güvenilir", + "try_again": "Tekrar deneyin", "tx_commit_exception_no_dust_on_change": "İşlem bu miktarla reddedilir. Bu madeni paralarla değişiklik yapmadan ${min} veya değişikliği döndüren ${max} gönderebilirsiniz.", "tx_commit_failed": "İşlem taahhüdü başarısız oldu. Lütfen Destek ile iletişime geçin.", "tx_commit_failed_no_peers": "İşlem yayın yapamadı, lütfen bir saniye içinde tekrar deneyin", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index e36599a0c..07ed5d532 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -980,6 +980,7 @@ "transport_type": "Транспортний тип", "trongrid_history": "Тронгрідська історія", "trusted": "довіряють", + "try_again": "Спробуйте ще раз", "tx_commit_exception_no_dust_on_change": "Транзакція відхилена цією сумою. За допомогою цих монет ви можете надіслати ${min} без змін або ${max}, що повертає зміни.", "tx_commit_failed": "Транзакційна комісія не вдалося. Будь ласка, зв'яжіться з підтримкою.", "tx_commit_failed_no_peers": "Транзакція не вдалося транслювати, спробуйте ще раз за секунду або близько того", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 0ce1b4758..7240db6b0 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -981,6 +981,7 @@ "transport_type": "ٹرانسپورٹ کی قسم", "trongrid_history": "ٹرانگریڈ ہسٹری", "trusted": "قابل اعتماد", + "try_again": "دوبارہ کوشش کریں", "tx_commit_exception_no_dust_on_change": "اس رقم سے لین دین کو مسترد کردیا گیا ہے۔ ان سککوں کے ذریعہ آپ بغیر کسی تبدیلی کے ${min} یا ${max} بھیج سکتے ہیں جو لوٹتے ہیں۔", "tx_commit_failed": "ٹرانزیکشن کمٹ ناکام ہوگیا۔ براہ کرم سپورٹ سے رابطہ کریں۔", "tx_commit_failed_no_peers": "ٹرانزیکشن نشر کرنے میں ناکام ، براہ کرم ایک سیکنڈ یا اس میں دوبارہ کوشش کریں", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 61cadb10b..3dd184ddd 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -976,6 +976,7 @@ "transport_type": "Loại vận chuyển", "trongrid_history": "Lịch sử TronGrid", "trusted": "Đã tin cậy", + "try_again": "Hãy thử lại", "tx_commit_exception_no_dust_on_change": "Giao dịch bị từ chối với số tiền này. Với số tiền này bạn có thể gửi ${min} mà không cần đổi tiền lẻ hoặc ${max} trả lại tiền lẻ.", "tx_commit_failed": "Giao dịch không thành công. Vui lòng liên hệ với hỗ trợ.", "tx_commit_failed_no_peers": "Giao dịch không phát sóng, vui lòng thử lại trong một giây hoặc lâu hơn", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 761667b17..0a3e382e7 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -980,6 +980,7 @@ "transport_type": "Iru irinna", "trongrid_history": "Itan Trongrid", "trusted": "A ti fọkàn ẹ̀ tán", + "try_again": "Gbiyanju lẹẹkansi", "tx_commit_exception_no_dust_on_change": "Iṣowo naa ti kọ pẹlu iye yii. Pẹlu awọn owó wọnyi o le firanṣẹ ${min} laisi ayipada tabi ${max} ni iyipada iyipada.", "tx_commit_failed": "Idunadura iṣowo kuna. Jọwọ kan si atilẹyin.", "tx_commit_failed_no_peers": "Idunadura kuna lati wa igbohungbe, jọwọ gbiyanju lẹẹkansi ni iṣẹju keji tabi bẹẹ", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 5831a51c0..2f02673b7 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -979,6 +979,7 @@ "transport_type": "运输类型", "trongrid_history": "Trongrid历史", "trusted": "值得信赖", + "try_again": "再试一次", "tx_commit_exception_no_dust_on_change": "交易被此金额拒绝。使用这些硬币,您可以发送${min}无需更改或返回${max}的变化。", "tx_commit_failed": "交易承诺失败。请联系支持。", "tx_commit_failed_no_peers": "交易无法广播,请在一秒钟左右的时间内重试",