Generic fixes (#1823)

* add timeout for mempool fee api and make it only in bitcoin * disable Monero Ledger for desktop * handle onramper tag issue * better handle main actions UI * make service status scrollable with a better UI * fix stupid race condition * minor handling * update btc fee api update our xmr node to use ssl * manually add supported unstoppable domains for now * change bitcoin default node code enhancement * revert debugging code [skip ci] * minor enhancements [skip ci] * increase sync indicator size [skip ci] * fix selecting USA country not triggering the reaction * fix scrolling on cake features page [skip ci]

Omar Hatem committed Nov 25, 2024 at 18:26 UTC 59e8550e4e194b54dd828ff7064fede3b4224c84
19 files changed +271 -152
assets/bitcoin_electrum_server_list.yml
-3
@@ -1,6 +1,3 @@
1 --
2 - uri: electrum.cakewallet.com:50002
3 - useSSL: true
1 -
2 uri: btc-electrum.cakewallet.com:50002
3 useSSL: true
assets/node_list.yml
+1
@@ -2,6 +2,7 @@
2 uri: xmr-node.cakewallet.com:18081
3 is_default: true
4 trusted: true
5 + useSSL: true
6 -
7 uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
8 is_default: false
cw_bitcoin/lib/electrum_wallet.dart
+4 -3
@@ -486,10 +486,11 @@ abstract class ElectrumWalletBase
486
487 @action
488 Future<void> updateFeeRates() async {
489 - if (await checkIfMempoolAPIIsEnabled()) {
489 + if (await checkIfMempoolAPIIsEnabled() && type == WalletType.bitcoin) {
490 try {
491 - final response =
492 - await http.get(Uri.parse("http://mempool.cakewallet.com:8999/api/v1/fees/recommended"));
491 + final response = await http
492 + .get(Uri.parse("https://mempool.cakewallet.com/api/v1/fees/recommended"))
493 + .timeout(Duration(seconds: 5));
494
495 final result = json.decode(response.body) as Map<String, dynamic>;
496 final slowFee = (result['economyFee'] as num?)?.toInt() ?? 0;
cw_monero/lib/api/wallet_manager.dart
+12 -2
@@ -286,8 +286,18 @@ Future<void> loadWallet(
286 /// 0: Software Wallet
287 /// 1: Ledger
288 /// 2: Trezor
289 - final deviceType = monero.WalletManager_queryWalletDevice(wmPtr,
290 - keysFileName: "$path.keys", password: password, kdfRounds: 1);
289 + late final deviceType;
290 +
291 + if (Platform.isAndroid || Platform.isIOS) {
292 + deviceType = monero.WalletManager_queryWalletDevice(
293 + wmPtr,
294 + keysFileName: "$path.keys",
295 + password: password,
296 + kdfRounds: 1,
297 + );
298 + } else {
299 + deviceType = 0;
300 + }
301
302 if (deviceType == 1) {
303 final dummyWPtr = wptr ??
lib/buy/onramper/onramper_buy_provider.dart
+6 -2
@@ -251,8 +251,12 @@ class OnRamperBuyProvider extends BuyProvider {
251 return tag;
252 case 'POL':
253 return 'POLYGON';
254 - default:
255 - return CryptoCurrency.fromString(tag).fullName ?? tag;
254 + default:
255 + try {
256 + return CryptoCurrency.fromString(tag).fullName!;
257 + } catch (_) {
258 + return tag;
259 + }
260 }
261 }
262
lib/entities/default_settings_migration.dart
+60 -10
@@ -260,10 +260,22 @@ Future<void> defaultSettingsMigration(
260 updateBtcElectrumNodeToUseSSL(nodes, sharedPreferences);
261 break;
262 case 43:
263 - _updateCakeXmrNode(nodes);
263 + await _updateCakeXmrNode(nodes);
264 _deselectExchangeProvider(sharedPreferences, "THORChain");
265 _deselectExchangeProvider(sharedPreferences, "SimpleSwap");
266 break;
267 + case 44:
268 + await _updateCakeXmrNode(nodes);
269 + await _changeDefaultNode(
270 + nodes: nodes,
271 + sharedPreferences: sharedPreferences,
272 + type: WalletType.bitcoin,
273 + newDefaultUri: newCakeWalletBitcoinUri,
274 + currentNodePreferenceKey: PreferencesKey.currentBitcoinElectrumSererIdKey,
275 + useSSL: true,
276 + oldUri: 'cakewallet.com',
277 + );
278 + break;
279
280 default:
281 break;
@@ -279,17 +291,54 @@ Future<void> defaultSettingsMigration(
291 await sharedPreferences.setInt(PreferencesKey.currentDefaultSettingsMigrationVersion, version);
292 }
293
282 -void _updateCakeXmrNode(Box<Node> nodes) {
294 +/// generic function for changing any wallet default node
295 +/// instead of making a new function for each change
296 +Future<void> _changeDefaultNode({
297 + required Box<Node> nodes,
298 + required SharedPreferences sharedPreferences,
299 + required WalletType type,
300 + required String newDefaultUri,
301 + required String currentNodePreferenceKey,
302 + required bool useSSL,
303 + required String oldUri, // leave empty if you want to force replace the node regardless of the user's current node
304 +}) async {
305 + final currentNodeId = sharedPreferences.getInt(currentNodePreferenceKey);
306 + final currentNode = nodes.values.firstWhere((node) => node.key == currentNodeId);
307 + final shouldReplace = currentNode.uriRaw.contains(oldUri);
308 +
309 + if (shouldReplace) {
310 + var newNodeId =
311 + nodes.values.firstWhereOrNull((element) => element.uriRaw == newDefaultUri)?.key;
312 +
313 + // new node doesn't exist, then add it
314 + if (newNodeId == null) {
315 + final newNode = Node(
316 + uri: newDefaultUri,
317 + type: type,
318 + useSSL: useSSL,
319 + );
320 +
321 + await nodes.add(newNode);
322 + newNodeId = newNode.key;
323 + }
324 +
325 + await sharedPreferences.setInt(currentNodePreferenceKey, newNodeId as int);
326 + }
327 +}
328 +
329 +Future<void> _updateCakeXmrNode(Box<Node> nodes) async {
330 final node = nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletMoneroUri);
331
285 - if (node != null && !node.trusted) {
332 + if (node != null) {
333 node.trusted = true;
287 - node.save();
334 + node.useSSL = true;
335 + await node.save();
336 }
337 }
338
339 void updateBtcElectrumNodeToUseSSL(Box<Node> nodes, SharedPreferences sharedPreferences) {
292 - final btcElectrumNode = nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletBitcoinUri);
340 + final btcElectrumNode =
341 + nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletBitcoinUri);
342
343 if (btcElectrumNode != null) {
344 btcElectrumNode.useSSL = true;
@@ -538,7 +587,6 @@ Node? getBitcoinCashDefaultElectrumServer({required Box<Node> nodes}) {
587 }
588
589 Node getMoneroDefaultNode({required Box<Node> nodes}) {
541 - final timeZone = DateTime.now().timeZoneOffset.inHours;
590 var nodeUri = newCakeWalletMoneroUri;
591
592 try {
@@ -858,7 +906,8 @@ Future<void> changeDefaultMoneroNode(
906 }
907 });
908
861 - final newCakeWalletNode = Node(uri: newCakeWalletMoneroUri, type: WalletType.monero, trusted: true);
909 + final newCakeWalletNode =
910 + Node(uri: newCakeWalletMoneroUri, type: WalletType.monero, trusted: true);
911
912 await nodeSource.add(newCakeWalletNode);
913
@@ -897,7 +946,7 @@ Future<void> updateBtcNanoWalletInfos(Box<WalletInfo> walletsInfoSource) async {
946 Future<void> changeDefaultNanoNode(
947 Box<Node> nodeSource, SharedPreferences sharedPreferences) async {
948 const oldNanoNodeUriPattern = 'rpc.nano.to';
900 - final currentNanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey);
949 + final currentNanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
950 final currentNanoNode = nodeSource.values.firstWhere((node) => node.key == currentNanoNodeId);
951
952 final newCakeWalletNode = Node(
@@ -909,7 +958,8 @@ Future<void> changeDefaultNanoNode(
958 await nodeSource.add(newCakeWalletNode);
959
960 if (currentNanoNode.uri.toString().contains(oldNanoNodeUriPattern)) {
912 - await sharedPreferences.setInt(PreferencesKey.currentNodeIdKey, newCakeWalletNode.key as int);
961 + await sharedPreferences.setInt(
962 + PreferencesKey.currentNanoNodeIdKey, newCakeWalletNode.key as int);
963 }
964 }
965
@@ -924,7 +974,7 @@ Future<void> changeDefaultBitcoinNode(
974 currentBitcoinNode.uri.toString().contains(cakeWalletBitcoinNodeUriPattern);
975
976 final newCakeWalletBitcoinNode =
927 - Node(uri: newCakeWalletBitcoinUri, type: WalletType.bitcoin, useSSL: false);
977 + Node(uri: newCakeWalletBitcoinUri, type: WalletType.bitcoin, useSSL: true);
978
979 if (!nodeSource.values.any((element) => element.uriRaw == newCakeWalletBitcoinUri)) {
980 await nodeSource.add(newCakeWalletBitcoinNode);
lib/entities/main_actions.dart
+1 -3
@@ -1,7 +1,5 @@
1 import 'package:cake_wallet/generated/i18n.dart';
2 import 'package:cake_wallet/routes.dart';
3 -import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
4 -import 'package:cake_wallet/utils/show_pop_up.dart';
3 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
4 import 'package:flutter/material.dart';
5
@@ -68,7 +66,7 @@ class MainActions {
66
67
68 static MainActions tradeAction = MainActions._(
71 - name: (context) => '${S.of(context).buy} / ${S.of(context).sell}',
69 + name: (context) => '${S.of(context).buy}/${S.of(context).sell}',
70 image: 'assets/images/buy_sell.png',
71 isEnabled: (viewModel) => viewModel.isEnabledTradeAction,
72 canShow: (viewModel) => viewModel.hasTradeAction,
lib/entities/parse_address_from_domain.dart
+74 -17
@@ -26,23 +26,80 @@ class AddressResolver {
26 final SettingsStore settingsStore;
27
28 static const unstoppableDomains = [
29 - 'crypto',
30 - 'zil',
31 - 'x',
32 - 'wallet',
33 - 'bitcoin',
34 - '888',
35 - 'nft',
36 - 'dao',
37 - 'blockchain',
38 - 'polygon',
39 - 'klever',
40 - 'hi',
41 - 'kresus',
42 - 'anime',
43 - 'manga',
44 - 'binanceus',
45 - 'xmr',
29 + "888",
30 + "altimist",
31 + "anime",
32 + "austin",
33 + "bald",
34 + "benji",
35 + "bet",
36 + "binanceus",
37 + "bitcoin",
38 + "bitget",
39 + "blockchain",
40 + "ca",
41 + "chomp",
42 + "clay",
43 + "co",
44 + "com",
45 + "crypto",
46 + "dao",
47 + "dfz",
48 + "digital",
49 + "dream",
50 + "eth",
51 + "ethermail",
52 + "farms",
53 + "fun",
54 + "go",
55 + "group",
56 + "hi",
57 + "host",
58 + "info",
59 + "io",
60 + "klever",
61 + "kresus",
62 + "kryptic",
63 + "lfg",
64 + "life",
65 + "live",
66 + "ltd",
67 + "manga",
68 + "metropolis",
69 + "moon",
70 + "mumu",
71 + "net",
72 + "nft",
73 + "online",
74 + "org",
75 + "pog",
76 + "polygon",
77 + "press",
78 + "pro",
79 + "propykeys",
80 + "pudgy",
81 + "pw",
82 + "raiin",
83 + "secret",
84 + "site",
85 + "smobler",
86 + "space",
87 + "stepn",
88 + "store",
89 + "tball",
90 + "tech",
91 + "ubu",
92 + "uno",
93 + "unstoppable",
94 + "wallet",
95 + "website",
96 + "wifi",
97 + "witg",
98 + "wrkx",
99 + "x",
100 + "xmr",
101 + "xyz",
102 + "zil",
103 ];
104
105 static String? extractAddressByType({required String raw, required CryptoCurrency type}) {
lib/main.dart
+1 -2
@@ -16,7 +16,6 @@ import 'package:cake_wallet/exchange/exchange_template.dart';
16 import 'package:cake_wallet/exchange/trade.dart';
17 import 'package:cake_wallet/generated/i18n.dart';
18 import 'package:cake_wallet/locales/locale.dart';
19 -import 'package:cake_wallet/monero/monero.dart';
19 import 'package:cake_wallet/reactions/bootstrap.dart';
20 import 'package:cake_wallet/router.dart' as Router;
21 import 'package:cake_wallet/routes.dart';
@@ -204,7 +203,7 @@ Future<void> initializeAppConfigs() async {
203 transactionDescriptions: transactionDescriptions,
204 secureStorage: secureStorage,
205 anonpayInvoiceInfo: anonpayInvoiceInfo,
207 - initialMigrationVersion: 43,
206 + initialMigrationVersion: 44,
207 );
208 }
209
lib/reactions/on_current_wallet_change.dart
+2
@@ -63,6 +63,8 @@ void startCurrentWalletChangeReaction(
63 startWalletSyncStatusChangeReaction(wallet, fiatConversionStore);
64 startCheckConnectionReaction(wallet, settingsStore);
65
66 + await Future.delayed(Duration.zero);
67 +
68 if (wallet.type == WalletType.monero ||
69 wallet.type == WalletType.wownero ||
70 wallet.type == WalletType.bitcoin ||
lib/src/screens/dashboard/dashboard_page.dart
+24 -22
@@ -291,32 +291,34 @@ class _DashboardPageView extends BasePage {
291 children: MainActions.all
292 .where((element) => element.canShow?.call(dashboardViewModel) ?? true)
293 .map(
294 - (action) => Semantics(
295 - button: true,
296 - enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
297 - child: ActionButton(
298 - key: ValueKey(
299 - 'dashboard_page_${action.name(context)}_action_button_key'),
300 - image: Image.asset(
301 - action.image,
302 - height: 24,
303 - width: 24,
304 - color: action.isEnabled?.call(dashboardViewModel) ?? true
305 - ? Theme.of(context)
306 - .extension<DashboardPageTheme>()!
307 - .mainActionsIconColor
294 + (action) => Expanded(
295 + child: Semantics(
296 + button: true,
297 + enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
298 + child: ActionButton(
299 + key: ValueKey(
300 + 'dashboard_page_${action.name(context)}_action_button_key'),
301 + image: Image.asset(
302 + action.image,
303 + height: 24,
304 + width: 24,
305 + color: action.isEnabled?.call(dashboardViewModel) ?? true
306 + ? Theme.of(context)
307 + .extension<DashboardPageTheme>()!
308 + .mainActionsIconColor
309 + : Theme.of(context)
310 + .extension<BalancePageTheme>()!
311 + .labelTextColor,
312 + ),
313 + title: action.name(context),
314 + onClick: () async =>
315 + await action.onTap(context, dashboardViewModel),
316 + textColor: action.isEnabled?.call(dashboardViewModel) ?? true
317 + ? null
318 : Theme.of(context)
319 .extension<BalancePageTheme>()!
320 .labelTextColor,
321 ),
312 - title: action.name(context),
313 - onClick: () async =>
314 - await action.onTap(context, dashboardViewModel),
315 - textColor: action.isEnabled?.call(dashboardViewModel) ?? true
316 - ? null
317 - : Theme.of(context)
318 - .extension<BalancePageTheme>()!
319 - .labelTextColor,
322 ),
323 ),
324 )
lib/src/screens/dashboard/pages/cake_features_page.dart
+60 -70
@@ -10,91 +10,81 @@ import 'package:cake_wallet/view_model/dashboard/cake_features_view_model.dart';
10 import 'package:flutter/material.dart';
11 import 'package:flutter_mobx/flutter_mobx.dart';
12 import 'package:url_launcher/url_launcher.dart';
13 -import 'package:flutter_svg/flutter_svg.dart';
13
14 class CakeFeaturesPage extends StatelessWidget {
15 CakeFeaturesPage({required this.dashboardViewModel, required this.cakeFeaturesViewModel});
16
17 final DashboardViewModel dashboardViewModel;
18 final CakeFeaturesViewModel cakeFeaturesViewModel;
20 - final _scrollController = ScrollController();
19
20 @override
21 Widget build(BuildContext context) {
22 return Padding(
23 padding: const EdgeInsets.symmetric(horizontal: 10.0),
26 - child: RawScrollbar(
27 - thumbColor: Colors.white.withOpacity(0.15),
28 - radius: Radius.circular(20),
29 - thumbVisibility: true,
30 - thickness: 2,
31 - controller: _scrollController,
32 - child: Padding(
33 - padding: const EdgeInsets.symmetric(horizontal: 10.0),
34 - child: Column(
35 - crossAxisAlignment: CrossAxisAlignment.start,
36 - children: [
37 - SizedBox(height: 50),
38 - Text(
39 - 'Cake ${S.of(context).features}',
40 - style: TextStyle(
41 - fontSize: 24,
42 - fontWeight: FontWeight.w500,
43 - color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
44 - ),
24 + child: Padding(
25 + padding: const EdgeInsets.symmetric(horizontal: 10.0),
26 + child: Column(
27 + crossAxisAlignment: CrossAxisAlignment.start,
28 + children: [
29 + SizedBox(height: 50),
30 + Text(
31 + 'Cake ${S.of(context).features}',
32 + style: TextStyle(
33 + fontSize: 24,
34 + fontWeight: FontWeight.w500,
35 + color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
36 ),
46 - Expanded(
47 - child: ListView(
48 - controller: _scrollController,
49 - children: <Widget>[
50 - SizedBox(height: 20),
51 - DashBoardRoundedCardWidget(
52 - onTap: () => _navigatorToGiftCardsPage(context),
53 - title: 'Cake Pay',
54 - subTitle: S.of(context).cake_pay_subtitle,
55 - image: Image.asset(
56 - 'assets/images/cards.png',
57 - height: 100,
58 - width: 115,
59 - fit: BoxFit.cover,
60 - ),
37 + ),
38 + Expanded(
39 + child: ListView(
40 + children: <Widget>[
41 + SizedBox(height: 20),
42 + DashBoardRoundedCardWidget(
43 + onTap: () => _navigatorToGiftCardsPage(context),
44 + title: 'Cake Pay',
45 + subTitle: S.of(context).cake_pay_subtitle,
46 + image: Image.asset(
47 + 'assets/images/cards.png',
48 + height: 100,
49 + width: 115,
50 + fit: BoxFit.cover,
51 ),
62 - SizedBox(height: 10),
63 - DashBoardRoundedCardWidget(
64 - onTap: () => _launchUrl("cake.nano-gpt.com"),
65 - title: "NanoGPT",
66 - subTitle: S.of(context).nanogpt_subtitle,
67 - image: Image.asset(
68 - 'assets/images/nanogpt.png',
69 - height: 80,
70 - width: 80,
71 - fit: BoxFit.cover,
72 - ),
52 + ),
53 + SizedBox(height: 10),
54 + DashBoardRoundedCardWidget(
55 + onTap: () => _launchUrl("cake.nano-gpt.com"),
56 + title: "NanoGPT",
57 + subTitle: S.of(context).nanogpt_subtitle,
58 + image: Image.asset(
59 + 'assets/images/nanogpt.png',
60 + height: 80,
61 + width: 80,
62 + fit: BoxFit.cover,
63 ),
74 - SizedBox(height: 10),
75 - Observer(
76 - builder: (context) {
77 - if (!dashboardViewModel.hasSignMessages) {
78 - return const SizedBox();
79 - }
80 - return DashBoardRoundedCardWidget(
81 - onTap: () => Navigator.of(context).pushNamed(Routes.signPage),
82 - title: S.current.sign_verify_message,
83 - subTitle: S.current.sign_verify_message_sub,
84 - icon: Icon(
85 - Icons.speaker_notes_rounded,
86 - color:
87 - Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
88 - size: 75,
89 - ),
90 - );
91 - },
92 - ),
93 - ],
94 - ),
64 + ),
65 + SizedBox(height: 10),
66 + Observer(
67 + builder: (context) {
68 + if (!dashboardViewModel.hasSignMessages) {
69 + return const SizedBox();
70 + }
71 + return DashBoardRoundedCardWidget(
72 + onTap: () => Navigator.of(context).pushNamed(Routes.signPage),
73 + title: S.current.sign_verify_message,
74 + subTitle: S.current.sign_verify_message_sub,
75 + icon: Icon(
76 + Icons.speaker_notes_rounded,
77 + color:
78 + Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
79 + size: 75,
80 + ),
81 + );
82 + },
83 + ),
84 + ],
85 ),
96 - ],
97 - ),
86 + ),
87 + ],
88 ),
89 ),
90 );
lib/src/screens/dashboard/widgets/sync_indicator_icon.dart
+1 -1
@@ -8,7 +8,7 @@ class SyncIndicatorIcon extends StatelessWidget {
8 {this.boolMode = true,
9 this.isSynced = false,
10 this.value = waiting,
11 - this.size = 4.0});
11 + this.size = 6.0});
12
13 final bool boolMode;
14 final bool isSynced;
lib/src/widgets/blockchain_height_widget.dart
+7 -5
@@ -191,11 +191,13 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
191 height = wownero!.getHeightByDate(date: date);
192 }
193 }
194 - setState(() {
195 - dateController.text = DateFormat('yyyy-MM-dd').format(date);
196 - restoreHeightController.text = '$height';
197 - _changeHeight(height);
198 - });
194 + if (mounted) {
195 + setState(() {
196 + dateController.text = DateFormat('yyyy-MM-dd').format(date);
197 + restoreHeightController.text = '$height';
198 + _changeHeight(height);
199 + });
200 + }
201 }
202 }
203
lib/src/widgets/services_updates_widget.dart
+6 -4
@@ -92,15 +92,17 @@ class _ServicesUpdatesWidgetState extends State<ServicesUpdatesWidget> {
92 );
93 }
94 return Padding(
95 - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 20),
96 - child: Stack(
95 + padding: const EdgeInsets.symmetric(horizontal: 12),
96 + child: Column(
97 children: [
98 - body,
98 + Expanded(child: body),
99 Align(
100 alignment: Alignment.bottomCenter,
101 child: Padding(
102 padding: EdgeInsets.symmetric(
103 - horizontal: MediaQuery.of(context).size.width / 8),
103 + horizontal: MediaQuery.of(context).size.width / 8,
104 + vertical: 20,
105 + ),
106 child: PrimaryImageButton(
107 onPressed: () {
108 try {
lib/store/app_store.dart
+2 -2
@@ -50,8 +50,8 @@ abstract class AppStoreBase with Store {
50 getIt.get<Web3WalletService>().create();
51 await getIt.get<Web3WalletService>().init();
52 }
53 - await getIt.get<SharedPreferences>().setString(PreferencesKey.currentWalletName, wallet.name);
54 - await getIt
53 + getIt.get<SharedPreferences>().setString(PreferencesKey.currentWalletName, wallet.name);
54 + getIt
55 .get<SharedPreferences>()
56 .setInt(PreferencesKey.currentWalletType, serializeToInt(wallet.type));
57 }
lib/view_model/cake_pay/cake_pay_cards_list_view_model.dart
+5 -1
@@ -204,7 +204,11 @@ abstract class CakePayCardsListViewModelBase with Store {
204 }
205
206 @action
207 - void setSelectedCountry(Country country) => settingsStore.selectedCakePayCountry = country;
207 + void setSelectedCountry(Country country) {
208 + // just so it triggers the reaction even when selecting the default country
209 + settingsStore.selectedCakePayCountry = null;
210 + settingsStore.selectedCakePayCountry = country;
211 + }
212
213 @action
214 void togglePrepaidCards() => displayPrepaidCards = !displayPrepaidCards;
res/values/strings_fr.arb
+1 -1
@@ -919,7 +919,7 @@
919 "wallet_seed_legacy": "Graine de portefeuille hérité",
920 "wallet_store_monero_wallet": "Portefeuille (Wallet) Monero",
921 "walletConnect": "WalletConnect",
922 - "wallets": "Portefeuilles (Wallets)",
922 + "wallets": "Portefeuilles",
923 "warning": "Avertissement",
924 "welcome": "Bienvenue sur",
925 "welcome_to_cakepay": "Bienvenue sur Cake Pay !",
scripts/macos/app_env.sh
+4 -4
@@ -16,13 +16,13 @@ if [ -n "$1" ]; then
16 fi
17
18 MONERO_COM_NAME="Monero.com"
19 -MONERO_COM_VERSION="1.8.0"
20 -MONERO_COM_BUILD_NUMBER=36
19 +MONERO_COM_VERSION="1.8.1"
20 +MONERO_COM_BUILD_NUMBER=37
21 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
22
23 CAKEWALLET_NAME="Cake Wallet"
24 -CAKEWALLET_VERSION="1.14.0"
25 -CAKEWALLET_BUILD_NUMBER=95
24 +CAKEWALLET_VERSION="1.14.1"
25 +CAKEWALLET_BUILD_NUMBER=96
26 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
27
28 if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then