Updated on 2026-08-14

This commit is contained in:
Tangem 2022-11-29 22:29:19 +03:00
parent 0bbfef1bc7
commit e47b11f29e
8 changed files with 173 additions and 24 deletions

View file

@ -0,0 +1,45 @@
package com.tangem.feature.swap
import com.tangem.datasource.api.oneinch.OneInchApi
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.feature.swap.converters.QuotesConverter
import com.tangem.feature.swap.converters.TokensConverter
import com.tangem.feature.swap.domain.SwapRepository
import com.tangem.feature.swap.domain.models.Currency
import com.tangem.feature.swap.domain.models.QuoteModel
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext
import javax.inject.Inject
class SwapRepositoryImpl @Inject constructor(
private val tangemTechApi: TangemTechApi,
private val oneInchApi: OneInchApi,
private val tokensConverter: TokensConverter,
private val quotesConverter: QuotesConverter,
private val coroutineDispatcher: CoroutineDispatcherProvider,
) : SwapRepository {
override suspend fun getExchangeableTokens(networkId: String): List<Currency> {
return withContext(coroutineDispatcher.io) {
tokensConverter.convertList(tangemTechApi.coins(exchangeable = true, networkIds = networkId).coins)
}
}
override suspend fun findBestQuote(fromTokenAddress: String, toTokenAddress: String, amount: String): QuoteModel {
return withContext(coroutineDispatcher.io) {
quotesConverter.convert(
oneInchApi.quote(
fromTokenAddress = fromTokenAddress,
toTokenAddress = toTokenAddress,
amount = amount,
),
)
}
}
override suspend fun addressForTrust(): String {
return withContext(coroutineDispatcher.io) {
oneInchApi.approveSpender().address
}
}
}

View file

@ -0,0 +1,16 @@
package com.tangem.feature.swap.converters
import com.tangem.datasource.api.oneinch.models.QuoteResponse
import com.tangem.feature.swap.domain.models.QuoteModel
import com.tangem.utils.converter.Converter
class QuotesConverter : Converter<QuoteResponse, QuoteModel> {
override fun convert(value: QuoteResponse): QuoteModel {
return QuoteModel(
fromTokenAmount = value.fromTokenAmount,
toTokenAmount = value.toTokenAmount,
estimatedGas = value.estimatedGas,
)
}
}

View file

@ -0,0 +1,32 @@
package com.tangem.feature.swap.converters
import com.tangem.datasource.api.tangemTech.CoinsResponse
import com.tangem.feature.swap.domain.models.Currency
import com.tangem.utils.converter.Converter
import javax.inject.Inject
class TokensConverter @Inject constructor() : Converter<CoinsResponse.Coin, Currency> {
override fun convert(value: CoinsResponse.Coin): Currency {
val network = value.networks.first()
return if (network.contractAddress != null && network.decimalCount != null) {
Currency.NonNativeToken(
id = value.id,
name = value.name,
symbol = value.symbol,
networkId = network.networkId,
contractAddress = network.contractAddress!!,
decimalCount = network.decimalCount!!.intValueExact(),
logoUrl = "",//todo add logo
)
} else {
Currency.NativeToken(
id = value.id,
name = value.name,
symbol = value.symbol,
networkId = network.networkId,
logoUrl = "", //todo add logo
)
}
}
}