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 <omarh.ismail1@gmail.com>

Konstantin Ullrich committed Jun 19, 2025 at 19:00 UTC 18c2ba93668dce0239859809a141493f89006906
36 files changed +159 -31
cw_evm/pubspec.yaml
+1
@@ -30,6 +30,7 @@ dependencies:
30 git:
31 url: https://github.com/cake-tech/ledger-flutter-plus-plugins
32 path: packages/ledger-ethereum
33 + ref: f4761cd5171d4c1e2e42fd3298261650539fb2db
34
35 dependency_overrides:
36 web3dart:
lib/core/wallet_loading_service.dart
+3
@@ -73,8 +73,11 @@ class WalletLoadingService {
73 return wallet;
74 } catch (error, stack) {
75 await ExceptionHandler.resetLastPopupDate();
76 + final isLedgerError = await ExceptionHandler.isLedgerError(error);
77 + if (isLedgerError) rethrow;
78 await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack));
79
80 +
81 // try fetching the seeds of the corrupted wallet to show it to the user
82 String corruptedWalletsSeeds = "Corrupted wallets seeds (if retrievable, empty otherwise):";
83 try {
lib/reactions/on_authentication_state_change.dart
+43 -7
@@ -9,6 +9,7 @@ import 'package:cake_wallet/routes.dart';
9 import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart';
10 import 'package:cake_wallet/src/screens/wallet_connect/services/bottom_sheet_service.dart';
11 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
12 +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
13 import 'package:cake_wallet/store/authentication_store.dart';
14 import 'package:cake_wallet/store/settings_store.dart';
15 import 'package:cake_wallet/utils/exception_handler.dart';
@@ -63,14 +64,49 @@ void startAuthenticationStateChange(
64 monero!.setGlobalLedgerConnection(ledgerVM.connection);
65 showPopUp<void>(
66 context: context,
66 - builder: (BuildContext context) => AlertWithOneAction(
67 - alertTitle: S.of(context).proceed_on_device,
68 - alertContent: S.of(context).proceed_on_device_description,
69 - buttonText: S.of(context).cancel,
70 - alertBarrierDismissible: false,
71 - buttonAction: () => Navigator.of(context).pop()),
67 + builder: (context) => AlertWithOneAction(
68 + alertTitle: S.of(context).proceed_on_device,
69 + alertContent: S.of(context).proceed_on_device_description,
70 + buttonText: S.of(context).cancel,
71 + alertBarrierDismissible: false,
72 + buttonAction: () => Navigator.of(context).pop(),
73 + ),
74 );
73 - await loadCurrentWallet();
75 + bool tryOpening = true;
76 + while (tryOpening) {
77 + try {
78 + await loadCurrentWallet();
79 + tryOpening = false;
80 + } on Exception catch (e) {
81 + final errorCode = RegExp(r'0x\S*?(?= )').firstMatch(
82 + e.toString());
83 +
84 + final errorMessage = ledgerVM.interpretErrorCode(
85 + errorCode?.group(0).toString().replaceAll("0x", "") ??
86 + "");
87 + if (errorMessage != null) {
88 + await showPopUp<void>(
89 + context: context,
90 + builder: (context) => AlertWithTwoActions(
91 + alertTitle: "Ledger Error",
92 + alertContent: errorMessage,
93 + leftButtonText: S.of(context).try_again,
94 + alertBarrierDismissible: false,
95 + actionLeftButton: () => Navigator.of(context).pop(),
96 + rightButtonText: S.of(context).cancel,
97 + actionRightButton: () {
98 + tryOpening = false;
99 + Navigator.of(context).pop();
100 + },
101 + ),
102 + );
103 + } else {
104 + tryOpening = false;
105 + rethrow;
106 + }
107 + }
108 + }
109 +
110 getIt.get<BottomSheetService>().showNext();
111 await navigatorKey.currentState!
112 .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false);
lib/src/screens/connect_device/connect_device_page.dart
+3 -2
@@ -165,8 +165,9 @@ class ConnectDevicePageBodyState extends State<ConnectDevicePageBody> {
165 }
166
167 Future<void> _connectToDevice(LedgerDevice device) async {
168 - await widget.ledgerVM.connectLedger(device, widget.walletType);
169 - widget.onConnectDevice(context, widget.ledgerVM);
168 + final isConnected =
169 + await widget.ledgerVM.connectLedger(device, widget.walletType);
170 + if (isConnected) widget.onConnectDevice(context, widget.ledgerVM);
171 }
172
173 String _getDeviceTileLeading(LedgerDeviceType deviceInfo) {
lib/utils/exception_handler.dart
+56 -1
@@ -4,8 +4,10 @@ import 'package:cake_wallet/di.dart';
4 import 'package:cake_wallet/entities/preferences_key.dart';
5 import 'package:cake_wallet/generated/i18n.dart';
6 import 'package:cake_wallet/main.dart';
7 +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
8 import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
9 import 'package:cake_wallet/store/app_store.dart';
10 +import 'package:cake_wallet/utils/package_info.dart';
11 import 'package:cake_wallet/utils/show_bar.dart';
12 import 'package:cake_wallet/utils/show_pop_up.dart';
13 import 'package:cw_core/root_dir.dart';
@@ -15,7 +17,6 @@ import 'package:flutter/foundation.dart';
17 import 'package:flutter/material.dart';
18 import 'package:flutter/services.dart';
19 import 'package:flutter_mailer/flutter_mailer.dart';
18 -import 'package:cake_wallet/utils/package_info.dart';
20 import 'package:shared_preferences/shared_preferences.dart';
21
22 class ExceptionHandler {
@@ -113,6 +114,8 @@ class ExceptionHandler {
114 }
115
116 static Future<void> onError(FlutterErrorDetails errorDetails) async {
117 + if (await onLedgerError(errorDetails)) return;
118 +
119 if (kDebugMode || kProfileMode) {
120 FlutterError.presentError(errorDetails);
121 printV(errorDetails.toString());
@@ -183,6 +186,57 @@ class ExceptionHandler {
186 _hasError = false;
187 }
188
189 + static const List<String> _ledgerErrors = [
190 + 'Wrong Device Status',
191 + 'PlatformException(133, Failed to write: (Unknown Error: 133), null, null)',
192 + 'PlatformException(IllegalArgument, Unknown deviceId:',
193 + 'ServiceNotSupportedException(ConnectionType.ble, Required service not supported. Write characteristic: false, Notify characteristic: false)',
194 + 'Exception: 6e01', // Wrong App
195 + 'Exception: 6d02',
196 + 'Exception: 6511',
197 + 'Exception: 6e00',
198 + 'Exception: 6985',
199 + 'Exception: 5515',
200 + ];
201 +
202 + static bool isLedgerError(Object exception) =>
203 + _ledgerErrors.any((element) => exception.toString().contains(element));
204 +
205 + static Future<bool> onLedgerError(FlutterErrorDetails errorDetails) async {
206 + if (!isLedgerError(errorDetails.exception)) return false;
207 +
208 + String? interpretErrorCode(String errorCode) {
209 + if (errorCode.contains("6985")) {
210 + return S.current.ledger_error_tx_rejected_by_user;
211 + } else if (errorCode.contains("5515")) {
212 + return S.current.ledger_error_device_locked;
213 + } else
214 + if (["6e01", "6d02", "6511", "6e00"].any((e) => errorCode.contains(e))) {
215 + return S.current.ledger_error_wrong_app;
216 + }
217 + return null;
218 + }
219 +
220 + printV(errorDetails.exception);
221 +
222 + if (navigatorKey.currentContext != null) {
223 + await showPopUp<void>(
224 + context: navigatorKey.currentContext!,
225 + builder: (context) => AlertWithOneAction(
226 + alertTitle: "Ledger Error",
227 + alertContent:
228 + interpretErrorCode(errorDetails.exception.toString()) ??
229 + S.of(context).ledger_connection_error,
230 + buttonText: S.of(context).close,
231 + buttonAction: () => Navigator.of(context).pop(),
232 + ),
233 + );
234 + }
235 +
236 + _hasError = false;
237 + return true;
238 + }
239 +
240 /// Ignore User related errors or system errors
241 static bool _ignoreError(String error) =>
242 _ignoredErrors.any((element) => error.contains(element));
@@ -227,6 +281,7 @@ class ExceptionHandler {
281 "core/auth_service.dart:64",
282 "core/key_service.dart:14",
283 "core/wallet_loading_service.dart:139",
284 + "Wrong Device Status: 0x5515 (UNKNOWN)",
285 ];
286
287 static Future<void> _addDeviceInfo(File file) async {
lib/view_model/hardware_wallet/ledger_view_model.dart
+22 -16
@@ -96,7 +96,8 @@ abstract class LedgerViewModelBase with Store {
96 if (!Platform.isIOS) await ledgerPlusUSB.stopScanning();
97 }
98
99 - Future<void> connectLedger(sdk.LedgerDevice device, WalletType type) async {
99 + Future<bool> connectLedger(sdk.LedgerDevice device, WalletType type) async {
100 + if (_isConnecting) return false;
101 _isConnecting = true;
102 _connectingWalletType = type;
103 if (isConnected) {
@@ -110,17 +111,25 @@ abstract class LedgerViewModelBase with Store {
111 : ledgerPlusUSB;
112
113 if (_connectionChangeSubscription == null) {
113 - _connectionChangeSubscription =
114 - ledger.deviceStateChanges.listen(_connectionChangeListener);
114 + _connectionChangeSubscription = ledger
115 + .deviceStateChanges(device.id)
116 + .listen(_connectionChangeListener);
117 }
118
117 - _connection = await ledger.connect(device);
119 + try {
120 + _connection = await ledger.connect(device);
121 + _isConnecting = false;
122 + return true;
123 + } catch (e) {
124 + printV(e);
125 + }
126 _isConnecting = false;
127 + return false;
128 }
129
130 StreamSubscription<sdk.BleConnectionState>? _connectionChangeSubscription;
131 sdk.LedgerConnection? _connection;
123 - bool _isConnecting = true;
132 + bool _isConnecting = false;
133 WalletType? _connectingWalletType;
134
135 void _connectionChangeListener(sdk.BleConnectionState event) {
@@ -168,17 +177,14 @@ abstract class LedgerViewModelBase with Store {
177 }
178
179 String? interpretErrorCode(String errorCode) {
171 - switch (errorCode) {
172 - case "6985":
173 - return S.current.ledger_error_tx_rejected_by_user;
174 - case "5515":
175 - return S.current.ledger_error_device_locked;
176 - case "6d02": // UNKNOWN_APDU
177 - case "6511":
178 - case "6e00":
179 - return S.current.ledger_error_wrong_app;
180 - default:
181 - return null;
180 + if (errorCode.contains("6985")) {
181 + return S.current.ledger_error_tx_rejected_by_user;
182 + } else if (errorCode.contains("5515")) {
183 + return S.current.ledger_error_device_locked;
184 + } else
185 + if (["6e01", "6a87", "6d02", "6511", "6e00"].any((e) => errorCode.contains(e))) {
186 + return S.current.ledger_error_wrong_app;
187 }
188 + return null;
189 }
190 }
lib/view_model/wallet_hardware_restore_view_model.dart
+1 -3
@@ -80,11 +80,9 @@ abstract class WalletHardwareRestoreViewModelBase extends WalletCreationVM with
80
81 availableAccounts.addAll(accounts);
82 _nextIndex += limit;
83 - // } on LedgerException catch (e) {
84 - // error = ledgerViewModel.interpretErrorCode(e.errorCode.toRadixString(16));
83 } catch (e) {
84 printV(e);
87 - error = S.current.ledger_connection_error;
85 + error = ledgerViewModel.interpretErrorCode(e.toString()) ?? S.current.ledger_connection_error;
86 }
87
88 isLoadingMoreAccounts = false;
pubspec_base.yaml
+2 -2
@@ -110,7 +110,7 @@ dependencies:
110 ledger_flutter_plus:
111 git:
112 url: https://github.com/vespr-wallet/ledger-flutter-plus
113 - ref: c2e341d8038f1108690ad6f80f7b4b7156aacc76
113 + ref: 60817d4b20144f9da9029f5034790272795b9d38
114 hashlib: ^1.19.2
115 on_chain:
116 git:
@@ -165,7 +165,7 @@ dependency_overrides:
165 ledger_flutter_plus:
166 git:
167 url: https://github.com/vespr-wallet/ledger-flutter-plus
168 - ref: c2e341d8038f1108690ad6f80f7b4b7156aacc76
168 + ref: 60817d4b20144f9da9029f5034790272795b9d38
169 web_socket_channel: ^3.0.2
170 freezed_annotation: 2.4.4
171
res/values/strings_ar.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "نوع النقل",
980 "trongrid_history": "تاريخ ترونغريد",
981 "trusted": "موثوق به",
982 + "try_again": "حاول ثانية",
983 "tx_commit_exception_no_dust_on_change": "يتم رفض المعاملة مع هذا المبلغ. باستخدام هذه العملات المعدنية ، يمكنك إرسال ${min} دون تغيير أو ${max} الذي يعيد التغيير.",
984 "tx_commit_failed": "فشل ارتكاب المعاملة. يرجى الاتصال بالدعم.",
985 "tx_commit_failed_no_peers": "فشل المعاملة في البث ، يرجى المحاولة مرة أخرى في ثانية أو نحو ذلك",
res/values/strings_bg.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Тип транспорт",
980 "trongrid_history": "Trongrid History",
981 "trusted": "Надежден",
982 + "try_again": "Опитайте отново",
983 "tx_commit_exception_no_dust_on_change": "Сделката се отхвърля с тази сума. С тези монети можете да изпратите ${min} без промяна или ${max}, която връща промяна.",
984 "tx_commit_failed": "Компетацията на транзакцията не успя. Моля, свържете се с поддръжката.",
985 "tx_commit_failed_no_peers": "Сделката не успя да излъчи, моля, опитайте отново след секунда или така",
res/values/strings_cs.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Typ transportu",
980 "trongrid_history": "Trongridní historie",
981 "trusted": "Důvěřovat",
982 + "try_again": "Zkuste to znovu",
983 "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.",
984 "tx_commit_failed": "Transakce COMPORT selhala. Kontaktujte prosím podporu.",
985 "tx_commit_failed_no_peers": "Transakce se nepodařilo vysílat, zkuste to prosím znovu za vteřinu",
res/values/strings_de.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Transporttyp",
981 "trongrid_history": "Trongrid-Historie",
982 "trusted": "Vertrauenswürdige",
983 + "try_again": "Erneut versuchen",
984 "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.",
985 "tx_commit_failed": "Transaktionsausschüsse ist fehlgeschlagen. Bitte wenden Sie sich an Support.",
986 "tx_commit_failed_no_peers": "Transaktion konnte nicht übertragen werden. Bitte versuchen Sie es in einer Sekunde oder so erneut",
res/values/strings_en.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Transport Type",
981 "trongrid_history": "TronGrid history",
982 "trusted": "Trusted",
983 + "try_again": "Try again",
984 "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.",
985 "tx_commit_failed": "Transaction commit failed. Please contact support.",
986 "tx_commit_failed_no_peers": "Transaction failed to broadcast, please try again in a second or so",
res/values/strings_es.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Tipo de transporte",
981 "trongrid_history": "Historia trongrid",
982 "trusted": "de confianza",
983 + "try_again": "Intentar otra vez",
984 "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.",
985 "tx_commit_failed": "La confirmación de transacción falló. Ponte en contacto con el soporte.",
986 "tx_commit_failed_no_peers": "La transacción no se transmitió, intenta nuevamente en un segundo más o menos",
res/values/strings_fr.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Type de transport",
980 "trongrid_history": "Histoire de la trongride",
981 "trusted": "de confiance",
982 + "try_again": "Essayer à nouveau",
983 "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.",
984 "tx_commit_failed": "La validation de la transaction a échoué. Veuillez contacter l'assistance.",
985 "tx_commit_failed_no_peers": "La transaction n'a pas été diffusée, veuillez réessayer dans une seconde environ",
res/values/strings_ha.arb
+1
@@ -981,6 +981,7 @@
981 "transport_type": "Nau'in sufuri",
982 "trongrid_history": "Tarihin Trongrid",
983 "trusted": "Amintacce",
984 + "try_again": "Gwada kuma",
985 "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.",
986 "tx_commit_failed": "Ma'amala ya kasa. Da fatan za a tuntuɓi goyan baya.",
987 "tx_commit_failed_no_peers": "Kasuwanci ya kasa watsa, don Allah sake gwadawa a cikin na biyu ko",
res/values/strings_hi.arb
+1
@@ -981,6 +981,7 @@
981 "transport_type": "परिवहन प्रकार",
982 "trongrid_history": "ट्रॉन्ग्रिड का इतिहास",
983 "trusted": "भरोसा",
984 + "try_again": "पुनः प्रयास करें",
985 "tx_commit_exception_no_dust_on_change": "लेनदेन को इस राशि से खारिज कर दिया जाता है। इन सिक्कों के साथ आप चेंज या ${min} के बिना ${max} को भेज सकते हैं जो परिवर्तन लौटाता है।",
986 "tx_commit_failed": "लेन -देन प्रतिबद्ध विफल। कृपया संपर्क समर्थन करें।",
987 "tx_commit_failed_no_peers": "लेन -देन प्रसारित करने में विफल रहा, कृपया एक या दो सेकंड में पुनः प्रयास करें",
res/values/strings_hr.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Transportni tip",
980 "trongrid_history": "Povijest Trongrida",
981 "trusted": "vjerovao",
982 + "try_again": "Pokušajte ponovo",
983 "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.",
984 "tx_commit_failed": "Obveza transakcije nije uspjela. Molimo kontaktirajte podršku.",
985 "tx_commit_failed_no_peers": "Transakcija nije uspjela emitirati, pokušajte ponovo u sekundi ili tako",
res/values/strings_hy.arb
+1
@@ -977,6 +977,7 @@
977 "transport_type": "Տրանսպորտի տեսակը",
978 "trongrid_history": "TronGrid պատմություն",
979 "trusted": "Վստահելի",
980 + "try_again": "Կրկին փորձեք",
981 "tx_commit_exception_no_dust_on_change": "Փոխանցումը մերժվել է այս գումարով: Այս արժույթներով կարող եք ուղարկել ${min} առանց փոփոխության կամ ${max} որը վերադարձնում է փոփոխությունը",
982 "tx_commit_failed": "Փոխանցումը ձախողվել է: Խնդրում ենք դիմել աջակցությանը",
983 "tx_commit_failed_no_peers": "Գործարքը չի հաջողվել հեռարձակել, խնդրում ենք կրկին փորձել մեկ վայրկյանում",
res/values/strings_id.arb
+1
@@ -982,6 +982,7 @@
982 "transport_type": "Jenis transportasi",
983 "trongrid_history": "Sejarah Trongrid",
984 "trusted": "Dipercayai",
985 + "try_again": "Coba lagi",
986 "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.",
987 "tx_commit_failed": "Transaksi Gagal. Silakan hubungi Dukungan.",
988 "tx_commit_failed_no_peers": "Transaksi gagal untuk disiarkan, silakan coba lagi sebentar lagi",
res/values/strings_it.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Tipo di trasporto",
981 "trongrid_history": "Cronologia TronGrid",
982 "trusted": "Fidato",
983 + "try_again": "Riprova",
984 "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.",
985 "tx_commit_failed": "Commit di transazione non riuscita. Si prega di contattare il supporto.",
986 "tx_commit_failed_no_peers": "Errore nella trasmissione della transazione, si prega di provare nuovamente",
res/values/strings_ja.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "輸送タイプ",
981 "trongrid_history": "トロンリッドの歴史",
982 "trusted": "信頼できる",
983 + "try_again": "もう一度やり直してください",
984 "tx_commit_exception_no_dust_on_change": "この金額ではトランザクションは拒否されます。 これらのコインを使用すると、おつりなしの ${min} またはおつりを返す ${max} を送信できます。",
985 "tx_commit_failed": "トランザクションコミットは失敗しました。サポートに連絡してください。",
986 "tx_commit_failed_no_peers": "トランザクションはブロードキャストに失敗しました。一瞬かそこらで再試行してください",
res/values/strings_ko.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "전송 유형",
981 "trongrid_history": "TronGrid 내역",
982 "trusted": "신뢰됨",
983 + "try_again": "다시 시도하십시오",
984 "tx_commit_exception_no_dust_on_change": "이 금액으로는 트랜잭션이 거부됩니다. 이 코인으로는 잔돈 없이 ${min}을(를) 보내거나 잔돈이 반환되는 ${max}을(를) 보낼 수 있습니다.",
985 "tx_commit_failed": "트랜잭션 커밋 실패. 지원팀에 문의하세요.",
986 "tx_commit_failed_no_peers": "트랜잭션 전파 실패. 잠시 후 다시 시도하세요.",
res/values/strings_my.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "သယ်ယူပို့ဆောင်ရေးအမျိုးအစား",
980 "trongrid_history": "Trongrid သမိုင်း",
981 "trusted": "ယုံတယ်။",
982 + "try_again": "ထပ်ကြိုးစားပါ",
983 "tx_commit_exception_no_dust_on_change": "အဆိုပါငွေပေးငွေယူကဒီပမာဏနှင့်အတူပယ်ချခံရသည်။ ဤဒင်္ဂါးပြားများနှင့်အတူပြောင်းလဲမှုကိုပြန်လည်ပြောင်းလဲခြင်းသို့မဟုတ် ${min} မပါဘဲ ${max} ပေးပို့နိုင်သည်။",
984 "tx_commit_failed": "ငွေပေးငွေယူကျူးလွန်မှုပျက်ကွက်။ ကျေးဇူးပြုပြီးပံ့ပိုးမှုဆက်သွယ်ပါ။",
985 "tx_commit_failed_no_peers": "ငွေပေးငွေယူထုတ်လွှင့်ရန်ပျက်ကွက်ပါက ကျေးဇူးပြု. ဒုတိယသို့မဟုတ်ထိုအတိုင်းထပ်မံကြိုးစားပါ",
res/values/strings_nl.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Transporttype",
980 "trongrid_history": "Trongrid geschiedenis",
981 "trusted": "vertrouwd",
982 + "try_again": "Probeer het opnieuw",
983 "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.",
984 "tx_commit_failed": "Transactiebewissing is mislukt. Neem contact op met de ondersteuning.",
985 "tx_commit_failed_no_peers": "De transactie is niet uitgezonden, probeer het opnieuw binnen een seconde of zo",
res/values/strings_pl.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Typ transportu",
980 "trongrid_history": "Historia Trongrida",
981 "trusted": "Zaufany",
982 + "try_again": "Spróbuj ponownie",
983 "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ę.",
984 "tx_commit_failed": "Zatwierdzenie transakcji nie powiodło się. Skontaktuj się z obsługą.",
985 "tx_commit_failed_no_peers": "Transakcja nie była transmitowana, spróbuj ponownie za około sekundę",
res/values/strings_pt.arb
+1
@@ -981,6 +981,7 @@
981 "transport_type": "Tipo de transporte",
982 "trongrid_history": "História de Trongrid",
983 "trusted": "confiável",
984 + "try_again": "Tente novamente",
985 "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.",
986 "tx_commit_failed": "A confirmação da transação falhou. Entre em contato com o suporte.",
987 "tx_commit_failed_no_peers": "A transação não foi transmitida, tente novamente em um segundo",
res/values/strings_ru.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Транспортный тип",
981 "trongrid_history": "История Тронгрида",
982 "trusted": "доверенный",
983 + "try_again": "Попробуйте еще раз",
984 "tx_commit_exception_no_dust_on_change": "Транзакция отклоняется с этой суммой. С этими монетами вы можете отправлять ${min} без изменения или ${max}, которые возвращают изменение.",
985 "tx_commit_failed": "Комплект транзакции не удался. Пожалуйста, свяжитесь с поддержкой.",
986 "tx_commit_failed_no_peers": "Транзакция не смогла передать, попробуйте еще раз через секунду или около того",
res/values/strings_th.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "ประเภทการขนส่ง",
980 "trongrid_history": "ประวัติศาสตร์ Trongrid",
981 "trusted": "มั่นคง",
982 + "try_again": "ลองอีกครั้ง",
983 "tx_commit_exception_no_dust_on_change": "ธุรกรรมถูกปฏิเสธด้วยจำนวนเงินนี้ ด้วยเหรียญเหล่านี้คุณสามารถส่ง ${min} โดยไม่ต้องเปลี่ยนแปลงหรือ ${max} ที่ส่งคืนการเปลี่ยนแปลง",
984 "tx_commit_failed": "การทำธุรกรรมล้มเหลว กรุณาติดต่อฝ่ายสนับสนุน",
985 "tx_commit_failed_no_peers": "การทำธุรกรรมล้มเหลวในการออกอากาศโปรดลองอีกครั้งในวินาทีหรือมากกว่านั้น",
res/values/strings_tl.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Uri ng transportasyon",
980 "trongrid_history": "Kasaysayan ng TronGrid",
981 "trusted": "Pinagkakatiwalaan",
982 + "try_again": "Subukang muli",
983 "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.",
984 "tx_commit_failed": "Nabigo ang transaksyon. Mangyaring makipag-ugnay sa suporta.",
985 "tx_commit_failed_no_peers": "Nabigo ang transaksyon na mag -broadcast, mangyaring subukang muli sa isang segundo o higit pa",
res/values/strings_tr.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "Taşıma tipi",
980 "trongrid_history": "Trongrid tarihi",
981 "trusted": "Güvenilir",
982 + "try_again": "Tekrar deneyin",
983 "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.",
984 "tx_commit_failed": "İşlem taahhüdü başarısız oldu. Lütfen Destek ile iletişime geçin.",
985 "tx_commit_failed_no_peers": "İşlem yayın yapamadı, lütfen bir saniye içinde tekrar deneyin",
res/values/strings_uk.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Транспортний тип",
981 "trongrid_history": "Тронгрідська історія",
982 "trusted": "довіряють",
983 + "try_again": "Спробуйте ще раз",
984 "tx_commit_exception_no_dust_on_change": "Транзакція відхилена цією сумою. За допомогою цих монет ви можете надіслати ${min} без змін або ${max}, що повертає зміни.",
985 "tx_commit_failed": "Транзакційна комісія не вдалося. Будь ласка, зв'яжіться з підтримкою.",
986 "tx_commit_failed_no_peers": "Транзакція не вдалося транслювати, спробуйте ще раз за секунду або близько того",
res/values/strings_ur.arb
+1
@@ -981,6 +981,7 @@
981 "transport_type": "ٹرانسپورٹ کی قسم",
982 "trongrid_history": "ٹرانگریڈ ہسٹری",
983 "trusted": "قابل اعتماد",
984 + "try_again": "دوبارہ کوشش کریں",
985 "tx_commit_exception_no_dust_on_change": "اس رقم سے لین دین کو مسترد کردیا گیا ہے۔ ان سککوں کے ذریعہ آپ بغیر کسی تبدیلی کے ${min} یا ${max} بھیج سکتے ہیں جو لوٹتے ہیں۔",
986 "tx_commit_failed": "ٹرانزیکشن کمٹ ناکام ہوگیا۔ براہ کرم سپورٹ سے رابطہ کریں۔",
987 "tx_commit_failed_no_peers": "ٹرانزیکشن نشر کرنے میں ناکام ، براہ کرم ایک سیکنڈ یا اس میں دوبارہ کوشش کریں",
res/values/strings_vi.arb
+1
@@ -976,6 +976,7 @@
976 "transport_type": "Loại vận chuyển",
977 "trongrid_history": "Lịch sử TronGrid",
978 "trusted": "Đã tin cậy",
979 + "try_again": "Hãy thử lại",
980 "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ẻ.",
981 "tx_commit_failed": "Giao dịch không thành công. Vui lòng liên hệ với hỗ trợ.",
982 "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",
res/values/strings_yo.arb
+1
@@ -980,6 +980,7 @@
980 "transport_type": "Iru irinna",
981 "trongrid_history": "Itan Trongrid",
982 "trusted": "A ti fọkàn ẹ̀ tán",
983 + "try_again": "Gbiyanju lẹẹkansi",
984 "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.",
985 "tx_commit_failed": "Idunadura iṣowo kuna. Jọwọ kan si atilẹyin.",
986 "tx_commit_failed_no_peers": "Idunadura kuna lati wa igbohungbe, jọwọ gbiyanju lẹẹkansi ni iṣẹju keji tabi bẹẹ",
res/values/strings_zh.arb
+1
@@ -979,6 +979,7 @@
979 "transport_type": "运输类型",
980 "trongrid_history": "Trongrid历史",
981 "trusted": "值得信赖",
982 + "try_again": "再试一次",
983 "tx_commit_exception_no_dust_on_change": "交易被此金额拒绝。使用这些硬币,您可以发送${min}无需更改或返回${max}的变化。",
984 "tx_commit_failed": "交易承诺失败。请联系支持。",
985 "tx_commit_failed_no_peers": "交易无法广播,请在一秒钟左右的时间内重试",