Updated on 2026-08-14

This commit is contained in:
Tangem 2023-12-26 19:11:56 +03:00
parent 318d3edfa1
commit 0f3bca4b5b
6 changed files with 56 additions and 0 deletions

View file

@ -23,6 +23,7 @@ import com.tangem.datasource.crypto.DataSignatureVerifier
import com.tangem.domain.common.extensions.fromNetworkId
import com.tangem.domain.common.util.derivationStyleProvider
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.models.UserWalletId
@ -310,6 +311,10 @@ internal class DefaultSwapRepository @Inject constructor(
}
}
override suspend fun getExistentialDeposit(userWalletId: UserWalletId, network: Network): BigDecimal? {
return walletManagersFacade.getExistentialDeposit(userWalletId, network)
}
private fun parseTxDetails(txDetailsJson: String): TxDetails? {
return try {
txDetailsMoshiAdapter.fromJson(txDetailsJson)

View file

@ -2,6 +2,7 @@ package com.tangem.feature.swap.domain.api
import arrow.core.Either
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.swap.domain.models.DataError
import com.tangem.feature.swap.domain.models.domain.*
@ -70,4 +71,6 @@ interface SwapRepository {
): Either<DataError, SwapDataModel>
fun getNativeTokenForNetwork(networkId: String): CryptoCurrency
suspend fun getExistentialDeposit(userWalletId: UserWalletId, network: Network): BigDecimal?
}

View file

@ -0,0 +1,8 @@
package com.tangem.feature.swap.domain.models.domain
import java.math.BigDecimal
sealed class Warning {
data class ExistentialDepositWarning(val existentialDeposit: BigDecimal) : Warning()
}

View file

@ -6,6 +6,7 @@ import com.tangem.feature.swap.domain.models.SwapAmount
import com.tangem.feature.swap.domain.models.domain.IncludeFeeInAmount
import com.tangem.feature.swap.domain.models.domain.PreparedSwapConfigState
import com.tangem.feature.swap.domain.models.domain.SwapDataModel
import com.tangem.feature.swap.domain.models.domain.Warning
import java.math.BigDecimal
sealed interface SwapState {
@ -25,6 +26,7 @@ sealed interface SwapState {
val permissionState: PermissionDataState = PermissionDataState.Empty,
val swapDataModel: SwapDataModel? = null,
val txFee: TxFeeState,
val warnings: List<Warning> = emptyList(),
) : SwapState
data class EmptyAmountState(

View file

@ -353,6 +353,16 @@ internal class SwapInteractorImpl @Inject constructor(
)
}
private suspend fun manageWarnings(fromToken: CryptoCurrency): List<Warning> {
val userWalletId = getSelectedWallet()?.walletId ?: return emptyList()
val existentialDeposit = repository.getExistentialDeposit(userWalletId, fromToken.network)
val warnings = mutableListOf<Warning>()
if (existentialDeposit != null) {
warnings.add(Warning.ExistentialDepositWarning(existentialDeposit))
}
return warnings
}
override suspend fun onSwap(
swapProvider: SwapProvider,
swapData: SwapDataModel?,
@ -782,6 +792,8 @@ internal class SwapInteractorImpl @Inject constructor(
swapData = null,
txFeeState = txFee,
exchangeProviderType = exchangeProviderType,
).copy(
warnings = manageWarnings(fromToken.currency),
)
when (exchangeProviderType) {
@ -939,6 +951,7 @@ internal class SwapInteractorImpl @Inject constructor(
)
swapState.copy(
permissionState = PermissionDataState.Empty,
warnings = manageWarnings(fromToken.currency),
preparedSwapConfigState = PreparedSwapConfigState(
isAllowedToSpend = true,
isBalanceEnough = isBalanceIncludeFeeEnough,

View file

@ -304,6 +304,7 @@ internal class StateBuilder(
fromToken: CryptoCurrency,
): List<SwapWarning> {
val warnings = mutableListOf<SwapWarning>()
addDomainWarnings(quoteModel, warnings)
if (!quoteModel.preparedSwapConfigState.isAllowedToSpend &&
quoteModel.preparedSwapConfigState.isFeeEnough &&
quoteModel.permissionState is PermissionDataState.PermissionReadyForRequest
@ -363,6 +364,30 @@ internal class StateBuilder(
return warnings
}
private fun addDomainWarnings(quoteModel: SwapState.QuotesLoadedState, warnings: MutableList<SwapWarning>) {
quoteModel.warnings.forEach {
when (it) {
is Warning.ExistentialDepositWarning -> {
warnings.add(
SwapWarning.GeneralWarning(
NotificationConfig(
title = resourceReference(R.string.warning_existential_deposit_title),
subtitle = resourceReference(
R.string.warning_existential_deposit_message,
wrappedList(
quoteModel.fromTokenInfo.cryptoCurrencyStatus.currency.name,
it.existentialDeposit.toPlainString(),
),
),
iconResId = R.drawable.img_attention_20,
),
),
)
}
}
}
}
private fun addUnableCoverFeeWarning(
quoteModel: SwapState.QuotesLoadedState,
fromToken: CryptoCurrency,