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