diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml
index f12dc6ee9c..e79cca7b1b 100644
--- a/core/res/src/main/res/values-ru/strings.xml
+++ b/core/res/src/main/res/values-ru/strings.xml
@@ -102,6 +102,7 @@
Заблокирован
Основная сеть
Сетевая комиссия
+ Сумма отправки будет уменьшена на %1$s (%2$s) для покрытия выбранного уровня комиссии
Далее
Нет
Нет адреса
@@ -479,7 +480,7 @@
Экзистенциальный депозит
Сумма комиссии в %s раз превышает рекомендованную. Убедитесь, что указанная комиссия верна.
Установлена высокая комиссия
- Ввиду особенности сети Tezos комиссия при переводе всего баланса выше. Для того, чтобы снизить комиссию Вы можете оставить %s.
+ Ввиду особенности сети %1$s комиссия при переводе всего баланса выше. Для того, чтобы снизить комиссию Вы можете оставить %2$s.
Комиссия повышена
Включенная комиссия превышает сумму перевода, что приводит к отрицательному значению
Недопустимая сумма
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 1b3c413136..a01c0c63ef 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -101,6 +101,7 @@
Locked
Main network
Network fee
+ Amount sent will be reduced by %1$s (%2$s) to cover the selected fee level
Next
No
No address
@@ -476,7 +477,7 @@
Existential deposit
The commission amount is %s times the recommended amount. Make sure that the custom settings are correct.
Custom fee is high
- Due to the peculiarities of the Tezos network, the fee for transferring the entire balance is higher. To reduce the commission, you can leave %s.
+ Due to the peculiarities of the %1$s network, the fee for transferring the entire balance is higher. To reduce the commission, you can leave %2$s.
The fee is higher
The included commission exceeds the transfer amount, leading to a negative value
Invalid amount
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt
index a22b3ee620..c59c030f46 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt
@@ -119,12 +119,13 @@ internal sealed class SendNotification(val config: NotificationConfig) {
),
) {
data class HighFeeError(
+ val currencyName: String,
val amount: String,
val onConfirmClick: () -> Unit,
val onCloseClick: () -> Unit,
) : Warning(
title = resourceReference(R.string.send_notification_high_fee_title),
- subtitle = resourceReference(R.string.send_notification_high_fee_text, wrappedList(amount)),
+ subtitle = resourceReference(R.string.send_notification_high_fee_text, wrappedList(currencyName, amount)),
buttonsState = NotificationConfig.ButtonsState.PrimaryButtonConfig(
text = resourceReference(R.string.send_notification_reduce_by, wrappedList(amount)),
onClick = onConfirmClick,
@@ -156,7 +157,7 @@ internal sealed class SendNotification(val config: NotificationConfig) {
data class FeeCoverageNotification(val cryptoAmount: String, val fiatAmount: String) : Warning(
title = resourceReference(R.string.send_network_fee_warning_title),
subtitle = resourceReference(
- R.string.send_network_fee_warning_content,
+ R.string.common_network_fee_warning_content,
wrappedList(cryptoAmount, fiatAmount),
),
)
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt
index 4b30a9466f..916388ae26 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt
@@ -260,6 +260,7 @@ internal class SendNotificationFactory(
if (!ignoreAmountReduce && isTotalBalance && isTezos) {
add(
SendNotification.Warning.HighFeeError(
+ currencyName = cryptoCurrencyStatus.currency.name,
amount = threshold.toPlainString(),
onConfirmClick = {
clickIntents.onAmountReduceClick(
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt
index e858d9b150..c4f1b95bdf 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt
@@ -4,7 +4,10 @@ import androidx.compose.animation.*
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
@@ -28,10 +31,10 @@ import com.tangem.core.ui.components.buttons.common.TangemButtonsDefaults
import com.tangem.core.ui.components.keyboardAsState
import com.tangem.core.ui.extensions.shareText
import com.tangem.core.ui.res.TangemTheme
-import com.tangem.core.ui.utils.BigDecimalFormatter
import com.tangem.features.send.impl.presentation.state.SendUiCurrentScreen
import com.tangem.features.send.impl.presentation.state.SendUiState
import com.tangem.features.send.impl.presentation.state.SendUiStateType
+import com.tangem.features.send.impl.presentation.utils.getFiatFormatted
@Composable
internal fun SendNavigationButtons(
@@ -172,15 +175,15 @@ private fun SendingText(
}
if (feeFiat != null && sendingFiat != null) {
- val sendingValue = BigDecimalFormatter.formatFiatAmount(
- fiatAmount = sendingFiat,
- fiatCurrencyCode = feeState.appCurrency.code,
- fiatCurrencySymbol = feeState.appCurrency.symbol,
+ val sendingValue = getFiatFormatted(
+ value = sendingFiat,
+ currencySymbol = feeState.appCurrency.symbol,
+ currencyCode = feeState.appCurrency.code,
)
- val feeValue = BigDecimalFormatter.formatFiatAmount(
- fiatAmount = feeFiat,
- fiatCurrencyCode = feeState.appCurrency.code,
- fiatCurrencySymbol = feeState.appCurrency.symbol,
+ val feeValue = getFiatFormatted(
+ value = feeState.fee?.amount?.value,
+ currencySymbol = feeState.appCurrency.symbol,
+ currencyCode = feeState.appCurrency.code,
)
Text(
text = stringResource(id = R.string.send_summary_transaction_description, sendingValue, feeValue),
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt
index 73ef044814..8854274b17 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt
@@ -36,24 +36,27 @@ internal fun getFiatReference(value: BigDecimal?, rate: BigDecimal?, appCurrency
internal fun getFiatString(value: BigDecimal?, rate: BigDecimal?, appCurrency: AppCurrency): String {
if (value == null || rate == null) return EMPTY_BALANCE_SIGN
val feeValue = value.multiply(rate)
- val scaled = feeValue.setScale(FIAT_DECIMALS, RoundingMode.UP) ?: BigDecimal.ZERO
- val formattedValue = if (scaled < BigDecimal(FEE_MINIMUM_VALUE)) {
+ return getFiatFormatted(feeValue, appCurrency.code, appCurrency.symbol)
+}
+
+internal fun getFiatFormatted(value: BigDecimal?, currencyCode: String, currencySymbol: String): String {
+ val scaled = value?.setScale(FIAT_DECIMALS, RoundingMode.UP) ?: BigDecimal.ZERO
+ return if (scaled < BigDecimal(FEE_MINIMUM_VALUE)) {
buildString {
append(BigDecimalFormatter.CAN_BE_LOWER_SIGN)
append(
BigDecimalFormatter.formatFiatAmount(
fiatAmount = BigDecimal(FEE_MINIMUM_VALUE),
- fiatCurrencyCode = appCurrency.code,
- fiatCurrencySymbol = appCurrency.symbol,
+ fiatCurrencyCode = currencyCode,
+ fiatCurrencySymbol = currencySymbol,
),
)
}
} else {
BigDecimalFormatter.formatFiatAmount(
- fiatAmount = feeValue,
- fiatCurrencyCode = appCurrency.code,
- fiatCurrencySymbol = appCurrency.symbol,
+ fiatAmount = value,
+ fiatCurrencyCode = currencyCode,
+ fiatCurrencySymbol = currencySymbol,
)
}
- return formattedValue
}
\ No newline at end of file
diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt
index c3fd4f4fd5..1147346e65 100644
--- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt
+++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt
@@ -218,6 +218,7 @@ internal class StateBuilder(
quoteModel = quoteModel,
fromToken = fromToken,
ignoreAmountReduce = uiStateHolder.reduceAmountIgnore,
+ selectedFeeType = selectedFeeType,
)
val feeState = createFeeState(quoteModel.txFee, selectedFeeType)
val fromCurrencyStatus = quoteModel.fromTokenInfo.cryptoCurrencyStatus
@@ -317,12 +318,13 @@ internal class StateBuilder(
quoteModel: SwapState.QuotesLoadedState,
fromToken: CryptoCurrency,
ignoreAmountReduce: Boolean,
+ selectedFeeType: FeeType,
): List {
val warnings = mutableListOf()
maybeAddDomainWarnings(quoteModel, warnings, ignoreAmountReduce)
maybeAddNeedReserveToCreateAccountWarning(quoteModel, warnings)
maybeAddPermissionNeededWarning(quoteModel, warnings, fromToken)
- maybeAddNetworkFeeCoverageWarning(quoteModel, warnings)
+ maybeAddNetworkFeeCoverageWarning(quoteModel, warnings, selectedFeeType)
maybeAddUnableCoverFeeWarning(quoteModel, fromToken, warnings)
maybeAddInsufficientFundsWarning(quoteModel, warnings)
maybeAddTransactionInProgressWarning(quoteModel, warnings)
@@ -461,18 +463,37 @@ internal class StateBuilder(
private fun maybeAddNetworkFeeCoverageWarning(
quoteModel: SwapState.QuotesLoadedState,
warnings: MutableList,
+ selectedFeeType: FeeType,
) {
when (quoteModel.preparedSwapConfigState.includeFeeInAmount) {
- is IncludeFeeInAmount.Included ->
+ is IncludeFeeInAmount.Included -> {
+ val fee = selectFeeByType(selectedFeeType, quoteModel.txFee) ?: return
warnings.add(
SwapWarning.GeneralWarning(
- createNetworkFeeCoverageNotificationConfig(),
+ createNetworkFeeCoverageNotificationConfig(
+ quoteModel.fromTokenInfo.tokenAmount.getFormattedCryptoAmount(
+ quoteModel.fromTokenInfo.cryptoCurrencyStatus.currency,
+ ),
+ fee.feeFiatFormatted,
+ ),
),
)
+ }
else -> Unit
}
}
+ private fun selectFeeByType(feeType: FeeType, txFeeState: TxFeeState): TxFee? {
+ return when (txFeeState) {
+ TxFeeState.Empty -> null
+ is TxFeeState.SingleFeeState -> txFeeState.fee
+ is TxFeeState.MultipleFeeState -> when (feeType) {
+ FeeType.NORMAL -> txFeeState.normalFee
+ FeeType.PRIORITY -> txFeeState.priorityFee
+ }
+ }
+ }
+
private fun maybeAddUnableCoverFeeWarning(
quoteModel: SwapState.QuotesLoadedState,
fromToken: CryptoCurrency,
@@ -548,12 +569,12 @@ internal class StateBuilder(
if (uiStateHolder.receiveCardData !is SwapCardState.SwapCardData) return uiStateHolder
val warnings = mutableListOf()
warnings.add(getWarningForError(dataError, fromToken.cryptoCurrencyStatus.currency))
- if (includeFeeInAmount is IncludeFeeInAmount.Included) {
- warnings.add(
- SwapWarning.GeneralWarning(
- createNetworkFeeCoverageNotificationConfig(),
- ),
+ if (includeFeeInAmount is IncludeFeeInAmount.Included && uiStateHolder.fee is FeeItemState.Content) {
+ val feeCoverageNotification = createNetworkFeeCoverageNotificationConfig(
+ fromToken.tokenAmount.getFormattedCryptoAmount(fromToken.cryptoCurrencyStatus.currency),
+ uiStateHolder.fee.amountFiatFormatted,
)
+ warnings.add(SwapWarning.GeneralWarning(feeCoverageNotification))
}
val providerState = getProviderStateForError(
swapProvider = swapProvider,
@@ -1397,10 +1418,16 @@ internal class StateBuilder(
)
}
- private fun createNetworkFeeCoverageNotificationConfig(): NotificationConfig {
+ private fun createNetworkFeeCoverageNotificationConfig(
+ cryptoAmount: String,
+ fiatAmount: String,
+ ): NotificationConfig {
return NotificationConfig(
title = resourceReference(R.string.send_network_fee_warning_title),
- subtitle = resourceReference(R.string.swapping_network_fee_warning_content),
+ subtitle = resourceReference(
+ R.string.common_network_fee_warning_content,
+ wrappedList(cryptoAmount, fiatAmount),
+ ),
iconResId = R.drawable.img_attention_20,
)
}