diff --git a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt index be0c324b89..b1cdd1eec0 100644 --- a/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/TransactionManagerImpl.kt @@ -20,6 +20,7 @@ import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.lib.crypto.TransactionManager import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.ProxyAmount +import com.tangem.lib.crypto.models.ProxyNetworkInfo import com.tangem.lib.crypto.models.transactions.SendTxResult import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TangemSigner @@ -148,8 +149,13 @@ class TransactionManagerImpl( } } - override fun getBlockchainId(networkId: String): String { - return requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" }.id + override fun getBlockchainInfo(networkId: String): ProxyNetworkInfo { + val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } + return ProxyNetworkInfo( + name = blockchain.fullName, + blockchainId = blockchain.id, + blockchainCurrency = blockchain.currency, + ) } private fun handleSendResult(result: SimpleResult): SendTxResult { diff --git a/core/ui/src/main/java/com/tangem/core/ui/utils/InputFormatting.kt b/core/ui/src/main/java/com/tangem/core/ui/utils/InputFormatting.kt index c1d9028cff..2a1b531fc5 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/utils/InputFormatting.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/utils/InputFormatting.kt @@ -10,9 +10,9 @@ package com.tangem.core.ui.utils */ fun getValidatedNumberWithFixedDecimals(text: String, decimals: Int): String { val filteredChars = text.filterIndexed { index, c -> - c.isDigit() - || (c == '.' && index != 0 && text.indexOf('.') == index) - || (c == '.' && index != 0 && text.count { it == '.' } <= 1) + val isOneOrZeroPoint = c == '.' && index != 0 && text.count { it == '.' } <= 1 + val isIndexPointIndex = c == '.' && index != 0 && text.indexOf('.') == index + c.isDigit() || isIndexPointIndex || isOneOrZeroPoint } // If dot is present, take first 3 digits before decimal and first decimals digits after decimal return if (filteredChars.count { it == '.' } == 1) { diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/TokensConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/TokensConverter.kt index a3b46cdb29..a35f348ab4 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/TokensConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/TokensConverter.kt @@ -36,7 +36,6 @@ class TokensConverter @Inject constructor() : Converter= amount.value + tokenBalance >= amount.value } else { - /** to compare [BigDecimal] use only comparator */ - (userWalletManager.getCurrentWalletTokensBalance(networkId)[fromToken.symbol]?.value - ?: BigDecimal.ZERO) > amount.value.plus(fee ?: BigDecimal.ZERO) + tokenBalance > amount.value.plus(fee ?: BigDecimal.ZERO) } } @@ -551,16 +551,28 @@ internal class SwapInteractorImpl @Inject constructor( } } - private fun checkFeeIsEnough(fee: BigDecimal?, spendAmount: SwapAmount, networkId: String): Boolean { + private fun checkFeeIsEnough( + fee: BigDecimal?, + spendAmount: SwapAmount, + networkId: String, + fromToken: Currency, + ): Boolean { if (fee == null) { return false } - userWalletManager.getNativeTokenBalance(networkId)?.let { balance -> - return balance.value.minus(spendAmount.value) > fee.multiply( - BigDecimal.valueOf( - INCREASE_FEE_TO_CHECK_ENOUGH_PERCENT, - ), - ) + val nativeTokenBalance = userWalletManager.getNativeTokenBalance(networkId) + val percentsToFeeIncrease = BigDecimal.valueOf(INCREASE_FEE_TO_CHECK_ENOUGH_PERCENT) + return when (fromToken) { + is Currency.NativeToken -> { + nativeTokenBalance?.let { balance -> + return balance.value.minus(spendAmount.value) > fee.multiply(percentsToFeeIncrease) + } ?: false + } + is Currency.NonNativeToken -> { + nativeTokenBalance?.let { balance -> + return balance.value > fee.multiply(percentsToFeeIncrease) + } ?: false + } } return false } diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/NetworkInfo.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/NetworkInfo.kt new file mode 100644 index 0000000000..fee839273d --- /dev/null +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/NetworkInfo.kt @@ -0,0 +1,7 @@ +package com.tangem.feature.swap.domain.models.domain + +data class NetworkInfo( + val name: String, + val blockchainId: String, + val blockchainCurrency: String, +) \ 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 51edee06d5..4fd3e2b220 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 @@ -3,6 +3,7 @@ package com.tangem.feature.swap.ui import com.tangem.feature.swap.converters.TokensDataConverter import com.tangem.feature.swap.domain.models.DataError import com.tangem.feature.swap.domain.models.domain.Currency +import com.tangem.feature.swap.domain.models.domain.NetworkInfo import com.tangem.feature.swap.domain.models.domain.isNonNative import com.tangem.feature.swap.domain.models.formatToUIRepresentation import com.tangem.feature.swap.domain.models.ui.FoundTokensState @@ -24,14 +25,14 @@ import com.tangem.feature.swap.models.UiActions /** * State builder creates a specific states for SwapScreen */ -class StateBuilder(val actions: UiActions) { +internal class StateBuilder(val actions: UiActions) { private val tokensDataConverter = TokensDataConverter(actions.onSearchEntered, actions.onTokenSelected) - fun createInitialLoadingState(initialCurrency: Currency, blockchainId: String): SwapStateHolder { + fun createInitialLoadingState(initialCurrency: Currency, networkInfo: NetworkInfo): SwapStateHolder { return SwapStateHolder( networkId = initialCurrency.networkId, - blockchainId = blockchainId, + blockchainId = networkInfo.blockchainId, sendCardData = SwapCardData( type = TransactionCardType.SendCard(actions.onAmountChanged), amount = null, @@ -55,7 +56,7 @@ class StateBuilder(val actions: UiActions) { coinId = null, ), fee = FeeState.Loading, - networkCurrency = initialCurrency.symbol, + networkCurrency = networkInfo.blockchainCurrency, swapButton = SwapButton(enabled = false, loading = true, onClick = {}), onRefresh = {}, onBackClicked = actions.onBackClicked, @@ -316,15 +317,15 @@ class StateBuilder(val actions: UiActions) { return "$firstAddressPart...$secondAddressPart" } - private companion object { - const val ADDRESS_MIN_LENGTH = 11 - const val ADDRESS_FIRST_PART_LENGTH = 7 - const val ADDRESS_SECOND_PART_LENGTH = 4 - } - fun createSilentLoadState(uiState: SwapStateHolder): SwapStateHolder { return uiState.copy( updateInProgress = true, ) } + + private companion object { + const val ADDRESS_MIN_LENGTH = 11 + const val ADDRESS_FIRST_PART_LENGTH = 7 + const val ADDRESS_SECOND_PART_LENGTH = 4 + } } \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index e1f754edc4..0b631ab000 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -35,6 +35,7 @@ import kotlinx.serialization.json.Json import javax.inject.Inject import kotlin.properties.Delegates +@Suppress("LargeClass") @HiltViewModel internal class SwapViewModel @Inject constructor( private val swapInteractor: SwapInteractor, @@ -59,7 +60,7 @@ internal class SwapViewModel @Inject constructor( var uiState: SwapStateHolder by mutableStateOf( stateBuilder.createInitialLoadingState( initialCurrency = currency, - blockchainId = blockchainInteractor.getBlockchainId(currency.networkId), + networkInfo = blockchainInteractor.getBlockchainInfo(currency.networkId), ), ) private set diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt index 98b1478b2b..0e28767c68 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/TransactionManager.kt @@ -2,6 +2,7 @@ package com.tangem.lib.crypto import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.ProxyAmount +import com.tangem.lib.crypto.models.ProxyNetworkInfo import com.tangem.lib.crypto.models.transactions.SendTxResult import java.math.BigDecimal @@ -51,5 +52,5 @@ interface TransactionManager { * workaround till not use backend only and not integrated server vs sdk */ @Throws(IllegalStateException::class) - fun getBlockchainId(networkId: String): String + fun getBlockchainInfo(networkId: String): ProxyNetworkInfo } \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/models/ProxyNetworkInfo.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/models/ProxyNetworkInfo.kt new file mode 100644 index 0000000000..c836504a95 --- /dev/null +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/models/ProxyNetworkInfo.kt @@ -0,0 +1,7 @@ +package com.tangem.lib.crypto.models + +data class ProxyNetworkInfo( + val name: String, + val blockchainId: String, + val blockchainCurrency: String, +) \ No newline at end of file