From 46e62f2b2c4524db08f39cdfd4a48a2cccab6202 Mon Sep 17 00:00:00 2001
From: julian <julian@cypherstack.com>
Date: Mon, 27 Mar 2023 10:36:47 -0600
Subject: [PATCH] tx details modification to properly display eth token
 transaction info

---
 .../transaction_details_view.dart             | 66 ++++++++++++-------
 1 file changed, 44 insertions(+), 22 deletions(-)

diff --git a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart
index 8e12d1f0d..da59a3bb6 100644
--- a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart
+++ b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart
@@ -11,10 +11,12 @@ import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/dialogs/cancelling_transaction_progress_dialog.dart';
 import 'package:stackwallet/pages/wallet_view/transaction_views/edit_note_view.dart';
 import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
+import 'package:stackwallet/providers/db/main_db_provider.dart';
 import 'package:stackwallet/providers/global/address_book_service_provider.dart';
 import 'package:stackwallet/providers/providers.dart';
 import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
 import 'package:stackwallet/services/coins/manager.dart';
+import 'package:stackwallet/utilities/amount.dart';
 import 'package:stackwallet/utilities/assets.dart';
 import 'package:stackwallet/utilities/block_explorers.dart';
 import 'package:stackwallet/utilities/constants.dart';
@@ -65,9 +67,11 @@ class _TransactionDetailsViewState
   late final String walletId;
 
   late final Coin coin;
-  late final Decimal amount;
+  late final Amount amount;
   late final Decimal fee;
   late final String amountPrefix;
+  late final String unit;
+  late final bool isTokenTx;
 
   bool showFeePending = false;
 
@@ -75,11 +79,12 @@ class _TransactionDetailsViewState
   void initState() {
     isDesktop = Util.isDesktop;
     _transaction = widget.transaction;
+    isTokenTx = _transaction.subType == TransactionSubType.ethToken;
     walletId = widget.walletId;
 
     coin = widget.coin;
-    amount = _transaction.realAmount
-        .decimal; //Format.satoshisToAmount(_transaction.amount, coin: coin);
+    amount = _transaction
+        .realAmount; //Format.satoshisToAmount(_transaction.amount, coin: coin);
     fee = Format.satoshisToAmount(_transaction.fee, coin: coin);
 
     if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
@@ -89,6 +94,13 @@ class _TransactionDetailsViewState
       amountPrefix = _transaction.type == TransactionType.outgoing ? "-" : "+";
     }
 
+    unit = isTokenTx
+        ? ref
+            .read(mainDBProvider)
+            .getEthContractSync(_transaction.otherData!)!
+            .symbol
+        : coin.ticker;
+
     // if (coin == Coin.firo || coin == Coin.firoTestNet) {
     //   showFeePending = true;
     // } else {
@@ -434,15 +446,15 @@ class _TransactionDetailsViewState
                                         children: [
                                           SelectableText(
                                             "$amountPrefix${Format.localizedStringAsFixed(
-                                              value: amount,
+                                              value: amount.decimal,
                                               locale: ref.watch(
                                                 localeServiceChangeNotifierProvider
                                                     .select((value) =>
                                                         value.locale),
                                               ),
-                                              decimalPlaces: Constants
-                                                  .decimalPlacesForCoin(coin),
-                                            )} ${coin.ticker}",
+                                              decimalPlaces:
+                                                  amount.fractionDigits,
+                                            )} $unit",
                                             style: isDesktop
                                                 ? STextStyles
                                                         .desktopTextExtraExtraSmall(
@@ -465,11 +477,16 @@ class _TransactionDetailsViewState
                                                       value.externalCalls)))
                                             SelectableText(
                                               "$amountPrefix${Format.localizedStringAsFixed(
-                                                value: amount *
+                                                value: amount.decimal *
                                                     ref.watch(
                                                       priceAnd24hChangeNotifierProvider
-                                                          .select((value) =>
-                                                              value
+                                                          .select((value) => isTokenTx
+                                                              ? value
+                                                                  .getTokenPrice(
+                                                                      _transaction
+                                                                          .otherData!)
+                                                                  .item1
+                                                              : value
                                                                   .getPrice(
                                                                       coin)
                                                                   .item1),
@@ -874,7 +891,7 @@ class _TransactionDetailsViewState
                                   ? const EdgeInsets.all(16)
                                   : const EdgeInsets.all(12),
                               child: Builder(builder: (context) {
-                                final feeString = showFeePending
+                                String feeString = showFeePending
                                     ? _transaction.isConfirmed(
                                         currentHeight,
                                         coin.requiredConfirmations,
@@ -897,6 +914,9 @@ class _TransactionDetailsViewState
                                                     (value) => value.locale)),
                                         decimalPlaces:
                                             Constants.decimalPlacesForCoin(coin));
+                                if (isTokenTx) {
+                                  feeString += " ${coin.ticker}";
+                                }
 
                                 return Row(
                                   mainAxisAlignment:
@@ -1138,18 +1158,20 @@ class _TransactionDetailsViewState
                                                       .externalApplication,
                                                 );
                                               } catch (_) {
-                                                unawaited(
-                                                  showDialog<void>(
-                                                    context: context,
-                                                    builder: (_) =>
-                                                        StackOkDialog(
-                                                      title:
-                                                          "Could not open in block explorer",
-                                                      message:
-                                                          "Failed to open \"${uri.toString()}\"",
+                                                if (mounted) {
+                                                  unawaited(
+                                                    showDialog<void>(
+                                                      context: context,
+                                                      builder: (_) =>
+                                                          StackOkDialog(
+                                                        title:
+                                                            "Could not open in block explorer",
+                                                        message:
+                                                            "Failed to open \"${uri.toString()}\"",
+                                                      ),
                                                     ),
-                                                  ),
-                                                );
+                                                  );
+                                                }
                                               } finally {
                                                 // Future<void>.delayed(
                                                 //   const Duration(seconds: 1),