diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml
index 280a45b3c..8283a7c8c 100644
--- a/android/app/src/main/AndroidManifestBase.xml
+++ b/android/app/src/main/AndroidManifestBase.xml
@@ -111,6 +111,8 @@
+
+
=3.5.0 <4.0.0"
- flutter: ">=3.27.4"
+ flutter: ">=3.24.0"
diff --git a/cw_core/pubspec.lock b/cw_core/pubspec.lock
index 265eaa9bc..36bba72b6 100644
--- a/cw_core/pubspec.lock
+++ b/cw_core/pubspec.lock
@@ -810,4 +810,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.5.0 <4.0.0"
- flutter: ">=3.27.4"
+ flutter: ">=3.24.0"
diff --git a/cw_monero/lib/api/account_list.dart b/cw_monero/lib/api/account_list.dart
index 7f6a3f1aa..b753b4656 100644
--- a/cw_monero/lib/api/account_list.dart
+++ b/cw_monero/lib/api/account_list.dart
@@ -25,8 +25,8 @@ bool isUpdating = false;
void refreshAccounts() {
try {
isUpdating = true;
- subaddressAccount = currentWallet!.subaddressAccount();
- subaddressAccount!.refresh();
+ subaddressAccount = currentWallet?.subaddressAccount();
+ subaddressAccount?.refresh();
isUpdating = false;
} catch (e) {
isUpdating = false;
diff --git a/cw_monero/lib/monero_wallet.dart b/cw_monero/lib/monero_wallet.dart
index c3433a4c9..1e6d3f6a3 100644
--- a/cw_monero/lib/monero_wallet.dart
+++ b/cw_monero/lib/monero_wallet.dart
@@ -34,12 +34,12 @@ import 'package:cw_monero/monero_transaction_history.dart';
import 'package:cw_monero/monero_transaction_info.dart';
import 'package:cw_monero/monero_unspent.dart';
import 'package:cw_monero/monero_wallet_addresses.dart';
+import 'package:cw_monero/monero_wallet_service.dart';
import 'package:cw_monero/pending_monero_transaction.dart';
import 'package:flutter/foundation.dart';
import 'package:hive/hive.dart';
import 'package:ledger_flutter_plus/ledger_flutter_plus.dart';
import 'package:mobx/mobx.dart';
-import 'package:monero/src/monero.dart' as m;
import 'package:monero/monero.dart' as monero;
part 'monero_wallet.g.dart';
@@ -193,19 +193,7 @@ abstract class MoneroWalletBase extends WalletBase=3.6.0 <4.0.0"
- flutter: ">=3.27.4"
+ flutter: ">=3.24.0"
diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock
index c2d5eeea7..66fd1fc56 100644
--- a/cw_wownero/pubspec.lock
+++ b/cw_wownero/pubspec.lock
@@ -845,4 +845,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.5.0 <4.0.0"
- flutter: ">=3.27.4"
+ flutter: ">=3.24.0"
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 3d39d589e..575b43d5f 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -76,6 +76,7 @@ PODS:
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
+ - payjoin_flutter (0.20.0)
- permission_handler_apple (9.3.0):
- Flutter
- reown_yttrium (0.0.1):
@@ -126,6 +127,7 @@ DEPENDENCIES:
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - payjoin_flutter (from `.symlinks/plugins/payjoin_flutter/ios`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- reown_yttrium (from `.symlinks/plugins/reown_yttrium/ios`)
- sensitive_clipboard (from `.symlinks/plugins/sensitive_clipboard/ios`)
@@ -186,6 +188,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
+ payjoin_flutter:
+ :path: ".symlinks/plugins/payjoin_flutter/ios"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
reown_yttrium:
@@ -208,40 +212,43 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
- connectivity_plus: 481668c94744c30c53b8895afb39159d1e619bdf
+ connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d
CryptoSwift: e64e11850ede528a02a0f3e768cec8e9d92ecb90
- cw_decred: a02cf30175a46971c1e2fa22c48407534541edc6
- cw_mweb: 3aea2fb35b2bd04d8b2d21b83216f3b8fb768d85
- device_display_brightness: 04374ebd653619292c1d996f00f42877ea19f17f
- device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89
- devicelocale: bd64aa714485a8afdaded0892c1e7d5b7f680cf8
+ cw_decred: 9c0e1df74745b51a1289ec5e91fb9e24b68fa14a
+ cw_mweb: 22cd01dfb8ad2d39b15332006f22046aaa8352a3
+ device_display_brightness: 1510e72c567a1f6ce6ffe393dcd9afd1426034f7
+ device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
+ devicelocale: 35ba84dc7f45f527c3001535d8c8d104edd5d926
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
- fast_scanner: 2cb1ad3e69e645e9980fb4961396ce5804caa3e3
- file_picker: 9b3292d7c8bc68c8a7bf8eb78f730e49c8efc517
+ fast_scanner: 44c00940355a51258cd6c2085734193cd23d95bc
+ file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
- flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
- flutter_local_authentication: 989278c681612f1ee0e36019e149137f114b9d7f
- flutter_mailer: 3a8cd4f36c960fb04528d5471097270c19fec1c4
- flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418
- fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
- in_app_review: 5596fe56fab799e8edb3561c03d053363ab13457
- integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
+ flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
+ flutter_local_authentication: 1172a4dd88f6306dadce067454e2c4caf07977bb
+ flutter_local_notifications: ff50f8405aaa0ccdc7dcfb9022ca192e8ad9688f
+ flutter_mailer: 2ef5a67087bc8c6c4cefd04a178bf1ae2c94cd83
+ flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
+ fluttertoast: 21eecd6935e7064cc1fcb733a4c5a428f3f24f0f
+ in_app_review: a31b5257259646ea78e0e35fc914979b0031d011
+ integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
- package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
- path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
- permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
- ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda
+ package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ payjoin_flutter: 6397d7b698cdad6453be4949ab6aca1863f6c5e5
+ permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
+ reown_yttrium: c0e87e5965fa60a3559564cc35cffbba22976089
SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8
- sensitive_clipboard: 161e9abc3d56b3131309d8a321eb4690a803c16b
- share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
- shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
- sp_scanner: b1bc9321690980bdb44bba7ec85d5543e716d1b5
+ sensitive_clipboard: d4866e5d176581536c27bb1618642ee83adca986
+ share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+ sp_scanner: eaa617fa827396b967116b7f1f43549ca62e9a12
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
- uni_links: ed8c961e47ed9ce42b6d91e1de8049e38a4b3152
- universal_ble: ff19787898040d721109c6324472e5dd4bc86adc
- url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
- wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
+ uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
+ universal_ble: cf52a7b3fd2e7c14d6d7262e9fdadb72ab6b88a6
+ url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
+ wakelock_plus: 76957ab028e12bfa4e66813c99e46637f367fc7e
+ YttriumWrapper: 31e937fe9fbe0f1314d2ca6be9ce9b379a059966
PODFILE CHECKSUM: 5296465b1c6d14d506230356756826012f65d97a
diff --git a/ios/Runner/InfoBase.plist b/ios/Runner/InfoBase.plist
index f27ef8d4f..40868aa9f 100644
--- a/ios/Runner/InfoBase.plist
+++ b/ios/Runner/InfoBase.plist
@@ -327,5 +327,7 @@
UIViewControllerBasedStatusBarAppearance
+ FlutterDeepLinkingEnabled
+
diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart
index cb36072fe..c7d10598b 100644
--- a/lib/core/backup_service.dart
+++ b/lib/core/backup_service.dart
@@ -83,7 +83,7 @@ class $BackupService {
outer:
for (var file in zip.files) {
final filename = file.name;
- for (var ignore in ignoreFiles) {
+ for (var ignore in ignoreFiles) {
if (filename.endsWith(ignore) && !filename.contains("wallets/")) {
printV("ignoring backup file: $filename");
continue outer;
@@ -145,7 +145,7 @@ class $BackupService {
MapEntry(key, TransactionDescription.fromJson(value as Map)));
var box = transactionDescriptionBox;
if (!box.isOpen) {
- final transactionDescriptionsBoxKey =
+ final transactionDescriptionsBoxKey =
await getEncryptionKey(secureStorage: _secureStorage, forKey: TransactionDescription.boxKey);
box = await CakeHive.openBox(
TransactionDescription.boxName,
@@ -251,19 +251,22 @@ class $BackupService {
await importWalletKeychainInfo(info);
});
- for (var key in (keychainJSON['_all'] as Map).keys) {
- try {
- if (!key.startsWith('MONERO_WALLET_')) continue;
- final decodedPassword = decodeWalletPassword(password: keychainJSON['_all'][key].toString());
- final walletName = key.split('_WALLET_')[1];
- final walletType = key.split('_WALLET_')[0].toLowerCase();
- await importWalletKeychainInfo({
- 'name': walletName,
- 'type': "WalletType.$walletType",
- 'password': decodedPassword,
- });
- } catch (e) {
- printV('Error importing wallet ($key) password: $e');
+ if (keychainJSON['_all'] is Map) {
+ for (var key in (keychainJSON['_all'] as Map).keys) {
+ try {
+ if (!key.startsWith('MONERO_WALLET_')) continue;
+ final decodedPassword = decodeWalletPassword(
+ password: keychainJSON['_all'][key].toString());
+ final walletName = key.split('_WALLET_')[1];
+ final walletType = key.split('_WALLET_')[0].toLowerCase();
+ await importWalletKeychainInfo({
+ 'name': walletName,
+ 'type': "WalletType.$walletType",
+ 'password': decodedPassword,
+ });
+ } catch (e) {
+ printV('Error importing wallet ($key) password: $e');
+ }
}
}
diff --git a/lib/entities/seed_type.dart b/lib/entities/seed_type.dart
index 0c5632875..22f0be045 100644
--- a/lib/entities/seed_type.dart
+++ b/lib/entities/seed_type.dart
@@ -2,16 +2,19 @@ import 'package:cw_core/enumerable_item.dart';
import 'package:cw_core/wallet_info.dart';
class MoneroSeedType extends EnumerableItem with Serializable {
- const MoneroSeedType({required String title, required int raw}) : super(title: title, raw: raw);
+ const MoneroSeedType({required String title, required int raw, this.shortTitle})
+ : super(title: title, raw: raw);
+
+ final String? shortTitle;
static const all = [legacy, polyseed, bip39];
static const defaultSeedType = polyseed;
- static const legacy = MoneroSeedType(raw: 0, title: 'Legacy (25 words)');
- static const polyseed = MoneroSeedType(raw: 1, title: 'Polyseed (16 words)');
+ static const legacy = MoneroSeedType(raw: 0, title: 'Legacy (25 words)', shortTitle: "Legacy");
+ static const polyseed = MoneroSeedType(raw: 1, title: 'Polyseed (16 words)', shortTitle: "Polyseed");
static const wowneroSeed = MoneroSeedType(raw: 2, title: 'Wownero');
- static const bip39 = MoneroSeedType(raw: 3, title: 'BIP39 (12 words)');
+ static const bip39 = MoneroSeedType(raw: 3, title: 'BIP39 (12 words)', shortTitle: "BIP39");
static MoneroSeedType deserialize({required int raw}) {
switch (raw) {
diff --git a/lib/exchange/provider/swaptrade_exchange_provider.dart b/lib/exchange/provider/swaptrade_exchange_provider.dart
index b86482335..d3f64b712 100644
--- a/lib/exchange/provider/swaptrade_exchange_provider.dart
+++ b/lib/exchange/provider/swaptrade_exchange_provider.dart
@@ -47,10 +47,10 @@ class SwapTradeExchangeProvider extends ExchangeProvider {
String get title => 'SwapTrade';
@override
- bool get isAvailable => false;
+ bool get isAvailable => true;
@override
- bool get isEnabled => false;
+ bool get isEnabled => true;
@override
bool get supportsFixedRate => false;
@@ -59,7 +59,7 @@ class SwapTradeExchangeProvider extends ExchangeProvider {
ExchangeProviderDescription get description => ExchangeProviderDescription.swapTrade;
@override
- Future checkIsAvailable() async => false;
+ Future checkIsAvailable() async => true;
@override
Future fetchLimits({
diff --git a/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart b/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
index 1511ffd83..b0501e169 100644
--- a/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
+++ b/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart
@@ -154,6 +154,7 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
items: MoneroSeedType.all,
selectedItem: widget.seedTypeViewModel.moneroSeedType,
onItemSelected: widget.seedTypeViewModel.setMoneroSeedType,
+ displayItem: (seedType) => seedType.shortTitle ?? seedType.toString(),
),
);
}),
diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart
index 1f3f4a88e..69b2fa445 100644
--- a/lib/src/screens/receive/widgets/qr_widget.dart
+++ b/lib/src/screens/receive/widgets/qr_widget.dart
@@ -97,8 +97,7 @@ class QRWidget extends StatelessWidget {
padding: EdgeInsets.zero,
decoration: BoxDecoration(
border: Border(top: BorderSide.none),
- borderRadius:
- BorderRadius.all(Radius.circular(5)),
+ borderRadius: BorderRadius.all(Radius.circular(5)),
color: Colors.white,
),
child: Column(
@@ -112,11 +111,10 @@ class QRWidget extends StatelessWidget {
),
),
),
- if (addressListViewModel
- .payjoinEndpoint.isNotEmpty) ...[
+ if (addressListViewModel.payjoinEndpoint.isNotEmpty &&
+ !addressListViewModel.isSilentPayments) ...[
Row(
- mainAxisAlignment:
- MainAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(
@@ -196,10 +194,12 @@ class QRWidget extends StatelessWidget {
walletType: addressListViewModel.type,
textAlign: TextAlign.center,
evenTextStyle: TextStyle(
- fontSize: 15,
- fontWeight: FontWeight.w500,
- color:
- Theme.of(context).extension()!.textColor))),
+ fontSize: 15,
+ fontWeight: FontWeight.w500,
+ color: Theme.of(context).extension()!.textColor,
+ ),
+ ),
+ ),
Padding(
padding: EdgeInsets.only(left: 12),
child: copyImage,
@@ -212,13 +212,12 @@ class QRWidget extends StatelessWidget {
),
Observer(
builder: (_) => Offstage(
- offstage: addressListViewModel.payjoinEndpoint.isEmpty,
+ offstage: addressListViewModel.payjoinEndpoint.isEmpty || addressListViewModel.isSilentPayments,
child: Padding(
padding: EdgeInsets.only(top: 12),
child: PrimaryImageButton(
onPressed: () {
- Clipboard.setData(
- ClipboardData(text: addressUri.toString()));
+ Clipboard.setData(ClipboardData(text: addressUri.toString()));
showBar(context, S.of(context).copied_to_clipboard);
},
image: Image.asset(
@@ -227,9 +226,7 @@ class QRWidget extends StatelessWidget {
),
text: S.of(context).copy_payjoin_url,
color: Theme.of(context).cardColor,
- textColor: Theme.of(context)
- .extension()!
- .buttonTextColor,
+ textColor: Theme.of(context).extension()!.buttonTextColor,
),
),
),
diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart
index 655686b8e..6952df24d 100644
--- a/lib/src/screens/send/widgets/send_card.dart
+++ b/lib/src/screens/send/widgets/send_card.dart
@@ -600,6 +600,8 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin(
context: context,
builder: (BuildContext context) {
diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart
index e5b1c3579..bba9d71ac 100644
--- a/lib/utils/exception_handler.dart
+++ b/lib/utils/exception_handler.dart
@@ -225,7 +225,7 @@ class ExceptionHandler {
// just ignoring until we find a solution to this issue or migrate from flutter secure storage
"core/auth_service.dart:64",
"core/key_service.dart:14",
- "core/wallet_loading_service.dart:134",
+ "core/wallet_loading_service.dart:139",
];
static Future _addDeviceInfo(File file) async {
diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
index 09ea6b5a1..2052a79a4 100644
--- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
+++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
@@ -82,7 +82,7 @@ class BitcoinURI extends PaymentURI {
final qp = {};
if (amount.isNotEmpty) qp['amount'] = amount.replaceAll(',', '.');
- if (pjUri.isNotEmpty) {
+ if (pjUri.isNotEmpty && !address.startsWith("sp")) {
qp['pjos'] = '0';
qp['pj'] = pjUri;
}
diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh
index 817b6aeda..34192e9ed 100644
--- a/scripts/android/app_env.sh
+++ b/scripts/android/app_env.sh
@@ -14,15 +14,15 @@ TYPES=($MONERO_COM $CAKEWALLET)
APP_ANDROID_TYPE=$1
MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="4.27.0"
-MONERO_COM_BUILD_NUMBER=121
+MONERO_COM_VERSION="4.28.0"
+MONERO_COM_BUILD_NUMBER=123
MONERO_COM_BUNDLE_ID="com.monero.app"
MONERO_COM_PACKAGE="com.monero.app"
MONERO_COM_SCHEME="monero.com"
CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.27.0"
-CAKEWALLET_BUILD_NUMBER=259
+CAKEWALLET_VERSION="4.28.0"
+CAKEWALLET_BUILD_NUMBER=261
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
CAKEWALLET_SCHEME="cakewallet"
diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh
index a6d01f16e..6535931c8 100644
--- a/scripts/ios/app_env.sh
+++ b/scripts/ios/app_env.sh
@@ -12,13 +12,13 @@ TYPES=($MONERO_COM $CAKEWALLET)
APP_IOS_TYPE=$1
MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="4.27.1"
-MONERO_COM_BUILD_NUMBER=120
+MONERO_COM_VERSION="4.28.0"
+MONERO_COM_BUILD_NUMBER=122
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.27.1"
-CAKEWALLET_BUILD_NUMBER=314
+CAKEWALLET_VERSION="4.28.0"
+CAKEWALLET_BUILD_NUMBER=318
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
diff --git a/scripts/linux/app_env.sh b/scripts/linux/app_env.sh
index 9e3676b22..cc4d1ac4a 100755
--- a/scripts/linux/app_env.sh
+++ b/scripts/linux/app_env.sh
@@ -14,8 +14,8 @@ if [ -n "$1" ]; then
fi
CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.27.0"
-CAKEWALLET_BUILD_NUMBER=54
+CAKEWALLET_VERSION="4.28.0"
+CAKEWALLET_BUILD_NUMBER=55
if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then
echo "Wrong app type."
diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh
index f99cee740..5f323c25e 100755
--- a/scripts/macos/app_env.sh
+++ b/scripts/macos/app_env.sh
@@ -16,13 +16,13 @@ if [ -n "$1" ]; then
fi
MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="4.27.0"
-MONERO_COM_BUILD_NUMBER=51
+MONERO_COM_VERSION="4.28.0"
+MONERO_COM_BUILD_NUMBER=53
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.27.0"
-CAKEWALLET_BUILD_NUMBER=113
+CAKEWALLET_VERSION="4.28.0"
+CAKEWALLET_BUILD_NUMBER=115
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
diff --git a/scripts/windows/build_exe_installer.iss b/scripts/windows/build_exe_installer.iss
index 56285af77..f7cbef293 100644
--- a/scripts/windows/build_exe_installer.iss
+++ b/scripts/windows/build_exe_installer.iss
@@ -1,5 +1,5 @@
#define MyAppName "Cake Wallet"
-#define MyAppVersion "4.27.0"
+#define MyAppVersion "4.28.0"
#define MyAppPublisher "Cake Labs LLC"
#define MyAppURL "https://cakewallet.com/"
#define MyAppExeName "CakeWallet.exe"