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")
val slippage: BigDecimal?,
@Json(name = "exchangeOnlyWithinSingleAddress")
val isExchangeOnlyWithinSingleAddress: Boolean = false,
)
@JsonClass(generateAdapter = false)

View file

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

View file

@ -75,11 +75,11 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
swapTxType = swapTxType,
)
val providers = expressRepository.getProviders(
val expressProviders = expressRepository.getFilteredProviders(
userWallet = userWallet,
filterProviderTypes = filterProviderTypes,
)
val expressProviders = providers.associateBy(ExpressProvider::providerId)
swapTxType = swapTxType,
).associateBy(ExpressProvider::providerId)
allPairs.map { pair ->
async {
@ -125,11 +125,11 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
swapTxType = swapTxType,
)
val providers = expressRepository.getProviders(
val mappedProviders = expressRepository.getFilteredProviders(
userWallet = userWallet,
filterProviderTypes = filterProviderTypes,
)
val mappedProviders = providers.associateBy(ExpressProvider::providerId)
swapTxType = swapTxType,
).associateBy(ExpressProvider::providerId)
allPairs.map { pair ->
async {
@ -434,4 +434,20 @@ internal class DefaultSwapRepositoryV2 @Inject constructor(
true
}
}
}
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 isRecommended flag that indicates if this provider is recommended
* @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
* to support backward compatibility
@ -40,4 +41,6 @@ data class ExpressProvider(
val isRecommended: Boolean = false,
@Json(name = "slippage")
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%
/** 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 {
return when (expressError) {