v4.28.0 Release Candidate (#2260)

* v4.28.0 Release Candidate * Fix Android deeplinking * minor [skip ci] * update app versions [skip ci] * merge main * - Re-enable SwapTrade - Hide Keyboard on opening fee selection * handle old backups import * - Fix seed type UI - Temp fix for Deleting Monero wallet * update build number [skip ci] * minor nullability handling * disable payjoin for SP

Omar Hatem committed May 16, 2025 at 13:51 UTC 914561716d048ccbdd0f29f0e09e8cabed9d6eaa
25 files changed +113 -109
android/app/src/main/AndroidManifestBase.xml
+2
@@ -111,6 +111,8 @@
111 <category android:name="android.intent.category.BROWSABLE" />
112 <data android:scheme="nano-gpt" />
113 </intent-filter>
114 +
115 + <meta-data android:name="flutter_deeplinking_enabled" android:value="false" />
116 </activity>
117 <meta-data
118 android:name="flutterEmbedding"
assets/text/Monerocom_Release_Notes.txt
+2 -3
@@ -1,4 +1,3 @@
1 -Background sync improvements
2 -Payment notifications
3 -UI/UX improvements
1 +Monero enhancements
2 +UI improvements
3 Bug fixes
\ No newline at end of file
assets/text/Release_Notes.txt
+3 -4
@@ -1,5 +1,4 @@
1 -Background sync improvements
2 -Payment notifications
3 -WalletConnect enhancements
4 -UI/UX improvements
1 +Add Bitcoin Payjoin
2 +Monero enhancements
3 +UI improvements
4 Bug fixes
\ No newline at end of file
cw_bitcoin/lib/address_from_output.dart
+1
@@ -20,6 +20,7 @@ BitcoinBaseAddress addressFromScript(Script script,
20 return P2pkhAddress.fromScriptPubkey(
21 script: script, network: BitcoinNetwork.mainnet);
22 case P2shAddressType.p2pkhInP2sh:
23 + case P2shAddressType.p2pkInP2sh:
24 return P2shAddress.fromScriptPubkey(
25 script: script, network: BitcoinNetwork.mainnet);
26 case SegwitAddresType.p2wpkh:
cw_bitcoin/pubspec.lock
+1 -1
@@ -1167,4 +1167,4 @@ packages:
1167 version: "2.2.2"
1168 sdks:
1169 dart: ">=3.5.0 <4.0.0"
1170 - flutter: ">=3.27.4"
1170 + flutter: ">=3.24.0"
cw_core/pubspec.lock
+1 -1
@@ -810,4 +810,4 @@ packages:
810 version: "3.1.3"
811 sdks:
812 dart: ">=3.5.0 <4.0.0"
813 - flutter: ">=3.27.4"
813 + flutter: ">=3.24.0"
cw_monero/lib/api/account_list.dart
+2 -2
@@ -25,8 +25,8 @@ bool isUpdating = false;
25 void refreshAccounts() {
26 try {
27 isUpdating = true;
28 - subaddressAccount = currentWallet!.subaddressAccount();
29 - subaddressAccount!.refresh();
28 + subaddressAccount = currentWallet?.subaddressAccount();
29 + subaddressAccount?.refresh();
30 isUpdating = false;
31 } catch (e) {
32 isUpdating = false;
cw_monero/lib/monero_wallet.dart
+2 -14
@@ -34,12 +34,12 @@ import 'package:cw_monero/monero_transaction_history.dart';
34 import 'package:cw_monero/monero_transaction_info.dart';
35 import 'package:cw_monero/monero_unspent.dart';
36 import 'package:cw_monero/monero_wallet_addresses.dart';
37 +import 'package:cw_monero/monero_wallet_service.dart';
38 import 'package:cw_monero/pending_monero_transaction.dart';
39 import 'package:flutter/foundation.dart';
40 import 'package:hive/hive.dart';
41 import 'package:ledger_flutter_plus/ledger_flutter_plus.dart';
42 import 'package:mobx/mobx.dart';
42 -import 'package:monero/src/monero.dart' as m;
43 import 'package:monero/monero.dart' as monero;
44
45 part 'monero_wallet.g.dart';
@@ -193,19 +193,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
193 final wmaddr = wmPtr.ffiAddress();
194 final waddr = openedWalletsByPath["$currentWalletDirPath/$name"]!.ffiAddress();
195 openedWalletsByPath.remove("$currentWalletDirPath/$name");
196 - if (Platform.isWindows) {
197 - await Isolate.run(() {
198 - monero.WalletManager_closeWallet(
199 - Pointer.fromAddress(wmaddr), Pointer.fromAddress(waddr), true);
200 - monero.WalletManager_errorString(Pointer.fromAddress(wmaddr));
201 - });
202 - } else {
203 - unawaited(Isolate.run(() {
204 - monero.WalletManager_closeWallet(
205 - Pointer.fromAddress(wmaddr), Pointer.fromAddress(waddr), true);
206 - monero.WalletManager_errorString(Pointer.fromAddress(wmaddr));
207 - }));
208 - }
196 + closeWalletAwaitIfShould(wmaddr, waddr);
197 currentWallet = null;
198 printV("wallet closed");
199 }
cw_monero/pubspec.lock
+1 -1
@@ -978,4 +978,4 @@ packages:
978 version: "3.1.3"
979 sdks:
980 dart: ">=3.6.0 <4.0.0"
981 - flutter: ">=3.27.4"
981 + flutter: ">=3.24.0"
cw_wownero/pubspec.lock
+1 -1
@@ -845,4 +845,4 @@ packages:
845 version: "3.1.3"
846 sdks:
847 dart: ">=3.5.0 <4.0.0"
848 - flutter: ">=3.27.4"
848 + flutter: ">=3.24.0"
ios/Podfile.lock
+34 -27
@@ -76,6 +76,7 @@ PODS:
76 - path_provider_foundation (0.0.1):
77 - Flutter
78 - FlutterMacOS
79 + - payjoin_flutter (0.20.0)
80 - permission_handler_apple (9.3.0):
81 - Flutter
82 - reown_yttrium (0.0.1):
@@ -126,6 +127,7 @@ DEPENDENCIES:
127 - integration_test (from `.symlinks/plugins/integration_test/ios`)
128 - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
129 - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
130 + - payjoin_flutter (from `.symlinks/plugins/payjoin_flutter/ios`)
131 - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
132 - reown_yttrium (from `.symlinks/plugins/reown_yttrium/ios`)
133 - sensitive_clipboard (from `.symlinks/plugins/sensitive_clipboard/ios`)
@@ -186,6 +188,8 @@ EXTERNAL SOURCES:
188 :path: ".symlinks/plugins/package_info_plus/ios"
189 path_provider_foundation:
190 :path: ".symlinks/plugins/path_provider_foundation/darwin"
191 + payjoin_flutter:
192 + :path: ".symlinks/plugins/payjoin_flutter/ios"
193 permission_handler_apple:
194 :path: ".symlinks/plugins/permission_handler_apple/ios"
195 reown_yttrium:
@@ -208,40 +212,43 @@ EXTERNAL SOURCES:
212 :path: ".symlinks/plugins/wakelock_plus/ios"
213
214 SPEC CHECKSUMS:
211 - connectivity_plus: 481668c94744c30c53b8895afb39159d1e619bdf
215 + connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d
216 CryptoSwift: e64e11850ede528a02a0f3e768cec8e9d92ecb90
213 - cw_decred: a02cf30175a46971c1e2fa22c48407534541edc6
214 - cw_mweb: 3aea2fb35b2bd04d8b2d21b83216f3b8fb768d85
215 - device_display_brightness: 04374ebd653619292c1d996f00f42877ea19f17f
216 - device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89
217 - devicelocale: bd64aa714485a8afdaded0892c1e7d5b7f680cf8
217 + cw_decred: 9c0e1df74745b51a1289ec5e91fb9e24b68fa14a
218 + cw_mweb: 22cd01dfb8ad2d39b15332006f22046aaa8352a3
219 + device_display_brightness: 1510e72c567a1f6ce6ffe393dcd9afd1426034f7
220 + device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
221 + devicelocale: 35ba84dc7f45f527c3001535d8c8d104edd5d926
222 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
223 DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
220 - fast_scanner: 2cb1ad3e69e645e9980fb4961396ce5804caa3e3
221 - file_picker: 9b3292d7c8bc68c8a7bf8eb78f730e49c8efc517
224 + fast_scanner: 44c00940355a51258cd6c2085734193cd23d95bc
225 + file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
226 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
223 - flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
224 - flutter_local_authentication: 989278c681612f1ee0e36019e149137f114b9d7f
225 - flutter_mailer: 3a8cd4f36c960fb04528d5471097270c19fec1c4
226 - flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418
227 - fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
228 - in_app_review: 5596fe56fab799e8edb3561c03d053363ab13457
229 - integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
227 + flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
228 + flutter_local_authentication: 1172a4dd88f6306dadce067454e2c4caf07977bb
229 + flutter_local_notifications: ff50f8405aaa0ccdc7dcfb9022ca192e8ad9688f
230 + flutter_mailer: 2ef5a67087bc8c6c4cefd04a178bf1ae2c94cd83
231 + flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
232 + fluttertoast: 21eecd6935e7064cc1fcb733a4c5a428f3f24f0f
233 + in_app_review: a31b5257259646ea78e0e35fc914979b0031d011
234 + integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
235 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
231 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
232 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
233 - permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
234 - ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda
236 + package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
237 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
238 + payjoin_flutter: 6397d7b698cdad6453be4949ab6aca1863f6c5e5
239 + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
240 + reown_yttrium: c0e87e5965fa60a3559564cc35cffbba22976089
241 SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8
236 - sensitive_clipboard: 161e9abc3d56b3131309d8a321eb4690a803c16b
237 - share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
238 - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
239 - sp_scanner: b1bc9321690980bdb44bba7ec85d5543e716d1b5
242 + sensitive_clipboard: d4866e5d176581536c27bb1618642ee83adca986
243 + share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
244 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
245 + sp_scanner: eaa617fa827396b967116b7f1f43549ca62e9a12
246 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
241 - uni_links: ed8c961e47ed9ce42b6d91e1de8049e38a4b3152
242 - universal_ble: ff19787898040d721109c6324472e5dd4bc86adc
243 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
244 - wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
247 + uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
248 + universal_ble: cf52a7b3fd2e7c14d6d7262e9fdadb72ab6b88a6
249 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
250 + wakelock_plus: 76957ab028e12bfa4e66813c99e46637f367fc7e
251 + YttriumWrapper: 31e937fe9fbe0f1314d2ca6be9ce9b379a059966
252
253 PODFILE CHECKSUM: 5296465b1c6d14d506230356756826012f65d97a
254
ios/Runner/InfoBase.plist
+2
@@ -327,5 +327,7 @@
327 </array>
328 <key>UIViewControllerBasedStatusBarAppearance</key>
329 <false/>
330 + <key>FlutterDeepLinkingEnabled</key>
331 + <false/>
332 </dict>
333 </plist>
lib/core/backup_service.dart
+18 -15
@@ -83,7 +83,7 @@ class $BackupService {
83 outer:
84 for (var file in zip.files) {
85 final filename = file.name;
86 - for (var ignore in ignoreFiles) {
86 + for (var ignore in ignoreFiles) {
87 if (filename.endsWith(ignore) && !filename.contains("wallets/")) {
88 printV("ignoring backup file: $filename");
89 continue outer;
@@ -145,7 +145,7 @@ class $BackupService {
145 MapEntry(key, TransactionDescription.fromJson(value as Map<String, dynamic>)));
146 var box = transactionDescriptionBox;
147 if (!box.isOpen) {
148 - final transactionDescriptionsBoxKey =
148 + final transactionDescriptionsBoxKey =
149 await getEncryptionKey(secureStorage: _secureStorage, forKey: TransactionDescription.boxKey);
150 box = await CakeHive.openBox<TransactionDescription>(
151 TransactionDescription.boxName,
@@ -251,19 +251,22 @@ class $BackupService {
251 await importWalletKeychainInfo(info);
252 });
253
254 - for (var key in (keychainJSON['_all'] as Map<String, dynamic>).keys) {
255 - try {
256 - if (!key.startsWith('MONERO_WALLET_')) continue;
257 - final decodedPassword = decodeWalletPassword(password: keychainJSON['_all'][key].toString());
258 - final walletName = key.split('_WALLET_')[1];
259 - final walletType = key.split('_WALLET_')[0].toLowerCase();
260 - await importWalletKeychainInfo({
261 - 'name': walletName,
262 - 'type': "WalletType.$walletType",
263 - 'password': decodedPassword,
264 - });
265 - } catch (e) {
266 - printV('Error importing wallet ($key) password: $e');
254 + if (keychainJSON['_all'] is Map<String, dynamic>) {
255 + for (var key in (keychainJSON['_all'] as Map<String, dynamic>).keys) {
256 + try {
257 + if (!key.startsWith('MONERO_WALLET_')) continue;
258 + final decodedPassword = decodeWalletPassword(
259 + password: keychainJSON['_all'][key].toString());
260 + final walletName = key.split('_WALLET_')[1];
261 + final walletType = key.split('_WALLET_')[0].toLowerCase();
262 + await importWalletKeychainInfo({
263 + 'name': walletName,
264 + 'type': "WalletType.$walletType",
265 + 'password': decodedPassword,
266 + });
267 + } catch (e) {
268 + printV('Error importing wallet ($key) password: $e');
269 + }
270 }
271 }
272
lib/entities/seed_type.dart
+7 -4
@@ -2,16 +2,19 @@ import 'package:cw_core/enumerable_item.dart';
2 import 'package:cw_core/wallet_info.dart';
3
4 class MoneroSeedType extends EnumerableItem<int> with Serializable<int> {
5 - const MoneroSeedType({required String title, required int raw}) : super(title: title, raw: raw);
5 + const MoneroSeedType({required String title, required int raw, this.shortTitle})
6 + : super(title: title, raw: raw);
7 +
8 + final String? shortTitle;
9
10 static const all = [legacy, polyseed, bip39];
11
12 static const defaultSeedType = polyseed;
13
11 - static const legacy = MoneroSeedType(raw: 0, title: 'Legacy (25 words)');
12 - static const polyseed = MoneroSeedType(raw: 1, title: 'Polyseed (16 words)');
14 + static const legacy = MoneroSeedType(raw: 0, title: 'Legacy (25 words)', shortTitle: "Legacy");
15 + static const polyseed = MoneroSeedType(raw: 1, title: 'Polyseed (16 words)', shortTitle: "Polyseed");
16 static const wowneroSeed = MoneroSeedType(raw: 2, title: 'Wownero');
14 - static const bip39 = MoneroSeedType(raw: 3, title: 'BIP39 (12 words)');
17 + static const bip39 = MoneroSeedType(raw: 3, title: 'BIP39 (12 words)', shortTitle: "BIP39");
18
19 static MoneroSeedType deserialize({required int raw}) {
20 switch (raw) {
lib/exchange/provider/swaptrade_exchange_provider.dart
+3 -3
@@ -47,10 +47,10 @@ class SwapTradeExchangeProvider extends ExchangeProvider {
47 String get title => 'SwapTrade';
48
49 @override
50 - bool get isAvailable => false;
50 + bool get isAvailable => true;
51
52 @override
53 - bool get isEnabled => false;
53 + bool get isEnabled => true;
54
55 @override
56 bool get supportsFixedRate => false;
@@ -59,7 +59,7 @@ class SwapTradeExchangeProvider extends ExchangeProvider {
59 ExchangeProviderDescription get description => ExchangeProviderDescription.swapTrade;
60
61 @override
62 - Future<bool> checkIsAvailable() async => false;
62 + Future<bool> checkIsAvailable() async => true;
63
64 @override
65 Future<Limits> fetchLimits({
lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
+1
@@ -154,6 +154,7 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
154 items: MoneroSeedType.all,
155 selectedItem: widget.seedTypeViewModel.moneroSeedType,
156 onItemSelected: widget.seedTypeViewModel.setMoneroSeedType,
157 + displayItem: (seedType) => seedType.shortTitle ?? seedType.toString(),
158 ),
159 );
160 }),
lib/src/screens/receive/widgets/qr_widget.dart
+13 -16
@@ -97,8 +97,7 @@ class QRWidget extends StatelessWidget {
97 padding: EdgeInsets.zero,
98 decoration: BoxDecoration(
99 border: Border(top: BorderSide.none),
100 - borderRadius:
101 - BorderRadius.all(Radius.circular(5)),
100 + borderRadius: BorderRadius.all(Radius.circular(5)),
101 color: Colors.white,
102 ),
103 child: Column(
@@ -112,11 +111,10 @@ class QRWidget extends StatelessWidget {
111 ),
112 ),
113 ),
115 - if (addressListViewModel
116 - .payjoinEndpoint.isNotEmpty) ...[
114 + if (addressListViewModel.payjoinEndpoint.isNotEmpty &&
115 + !addressListViewModel.isSilentPayments) ...[
116 Row(
118 - mainAxisAlignment:
119 - MainAxisAlignment.center,
117 + mainAxisAlignment: MainAxisAlignment.center,
118 children: [
119 Padding(
120 padding: EdgeInsets.only(
@@ -196,10 +194,12 @@ class QRWidget extends StatelessWidget {
194 walletType: addressListViewModel.type,
195 textAlign: TextAlign.center,
196 evenTextStyle: TextStyle(
199 - fontSize: 15,
200 - fontWeight: FontWeight.w500,
201 - color:
202 - Theme.of(context).extension<DashboardPageTheme>()!.textColor))),
197 + fontSize: 15,
198 + fontWeight: FontWeight.w500,
199 + color: Theme.of(context).extension<DashboardPageTheme>()!.textColor,
200 + ),
201 + ),
202 + ),
203 Padding(
204 padding: EdgeInsets.only(left: 12),
205 child: copyImage,
@@ -212,13 +212,12 @@ class QRWidget extends StatelessWidget {
212 ),
213 Observer(
214 builder: (_) => Offstage(
215 - offstage: addressListViewModel.payjoinEndpoint.isEmpty,
215 + offstage: addressListViewModel.payjoinEndpoint.isEmpty || addressListViewModel.isSilentPayments,
216 child: Padding(
217 padding: EdgeInsets.only(top: 12),
218 child: PrimaryImageButton(
219 onPressed: () {
220 - Clipboard.setData(
221 - ClipboardData(text: addressUri.toString()));
220 + Clipboard.setData(ClipboardData(text: addressUri.toString()));
221 showBar<void>(context, S.of(context).copied_to_clipboard);
222 },
223 image: Image.asset(
@@ -227,9 +226,7 @@ class QRWidget extends StatelessWidget {
226 ),
227 text: S.of(context).copy_payjoin_url,
228 color: Theme.of(context).cardColor,
230 - textColor: Theme.of(context)
231 - .extension<CakeTextTheme>()!
232 - .buttonTextColor,
229 + textColor: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
230 ),
231 ),
232 ),
lib/src/screens/send/widgets/send_card.dart
+2
@@ -600,6 +600,8 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
600 final maxCustomFeeRate = sendViewModel.feesViewModel.maxCustomFeeRate?.toDouble();
601 double? customFeeRate = isBitcoinWallet ? sendViewModel.feesViewModel.customBitcoinFeeRate.toDouble() : null;
602
603 + FocusManager.instance.primaryFocus?.unfocus();
604 +
605 await showPopUp<void>(
606 context: context,
607 builder: (BuildContext context) {
lib/utils/exception_handler.dart
+1 -1
@@ -225,7 +225,7 @@ class ExceptionHandler {
225 // just ignoring until we find a solution to this issue or migrate from flutter secure storage
226 "core/auth_service.dart:64",
227 "core/key_service.dart:14",
228 - "core/wallet_loading_service.dart:134",
228 + "core/wallet_loading_service.dart:139",
229 ];
230
231 static Future<void> _addDeviceInfo(File file) async {
lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
+1 -1
@@ -82,7 +82,7 @@ class BitcoinURI extends PaymentURI {
82 final qp = <String, String>{};
83
84 if (amount.isNotEmpty) qp['amount'] = amount.replaceAll(',', '.');
85 - if (pjUri.isNotEmpty) {
85 + if (pjUri.isNotEmpty && !address.startsWith("sp")) {
86 qp['pjos'] = '0';
87 qp['pj'] = pjUri;
88 }
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="4.27.0"
18 -MONERO_COM_BUILD_NUMBER=121
17 +MONERO_COM_VERSION="4.28.0"
18 +MONERO_COM_BUILD_NUMBER=123
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="4.27.0"
25 -CAKEWALLET_BUILD_NUMBER=259
24 +CAKEWALLET_VERSION="4.28.0"
25 +CAKEWALLET_BUILD_NUMBER=261
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="4.27.1"
16 -MONERO_COM_BUILD_NUMBER=120
15 +MONERO_COM_VERSION="4.28.0"
16 +MONERO_COM_BUILD_NUMBER=122
17 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
18
19 CAKEWALLET_NAME="Cake Wallet"
20 -CAKEWALLET_VERSION="4.27.1"
21 -CAKEWALLET_BUILD_NUMBER=314
20 +CAKEWALLET_VERSION="4.28.0"
21 +CAKEWALLET_BUILD_NUMBER=318
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="4.27.0"
18 -CAKEWALLET_BUILD_NUMBER=54
17 +CAKEWALLET_VERSION="4.28.0"
18 +CAKEWALLET_BUILD_NUMBER=55
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="4.27.0"
20 -MONERO_COM_BUILD_NUMBER=51
19 +MONERO_COM_VERSION="4.28.0"
20 +MONERO_COM_BUILD_NUMBER=53
21 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
22
23 CAKEWALLET_NAME="Cake Wallet"
24 -CAKEWALLET_VERSION="4.27.0"
25 -CAKEWALLET_BUILD_NUMBER=113
24 +CAKEWALLET_VERSION="4.28.0"
25 +CAKEWALLET_BUILD_NUMBER=115
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 "4.27.0"
2 +#define MyAppVersion "4.28.0"
3 #define MyAppPublisher "Cake Labs LLC"
4 #define MyAppURL "https://cakewallet.com/"
5 #define MyAppExeName "CakeWallet.exe"