From cfdcf4da4162db308ffc865ee7864cfff20c6f65 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 14 Nov 2023 14:22:43 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../api/express/models/response/SwapPair.kt | 4 +- .../DefaultMarketCryptoCurrencyRepository.kt | 9 +-- .../data/tokens/utils/NetworkOperations.kt | 2 + .../com/tangem/domain/tokens/model/Network.kt | 2 + .../tangem/feature/swap/SwapRepositoryImpl.kt | 60 ++++++++++++++++-- .../converters/LeastTokenInfoConverter.kt | 17 ++++++ .../swap/converters/SwapPairInfoConverter.kt | 43 +++++++++++++ .../tangem/feature/swap/di/SwapDataModule.kt | 3 + .../feature/swap/domain/SwapInteractor.kt | 9 ++- .../feature/swap/domain/SwapInteractorImpl.kt | 61 +++++++++++++++++++ .../feature/swap/domain/SwapRepository.kt | 6 +- .../swap/domain/di/SwapDomainModule.kt | 10 +++ .../domain/models/domain/LeastTokenInfo.kt | 6 ++ .../domain/models/domain/SwapPairLeast.kt | 50 +++++++++++++++ .../swap/viewmodels/SwapProcessDataState.kt | 7 +++ .../feature/swap/viewmodels/SwapViewModel.kt | 9 +++ 16 files changed, 278 insertions(+), 20 deletions(-) create mode 100644 features/swap/data/src/main/java/com/tangem/feature/swap/converters/LeastTokenInfoConverter.kt create mode 100644 features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt create mode 100644 features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/LeastTokenInfo.kt create mode 100644 features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapPairLeast.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/SwapPair.kt b/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/SwapPair.kt index ba04207f85..2d8b0b7cf3 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/SwapPair.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/SwapPair.kt @@ -19,8 +19,8 @@ data class SwapPairProvider( @Json(name = "providerId") val providerId: Int, - @Json(name = "rateType") - val rateType: RateType, + @Json(name = "rateTypes") + val rateTypes: List, ) enum class RateType { diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt index b2bc8bf0a2..9e8d9a059d 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt @@ -1,9 +1,7 @@ package com.tangem.data.tokens.repository -import com.tangem.blockchain.common.Blockchain import com.tangem.datasource.api.express.models.TangemExpressValues.EMPTY_CONTRACT_ADDRESS_VALUE import com.tangem.datasource.local.token.AssetsStore -import com.tangem.domain.common.extensions.toNetworkId import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.repository.MarketCryptoCurrencyRepository import com.tangem.domain.wallets.models.UserWalletId @@ -13,14 +11,11 @@ class DefaultMarketCryptoCurrencyRepository( ) : MarketCryptoCurrencyRepository { override suspend fun isExchangeable(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): Boolean { - val cryptoCurrencyId = cryptoCurrency.id - val blockchain = Blockchain.fromId(cryptoCurrencyId.rawNetworkId) - val apiNetworkId = blockchain.toNetworkId() val contractAddress = (cryptoCurrency as? CryptoCurrency.Token)?.contractAddress ?: EMPTY_CONTRACT_ADDRESS_VALUE return assetsStore.getSyncOrNull(userWalletId)?.find { - it.network == apiNetworkId && - it.token == cryptoCurrencyId.rawCurrencyId && + it.network == cryptoCurrency.network.backendId && + it.token == cryptoCurrency.id.rawCurrencyId && it.contractAddress == contractAddress && it.isActive }?.exchangeAvailable ?: false diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt index 5e87555133..f5a1bf13df 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt @@ -2,6 +2,7 @@ package com.tangem.data.tokens.utils import com.tangem.blockchain.common.Blockchain import com.tangem.domain.common.DerivationStyleProvider +import com.tangem.domain.common.extensions.toNetworkId import com.tangem.domain.tokens.model.Network import timber.log.Timber @@ -21,6 +22,7 @@ internal fun getNetwork( return Network( id = Network.ID(blockchain.id), + backendId = blockchain.toNetworkId(), name = blockchain.fullName, isTestnet = blockchain.isTestnet(), derivationPath = getNetworkDerivationPath(blockchain, extraDerivationPath, derivationStyleProvider), diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt index 2bc545ba77..c57d5beee8 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/Network.kt @@ -11,6 +11,7 @@ import kotlinx.parcelize.Parcelize * (e.g., ERC20, BEP20). * * @property id The unique identifier of the network. + * @property backendId The name of this network in the Tangem backend. * @property name The human-readable name of the network, such as "Ethereum" or "Bitcoin". * @property derivationPath The path used to derive keys for this network. * @property isTestnet Indicates whether the network is a test network or a main network. @@ -19,6 +20,7 @@ import kotlinx.parcelize.Parcelize @Parcelize data class Network( val id: ID, + val backendId: String, val name: String, val derivationPath: DerivationPath, val isTestnet: Boolean, 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 e5394f3013..e5f16ea2ac 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 @@ -6,6 +6,9 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.blockchain.extensions.Result import com.tangem.data.tokens.utils.CryptoCurrencyFactory +import com.tangem.datasource.api.common.response.getOrThrow +import com.tangem.datasource.api.express.TangemExpressApi +import com.tangem.datasource.api.express.models.request.PairsRequestBody import com.tangem.datasource.api.oneinch.OneInchApi import com.tangem.datasource.api.oneinch.OneInchApiFactory import com.tangem.datasource.api.oneinch.OneInchErrorsHandler @@ -19,23 +22,23 @@ import com.tangem.domain.tokens.model.Network import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.feature.swap.converters.QuotesConverter -import com.tangem.feature.swap.converters.SwapConverter -import com.tangem.feature.swap.converters.TokensConverter +import com.tangem.feature.swap.converters.* import com.tangem.feature.swap.domain.SwapRepository import com.tangem.feature.swap.domain.models.data.AggregatedSwapDataModel -import com.tangem.feature.swap.domain.models.domain.Currency -import com.tangem.feature.swap.domain.models.domain.QuoteModel -import com.tangem.feature.swap.domain.models.domain.SwapDataModel +import com.tangem.feature.swap.domain.models.domain.* import com.tangem.feature.swap.domain.models.mapErrors import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.async import kotlinx.coroutines.withContext import java.math.BigDecimal import javax.inject.Inject import com.tangem.blockchain.common.Token as SdkToken +import com.tangem.datasource.api.express.models.request.LeastTokenInfo as NetworkLeastTokenInfo +@Suppress("LongParameterList") internal class SwapRepositoryImpl @Inject constructor( private val tangemTechApi: TangemTechApi, + private val tangemExpressApi: TangemExpressApi, private val oneInchApiFactory: OneInchApiFactory, private val oneInchErrorsHandler: OneInchErrorsHandler, private val coroutineDispatcher: CoroutineDispatcherProvider, @@ -46,6 +49,51 @@ internal class SwapRepositoryImpl @Inject constructor( private val tokensConverter = TokensConverter() private val quotesConverter = QuotesConverter() private val swapConverter = SwapConverter() + private val leastTokenInfoConverter = LeastTokenInfoConverter() + private val swapPairInfoConverter = SwapPairInfoConverter() + + override suspend fun getPairs( + initialCurrency: LeastTokenInfo, + currencyList: List, + ): List { + return withContext(coroutineDispatcher.io) { + val initial = NetworkLeastTokenInfo( + contractAddress = initialCurrency.contractAddress, + network = initialCurrency.network, + ) + val currenciesList = currencyList.map { leastTokenInfoConverter.convert(it) } + + val pairs = async { + getPairsInternal( + from = arrayListOf(initial), + to = currenciesList, + ) + } + + val reversedPairs = async { + getPairsInternal( + from = currenciesList, + to = arrayListOf(initial), + ) + } + + pairs.await() + reversedPairs.await() + } + } + + private suspend fun getPairsInternal( + from: List, + to: List, + ): List { + return tangemExpressApi.getPairs( + PairsRequestBody( + from = from, + to = to, + ), + ) + .getOrThrow() + .map { swapPairInfoConverter.convert(it) } + } override suspend fun getRates(currencyId: String, tokenIds: List): Map { // workaround cause backend do not return arbitrum and optimism rates diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/LeastTokenInfoConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/LeastTokenInfoConverter.kt new file mode 100644 index 0000000000..4ee7532cc7 --- /dev/null +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/LeastTokenInfoConverter.kt @@ -0,0 +1,17 @@ +package com.tangem.feature.swap.converters + +import com.tangem.blockchain.common.Blockchain +import com.tangem.datasource.api.express.models.request.LeastTokenInfo +import com.tangem.domain.common.extensions.toNetworkId +import com.tangem.domain.tokens.model.CryptoCurrency +import com.tangem.utils.converter.Converter + +class LeastTokenInfoConverter : Converter { + + override fun convert(value: CryptoCurrency): LeastTokenInfo { + return LeastTokenInfo( + contractAddress = (value as? CryptoCurrency.Token)?.contractAddress ?: "0", + network = Blockchain.fromId(value.id.rawNetworkId).toNetworkId(), + ) + } +} \ 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 new file mode 100644 index 0000000000..627a7a8fb4 --- /dev/null +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt @@ -0,0 +1,43 @@ +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.utils.converter.Converter + +class SwapPairInfoConverter : Converter { + + override fun convert(value: SwapPair): SwapPairDomain { + return SwapPairDomain( + from = LeastTokenInfo( + contractAddress = value.from.contractAddress, + network = value.from.network, + ), + to = LeastTokenInfo( + contractAddress = value.to.contractAddress, + network = value.to.network, + ), + providers = value.providers.map { + convertProvider(it) + }, + ) + } + + private fun convertProvider(swapPairProvider: SwapPairProvider): SwapPairProviderDomain { + return SwapPairProviderDomain( + providerId = swapPairProvider.providerId, + rateTypes = swapPairProvider.rateTypes.map { convertRateType(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/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index 81931ca111..89506db425 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap.di +import com.tangem.datasource.api.express.TangemExpressApi import com.tangem.datasource.api.oneinch.OneInchApiFactory import com.tangem.datasource.api.oneinch.OneInchErrorsHandler import com.tangem.datasource.api.tangemTech.TangemTechApi @@ -22,6 +23,7 @@ class SwapDataModule { @Singleton fun provideSwapRepository( tangemTechApi: TangemTechApi, + tangemExpressApi: TangemExpressApi, oneInchApiFactory: OneInchApiFactory, oneInchErrorsHandler: OneInchErrorsHandler, coroutineDispatcher: CoroutineDispatcherProvider, @@ -30,6 +32,7 @@ class SwapDataModule { ): SwapRepository { return SwapRepositoryImpl( tangemTechApi = tangemTechApi, + tangemExpressApi = tangemExpressApi, oneInchApiFactory = oneInchApiFactory, oneInchErrorsHandler = oneInchErrorsHandler, coroutineDispatcher = coroutineDispatcher, diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt index 3cae5f1d7e..bfa09c1408 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt @@ -1,13 +1,17 @@ package com.tangem.feature.swap.domain +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.feature.swap.domain.models.SwapAmount -import com.tangem.feature.swap.domain.models.domain.Currency -import com.tangem.feature.swap.domain.models.domain.PermissionOptions +import com.tangem.feature.swap.domain.models.domain.* import com.tangem.feature.swap.domain.models.ui.* interface SwapInteractor { + suspend fun getPairs(currency: Currency): List + + suspend fun getPairs(initialCurrency: LeastTokenInfo, currenciesList: List): List + fun initDerivationPathAndNetwork(derivationPath: String?, network: Network?) /** @@ -17,6 +21,7 @@ interface SwapInteractor { * @return [TokensDataState] that contains info about all available to swap tokens for networkId * and preselected tokens which initially select to swap */ + @Deprecated("method is used in the old swap mechanism") suspend fun initTokensToSwap(initialCurrency: Currency): TokensDataState /** 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 50e7999aeb..d3dc616711 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 @@ -1,5 +1,7 @@ package com.tangem.feature.swap.domain +import com.tangem.domain.tokens.GetCryptoCurrenciesUseCase +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository @@ -34,6 +36,7 @@ internal class SwapInteractorImpl @Inject constructor( private val networksRepository: NetworksRepository, private val walletFeatureToggles: WalletFeatureToggles, private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, + private val getCryptoCurrenciesUseCase: GetCryptoCurrenciesUseCase, ) : SwapInteractor { private val swapCurrencyConverter = SwapCurrencyConverter() @@ -41,6 +44,64 @@ internal class SwapInteractorImpl @Inject constructor( private var derivationPath: String? = null private var network: Network? = null + override suspend fun getPairs(currency: Currency): List { + val currencies = getSelectedWalletSyncUseCase().fold( + ifLeft = { emptyList() }, + ifRight = { selectedWallet -> + getCryptoCurrenciesUseCase(selectedWallet.walletId).fold( + ifLeft = { emptyList() }, + ifRight = { it }, + ) + }, + ) + + val pairs = getPairs( + initialCurrency = LeastTokenInfo( + contractAddress = (currency as? Currency.NonNativeToken)?.contractAddress ?: "0", + network = currency.networkId, + ), + currenciesList = currencies, + ) + + return createCryptoCurrencyPairs(pairs, currencies) + } + + private fun createCryptoCurrencyPairs( + swapPairLeasts: List, + cryptoCurrenciesList: List, + ): List { + return swapPairLeasts.mapNotNull { + val from = findCryptoCurrencyByLeastInfo(it.from, cryptoCurrenciesList) + val to = findCryptoCurrencyByLeastInfo(it.to, cryptoCurrenciesList) + if (from != null && to != null) { + SwapPair( + from = from, + to = to, + providers = it.providers, + ) + } else { + null + } + } + } + + private fun findCryptoCurrencyByLeastInfo( + leastTokenInfo: LeastTokenInfo, + cryptoCurrenciesList: List, + ): CryptoCurrency? { + return cryptoCurrenciesList.find { + it.network.backendId == leastTokenInfo.network && + (it as? CryptoCurrency.Token)?.contractAddress ?: "0" == leastTokenInfo.contractAddress + } + } + + override suspend fun getPairs( + initialCurrency: LeastTokenInfo, + currenciesList: List, + ): List { + return repository.getPairs(initialCurrency, currenciesList) + } + override fun initDerivationPathAndNetwork(derivationPath: String?, network: Network?) { this.derivationPath = derivationPath this.network = network 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 b303325c8c..3b64564a3b 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 @@ -5,13 +5,13 @@ import com.tangem.domain.tokens.model.Network import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.swap.domain.models.data.AggregatedSwapDataModel -import com.tangem.feature.swap.domain.models.domain.Currency -import com.tangem.feature.swap.domain.models.domain.QuoteModel -import com.tangem.feature.swap.domain.models.domain.SwapDataModel +import com.tangem.feature.swap.domain.models.domain.* import java.math.BigDecimal interface SwapRepository { + suspend fun getPairs(initialCurrency: LeastTokenInfo, currencyList: List): List + suspend fun getRates(currencyId: String, tokenIds: List): Map suspend fun getExchangeableTokens(networkId: String): List diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt index 7a94dfb303..bba56b76e7 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap.domain.di +import com.tangem.domain.tokens.GetCryptoCurrenciesUseCase import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository import com.tangem.domain.wallets.legacy.WalletsStateHolder @@ -30,6 +31,7 @@ class SwapDomainModule { networksRepository: NetworksRepository, walletFeatureToggles: WalletFeatureToggles, @SwapScope getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, + @SwapScope getCryptoCurrenciesUseCase: GetCryptoCurrenciesUseCase, ): SwapInteractor { return SwapInteractorImpl( transactionManager = transactionManager, @@ -41,6 +43,7 @@ class SwapDomainModule { networksRepository = networksRepository, walletFeatureToggles = walletFeatureToggles, getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase, + getCryptoCurrenciesUseCase = getCryptoCurrenciesUseCase, ) } @@ -58,6 +61,13 @@ class SwapDomainModule { fun providesGetSelectedWalletUseCase(walletsStateHolder: WalletsStateHolder): GetSelectedWalletSyncUseCase { return GetSelectedWalletSyncUseCase(walletsStateHolder = walletsStateHolder) } + + @SwapScope + @Provides + @Singleton + fun providesGetCryptoCurrenciesUseCase(currenciesRepository: CurrenciesRepository): GetCryptoCurrenciesUseCase { + return GetCryptoCurrenciesUseCase(currenciesRepository = currenciesRepository) + } } @Qualifier diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/LeastTokenInfo.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/LeastTokenInfo.kt new file mode 100644 index 0000000000..b9ed4f4af3 --- /dev/null +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/LeastTokenInfo.kt @@ -0,0 +1,6 @@ +package com.tangem.feature.swap.domain.models.domain + +data class LeastTokenInfo( + val contractAddress: String, + val network: 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 new file mode 100644 index 0000000000..704a27dc1b --- /dev/null +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/SwapPairLeast.kt @@ -0,0 +1,50 @@ +package com.tangem.feature.swap.domain.models.domain + +import com.tangem.domain.tokens.model.CryptoCurrency + +/** + * Domain layer representation of SwapPair data network model. + * + * @property from Short information about the token we want to change + * @property to Short information about the token we want to exchange for + * @property providers Exchange providers + */ +data class SwapPairLeast( + val from: LeastTokenInfo, + val to: LeastTokenInfo, + 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, +) + +/** + * Provider that could swap given cryptocurrencies + * + * @property providerId provider id + * @property rateTypes supported rate types + */ +data class SwapPairProvider( + val providerId: Int, + val rateTypes: List, +) + +/** + * Rate type. + * + * Current implementation contains only float type, fixed will be supported later. + */ +enum class RateType { + FLOAT, + FIXED, +} \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt index 5b4b806568..65abcf814c 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapProcessDataState.kt @@ -1,14 +1,21 @@ package com.tangem.feature.swap.viewmodels +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.ui.RequestApproveStateData import com.tangem.feature.swap.domain.models.ui.SwapStateData import com.tangem.feature.swap.domain.models.ui.TxFee data class SwapProcessDataState( + // Initial network id val networkId: String, + @Deprecated("used in old swap mechanism") val fromCurrency: Currency? = null, + @Deprecated("used in old swap mechanism") val toCurrency: Currency? = null, + val fromCryptoCurrency: CryptoCurrency? = null, + val toCryptoCurrency: CryptoCurrency? = null, + // Amount from input val amount: String? = null, val approveDataModel: RequestApproveStateData? = null, val swapDataModel: SwapStateData? = null, 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 7860b28db9..53659922c3 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 @@ -137,6 +137,15 @@ internal class SwapViewModel @Inject constructor( } private fun initTokens(currency: Currency) { + // new flow + viewModelScope.launch(dispatchers.main) { + runCatching(dispatchers.io) { + val pairs = swapInteractor.getPairs(currency) + // TODO + } + } + + // old flow viewModelScope.launch(dispatchers.main) { runCatching(dispatchers.io) { swapInteractor.initTokensToSwap(currency)