Updated on 2026-08-14

This commit is contained in:
Tangem 2023-11-17 17:19:49 +02:00
parent 6b92fc6179
commit b5961302a9
6 changed files with 75 additions and 14 deletions

View file

@ -46,6 +46,7 @@ internal class SwapRepositoryImpl @Inject constructor(
private val swapConverter = SwapConverter()
private val leastTokenInfoConverter = LeastTokenInfoConverter()
private val swapPairInfoConverter = SwapPairInfoConverter()
private val rateTypeConverter = RateTypeConverter()
override suspend fun getPairs(
initialCurrency: LeastTokenInfo,
@ -257,6 +258,31 @@ internal class SwapRepositoryImpl @Inject constructor(
return oneInchApiFactory.getApi(networkId)
}
override suspend fun getExchangeQuote(
fromContractAddress: String,
fromNetwork: String,
toContractAddress: String,
toNetwork: String,
fromAmount: BigDecimal,
providerId: Int,
rateType: RateType
): ExchangeQuote {
val response = tangemExpressApi.getExchangeQuote(
fromContractAddress,
fromNetwork,
toContractAddress,
toNetwork,
fromAmount,
providerId,
rateTypeConverter.convertBack(rateType)
).getOrThrow()
return ExchangeQuote(
toAmount = response.toAmount,
allowanceContract = response.allowanceContract
)
}
companion object {
// TODO("get this ids from blockchain enum later")
private const val OPTIMISM_ID = "optimistic-ethereum"

View file

@ -0,0 +1,22 @@
package com.tangem.feature.swap.converters
import com.tangem.datasource.api.express.models.response.RateType
import com.tangem.utils.converter.TwoWayConverter
import com.tangem.feature.swap.domain.models.domain.RateType as RateTypeDomain
class RateTypeConverter : TwoWayConverter<RateType, RateTypeDomain> {
override fun convert(value: RateType): RateTypeDomain {
return when (value) {
RateType.FIXED -> RateTypeDomain.FIXED
RateType.FLOAT -> RateTypeDomain.FLOAT
}
}
override fun convertBack(value: RateTypeDomain): RateType {
return when (value) {
RateTypeDomain.FIXED -> RateType.FIXED
RateTypeDomain.FLOAT -> RateType.FLOAT
}
}
}

View file

@ -1,16 +1,16 @@
package com.tangem.feature.swap.converters
import com.tangem.datasource.api.express.models.response.RateType
import com.tangem.datasource.api.express.models.response.SwapPair
import com.tangem.datasource.api.express.models.response.SwapPairProvider
import com.tangem.feature.swap.domain.models.domain.LeastTokenInfo
import com.tangem.feature.swap.domain.models.domain.SwapPairLeast as SwapPairDomain
import com.tangem.feature.swap.domain.models.domain.SwapProvider as SwapPairProviderDomain
import com.tangem.feature.swap.domain.models.domain.RateType as RateTypeDomain
import com.tangem.utils.converter.Converter
class SwapPairInfoConverter : Converter<SwapPair, SwapPairDomain> {
private val rateTypeConverter = RateTypeConverter()
override fun convert(value: SwapPair): SwapPairDomain {
return SwapPairDomain(
from = LeastTokenInfo(
@ -30,14 +30,8 @@ class SwapPairInfoConverter : Converter<SwapPair, SwapPairDomain> {
private fun convertProvider(swapPairProvider: SwapPairProvider): SwapPairProviderDomain {
return SwapPairProviderDomain(
providerId = swapPairProvider.providerId,
rateTypes = swapPairProvider.rateTypes.map { convertRateType(it) },
rateTypes = swapPairProvider.rateTypes.map { rateTypeConverter.convert(it) },
)
}
private fun convertRateType(rateType: RateType): RateTypeDomain {
return when (rateType) {
RateType.FIXED -> RateTypeDomain.FIXED
RateType.FLOAT -> RateTypeDomain.FLOAT
}
}
}

View file

@ -61,4 +61,14 @@ interface SwapRepository {
currency: CryptoCurrency,
amount: BigDecimal?,
): String
suspend fun getExchangeQuote(
fromContractAddress: String,
fromNetwork: String,
toContractAddress: String,
toNetwork: String,
fromAmount: BigDecimal,
providerId: Int,
rateType: RateType,
) : ExchangeQuote
}

View file

@ -0,0 +1,8 @@
package com.tangem.feature.swap.domain.models.domain
import java.math.BigDecimal
data class ExchangeQuote(
val toAmount: BigDecimal,
val allowanceContract: String?
)

View file

@ -143,13 +143,14 @@ internal class SwapViewModel @Inject constructor(
fromCryptoCurrency = state.initialCryptoCurrency,
toCryptoCurrency = state.toGroup.available.first().currencyStatus.currency
)
cryptoCurrency = state.initialCryptoCurrency
// updateTokensState(dataState = state.foundTokensState)
// startLoadingQuotes(
// fromToken = state.preselectTokens.fromToken,
// toToken = state.preselectTokens.toToken,
// amount = lastAmount.value,
// )
startLoadingQuotes(
fromToken = state.initialCryptoCurrency,
toToken = state.toGroup.available.first().currencyStatus.currency,
amount = lastAmount.value,
)
}.onFailure {
Timber.tag(loggingTag).e(it)
}