CW-506-Add-a-switch-to-enable-disable-domain-lookups (#1155)
* looks up domain ui * update address resolv func * add localization * minor fixes * Revert "Merge branch 'main' into CW-506-Add-a-switch-to-enable-disable-domain-lookups" This reverts commit 92924a90e828cc9adf0ac8d517ae32ef316353fd, reversing changes made to 5a2a20305404ed8e83e0b5974c0a58d703264bcd. * Revert "Revert "Merge branch 'main' into CW-506-Add-a-switch-to-enable-disable-domain-lookups"" This reverts commit 00cf6a1cadb5bca4798d42c1a3566cd8772bb6bb. * fix merge commit
Serhii committed
Nov 3, 2023 at 21:23 UTC
ca6ccf1cf9b66ae2e2f343cff89b77545c0b9482
36 files changed
+321
-55
lib/core/backup_service.dart
+36
@@ -246,6 +246,12 @@ class BackupService {
246
final sortBalanceTokensBy = data[PreferencesKey.sortBalanceBy] as int?;
247
final pinNativeTokenAtTop = data[PreferencesKey.pinNativeTokenAtTop] as bool?;
248
final useEtherscan = data[PreferencesKey.useEtherscan] as bool?;
249
+ final lookupsTwitter = data[PreferencesKey.lookupsTwitter] as bool?;
250
+ final lookupsMastodon = data[PreferencesKey.lookupsMastodon] as bool?;
251
+ final lookupsYatService = data[PreferencesKey.lookupsYatService] as bool?;
252
+ final lookupsUnstoppableDomains = data[PreferencesKey.lookupsUnstoppableDomains] as bool?;
253
+ final lookupsOpenAlias = data[PreferencesKey.lookupsOpenAlias] as bool?;
254
+ final lookupsENS = data[PreferencesKey.lookupsENS] as bool?;
255
final syncAll = data[PreferencesKey.syncAllKey] as bool?;
256
final syncMode = data[PreferencesKey.syncModeKey] as int?;
257
final autoGenerateSubaddressStatus = data[PreferencesKey.autoGenerateSubaddressStatusKey] as int?;
@@ -373,6 +379,24 @@ class BackupService {
379
if (useEtherscan != null)
380
await _sharedPreferences.setBool(PreferencesKey.useEtherscan, useEtherscan);
381
382
+ if (lookupsTwitter != null)
383
+ await _sharedPreferences.setBool(PreferencesKey.lookupsTwitter, lookupsTwitter);
384
+
385
+ if (lookupsMastodon != null)
386
+ await _sharedPreferences.setBool(PreferencesKey.lookupsMastodon, lookupsMastodon);
387
+
388
+ if (lookupsYatService != null)
389
+ await _sharedPreferences.setBool(PreferencesKey.lookupsYatService, lookupsYatService);
390
+
391
+ if (lookupsUnstoppableDomains != null)
392
+ await _sharedPreferences.setBool(PreferencesKey.lookupsUnstoppableDomains, lookupsUnstoppableDomains);
393
+
394
+ if (lookupsOpenAlias != null)
395
+ await _sharedPreferences.setBool(PreferencesKey.lookupsOpenAlias, lookupsOpenAlias);
396
+
397
+ if (lookupsENS != null)
398
+ await _sharedPreferences.setBool(PreferencesKey.lookupsENS, lookupsENS);
399
+
400
if (syncAll != null)
401
await _sharedPreferences.setBool(PreferencesKey.syncAllKey, syncAll);
402
@@ -529,6 +553,18 @@ class BackupService {
553
_sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop),
554
PreferencesKey.useEtherscan:
555
_sharedPreferences.getBool(PreferencesKey.useEtherscan),
556
+ PreferencesKey.lookupsTwitter:
557
+ _sharedPreferences.getBool(PreferencesKey.lookupsTwitter),
558
+ PreferencesKey.lookupsMastodon:
559
+ _sharedPreferences.getBool(PreferencesKey.lookupsMastodon),
560
+ PreferencesKey.lookupsYatService:
561
+ _sharedPreferences.getBool(PreferencesKey.lookupsYatService),
562
+ PreferencesKey.lookupsUnstoppableDomains:
563
+ _sharedPreferences.getBool(PreferencesKey.lookupsUnstoppableDomains),
564
+ PreferencesKey.lookupsOpenAlias:
565
+ _sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias),
566
+ PreferencesKey.lookupsENS:
567
+ _sharedPreferences.getBool(PreferencesKey.lookupsENS),
568
PreferencesKey.syncModeKey:
569
_sharedPreferences.getInt(PreferencesKey.syncModeKey),
570
PreferencesKey.syncAllKey:
lib/di.dart
+7
-1
@@ -36,6 +36,7 @@ import 'package:cake_wallet/src/screens/receive/anonpay_invoice_page.dart';
36
import 'package:cake_wallet/src/screens/receive/anonpay_receive_page.dart';
37
import 'package:cake_wallet/src/screens/restore/wallet_restore_choose_derivation.dart';
38
import 'package:cake_wallet/src/screens/settings/display_settings_page.dart';
39
+import 'package:cake_wallet/src/screens/settings/domain_lookups_page.dart';
40
import 'package:cake_wallet/src/screens/settings/manage_nodes_page.dart';
41
import 'package:cake_wallet/src/screens/settings/other_settings_page.dart';
42
import 'package:cake_wallet/src/screens/settings/privacy_page.dart';
@@ -751,6 +752,8 @@ Future<void> setup({
752
753
getIt.registerFactory(() => PrivacyPage(getIt.get<PrivacySettingsViewModel>()));
754
755
+ getIt.registerFactory(() => DomainLookupsPage(getIt.get<PrivacySettingsViewModel>()));
756
+
757
getIt.registerFactory(() => DisplaySettingsPage(getIt.get<DisplaySettingsViewModel>()));
758
759
getIt.registerFactory(() => OtherSettingsPage(getIt.get<OtherSettingsViewModel>()));
@@ -981,7 +984,10 @@ Future<void> setup({
984
getIt.registerFactory(() => YatService());
985
986
getIt.registerFactory(() =>
984
- AddressResolver(yatService: getIt.get<YatService>(), wallet: getIt.get<AppStore>().wallet!));
987
+ AddressResolver(
988
+ yatService: getIt.get<YatService>(),
989
+ wallet: getIt.get<AppStore>().wallet!,
990
+ settingsStore: getIt.get<SettingsStore>()));
991
992
getIt.registerFactoryParam<FullscreenQRPage, QrViewData, void>(
993
(QrViewData viewData, _) => FullscreenQRPage(qrViewData: viewData));
lib/entities/parse_address_from_domain.dart
+68
-53
@@ -6,6 +6,7 @@ import 'package:cake_wallet/entities/parsed_address.dart';
6
import 'package:cake_wallet/entities/unstoppable_domain_address.dart';
7
import 'package:cake_wallet/entities/emoji_string_extension.dart';
8
import 'package:cake_wallet/mastodon/mastodon_api.dart';
9
+import 'package:cake_wallet/store/settings_store.dart';
10
import 'package:cake_wallet/twitter/twitter_api.dart';
11
import 'package:cw_core/crypto_currency.dart';
12
import 'package:cw_core/wallet_base.dart';
@@ -13,11 +14,13 @@ import 'package:cw_core/wallet_type.dart';
14
import 'package:cake_wallet/entities/fio_address_provider.dart';
15
16
class AddressResolver {
16
- AddressResolver({required this.yatService, required this.wallet}) : walletType = wallet.type;
17
+ AddressResolver({required this.yatService, required this.wallet, required this.settingsStore})
18
+ : walletType = wallet.type;
19
20
final YatService yatService;
21
final WalletType walletType;
22
final WalletBase wallet;
23
+ final SettingsStore settingsStore;
24
25
static const unstoppableDomains = [
26
'crypto',
@@ -58,51 +61,55 @@ class AddressResolver {
61
Future<ParsedAddress> resolve(String text, String ticker) async {
62
try {
63
if (text.startsWith('@') && !text.substring(1).contains('@')) {
61
- final formattedName = text.substring(1);
62
- final twitterUser = await TwitterApi.lookupUserByName(userName: formattedName);
63
- final addressFromBio = extractAddressByType(
64
- raw: twitterUser.description, type: CryptoCurrency.fromString(ticker));
65
- if (addressFromBio != null) {
66
- return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text);
67
- }
64
+ if(settingsStore.lookupsTwitter) {
65
+ final formattedName = text.substring(1);
66
+ final twitterUser = await TwitterApi.lookupUserByName(userName: formattedName);
67
+ final addressFromBio = extractAddressByType(
68
+ raw: twitterUser.description, type: CryptoCurrency.fromString(ticker));
69
+ if (addressFromBio != null) {
70
+ return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text);
71
+ }
72
69
- final pinnedTweet = twitterUser.pinnedTweet?.text;
70
- if (pinnedTweet != null) {
71
- final addressFromPinnedTweet =
72
- extractAddressByType(raw: pinnedTweet, type: CryptoCurrency.fromString(ticker));
73
- if (addressFromPinnedTweet != null) {
74
- return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text);
73
+ final pinnedTweet = twitterUser.pinnedTweet?.text;
74
+ if (pinnedTweet != null) {
75
+ final addressFromPinnedTweet =
76
+ extractAddressByType(raw: pinnedTweet, type: CryptoCurrency.fromString(ticker));
77
+ if (addressFromPinnedTweet != null) {
78
+ return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text);
79
+ }
80
}
81
}
82
}
83
84
if (text.startsWith('@') && text.contains('@', 1) && text.contains('.', 1)) {
80
- final subText = text.substring(1);
81
- final hostNameIndex = subText.indexOf('@');
82
- final hostName = subText.substring(hostNameIndex + 1);
83
- final userName = subText.substring(0, hostNameIndex);
84
-
85
- final mastodonUser =
86
- await MastodonAPI.lookupUserByUserName(userName: userName, apiHost: hostName);
87
-
88
- if (mastodonUser != null) {
89
- String? addressFromBio =
90
- extractAddressByType(raw: mastodonUser.note, type: CryptoCurrency.fromString(ticker));
91
-
92
- if (addressFromBio != null) {
93
- return ParsedAddress.fetchMastodonAddress(address: addressFromBio, name: text);
94
- } else {
95
- final pinnedPosts =
96
- await MastodonAPI.getPinnedPosts(userId: mastodonUser.id, apiHost: hostName);
97
-
98
- if (pinnedPosts.isNotEmpty) {
99
- final userPinnedPostsText = pinnedPosts.map((item) => item.content).join('\n');
100
- String? addressFromPinnedPost = extractAddressByType(
101
- raw: userPinnedPostsText, type: CryptoCurrency.fromString(ticker));
102
-
103
- if (addressFromPinnedPost != null) {
104
- return ParsedAddress.fetchMastodonAddress(
105
- address: addressFromPinnedPost, name: text);
85
+ if (settingsStore.lookupsMastodon) {
86
+ final subText = text.substring(1);
87
+ final hostNameIndex = subText.indexOf('@');
88
+ final hostName = subText.substring(hostNameIndex + 1);
89
+ final userName = subText.substring(0, hostNameIndex);
90
+
91
+ final mastodonUser =
92
+ await MastodonAPI.lookupUserByUserName(userName: userName, apiHost: hostName);
93
+
94
+ if (mastodonUser != null) {
95
+ String? addressFromBio =
96
+ extractAddressByType(raw: mastodonUser.note, type: CryptoCurrency.fromString(ticker));
97
+
98
+ if (addressFromBio != null) {
99
+ return ParsedAddress.fetchMastodonAddress(address: addressFromBio, name: text);
100
+ } else {
101
+ final pinnedPosts =
102
+ await MastodonAPI.getPinnedPosts(userId: mastodonUser.id, apiHost: hostName);
103
+
104
+ if (pinnedPosts.isNotEmpty) {
105
+ final userPinnedPostsText = pinnedPosts.map((item) => item.content).join('\n');
106
+ String? addressFromPinnedPost = extractAddressByType(
107
+ raw: userPinnedPostsText, type: CryptoCurrency.fromString(ticker));
108
+
109
+ if (addressFromPinnedPost != null) {
110
+ return ParsedAddress.fetchMastodonAddress(
111
+ address: addressFromPinnedPost, name: text);
112
+ }
113
}
114
}
115
}
@@ -117,9 +124,11 @@ class AddressResolver {
124
}
125
}
126
if (text.hasOnlyEmojis) {
120
- if (walletType != WalletType.haven) {
121
- final addresses = await yatService.fetchYatAddress(text, ticker);
122
- return ParsedAddress.fetchEmojiAddress(addresses: addresses, name: text);
127
+ if(settingsStore.lookupsYatService) {
128
+ if (walletType != WalletType.haven) {
129
+ final addresses = await yatService.fetchYatAddress(text, ticker);
130
+ return ParsedAddress.fetchEmojiAddress(addresses: addresses, name: text);
131
+ }
132
}
133
}
134
final formattedName = OpenaliasRecord.formatDomainName(text);
@@ -131,23 +140,29 @@ class AddressResolver {
140
}
141
142
if (unstoppableDomains.any((domain) => name.trim() == domain)) {
134
- final address = await fetchUnstoppableDomainAddress(text, ticker);
135
- return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text);
143
+ if(settingsStore.lookupsUnstoppableDomains) {
144
+ final address = await fetchUnstoppableDomainAddress(text, ticker);
145
+ return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text);
146
+ }
147
}
148
149
if (text.endsWith(".eth")) {
139
- final address = await EnsRecord.fetchEnsAddress(text, wallet: wallet);
140
- if (address.isNotEmpty && address != "0x0000000000000000000000000000000000000000") {
141
- return ParsedAddress.fetchEnsAddress(name: text, address: address);
150
+ if (settingsStore.lookupsENS) {
151
+ final address = await EnsRecord.fetchEnsAddress(text, wallet: wallet);
152
+ if (address.isNotEmpty && address != "0x0000000000000000000000000000000000000000") {
153
+ return ParsedAddress.fetchEnsAddress(name: text, address: address);
154
+ }
155
}
156
}
157
158
if (formattedName.contains(".")) {
146
- final txtRecord = await OpenaliasRecord.lookupOpenAliasRecord(formattedName);
147
- if (txtRecord != null) {
148
- final record = await OpenaliasRecord.fetchAddressAndName(
149
- formattedName: formattedName, ticker: ticker, txtRecord: txtRecord);
150
- return ParsedAddress.fetchOpenAliasAddress(record: record, name: text);
159
+ if(settingsStore.lookupsOpenAlias) {
160
+ final txtRecord = await OpenaliasRecord.lookupOpenAliasRecord(formattedName);
161
+ if (txtRecord != null) {
162
+ final record = await OpenaliasRecord.fetchAddressAndName(
163
+ formattedName: formattedName, ticker: ticker, txtRecord: txtRecord);
164
+ return ParsedAddress.fetchOpenAliasAddress(record: record, name: text);
165
+ }
166
}
167
}
168
} catch (e) {
lib/entities/preferences_key.dart
+6
@@ -50,6 +50,12 @@ class PreferencesKey {
50
static const sortBalanceBy = 'sort_balance_by';
51
static const pinNativeTokenAtTop = 'pin_native_token_at_top';
52
static const useEtherscan = 'use_etherscan';
53
+ static const lookupsTwitter = 'looks_up_twitter';
54
+ static const lookupsMastodon = 'looks_up_mastodon';
55
+ static const lookupsYatService = 'looks_up_mastodon';
56
+ static const lookupsUnstoppableDomains = 'looks_up_mastodon';
57
+ static const lookupsOpenAlias = 'looks_up_mastodon';
58
+ static const lookupsENS = 'looks_up_ens';
59
60
static String moneroWalletUpdateV1Key(String name) =>
61
'${PreferencesKey.moneroWalletPasswordUpdateV1Base}_${name}';
lib/router.dart
+5
@@ -24,6 +24,7 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart
24
import 'package:cake_wallet/src/screens/restore/wallet_restore_choose_derivation.dart';
25
import 'package:cake_wallet/src/screens/settings/desktop_settings/desktop_settings_page.dart';
26
import 'package:cake_wallet/src/screens/settings/display_settings_page.dart';
27
+import 'package:cake_wallet/src/screens/settings/domain_lookups_page.dart';
28
import 'package:cake_wallet/src/screens/settings/manage_nodes_page.dart';
29
import 'package:cake_wallet/src/screens/settings/other_settings_page.dart';
30
import 'package:cake_wallet/src/screens/settings/privacy_page.dart';
@@ -322,6 +323,10 @@ Route<dynamic> createRoute(RouteSettings settings) {
323
return CupertinoPageRoute<void>(
324
fullscreenDialog: true, builder: (_) => getIt.get<PrivacyPage>());
325
326
+ case Routes.domainLookupsPage:
327
+ return CupertinoPageRoute<void>(
328
+ fullscreenDialog: true, builder: (_) => getIt.get<DomainLookupsPage>());
329
+
330
case Routes.displaySettingsPage:
331
return CupertinoPageRoute<void>(
332
fullscreenDialog: true, builder: (_) => getIt.get<DisplaySettingsPage>());
lib/routes.dart
+1
@@ -81,6 +81,7 @@ class Routes {
81
static const connectionSync = '/connection_sync_page';
82
static const securityBackupPage = '/security_and_backup_page';
83
static const privacyPage = '/privacy_page';
84
+ static const domainLookupsPage = '/domain_lookups_page';
85
static const displaySettingsPage = '/display_settings_page';
86
static const otherSettingsPage = '/other_settings_page';
87
static const advancedPrivacySettings = '/advanced_privacy_settings';
lib/src/screens/settings/domain_lookups_page.dart
new
+56
@@ -0,0 +1,56 @@
1
+import 'package:cake_wallet/generated/i18n.dart';
2
+import 'package:cake_wallet/src/screens/base_page.dart';
3
+import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
4
+import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart';
5
+import 'package:flutter/material.dart';
6
+import 'package:flutter_mobx/flutter_mobx.dart';
7
+
8
+class DomainLookupsPage extends BasePage {
9
+ DomainLookupsPage(this._privacySettingsViewModel);
10
+
11
+ @override
12
+ String get title => S.current.domain_looks_up;
13
+
14
+ final PrivacySettingsViewModel _privacySettingsViewModel;
15
+
16
+ @override
17
+ Widget body(BuildContext context) {
18
+ return SingleChildScrollView(
19
+ child: Observer(builder: (_) {
20
+ return Container(
21
+ padding: EdgeInsets.only(top: 10),
22
+ child: Column(
23
+ children: [
24
+ SettingsSwitcherCell(
25
+ title: 'Twitter',
26
+ value: _privacySettingsViewModel.lookupTwitter,
27
+ onValueChange: (_, bool value) => _privacySettingsViewModel.setLookupsTwitter(value)),
28
+ SettingsSwitcherCell(
29
+ title: 'Mastodon',
30
+ value: _privacySettingsViewModel.looksUpMastodon,
31
+ onValueChange: (_, bool value) => _privacySettingsViewModel.setLookupsMastodon(value)),
32
+ SettingsSwitcherCell(
33
+ title: 'Yat service',
34
+ value: _privacySettingsViewModel.looksUpYatService,
35
+ onValueChange: (_, bool value) => _privacySettingsViewModel.setLookupsYatService(value)),
36
+ SettingsSwitcherCell(
37
+ title: 'Unstoppable Domains',
38
+ value: _privacySettingsViewModel.looksUpUnstoppableDomains,
39
+ onValueChange: (_, bool value) => _privacySettingsViewModel.setLookupsUnstoppableDomains(value)),
40
+ SettingsSwitcherCell(
41
+ title: 'OpenAlias,',
42
+ value: _privacySettingsViewModel.looksUpOpenAlias,
43
+ onValueChange: (_, bool value) => _privacySettingsViewModel.setLookupsOpenAlias(value)),
44
+ SettingsSwitcherCell(
45
+ title: 'Ethereum Name Service',
46
+ value: _privacySettingsViewModel.looksUpENS,
47
+ onValueChange: (_, bool value) => _privacySettingsViewModel.setLookupsENS(value)),
48
+
49
+ //if (!isHaven) it does not work correctly
50
+ ],
51
+ ),
52
+ );
53
+ }),
54
+ );
55
+ }
56
+}
lib/src/screens/settings/privacy_page.dart
+6
@@ -1,7 +1,9 @@
1
import 'package:cake_wallet/entities/exchange_api_mode.dart';
2
import 'package:cake_wallet/entities/fiat_api_mode.dart';
3
import 'package:cake_wallet/generated/i18n.dart';
4
+import 'package:cake_wallet/routes.dart';
5
import 'package:cake_wallet/src/screens/base_page.dart';
6
+import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
7
import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart';
8
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
9
import 'package:cake_wallet/utils/device_info.dart';
@@ -84,6 +86,10 @@ class PrivacyPage extends BasePage {
86
onValueChange: (BuildContext _, bool value) {
87
_privacySettingsViewModel.setUseEtherscan(value);
88
}),
89
+ SettingsCellWithArrow(
90
+ title: S.current.domain_looks_up,
91
+ handler: (context) => Navigator.of(context).pushNamed(Routes.domainLookupsPage),
92
+ ),
93
],
94
);
95
}),
lib/store/settings_store.dart
+72
@@ -83,6 +83,12 @@ abstract class SettingsStoreBase with Store {
83
required this.sortBalanceBy,
84
required this.pinNativeTokenAtTop,
85
required this.useEtherscan,
86
+ required this.lookupsTwitter,
87
+ required this.lookupsMastodon,
88
+ required this.lookupsYatService,
89
+ required this.lookupsUnstoppableDomains,
90
+ required this.lookupsOpenAlias,
91
+ required this.lookupsENS,
92
TransactionPriority? initialBitcoinTransactionPriority,
93
TransactionPriority? initialMoneroTransactionPriority,
94
TransactionPriority? initialHavenTransactionPriority,
@@ -362,6 +368,36 @@ abstract class SettingsStoreBase with Store {
368
(bool useEtherscan) =>
369
_sharedPreferences.setBool(PreferencesKey.useEtherscan, useEtherscan));
370
371
+ reaction(
372
+ (_) => lookupsTwitter,
373
+ (bool looksUpTwitter) =>
374
+ _sharedPreferences.setBool(PreferencesKey.lookupsTwitter, looksUpTwitter));
375
+
376
+ reaction(
377
+ (_) => lookupsMastodon,
378
+ (bool looksUpMastodon) =>
379
+ _sharedPreferences.setBool(PreferencesKey.lookupsMastodon, looksUpMastodon));
380
+
381
+ reaction(
382
+ (_) => lookupsYatService,
383
+ (bool looksUpYatService) =>
384
+ _sharedPreferences.setBool(PreferencesKey.lookupsYatService, looksUpYatService));
385
+
386
+ reaction(
387
+ (_) => lookupsUnstoppableDomains,
388
+ (bool looksUpUnstoppableDomains) =>
389
+ _sharedPreferences.setBool(PreferencesKey.lookupsUnstoppableDomains, looksUpUnstoppableDomains));
390
+
391
+ reaction(
392
+ (_) => lookupsOpenAlias,
393
+ (bool looksUpOpenAlias) =>
394
+ _sharedPreferences.setBool(PreferencesKey.lookupsOpenAlias, looksUpOpenAlias));
395
+
396
+ reaction(
397
+ (_) => lookupsENS,
398
+ (bool looksUpENS) =>
399
+ _sharedPreferences.setBool(PreferencesKey.lookupsENS, looksUpENS));
400
+
401
this.nodes.observe((change) {
402
if (change.newValue != null && change.key != null) {
403
_saveCurrentNode(change.newValue!, change.key!);
@@ -488,6 +524,24 @@ abstract class SettingsStoreBase with Store {
524
@observable
525
bool useEtherscan;
526
527
+ @observable
528
+ bool lookupsTwitter;
529
+
530
+ @observable
531
+ bool lookupsMastodon;
532
+
533
+ @observable
534
+ bool lookupsYatService;
535
+
536
+ @observable
537
+ bool lookupsUnstoppableDomains;
538
+
539
+ @observable
540
+ bool lookupsOpenAlias;
541
+
542
+ @observable
543
+ bool lookupsENS;
544
+
545
@observable
546
SyncMode currentSyncMode;
547
@@ -647,6 +701,12 @@ abstract class SettingsStoreBase with Store {
701
final pinNativeTokenAtTop =
702
sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop) ?? true;
703
final useEtherscan = sharedPreferences.getBool(PreferencesKey.useEtherscan) ?? true;
704
+ final lookupsTwitter = sharedPreferences.getBool(PreferencesKey.lookupsTwitter) ?? true;
705
+ final lookupsMastodon = sharedPreferences.getBool(PreferencesKey.lookupsMastodon) ?? true;
706
+ final lookupsYatService = sharedPreferences.getBool(PreferencesKey.lookupsYatService) ?? true;
707
+ final lookupsUnstoppableDomains = sharedPreferences.getBool(PreferencesKey.lookupsUnstoppableDomains) ?? true;
708
+ final lookupsOpenAlias = sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias) ?? true;
709
+ final lookupsENS = sharedPreferences.getBool(PreferencesKey.lookupsENS) ?? true;
710
711
// If no value
712
if (pinLength == null || pinLength == 0) {
@@ -754,6 +814,12 @@ abstract class SettingsStoreBase with Store {
814
sortBalanceBy: sortBalanceBy,
815
pinNativeTokenAtTop: pinNativeTokenAtTop,
816
useEtherscan: useEtherscan,
817
+ lookupsTwitter: lookupsTwitter,
818
+ lookupsMastodon: lookupsMastodon,
819
+ lookupsYatService: lookupsYatService,
820
+ lookupsUnstoppableDomains: lookupsUnstoppableDomains,
821
+ lookupsOpenAlias: lookupsOpenAlias,
822
+ lookupsENS: lookupsENS,
823
initialMoneroTransactionPriority: moneroTransactionPriority,
824
initialBitcoinTransactionPriority: bitcoinTransactionPriority,
825
initialHavenTransactionPriority: havenTransactionPriority,
@@ -894,6 +960,12 @@ abstract class SettingsStoreBase with Store {
960
.values[sharedPreferences.getInt(PreferencesKey.sortBalanceBy) ?? sortBalanceBy.index];
961
pinNativeTokenAtTop = sharedPreferences.getBool(PreferencesKey.pinNativeTokenAtTop) ?? true;
962
useEtherscan = sharedPreferences.getBool(PreferencesKey.useEtherscan) ?? true;
963
+ lookupsTwitter = sharedPreferences.getBool(PreferencesKey.lookupsTwitter) ?? true;
964
+ lookupsMastodon = sharedPreferences.getBool(PreferencesKey.lookupsMastodon) ?? true;
965
+ lookupsYatService = sharedPreferences.getBool(PreferencesKey.lookupsYatService) ?? true;
966
+ lookupsUnstoppableDomains = sharedPreferences.getBool(PreferencesKey.lookupsUnstoppableDomains) ?? true;
967
+ lookupsOpenAlias = sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias) ?? true;
968
+ lookupsENS = sharedPreferences.getBool(PreferencesKey.lookupsENS) ?? true;
969
970
final nodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey);
971
final bitcoinElectrumServerId =
lib/view_model/settings/privacy_settings_view_model.dart
+38
-1
@@ -12,7 +12,8 @@ import 'package:cake_wallet/entities/fiat_api_mode.dart';
12
13
part 'privacy_settings_view_model.g.dart';
14
15
-class PrivacySettingsViewModel = PrivacySettingsViewModelBase with _$PrivacySettingsViewModel;
15
+class
16
+PrivacySettingsViewModel = PrivacySettingsViewModelBase with _$PrivacySettingsViewModel;
17
18
abstract class PrivacySettingsViewModelBase with Store {
19
PrivacySettingsViewModelBase(this._settingsStore, this._wallet);
@@ -57,6 +58,24 @@ abstract class PrivacySettingsViewModelBase with Store {
58
@computed
59
bool get useEtherscan => _settingsStore.useEtherscan;
60
61
+ @computed
62
+ bool get lookupTwitter => _settingsStore.lookupsTwitter;
63
+
64
+ @computed
65
+ bool get looksUpMastodon => _settingsStore.lookupsMastodon;
66
+
67
+ @computed
68
+ bool get looksUpYatService => _settingsStore.lookupsYatService;
69
+
70
+ @computed
71
+ bool get looksUpUnstoppableDomains => _settingsStore.lookupsUnstoppableDomains;
72
+
73
+ @computed
74
+ bool get looksUpOpenAlias => _settingsStore.lookupsOpenAlias;
75
+
76
+ @computed
77
+ bool get looksUpENS => _settingsStore.lookupsENS;
78
+
79
bool get canUseEtherscan => _wallet.type == WalletType.ethereum;
80
81
@action
@@ -78,6 +97,24 @@ abstract class PrivacySettingsViewModelBase with Store {
97
@action
98
void setDisableSell(bool value) => _settingsStore.disableSell = value;
99
100
+ @action
101
+ void setLookupsTwitter(bool value) => _settingsStore.lookupsTwitter = value;
102
+
103
+ @action
104
+ void setLookupsMastodon(bool value) => _settingsStore.lookupsMastodon = value;
105
+
106
+ @action
107
+ void setLookupsENS(bool value) => _settingsStore.lookupsENS = value;
108
+
109
+ @action
110
+ void setLookupsYatService(bool value) => _settingsStore.lookupsYatService = value;
111
+
112
+ @action
113
+ void setLookupsUnstoppableDomains(bool value) => _settingsStore.lookupsUnstoppableDomains = value;
114
+
115
+ @action
116
+ void setLookupsOpenAlias(bool value) => _settingsStore.lookupsOpenAlias = value;
117
+
118
@action
119
void setUseEtherscan(bool value) {
120
_settingsStore.useEtherscan = value;
res/values/strings_ar.arb
+1
@@ -723,6 +723,7 @@
723
"enter_seed_phrase": "أدخل عبارة البذور الخاصة بك",
724
"add_contact": "ﻝﺎﺼﺗﺍ ﺔﻬﺟ ﺔﻓﺎﺿﺇ",
725
"exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
726
+ "domain_looks_up": "ﻝﺎﺠﻤﻟﺍ ﺚﺤﺑ ﺕﺎﻴﻠﻤﻋ",
727
"require_for_exchanges_to_external_wallets": "ﺔﻴﺟﺭﺎﺧ ﻆﻓﺎﺤﻣ ﻰﻟﺇ ﺕﻻﺩﺎﺒﺘﻟﺍ ﺐﻠﻄﺘﺗ",
728
"camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ",
729
"switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ"
res/values/strings_bg.arb
+1
@@ -719,6 +719,7 @@
719
"enter_seed_phrase": "Въведете вашата фраза за семена",
720
"add_contact": "Добави контакт",
721
"exchange_provider_unsupported": "${providerName} вече не се поддържа!",
722
+ "domain_looks_up": "Търсене на домейни",
723
"require_for_exchanges_to_external_wallets": "Изискване за обмен към външни портфейли",
724
"camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.",
725
"switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново"
res/values/strings_cs.arb
+1
@@ -719,6 +719,7 @@
719
"enter_seed_phrase": "Zadejte svou frázi semen",
720
"add_contact": "Přidat kontakt",
721
"exchange_provider_unsupported": "${providerName} již není podporováno!",
722
+ "domain_looks_up": "Vyhledávání domén",
723
"require_for_exchanges_to_external_wallets": "Vyžadovat pro výměny do externích peněženek",
724
"camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.",
725
"switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu"
res/values/strings_de.arb
+1
@@ -727,6 +727,7 @@
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!",
730
+ "domain_looks_up": "Domain-Suchen",
731
"require_for_exchanges_to_external_wallets": "Erforderlich für den Umtausch in externe Wallets",
732
"camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.",
733
"switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut"
res/values/strings_en.arb
+1
@@ -728,6 +728,7 @@
728
"enter_seed_phrase": "Enter your seed phrase",
729
"add_contact": "Add contact",
730
"exchange_provider_unsupported": "${providerName} is no longer supported!",
731
+ "domain_looks_up": "Domain lookups",
732
"require_for_exchanges_to_external_wallets": "Require for exchanges to external wallets",
733
"camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.",
734
"switchToETHWallet": "Please switch to an Ethereum wallet and try again"
res/values/strings_es.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "Ingrese su frase de semillas",
728
"add_contact": "Agregar contacto",
729
"exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
730
+ "domain_looks_up": "Búsquedas de dominio",
731
"require_for_exchanges_to_external_wallets": "Requerido para intercambios a billeteras externas",
732
"camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.",
733
"switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente."
res/values/strings_fr.arb
+1
@@ -727,6 +727,7 @@
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!",
730
+ "domain_looks_up": "Recherches de domaine",
731
"require_for_exchanges_to_external_wallets": "Exiger des échanges vers des portefeuilles externes",
732
"camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.",
733
"switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer"
res/values/strings_ha.arb
+1
@@ -705,6 +705,7 @@
705
"enter_seed_phrase": "Shigar da Sert Sentarku",
706
"add_contact": "Ƙara lamba",
707
"exchange_provider_unsupported": "${providerName}",
708
+ "domain_looks_up": "Binciken yanki",
709
"require_for_exchanges_to_external_wallets": "Bukatar musanya zuwa wallet na waje",
710
"camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.",
711
"switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa"
res/values/strings_hi.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें",
728
"add_contact": "संपर्क जोड़ें",
729
"exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
730
+ "domain_looks_up": "डोमेन लुकअप",
731
"require_for_exchanges_to_external_wallets": "बाहरी वॉलेट में एक्सचेंज की आवश्यकता है",
732
"camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।",
733
"switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें"
res/values/strings_hr.arb
+1
@@ -725,6 +725,7 @@
725
"enter_seed_phrase": "Unesite svoju sjemensku frazu",
726
"add_contact": "Dodaj kontakt",
727
"exchange_provider_unsupported": "${providerName} više nije podržan!",
728
+ "domain_looks_up": "Pretraga domena",
729
"require_for_exchanges_to_external_wallets": "Zahtijeva razmjene na vanjske novčanike",
730
"camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.",
731
"switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno"
res/values/strings_id.arb
+1
@@ -715,6 +715,7 @@
715
"enter_seed_phrase": "Masukkan frasa benih Anda",
716
"add_contact": "Tambah kontak",
717
"exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
718
+ "domain_looks_up": "Pencarian domain",
719
"require_for_exchanges_to_external_wallets": "Memerlukan pertukaran ke dompet eksternal",
720
"camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.",
721
"switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi"
res/values/strings_it.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "Inserisci la tua frase di semi",
728
"add_contact": "Aggiungi contatto",
729
"exchange_provider_unsupported": "${providerName} non è più supportato!",
730
+ "domain_looks_up": "Ricerche di domini",
731
"require_for_exchanges_to_external_wallets": "Richiede scambi con portafogli esterni",
732
"camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.",
733
"switchToETHWallet": "Passa a un portafoglio Ethereum e riprova"
res/values/strings_ja.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "シードフレーズを入力してください",
728
"add_contact": "連絡先を追加",
729
"exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
730
+ "domain_looks_up": "ドメイン検索",
731
"require_for_exchanges_to_external_wallets": "外部ウォレットへの交換に必要",
732
"camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。",
733
"switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください"
res/values/strings_ko.arb
+1
@@ -725,6 +725,7 @@
725
"enter_seed_phrase": "시드 문구를 입력하십시오",
726
"add_contact": "주소록에 추가",
727
"exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!",
728
+ "domain_looks_up": "도메인 조회",
729
"require_for_exchanges_to_external_wallets": "외부 지갑으로의 교환을 위해 필요",
730
"camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.",
731
"switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요."
res/values/strings_my.arb
+1
@@ -725,6 +725,7 @@
725
"enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ",
726
"add_contact": "အဆက်အသွယ်ထည့်ပါ။",
727
"exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!",
728
+ "domain_looks_up": "ဒိုမိန်းရှာဖွေမှုများ",
729
"require_for_exchanges_to_external_wallets": "ပြင်ပပိုက်ဆံအိတ်များသို့ လဲလှယ်ရန် လိုအပ်သည်။",
730
"camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။",
731
"switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။"
res/values/strings_nl.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "Voer uw zaadzin in",
728
"add_contact": "Contactpersoon toevoegen",
729
"exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
730
+ "domain_looks_up": "Domein opzoeken",
731
"require_for_exchanges_to_external_wallets": "Vereist voor uitwisselingen naar externe portemonnees",
732
"camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.",
733
"switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw"
res/values/strings_pl.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "Wprowadź swoją frazę nasienną",
728
"add_contact": "Dodaj kontakt",
729
"exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
730
+ "domain_looks_up": "Wyszukiwanie domen",
731
"require_for_exchanges_to_external_wallets": "Wymagaj wymiany na portfele zewnętrzne",
732
"camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.",
733
"switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie"
res/values/strings_pt.arb
+1
@@ -726,6 +726,7 @@
726
"enter_seed_phrase": "Digite sua frase de semente",
727
"add_contact": "Adicionar contato",
728
"exchange_provider_unsupported": "${providerName} não é mais suportado!",
729
+ "domain_looks_up": "Pesquisas de domínio",
730
"require_for_exchanges_to_external_wallets": "Exigir trocas para carteiras externas",
731
"camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.",
732
"switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente"
res/values/strings_ru.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "Введите свою семенную фразу",
728
"add_contact": "Добавить контакт",
729
"exchange_provider_unsupported": "${providerName} больше не поддерживается!",
730
+ "domain_looks_up": "Поиск доменов",
731
"require_for_exchanges_to_external_wallets": "Требовать обмена на внешние кошельки",
732
"camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.",
733
"switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку."
res/values/strings_th.arb
+1
@@ -725,6 +725,7 @@
725
"enter_seed_phrase": "ป้อนวลีเมล็ดพันธุ์ของคุณ",
726
"add_contact": "เพิ่มผู้ติดต่อ",
727
"exchange_provider_unsupported": "${providerName} ไม่ได้รับการสนับสนุนอีกต่อไป!",
728
+ "domain_looks_up": "การค้นหาโดเมน",
729
"require_for_exchanges_to_external_wallets": "จำเป็นต้องแลกเปลี่ยนกับกระเป๋าเงินภายนอก",
730
"camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป",
731
"switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง"
res/values/strings_tl.arb
+1
@@ -722,6 +722,7 @@
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!",
725
+ "domain_looks_up": "Mga paghahanap ng domain",
726
"require_for_exchanges_to_external_wallets": "Kinakailangan para sa mga palitan sa mga panlabas na wallet",
727
"camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.",
728
"switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli"
res/values/strings_tr.arb
+1
@@ -725,6 +725,7 @@
725
"enter_seed_phrase": "Tohum ifadenizi girin",
726
"add_contact": "Kişi ekle",
727
"exchange_provider_unsupported": "${providerName} artık desteklenmiyor!",
728
+ "domain_looks_up": "Etki alanı aramaları",
729
"require_for_exchanges_to_external_wallets": "Harici cüzdanlara geçiş yapılmasını zorunlu kılın",
730
"camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.",
731
"switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin"
res/values/strings_uk.arb
+1
@@ -727,6 +727,7 @@
727
"enter_seed_phrase": "Введіть свою насіннєву фразу",
728
"add_contact": "Додати контакт",
729
"exchange_provider_unsupported": "${providerName} більше не підтримується!",
730
+ "domain_looks_up": "Пошук доменів",
731
"require_for_exchanges_to_external_wallets": "Потрібен для обміну на зовнішні гаманці",
732
"camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.",
733
"switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу"
res/values/strings_ur.arb
+1
@@ -719,6 +719,7 @@
719
"enter_seed_phrase": "اپنے بیج کا جملہ درج کریں",
720
"add_contact": "۔ﮟﯾﺮﮐ ﻞﻣﺎﺷ ﮧﻄﺑﺍﺭ",
721
"exchange_provider_unsupported": "${providerName} اب تعاون نہیں کیا جاتا ہے!",
722
+ "domain_looks_up": "ڈومین تلاش کرنا",
723
"require_for_exchanges_to_external_wallets": "۔ﮯﮨ ﺕﺭﻭﺮﺿ ﯽﮐ ﮯﻟﺩﺎﺒﺗ ﮟﯿﻣ ﮮﻮﭩﺑ ﯽﻧﻭﺮﯿﺑ",
724
"camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ",
725
"switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ"
res/values/strings_yo.arb
+1
@@ -721,6 +721,7 @@
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ọ!",
724
+ "domain_looks_up": "Awọn wiwa agbegbe",
725
"require_for_exchanges_to_external_wallets": "Beere fun awọn paṣipaarọ si awọn apamọwọ ita",
726
"camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.",
727
"switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi"
res/values/strings_zh.arb
+1
@@ -726,6 +726,7 @@
726
"enter_seed_phrase": "输入您的种子短语",
727
"add_contact": "增加联系人",
728
"exchange_provider_unsupported": "${providerName}不再支持!",
729
+ "domain_looks_up": "域名查找",
730
"require_for_exchanges_to_external_wallets": "需要兑换到外部钱包",
731
"camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。",
732
"switchToETHWallet": "请切换到以太坊钱包并重试"