Cw 497 wallet connect for desktop (#1134)

* feat: Implement WalletConnect for Desktop * feat: WalletConnect for Desktop * fix: Properly handle and dispose textEditingController for URI * chore: Move BottomSheetListener to Sidebar for desktop app * Remove unused variable and imports * Update desktop_settings_page.dart --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

Adegoke David committed Oct 19, 2023 at 17:25 UTC 374110db5476444a7d50ae598fd7766e8346ee36
35 files changed +344 -129
lib/di.dart
+5 -1
@@ -220,6 +220,7 @@ import 'package:cw_core/crypto_currency.dart';
220 import 'package:cake_wallet/entities/qr_view_data.dart';
221
222 import 'core/totp_request_details.dart';
223 +import 'src/screens/settings/desktop_settings/desktop_settings_page.dart';
224
225 final getIt = GetIt.instance;
226
@@ -488,6 +489,7 @@ Future<void> setup({
489 getIt.registerFactory<DesktopSidebarWrapper>(() {
490 final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();
491 return DesktopSidebarWrapper(
492 + bottomSheetService: getIt.get<BottomSheetService>(),
493 dashboardViewModel: getIt.get<DashboardViewModel>(),
494 desktopSidebarViewModel: getIt.get<DesktopSidebarViewModel>(),
495 child: getIt.get<DesktopDashboardPage>(param1: _navigatorKey),
@@ -496,7 +498,6 @@ Future<void> setup({
498 });
499 getIt.registerFactoryParam<DesktopDashboardPage, GlobalKey<NavigatorState>, void>(
500 (desktopKey, _) => DesktopDashboardPage(
499 - bottomSheetService: getIt.get<BottomSheetService>(),
501 balancePage: getIt.get<BalancePage>(),
502 dashboardViewModel: getIt.get<DashboardViewModel>(),
503 addressListViewModel: getIt.get<WalletAddressListViewModel>(),
@@ -515,6 +516,9 @@ Future<void> setup({
516 getIt.registerFactory<Modify2FAPage>(
517 () => Modify2FAPage(setup2FAViewModel: getIt.get<Setup2FAViewModel>()));
518
519 + getIt.registerFactory<DesktopSettingsPage>(
520 + () => DesktopSettingsPage());
521 +
522 getIt.registerFactoryParam<ReceiveOptionViewModel, ReceivePageOption?, void>(
523 (pageOption, _) => ReceiveOptionViewModel(getIt.get<AppStore>().wallet!, pageOption));
524
lib/router.dart
+1 -1
@@ -544,7 +544,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
544 );
545
546 case Routes.desktop_settings_page:
547 - return CupertinoPageRoute<void>(builder: (_) => DesktopSettingsPage());
547 + return CupertinoPageRoute<void>(builder: (_) => getIt.get<DesktopSettingsPage>());
548
549 case Routes.empty_no_route:
550 return MaterialPageRoute<void>(builder: (_) => SizedBox.shrink());
lib/src/screens/dashboard/desktop_dashboard_page.dart
+23 -30
@@ -1,10 +1,8 @@
1 import 'dart:async';
2 -import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
2 import 'package:cake_wallet/entities/preferences_key.dart';
3 import 'package:cake_wallet/generated/i18n.dart';
4 import 'package:cake_wallet/routes.dart';
5 import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
7 -import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart';
6 import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
7 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
8 import 'package:cake_wallet/utils/show_pop_up.dart';
@@ -21,14 +19,12 @@ import 'package:shared_preferences/shared_preferences.dart';
19 class DesktopDashboardPage extends StatelessWidget {
20 DesktopDashboardPage({
21 required this.balancePage,
24 - required this.bottomSheetService,
22 required this.dashboardViewModel,
23 required this.addressListViewModel,
24 required this.desktopKey,
25 });
26
27 final BalancePage balancePage;
31 - final BottomSheetService bottomSheetService;
28 final DashboardViewModel dashboardViewModel;
29 final WalletAddressListViewModel addressListViewModel;
30 final GlobalKey<NavigatorState> desktopKey;
@@ -40,34 +36,31 @@ class DesktopDashboardPage extends StatelessWidget {
36 Widget build(BuildContext context) {
37 _setEffects(context);
38
43 - return BottomSheetListener(
44 - bottomSheetService: bottomSheetService,
45 - child: Container(
46 - color: Theme.of(context).colorScheme.background,
47 - child: Row(
48 - crossAxisAlignment: CrossAxisAlignment.start,
49 - children: [
50 - Container(
51 - width: 400,
52 - child: balancePage,
53 - ),
54 - Flexible(
55 - child: ConstrainedBox(
56 - constraints: BoxConstraints(maxWidth: 500),
57 - child: Navigator(
58 - key: desktopKey,
59 - initialRoute: Routes.desktop_actions,
60 - onGenerateRoute: (settings) => Router.createRoute(settings),
61 - onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
62 - return [
63 - navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
64 - ];
65 - },
66 - ),
39 + return Container(
40 + color: Theme.of(context).colorScheme.background,
41 + child: Row(
42 + crossAxisAlignment: CrossAxisAlignment.start,
43 + children: [
44 + Container(
45 + width: 400,
46 + child: balancePage,
47 + ),
48 + Flexible(
49 + child: ConstrainedBox(
50 + constraints: BoxConstraints(maxWidth: 500),
51 + child: Navigator(
52 + key: desktopKey,
53 + initialRoute: Routes.desktop_actions,
54 + onGenerateRoute: (settings) => Router.createRoute(settings),
55 + onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
56 + return [
57 + navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
58 + ];
59 + },
60 ),
61 ),
69 - ],
70 - ),
62 + ),
63 + ],
64 ),
65 );
66 }
lib/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart
+75 -68
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
2 import 'package:cake_wallet/di.dart';
3 import 'package:cake_wallet/routes.dart';
4 import 'package:cake_wallet/src/screens/auth/auth_page.dart';
@@ -7,6 +8,7 @@ import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sideba
8 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart';
9 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
10 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
11 +import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart';
12 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
13 import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
14 import 'package:flutter/cupertino.dart';
@@ -16,6 +18,7 @@ import 'package:cake_wallet/router.dart' as Router;
18 import 'package:mobx/mobx.dart';
19
20 class DesktopSidebarWrapper extends BasePage {
21 + final BottomSheetService bottomSheetService;
22 final Widget child;
23 final DesktopSidebarViewModel desktopSidebarViewModel;
24 final DashboardViewModel dashboardViewModel;
@@ -23,6 +26,7 @@ class DesktopSidebarWrapper extends BasePage {
26
27 DesktopSidebarWrapper({
28 required this.child,
29 + required this.bottomSheetService,
30 required this.desktopSidebarViewModel,
31 required this.dashboardViewModel,
32 required this.desktopNavigatorKey,
@@ -67,63 +71,75 @@ class DesktopSidebarWrapper extends BasePage {
71 Widget body(BuildContext context) {
72 _setEffects();
73
70 - return Row(
71 - crossAxisAlignment: CrossAxisAlignment.start,
72 - children: [
73 - Observer(builder: (_) {
74 - return SideMenu(
75 - width: sideMenuWidth,
76 - topItems: [
77 - SideMenuItem(
78 - imagePath: 'assets/images/wallet_outline.png',
79 - isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
80 - onTap: () {
81 - desktopSidebarViewModel.onPageChange(SidebarItem.dashboard);
82 - desktopNavigatorKey.currentState
83 - ?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
84 - },
85 - ),
86 - SideMenuItem(
87 - onTap: () {
88 - if (desktopSidebarViewModel.currentPage == SidebarItem.transactions) {
74 + return BottomSheetListener(
75 + bottomSheetService: bottomSheetService,
76 + child: Row(
77 + crossAxisAlignment: CrossAxisAlignment.start,
78 + children: [
79 + Observer(builder: (_) {
80 + return SideMenu(
81 + width: sideMenuWidth,
82 + topItems: [
83 + SideMenuItem(
84 + imagePath: 'assets/images/wallet_outline.png',
85 + isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
86 + onTap: () {
87 + desktopSidebarViewModel.onPageChange(SidebarItem.dashboard);
88 desktopNavigatorKey.currentState
89 ?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
91 - desktopSidebarViewModel.resetSidebar();
92 - } else {
93 - desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
94 - desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
95 - }
96 - },
97 - isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
98 - imagePath: desktopSidebarViewModel.currentPage == SidebarItem.transactions
99 - ? selectedIconPath
100 - : unselectedIconPath,
101 - ),
102 - ],
103 - bottomItems: [
104 - SideMenuItem(
105 - imagePath: 'assets/images/support_icon.png',
106 - isSelected: desktopSidebarViewModel.currentPage == SidebarItem.support,
107 - onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.support)),
108 - SideMenuItem(
109 - imagePath: 'assets/images/settings_outline.png',
110 - isSelected: desktopSidebarViewModel.currentPage == SidebarItem.settings,
111 - onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.settings),
112 - ),
113 - ],
114 - );
115 - }),
116 - Expanded(
117 - child: PageView(
118 - controller: pageController,
119 - physics: NeverScrollableScrollPhysics(),
120 - children: [
121 - child,
122 - Container(
123 - color: Theme.of(context).colorScheme.background,
124 - padding: EdgeInsets.all(20),
125 - child: Navigator(
126 - initialRoute: Routes.support,
90 + },
91 + ),
92 + SideMenuItem(
93 + onTap: () {
94 + if (desktopSidebarViewModel.currentPage == SidebarItem.transactions) {
95 + desktopNavigatorKey.currentState
96 + ?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
97 + desktopSidebarViewModel.resetSidebar();
98 + } else {
99 + desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
100 + desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
101 + }
102 + },
103 + isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
104 + imagePath: desktopSidebarViewModel.currentPage == SidebarItem.transactions
105 + ? selectedIconPath
106 + : unselectedIconPath,
107 + ),
108 + ],
109 + bottomItems: [
110 + SideMenuItem(
111 + imagePath: 'assets/images/support_icon.png',
112 + isSelected: desktopSidebarViewModel.currentPage == SidebarItem.support,
113 + onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.support)),
114 + SideMenuItem(
115 + imagePath: 'assets/images/settings_outline.png',
116 + isSelected: desktopSidebarViewModel.currentPage == SidebarItem.settings,
117 + onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.settings),
118 + ),
119 + ],
120 + );
121 + }),
122 + Expanded(
123 + child: PageView(
124 + controller: pageController,
125 + physics: NeverScrollableScrollPhysics(),
126 + children: [
127 + child,
128 + Container(
129 + color: Theme.of(context).colorScheme.background,
130 + padding: EdgeInsets.all(20),
131 + child: Navigator(
132 + initialRoute: Routes.support,
133 + onGenerateRoute: (settings) => Router.createRoute(settings),
134 + onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
135 + return [
136 + navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
137 + ];
138 + },
139 + ),
140 + ),
141 + Navigator(
142 + initialRoute: Routes.desktop_settings_page,
143 onGenerateRoute: (settings) => Router.createRoute(settings),
144 onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
145 return [
@@ -131,20 +147,11 @@ class DesktopSidebarWrapper extends BasePage {
147 ];
148 },
149 ),
134 - ),
135 - Navigator(
136 - initialRoute: Routes.desktop_settings_page,
137 - onGenerateRoute: (settings) => Router.createRoute(settings),
138 - onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
139 - return [
140 - navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
141 - ];
142 - },
143 - ),
144 - ],
150 + ],
151 + ),
152 ),
146 - ),
147 - ],
153 + ],
154 + ),
155 );
156 }
157
lib/src/screens/settings/connection_sync_page.dart
+1 -1
@@ -85,7 +85,7 @@ class ConnectionSyncPage extends BasePage {
85 );
86 },
87 ),
88 - if (dashboardViewModel.wallet.type == WalletType.ethereum && DeviceInfo.instance.isMobile) ...[
88 + if (dashboardViewModel.wallet.type == WalletType.ethereum) ...[
89 WalletConnectTile(
90 onTap: () async {
91 Navigator.of(context).push(
lib/src/screens/settings/desktop_settings/desktop_settings_page.dart
+1
@@ -12,6 +12,7 @@ final _settingsNavigatorKey = GlobalKey<NavigatorState>();
12 class DesktopSettingsPage extends StatefulWidget {
13 const DesktopSettingsPage({super.key});
14
15 +
16 @override
17 State<DesktopSettingsPage> createState() => _DesktopSettingsPageState();
18 }
lib/src/screens/wallet_connect/wc_connections_listing_view.dart
+19 -1
@@ -2,8 +2,10 @@ import 'dart:developer';
2 import 'package:cake_wallet/core/wallet_connect/web3wallet_service.dart';
3 import 'package:cake_wallet/generated/i18n.dart';
4 import 'package:cake_wallet/src/screens/base_page.dart';
5 +import 'package:cake_wallet/src/screens/wallet_connect/widgets/enter_wallet_connect_uri_widget.dart';
6 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
7 import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
8 +import 'package:cake_wallet/utils/device_info.dart';
9 import 'package:flutter/material.dart';
10 import 'package:flutter_mobx/flutter_mobx.dart';
11 import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';
@@ -36,7 +38,13 @@ class WCPairingsWidget extends BasePage {
38 String get title => S.current.walletConnect;
39
40 Future<void> _onScanQrCode(BuildContext context, Web3Wallet web3Wallet) async {
39 - final String? uri = await presentQRScanner();
41 + final String? uri;
42 +
43 + if (DeviceInfo.instance.isMobile) {
44 + uri = await presentQRScanner();
45 + } else {
46 + uri = await _showEnterWalletConnectURIPopUp(context);
47 + }
48
49 if (uri == null) return _invalidUriToast(context, S.current.nullURIError);
50
@@ -51,6 +59,16 @@ class WCPairingsWidget extends BasePage {
59 }
60 }
61
62 + Future<String?> _showEnterWalletConnectURIPopUp(BuildContext context) async {
63 + final walletConnectURI = await showPopUp<String>(
64 + context: context,
65 + builder: (BuildContext context) {
66 + return EnterWalletConnectURIWrapperWidget();
67 + },
68 + );
69 + return walletConnectURI;
70 + }
71 +
72 Future<void> _invalidUriToast(BuildContext context, String message) async {
73 await showPopUp<void>(
74 context: context,
lib/src/screens/wallet_connect/widgets/enter_wallet_connect_uri_widget.dart new
+140
@@ -0,0 +1,140 @@
1 +import 'package:cake_wallet/generated/i18n.dart';
2 +import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
3 +import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
4 +import 'package:flutter/material.dart';
5 +import 'package:flutter/services.dart';
6 +
7 +class EnterWalletConnectURIWrapperWidget extends StatefulWidget {
8 + const EnterWalletConnectURIWrapperWidget({super.key});
9 +
10 + @override
11 + State<EnterWalletConnectURIWrapperWidget> createState() =>
12 + _EnterWallectConnectURIWrapperWidgetState();
13 +}
14 +
15 +class _EnterWallectConnectURIWrapperWidgetState extends State<EnterWalletConnectURIWrapperWidget> {
16 + late final TextEditingController controller;
17 +
18 + @override
19 + void initState() {
20 + super.initState();
21 + controller = TextEditingController();
22 + }
23 +
24 + @override
25 + void dispose() {
26 + controller.dispose();
27 + super.dispose();
28 + }
29 +
30 + @override
31 + Widget build(BuildContext context) {
32 + return _EnterWalletConnectURIWidget(
33 + controller: controller,
34 + );
35 + }
36 +}
37 +
38 +class _EnterWalletConnectURIWidget extends BaseAlertDialog {
39 + _EnterWalletConnectURIWidget({
40 + required this.controller,
41 + });
42 +
43 + final TextEditingController controller;
44 +
45 + @override
46 + String get titleText => S.current.enterWalletConnectURI;
47 +
48 + Future<void> _pasteWalletConnectURI() async {
49 + final clipboard = await Clipboard.getData('text/plain');
50 + final totpURI = clipboard?.text ?? '';
51 +
52 + if (totpURI.isNotEmpty) {
53 + controller.text = totpURI;
54 + }
55 + }
56 +
57 + @override
58 + Widget content(BuildContext context) {
59 + return Card(
60 + margin: EdgeInsets.zero,
61 + child: Column(
62 + children: [
63 + SizedBox(height: 8),
64 + Text(
65 + S.current.copyWalletConnectLink,
66 + style: Theme.of(context).textTheme.bodySmall,
67 + ),
68 + SizedBox(height: 16),
69 + TextField(
70 + controller: controller,
71 + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.white),
72 + decoration: InputDecoration(
73 + suffixIcon: Container(
74 + width: 24,
75 + height: 24,
76 + padding: EdgeInsets.only(top: 0),
77 + child: Semantics(
78 + label: S.of(context).paste,
79 + child: InkWell(
80 + onTap: () => _pasteWalletConnectURI(),
81 + child: Container(
82 + padding: EdgeInsets.all(8),
83 + decoration: BoxDecoration(
84 + borderRadius: BorderRadius.all(Radius.circular(6)),
85 + ),
86 + child: Image.asset(
87 + 'assets/images/paste_ios.png',
88 + color:
89 + Theme.of(context).extension<SendPageTheme>()!.textFieldButtonIconColor,
90 + ),
91 + ),
92 + ),
93 + ),
94 + ),
95 + hintText: S.current.enterWalletConnectURI,
96 + border: OutlineInputBorder(
97 + borderSide: BorderSide(
98 + color: Theme.of(context).extension<SendPageTheme>()!.textFieldBorderColor,
99 + ),
100 + ),
101 + hintStyle: TextStyle(
102 + color: Theme.of(context).extension<SendPageTheme>()!.textFieldHintColor,
103 + fontWeight: FontWeight.w500,
104 + fontSize: 14,
105 + ),
106 + ),
107 + ),
108 + ],
109 + ),
110 + );
111 + }
112 +
113 + @override
114 + Widget actionButtons(BuildContext context) {
115 + return Container(
116 + width: 300,
117 + height: 52,
118 + padding: EdgeInsets.only(left: 12, right: 12),
119 + color: Theme.of(context).dialogBackgroundColor,
120 + child: ButtonTheme(
121 + minWidth: double.infinity,
122 + child: TextButton(
123 + onPressed: () {
124 + Navigator.pop(context, controller.text);
125 + },
126 + child: Text(
127 + S.current.confirm,
128 + textAlign: TextAlign.center,
129 + style: TextStyle(
130 + fontSize: 15,
131 + fontWeight: FontWeight.w600,
132 + color: Theme.of(context).primaryColor,
133 + decoration: TextDecoration.none,
134 + ),
135 + ),
136 + ),
137 + ),
138 + );
139 + }
140 +}
macos/Podfile.lock
+1 -1
@@ -103,7 +103,7 @@ EXTERNAL SOURCES:
103
104 SPEC CHECKSUMS:
105 connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308
106 - cw_monero: ec03de55a19c4a2b174ea687e0f4202edc716fa4
106 + cw_monero: f8b7f104508efba2591548e76b5c058d05cba3f0
107 device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
108 devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
109 flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
res/values/strings_ar.arb
+3 -1
@@ -718,6 +718,8 @@
718 "do_not_have_enough_gas_asset": "ليس لديك ما يكفي من ${currency} لإجراء معاملة وفقًا لشروط شبكة blockchain الحالية. أنت بحاجة إلى المزيد من ${currency} لدفع رسوم شبكة blockchain، حتى لو كنت ترسل أصلًا مختلفًا.",
719 "totp_auth_url": "TOTP ﺔﻗﺩﺎﺼﻤﻟ URL ﻥﺍﻮﻨﻋ",
720 "awaitDAppProcessing": ".ﺔﺠﻟﺎﻌﻤﻟﺍ ﻦﻣ dApp ﻲﻬﺘﻨﻳ ﻰﺘﺣ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ",
721 + "copyWalletConnectLink": "ﺎﻨﻫ ﻪﻘﺼﻟﺍﻭ dApp ﻦﻣ WalletConnect ﻂﺑﺍﺭ ﺦﺴﻧﺍ",
722 + "enterWalletConnectURI": "WalletConnect ـﻟ URI ﻞﺧﺩﺃ",
723 "seed_key": "مفتاح البذور",
724 "enter_seed_phrase": "أدخل عبارة البذور الخاصة بك"
723 -}
\ No newline at end of file
725 +}
res/values/strings_bg.arb
+3 -1
@@ -714,6 +714,8 @@
714 "do_not_have_enough_gas_asset": "Нямате достатъчно ${currency}, за да извършите транзакция с текущите условия на блокчейн мрежата. Имате нужда от повече ${currency}, за да платите таксите за блокчейн мрежа, дори ако изпращате различен актив.",
715 "totp_auth_url": "TOTP AUTH URL",
716 "awaitDAppProcessing": "Моля, изчакайте dApp да завърши обработката.",
717 + "copyWalletConnectLink": "Копирайте връзката WalletConnect от dApp и я поставете тук",
718 + "enterWalletConnectURI": "Въведете URI на WalletConnect",
719 "seed_key": "Ключ за семена",
720 "enter_seed_phrase": "Въведете вашата фраза за семена"
719 -}
\ No newline at end of file
721 +}
res/values/strings_cs.arb
+3 -1
@@ -714,6 +714,8 @@
714 "do_not_have_enough_gas_asset": "Nemáte dostatek ${currency} k provedení transakce s aktuálními podmínkami blockchainové sítě. K placení poplatků za blockchainovou síť potřebujete více ${currency}, i když posíláte jiné aktivum.",
715 "totp_auth_url": "URL AUTH TOTP",
716 "awaitDAppProcessing": "Počkejte, až dApp dokončí zpracování.",
717 + "copyWalletConnectLink": "Zkopírujte odkaz WalletConnect z dApp a vložte jej sem",
718 + "enterWalletConnectURI": "Zadejte identifikátor URI WalletConnect",
719 "seed_key": "Klíč semen",
720 "enter_seed_phrase": "Zadejte svou frázi semen"
719 -}
\ No newline at end of file
721 +}
res/values/strings_de.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "Sie verfügen nicht über genügend ${currency}, um eine Transaktion unter den aktuellen Bedingungen des Blockchain-Netzwerks durchzuführen. Sie benötigen mehr ${currency}, um die Gebühren für das Blockchain-Netzwerk zu bezahlen, auch wenn Sie einen anderen Vermögenswert senden.",
723 "totp_auth_url": "TOTP-Auth-URL",
724 "awaitDAppProcessing": "Bitte warten Sie, bis die dApp die Verarbeitung abgeschlossen hat.",
725 + "copyWalletConnectLink": "Kopieren Sie den WalletConnect-Link von dApp und fügen Sie ihn hier ein",
726 + "enterWalletConnectURI": "Geben Sie den WalletConnect-URI ein",
727 "seed_key": "Samenschlüssel",
728 "enter_seed_phrase": "Geben Sie Ihre Samenphrase ein"
727 -}
\ No newline at end of file
729 +}
res/values/strings_en.arb
+3 -1
@@ -723,6 +723,8 @@
723 "do_not_have_enough_gas_asset": "You do not have enough ${currency} to make a transaction with the current blockchain network conditions. You need more ${currency} to pay blockchain network fees, even if you are sending a different asset.",
724 "totp_auth_url": "TOTP AUTH URL",
725 "awaitDAppProcessing": "Kindly wait for the dApp to finish processing.",
726 + "copyWalletConnectLink": "Copy the WalletConnect link from dApp and paste here",
727 + "enterWalletConnectURI": "Enter WalletConnect URI",
728 "seed_key": "Seed key",
729 "enter_seed_phrase": "Enter your seed phrase"
728 -}
\ No newline at end of file
730 +}
res/values/strings_es.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "No tienes suficiente ${currency} para realizar una transacción con las condiciones actuales de la red blockchain. Necesita más ${currency} para pagar las tarifas de la red blockchain, incluso si envía un activo diferente.",
723 "totp_auth_url": "URL de autenticación TOTP",
724 "awaitDAppProcessing": "Espere a que la dApp termine de procesarse.",
725 + "copyWalletConnectLink": "Copie el enlace de WalletConnect de dApp y péguelo aquí",
726 + "enterWalletConnectURI": "Ingrese el URI de WalletConnect",
727 "seed_key": "Llave de semilla",
728 "enter_seed_phrase": "Ingrese su frase de semillas"
727 -}
\ No newline at end of file
729 +}
res/values/strings_fr.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "Vous n'avez pas assez de ${currency} pour effectuer une transaction avec les conditions actuelles du réseau blockchain. Vous avez besoin de plus de ${currency} pour payer les frais du réseau blockchain, même si vous envoyez un actif différent.",
723 "totp_auth_url": "URL D'AUTORISATION TOTP",
724 "awaitDAppProcessing": "Veuillez attendre que le dApp termine le traitement.",
725 + "copyWalletConnectLink": "Copiez le lien WalletConnect depuis dApp et collez-le ici",
726 + "enterWalletConnectURI": "Saisissez l'URI de WalletConnect.",
727 "seed_key": "Clé de graines",
728 "enter_seed_phrase": "Entrez votre phrase de semence"
727 -}
\ No newline at end of file
729 +}
res/values/strings_ha.arb
+3 -1
@@ -700,6 +700,8 @@
700 "do_not_have_enough_gas_asset": "Ba ku da isassun ${currency} don yin ma'amala tare da yanayin cibiyar sadarwar blockchain na yanzu. Kuna buƙatar ƙarin ${currency} don biyan kuɗaɗen cibiyar sadarwar blockchain, koda kuwa kuna aika wata kadara daban.",
701 "totp_auth_url": "TOTP AUTH URL",
702 "awaitDAppProcessing": "Da fatan za a jira dApp ya gama aiki.",
703 + "copyWalletConnectLink": "Kwafi hanyar haɗin WalletConnect daga dApp kuma liƙa a nan",
704 + "enterWalletConnectURI": "Shigar da WalletConnect URI",
705 "seed_key": "Maɓallin iri",
706 "enter_seed_phrase": "Shigar da Sert Sentarku"
705 -}
\ No newline at end of file
707 +}
res/values/strings_hi.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "वर्तमान ब्लॉकचेन नेटवर्क स्थितियों में लेनदेन करने के लिए आपके पास पर्याप्त ${currency} नहीं है। ब्लॉकचेन नेटवर्क शुल्क का भुगतान करने के लिए आपको अधिक ${currency} की आवश्यकता है, भले ही आप एक अलग संपत्ति भेज रहे हों।",
723 "totp_auth_url": "TOTP प्रामाणिक यूआरएल",
724 "awaitDAppProcessing": "कृपया डीएपी की प्रोसेसिंग पूरी होने तक प्रतीक्षा करें।",
725 + "copyWalletConnectLink": "dApp से वॉलेटकनेक्ट लिंक को कॉपी करें और यहां पेस्ट करें",
726 + "enterWalletConnectURI": "वॉलेटकनेक्ट यूआरआई दर्ज करें",
727 "seed_key": "बीज कुंजी",
728 "enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें"
727 -}
\ No newline at end of file
729 +}
res/values/strings_hr.arb
+3 -1
@@ -720,6 +720,8 @@
720 "do_not_have_enough_gas_asset": "Nemate dovoljno ${currency} da izvršite transakciju s trenutačnim uvjetima blockchain mreže. Trebate više ${currency} da platite naknade za blockchain mrežu, čak i ako šaljete drugu imovinu.",
721 "totp_auth_url": "TOTP AUTH URL",
722 "awaitDAppProcessing": "Molimo pričekajte da dApp završi obradu.",
723 + "copyWalletConnectLink": "Kopirajte vezu WalletConnect iz dApp-a i zalijepite je ovdje",
724 + "enterWalletConnectURI": "Unesite WalletConnect URI",
725 "seed_key": "Sjemenski ključ",
726 "enter_seed_phrase": "Unesite svoju sjemensku frazu"
725 -}
\ No newline at end of file
727 +}
res/values/strings_id.arb
+3 -1
@@ -710,6 +710,8 @@
710 "do_not_have_enough_gas_asset": "Anda tidak memiliki cukup ${currency} untuk melakukan transaksi dengan kondisi jaringan blockchain saat ini. Anda memerlukan lebih banyak ${currency} untuk membayar biaya jaringan blockchain, meskipun Anda mengirimkan aset yang berbeda.",
711 "totp_auth_url": "URL Otentikasi TOTP",
712 "awaitDAppProcessing": "Mohon tunggu hingga dApp menyelesaikan pemrosesan.",
713 + "copyWalletConnectLink": "Salin tautan WalletConnect dari dApp dan tempel di sini",
714 + "enterWalletConnectURI": "Masukkan URI WalletConnect",
715 "seed_key": "Kunci benih",
716 "enter_seed_phrase": "Masukkan frasa benih Anda"
715 -}
\ No newline at end of file
717 +}
res/values/strings_it.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "Non hai abbastanza ${currency} per effettuare una transazione con le attuali condizioni della rete blockchain. Hai bisogno di più ${currency} per pagare le commissioni della rete blockchain, anche se stai inviando una risorsa diversa.",
723 "totp_auth_url": "URL DI AUT. TOTP",
724 "awaitDAppProcessing": "Attendi gentilmente che la dApp termini l'elaborazione.",
725 + "copyWalletConnectLink": "Copia il collegamento WalletConnect dalla dApp e incollalo qui",
726 + "enterWalletConnectURI": "Inserisci l'URI di WalletConnect",
727 "seed_key": "Chiave di semi",
728 "enter_seed_phrase": "Inserisci la tua frase di semi"
727 -}
\ No newline at end of file
729 +}
res/values/strings_ja.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "現在のブロックチェーン ネットワークの状況では、トランザクションを行うのに十分な ${currency} がありません。別のアセットを送信する場合でも、ブロックチェーン ネットワーク料金を支払うにはさらに ${currency} が必要です。",
723 "totp_auth_url": "TOTP認証URL",
724 "awaitDAppProcessing": "dAppの処理が完了するまでお待ちください。",
725 + "copyWalletConnectLink": "dApp から WalletConnect リンクをコピーし、ここに貼り付けます",
726 + "enterWalletConnectURI": "WalletConnect URI を入力してください",
727 "seed_key": "シードキー",
728 "enter_seed_phrase": "シードフレーズを入力してください"
727 -}
\ No newline at end of file
729 +}
res/values/strings_ko.arb
+3 -1
@@ -720,6 +720,8 @@
720 "do_not_have_enough_gas_asset": "현재 블록체인 네트워크 조건으로 거래를 하기에는 ${currency}이(가) 충분하지 않습니다. 다른 자산을 보내더라도 블록체인 네트워크 수수료를 지불하려면 ${currency}가 더 필요합니다.",
721 "totp_auth_url": "TOTP 인증 URL",
722 "awaitDAppProcessing": "dApp이 처리를 마칠 때까지 기다려주세요.",
723 + "copyWalletConnectLink": "dApp에서 WalletConnect 링크를 복사하여 여기에 붙여넣으세요.",
724 + "enterWalletConnectURI": "WalletConnect URI를 입력하세요.",
725 "seed_key": "시드 키",
726 "enter_seed_phrase": "시드 문구를 입력하십시오"
725 -}
\ No newline at end of file
727 +}
res/values/strings_my.arb
+3 -1
@@ -720,6 +720,8 @@
720 "do_not_have_enough_gas_asset": "လက်ရှိ blockchain ကွန်ရက်အခြေအနေများနှင့် အရောင်းအဝယ်ပြုလုပ်ရန် သင့်တွင် ${currency} လုံလောက်မှုမရှိပါ။ သင်သည် မတူညီသော ပိုင်ဆိုင်မှုတစ်ခုကို ပေးပို့နေသော်လည်း blockchain ကွန်ရက်အခကြေးငွေကို ပေးဆောင်ရန် သင်သည် နောက်ထပ် ${currency} လိုအပ်ပါသည်။",
721 "totp_auth_url": "TOTP AUTH URL",
722 "awaitDAppProcessing": "ကျေးဇူးပြု၍ dApp ကို စီမံလုပ်ဆောင်ခြင်း အပြီးသတ်ရန် စောင့်ပါ။",
723 + "copyWalletConnectLink": "dApp မှ WalletConnect လင့်ခ်ကို ကူးယူပြီး ဤနေရာတွင် ကူးထည့်ပါ။",
724 + "enterWalletConnectURI": "WalletConnect URI ကိုရိုက်ထည့်ပါ။",
725 "seed_key": "မျိုးစေ့သော့",
726 "enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ"
725 -}
\ No newline at end of file
727 +}
res/values/strings_nl.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "U heeft niet genoeg ${currency} om een transactie uit te voeren met de huidige blockchain-netwerkomstandigheden. U heeft meer ${currency} nodig om blockchain-netwerkkosten te betalen, zelfs als u een ander item verzendt.",
723 "totp_auth_url": "TOTP AUTH-URL",
724 "awaitDAppProcessing": "Wacht tot de dApp klaar is met verwerken.",
725 + "copyWalletConnectLink": "Kopieer de WalletConnect-link van dApp en plak deze hier",
726 + "enterWalletConnectURI": "Voer WalletConnect-URI in",
727 "seed_key": "Zaadsleutel",
728 "enter_seed_phrase": "Voer uw zaadzin in"
727 -}
\ No newline at end of file
729 +}
res/values/strings_pl.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "Nie masz wystarczającej ilości ${currency}, aby dokonać transakcji przy bieżących warunkach sieci blockchain. Potrzebujesz więcej ${currency}, aby uiścić opłaty za sieć blockchain, nawet jeśli wysyłasz inny zasób.",
723 "totp_auth_url": "Adres URL TOTP AUTH",
724 "awaitDAppProcessing": "Poczekaj, aż dApp zakończy przetwarzanie.",
725 + "copyWalletConnectLink": "Skopiuj link do WalletConnect z dApp i wklej tutaj",
726 + "enterWalletConnectURI": "Wprowadź identyfikator URI WalletConnect",
727 "seed_key": "Klucz nasion",
728 "enter_seed_phrase": "Wprowadź swoją frazę nasienną"
727 -}
\ No newline at end of file
729 +}
res/values/strings_pt.arb
+3 -1
@@ -721,6 +721,8 @@
721 "do_not_have_enough_gas_asset": "Você não tem ${currency} suficiente para fazer uma transação com as condições atuais da rede blockchain. Você precisa de mais ${currency} para pagar as taxas da rede blockchain, mesmo se estiver enviando um ativo diferente.",
722 "totp_auth_url": "URL de autenticação TOTP",
723 "awaitDAppProcessing": "Aguarde até que o dApp termine o processamento.",
724 + "copyWalletConnectLink": "Copie o link WalletConnect do dApp e cole aqui",
725 + "enterWalletConnectURI": "Insira o URI do WalletConnect",
726 "seed_key": "Chave de semente",
727 "enter_seed_phrase": "Digite sua frase de semente"
726 -}
\ No newline at end of file
728 +}
res/values/strings_ru.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "У вас недостаточно ${currency} для совершения транзакции при текущих условиях сети блокчейн. Вам нужно больше ${currency} для оплаты комиссий за сеть блокчейна, даже если вы отправляете другой актив.",
723 "totp_auth_url": "URL-адрес TOTP-АВТОРИЗАЦИИ",
724 "awaitDAppProcessing": "Пожалуйста, подождите, пока dApp завершит обработку.",
725 + "copyWalletConnectLink": "Скопируйте ссылку WalletConnect из dApp и вставьте сюда.",
726 + "enterWalletConnectURI": "Введите URI WalletConnect",
727 "seed_key": "Ключ семян",
728 "enter_seed_phrase": "Введите свою семенную фразу"
727 -}
\ No newline at end of file
729 +}
res/values/strings_th.arb
+3 -1
@@ -720,6 +720,8 @@
720 "do_not_have_enough_gas_asset": "คุณมี ${currency} ไม่เพียงพอที่จะทำธุรกรรมกับเงื่อนไขเครือข่ายบล็อคเชนในปัจจุบัน คุณต้องมี ${currency} เพิ่มขึ้นเพื่อชำระค่าธรรมเนียมเครือข่ายบล็อคเชน แม้ว่าคุณจะส่งสินทรัพย์อื่นก็ตาม",
721 "totp_auth_url": "URL การตรวจสอบสิทธิ์ TOTP",
722 "awaitDAppProcessing": "โปรดรอให้ dApp ประมวลผลเสร็จสิ้น",
723 + "copyWalletConnectLink": "คัดลอกลิงก์ WalletConnect จาก dApp แล้ววางที่นี่",
724 + "enterWalletConnectURI": "เข้าสู่ WalletConnect URI",
725 "seed_key": "คีย์เมล็ดพันธุ์",
726 "enter_seed_phrase": "ป้อนวลีเมล็ดพันธุ์ของคุณ"
725 -}
\ No newline at end of file
727 +}
res/values/strings_tl.arb
+3 -1
@@ -717,6 +717,8 @@
717 "do_not_have_enough_gas_asset": "Wala kang sapat na ${currency} para gumawa ng transaksyon sa kasalukuyang kundisyon ng network ng blockchain. Kailangan mo ng higit pang ${currency} upang magbayad ng mga bayarin sa network ng blockchain, kahit na nagpapadala ka ng ibang asset.",
718 "totp_auth_url": "TOTP AUTH URL",
719 "awaitDAppProcessing": "Pakihintay na matapos ang pagproseso ng dApp.",
720 + "copyWalletConnectLink": "Kopyahin ang link ng WalletConnect mula sa dApp at i-paste dito",
721 + "enterWalletConnectURI": "Ilagay ang WalletConnect URI",
722 "seed_key": "Seed Key",
723 "enter_seed_phrase": "Ipasok ang iyong pariralang binhi"
722 -}
\ No newline at end of file
724 +}
res/values/strings_tr.arb
+3 -1
@@ -720,6 +720,8 @@
720 "do_not_have_enough_gas_asset": "Mevcut blockchain ağ koşullarıyla işlem yapmak için yeterli ${currency} paranız yok. Farklı bir varlık gönderiyor olsanız bile blockchain ağ ücretlerini ödemek için daha fazla ${currency} miktarına ihtiyacınız var.",
721 "totp_auth_url": "TOTP YETKİ URL'si",
722 "awaitDAppProcessing": "Lütfen dApp'in işlemeyi bitirmesini bekleyin.",
723 + "copyWalletConnectLink": "WalletConnect bağlantısını dApp'ten kopyalayıp buraya yapıştırın",
724 + "enterWalletConnectURI": "WalletConnect URI'sini girin",
725 "seed_key": "Tohum",
726 "enter_seed_phrase": "Tohum ifadenizi girin"
725 -}
\ No newline at end of file
727 +}
res/values/strings_uk.arb
+3 -1
@@ -722,6 +722,8 @@
722 "do_not_have_enough_gas_asset": "У вас недостатньо ${currency}, щоб здійснити трансакцію з поточними умовами мережі блокчейн. Вам потрібно більше ${currency}, щоб сплатити комісію мережі блокчейн, навіть якщо ви надсилаєте інший актив.",
723 "totp_auth_url": "TOTP AUTH URL",
724 "awaitDAppProcessing": "Зачекайте, доки dApp завершить обробку.",
725 + "copyWalletConnectLink": "Скопіюйте посилання WalletConnect із dApp і вставте сюди",
726 + "enterWalletConnectURI": "Введіть URI WalletConnect",
727 "seed_key": "Насіннєвий ключ",
728 "enter_seed_phrase": "Введіть свою насіннєву фразу"
727 -}
\ No newline at end of file
729 +}
res/values/strings_ur.arb
+3 -1
@@ -714,6 +714,8 @@
714 "do_not_have_enough_gas_asset": "آپ کے پاس موجودہ بلاکچین نیٹ ورک کی شرائط کے ساتھ لین دین کرنے کے لیے کافی ${currency} نہیں ہے۔ آپ کو بلاکچین نیٹ ورک کی فیس ادا کرنے کے لیے مزید ${currency} کی ضرورت ہے، چاہے آپ کوئی مختلف اثاثہ بھیج رہے ہوں۔",
715 "totp_auth_url": "TOTP AUTH URL",
716 "awaitDAppProcessing": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﮓﻨﺴﯿﺳﻭﺮﭘ ﮯﮐ dApp ﻡﺮﮐ ﮦﺍﺮﺑ",
717 + "copyWalletConnectLink": "dApp ﮯﺳ WalletConnect ۔ﮟﯾﺮﮐ ﭧﺴﯿﭘ ﮞﺎﮩﯾ ﺭﻭﺍ ﮟﯾﺮﮐ ﯽﭘﺎﮐ ﻮﮐ ﮏﻨﻟ",
718 + "enterWalletConnectURI": "WalletConnect URI ۔ﮟﯾﺮﮐ ﺝﺭﺩ",
719 "seed_key": "بیج کی کلید",
720 "enter_seed_phrase": "اپنے بیج کا جملہ درج کریں"
719 -}
\ No newline at end of file
721 +}
res/values/strings_yo.arb
+3 -1
@@ -716,6 +716,8 @@
716 "do_not_have_enough_gas_asset": "O ko ni to ${currency} lati ṣe idunadura kan pẹlu awọn ipo nẹtiwọki blockchain lọwọlọwọ. O nilo diẹ sii ${currency} lati san awọn owo nẹtiwọọki blockchain, paapaa ti o ba nfi dukia miiran ranṣẹ.",
717 "totp_auth_url": "TOTP AUTH URL",
718 "awaitDAppProcessing": "Fi inurere duro fun dApp lati pari sisẹ.",
719 + "copyWalletConnectLink": "Daakọ ọna asopọ WalletConnect lati dApp ki o si lẹẹmọ nibi",
720 + "enterWalletConnectURI": "Tẹ WalletConnect URI sii",
721 "seed_key": "Bọtini Ose",
722 "enter_seed_phrase": "Tẹ ọrọ-iru irugbin rẹ"
721 -}
\ No newline at end of file
723 +}
res/values/strings_zh.arb
+3 -1
@@ -721,6 +721,8 @@
721 "do_not_have_enough_gas_asset": "您没有足够的 ${currency} 来在当前的区块链网络条件下进行交易。即使您发送的是不同的资产,您也需要更多的 ${currency} 来支付区块链网络费用。",
722 "totp_auth_url": "TOTP 授权 URL",
723 "awaitDAppProcessing": "请等待 dApp 处理完成。",
724 + "copyWalletConnectLink": "从 dApp 复制 WalletConnect 链接并粘贴到此处",
725 + "enterWalletConnectURI": "输入 WalletConnect URI",
726 "seed_key": "种子钥匙",
727 "enter_seed_phrase": "输入您的种子短语"
726 -}
\ No newline at end of file
728 +}