From c4b1dceb65107f96962cf42e785fc50856bdbea6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 22 Nov 2023 22:19:24 +0200 Subject: [PATCH 1/4] Updated on 2026-08-14 --- .../tangem/tap/proxy/UserWalletManagerImpl.kt | 26 +++++++-- features/learn2earn/impl/build.gradle.kts | 1 + .../feature/swap/domain/SwapInteractorImpl.kt | 58 +++++++------------ .../swap/domain/di/SwapDomainModule.kt | 2 + libs/crypto/build.gradle.kts | 6 +- .../tangem/lib/crypto/UserWalletManager.kt | 3 +- 6 files changed, 50 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index 74fce7b587..d53af693db 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -6,10 +6,13 @@ import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.WalletManager import com.tangem.common.doOnFailure import com.tangem.common.extensions.guard +import com.tangem.data.tokens.utils.CryptoCurrencyFactory import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toCoinId import com.tangem.domain.common.extensions.toNetworkId +import com.tangem.domain.common.util.derivationStyleProvider +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.lib.crypto.UserWalletManager @@ -20,6 +23,7 @@ import com.tangem.lib.crypto.models.ProxyAmount import com.tangem.lib.crypto.models.ProxyFiatCurrency import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.features.wallet.redux.WalletAction +import com.tangem.tap.store import com.tangem.tap.userWalletsListManager import com.tangem.tap.walletCurrenciesManager import com.tangem.tap.walletStoresManager @@ -34,6 +38,8 @@ class UserWalletManagerImpl( private val walletFeatureToggles: WalletFeatureToggles, ) : UserWalletManager { + val cryptoCurrencyFactory = CryptoCurrencyFactory() + override suspend fun getUserTokens( networkId: String, derivationPath: String?, @@ -78,13 +84,21 @@ class UserWalletManagerImpl( } } - override fun getNativeTokenForNetwork(networkId: String): Currency { + override fun getNativeTokenForNetwork(networkId: String): CryptoCurrency { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - return NativeToken( - id = blockchain.toCoinId(), - name = blockchain.fullName, - symbol = blockchain.currency, - networkId = networkId, + + return requireNotNull( + cryptoCurrencyFactory.createCoin( + blockchain = blockchain, + extraDerivationPath = null, + derivationStyleProvider = requireNotNull( + store.state.globalState + .userWalletsListManager + ?.selectedUserWalletSync + ?.scanResponse + ?.derivationStyleProvider, + ), + ) ) } diff --git a/features/learn2earn/impl/build.gradle.kts b/features/learn2earn/impl/build.gradle.kts index b9fb7f48a6..dcb142ae2d 100644 --- a/features/learn2earn/impl/build.gradle.kts +++ b/features/learn2earn/impl/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation(project(":data:common")) implementation(project(":libs:auth")) implementation(project(":libs:crypto")) + implementation(projects.domain.tokens.models) implementation(deps.material) 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 28de49180c..31e5dbaf5e 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 @@ -6,8 +6,10 @@ import com.tangem.domain.tokens.GetCryptoCurrencyStatusesSyncUseCase import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.Quote import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.NetworksRepository +import com.tangem.domain.tokens.repository.QuotesRepository import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase import com.tangem.feature.swap.domain.cache.SwapDataCache @@ -44,6 +46,7 @@ internal class SwapInteractorImpl @Inject constructor( private val walletFeatureToggles: WalletFeatureToggles, private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, private val getMultiCryptoCurrencyStatusUseCase: GetCryptoCurrencyStatusesSyncUseCase, + private val quotesRepository: QuotesRepository, ) : SwapInteractor { // TODO: Move to DI @@ -389,32 +392,6 @@ internal class SwapInteractorImpl @Inject constructor( } } - @Suppress("UnusedPrivateMember") - @Deprecated("used in old swap mechanism") - private fun getTokensWithBalance( - tokens: List, - balances: Map, - rates: Map, - appCurrency: ProxyFiatCurrency, - ): List { - return tokens.map { - val balance = balances[it.symbol] - TokenWithBalance( - token = it, - tokenBalanceData = TokenBalanceData( - amount = balance?.let { amount -> - amountFormatter.formatSwapAmountToUI(amount, it.symbol) - }, - amountEquivalent = balance?.value?.toFiatString( - rateValue = rates[it.id]?.toBigDecimal() ?: BigDecimal.ZERO, - fiatCurrencyName = appCurrency.symbol, - formatWithSpaces = true, - ), - ), - ) - } - } - private suspend fun isAllowedToSpend(networkId: String, fromToken: CryptoCurrency, amount: SwapAmount): Boolean { if (fromToken is CryptoCurrency.Coin) return true return getSelectedWalletSyncUseCase().fold( @@ -538,8 +515,8 @@ internal class SwapInteractorImpl @Inject constructor( private suspend fun getFormattedFiatFees(networkId: String, vararg fees: BigDecimal): List { val appCurrency = userWalletManager.getUserAppCurrency() val nativeToken = userWalletManager.getNativeTokenForNetwork(networkId) - val rates = repository.getRates(appCurrency.code, listOf(nativeToken.id)) - return rates[nativeToken.id]?.toBigDecimal()?.let { rate -> + val rates = getQuotes(nativeToken.id) + return rates[nativeToken.id]?.fiatRate?.let { rate -> fees.map { fee -> " (${fee.toFiatString(rate, appCurrency.symbol, true)})" } @@ -629,28 +606,26 @@ internal class SwapInteractorImpl @Inject constructor( val toToken = toTokenStatus.currency val appCurrency = userWalletManager.getUserAppCurrency() val nativeToken = userWalletManager.getNativeTokenForNetwork(networkId) - val rates = repository.getRates( - appCurrency.code, - listOf(fromToken.network.backendId, toToken.network.backendId, nativeToken.id), - ) + + val rates = getQuotes(fromToken.id, toToken.id, nativeToken.id) return SwapState.QuotesLoadedState( fromTokenInfo = TokenSwapInfo( tokenAmount = fromTokenAmount, cryptoCurrencyStatus = fromTokenStatus, - amountFiat = rates[fromToken.network.backendId]?.toBigDecimal()?.multiply(fromTokenAmount.value) + amountFiat = rates[fromToken.id]?.fiatRate?.multiply(fromTokenAmount.value) ?: BigDecimal.ZERO, ), toTokenInfo = TokenSwapInfo( tokenAmount = toTokenAmount, cryptoCurrencyStatus = toTokenStatus, - amountFiat = rates[toToken.network.backendId]?.toBigDecimal()?.multiply(toTokenAmount.value) + amountFiat = rates[toToken.id]?.fiatRate?.multiply(toTokenAmount.value) ?: BigDecimal.ZERO, ), priceImpact = calculatePriceImpact( fromTokenAmount = fromTokenAmount.value, - fromRate = rates[fromToken.network.backendId] ?: 0.0, + fromRate = rates[fromToken.id]?.fiatRate?.toDouble() ?: 0.0, toTokenAmount = toTokenAmount.value, - toRate = rates[toToken.network.backendId] ?: 0.0, + toRate = rates[toToken.id]?.fiatRate?.toDouble() ?: 0.0, ), networkCurrency = userWalletManager.getNetworkCurrency(networkId), swapDataModel = swapStateData, @@ -687,7 +662,7 @@ internal class SwapInteractorImpl @Inject constructor( val feeData = transactionManager.getFee( networkId = networkId, amountToSend = BigDecimal.ZERO, - currencyToSend = userWalletManager.getNativeTokenForNetwork(networkId), + currencyToSend = swapCurrencyConverter.convert(userWalletManager.getNativeTokenForNetwork(networkId)), destinationAddress = getTokenAddress(fromToken), increaseBy = INCREASE_GAS_LIMIT_BY, data = transactionData, @@ -863,6 +838,15 @@ internal class SwapInteractorImpl @Inject constructor( ) } + private suspend fun getQuotes(vararg ids: CryptoCurrency.ID) : Map { + val set = quotesRepository.getQuotesSync(ids.toSet(), false) + + return ids + .mapNotNull { id -> set.find { it.rawCurrencyId == id.rawCurrencyId }?.let { id to it } } + .toMap() + } + + companion object { private const val DEFAULT_SLIPPAGE = 2 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 8845c68949..bdcfad48f9 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 @@ -35,6 +35,7 @@ class SwapDomainModule { walletFeatureToggles: WalletFeatureToggles, @SwapScope getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, @SwapScope getCryptoCurrencyStatusUseCase: GetCryptoCurrencyStatusesSyncUseCase, + quotesRepository: QuotesRepository, ): SwapInteractor { return SwapInteractorImpl( transactionManager = transactionManager, @@ -47,6 +48,7 @@ class SwapDomainModule { walletFeatureToggles = walletFeatureToggles, getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase, getMultiCryptoCurrencyStatusUseCase = getCryptoCurrencyStatusUseCase, + quotesRepository = quotesRepository, ) } diff --git a/libs/crypto/build.gradle.kts b/libs/crypto/build.gradle.kts index 248cc20bd1..f8a413d31d 100644 --- a/libs/crypto/build.gradle.kts +++ b/libs/crypto/build.gradle.kts @@ -1,10 +1,12 @@ plugins { - alias(deps.plugins.kotlin.jvm) + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) id("configuration") } dependencies { - /** Coroutines */ implementation(deps.kotlin.coroutines) + implementation(projects.domain.tokens.models) + } \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt index 0a489b3498..c18bc06e73 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt @@ -1,5 +1,6 @@ package com.tangem.lib.crypto +import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.ProxyAmount import com.tangem.lib.crypto.models.ProxyFiatCurrency @@ -16,7 +17,7 @@ interface UserWalletManager { suspend fun getUserTokens(networkId: String, derivationPath: String?, isExcludeCustom: Boolean): List @Throws(IllegalStateException::class) - fun getNativeTokenForNetwork(networkId: String): Currency + fun getNativeTokenForNetwork(networkId: String): CryptoCurrency /** * Returns user walletId or empty string From 8ff70e46159afcfa5bf5fc3a863afd4fd2a6c52f Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 22 Nov 2023 22:32:02 +0200 Subject: [PATCH 2/4] Updated on 2026-08-14 --- .../feature/swap/domain/SwapInteractor.kt | 8 -------- .../feature/swap/domain/SwapInteractorImpl.kt | 8 -------- .../feature/swap/domain/cache/SwapDataCache.kt | 6 ++---- .../swap/domain/cache/SwapDataCacheImpl.kt | 18 ------------------ 4 files changed, 2 insertions(+), 38 deletions(-) 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 4a196f0569..9a6d547675 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 @@ -25,14 +25,6 @@ interface SwapInteractor { */ suspend fun searchTokens(networkId: String, searchQuery: String): FoundTokensStateExpress - /** - * Find specific token by id, null if not found - * - * @param id token id - * @return [CryptoCurrency] or null - */ - fun findTokenById(id: String): CryptoCurrency? - /** * Gives permission to swap, this starts scan card process * 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 31e5dbaf5e..d0e6bbf971 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 @@ -190,14 +190,6 @@ internal class SwapInteractorImpl @Inject constructor( ) } - @Deprecated("used in old swap mechanism") - override fun findTokenById(id: String): CryptoCurrency? { - val tokensInWallet = cache.getInWalletTokens() - val loadedTokens = cache.getLoadedTokens() - return tokensInWallet.firstOrNull { it.token.id.value == id }?.token - ?: loadedTokens.firstOrNull { it.token.id.value == id }?.token - } - @Deprecated("used in old swap mechanism") override suspend fun givePermissionToSwap(networkId: String, permissionOptions: PermissionOptions): TxState { val dataToSign = if (permissionOptions.approveType == SwapApproveType.UNLIMITED) { diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt index 4890b5ca49..5370981455 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt @@ -7,14 +7,12 @@ import java.math.BigDecimal interface SwapDataCache { - fun cacheAvailableToSwapTokens(networkId: String, tokens: List) fun cacheInWalletTokens(tokens: List) fun cacheLoadedTokens(tokens: List) fun cacheBalances(networkId: String, derivationPath: String?, balances: Map) - fun cacheLastFeeForNetwork(fee: BigDecimal, networkId: String) - fun getAvailableTokens(networkId: String): List + + fun getInWalletTokens(): List fun getLoadedTokens(): List fun getBalanceForToken(networkId: String, derivationPath: String?, symbol: String): SwapAmount? - fun getLastFeeForNetwork(networkId: String): BigDecimal? } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt index 2a5d7535ca..7461c206b0 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt @@ -7,16 +7,10 @@ import java.math.BigDecimal class SwapDataCacheImpl : SwapDataCache { - private val availableTokensForNetwork: MutableMap> = mutableMapOf() - private val feesForNetworks: MutableMap = mutableMapOf() private val tokensBalances: MutableMap> = mutableMapOf() private val lastInWalletTokens = mutableListOf() private val lastLoadedTokens = mutableListOf() - override fun cacheLastFeeForNetwork(fee: BigDecimal, networkId: String) { - feesForNetworks[networkId] = fee - } - override fun cacheInWalletTokens(tokens: List) { lastInWalletTokens.clear() lastInWalletTokens.addAll(tokens) @@ -43,18 +37,6 @@ class SwapDataCacheImpl : SwapDataCache { tokensBalances[createKeyFrom(networkId, derivationPath)] = balances } - override fun cacheAvailableToSwapTokens(networkId: String, tokens: List) { - availableTokensForNetwork[networkId] = tokens - } - - override fun getLastFeeForNetwork(networkId: String): BigDecimal? { - return feesForNetworks[networkId] - } - - override fun getAvailableTokens(networkId: String): List { - return availableTokensForNetwork.getOrElse(networkId) { emptyList() } - } - private fun createKeyFrom(networkId: String, derivationPath: String?): String { return "$networkId;$derivationPath" } From 91415eb0d953bab9515cd0fe4544ca5c47bec951 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Nov 2023 12:03:56 +0200 Subject: [PATCH 3/4] Updated on 2026-08-14 --- .../tangem/tap/proxy/UserWalletManagerImpl.kt | 22 +++++------------- features/swap/data/build.gradle.kts | 2 ++ .../tangem/feature/swap/SwapRepositoryImpl.kt | 23 +++++++++++++++++++ .../tangem/feature/swap/di/SwapDataModule.kt | 4 ++++ .../feature/swap/domain/SwapInteractorImpl.kt | 7 +++--- .../feature/swap/domain/SwapRepository.kt | 2 ++ .../tangem/lib/crypto/UserWalletManager.kt | 2 +- 7 files changed, 41 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index d53af693db..0fb5fb8a77 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -38,8 +38,6 @@ class UserWalletManagerImpl( private val walletFeatureToggles: WalletFeatureToggles, ) : UserWalletManager { - val cryptoCurrencyFactory = CryptoCurrencyFactory() - override suspend fun getUserTokens( networkId: String, derivationPath: String?, @@ -84,21 +82,13 @@ class UserWalletManagerImpl( } } - override fun getNativeTokenForNetwork(networkId: String): CryptoCurrency { + override fun getNativeTokenForNetwork(networkId: String): Currency { val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } - - return requireNotNull( - cryptoCurrencyFactory.createCoin( - blockchain = blockchain, - extraDerivationPath = null, - derivationStyleProvider = requireNotNull( - store.state.globalState - .userWalletsListManager - ?.selectedUserWalletSync - ?.scanResponse - ?.derivationStyleProvider, - ), - ) + return NativeToken( + id = blockchain.toCoinId(), + name = blockchain.fullName, + symbol = blockchain.currency, + networkId = networkId, ) } diff --git a/features/swap/data/build.gradle.kts b/features/swap/data/build.gradle.kts index 67d016525d..2d753c6fa2 100644 --- a/features/swap/data/build.gradle.kts +++ b/features/swap/data/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation(projects.domain.tokens.models) implementation(projects.domain.legacy) implementation(projects.domain.models) + implementation(projects.domain.wallets) implementation(projects.domain.wallets.models) /** Data */ @@ -32,5 +33,6 @@ dependencies { /** DI */ implementation(deps.hilt.android) + kapt(deps.hilt.kapt) } \ No newline at end of file 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 f63f42e5f3..88931b2e71 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 @@ -5,6 +5,7 @@ import com.tangem.blockchain.common.Approver 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 @@ -15,8 +16,11 @@ import com.tangem.datasource.api.oneinch.errors.OneIncResponseException import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.config.ConfigManager import com.tangem.domain.common.extensions.fromNetworkId +import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.domain.wallets.legacy.UserWalletsListManager +import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.swap.converters.* import com.tangem.feature.swap.domain.SwapRepository @@ -40,6 +44,7 @@ internal class SwapRepositoryImpl @Inject constructor( private val coroutineDispatcher: CoroutineDispatcherProvider, private val configManager: ConfigManager, private val walletManagersFacade: WalletManagersFacade, + private val walletsStateHolder: WalletsStateHolder, ) : SwapRepository { private val tokensConverter = TokensConverter() @@ -47,6 +52,7 @@ internal class SwapRepositoryImpl @Inject constructor( private val leastTokenInfoConverter = LeastTokenInfoConverter() private val swapPairInfoConverter = SwapPairInfoConverter() private val swapProviderConverter = SwapProviderConverter() + private val cryptoCurrencyFactory = CryptoCurrencyFactory() override suspend fun getPairs( initialCurrency: LeastTokenInfo, @@ -304,6 +310,23 @@ internal class SwapRepositoryImpl @Inject constructor( ) } + override fun getNativeTokenForNetwork(networkId: String): CryptoCurrency { + val blockchain = requireNotNull(Blockchain.fromNetworkId(networkId)) { "blockchain not found" } + + return requireNotNull( + cryptoCurrencyFactory.createCoin( + blockchain = blockchain, + extraDerivationPath = null, + derivationStyleProvider = requireNotNull( + walletsStateHolder.userWalletsListManager + ?.selectedUserWalletSync + ?.scanResponse + ?.derivationStyleProvider, + ), + ) + ) + } + 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/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index 89506db425..729564de7c 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 @@ -6,6 +6,8 @@ import com.tangem.datasource.api.oneinch.OneInchErrorsHandler import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.config.ConfigManager import com.tangem.domain.walletmanager.WalletManagersFacade +import com.tangem.domain.wallets.legacy.UserWalletsListManager +import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.feature.swap.SwapRepositoryImpl import com.tangem.feature.swap.domain.SwapRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -29,6 +31,7 @@ class SwapDataModule { coroutineDispatcher: CoroutineDispatcherProvider, configManager: ConfigManager, walletManagerFacade: WalletManagersFacade, + walletsStateHolder: WalletsStateHolder ): SwapRepository { return SwapRepositoryImpl( tangemTechApi = tangemTechApi, @@ -38,6 +41,7 @@ class SwapDataModule { coroutineDispatcher = coroutineDispatcher, configManager = configManager, walletManagersFacade = walletManagerFacade, + walletsStateHolder = walletsStateHolder, ) } } \ 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 d0e6bbf971..19c8601f2a 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 @@ -506,7 +506,7 @@ internal class SwapInteractorImpl @Inject constructor( private suspend fun getFormattedFiatFees(networkId: String, vararg fees: BigDecimal): List { val appCurrency = userWalletManager.getUserAppCurrency() - val nativeToken = userWalletManager.getNativeTokenForNetwork(networkId) + val nativeToken = repository.getNativeTokenForNetwork(networkId) val rates = getQuotes(nativeToken.id) return rates[nativeToken.id]?.fiatRate?.let { rate -> fees.map { fee -> @@ -596,8 +596,7 @@ internal class SwapInteractorImpl @Inject constructor( ): SwapState.QuotesLoadedState { val fromToken = fromTokenStatus.currency val toToken = toTokenStatus.currency - val appCurrency = userWalletManager.getUserAppCurrency() - val nativeToken = userWalletManager.getNativeTokenForNetwork(networkId) + val nativeToken = repository.getNativeTokenForNetwork(networkId) val rates = getQuotes(fromToken.id, toToken.id, nativeToken.id) return SwapState.QuotesLoadedState( @@ -654,7 +653,7 @@ internal class SwapInteractorImpl @Inject constructor( val feeData = transactionManager.getFee( networkId = networkId, amountToSend = BigDecimal.ZERO, - currencyToSend = swapCurrencyConverter.convert(userWalletManager.getNativeTokenForNetwork(networkId)), + currencyToSend = swapCurrencyConverter.convert(repository.getNativeTokenForNetwork(networkId)), destinationAddress = getTokenAddress(fromToken), increaseBy = INCREASE_GAS_LIMIT_BY, data = transactionData, 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 f8664afb69..60d4275364 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 @@ -78,4 +78,6 @@ interface SwapRepository { providerId: String, rateType: RateType, ): ExchangeQuote + + fun getNativeTokenForNetwork(networkId: String): CryptoCurrency } \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt index c18bc06e73..2006764b47 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt @@ -17,7 +17,7 @@ interface UserWalletManager { suspend fun getUserTokens(networkId: String, derivationPath: String?, isExcludeCustom: Boolean): List @Throws(IllegalStateException::class) - fun getNativeTokenForNetwork(networkId: String): CryptoCurrency + fun getNativeTokenForNetwork(networkId: String): Currency /** * Returns user walletId or empty string From b5dbec5350711e6e7af4888f274121ffbe3511f8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Nov 2023 12:08:17 +0200 Subject: [PATCH 4/4] Updated on 2026-08-14 --- .../main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt | 4 ---- .../main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt | 3 +-- .../main/java/com/tangem/feature/swap/di/SwapDataModule.kt | 3 +-- .../com/tangem/feature/swap/domain/SwapInteractorImpl.kt | 6 ++---- .../com/tangem/feature/swap/domain/cache/SwapDataCache.kt | 3 --- .../tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt | 2 -- .../main/java/com/tangem/feature/swap/ui/StateBuilder.kt | 2 +- .../src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt | 4 ---- .../com/tangem/feature/swap/viewmodels/SwapViewModel.kt | 2 +- .../main/java/com/tangem/lib/crypto/UserWalletManager.kt | 1 - 10 files changed, 6 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt index 0fb5fb8a77..74fce7b587 100644 --- a/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt +++ b/app/src/main/java/com/tangem/tap/proxy/UserWalletManagerImpl.kt @@ -6,13 +6,10 @@ import com.tangem.blockchain.common.Token import com.tangem.blockchain.common.WalletManager import com.tangem.common.doOnFailure import com.tangem.common.extensions.guard -import com.tangem.data.tokens.utils.CryptoCurrencyFactory import com.tangem.domain.common.BlockchainNetwork import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.extensions.toCoinId import com.tangem.domain.common.extensions.toNetworkId -import com.tangem.domain.common.util.derivationStyleProvider -import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.lib.crypto.UserWalletManager @@ -23,7 +20,6 @@ import com.tangem.lib.crypto.models.ProxyAmount import com.tangem.lib.crypto.models.ProxyFiatCurrency import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.features.wallet.redux.WalletAction -import com.tangem.tap.store import com.tangem.tap.userWalletsListManager import com.tangem.tap.walletCurrenciesManager import com.tangem.tap.walletStoresManager 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 88931b2e71..a3d9b7aa92 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 @@ -19,7 +19,6 @@ import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.walletmanager.WalletManagersFacade -import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.swap.converters.* @@ -323,7 +322,7 @@ internal class SwapRepositoryImpl @Inject constructor( ?.scanResponse ?.derivationStyleProvider, ), - ) + ), ) } 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 729564de7c..a70de3e545 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 @@ -6,7 +6,6 @@ import com.tangem.datasource.api.oneinch.OneInchErrorsHandler import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.config.ConfigManager import com.tangem.domain.walletmanager.WalletManagersFacade -import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.feature.swap.SwapRepositoryImpl import com.tangem.feature.swap.domain.SwapRepository @@ -31,7 +30,7 @@ class SwapDataModule { coroutineDispatcher: CoroutineDispatcherProvider, configManager: ConfigManager, walletManagerFacade: WalletManagersFacade, - walletsStateHolder: WalletsStateHolder + walletsStateHolder: WalletsStateHolder, ): SwapRepository { return SwapRepositoryImpl( tangemTechApi = tangemTechApi, 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 19c8601f2a..a43fd0295d 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 @@ -17,7 +17,6 @@ import com.tangem.feature.swap.domain.converters.SwapCurrencyConverter import com.tangem.feature.swap.domain.models.SwapAmount import com.tangem.feature.swap.domain.models.data.AggregatedSwapDataModel import com.tangem.feature.swap.domain.models.domain.* -import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.toStringWithRightOffset import com.tangem.feature.swap.domain.models.ui.* import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles @@ -597,7 +596,7 @@ internal class SwapInteractorImpl @Inject constructor( val fromToken = fromTokenStatus.currency val toToken = toTokenStatus.currency val nativeToken = repository.getNativeTokenForNetwork(networkId) - + val rates = getQuotes(fromToken.id, toToken.id, nativeToken.id) return SwapState.QuotesLoadedState( fromTokenInfo = TokenSwapInfo( @@ -829,7 +828,7 @@ internal class SwapInteractorImpl @Inject constructor( ) } - private suspend fun getQuotes(vararg ids: CryptoCurrency.ID) : Map { + private suspend fun getQuotes(vararg ids: CryptoCurrency.ID): Map { val set = quotesRepository.getQuotesSync(ids.toSet(), false) return ids @@ -837,7 +836,6 @@ internal class SwapInteractorImpl @Inject constructor( .toMap() } - companion object { private const val DEFAULT_SLIPPAGE = 2 diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt index 5370981455..ce4956ba90 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCache.kt @@ -1,9 +1,7 @@ package com.tangem.feature.swap.domain.cache import com.tangem.feature.swap.domain.models.SwapAmount -import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.ui.TokenWithBalanceExpress -import java.math.BigDecimal interface SwapDataCache { @@ -11,7 +9,6 @@ interface SwapDataCache { fun cacheLoadedTokens(tokens: List) fun cacheBalances(networkId: String, derivationPath: String?, balances: Map) - fun getInWalletTokens(): List fun getLoadedTokens(): List fun getBalanceForToken(networkId: String, derivationPath: String?, symbol: String): SwapAmount? diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt index 7461c206b0..92c051e246 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/cache/SwapDataCacheImpl.kt @@ -1,9 +1,7 @@ package com.tangem.feature.swap.domain.cache import com.tangem.feature.swap.domain.models.SwapAmount -import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.ui.TokenWithBalanceExpress -import java.math.BigDecimal class SwapDataCacheImpl : SwapDataCache { diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 4089832235..4033c21dbc 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -34,7 +34,7 @@ import java.math.RoundingMode /** * State builder creates a specific states for SwapScreen */ -@Suppress("LargeClass") +@Suppress("LargeClass", "TooManyFunctions") internal class StateBuilder( private val actions: UiActions, private val isBalanceHiddenProvider: Provider, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt index 692d6a4e57..9d59406885 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt @@ -2,19 +2,15 @@ package com.tangem.feature.swap.ui import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.padding import androidx.compose.material.* import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.swap.models.SwapStateHolder import com.tangem.feature.swap.models.states.ChooseProviderBottomSheetConfig import com.tangem.feature.swap.models.states.GivePermissionBottomSheetConfig -import com.tangem.feature.swap.presentation.R @OptIn(ExperimentalLayoutApi::class) @Composable 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 15fa430b17..cca50c074d 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 @@ -530,7 +530,7 @@ internal class SwapViewModel @Inject constructor( } } - @Suppress("LongMethod") + @Suppress("LongMethod", "CyclomaticComplexMethod") private fun createUiActions(): UiActions { return UiActions( onSearchEntered = { onSearchEntered(it) }, diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt index 2006764b47..0a489b3498 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/UserWalletManager.kt @@ -1,6 +1,5 @@ package com.tangem.lib.crypto -import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.lib.crypto.models.Currency import com.tangem.lib.crypto.models.ProxyAmount import com.tangem.lib.crypto.models.ProxyFiatCurrency