From 20c3da72a31e8c7530c9df00749e64dfad8a4d6a Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Thu, 30 Mar 2023 15:15:43 -0600 Subject: [PATCH] fix fee sheet for eth tokens --- .../transaction_fee_selection_sheet.dart | 179 ++++++++++-------- lib/pages/send_view/token_send_view.dart | 1 + 2 files changed, 100 insertions(+), 80 deletions(-) diff --git a/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart b/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart index 8ad6d0ca5..c6584ee9f 100644 --- a/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart +++ b/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart @@ -3,6 +3,7 @@ import 'package:decimal/decimal.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/models/paymint/fee_object_model.dart'; +import 'package:stackwallet/pages/token_view/token_view.dart'; import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/ui/fee_rate_type_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; @@ -11,6 +12,7 @@ import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart'; import 'package:stackwallet/utilities/format.dart'; +import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/widgets/animated_text.dart'; @@ -34,11 +36,13 @@ class TransactionFeeSelectionSheet extends ConsumerStatefulWidget { required this.walletId, required this.amount, required this.updateChosen, + this.isToken = false, }) : super(key: key); final String walletId; final Decimal amount; final Function updateChosen; + final bool isToken; @override ConsumerState<TransactionFeeSelectionSheet> createState() => @@ -68,88 +72,109 @@ class _TransactionFeeSelectionSheetState switch (feeRateType) { case FeeRateType.fast: if (ref.read(feeSheetSessionCacheProvider).fast[amount] == null) { - final manager = - ref.read(walletsChangeNotifierProvider).getManager(walletId); + if (widget.isToken == false) { + final manager = + ref.read(walletsChangeNotifierProvider).getManager(walletId); - if (coin == Coin.monero || coin == Coin.wownero) { - final fee = await manager.estimateFeeFor( - amount, MoneroTransactionPriority.fast.raw!); - ref.read(feeSheetSessionCacheProvider).fast[amount] = - Format.satoshisToAmount( - fee, - coin: coin, - ); - } else if ((coin == Coin.firo || coin == Coin.firoTestNet) && - ref.read(publicPrivateBalanceStateProvider.state).state != - "Private") { - ref.read(feeSheetSessionCacheProvider).fast[amount] = - Format.satoshisToAmount( - await (manager.wallet as FiroWallet) - .estimateFeeForPublic(amount, feeRate), - coin: coin); + if (coin == Coin.monero || coin == Coin.wownero) { + final fee = await manager.estimateFeeFor( + amount, MoneroTransactionPriority.fast.raw!); + ref.read(feeSheetSessionCacheProvider).fast[amount] = + Format.satoshisToAmount( + fee, + coin: coin, + ); + } else if ((coin == Coin.firo || coin == Coin.firoTestNet) && + ref.read(publicPrivateBalanceStateProvider.state).state != + "Private") { + ref.read(feeSheetSessionCacheProvider).fast[amount] = + Format.satoshisToAmount( + await (manager.wallet as FiroWallet) + .estimateFeeForPublic(amount, feeRate), + coin: coin); + } else { + ref.read(feeSheetSessionCacheProvider).fast[amount] = + Format.satoshisToAmount( + await manager.estimateFeeFor(amount, feeRate), + coin: coin); + } } else { + final tokenWallet = ref.read(tokenServiceProvider)!; + final fee = await tokenWallet.estimateFeeFor(amount, feeRate); ref.read(feeSheetSessionCacheProvider).fast[amount] = - Format.satoshisToAmount( - await manager.estimateFeeFor(amount, feeRate), - coin: coin); + Format.satoshisToAmount(fee, coin: coin); } } return ref.read(feeSheetSessionCacheProvider).fast[amount]!; case FeeRateType.average: if (ref.read(feeSheetSessionCacheProvider).average[amount] == null) { - final manager = - ref.read(walletsChangeNotifierProvider).getManager(walletId); - if (coin == Coin.monero || coin == Coin.wownero) { - final fee = await manager.estimateFeeFor( - amount, MoneroTransactionPriority.regular.raw!); - ref.read(feeSheetSessionCacheProvider).average[amount] = - Format.satoshisToAmount( - fee, - coin: coin, - ); - } else if ((coin == Coin.firo || coin == Coin.firoTestNet) && - ref.read(publicPrivateBalanceStateProvider.state).state != - "Private") { - ref.read(feeSheetSessionCacheProvider).average[amount] = - Format.satoshisToAmount( - await (manager.wallet as FiroWallet) - .estimateFeeForPublic(amount, feeRate), - coin: coin); + if (widget.isToken == false) { + final manager = + ref.read(walletsChangeNotifierProvider).getManager(walletId); + if (coin == Coin.monero || coin == Coin.wownero) { + final fee = await manager.estimateFeeFor( + amount, MoneroTransactionPriority.regular.raw!); + ref.read(feeSheetSessionCacheProvider).average[amount] = + Format.satoshisToAmount( + fee, + coin: coin, + ); + } else if ((coin == Coin.firo || coin == Coin.firoTestNet) && + ref.read(publicPrivateBalanceStateProvider.state).state != + "Private") { + ref.read(feeSheetSessionCacheProvider).average[amount] = + Format.satoshisToAmount( + await (manager.wallet as FiroWallet) + .estimateFeeForPublic(amount, feeRate), + coin: coin); + } else { + ref.read(feeSheetSessionCacheProvider).average[amount] = + Format.satoshisToAmount( + await manager.estimateFeeFor(amount, feeRate), + coin: coin); + } } else { + final tokenWallet = ref.read(tokenServiceProvider)!; + final fee = await tokenWallet.estimateFeeFor(amount, feeRate); ref.read(feeSheetSessionCacheProvider).average[amount] = - Format.satoshisToAmount( - await manager.estimateFeeFor(amount, feeRate), - coin: coin); + Format.satoshisToAmount(fee, coin: coin); } } return ref.read(feeSheetSessionCacheProvider).average[amount]!; case FeeRateType.slow: if (ref.read(feeSheetSessionCacheProvider).slow[amount] == null) { - final manager = - ref.read(walletsChangeNotifierProvider).getManager(walletId); - if (coin == Coin.monero || coin == Coin.wownero) { - final fee = await manager.estimateFeeFor( - amount, MoneroTransactionPriority.slow.raw!); - ref.read(feeSheetSessionCacheProvider).slow[amount] = - Format.satoshisToAmount( - fee, - coin: coin, - ); - } else if ((coin == Coin.firo || coin == Coin.firoTestNet) && - ref.read(publicPrivateBalanceStateProvider.state).state != - "Private") { - ref.read(feeSheetSessionCacheProvider).slow[amount] = - Format.satoshisToAmount( - await (manager.wallet as FiroWallet) - .estimateFeeForPublic(amount, feeRate), - coin: coin); + if (widget.isToken == false) { + final manager = + ref.read(walletsChangeNotifierProvider).getManager(walletId); + if (coin == Coin.monero || coin == Coin.wownero) { + final fee = await manager.estimateFeeFor( + amount, MoneroTransactionPriority.slow.raw!); + ref.read(feeSheetSessionCacheProvider).slow[amount] = + Format.satoshisToAmount( + fee, + coin: coin, + ); + } else if ((coin == Coin.firo || coin == Coin.firoTestNet) && + ref.read(publicPrivateBalanceStateProvider.state).state != + "Private") { + ref.read(feeSheetSessionCacheProvider).slow[amount] = + Format.satoshisToAmount( + await (manager.wallet as FiroWallet) + .estimateFeeForPublic(amount, feeRate), + coin: coin); + } else { + ref.read(feeSheetSessionCacheProvider).slow[amount] = + Format.satoshisToAmount( + await manager.estimateFeeFor(amount, feeRate), + coin: coin); + } } else { + final tokenWallet = ref.read(tokenServiceProvider)!; + final fee = await tokenWallet.estimateFeeFor(amount, feeRate); ref.read(feeSheetSessionCacheProvider).slow[amount] = - Format.satoshisToAmount( - await manager.estimateFeeFor(amount, feeRate), - coin: coin); + Format.satoshisToAmount(fee, coin: coin); } } return ref.read(feeSheetSessionCacheProvider).slow[amount]!; @@ -231,7 +256,9 @@ class _TransactionFeeSelectionSheetState height: 36, ), FutureBuilder( - future: manager.fees, + future: widget.isToken + ? ref.read(tokenServiceProvider)!.fees + : manager.fees, builder: (context, AsyncSnapshot<FeeObject> snapshot) { if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { @@ -336,7 +363,7 @@ class _TransactionFeeSelectionSheetState ConnectionState.done && snapshot.hasData) { return Text( - "(~${snapshot.data!} ${manager.coin.ticker})", + "(~${snapshot.data!.toStringAsFixed(manager.coin.decimals)} ${manager.coin.ticker})", style: STextStyles.itemSubtitle( context), textAlign: TextAlign.left, @@ -468,7 +495,7 @@ class _TransactionFeeSelectionSheetState ConnectionState.done && snapshot.hasData) { return Text( - "(~${snapshot.data!} ${manager.coin.ticker})", + "(~${snapshot.data!.toStringAsFixed(manager.coin.decimals)} ${manager.coin.ticker})", style: STextStyles.itemSubtitle( context), textAlign: TextAlign.left, @@ -523,7 +550,6 @@ class _TransactionFeeSelectionSheetState FeeRateType.slow; } String? fee = getAmount(FeeRateType.slow, manager.coin); - print("fee $fee"); if (fee != null) { widget.updateChosen(fee); } @@ -602,7 +628,7 @@ class _TransactionFeeSelectionSheetState ConnectionState.done && snapshot.hasData) { return Text( - "(~${snapshot.data!} ${manager.coin.ticker})", + "(~${snapshot.data!.toStringAsFixed(manager.coin.decimals)} ${manager.coin.ticker})", style: STextStyles.itemSubtitle( context), textAlign: TextAlign.left, @@ -660,18 +686,13 @@ class _TransactionFeeSelectionSheetState String? getAmount(FeeRateType feeRateType, Coin coin) { try { - print(feeRateType); - var amount = Format.decimalAmountToSatoshis(this.amount, coin); - print(amount); - print(ref.read(feeSheetSessionCacheProvider).fast); - print(ref.read(feeSheetSessionCacheProvider).average); - print(ref.read(feeSheetSessionCacheProvider).slow); + final amount = Format.decimalAmountToSatoshis(this.amount, coin); switch (feeRateType) { case FeeRateType.fast: if (ref.read(feeSheetSessionCacheProvider).fast[amount] != null) { return (ref.read(feeSheetSessionCacheProvider).fast[amount] as Decimal) - .toString(); + .toStringAsFixed(coin.decimals); } return null; @@ -679,22 +700,20 @@ class _TransactionFeeSelectionSheetState if (ref.read(feeSheetSessionCacheProvider).average[amount] != null) { return (ref.read(feeSheetSessionCacheProvider).average[amount] as Decimal) - .toString(); + .toStringAsFixed(coin.decimals); } return null; case FeeRateType.slow: - print(ref.read(feeSheetSessionCacheProvider).slow); - print(ref.read(feeSheetSessionCacheProvider).slow[amount]); if (ref.read(feeSheetSessionCacheProvider).slow[amount] != null) { return (ref.read(feeSheetSessionCacheProvider).slow[amount] as Decimal) - .toString(); + .toStringAsFixed(coin.decimals); } return null; } } catch (e, s) { - print("$e $s"); + Logging.instance.log("$e $s", level: LogLevel.Warning); return null; } } diff --git a/lib/pages/send_view/token_send_view.dart b/lib/pages/send_view/token_send_view.dart index 5f58508f3..b5c676d99 100644 --- a/lib/pages/send_view/token_send_view.dart +++ b/lib/pages/send_view/token_send_view.dart @@ -1136,6 +1136,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> { builder: (_) => TransactionFeeSelectionSheet( walletId: walletId, + isToken: true, amount: Decimal.tryParse( cryptoAmountController.text) ?? Decimal.zero,