CW-515-WalletConnect-deeplink (#1153)

* feat: WalletConnect deeplink WIP * fix: Handle cases where a non ethereum address is in use when the trigger is made * fix: edgecases fixes for walletconect * fix: edgecases fixes for walletconect * Update pubspec_base.yaml * remove unused dependency * remove unused dependency --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

Adegoke David committed Nov 2, 2023 at 15:41 UTC 745607aa731862b4fe0e93a2033de5b06228898b
38 files changed +180 -62
cw_bitcoin_cash/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux
+1 -1
@@ -1 +1 @@
1 -C:/Users/borod/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.2.0/
\ No newline at end of file
1 +/Users/blazebrain/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
\ No newline at end of file
ios/Podfile.lock
+10
@@ -115,6 +115,9 @@ PODS:
115 - Flutter
116 - flutter_secure_storage (6.0.0):
117 - Flutter
118 + - fluttertoast (0.0.2):
119 + - Flutter
120 + - Toast
121 - in_app_review (0.2.0):
122 - Flutter
123 - local_auth_ios (0.0.1):
@@ -143,6 +146,7 @@ PODS:
146 - FlutterMacOS
147 - SwiftProtobuf (1.22.0)
148 - SwiftyGif (5.4.4)
149 + - Toast (4.0.0)
150 - uni_links (0.0.1):
151 - Flutter
152 - UnstoppableDomainsResolution (4.0.0):
@@ -171,6 +175,7 @@ DEPENDENCIES:
175 - flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`)
176 - flutter_mailer (from `.symlinks/plugins/flutter_mailer/ios`)
177 - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
178 + - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
179 - in_app_review (from `.symlinks/plugins/in_app_review/ios`)
180 - local_auth_ios (from `.symlinks/plugins/local_auth_ios/ios`)
181 - package_info (from `.symlinks/plugins/package_info/ios`)
@@ -198,6 +203,7 @@ SPEC REPOS:
203 - SDWebImage
204 - SwiftProtobuf
205 - SwiftyGif
206 + - Toast
207 - UnstoppableDomainsResolution
208
209 EXTERNAL SOURCES:
@@ -229,6 +235,8 @@ EXTERNAL SOURCES:
235 :path: ".symlinks/plugins/flutter_mailer/ios"
236 flutter_secure_storage:
237 :path: ".symlinks/plugins/flutter_secure_storage/ios"
238 + fluttertoast:
239 + :path: ".symlinks/plugins/fluttertoast/ios"
240 in_app_review:
241 :path: ".symlinks/plugins/in_app_review/ios"
242 local_auth_ios:
@@ -275,6 +283,7 @@ SPEC CHECKSUMS:
283 flutter_inappwebview: 3d32228f1304635e7c028b0d4252937730bbc6cf
284 flutter_mailer: 2ef5a67087bc8c6c4cefd04a178bf1ae2c94cd83
285 flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
286 + fluttertoast: fafc4fa4d01a6a9e4f772ecd190ffa525e9e2d9c
287 in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d
288 local_auth_ios: c6cf091ded637a88f24f86a8875d8b0f526e2605
289 MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
@@ -290,6 +299,7 @@ SPEC CHECKSUMS:
299 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
300 SwiftProtobuf: 40bd808372cb8706108f22d28f8ab4a6b9bc6989
301 SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
302 + Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
303 uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
304 UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841
305 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
lib/core/wallet_connect/evm_chain_service.dart
+1 -1
@@ -6,7 +6,7 @@ import 'package:cake_wallet/core/wallet_connect/eth_transaction_model.dart';
6 import 'package:cake_wallet/core/wallet_connect/evm_chain_id.dart';
7 import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
8 import 'package:cake_wallet/generated/i18n.dart';
9 -import 'package:cake_wallet/src/screens/wallet_connect/widgets/error_display_widget.dart';
9 +import 'package:cake_wallet/src/screens/wallet_connect/widgets/message_display_widget.dart';
10 import 'package:cake_wallet/store/app_store.dart';
11 import 'package:cake_wallet/core/wallet_connect/models/chain_key_model.dart';
12 import 'package:cake_wallet/core/wallet_connect/models/connection_model.dart';
lib/core/wallet_connect/web3wallet_service.dart
+19 -1
@@ -10,7 +10,7 @@ import 'package:cake_wallet/core/wallet_connect/models/auth_request_model.dart';
10 import 'package:cake_wallet/core/wallet_connect/models/chain_key_model.dart';
11 import 'package:cake_wallet/core/wallet_connect/models/session_request_model.dart';
12 import 'package:cake_wallet/src/screens/wallet_connect/widgets/connection_request_widget.dart';
13 -import 'package:cake_wallet/src/screens/wallet_connect/widgets/error_display_widget.dart';
13 +import 'package:cake_wallet/src/screens/wallet_connect/widgets/message_display_widget.dart';
14 import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/web3_request_modal.dart';
15 import 'package:cake_wallet/store/app_store.dart';
16 import 'package:eth_sig_util/eth_sig_util.dart';
@@ -200,6 +200,24 @@ abstract class Web3WalletServiceBase with Store {
200 );
201 }
202
203 + @action
204 + Future<void> pairWithUri(Uri uri) async {
205 + try {
206 + log('Pairing with URI: $uri');
207 + await _web3Wallet.pair(uri: uri);
208 + } on WalletConnectError catch (e) {
209 + _bottomSheetHandler.queueBottomSheet(
210 + isModalDismissible: true,
211 + widget: BottomSheetMessageDisplayWidget(message: e.message),
212 + );
213 + } catch (e) {
214 + _bottomSheetHandler.queueBottomSheet(
215 + isModalDismissible: true,
216 + widget: BottomSheetMessageDisplayWidget(message: e.toString()),
217 + );
218 + }
219 + }
220 +
221 void _onPairingCreate(PairingEvent? args) {
222 log('Pairing Create Event: $args');
223 }
lib/di.dart
+5
@@ -51,6 +51,7 @@ import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_enter_code_page.dart
51 import 'package:cake_wallet/src/screens/support_chat/support_chat_page.dart';
52 import 'package:cake_wallet/src/screens/support_other_links/support_other_links_page.dart';
53 import 'package:cake_wallet/src/screens/wallet/wallet_edit_page.dart';
54 +import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
55 import 'package:cake_wallet/themes/theme_list.dart';
56 import 'package:cake_wallet/utils/device_info.dart';
57 import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
@@ -1153,5 +1154,9 @@ Future<void> setup({
1154 return ManageNodesPage(isPow, nodeListViewModel: getIt.get<NodeListViewModel>());
1155 });
1156
1157 + getIt.registerFactory(
1158 + () => WalletConnectConnectionsView(web3walletService: getIt.get<Web3WalletService>()));
1159 +
1160 +
1161 _isSetupFinished = true;
1162 }
lib/router.dart
+8
@@ -1,6 +1,7 @@
1 import 'package:cake_wallet/anonpay/anonpay_info_base.dart';
2 import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
3 import 'package:cake_wallet/core/totp_request_details.dart';
4 +import 'package:cake_wallet/core/wallet_connect/web3wallet_service.dart';
5 import 'package:cake_wallet/entities/contact_record.dart';
6 import 'package:cake_wallet/buy/order.dart';
7 import 'package:cake_wallet/entities/qr_view_data.dart';
@@ -49,6 +50,7 @@ import 'package:cake_wallet/src/screens/support_chat/support_chat_page.dart';
50 import 'package:cake_wallet/src/screens/support_other_links/support_other_links_page.dart';
51 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
52 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
53 +import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
54 import 'package:cake_wallet/utils/payment_request.dart';
55 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
56 import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
@@ -594,6 +596,12 @@ Route<dynamic> createRoute(RouteSettings settings) {
596 case Routes.managePowNodes:
597 return MaterialPageRoute<void>(builder: (_) => getIt.get<ManageNodesPage>(param1: true));
598
599 + case Routes.walletConnectConnectionsListing:
600 + return MaterialPageRoute<void>(
601 + builder: (_) => WalletConnectConnectionsView(
602 + web3walletService: getIt.get<Web3WalletService>(),
603 + launchUri: settings.arguments as Uri?,
604 + ));
605 default:
606 return MaterialPageRoute<void>(
607 builder: (_) => Scaffold(
lib/routes.dart
+1 -1
@@ -98,5 +98,5 @@ class Routes {
98 static const editToken = '/edit_token';
99 static const manageNodes = '/manage_nodes';
100 static const managePowNodes = '/manage_pow_nodes';
101 -
101 + static const walletConnectConnectionsListing = '/wallet-connect-connections-listing';
102 }
lib/src/screens/root/root.dart
+47 -6
@@ -1,15 +1,17 @@
1 import 'dart:async';
2 import 'package:cake_wallet/core/auth_service.dart';
3 import 'package:cake_wallet/core/totp_request_details.dart';
4 -import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
4 +import 'package:cake_wallet/generated/i18n.dart';
5 import 'package:cake_wallet/utils/device_info.dart';
6 import 'package:cake_wallet/utils/payment_request.dart';
7 +import 'package:cw_core/wallet_type.dart';
8 import 'package:flutter/material.dart';
9 import 'package:cake_wallet/routes.dart';
10 import 'package:cake_wallet/src/screens/auth/auth_page.dart';
11 import 'package:cake_wallet/store/app_store.dart';
12 import 'package:cake_wallet/store/authentication_store.dart';
13 import 'package:cake_wallet/entities/qr_scanner.dart';
14 +import 'package:fluttertoast/fluttertoast.dart';
15 import 'package:uni_links/uni_links.dart';
16
17 import '../setup_2fa/setup_2fa_enter_code_page.dart';
@@ -139,8 +141,9 @@ class RootState extends State<Root> with WidgetsBindingObserver {
141 }
142 _reset();
143 totpAuth.close(
142 - route: _isValidPaymentUri() ? Routes.send : null,
143 - arguments: PaymentRequest.fromUri(launchUri),
144 + route: _getRouteToGo(),
145 + arguments:
146 + isWalletConnectLink ? launchUri : PaymentRequest.fromUri(launchUri),
147 );
148 launchUri = null;
149 },
@@ -151,8 +154,8 @@ class RootState extends State<Root> with WidgetsBindingObserver {
154 } else {
155 _reset();
156 auth.close(
154 - route: _isValidPaymentUri() ? Routes.send : null,
155 - arguments: PaymentRequest.fromUri(launchUri),
157 + route: _getRouteToGo(),
158 + arguments: isWalletConnectLink ? launchUri : PaymentRequest.fromUri(launchUri),
159 );
160 launchUri = null;
161 }
@@ -166,8 +169,19 @@ class RootState extends State<Root> with WidgetsBindingObserver {
169 arguments: PaymentRequest.fromUri(launchUri),
170 );
171 launchUri = null;
172 + } else if (isWalletConnectLink) {
173 + if (widget.appStore.wallet!.type == WalletType.ethereum) {
174 + widget.navigatorKey.currentState?.pushNamed(
175 + Routes.walletConnectConnectionsListing,
176 + arguments: launchUri,
177 + );
178 + launchUri = null;
179 + } else {
180 + _nonETHWalletErrorToast(S.current.switchToETHWallet);
181 + }
182 }
170 -
183 +
184 + launchUri = null;
185 return WillPopScope(
186 onWillPop: () async => false,
187 child: widget.child,
@@ -187,4 +201,31 @@ class RootState extends State<Root> with WidgetsBindingObserver {
201 }
202
203 bool _isValidPaymentUri() => launchUri?.path.isNotEmpty ?? false;
204 +
205 + bool get isWalletConnectLink => launchUri?.authority == 'wc';
206 +
207 + String? _getRouteToGo() {
208 + if (isWalletConnectLink) {
209 + if (widget.appStore.wallet!.type != WalletType.ethereum) {
210 + _nonETHWalletErrorToast(S.current.switchToETHWallet);
211 + return null;
212 + }
213 + return Routes.walletConnectConnectionsListing;
214 + } else if (_isValidPaymentUri()) {
215 + return Routes.send;
216 + } else {
217 + return null;
218 + }
219 + }
220 +
221 + Future<void> _nonETHWalletErrorToast(String message) async {
222 + Fluttertoast.showToast(
223 + msg: message,
224 + toastLength: Toast.LENGTH_LONG,
225 + gravity: ToastGravity.SNACKBAR,
226 + backgroundColor: Colors.black,
227 + textColor: Colors.white,
228 + fontSize: 16.0,
229 + );
230 + }
231 }
lib/src/screens/settings/connection_sync_page.dart
+1 -9
@@ -87,15 +87,7 @@ class ConnectionSyncPage extends BasePage {
87 ),
88 if (dashboardViewModel.wallet.type == WalletType.ethereum) ...[
89 WalletConnectTile(
90 - onTap: () async {
91 - Navigator.of(context).push(
92 - MaterialPageRoute(
93 - builder: (context) {
94 - return WalletConnectConnectionsView(web3walletService: web3walletService!);
95 - },
96 - ),
97 - );
98 - },
90 + onTap: () => Navigator.of(context).pushNamed(Routes.walletConnectConnectionsListing),
91 ),
92 const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
93 ]
lib/src/screens/wallet_connect/wc_connections_listing_view.dart
+21 -10
@@ -19,7 +19,24 @@ import 'wc_pairing_detail_page.dart';
19 class WalletConnectConnectionsView extends StatelessWidget {
20 final Web3WalletService web3walletService;
21
22 - WalletConnectConnectionsView({required this.web3walletService, Key? key}) : super(key: key);
22 + WalletConnectConnectionsView({required this.web3walletService, Uri? launchUri, Key? key})
23 + : super(key: key) {
24 + _triggerPairingFromDeeplink(launchUri);
25 + }
26 +
27 + void _triggerPairingFromDeeplink(Uri? launchUri) async {
28 + if (launchUri == null) return;
29 +
30 + final actualLinkList = launchUri.query.split("uri=");
31 +
32 + final query = actualLinkList[1];
33 +
34 + final uri = Uri.decodeComponent(query);
35 +
36 + final uriData = Uri.parse(uri);
37 +
38 + await web3walletService.pairWithUri(uriData);
39 + }
40
41 @override
42 Widget build(BuildContext context) {
@@ -48,15 +65,9 @@ class WCPairingsWidget extends BasePage {
65
66 if (uri == null) return _invalidUriToast(context, S.current.nullURIError);
67
51 - try {
52 - log('_onFoundUri: $uri');
53 - final Uri uriData = Uri.parse(uri);
54 - await web3Wallet.pair(uri: uriData);
55 - } on WalletConnectError catch (e) {
56 - await _invalidUriToast(context, e.message);
57 - } catch (e) {
58 - await _invalidUriToast(context, e.toString());
59 - }
68 + log('_onFoundUri: $uri');
69 + final Uri uriData = Uri.parse(uri);
70 + await web3walletService.pairWithUri(uriData);
71 }
72
73 Future<String?> _showEnterWalletConnectURIPopUp(BuildContext context) async {
lib/src/screens/wallet_connect/widgets/message_display_widget.dart renamed
+13 -7
@@ -22,13 +22,19 @@ class BottomSheetMessageDisplayWidget extends StatelessWidget {
22 ),
23 ),
24 SizedBox(height: 8),
25 - Text(
26 - message,
27 - style: TextStyle(
28 - fontSize: 14,
29 - fontWeight: FontWeight.normal,
30 - color: Colors.white,
31 - ),
25 + Row(
26 + children: [
27 + Expanded(
28 + child: Text(
29 + message,
30 + style: TextStyle(
31 + fontSize: 14,
32 + fontWeight: FontWeight.normal,
33 + color: Colors.white,
34 + ),
35 + ),
36 + ),
37 + ],
38 ),
39 ],
40 );
pubspec_base.yaml
+1
@@ -92,6 +92,7 @@ dependencies:
92 git:
93 url: https://github.com/cake-tech/bitcoin_flutter.git
94 ref: cake-update-v3
95 + fluttertoast: 8.1.4
96
97 dev_dependencies:
98 flutter_test:
res/values/strings_ar.arb
+2 -1
@@ -722,5 +722,6 @@
722 "seed_key": "مفتاح البذور",
723 "enter_seed_phrase": "أدخل عبارة البذور الخاصة بك",
724 "add_contact": "ﻝﺎﺼﺗﺍ ﺔﻬﺟ ﺔﻓﺎﺿﺇ",
725 - "exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!"
725 + "exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
726 + "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ"
727 }
res/values/strings_bg.arb
+2 -1
@@ -718,5 +718,6 @@
718 "seed_key": "Ключ за семена",
719 "enter_seed_phrase": "Въведете вашата фраза за семена",
720 "add_contact": "Добави контакт",
721 - "exchange_provider_unsupported": "${providerName} вече не се поддържа!"
721 + "exchange_provider_unsupported": "${providerName} вече не се поддържа!",
722 + "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново"
723 }
res/values/strings_cs.arb
+2 -1
@@ -718,5 +718,6 @@
718 "seed_key": "Klíč semen",
719 "enter_seed_phrase": "Zadejte svou frázi semen",
720 "add_contact": "Přidat kontakt",
721 - "exchange_provider_unsupported": "${providerName} již není podporováno!"
721 + "exchange_provider_unsupported": "${providerName} již není podporováno!",
722 + "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu"
723 }
res/values/strings_de.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Seed-Schlüssel",
727 "enter_seed_phrase": "Geben Sie Ihre Seed-Phrase ein",
728 "add_contact": "Kontakt hinzufügen",
729 - "exchange_provider_unsupported": "${providerName} wird nicht mehr unterstützt!"
729 + "exchange_provider_unsupported": "${providerName} wird nicht mehr unterstützt!",
730 + "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut"
731 }
res/values/strings_en.arb
+2 -1
@@ -727,5 +727,6 @@
727 "seed_key": "Seed key",
728 "enter_seed_phrase": "Enter your seed phrase",
729 "add_contact": "Add contact",
730 - "exchange_provider_unsupported": "${providerName} is no longer supported!"
730 + "exchange_provider_unsupported": "${providerName} is no longer supported!",
731 + "switchToETHWallet": "Please switch to an Ethereum wallet and try again"
732 }
res/values/strings_es.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Llave de semilla",
727 "enter_seed_phrase": "Ingrese su frase de semillas",
728 "add_contact": "Agregar contacto",
729 - "exchange_provider_unsupported": "¡${providerName} ya no es compatible!"
729 + "exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
730 + "switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente."
731 }
res/values/strings_fr.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Clé de graines",
727 "enter_seed_phrase": "Entrez votre phrase de semence",
728 "add_contact": "Ajouter le contact",
729 - "exchange_provider_unsupported": "${providerName} n'est plus pris en charge!"
729 + "exchange_provider_unsupported": "${providerName} n'est plus pris en charge!",
730 + "switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer"
731 }
res/values/strings_ha.arb
+2 -1
@@ -704,5 +704,6 @@
704 "seed_key": "Maɓallin iri",
705 "enter_seed_phrase": "Shigar da Sert Sentarku",
706 "add_contact": "Ƙara lamba",
707 - "exchange_provider_unsupported": "${providerName}"
707 + "exchange_provider_unsupported": "${providerName}",
708 + "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa"
709 }
res/values/strings_hi.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "बीज कुंजी",
727 "enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें",
728 "add_contact": "संपर्क जोड़ें",
729 - "exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!"
729 + "exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
730 + "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें"
731 }
res/values/strings_hr.arb
+2 -1
@@ -724,5 +724,6 @@
724 "seed_key": "Sjemenski ključ",
725 "enter_seed_phrase": "Unesite svoju sjemensku frazu",
726 "add_contact": "Dodaj kontakt",
727 - "exchange_provider_unsupported": "${providerName} više nije podržan!"
727 + "exchange_provider_unsupported": "${providerName} više nije podržan!",
728 + "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno"
729 }
res/values/strings_id.arb
+2 -1
@@ -714,5 +714,6 @@
714 "seed_key": "Kunci benih",
715 "enter_seed_phrase": "Masukkan frasa benih Anda",
716 "add_contact": "Tambah kontak",
717 - "exchange_provider_unsupported": "${providerName} tidak lagi didukung!"
717 + "exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
718 + "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi"
719 }
res/values/strings_it.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Chiave di semi",
727 "enter_seed_phrase": "Inserisci la tua frase di semi",
728 "add_contact": "Aggiungi contatto",
729 - "exchange_provider_unsupported": "${providerName} non è più supportato!"
729 + "exchange_provider_unsupported": "${providerName} non è più supportato!",
730 + "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova"
731 }
res/values/strings_ja.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "シードキー",
727 "enter_seed_phrase": "シードフレーズを入力してください",
728 "add_contact": "連絡先を追加",
729 - "exchange_provider_unsupported": "${providerName}はサポートされなくなりました!"
729 + "exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
730 + "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください"
731 }
res/values/strings_ko.arb
+2 -1
@@ -724,5 +724,6 @@
724 "seed_key": "시드 키",
725 "enter_seed_phrase": "시드 문구를 입력하십시오",
726 "add_contact": "주소록에 추가",
727 - "exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!"
727 + "exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!",
728 + "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요."
729 }
res/values/strings_my.arb
+2 -1
@@ -724,5 +724,6 @@
724 "seed_key": "မျိုးစေ့သော့",
725 "enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ",
726 "add_contact": "အဆက်အသွယ်ထည့်ပါ။",
727 - "exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!"
727 + "exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!",
728 + "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။"
729 }
res/values/strings_nl.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Zaadsleutel",
727 "enter_seed_phrase": "Voer uw zaadzin in",
728 "add_contact": "Contactpersoon toevoegen",
729 - "exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!"
729 + "exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
730 + "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw"
731 }
res/values/strings_pl.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Klucz nasion",
727 "enter_seed_phrase": "Wprowadź swoją frazę nasienną",
728 "add_contact": "Dodaj kontakt",
729 - "exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!"
729 + "exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
730 + "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie"
731 }
res/values/strings_pt.arb
+2 -1
@@ -725,5 +725,6 @@
725 "seed_key": "Chave de semente",
726 "enter_seed_phrase": "Digite sua frase de semente",
727 "add_contact": "Adicionar contato",
728 - "exchange_provider_unsupported": "${providerName} não é mais suportado!"
728 + "exchange_provider_unsupported": "${providerName} não é mais suportado!",
729 + "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente"
730 }
res/values/strings_ru.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Ключ семян",
727 "enter_seed_phrase": "Введите свою семенную фразу",
728 "add_contact": "Добавить контакт",
729 - "exchange_provider_unsupported": "${providerName} больше не поддерживается!"
729 + "exchange_provider_unsupported": "${providerName} больше не поддерживается!",
730 + "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку."
731 }
res/values/strings_th.arb
+2 -1
@@ -724,5 +724,6 @@
724 "seed_key": "คีย์เมล็ดพันธุ์",
725 "enter_seed_phrase": "ป้อนวลีเมล็ดพันธุ์ของคุณ",
726 "add_contact": "เพิ่มผู้ติดต่อ",
727 - "exchange_provider_unsupported": "${providerName} ไม่ได้รับการสนับสนุนอีกต่อไป!"
727 + "exchange_provider_unsupported": "${providerName} ไม่ได้รับการสนับสนุนอีกต่อไป!",
728 + "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง"
729 }
res/values/strings_tl.arb
+2 -1
@@ -721,5 +721,6 @@
721 "seed_key": "Seed Key",
722 "enter_seed_phrase": "Ipasok ang iyong pariralang binhi",
723 "add_contact": "Magdagdag ng contact",
724 - "exchange_provider_unsupported": "Ang ${providerName} ay hindi na suportado!"
724 + "exchange_provider_unsupported": "Ang ${providerName} ay hindi na suportado!",
725 + "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli"
726 }
res/values/strings_tr.arb
+2 -1
@@ -724,5 +724,6 @@
724 "seed_key": "Tohum",
725 "enter_seed_phrase": "Tohum ifadenizi girin",
726 "add_contact": "Kişi ekle",
727 - "exchange_provider_unsupported": "${providerName} artık desteklenmiyor!"
727 + "exchange_provider_unsupported": "${providerName} artık desteklenmiyor!",
728 + "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin"
729 }
res/values/strings_uk.arb
+2 -1
@@ -726,5 +726,6 @@
726 "seed_key": "Насіннєвий ключ",
727 "enter_seed_phrase": "Введіть свою насіннєву фразу",
728 "add_contact": "Додати контакт",
729 - "exchange_provider_unsupported": "${providerName} більше не підтримується!"
729 + "exchange_provider_unsupported": "${providerName} більше не підтримується!",
730 + "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу"
731 }
res/values/strings_ur.arb
+2 -1
@@ -718,5 +718,6 @@
718 "seed_key": "بیج کی کلید",
719 "enter_seed_phrase": "اپنے بیج کا جملہ درج کریں",
720 "add_contact": "۔ﮟﯾﺮﮐ ﻞﻣﺎﺷ ﮧﻄﺑﺍﺭ",
721 - "exchange_provider_unsupported": "${providerName} اب تعاون نہیں کیا جاتا ہے!"
721 + "exchange_provider_unsupported": "${providerName} اب تعاون نہیں کیا جاتا ہے!",
722 + "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ"
723 }
res/values/strings_yo.arb
+2 -1
@@ -720,5 +720,6 @@
720 "seed_key": "Bọtini Ose",
721 "enter_seed_phrase": "Tẹ ọrọ-iru irugbin rẹ",
722 "add_contact": "Fi olubasọrọ kun",
723 - "exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!"
723 + "exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!",
724 + "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi"
725 }
res/values/strings_zh.arb
+2 -1
@@ -725,5 +725,6 @@
725 "seed_key": "种子钥匙",
726 "enter_seed_phrase": "输入您的种子短语",
727 "add_contact": "增加联系人",
728 - "exchange_provider_unsupported": "${providerName}不再支持!"
728 + "exchange_provider_unsupported": "${providerName}不再支持!",
729 + "switchToETHWallet": "请切换到以太坊钱包并重试"
730 }