From d574159e14d0e5a9f8045f6b006eb3c83e4dcb45 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Nov 2023 14:28:16 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/feature/swap/SwapRepositoryImpl.kt | 26 +++++++++++++++++++ .../swap/converters/RateTypeConverter.kt | 22 ++++++++++++++++ .../swap/converters/SwapPairInfoConverter.kt | 14 +++------- .../domain/DefaultBlockchainInteractor.kt | 2 +- .../feature/swap/domain/SwapInteractorImpl.kt | 12 +++++---- .../feature/swap/domain/SwapRepository.kt | 10 +++++++ .../domain/models/domain/ExchangeQuote.kt | 8 ++++++ .../domain/models/domain/SwapPairLeast.kt | 20 +++++--------- .../models/ui/TokensDataStateExpress.kt | 6 ++--- .../feature/swap/viewmodels/SwapViewModel.kt | 17 +++++++----- 10 files changed, 97 insertions(+), 40 deletions(-) create mode 100644 features/swap/data/src/main/java/com/tangem/feature/swap/converters/RateTypeConverter.kt create mode 100644 features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ExchangeQuote.kt diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index ce4a54b96e..9eb5bedf15 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -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" diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/RateTypeConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/RateTypeConverter.kt new file mode 100644 index 0000000000..0d25c4eca2 --- /dev/null +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/RateTypeConverter.kt @@ -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 { + + 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 + } + } +} \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt index 627a7a8fb4..e1e48fc630 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt @@ -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.SwapPairProvider as SwapPairProviderDomain -import com.tangem.feature.swap.domain.models.domain.RateType as RateTypeDomain +import com.tangem.feature.swap.domain.models.domain.SwapProvider as SwapPairProviderDomain import com.tangem.utils.converter.Converter class SwapPairInfoConverter : Converter { + private val rateTypeConverter = RateTypeConverter() + override fun convert(value: SwapPair): SwapPairDomain { return SwapPairDomain( from = LeastTokenInfo( @@ -30,14 +30,8 @@ class SwapPairInfoConverter : Converter { 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 - } - } } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/DefaultBlockchainInteractor.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/DefaultBlockchainInteractor.kt index 0b9605485b..cb99b58076 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/DefaultBlockchainInteractor.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/DefaultBlockchainInteractor.kt @@ -27,7 +27,7 @@ internal class DefaultBlockchainInteractor @Inject constructor( return if (token is CryptoCurrency.Token) { token.decimals } else { - transactionManager.getNativeTokenDecimals(token.network.id.value) + transactionManager.getNativeTokenDecimals(token.network.backendId) } } } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 3e63caec40..738424d73c 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -107,15 +107,17 @@ internal class SwapInteractorImpl @Inject constructor( tokenInfoForFilter(it).network == currency.network.backendId } - val availableCryptoCurrencies = filteredPairs.mapNotNull { - findCryptoCurrencyStatusByLeastInfo(tokenInfoForAvailable(it), cryptoCurrenciesList) + val availableCryptoCurrencies = filteredPairs.mapNotNull { pair -> + val status = findCryptoCurrencyStatusByLeastInfo(tokenInfoForAvailable(pair), cryptoCurrenciesList) + status?.let { CryptoCurrencySwapInfo(it, pair.providers) } } - val unavailableCryptoCurrencies = cryptoCurrenciesList - availableCryptoCurrencies.toSet() + val unavailableCryptoCurrencies = + (cryptoCurrenciesList - availableCryptoCurrencies.map { it.currencyStatus }.toSet()) return CurrenciesGroup( available = availableCryptoCurrencies, - unavailable = unavailableCryptoCurrencies, + unavailable = unavailableCryptoCurrencies.map { CryptoCurrencySwapInfo(it, emptyList()) } ) } @@ -415,7 +417,7 @@ internal class SwapInteractorImpl @Inject constructor( return if (token is CryptoCurrency.Token) { token.decimals } else { - transactionManager.getNativeTokenDecimals(token.network.id.value) + transactionManager.getNativeTokenDecimals(token.network.backendId) } } diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt index ab0e4095c8..8942e75161 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt @@ -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 } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ExchangeQuote.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ExchangeQuote.kt new file mode 100644 index 0000000000..d087b97955 --- /dev/null +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/ExchangeQuote.kt @@ -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? +) \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapPairLeast.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapPairLeast.kt index 704a27dc1b..a41f3d283d 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapPairLeast.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapPairLeast.kt @@ -1,6 +1,6 @@ package com.tangem.feature.swap.domain.models.domain -import com.tangem.domain.tokens.model.CryptoCurrency +import com.tangem.domain.tokens.model.CryptoCurrencyStatus /** * Domain layer representation of SwapPair data network model. @@ -12,20 +12,12 @@ import com.tangem.domain.tokens.model.CryptoCurrency data class SwapPairLeast( val from: LeastTokenInfo, val to: LeastTokenInfo, - val providers: List, + val providers: List, ) -/** - * Enriched model of swap pair data. Contains full CryptoCurrency models instead of least info. - * - * @property from CryptoCurrency we want to change - * @property to CryptoCurrency we want to exchange for - * @property providers Exchange providers - */ -data class SwapPair( - val from: CryptoCurrency, - val to: CryptoCurrency, - val providers: List, +data class CryptoCurrencySwapInfo( + val currencyStatus: CryptoCurrencyStatus, + val providers: List ) /** @@ -34,7 +26,7 @@ data class SwapPair( * @property providerId provider id * @property rateTypes supported rate types */ -data class SwapPairProvider( +data class SwapProvider( val providerId: Int, val rateTypes: List, ) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt index 2401c08574..752e9184a7 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt @@ -1,7 +1,7 @@ package com.tangem.feature.swap.domain.models.ui import com.tangem.domain.tokens.model.CryptoCurrency -import com.tangem.domain.tokens.model.CryptoCurrencyStatus +import com.tangem.feature.swap.domain.models.domain.CryptoCurrencySwapInfo data class TokensDataStateExpress( val fromGroup: CurrenciesGroup, @@ -9,8 +9,8 @@ data class TokensDataStateExpress( ) data class CurrenciesGroup( - val available: List, - val unavailable: List, + val available: List, + val unavailable: List, ) data class FoundTokensStateExpress( diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 177f462107..99919c05a3 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -132,14 +132,17 @@ internal class SwapViewModel @Inject constructor( runCatching(dispatchers.io) { swapInteractor.getTokensDataState(initialCryptoCurrency) }.onSuccess { state -> - // dataState = dataState.copy( - // ) + dataState = dataState.copy( + fromCryptoCurrency = initialCryptoCurrency, + toCryptoCurrency = state.toGroup.available.first().currencyStatus.currency + ) + // updateTokensState(dataState = state.foundTokensState) - // startLoadingQuotes( - // fromToken = state.preselectTokens.fromToken, - // toToken = state.preselectTokens.toToken, - // amount = lastAmount.value, - // ) + startLoadingQuotes( + fromToken = initialCryptoCurrency, + toToken = state.toGroup.available.first().currencyStatus.currency, + amount = lastAmount.value, + ) }.onFailure { Timber.tag(loggingTag).e(it) }