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"