v5.1.0 Release Candidate (#2332)

* v5.1.0 Release Candidate * update app versions [skip ci] * separate secrets for Monero.com [skip ci] * fix: amount getting wiped when pasting address * update Trocador Monero api key [skip ci] * move fiat api key to headers [skip ci] * latest Release candidate

Omar Hatem committed Jun 27, 2025 at 22:20 UTC c2cca1ff37e770e6322ce40e102a45a1b9601300
20 files changed +95 -70
.github/workflows/automated_integration_test.yml
+5 -3
@@ -153,8 +153,8 @@ jobs:
153 echo "const shortKey = '${{ secrets.SHORT_KEY }}';" >> lib/.secrets.g.dart
154 echo "const backupSalt = '${{ secrets.BACKUP_SALT }}';" >> lib/.secrets.g.dart
155 echo "const backupKeychainSalt = '${{ secrets.BACKUP_KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart
156 - echo "const changeNowApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
157 - echo "const changeNowApiKeyDesktop = '${{ secrets.CHANGE_NOW_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
156 + echo "const changeNowCakeWalletApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
157 + echo "const changeNowMoneroApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
158 echo "const wyreSecretKey = '${{ secrets.WYRE_SECRET_KEY }}';" >> lib/.secrets.g.dart
159 echo "const wyreApiKey = '${{ secrets.WYRE_API_KEY }}';" >> lib/.secrets.g.dart
160 echo "const wyreAccountId = '${{ secrets.WYRE_ACCOUNT_ID }}';" >> lib/.secrets.g.dart
@@ -168,6 +168,7 @@ jobs:
168 echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
169 echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
170 echo "const trocadorApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
171 + echo "const trocadorMoneroApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
172 echo "const trocadorExchangeMarkup = '${{ secrets.TROCADOR_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart
173 echo "const anonPayReferralCode = '${{ secrets.ANON_PAY_REFERRAL_CODE }}';" >> lib/.secrets.g.dart
174 echo "const fiatApiKey = '${{ secrets.FIAT_API_KEY }}';" >> lib/.secrets.g.dart
@@ -178,7 +179,8 @@ jobs:
179 echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
180 echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
181 echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
181 - echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
182 + echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
183 + echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
184 echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
185 echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
186 echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
.github/workflows/pr_test_build_android.yml
+5 -3
@@ -98,8 +98,8 @@ jobs:
98 else
99 echo "const backupKeychainSalt = '${{ secrets.BACKUP_KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart
100 fi
101 - echo "const changeNowApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
102 - echo "const changeNowApiKeyDesktop = '${{ secrets.CHANGE_NOW_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
101 + echo "const changeNowCakeWalletApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
102 + echo "const changeNowMoneroApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
103 echo "const wyreSecretKey = '${{ secrets.WYRE_SECRET_KEY }}';" >> lib/.secrets.g.dart
104 echo "const wyreApiKey = '${{ secrets.WYRE_API_KEY }}';" >> lib/.secrets.g.dart
105 echo "const wyreAccountId = '${{ secrets.WYRE_ACCOUNT_ID }}';" >> lib/.secrets.g.dart
@@ -113,6 +113,7 @@ jobs:
113 echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
114 echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
115 echo "const trocadorApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
116 + echo "const trocadorMoneroApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
117 echo "const trocadorExchangeMarkup = '${{ secrets.TROCADOR_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart
118 echo "const anonPayReferralCode = '${{ secrets.ANON_PAY_REFERRAL_CODE }}';" >> lib/.secrets.g.dart
119 echo "const fiatApiKey = '${{ secrets.FIAT_API_KEY }}';" >> lib/.secrets.g.dart
@@ -124,7 +125,8 @@ jobs:
125 echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
126 echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
127 echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
127 - echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
128 + echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
129 + echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
130 echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
131 echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
132 echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
.github/workflows/pr_test_build_linux.yml
+5 -3
@@ -91,8 +91,8 @@ jobs:
91 else
92 echo "const backupKeychainSalt = '${{ secrets.BACKUP_KEY_CHAIN_SALT }}';" >> lib/.secrets.g.dart
93 fi
94 - echo "const changeNowApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
95 - echo "const changeNowApiKeyDesktop = '${{ secrets.CHANGE_NOW_API_KEY_DESKTOP }}';" >> lib/.secrets.g.dart
94 + echo "const changeNowCakeWalletApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
95 + echo "const changeNowMoneroApiKey = '${{ secrets.CHANGE_NOW_API_KEY }}';" >> lib/.secrets.g.dart
96 echo "const wyreSecretKey = '${{ secrets.WYRE_SECRET_KEY }}';" >> lib/.secrets.g.dart
97 echo "const wyreApiKey = '${{ secrets.WYRE_API_KEY }}';" >> lib/.secrets.g.dart
98 echo "const wyreAccountId = '${{ secrets.WYRE_ACCOUNT_ID }}';" >> lib/.secrets.g.dart
@@ -106,6 +106,7 @@ jobs:
106 echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
107 echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
108 echo "const trocadorApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
109 + echo "const trocadorMoneroApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart
110 echo "const trocadorExchangeMarkup = '${{ secrets.TROCADOR_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart
111 echo "const anonPayReferralCode = '${{ secrets.ANON_PAY_REFERRAL_CODE }}';" >> lib/.secrets.g.dart
112 echo "const fiatApiKey = '${{ secrets.FIAT_API_KEY }}';" >> lib/.secrets.g.dart
@@ -117,7 +118,8 @@ jobs:
118 echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
119 echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
120 echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart
120 - echo "const exolixApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
121 + echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
122 + echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart
123 echo "const robinhoodApplicationId = '${{ secrets.ROBINHOOD_APPLICATION_ID }}';" >> lib/.secrets.g.dart
124 echo "const exchangeHelperApiKey = '${{ secrets.ROBINHOOD_CID_CLIENT_SECRET }}';" >> lib/.secrets.g.dart
125 echo "const walletConnectProjectId = '${{ secrets.WALLET_CONNECT_PROJECT_ID }}';" >> lib/.secrets.g.dart
assets/text/Monerocom_Release_Notes.txt
+3 -2
@@ -1,3 +1,4 @@
1 -New themes and UI/UX improvements
2 -Ledger flow enhancements
1 +Add built-in Tor support (experimental)
2 +Ledger improvements
3 +UI/UX improvements
4 Bug fixes
\ No newline at end of file
assets/text/Release_Notes.txt
+8 -3
@@ -1,4 +1,9 @@
1 -New themes and UI/UX improvements
2 -Payjoin enhancements
3 -Ledger flow enhancements
1 +Add built-in Tor support (experimental)
2 +Add dEuro investments
3 +Solana fixes/enhancements
4 +Polygon fixes/enhancements
5 +WalletConnect improvements
6 +Ledger improvements
7 +Payjoin improvements
8 +UI/UX improvements
9 Bug fixes
\ No newline at end of file
ios/Podfile.lock
+2 -2
@@ -76,7 +76,7 @@ PODS:
76 - path_provider_foundation (0.0.1):
77 - Flutter
78 - FlutterMacOS
79 - - payjoin_flutter (0.20.0)
79 + - payjoin_flutter (0.23.0)
80 - permission_handler_apple (9.3.0):
81 - Flutter
82 - reown_yttrium (0.0.1):
@@ -235,7 +235,7 @@ SPEC CHECKSUMS:
235 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
236 package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
237 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
238 - payjoin_flutter: 6397d7b698cdad6453be4949ab6aca1863f6c5e5
238 + payjoin_flutter: d9d4c8aa16bd5dfedb9b21d0edc8199e0187d96e
239 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
240 reown_yttrium: c0e87e5965fa60a3559564cc35cffbba22976089
241 SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8
lib/anonpay/anonpay_api.dart
+2 -1
@@ -6,6 +6,7 @@ import 'package:cake_wallet/anonpay/anonpay_status_response.dart';
6 import 'package:cake_wallet/core/fiat_conversion_service.dart';
7 import 'package:cake_wallet/entities/fiat_currency.dart';
8 import 'package:cake_wallet/exchange/limits.dart';
9 +import 'package:cake_wallet/wallet_type_utils.dart';
10 import 'package:cw_core/utils/proxy_wrapper.dart';
11 import 'package:cw_core/wallet_base.dart';
12 import 'package:cw_core/crypto_currency.dart';
@@ -27,7 +28,7 @@ class AnonPayApi {
28 static const anonPayPath = '/anonpay';
29 static const anonPayStatus = '/anonpay/status';
30 static const coinPath = 'api/coin';
30 - static const apiKey = secrets.trocadorApiKey;
31 + static final apiKey = isMoneroOnly ? secrets.trocadorMoneroApiKey : secrets.trocadorApiKey;
32
33 Future<AnonpayStatusResponse> paymentStatus(String id) async {
34 final response = await ProxyWrapper().get(
lib/core/fiat_conversion_service.dart
+3 -1
@@ -14,7 +14,6 @@ Future<double> _fetchPrice(String crypto, String fiat, bool torOnly) async {
14 'interval_count': '1',
15 'base': crypto.split(".").first,
16 'quote': fiat,
17 - 'key': secrets.fiatApiKey,
17 };
18
19 num price = 0.0;
@@ -26,6 +25,9 @@ Future<double> _fetchPrice(String crypto, String fiat, bool torOnly) async {
25 final response = await ProxyWrapper().get(
26 onionUri: onionUri,
27 clearnetUri: torOnly ? onionUri : clearnetUri,
28 + headers: {
29 + "x-api-key": secrets.fiatApiKey,
30 + }
31 );
32
33
lib/exchange/provider/changenow_exchange_provider.dart
+3 -7
@@ -11,13 +11,12 @@ import 'package:cake_wallet/exchange/trade_request.dart';
11 import 'package:cake_wallet/exchange/trade_state.dart';
12 import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart';
13 import 'package:cake_wallet/store/settings_store.dart';
14 -import 'package:cake_wallet/utils/device_info.dart';
14 import 'package:cake_wallet/utils/distribution_info.dart';
15 import 'package:cw_core/utils/proxy_wrapper.dart';
16 import 'package:cake_wallet/wallet_type_utils.dart';
17 import 'package:cw_core/crypto_currency.dart';
18 import 'package:cw_core/utils/print_verbose.dart';
20 -import 'package:cw_core/utils/proxy_wrapper.dart';
19 +
20 class ChangeNowExchangeProvider extends ExchangeProvider {
21 ChangeNowExchangeProvider({required SettingsStore settingsStore})
22 : _settingsStore = settingsStore,
@@ -30,7 +29,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
29 ];
30
31 static final apiKey =
33 - DeviceInfo.instance.isMobile ? secrets.changeNowApiKey : secrets.changeNowApiKeyDesktop;
32 + isMoneroOnly ? secrets.changeNowMoneroApiKey : secrets.changeNowCakeWalletApiKey;
33 static const apiAuthority = 'api.changenow.io';
34 static const createTradePath = '/v2/exchange';
35 static const findTradeByIdPath = '/v2/exchange/by-id';
@@ -74,7 +73,6 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
73 };
74 final uri = Uri.https(apiAuthority, rangePath, params);
75 final response = await ProxyWrapper().get(clearnetUri: uri, headers: headers);
77 -
76
77 if (response.statusCode == 400) {
78 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
@@ -120,7 +118,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
118
119 final uri = Uri.https(apiAuthority, estimatedAmountPath, params);
120 final response = await ProxyWrapper().get(clearnetUri: uri, headers: headers);
123 -
121 +
122 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
123 final fromAmount = double.parse(responseJSON['fromAmount'].toString());
124 final toAmount = double.parse(responseJSON['toAmount'].toString());
@@ -184,7 +182,6 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
182 headers: headers,
183 body: json.encode(body),
184 );
187 -
185
186 if (response.statusCode == 400) {
187 final responseJSON = json.decode(response.body) as Map<String, dynamic>;
@@ -228,7 +225,6 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
225 final params = <String, String>{'id': id};
226 final uri = Uri.https(apiAuthority, findTradeByIdPath, params);
227 final response = await ProxyWrapper().get(clearnetUri: uri, headers: headers);
231 -
228
229 if (response.statusCode == 404) throw TradeNotFoundException(id, provider: description);
230
lib/exchange/provider/exolix_exchange_provider.dart
+2 -1
@@ -9,6 +9,7 @@ import 'package:cake_wallet/exchange/trade_not_found_exception.dart';
9 import 'package:cake_wallet/exchange/trade_request.dart';
10 import 'package:cake_wallet/exchange/trade_state.dart';
11 import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart';
12 +import 'package:cake_wallet/wallet_type_utils.dart';
13 import 'package:cw_core/utils/proxy_wrapper.dart';
14 import 'package:cw_core/crypto_currency.dart';
15 import 'package:cw_core/utils/print_verbose.dart';
@@ -16,7 +17,7 @@ import 'package:cw_core/utils/print_verbose.dart';
17 class ExolixExchangeProvider extends ExchangeProvider {
18 ExolixExchangeProvider() : super(pairList: supportedPairs(_notSupported));
19
19 - static final apiKey = secrets.exolixApiKey;
20 + static final apiKey = isMoneroOnly ? secrets.exolixMoneroApiKey : secrets.exolixCakeWalletApiKey;
21 static const apiBaseUrl = 'exolix.com';
22 static const transactionsPath = '/api/v2/transactions';
23 static const ratePath = '/api/v2/rate';
lib/exchange/provider/trocador_exchange_provider.dart
+2 -1
@@ -8,6 +8,7 @@ import 'package:cake_wallet/exchange/trade.dart';
8 import 'package:cake_wallet/exchange/trade_request.dart';
9 import 'package:cake_wallet/exchange/trade_state.dart';
10 import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart';
11 +import 'package:cake_wallet/wallet_type_utils.dart';
12 import 'package:cw_core/utils/proxy_wrapper.dart';
13 import 'package:cw_core/crypto_currency.dart';
14 import 'package:cw_core/utils/print_verbose.dart';
@@ -51,7 +52,7 @@ class TrocadorExchangeProvider extends ExchangeProvider {
52 CryptoCurrency.zaddr,
53 ];
54
54 - static const apiKey = secrets.trocadorApiKey;
55 + static final apiKey = isMoneroOnly ? secrets.trocadorMoneroApiKey : secrets.trocadorApiKey;
56 static const clearNetAuthority = 'api.trocador.app';
57 static const onionApiAuthority = clearNetAuthority;
58 // static const onionApiAuthority = 'trocadorfyhlu27aefre5u7zri66gudtzdyelymftvr4yjwcxhfaqsid.onion';
lib/src/screens/dashboard/pages/cake_features_page.dart
+22 -19
@@ -10,11 +10,11 @@ import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
10 import 'package:cw_core/utils/print_verbose.dart';
11 import 'package:cw_core/wallet_type.dart';
12 import 'package:flutter/material.dart';
13 +import 'package:flutter_mobx/flutter_mobx.dart';
14 import 'package:url_launcher/url_launcher.dart';
15
16 class CakeFeaturesPage extends StatelessWidget {
16 - CakeFeaturesPage(
17 - {required this.dashboardViewModel, required this.cakeFeaturesViewModel});
17 + CakeFeaturesPage({required this.dashboardViewModel, required this.cakeFeaturesViewModel});
18
19 final DashboardViewModel dashboardViewModel;
20 final CakeFeaturesViewModel cakeFeaturesViewModel;
@@ -59,23 +59,26 @@ class CakeFeaturesPage extends StatelessWidget {
59 fit: BoxFit.cover,
60 ),
61 ),
62 - if (dashboardViewModel.type == WalletType.ethereum) ...[
63 - DashBoardRoundedCardWidget(
64 - isDarkTheme: dashboardViewModel.isDarkTheme,
65 - shadowBlur: dashboardViewModel.getShadowBlur(),
66 - shadowSpread: dashboardViewModel.getShadowSpread(),
67 - onTap: () =>
68 - Navigator.of(context).pushNamed(Routes.dEuroSavings),
69 - title: S.of(context).deuro_savings,
70 - subTitle: S.of(context).deuro_savings_subtitle,
71 - image: Image.asset(
72 - 'assets/images/deuro_icon.png',
73 - height: 80,
74 - width: 80,
75 - fit: BoxFit.cover,
76 - ),
77 - ),
78 - ],
62 + Observer(builder: (_) {
63 + if (dashboardViewModel.type == WalletType.ethereum) {
64 + return DashBoardRoundedCardWidget(
65 + isDarkTheme: dashboardViewModel.isDarkTheme,
66 + shadowBlur: dashboardViewModel.getShadowBlur(),
67 + shadowSpread: dashboardViewModel.getShadowSpread(),
68 + onTap: () => Navigator.of(context).pushNamed(Routes.dEuroSavings),
69 + title: S.of(context).deuro_savings,
70 + subTitle: S.of(context).deuro_savings_subtitle,
71 + image: Image.asset(
72 + 'assets/images/deuro_icon.png',
73 + height: 80,
74 + width: 80,
75 + fit: BoxFit.cover,
76 + ),
77 + );
78 + }
79 +
80 + return const SizedBox();
81 + }),
82 DashBoardRoundedCardWidget(
83 isDarkTheme: dashboardViewModel.isDarkTheme,
84 shadowBlur: dashboardViewModel.getShadowBlur(),
lib/src/screens/exchange/widgets/exchange_card.dart
+2 -1
@@ -302,7 +302,8 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
302 final paymentRequest = PaymentRequest.fromUri(uri);
303 addressController.text = paymentRequest.address;
304
305 - if (amountController.text.isNotEmpty) {
305 + if (amountController.text.isNotEmpty &&
306 + paymentRequest.amount.isNotEmpty) {
307 _showAmountPopup(context, paymentRequest);
308 return;
309 }
lib/src/widgets/address_text_field.dart
+11 -5
@@ -263,11 +263,17 @@ class AddressTextField<T extends Currency> extends StatelessWidget {
263 final address = clipboard?.text ?? '';
264
265 if (address.isNotEmpty) {
266 - try {
267 - final uri = Uri.parse(address);
268 - controller?.text = uri.path;
269 - onURIScanned?.call(uri);
270 - } catch (_) {
266 + // if it has query parameters then it's a valid uri
267 + // added because Uri.parse(address) can parse a normal address string and would still be valid
268 + if (address.contains("=")) {
269 + try {
270 + final uri = Uri.parse(address);
271 + controller?.text = uri.path;
272 + onURIScanned?.call(uri);
273 + } catch (_) {
274 + controller?.text = address;
275 + }
276 + } else {
277 controller?.text = address;
278 }
279 }
scripts/android/app_env.sh
+4 -4
@@ -14,15 +14,15 @@ TYPES=($MONERO_COM $CAKEWALLET)
14 APP_ANDROID_TYPE=$1
15
16 MONERO_COM_NAME="Monero.com"
17 -MONERO_COM_VERSION="5.0.0"
18 -MONERO_COM_BUILD_NUMBER=125
17 +MONERO_COM_VERSION="5.1.0"
18 +MONERO_COM_BUILD_NUMBER=127
19 MONERO_COM_BUNDLE_ID="com.monero.app"
20 MONERO_COM_PACKAGE="com.monero.app"
21 MONERO_COM_SCHEME="monero.com"
22
23 CAKEWALLET_NAME="Cake Wallet"
24 -CAKEWALLET_VERSION="5.0.1"
25 -CAKEWALLET_BUILD_NUMBER=264
24 +CAKEWALLET_VERSION="5.1.0"
25 +CAKEWALLET_BUILD_NUMBER=267
26 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
27 CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
28 CAKEWALLET_SCHEME="cakewallet"
scripts/ios/app_env.sh
+4 -4
@@ -12,13 +12,13 @@ TYPES=($MONERO_COM $CAKEWALLET)
12 APP_IOS_TYPE=$1
13
14 MONERO_COM_NAME="Monero.com"
15 -MONERO_COM_VERSION="5.0.0"
16 -MONERO_COM_BUILD_NUMBER=125
15 +MONERO_COM_VERSION="5.1.0"
16 +MONERO_COM_BUILD_NUMBER=127
17 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
18
19 CAKEWALLET_NAME="Cake Wallet"
20 -CAKEWALLET_VERSION="5.0.1"
21 -CAKEWALLET_BUILD_NUMBER=322
20 +CAKEWALLET_VERSION="5.1.0"
21 +CAKEWALLET_BUILD_NUMBER=324
22 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
23
24
scripts/linux/app_env.sh
+2 -2
@@ -14,8 +14,8 @@ if [ -n "$1" ]; then
14 fi
15
16 CAKEWALLET_NAME="Cake Wallet"
17 -CAKEWALLET_VERSION="5.0.0"
18 -CAKEWALLET_BUILD_NUMBER=56
17 +CAKEWALLET_VERSION="5.1.0"
18 +CAKEWALLET_BUILD_NUMBER=58
19
20 if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
21 echo "Wrong app type."
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="5.0.0"
20 -MONERO_COM_BUILD_NUMBER=54
19 +MONERO_COM_VERSION="5.1.0"
20 +MONERO_COM_BUILD_NUMBER=56
21 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
22
23 CAKEWALLET_NAME="Cake Wallet"
24 -CAKEWALLET_VERSION="5.0.0"
25 -CAKEWALLET_BUILD_NUMBER=116
24 +CAKEWALLET_VERSION="5.1.0"
25 +CAKEWALLET_BUILD_NUMBER=119
26 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
27
28 if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
scripts/windows/build_exe_installer.iss
+1 -1
@@ -1,5 +1,5 @@
1 #define MyAppName "Cake Wallet"
2 -#define MyAppVersion "5.0.0"
2 +#define MyAppVersion "5.1.0"
3 #define MyAppPublisher "Cake Labs LLC"
4 #define MyAppURL "https://cakewallet.com/"
5 #define MyAppExeName "CakeWallet.exe"
tool/utils/secret_key.dart
+5 -3
@@ -12,8 +12,8 @@ class SecretKey {
12 SecretKey('shortKey', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)),
13 SecretKey('backupSalt', () => hex.encode(encrypt.Key.fromSecureRandom(8).bytes)),
14 SecretKey('backupKeychainSalt', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)),
15 - SecretKey('changeNowApiKey', () => ''),
16 - SecretKey('changeNowApiKeyDesktop', () => ''),
15 + SecretKey('changeNowCakeWalletApiKey', () => ''),
16 + SecretKey('changeNowMoneroApiKey', () => ''),
17 SecretKey('wyreSecretKey', () => ''),
18 SecretKey('wyreApiKey', () => ''),
19 SecretKey('wyreAccountId', () => ''),
@@ -26,12 +26,14 @@ class SecretKey {
26 SecretKey('onramperApiKey', () => ''),
27 SecretKey('ioniaClientId', () => ''),
28 SecretKey('trocadorApiKey', () => ''),
29 + SecretKey('trocadorMoneroApiKey', () => ''),
30 SecretKey('trocadorExchangeMarkup', () => ''),
31 SecretKey('twitterBearerToken', () => ''),
32 SecretKey('anonPayReferralCode', () => ''),
33 SecretKey('fiatApiKey', () => ''),
34 SecretKey('chatwootWebsiteToken', () => ''),
34 - SecretKey('exolixApiKey', () => ''),
35 + SecretKey('exolixCakeWalletApiKey', () => ''),
36 + SecretKey('exolixMoneroApiKey', () => ''),
37 SecretKey('robinhoodApplicationId', () => ''),
38 SecretKey('exchangeHelperApiKey', () => ''),
39 SecretKey('walletConnectProjectId', () => ''),