diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/error/SendTransactionError.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/error/SendTransactionError.kt index 753f45e4b4..22b7991290 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/error/SendTransactionError.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/error/SendTransactionError.kt @@ -8,7 +8,7 @@ sealed class SendTransactionError { data class DataError(val message: String?) : SendTransactionError() - data class NetworkError(val message: String?) : SendTransactionError() + data class NetworkError(val message: String?, val code: String?) : SendTransactionError() data class BlockchainSdkError(val code: Int, val message: String?) : SendTransactionError() diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt index 059a672c70..d2c9cbd085 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt @@ -67,7 +67,12 @@ class SendTransactionUseCase( } private fun handleError(result: SimpleResult.Failure): SendTransactionError { - if (ResultChecker.isNetworkError(result)) return SendTransactionError.NetworkError(result.error.message) + if (ResultChecker.isNetworkError(result)) { + return SendTransactionError.NetworkError( + code = result.error.message, + message = result.error.customMessage, + ) + } val error = result.error as? BlockchainSdkError ?: return SendTransactionError.UnknownError() return when (error) { is BlockchainSdkError.WrappedTangemError -> { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt index a35b421a16..ad5d16e175 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt @@ -29,8 +29,8 @@ internal class SendTransactionAlertConverter( onConfirmClick = { clickIntents.onFailedTxEmailClick(value.message.orEmpty()) }, ) is SendTransactionError.NetworkError -> SendAlertState.TransactionError( - code = "", - cause = value.message, + code = value.code.orEmpty(), + cause = value.message.orEmpty(), onConfirmClick = { clickIntents.onFailedTxEmailClick(value.message.orEmpty()) }, ) is SendTransactionError.UnknownError -> SendAlertState.TransactionError( 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 782b8beb8e..709779d1df 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 @@ -20,6 +20,7 @@ import com.tangem.features.send.impl.presentation.state.* import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState import com.tangem.features.send.impl.presentation.state.fee.FeeType import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents +import com.tangem.lib.crypto.BlockchainUtils.isDogecoin import com.tangem.utils.Provider import com.tangem.utils.isNullOrZero import kotlinx.collections.immutable.ImmutableList @@ -52,18 +53,17 @@ internal class SendNotificationFactory( val feeState = state.feeState ?: return@map persistentListOf() val feeAmount = feeState.fee?.amount?.value ?: BigDecimal.ZERO val amountValue = state.amountState?.amountTextField?.cryptoAmount?.value ?: BigDecimal.ZERO - val sendAmount = if (sendState.isSubtract) amountValue.minus(feeAmount) else amountValue buildList { // errors - addExceedBalanceNotification(feeAmount, sendAmount) + addExceedBalanceNotification(feeAmount, amountValue) addExceedsBalanceNotification(feeState.fee) - addInvalidAmountNotification(sendState.isSubtract, sendAmount) - addMinimumAmountErrorNotification(feeAmount, sendAmount) - addDustWarningNotification(feeAmount, sendAmount) - addTransactionLimitErrorNotification(feeAmount, sendAmount) + addInvalidAmountNotification(sendState.isSubtract, amountValue) + addMinimumAmountErrorNotification(feeAmount, amountValue) + addDustWarningNotification(feeAmount, amountValue) + addTransactionLimitErrorNotification(feeAmount, amountValue) // warnings - addExistentialWarningNotification(feeAmount, sendAmount) - addHighFeeWarningNotification(sendAmount, sendState.ignoreAmountReduce) + addExistentialWarningNotification(feeAmount, amountValue) + addHighFeeWarningNotification(feeAmount, amountValue, sendState.ignoreAmountReduce) addTooLowNotification(feeState) }.toImmutableList() } @@ -121,20 +121,11 @@ internal class SendNotificationFactory( val totalAmount = feeAmount + receivedAmount val balance = coinCryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO - // TODO Move Blockchain check elsewhere - when (coinCryptoCurrencyStatus.currency.network.id.value) { - Blockchain.Cardano.id -> { - if (receivedAmount > BigDecimal.ONE || balance - totalAmount < BigDecimal.ONE) { - add(SendNotification.Error.MinimumAmountError(CARDANO_MINIMUM)) - } + if (isDogecoin(coinCryptoCurrencyStatus.currency.network.id.value)) { + val minimum = BigDecimal(DOGECOIN_MINIMUM) + if (receivedAmount < minimum || balance - totalAmount < minimum) { + add(SendNotification.Error.MinimumAmountError(DOGECOIN_MINIMUM)) } - Blockchain.Dogecoin.id -> { - val minimum = BigDecimal(DOGECOIN_MINIMUM) - if (receivedAmount > minimum || balance - totalAmount < minimum) { - add(SendNotification.Error.MinimumAmountError(DOGECOIN_MINIMUM)) - } - } - else -> Unit } } @@ -199,7 +190,9 @@ internal class SendNotificationFactory( receivedAmount: BigDecimal, ) { val userWalletId = userWalletProvider().walletId - val cryptoCurrency = cryptoCurrencyStatusProvider().currency + val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() + val cryptoCurrency = cryptoCurrencyStatus.currency + val balance = cryptoCurrencyStatus.value.amount ?: return val spendingAmount = if (cryptoCurrency is CryptoCurrency.Token) { feeAmount } else { @@ -209,7 +202,8 @@ internal class SendNotificationFactory( userWalletId, cryptoCurrency.network, ) - if (currencyDeposit != null && currencyDeposit > spendingAmount) { + val diff = balance.minus(spendingAmount) + if (currencyDeposit != null && currencyDeposit > diff) { add( SendNotification.Error.ExistentialDeposit( BigDecimalFormatter.formatCryptoAmount( @@ -222,13 +216,15 @@ internal class SendNotificationFactory( } private fun MutableList.addHighFeeWarningNotification( + feeAmount: BigDecimal, sendAmount: BigDecimal, ignoreAmountReduce: Boolean, ) { val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() val balance = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO val isTezos = cryptoCurrencyStatus.currency.network.id.value == Blockchain.Tezos.id - if (!ignoreAmountReduce && sendAmount == balance && isTezos) { + val isTotalBalance = feeAmount.plus(sendAmount) >= balance + if (!ignoreAmountReduce && isTotalBalance && isTezos) { add( SendNotification.Warning.HighFeeError( amount = TEZOS_FEE_THRESHOLD.toPlainString(), @@ -361,7 +357,6 @@ internal class SendNotificationFactory( } companion object { - private const val CARDANO_MINIMUM = "1" private const val DOGECOIN_MINIMUM = "0.01" private val TEZOS_FEE_THRESHOLD = BigDecimal("0.01") } diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt index a6e7acf14d..cf10f1ce54 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt @@ -32,4 +32,9 @@ object BlockchainUtils { val blockchain = Blockchain.fromId(networkId) return blockchain == Blockchain.Bitcoin || blockchain == Blockchain.BitcoinTestnet } + + fun isDogecoin(networkId: String): Boolean { + val blockchain = Blockchain.fromId(networkId) + return blockchain == Blockchain.Dogecoin + } } \ No newline at end of file