Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-24 13:12:23 +03:00
parent 016b1e18d2
commit 1f233c091b
5 changed files with 33 additions and 7 deletions

View file

@ -32,6 +32,9 @@ data class ExchangeProvider(
@Json(name = "slippage") @Json(name = "slippage")
val slippage: BigDecimal?, val slippage: BigDecimal?,
@Json(name = "exchangeOnlyWithinSingleAddress")
val isExchangeOnlyWithinSingleAddress: Boolean = false,
) )
@JsonClass(generateAdapter = false) @JsonClass(generateAdapter = false)

View file

@ -19,6 +19,7 @@ internal class ExpressProviderConverter : Converter<ExchangeProvider, ExpressPro
privacyPolicy = value.privacyPolicy, privacyPolicy = value.privacyPolicy,
isRecommended = value.isRecommended, isRecommended = value.isRecommended,
slippage = value.slippage, slippage = value.slippage,
isExchangeOnlyWithinSingleAddress = value.isExchangeOnlyWithinSingleAddress,
) )
} }

View file

@ -75,11 +75,11 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
swapTxType = swapTxType, swapTxType = swapTxType,
) )
val providers = expressRepository.getProviders( val expressProviders = expressRepository.getFilteredProviders(
userWallet = userWallet, userWallet = userWallet,
filterProviderTypes = filterProviderTypes, filterProviderTypes = filterProviderTypes,
) swapTxType = swapTxType,
val expressProviders = providers.associateBy(ExpressProvider::providerId) ).associateBy(ExpressProvider::providerId)
allPairs.map { pair -> allPairs.map { pair ->
async { async {
@ -125,11 +125,11 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
swapTxType = swapTxType, swapTxType = swapTxType,
) )
val providers = expressRepository.getProviders( val mappedProviders = expressRepository.getFilteredProviders(
userWallet = userWallet, userWallet = userWallet,
filterProviderTypes = filterProviderTypes, filterProviderTypes = filterProviderTypes,
) swapTxType = swapTxType,
val mappedProviders = providers.associateBy(ExpressProvider::providerId) ).associateBy(ExpressProvider::providerId)
allPairs.map { pair -> allPairs.map { pair ->
async { async {
@ -435,3 +435,19 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
} }
} }
} }
private suspend fun ExpressRepository.getFilteredProviders(
userWallet: UserWallet,
filterProviderTypes: List<ExpressProviderType>,
swapTxType: SwapTxType,
): List<ExpressProvider> {
return getProviders(
userWallet = userWallet,
filterProviderTypes = filterProviderTypes,
).let { allProviders ->
when (swapTxType) {
SwapTxType.SendWithSwap -> allProviders.filterNot { it.isExchangeOnlyWithinSingleAddress }
SwapTxType.Swap -> allProviders
}
}
}

View file

@ -16,6 +16,7 @@ import java.math.BigDecimal
* @property privacyPolicy privacy policy link * @property privacyPolicy privacy policy link
* @property isRecommended flag that indicates if this provider is recommended * @property isRecommended flag that indicates if this provider is recommended
* @property slippage provider slippage * @property slippage provider slippage
* @property isExchangeOnlyWithinSingleAddress flag that indicates if exchange is only allowed within a single address
* *
* Uses to store transaction data in datastore, when extends - should always add default value * Uses to store transaction data in datastore, when extends - should always add default value
* to support backward compatibility * to support backward compatibility
@ -40,4 +41,6 @@ data class ExpressProvider(
val isRecommended: Boolean = false, val isRecommended: Boolean = false,
@Json(name = "slippage") @Json(name = "slippage")
val slippage: BigDecimal?, val slippage: BigDecimal?,
@Json(name = "exchangeOnlyWithinSingleAddress")
val isExchangeOnlyWithinSingleAddress: Boolean = false,
) )

View file

@ -14,7 +14,10 @@ internal object SwapUtils {
const val INCREASE_GAS_LIMIT_FOR_CEX = 105 // 5% const val INCREASE_GAS_LIMIT_FOR_CEX = 105 // 5%
/** List of supported provider types in Send with Swap */ /** List of supported provider types in Send with Swap */
internal val SEND_WITH_SWAP_PROVIDER_TYPES = listOf(ExpressProviderType.CEX) internal val SEND_WITH_SWAP_PROVIDER_TYPES = listOf(
ExpressProviderType.CEX,
ExpressProviderType.DEX,
)
fun getExpressErrorMessage(expressError: ExpressError): TextReference { fun getExpressErrorMessage(expressError: ExpressError): TextReference {
return when (expressError) { return when (expressError) {