From 26a757f1f0fabaa8028e967641a3f8d102bb5353 Mon Sep 17 00:00:00 2001
From: fossephate <matt.cfosse@gmail.com>
Date: Tue, 29 Oct 2024 14:19:16 -0700
Subject: [PATCH] add peg in / out labels and make 6 confs only show up for peg
 in / out

---
 cw_bitcoin/lib/electrum_wallet.dart           |  7 +++++++
 cw_bitcoin/lib/litecoin_wallet.dart           | 19 ++++++++++++++-----
 cw_core/lib/transaction_info.dart             |  3 +--
 .../dashboard/transaction_list_item.dart      | 15 +++++++++++++--
 4 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart
index 98380bbf1..93a40cc33 100644
--- a/cw_bitcoin/lib/electrum_wallet.dart
+++ b/cw_bitcoin/lib/electrum_wallet.dart
@@ -2085,6 +2085,13 @@ abstract class ElectrumWalletBase
 
     final balances = await Future.wait(balanceFutures);
 
+    if (balances.isNotEmpty && balances.first['confirmed'] == null) {
+      // if we got null balance responses from the server, set our connection status to lost and return our last known balance:
+      print("got null balance responses from the server, setting connection status to lost");
+      syncStatus = LostConnectionSyncStatus();
+      return balance[currency] ?? ElectrumBalance(confirmed: 0, unconfirmed: 0, frozen: 0);
+    }
+
     for (var i = 0; i < balances.length; i++) {
       final addressRecord = addresses[i];
       final balance = balances[i];
diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart
index 55dfdf1fb..aece8524d 100644
--- a/cw_bitcoin/lib/litecoin_wallet.dart
+++ b/cw_bitcoin/lib/litecoin_wallet.dart
@@ -1042,15 +1042,18 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
 
       bool hasMwebInput = false;
       bool hasMwebOutput = false;
+      bool hasRegularInput = false;
+      bool hasRegularOutput = false;
 
       for (final output in transactionCredentials.outputs) {
-        if (output.extractedAddress?.toLowerCase().contains("mweb") ?? false) {
+        if (output.address.toLowerCase().contains("mweb") ||
+            (output.extractedAddress?.toLowerCase().contains("mweb") ?? false)) {
           hasMwebOutput = true;
           break;
         }
-        if (output.address.toLowerCase().contains("mweb")) {
-          hasMwebOutput = true;
-          break;
+        if (!(output.address.toLowerCase().contains("mweb")) ||
+            !(output.extractedAddress?.toLowerCase().contains("mweb") ?? false)) {
+          hasRegularOutput = true;
         }
       }
 
@@ -1059,9 +1062,13 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
         if (utxo.utxo.scriptType == SegwitAddresType.mweb) {
           hasMwebInput = true;
         }
+        if (utxo.utxo.scriptType == SegwitAddresType.p2wpkh) {
+          hasRegularInput = true;
+        }
       }
 
       bool isPegIn = !hasMwebInput && hasMwebOutput;
+      bool isPegOut = hasMwebInput && hasRegularOutput;
       bool isRegular = !hasMwebInput && !hasMwebOutput;
       tx.changeAddressOverride = (await (walletAddresses as LitecoinWalletAddresses)
               .getChangeAddress(isPegIn: isPegIn || isRegular))
@@ -1136,7 +1143,9 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
             addressRecord.balance -= utxo.value.toInt();
           });
           transaction.inputAddresses?.addAll(addresses);
-
+          print("isPegIn: $isPegIn, isPegOut: $isPegOut");
+          transaction.additionalInfo["isPegIn"] = isPegIn;
+          transaction.additionalInfo["isPegOut"] = isPegOut;
           transactionHistory.addOne(transaction);
           await updateUnspent();
           await updateBalance();
diff --git a/cw_core/lib/transaction_info.dart b/cw_core/lib/transaction_info.dart
index 9d0c968d8..3e34af75f 100644
--- a/cw_core/lib/transaction_info.dart
+++ b/cw_core/lib/transaction_info.dart
@@ -25,6 +25,5 @@ abstract class TransactionInfo extends Object with Keyable {
   @override
   dynamic get keyIndex => id;
 
-  late Map<String, dynamic> additionalInfo;
+  Map<String, dynamic> additionalInfo = {};
 }
-
diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart
index f3f89c257..79d1d4548 100644
--- a/lib/view_model/dashboard/transaction_list_item.dart
+++ b/lib/view_model/dashboard/transaction_list_item.dart
@@ -69,9 +69,20 @@ class TransactionListItem extends ActionListItem with Keyable {
         }
         break;
       case WalletType.litecoin:
-        if (transaction.confirmations >= 0 && transaction.confirmations < 6) {
-          return ' (${transaction.confirmations}/6)';
+        bool isPegIn = (transaction.additionalInfo["isPegIn"] as bool?) ?? false;
+        bool isPegOut = (transaction.additionalInfo["isPegOut"] as bool?) ?? false;
+        bool isPegInOut = isPegIn || isPegOut;
+        String str = '';
+        if (isPegInOut && transaction.confirmations >= 0 && transaction.confirmations < 6) {
+          str = " (${transaction.confirmations}/6)";
         }
+        if (isPegIn) {
+          str += " (Peg In)";
+        }
+        if (isPegOut) {
+          str += " (Peg Out)";
+        }
+        return str;
       default:
         return '';
     }