From 1dd2c7da56f8e63958188d4b59b5018bf05a1346 Mon Sep 17 00:00:00 2001
From: Rafael <github@rafael.saes.dev>
Date: Mon, 10 Jun 2024 04:22:57 -0300
Subject: [PATCH 1/4] Sp fixes (#1487)

* feat: missing desktop setting menu

* fix: sp utxo pending

* fix: change to electrs only scanning, initial migration, and btc-electrum as null ssl
---
 cw_bitcoin/lib/electrum.dart                 |  2 +-
 cw_bitcoin/lib/electrum_wallet.dart          | 33 +++++++++++++-----
 cw_core/lib/get_height_by_date.dart          |  1 +
 lib/bitcoin/cw_bitcoin.dart                  | 24 +++-----------
 lib/entities/default_settings_migration.dart | 35 ++++++++++++++++++++
 lib/main.dart                                |  2 +-
 6 files changed, 67 insertions(+), 30 deletions(-)

diff --git a/cw_bitcoin/lib/electrum.dart b/cw_bitcoin/lib/electrum.dart
index afd5e2440..b52015794 100644
--- a/cw_bitcoin/lib/electrum.dart
+++ b/cw_bitcoin/lib/electrum.dart
@@ -64,7 +64,7 @@ class ElectrumClient {
       await socket?.close();
     } catch (_) {}
 
-    if (useSSL == false) {
+    if (useSSL == false || (useSSL == null && uri.toString().contains("btc-electrum"))) {
       socket = await Socket.connect(host, port, timeout: connectionTimeout);
     } else {
       socket = await SecureSocket.connect(host, port,
diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart
index 43bae2e19..64aa81722 100644
--- a/cw_bitcoin/lib/electrum_wallet.dart
+++ b/cw_bitcoin/lib/electrum_wallet.dart
@@ -197,7 +197,7 @@ abstract class ElectrumWalletBase
   bool silentPaymentsScanningActive = false;
 
   @action
-  Future<void> setSilentPaymentsScanning(bool active) async {
+  Future<void> setSilentPaymentsScanning(bool active, bool usingElectrs) async {
     silentPaymentsScanningActive = active;
 
     if (active) {
@@ -210,7 +210,11 @@ abstract class ElectrumWalletBase
       }
 
       if (tip > walletInfo.restoreHeight) {
-        _setListeners(walletInfo.restoreHeight, chainTipParam: _currentChainTip);
+        _setListeners(
+          walletInfo.restoreHeight,
+          chainTipParam: _currentChainTip,
+          usingElectrs: usingElectrs,
+        );
       }
     } else {
       alwaysScan = false;
@@ -277,7 +281,12 @@ abstract class ElectrumWalletBase
   }
 
   @action
-  Future<void> _setListeners(int height, {int? chainTipParam, bool? doSingleScan}) async {
+  Future<void> _setListeners(
+    int height, {
+    int? chainTipParam,
+    bool? doSingleScan,
+    bool? usingElectrs,
+  }) async {
     final chainTip = chainTipParam ?? await getUpdatedChainTip();
 
     if (chainTip == height) {
@@ -303,7 +312,7 @@ abstract class ElectrumWalletBase
           chainTip: chainTip,
           electrumClient: ElectrumClient(),
           transactionHistoryIds: transactionHistory.transactions.keys.toList(),
-          node: ScanNode(node!.uri, node!.useSSL),
+          node: usingElectrs == true ? ScanNode(node!.uri, node!.useSSL) : null,
           labels: walletAddresses.labels,
           labelIndexes: walletAddresses.silentAddresses
               .where((addr) => addr.type == SilentPaymentsAddresType.p2sp && addr.index >= 1)
@@ -1122,8 +1131,13 @@ abstract class ElectrumWalletBase
 
   @action
   @override
-  Future<void> rescan(
-      {required int height, int? chainTip, ScanData? scanData, bool? doSingleScan}) async {
+  Future<void> rescan({
+    required int height,
+    int? chainTip,
+    ScanData? scanData,
+    bool? doSingleScan,
+    bool? usingElectrs,
+  }) async {
     silentPaymentsScanningActive = true;
     _setListeners(height, doSingleScan: doSingleScan);
   }
@@ -1820,7 +1834,7 @@ class ScanData {
   final SendPort sendPort;
   final SilentPaymentOwner silentAddress;
   final int height;
-  final ScanNode node;
+  final ScanNode? node;
   final BasedUtxoNetwork network;
   final int chainTip;
   final ElectrumClient electrumClient;
@@ -1881,7 +1895,10 @@ Future<void> startRefresh(ScanData scanData) async {
   scanData.sendPort.send(SyncResponse(syncHeight, syncingStatus));
 
   final electrumClient = scanData.electrumClient;
-  await electrumClient.connectToUri(scanData.node.uri, useSSL: scanData.node.useSSL);
+  await electrumClient.connectToUri(
+    scanData.node?.uri ?? Uri.parse("tcp://electrs.cakewallet.com:50001"),
+    useSSL: scanData.node?.useSSL ?? false,
+  );
 
   if (tweaksSubscription == null) {
     final count = scanData.isSingleScan ? 1 : TWEAKS_COUNT;
diff --git a/cw_core/lib/get_height_by_date.dart b/cw_core/lib/get_height_by_date.dart
index a3dd51b68..d62a78468 100644
--- a/cw_core/lib/get_height_by_date.dart
+++ b/cw_core/lib/get_height_by_date.dart
@@ -245,6 +245,7 @@ Future<int> getHavenCurrentHeight() async {
 
 // Data taken from https://timechaincalendar.com/
 const bitcoinDates = {
+  "2024-06": 846005,
   "2024-05": 841590,
   "2024-04": 837182,
   "2024-03": 832623,
diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart
index 634919952..bdefe2ea9 100644
--- a/lib/bitcoin/cw_bitcoin.dart
+++ b/lib/bitcoin/cw_bitcoin.dart
@@ -514,18 +514,10 @@ class CWBitcoin extends Bitcoin {
   @override
   Future<void> setScanningActive(Object wallet, bool active) async {
     final bitcoinWallet = wallet as ElectrumWallet;
-
-    if (active && !(await getNodeIsElectrsSPEnabled(wallet))) {
-      final node = Node(
-        useSSL: false,
-        uri: 'electrs.cakewallet.com:${(wallet.network == BitcoinNetwork.testnet ? 50002 : 50001)}',
-      );
-      node.type = WalletType.bitcoin;
-
-      await bitcoinWallet.connectToNode(node: node);
-    }
-
-    bitcoinWallet.setSilentPaymentsScanning(active);
+    bitcoinWallet.setSilentPaymentsScanning(
+      active,
+      active && (await getNodeIsElectrsSPEnabled(wallet)),
+    );
   }
 
   @override
@@ -540,14 +532,6 @@ class CWBitcoin extends Bitcoin {
   @override
   Future<void> rescan(Object wallet, {required int height, bool? doSingleScan}) async {
     final bitcoinWallet = wallet as ElectrumWallet;
-    if (!(await getNodeIsElectrsSPEnabled(wallet))) {
-      final node = Node(
-        useSSL: false,
-        uri: 'electrs.cakewallet.com:${(wallet.network == BitcoinNetwork.testnet ? 50002 : 50001)}',
-      );
-      node.type = WalletType.bitcoin;
-      await bitcoinWallet.connectToNode(node: node);
-    }
     bitcoinWallet.rescan(height: height, doSingleScan: doSingleScan);
   }
 
diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart
index 697685767..806285a81 100644
--- a/lib/entities/default_settings_migration.dart
+++ b/lib/entities/default_settings_migration.dart
@@ -227,6 +227,8 @@ Future<void> defaultSettingsMigration(
           break;
         case 34:
           await _addElectRsNode(nodes, sharedPreferences);
+        case 35:
+          await _switchElectRsNode(nodes, sharedPreferences);
           break;
         default:
           break;
@@ -825,6 +827,39 @@ Future<void> _addElectRsNode(Box<Node> nodeSource, SharedPreferences sharedPrefe
   }
 }
 
+Future<void> _switchElectRsNode(Box<Node> nodeSource, SharedPreferences sharedPreferences) async {
+  final currentBitcoinNodeId =
+      sharedPreferences.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey);
+  final currentBitcoinNode =
+      nodeSource.values.firstWhere((node) => node.key == currentBitcoinNodeId);
+  final needToReplaceCurrentBitcoinNode =
+      currentBitcoinNode.uri.toString().contains('electrs.cakewallet.com');
+
+  if (!needToReplaceCurrentBitcoinNode) return;
+
+  final btcElectrumNode = nodeSource.values.firstWhereOrNull(
+    (node) => node.uri.toString().contains('btc-electrum.cakewallet.com'),
+  );
+
+  if (btcElectrumNode == null) {
+    final newBtcElectrumBitcoinNode = Node(
+      uri: newCakeWalletBitcoinUri,
+      type: WalletType.bitcoin,
+      useSSL: false,
+    );
+    await nodeSource.add(newBtcElectrumBitcoinNode);
+    await sharedPreferences.setInt(
+      PreferencesKey.currentBitcoinElectrumSererIdKey,
+      newBtcElectrumBitcoinNode.key as int,
+    );
+  } else {
+    await sharedPreferences.setInt(
+      PreferencesKey.currentBitcoinElectrumSererIdKey,
+      btcElectrumNode.key as int,
+    );
+  }
+}
+
 Future<void> checkCurrentNodes(
     Box<Node> nodeSource, Box<Node> powNodeSource, SharedPreferences sharedPreferences) async {
   final currentMoneroNodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey);
diff --git a/lib/main.dart b/lib/main.dart
index 776c2aa69..09f0cf432 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -202,7 +202,7 @@ Future<void> initializeAppConfigs() async {
     transactionDescriptions: transactionDescriptions,
     secureStorage: secureStorage,
     anonpayInvoiceInfo: anonpayInvoiceInfo,
-    initialMigrationVersion: 34,
+    initialMigrationVersion: 35,
   );
 }
 

From 5a6502a35a27b9b611f24e3cc0d86a7953bceb88 Mon Sep 17 00:00:00 2001
From: Omar Hatem <omarh.ismail1@gmail.com>
Date: Mon, 10 Jun 2024 09:30:58 +0200
Subject: [PATCH 2/4] SP Enhancments (#1483)

* fixes and minor enhancements for SP flow

* fix build

* change dfx text

* minor fixes

* pass use electrs to setListeners

* comment out connecting on failure for now
---
 cw_bitcoin/lib/electrum_wallet.dart | 40 +++++++++++++++++------------
 lib/bitcoin/cw_bitcoin.dart         | 14 +++++++---
 lib/src/screens/root/root.dart      |  8 +++---
 lib/utils/exception_handler.dart    | 40 +++++++++++++++--------------
 res/values/strings_ar.arb           |  2 +-
 res/values/strings_bg.arb           |  2 +-
 res/values/strings_cs.arb           |  2 +-
 res/values/strings_de.arb           |  2 +-
 res/values/strings_en.arb           |  2 +-
 res/values/strings_es.arb           |  2 +-
 res/values/strings_fr.arb           |  2 +-
 res/values/strings_ha.arb           |  2 +-
 res/values/strings_hi.arb           |  2 +-
 res/values/strings_hr.arb           |  2 +-
 res/values/strings_id.arb           |  2 +-
 res/values/strings_it.arb           |  2 +-
 res/values/strings_ja.arb           |  2 +-
 res/values/strings_ko.arb           |  2 +-
 res/values/strings_my.arb           |  2 +-
 res/values/strings_nl.arb           |  2 +-
 res/values/strings_pl.arb           |  2 +-
 res/values/strings_pt.arb           |  2 +-
 res/values/strings_ru.arb           |  2 +-
 res/values/strings_th.arb           |  2 +-
 res/values/strings_tl.arb           |  2 +-
 res/values/strings_tr.arb           |  2 +-
 res/values/strings_uk.arb           |  2 +-
 res/values/strings_ur.arb           |  2 +-
 res/values/strings_yo.arb           |  2 +-
 res/values/strings_zh.arb           |  2 +-
 30 files changed, 86 insertions(+), 68 deletions(-)

diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart
index 64aa81722..d3736e076 100644
--- a/cw_bitcoin/lib/electrum_wallet.dart
+++ b/cw_bitcoin/lib/electrum_wallet.dart
@@ -96,13 +96,17 @@ abstract class ElectrumWalletBase
     this.walletInfo = walletInfo;
     transactionHistory = ElectrumTransactionHistory(walletInfo: walletInfo, password: password);
 
-    reaction((_) => syncStatus, (SyncStatus syncStatus) {
-      if (syncStatus is! AttemptingSyncStatus && syncStatus is! SyncedTipSyncStatus)
+    reaction((_) => syncStatus, (SyncStatus syncStatus) async {
+      if (syncStatus is! AttemptingSyncStatus && syncStatus is! SyncedTipSyncStatus) {
         silentPaymentsScanningActive = syncStatus is SyncingSyncStatus;
+      }
 
       if (syncStatus is NotConnectedSyncStatus) {
         // Needs to re-subscribe to all scripthashes when reconnected
         _scripthashesUpdateSubject = {};
+
+        // TODO: double check this and make sure it doesn't cause any un-necessary calls
+        // await this.electrumClient.connectToUri(node!.uri, useSSL: node!.useSSL);
       }
 
       // Message is shown on the UI for 3 seconds, revert to synced
@@ -219,13 +223,13 @@ abstract class ElectrumWalletBase
     } else {
       alwaysScan = false;
 
-      (await _isolate)?.kill(priority: Isolate.immediate);
+      _isolate?.then((value) => value.kill(priority: Isolate.immediate));
 
       if (electrumClient.isConnected) {
         syncStatus = SyncedSyncStatus();
       } else {
         if (electrumClient.uri != null) {
-          await electrumClient.connectToUri(electrumClient.uri!);
+          await electrumClient.connectToUri(electrumClient.uri!, useSSL: electrumClient.useSSL);
           startSync();
         }
       }
@@ -463,17 +467,7 @@ abstract class ElectrumWalletBase
 
       await electrumClient.close();
 
-      electrumClient.onConnectionStatusChange = (bool? isConnected) async {
-        if (syncStatus is SyncingSyncStatus) return;
-
-        if (isConnected == true && syncStatus is! SyncedSyncStatus) {
-          syncStatus = ConnectedSyncStatus();
-        } else if (isConnected == false) {
-          syncStatus = LostConnectionSyncStatus();
-        } else if (!(isConnected ?? false) && syncStatus is! ConnectingSyncStatus) {
-          syncStatus = NotConnectedSyncStatus();
-        }
-      };
+      electrumClient.onConnectionStatusChange = _onConnectionStatusChange;
 
       await electrumClient.connectToUri(node.uri, useSSL: node.useSSL);
     } catch (e) {
@@ -1139,7 +1133,7 @@ abstract class ElectrumWalletBase
     bool? usingElectrs,
   }) async {
     silentPaymentsScanningActive = true;
-    _setListeners(height, doSingleScan: doSingleScan);
+    _setListeners(height, doSingleScan: doSingleScan, usingElectrs: usingElectrs);
   }
 
   @override
@@ -1657,6 +1651,7 @@ abstract class ElectrumWalletBase
       if (_isTransactionUpdating) {
         return;
       }
+      await getCurrentChainTip();
 
       transactionHistory.transactions.values.forEach((tx) async {
         if (tx.unspents != null && tx.unspents!.isNotEmpty && tx.height > 0) {
@@ -1821,6 +1816,19 @@ abstract class ElectrumWalletBase
 
   static String _hardenedDerivationPath(String derivationPath) =>
       derivationPath.substring(0, derivationPath.lastIndexOf("'") + 1);
+
+  @action
+  void _onConnectionStatusChange(bool? isConnected) {
+    if (syncStatus is SyncingSyncStatus) return;
+
+    if (isConnected == true && syncStatus is! SyncedSyncStatus) {
+      syncStatus = ConnectedSyncStatus();
+    } else if (isConnected == false) {
+      syncStatus = LostConnectionSyncStatus();
+    } else if (isConnected != true && syncStatus is! ConnectingSyncStatus) {
+      syncStatus = NotConnectedSyncStatus();
+    }
+  }
 }
 
 class ScanNode {
diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart
index bdefe2ea9..15d2ffadf 100644
--- a/lib/bitcoin/cw_bitcoin.dart
+++ b/lib/bitcoin/cw_bitcoin.dart
@@ -306,7 +306,7 @@ class CWBitcoin extends Bitcoin {
     }
 
     final electrumClient = ElectrumClient();
-    await electrumClient.connectToUri(node.uri);
+    await electrumClient.connectToUri(node.uri, useSSL: node.useSSL);
 
     late BasedUtxoNetwork network;
     btc.NetworkType networkType;
@@ -560,10 +560,16 @@ class CWBitcoin extends Bitcoin {
     }
 
     final bitcoinWallet = wallet as ElectrumWallet;
-    final tweaksResponse = await bitcoinWallet.electrumClient.getTweaks(height: 0);
+    try {
+      final tweaksResponse = await bitcoinWallet.electrumClient.getTweaks(height: 0);
 
-    if (tweaksResponse != null) {
-      return true;
+      if (tweaksResponse != null) {
+        return true;
+      }
+    } on RequestFailedTimeoutException {
+      return false;
+    } catch (_) {
+      rethrow;
     }
 
     return false;
diff --git a/lib/src/screens/root/root.dart b/lib/src/screens/root/root.dart
index b6406dfbd..7ad8af4c5 100644
--- a/lib/src/screens/root/root.dart
+++ b/lib/src/screens/root/root.dart
@@ -136,9 +136,11 @@ class RootState extends State<Root> with WidgetsBindingObserver {
         break;
       case AppLifecycleState.resumed:
         widget.authService.requireAuth().then((value) {
-          setState(() {
-            _requestAuth = value;
-          });
+          if (mounted) {
+            setState(() {
+              _requestAuth = value;
+            });
+          }
         });
         break;
       default:
diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart
index 6e93fc5cd..5a07ab0f0 100644
--- a/lib/utils/exception_handler.dart
+++ b/lib/utils/exception_handler.dart
@@ -118,25 +118,27 @@ class ExceptionHandler {
 
     WidgetsBinding.instance.addPostFrameCallback(
       (timeStamp) async {
-        await showPopUp<void>(
-          context: navigatorKey.currentContext!,
-          builder: (context) {
-            return AlertWithTwoActions(
-              isDividerExist: true,
-              alertTitle: S.of(context).error,
-              alertContent: S.of(context).error_dialog_content,
-              rightButtonText: S.of(context).send,
-              leftButtonText: S.of(context).do_not_send,
-              actionRightButton: () {
-                Navigator.of(context).pop();
-                _sendExceptionFile();
-              },
-              actionLeftButton: () {
-                Navigator.of(context).pop();
-              },
-            );
-          },
-        );
+        if (navigatorKey.currentContext != null) {
+          await showPopUp<void>(
+            context: navigatorKey.currentContext!,
+            builder: (context) {
+              return AlertWithTwoActions(
+                isDividerExist: true,
+                alertTitle: S.of(context).error,
+                alertContent: S.of(context).error_dialog_content,
+                rightButtonText: S.of(context).send,
+                leftButtonText: S.of(context).do_not_send,
+                actionRightButton: () {
+                  Navigator.of(context).pop();
+                  _sendExceptionFile();
+                },
+                actionLeftButton: () {
+                  Navigator.of(context).pop();
+                },
+              );
+            },
+          );
+        }
 
         _hasError = false;
       },
diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb
index 25d392d6a..fa2747230 100644
--- a/res/values/strings_ar.arb
+++ b/res/values/strings_ar.arb
@@ -197,7 +197,7 @@
   "descending": "النزول",
   "description": "ﻒﺻﻭ",
   "destination_tag": "علامة الوجهة:",
-  "dfx_option_description": "ﺎﺑﻭﺭﻭﺃ ﻲﻓ ﺕﺎﻛﺮﺸﻟﺍﻭ ﺔﺋﺰﺠﺘﻟﺍ ءﻼﻤﻌﻟ .ﻲﻓﺎﺿﺇ KYC ﻥﻭﺪﺑ ﻭﺭﻮﻳ 990 ﻰﻟﺇ ﻞﺼﻳ ﺎﻣ .ﻱﺮﺴﻳﻮﺴﻟﺍ",
+  "dfx_option_description": "شراء التشفير مع EUR & CHF. لعملاء البيع بالتجزئة والشركات في أوروبا",
   "didnt_get_code": "لم تحصل على رمز؟",
   "digit_pin": "-رقم PIN",
   "digital_and_physical_card": "  بطاقة ائتمان رقمية ومادية مسبقة الدفع",
diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb
index 8f4717081..430a26134 100644
--- a/res/values/strings_bg.arb
+++ b/res/values/strings_bg.arb
@@ -197,7 +197,7 @@
   "descending": "Низходящ",
   "description": "Описание",
   "destination_tag": "Destination tag:",
-  "dfx_option_description": "Купете крипто с EUR и CHF. До 990 € без допълнителен KYC. За клиенти на дребно и корпоративни клиенти в Европа",
+  "dfx_option_description": "Купете криптовалута с Eur & CHF. За търговски и корпоративни клиенти в Европа",
   "didnt_get_code": "Не получихте код?",
   "digit_pin": "-цифрен PIN",
   "digital_and_physical_card": " дигитална или физическа предплатена дебитна карта",
diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb
index 297a737a2..6a92cb2e5 100644
--- a/res/values/strings_cs.arb
+++ b/res/values/strings_cs.arb
@@ -197,7 +197,7 @@
   "descending": "Klesající",
   "description": "Popis",
   "destination_tag": "Destination Tag:",
-  "dfx_option_description": "Nakupujte kryptoměny za EUR a CHF. Až 990 € bez dalších KYC. Pro maloobchodní a firemní zákazníky v Evropě",
+  "dfx_option_description": "Koupit krypto s EUR & CHF. Pro maloobchodní a firemní zákazníky v Evropě",
   "didnt_get_code": "Nepřišel Vám kód?",
   "digit_pin": "-číselný PIN",
   "digital_and_physical_card": " digitální a fyzické předplacené debetní karty,",
diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb
index 2ccd1919c..2e4203edd 100644
--- a/res/values/strings_de.arb
+++ b/res/values/strings_de.arb
@@ -197,7 +197,7 @@
   "descending": "Absteigend",
   "description": "Beschreibung",
   "destination_tag": "Ziel-Tag:",
-  "dfx_option_description": "Krypto mit EUR und CHF kaufen. Bis zu 990€ ohne zusätzliches KYC. Für Privat- und Firmenkunden in Europa",
+  "dfx_option_description": "Kaufen Sie Krypto mit EUR & CHF. Für Einzelhandel und Unternehmenskunden in Europa",
   "didnt_get_code": "Kein Code?",
   "digit_pin": "-stellige PIN",
   "digital_and_physical_card": "digitale und physische Prepaid-Debitkarte",
diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb
index 9b8662bdb..1b3da32ab 100644
--- a/res/values/strings_en.arb
+++ b/res/values/strings_en.arb
@@ -197,7 +197,7 @@
   "descending": "Descending",
   "description": "Description",
   "destination_tag": "Destination tag:",
-  "dfx_option_description": "Buy crypto with EUR & CHF. Up to 990€ without additional KYC. For retail and corporate customers in Europe",
+  "dfx_option_description": "Buy crypto with EUR & CHF. For retail and corporate customers in Europe",
   "didnt_get_code": "Didn't get code?",
   "digit_pin": "-digit PIN",
   "digital_and_physical_card": " digital and physical prepaid debit card",
diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb
index 45da02030..215cece6e 100644
--- a/res/values/strings_es.arb
+++ b/res/values/strings_es.arb
@@ -197,7 +197,7 @@
   "descending": "Descendente",
   "description": "Descripción",
   "destination_tag": "Etiqueta de destino:",
-  "dfx_option_description": "Compre criptomonedas con EUR y CHF. Hasta 990€ sin KYC adicional. Para clientes minoristas y corporativos en Europa",
+  "dfx_option_description": "Compre criptografía con EUR y CHF. Para clientes minoristas y corporativos en Europa",
   "didnt_get_code": "¿No recibiste el código?",
   "digit_pin": "-dígito PIN",
   "digital_and_physical_card": " tarjeta de débito prepago digital y física",
diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb
index 119cb24e4..997dbc38c 100644
--- a/res/values/strings_fr.arb
+++ b/res/values/strings_fr.arb
@@ -197,7 +197,7 @@
   "descending": "Descendant",
   "description": "Description",
   "destination_tag": "Tag de destination :",
-  "dfx_option_description": "Achetez des crypto-monnaies avec EUR et CHF. Jusqu'à 990€ sans KYC supplémentaire. Pour les clients particuliers et entreprises en Europe",
+  "dfx_option_description": "Achetez de la crypto avec EUR & CHF. Pour les clients de la vente au détail et des entreprises en Europe",
   "didnt_get_code": "Vous n'avez pas reçu le code ?",
   "digit_pin": " chiffres",
   "digital_and_physical_card": "carte de débit prépayée numérique et physique",
diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb
index dd3350131..478bc458d 100644
--- a/res/values/strings_ha.arb
+++ b/res/values/strings_ha.arb
@@ -197,7 +197,7 @@
   "descending": "Saukowa",
   "description": "Bayani",
   "destination_tag": "Tambarin makoma:",
-  "dfx_option_description": "Sayi crypto tare da EUR & CHF. Har zuwa € 990 ba tare da ƙarin KYC ba. Don 'yan kasuwa da abokan ciniki na kamfanoni a Turai",
+  "dfx_option_description": "Buy crypto tare da Eur & Chf. Don Retail da abokan ciniki na kamfanoni a Turai",
   "didnt_get_code": "Ba a samun code?",
   "digit_pin": "-lambar PIN",
   "digital_and_physical_card": "katin zare kudi na dijital da na zahiri",
diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb
index 55aead5a3..4f3a77fdb 100644
--- a/res/values/strings_hi.arb
+++ b/res/values/strings_hi.arb
@@ -197,7 +197,7 @@
   "descending": "अवरोही",
   "description": "विवरण",
   "destination_tag": "गंतव्य टैग:",
-  "dfx_option_description": "EUR और CHF के साथ क्रिप्टो खरीदें। अतिरिक्त केवाईसी के बिना 990€ तक। यूरोप में खुदरा और कॉर्पोरेट ग्राहकों के लिए",
+  "dfx_option_description": "EUR और CHF के साथ क्रिप्टो खरीदें। यूरोप में खुदरा और कॉर्पोरेट ग्राहकों के लिए",
   "didnt_get_code": "कोड नहीं मिला?",
   "digit_pin": "-अंक पिन",
   "digital_and_physical_card": "डिजिटल और भौतिक प्रीपेड डेबिट कार्ड",
diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb
index c999b7dfd..faef9cd78 100644
--- a/res/values/strings_hr.arb
+++ b/res/values/strings_hr.arb
@@ -197,7 +197,7 @@
   "descending": "Silazni",
   "description": "Opis",
   "destination_tag": "Odredišna oznaka:",
-  "dfx_option_description": "Kupujte kripto s EUR i CHF. Do 990 € bez dodatnog KYC-a. Za maloprodajne i poslovne korisnike u Europi",
+  "dfx_option_description": "Kupite kriptovalute s Eur & CHF. Za maloprodajne i korporativne kupce u Europi",
   "didnt_get_code": "Ne dobivate kod?",
   "digit_pin": "-znamenkasti PIN",
   "digital_and_physical_card": "digitalna i fizička unaprijed plaćena debitna kartica",
diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb
index 24208718c..e718f24da 100644
--- a/res/values/strings_id.arb
+++ b/res/values/strings_id.arb
@@ -197,7 +197,7 @@
   "descending": "Menurun",
   "description": "Keterangan",
   "destination_tag": "Tag tujuan:",
-  "dfx_option_description": "Beli kripto dengan EUR & CHF. Hingga 990€ tanpa KYC tambahan. Untuk pelanggan ritel dan korporat di Eropa",
+  "dfx_option_description": "Beli crypto dengan EUR & CHF. Untuk pelanggan ritel dan perusahaan di Eropa",
   "didnt_get_code": "Tidak mendapatkan kode?",
   "digit_pin": "-digit PIN",
   "digital_and_physical_card": " kartu debit pra-bayar digital dan fisik",
diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb
index 5509c0067..6a25ad9e0 100644
--- a/res/values/strings_it.arb
+++ b/res/values/strings_it.arb
@@ -198,7 +198,7 @@
   "descending": "Discendente",
   "description": "Descrizione",
   "destination_tag": "Tag destinazione:",
-  "dfx_option_description": "Acquista criptovalute con EUR e CHF. Fino a 990€ senza KYC aggiuntivi. Per clienti al dettaglio e aziendali in Europa",
+  "dfx_option_description": "Acquista Crypto con EUR & CHF. Per i clienti al dettaglio e aziendali in Europa",
   "didnt_get_code": "Non ricevi il codice?",
   "digit_pin": "-cifre PIN",
   "digital_and_physical_card": "carta di debito prepagata digitale e fisica",
diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb
index 9204ffdf4..56786cabc 100644
--- a/res/values/strings_ja.arb
+++ b/res/values/strings_ja.arb
@@ -197,7 +197,7 @@
   "descending": "下降",
   "description": "説明",
   "destination_tag": "宛先タグ:",
-  "dfx_option_description": "EUR と CHF で暗号通貨を購入します。追加のKYCなしで最大990ユーロ。ヨーロッパの小売および法人顧客向け",
+  "dfx_option_description": "EUR&CHFで暗号を購入します。ヨーロッパの小売および企業の顧客向け",
   "didnt_get_code": "コードを取得しませんか?",
   "digit_pin": "桁ピン",
   "digital_and_physical_card": "デジタルおよび物理プリペイドデビットカード",
diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb
index 99d138de1..5de972a6e 100644
--- a/res/values/strings_ko.arb
+++ b/res/values/strings_ko.arb
@@ -197,7 +197,7 @@
   "descending": "내림차순",
   "description": "설명",
   "destination_tag": "목적지 태그:",
-  "dfx_option_description": "EUR 및 CHF로 암호화폐를 구매하세요. 추가 KYC 없이 최대 990€. 유럽의 소매 및 기업 고객용",
+  "dfx_option_description": "EUR & CHF로 암호화를 구입하십시오. 유럽의 소매 및 기업 고객을 위해",
   "didnt_get_code": "코드를 받지 못하셨습니까?",
   "digit_pin": "숫자 PIN",
   "digital_and_physical_card": " 디지털 및 실제 선불 직불 카드",
diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb
index 41b082457..497e1bb0c 100644
--- a/res/values/strings_my.arb
+++ b/res/values/strings_my.arb
@@ -197,7 +197,7 @@
   "descending": "ဆင်း",
   "description": "ဖော်ပြချက်",
   "destination_tag": "ခရီးဆုံးအမှတ်-",
-  "dfx_option_description": "EUR & CHF ဖြင့် crypto ကိုဝယ်ပါ။ အပို KYC မပါဘဲ 990€ အထိ။ ဥရောပရှိ လက်လီရောင်းချသူများနှင့် ကော်ပိုရိတ်ဖောက်သည်များအတွက်",
+  "dfx_option_description": "Crypto ကို EUR & CHF ဖြင့် 0 ယ်ပါ။ လက်လီရောင်းဝယ်မှုနှင့်ဥရောပရှိကော်ပိုရိတ်ဖောက်သည်များအတွက်",
   "didnt_get_code": "ကုဒ်ကို မရဘူးလား?",
   "digit_pin": "-ဂဏန်း PIN",
   "digital_and_physical_card": "  ဒစ်ဂျစ်တယ်နှင့် ရုပ်ပိုင်းဆိုင်ရာ ကြိုတင်ငွေပေးချေသော ဒက်ဘစ်ကတ်",
diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb
index a7a3a20a5..1bc1f8cd7 100644
--- a/res/values/strings_nl.arb
+++ b/res/values/strings_nl.arb
@@ -197,7 +197,7 @@
   "descending": "Aflopend",
   "description": "Beschrijving",
   "destination_tag": "Bestemmingstag:",
-  "dfx_option_description": "Koop crypto met EUR & CHF. Tot 990€ zonder extra KYC. Voor particuliere en zakelijke klanten in Europa",
+  "dfx_option_description": "Koop crypto met EUR & CHF. Voor retail- en zakelijke klanten in Europa",
   "didnt_get_code": "Geen code?",
   "digit_pin": "-cijferige PIN",
   "digital_and_physical_card": "digitale en fysieke prepaid debetkaart",
diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb
index e3cea5cad..ff8826c1e 100644
--- a/res/values/strings_pl.arb
+++ b/res/values/strings_pl.arb
@@ -197,7 +197,7 @@
   "descending": "Schodzenie",
   "description": "Opis",
   "destination_tag": "Tag docelowy:",
-  "dfx_option_description": "Kupuj kryptowaluty za EUR i CHF. Do 990 € bez dodatkowego KYC. Dla klientów detalicznych i korporacyjnych w Europie",
+  "dfx_option_description": "Kup krypto z EUR & CHF. Dla klientów detalicznych i korporacyjnych w Europie",
   "didnt_get_code": "Nie dostałeś kodu?",
   "digit_pin": "-znakowy PIN",
   "digital_and_physical_card": " cyfrowa i fizyczna przedpłacona karta debetowa",
diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb
index 45241e5a0..67ce2980a 100644
--- a/res/values/strings_pt.arb
+++ b/res/values/strings_pt.arb
@@ -197,7 +197,7 @@
   "descending": "descendente",
   "description": "Descrição",
   "destination_tag": "Tag de destino:",
-  "dfx_option_description": "Compre criptografia com EUR e CHF. Até 990€ sem KYC adicional. Para clientes de varejo e corporativos na Europa",
+  "dfx_option_description": "Compre criptografia com EUR & CHF. Para clientes de varejo e corporativo na Europa",
   "didnt_get_code": "Não recebeu o código?",
   "digit_pin": "dígitos",
   "digital_and_physical_card": "cartão de débito pré-pago digital e físico",
diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb
index 281673326..673f1472d 100644
--- a/res/values/strings_ru.arb
+++ b/res/values/strings_ru.arb
@@ -197,7 +197,7 @@
   "descending": "Нисходящий",
   "description": "Описание",
   "destination_tag": "Целевой тег:",
-  "dfx_option_description": "Покупайте криптовалюту за EUR и CHF. До 990€ без дополнительного KYC. Для розничных и корпоративных клиентов в Европе",
+  "dfx_option_description": "Купить крипто с Eur & CHF. Для розничных и корпоративных клиентов в Европе",
   "didnt_get_code": "Не получить код?",
   "digit_pin": "-значный PIN",
   "digital_and_physical_card": "цифровая и физическая предоплаченная дебетовая карта",
diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb
index 98dfed3ea..1779b9da1 100644
--- a/res/values/strings_th.arb
+++ b/res/values/strings_th.arb
@@ -197,7 +197,7 @@
   "descending": "ลงมา",
   "description": "คำอธิบาย",
   "destination_tag": "แท็กปลายทาง:",
-  "dfx_option_description": "ซื้อ crypto ด้วย EUR และ CHF สูงถึง 990€ โดยไม่มี KYC เพิ่มเติม สำหรับลูกค้ารายย่อยและลูกค้าองค์กรในยุโรป",
+  "dfx_option_description": "ซื้อ crypto ด้วย Eur & CHF สำหรับลูกค้ารายย่อยและลูกค้าในยุโรป",
   "didnt_get_code": "ไม่ได้รับรหัส?",
   "digit_pin": "-หลัก PIN",
   "digital_and_physical_card": "บัตรเดบิตดิจิตอลและบัตรพื้นฐาน",
diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb
index 7506a7e2f..e358d6daf 100644
--- a/res/values/strings_tl.arb
+++ b/res/values/strings_tl.arb
@@ -197,7 +197,7 @@
   "descending": "Pababang",
   "description": "Paglalarawan",
   "destination_tag": "Tag ng patutunguhan:",
-  "dfx_option_description": "Bumili ng crypto gamit ang EUR at CHF. Hanggang 990€ nang walang karagdagang KYC. Para sa retail at corporate na mga customer sa Europe",
+  "dfx_option_description": "Bumili ng crypto kasama ang EUR & CHF. Para sa mga customer at corporate customer sa Europa",
   "didnt_get_code": "Hindi nakuha ang code?",
   "digit_pin": "-digit pin",
   "digital_and_physical_card": "Digital at Physical Prepaid Debit Card",
diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb
index b03e36a1b..76bd79d8a 100644
--- a/res/values/strings_tr.arb
+++ b/res/values/strings_tr.arb
@@ -197,7 +197,7 @@
   "descending": "Azalan",
   "description": "Tanım",
   "destination_tag": "Hedef Etiketi:",
-  "dfx_option_description": "EUR ve CHF ile kripto satın alın. Ek KYC olmadan 990 €'ya kadar. Avrupa'daki perakende ve kurumsal müşteriler için",
+  "dfx_option_description": "Eur & chf ile kripto satın alın. Avrupa'daki perakende ve kurumsal müşteriler için",
   "didnt_get_code": "Kod gelmedi mi?",
   "digit_pin": " haneli PIN",
   "digital_and_physical_card": " Dijital para birimleri ile para yükleyebileceğiniz ve ek bilgiye gerek olmayan",
diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb
index 5738bd13d..e1d470e1e 100644
--- a/res/values/strings_uk.arb
+++ b/res/values/strings_uk.arb
@@ -197,7 +197,7 @@
   "descending": "Низхідний",
   "description": "опис",
   "destination_tag": "Тег призначення:",
-  "dfx_option_description": "Купуйте криптовалюту за EUR і CHF. До 990 євро без додаткового KYC. Для роздрібних і корпоративних клієнтів у Європі",
+  "dfx_option_description": "Купуйте криптовалюту з EUR & CHF. Для роздрібних та корпоративних клієнтів у Європі",
   "didnt_get_code": "Не отримуєте код?",
   "digit_pin": "-значний PIN",
   "digital_and_physical_card": " цифрова та фізична передплачена дебетова картка",
diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb
index 6a971383d..02c5216ef 100644
--- a/res/values/strings_ur.arb
+++ b/res/values/strings_ur.arb
@@ -197,7 +197,7 @@
   "descending": "اترتے ہوئے",
   "description": "ﻞﯿﺼﻔﺗ",
   "destination_tag": "منزل کا ٹیگ:",
-  "dfx_option_description": "EUR ﺭﻭﺍ CHF ﯽﻓﺎﺿﺍ ۔ﮟﯾﺪﯾﺮﺧ ﻮﭩﭘﺮﮐ ﮫﺗﺎﺳ ﮯﮐ KYC ﮯﯿﻟ ﮯﮐ ﻦﯿﻓﺭﺎﺻ ﭧﯾﺭﻮﭘﺭﺎﮐ ﺭﻭﺍ ﮦﺩﺭﻮﺧ ﮟ",
+  "dfx_option_description": "یورو اور سی ایچ ایف کے ساتھ کرپٹو خریدیں۔ یورپ میں خوردہ اور کارپوریٹ صارفین کے لئے",
   "didnt_get_code": "کوڈ نہیں ملتا؟",
   "digit_pin": "-ہندسوں کا پن",
   "digital_and_physical_card": "  ڈیجیٹل اور فزیکل پری پیڈ ڈیبٹ کارڈ",
diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb
index 1efc25216..221b189e1 100644
--- a/res/values/strings_yo.arb
+++ b/res/values/strings_yo.arb
@@ -197,7 +197,7 @@
   "descending": "Sọkalẹ",
   "description": "Apejuwe",
   "destination_tag": "Orúkọ tí ìbí tó a ránṣẹ́ sí:",
-  "dfx_option_description": "Ra crypto pẹlu EUR & CHF. Titi di 990 € laisi afikun KYC. Fun soobu ati awọn onibara ile-iṣẹ ni Yuroopu",
+  "dfx_option_description": "Ra Crypto pẹlu EUR & CHF. Fun soobu ati awọn alabara ile-iṣẹ ni Yuroopu",
   "didnt_get_code": "Ko gba koodu?",
   "digit_pin": "-díjíìtì òǹkà ìdánimọ̀ àdáni",
   "digital_and_physical_card": " káàdì ìrajà t'ara àti ti ayélujára",
diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb
index 297f7ef28..d98801cb2 100644
--- a/res/values/strings_zh.arb
+++ b/res/values/strings_zh.arb
@@ -197,7 +197,7 @@
   "descending": "下降",
   "description": "描述",
   "destination_tag": "目标Tag:",
-  "dfx_option_description": "用欧元和瑞士法郎购买加密货币。高达 990 欧元,无需额外 KYC。对于欧洲的零售和企业客户",
+  "dfx_option_description": "用Eur&Chf购买加密货币。对于欧洲的零售和企业客户",
   "didnt_get_code": "没有获取代码?",
   "digit_pin": "位 PIN",
   "digital_and_physical_card": "数字和物理预付借记卡",

From 245ac5ae3cab6c53430db49b826424c27bb1f481 Mon Sep 17 00:00:00 2001
From: Omar Hatem <omarh.ismail1@gmail.com>
Date: Mon, 10 Jun 2024 17:24:52 +0200
Subject: [PATCH 3/4] Switch tron default node (#1488)

* fixes and minor enhancements for SP flow

* fix build

* change dfx text

* minor fixes

* pass use electrs to setListeners

* comment out connecting on failure for now

* Switch tron default node
---
 assets/tron_node_list.yml                    | 4 ++--
 lib/entities/default_settings_migration.dart | 5 ++++-
 lib/main.dart                                | 2 +-
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/assets/tron_node_list.yml b/assets/tron_node_list.yml
index d28e38f2e..b12a82dbe 100644
--- a/assets/tron_node_list.yml
+++ b/assets/tron_node_list.yml
@@ -1,8 +1,8 @@
 -
   uri: tron-rpc.publicnode.com:443
-  is_default: true
+  is_default: false
   useSSL: true
 -
   uri: api.trongrid.io
-  is_default: false
+  is_default: true
   useSSL: true
\ No newline at end of file
diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart
index 806285a81..dcde1d3ce 100644
--- a/lib/entities/default_settings_migration.dart
+++ b/lib/entities/default_settings_migration.dart
@@ -37,7 +37,7 @@ const cakeWalletBitcoinCashDefaultNodeUri = 'bitcoincash.stackwallet.com:50002';
 const nanoDefaultNodeUri = 'rpc.nano.to';
 const nanoDefaultPowNodeUri = 'rpc.nano.to';
 const solanaDefaultNodeUri = 'rpc.ankr.com';
-const tronDefaultNodeUri = 'tron-rpc.publicnode.com:443';
+const tronDefaultNodeUri = 'api.trongrid.io';
 const newCakeWalletBitcoinUri = 'btc-electrum.cakewallet.com:50002';
 
 Future<void> defaultSettingsMigration(
@@ -230,6 +230,9 @@ Future<void> defaultSettingsMigration(
         case 35:
           await _switchElectRsNode(nodes, sharedPreferences);
           break;
+        case 36:
+          await changeTronCurrentNodeToDefault(sharedPreferences: sharedPreferences, nodes: nodes);
+          break;
         default:
           break;
       }
diff --git a/lib/main.dart b/lib/main.dart
index 09f0cf432..5bcd9ffdb 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -202,7 +202,7 @@ Future<void> initializeAppConfigs() async {
     transactionDescriptions: transactionDescriptions,
     secureStorage: secureStorage,
     anonpayInvoiceInfo: anonpayInvoiceInfo,
-    initialMigrationVersion: 35,
+    initialMigrationVersion: 36,
   );
 }
 

From ffa0b416e98e6c9ab618c484642a444e8931c1d7 Mon Sep 17 00:00:00 2001
From: Omar Hatem <omarh.ismail1@gmail.com>
Date: Tue, 11 Jun 2024 00:54:46 +0200
Subject: [PATCH 4/4] v4.18.2 (#1489)

* v4.18.2

* update the actual app_env and remove .fish [skip ci]
---
 assets/text/Monerocom_Release_Notes.txt |  1 +
 assets/text/Release_Notes.txt           |  2 +
 scripts/android/app_env.fish            | 75 -------------------------
 scripts/android/app_env.sh              |  8 +--
 scripts/ios/app_env.sh                  |  8 +--
 scripts/macos/app_env.sh                |  8 +--
 6 files changed, 15 insertions(+), 87 deletions(-)
 delete mode 100644 scripts/android/app_env.fish

diff --git a/assets/text/Monerocom_Release_Notes.txt b/assets/text/Monerocom_Release_Notes.txt
index faad67777..34f805b90 100644
--- a/assets/text/Monerocom_Release_Notes.txt
+++ b/assets/text/Monerocom_Release_Notes.txt
@@ -1 +1,2 @@
+In-app Cake Pay is Back
 Bug fixes and generic enhancements
\ No newline at end of file
diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt
index faad67777..dcaf59665 100644
--- a/assets/text/Release_Notes.txt
+++ b/assets/text/Release_Notes.txt
@@ -1 +1,3 @@
+In-app Cake Pay is Back
+Bitcoin nodes stability enhancements
 Bug fixes and generic enhancements
\ No newline at end of file
diff --git a/scripts/android/app_env.fish b/scripts/android/app_env.fish
deleted file mode 100644
index 2268fe4dc..000000000
--- a/scripts/android/app_env.fish
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env fish
-
-set APP_ANDROID_NAME ""
-set APP_ANDROID_VERSION ""
-set APP_ANDROID_BUILD_VERSION ""
-set APP_ANDROID_ID ""
-set APP_ANDROID_PACKAGE ""
-set APP_ANDROID_SCHEME ""
-
-set MONERO_COM "monero.com"
-set CAKEWALLET "cakewallet"
-set HAVEN "haven"
-
-set -l TYPES $MONERO_COM $CAKEWALLET $HAVEN
-set APP_ANDROID_TYPE $argv[1]
-
-set MONERO_COM_NAME "Monero.com"
-set MONERO_COM_VERSION "1.12.3"
-set MONERO_COM_BUILD_NUMBER 84
-set MONERO_COM_BUNDLE_ID "com.monero.app"
-set MONERO_COM_PACKAGE "com.monero.app"
-set MONERO_COM_SCHEME "monero.com"
-
-set CAKEWALLET_NAME "Cake Wallet"
-set CAKEWALLET_VERSION "4.15.6"
-set CAKEWALLET_BUILD_NUMBER 207
-set CAKEWALLET_BUNDLE_ID "com.cakewallet.cake_wallet"
-set CAKEWALLET_PACKAGE "com.cakewallet.cake_wallet"
-set CAKEWALLET_SCHEME "cakewallet"
-
-set HAVEN_NAME "Haven"
-set HAVEN_VERSION "1.0.0"
-set HAVEN_BUILD_NUMBER 1
-set HAVEN_BUNDLE_ID "com.cakewallet.haven"
-set HAVEN_PACKAGE "com.cakewallet.haven"
-
-if not contains $APP_ANDROID_TYPE $TYPES
-    echo "Wrong app type."
-    return 1
-    exit 1
-end
-
-switch $APP_ANDROID_TYPE
-    case $MONERO_COM
-        set APP_ANDROID_NAME $MONERO_COM_NAME
-        set APP_ANDROID_VERSION $MONERO_COM_VERSION
-        set APP_ANDROID_BUILD_NUMBER $MONERO_COM_BUILD_NUMBER
-        set APP_ANDROID_BUNDLE_ID $MONERO_COM_BUNDLE_ID
-        set APP_ANDROID_PACKAGE $MONERO_COM_PACKAGE
-        set APP_ANDROID_SCHEME $MONERO_COM_SCHEME
-        ;;
-    case $CAKEWALLET
-        set APP_ANDROID_NAME $CAKEWALLET_NAME
-        set APP_ANDROID_VERSION $CAKEWALLET_VERSION
-        set APP_ANDROID_BUILD_NUMBER $CAKEWALLET_BUILD_NUMBER
-        set APP_ANDROID_BUNDLE_ID $CAKEWALLET_BUNDLE_ID
-        set APP_ANDROID_PACKAGE $CAKEWALLET_PACKAGE
-        set APP_ANDROID_SCHEME $CAKEWALLET_SCHEME
-        ;;
-    case $HAVEN
-        set APP_ANDROID_NAME $HAVEN_NAME
-        set APP_ANDROID_VERSION $HAVEN_VERSION
-        set APP_ANDROID_BUILD_NUMBER $HAVEN_BUILD_NUMBER
-        set APP_ANDROID_BUNDLE_ID $HAVEN_BUNDLE_ID
-        set APP_ANDROID_PACKAGE $HAVEN_PACKAGE
-        ;;
-end
-
-export APP_ANDROID_TYPE
-export APP_ANDROID_NAME
-export APP_ANDROID_VERSION
-export APP_ANDROID_BUILD_NUMBER
-export APP_ANDROID_BUNDLE_ID
-export APP_ANDROID_PACKAGE
-export APP_ANDROID_SCHEME
diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh
index deceec53e..99703a079 100644
--- a/scripts/android/app_env.sh
+++ b/scripts/android/app_env.sh
@@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
 APP_ANDROID_TYPE=$1
 
 MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="1.15.1"
-MONERO_COM_BUILD_NUMBER=91
+MONERO_COM_VERSION="1.15.2"
+MONERO_COM_BUILD_NUMBER=92
 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.18.1"
-CAKEWALLET_BUILD_NUMBER=217
+CAKEWALLET_VERSION="4.18.2"
+CAKEWALLET_BUILD_NUMBER=218
 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 8893d4842..974e44bc4 100644
--- a/scripts/ios/app_env.sh
+++ b/scripts/ios/app_env.sh
@@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
 APP_IOS_TYPE=$1
 
 MONERO_COM_NAME="Monero.com"
-MONERO_COM_VERSION="1.15.1"
-MONERO_COM_BUILD_NUMBER=89
+MONERO_COM_VERSION="1.15.2"
+MONERO_COM_BUILD_NUMBER=90
 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
 
 CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="4.18.1"
-CAKEWALLET_BUILD_NUMBER=249
+CAKEWALLET_VERSION="4.18.2"
+CAKEWALLET_BUILD_NUMBER=250
 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
 
 HAVEN_NAME="Haven"
diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh
index e648f1aa0..eae2fe886 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="1.5.1"
-MONERO_COM_BUILD_NUMBER=22
+MONERO_COM_VERSION="1.5.2"
+MONERO_COM_BUILD_NUMBER=23
 MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
 
 CAKEWALLET_NAME="Cake Wallet"
-CAKEWALLET_VERSION="1.11.1"
-CAKEWALLET_BUILD_NUMBER=79
+CAKEWALLET_VERSION="1.11.2"
+CAKEWALLET_BUILD_NUMBER=80
 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
 
 if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then