From 7aef4046c3dd386ec663664d8f0f1b8156a59101 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Nov 2024 13:17:34 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/di/ActivityModule.kt | 3 ++ .../com/tangem/tap/di/data/CardDataModule.kt | 4 +- .../card/DefaultDerivationsRepository.kt | 4 ++ .../features/onboarding/OnboardingHelper.kt | 6 ++- .../CryptoCurrencyConverter.kt | 7 ++- .../exchangeServices/DefaultRampManager.kt | 4 +- .../common/currency/CryptoCurrencyFactory.kt | 9 ++-- .../data/common/currency/NetworkOperations.kt | 48 +++++++++++++++---- .../ResponseCryptoCurrenciesFactory.kt | 21 ++++++-- .../DefaultCustomTokensRepository.kt | 27 ++++++++--- .../DefaultManageTokensRepository.kt | 17 ++++--- .../managetokens/di/ManageTokensDataModule.kt | 5 ++ .../utils/ManagedCryptoCurrencyFactory.kt | 19 +++++--- data/markets/build.gradle.kts | 1 + .../markets/DefaultMarketsTokenRepository.kt | 12 +++-- .../converters/TokenMarketInfoConverter.kt | 18 ++++--- .../data/markets/di/MarketsDataModule.kt | 3 ++ .../tangem/data/tokens/di/TokensDataModule.kt | 5 ++ .../repository/DefaultCurrenciesRepository.kt | 8 ++-- .../repository/DefaultNetworksRepository.kt | 10 ++-- .../utils/CardCryptoCurrenciesFactory.kt | 8 +++- .../domain/common/extensions/CardSdk.kt | 32 +++++++++---- .../impl/model/MarketsTokenDetailsModel.kt | 4 +- .../referral/data/ReferralRepositoryImpl.kt | 7 ++- .../referral/di/ReferralRepositoryModule.kt | 3 ++ .../feature/swap/DefaultSwapRepository.kt | 4 +- .../swap/DefaultSwapTransactionRepository.kt | 6 ++- .../SavedSwapTransactionListConverter.kt | 8 ++-- .../tangem/feature/swap/di/SwapDataModule.kt | 5 ++ .../tangem/blockchainsdk/utils/Blockchain.kt | 13 +---- .../com/tangem/lib/crypto/BlockchainUtils.kt | 8 ++-- 31 files changed, 238 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt index 646c003c7f..f6252946fb 100644 --- a/app/src/main/java/com/tangem/tap/di/ActivityModule.kt +++ b/app/src/main/java/com/tangem/tap/di/ActivityModule.kt @@ -1,5 +1,6 @@ package com.tangem.tap.di +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.datasource.exchangeservice.swap.SwapServiceLoader import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.repository.CardSdkConfigRepository @@ -49,6 +50,7 @@ internal object ActivityModule { swapServiceLoader: SwapServiceLoader, currenciesRepository: CurrenciesRepository, getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase, + excludedBlockchains: ExcludedBlockchains, dispatchers: CoroutineDispatcherProvider, ): RampStateManager { return DefaultRampManager( @@ -58,6 +60,7 @@ internal object ActivityModule { swapServiceLoader = swapServiceLoader, currenciesRepository = currenciesRepository, getNetworkCoinStatusUseCase = getNetworkCoinStatusUseCase, + excludedBlockchains = excludedBlockchains, dispatchers = dispatchers, ) } diff --git a/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt b/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt index 66d63389c9..34411415bf 100644 --- a/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt +++ b/app/src/main/java/com/tangem/tap/di/data/CardDataModule.kt @@ -1,5 +1,6 @@ package com.tangem.tap.di.data +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.card.repository.DerivationsRepository import com.tangem.sdk.api.TangemSdkManager @@ -20,8 +21,9 @@ internal object CardDataModule { fun providesDerivationsRepository( tangemSdkManager: TangemSdkManager, userWalletsStore: UserWalletsStore, + excludedBlockchains: ExcludedBlockchains, dispatchers: CoroutineDispatcherProvider, ): DerivationsRepository { - return DefaultDerivationsRepository(tangemSdkManager, userWalletsStore, dispatchers) + return DefaultDerivationsRepository(tangemSdkManager, userWalletsStore, excludedBlockchains, dispatchers) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt index 45cc75e9da..f9e14a3a11 100644 --- a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt @@ -1,6 +1,7 @@ package com.tangem.tap.domain.card import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.common.CompletionResult import com.tangem.common.card.EllipticCurve @@ -32,6 +33,7 @@ private typealias DerivedKeys = Map internal class DefaultDerivationsRepository( private val tangemSdkManager: TangemSdkManager, private val userWalletsStore: UserWalletsStore, + private val excludedBlockchains: ExcludedBlockchains, private val dispatchers: CoroutineDispatcherProvider, ) : DerivationsRepository { @@ -49,6 +51,7 @@ internal class DefaultDerivationsRepository( blockchain = Blockchain.fromNetworkId(it.value) ?: return@mapNotNull null, extraDerivationPath = null, scanResponse = userWallet.scanResponse, + excludedBlockchains = excludedBlockchains, ) }, ) @@ -85,6 +88,7 @@ internal class DefaultDerivationsRepository( blockchain = Blockchain.fromNetworkId(backendId) ?: return@mapNotNull null, extraDerivationPath = extraDerivationPath, scanResponse = userWallet.scanResponse, + excludedBlockchains = excludedBlockchains, ) }, ) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 4fc3109010..5ff29dc0d4 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -24,8 +24,8 @@ import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.features.demo.DemoHelper -import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletAction import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE +import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletAction import com.tangem.tap.features.saveWallet.redux.SaveWalletAction import com.tangem.tap.mainScope import com.tangem.tap.proxy.redux.DaggerGraphState @@ -212,7 +212,9 @@ object OnboardingHelper { fun handleTopUpAction(walletManager: WalletManager, scanResponse: ScanResponse, globalState: GlobalState) { val blockchain = walletManager.wallet.blockchain - val cryptoCurrency = CryptoCurrencyFactory().createCoin( + val excludedBlockchains = store.inject(DaggerGraphState::excludedBlockchains) + + val cryptoCurrency = CryptoCurrencyFactory(excludedBlockchains).createCoin( blockchain = blockchain, extraDerivationPath = null, scanResponse = scanResponse, diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt index 520d262847..8cf25d7f82 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt @@ -2,6 +2,7 @@ package com.tangem.tap.network.exchangeServices import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.common.extensions.inject @@ -10,9 +11,11 @@ import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.tap.store import com.tangem.utils.converter.TwoWayConverter -internal class CryptoCurrencyConverter : TwoWayConverter { +internal class CryptoCurrencyConverter( + private val excludedBlockchains: ExcludedBlockchains, +) : TwoWayConverter { - private val cryptoCurrencyFactory by lazy { CryptoCurrencyFactory() } + private val cryptoCurrencyFactory by lazy { CryptoCurrencyFactory(excludedBlockchains) } override fun convert(value: Currency): CryptoCurrency { return when (value) { diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt index 0186fe0f32..045c5f948e 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/DefaultRampManager.kt @@ -1,5 +1,6 @@ package com.tangem.tap.network.exchangeServices +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.datasource.api.express.models.TangemExpressValues.EMPTY_CONTRACT_ADDRESS_VALUE import com.tangem.datasource.exchangeservice.swap.SwapServiceLoader import com.tangem.domain.exchange.RampStateManager @@ -25,9 +26,10 @@ internal class DefaultRampManager( private val currenciesRepository: CurrenciesRepository, private val getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase, private val dispatchers: CoroutineDispatcherProvider, + excludedBlockchains: ExcludedBlockchains, ) : RampStateManager { - private val cryptoCurrencyConverter = CryptoCurrencyConverter() + private val cryptoCurrencyConverter = CryptoCurrencyConverter(excludedBlockchains) override fun isSellSupportedByService(cryptoCurrency: CryptoCurrency): Boolean { return exchangeService?.availableForSell( diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt index ff4455dc21..fb8608e78b 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/CryptoCurrencyFactory.kt @@ -1,6 +1,7 @@ package com.tangem.data.common.currency import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.utils.toCoinId import com.tangem.domain.models.scan.ScanResponse @@ -10,7 +11,9 @@ import timber.log.Timber import com.tangem.blockchain.common.Token as SdkToken // FIXME: Make internal -class CryptoCurrencyFactory { +class CryptoCurrencyFactory( + private val excludedBlockchains: ExcludedBlockchains, +) { @Suppress("LongParameterList") // Yep, it's long fun createToken( @@ -46,7 +49,7 @@ class CryptoCurrencyFactory { return null } - val network = getNetwork(blockchain, extraDerivationPath, scanResponse) ?: return null + val network = getNetwork(blockchain, extraDerivationPath, scanResponse, excludedBlockchains) ?: return null val id = getTokenId(network, sdkToken) return CryptoCurrency.Token( @@ -70,7 +73,7 @@ class CryptoCurrencyFactory { Timber.e("Unable to map the SDK token to the domain token with Unknown blockchain") return null } - val network = getNetwork(blockchain, extraDerivationPath, scanResponse) ?: return null + val network = getNetwork(blockchain, extraDerivationPath, scanResponse, excludedBlockchains) ?: return null return createCoin(network) } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/NetworkOperations.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/NetworkOperations.kt index f181886484..9d2fd810d9 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/NetworkOperations.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/NetworkOperations.kt @@ -2,6 +2,7 @@ package com.tangem.data.common.currency import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.FeePaidCurrency +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.domain.common.DerivationStyleProvider import com.tangem.domain.common.extensions.canHandleToken @@ -19,10 +20,10 @@ fun getNetwork( blockchain: Blockchain, extraDerivationPath: String?, derivationStyleProvider: DerivationStyleProvider?, + excludedBlockchains: ExcludedBlockchains, canHandleTokens: Boolean, ): Network? { - if (blockchain == Blockchain.Unknown) { - Timber.e("Unable to convert Unknown blockchain to the domain network model") + if (!isBlockchainSupported(blockchain, excludedBlockchains)) { return null } @@ -43,10 +44,14 @@ fun getNetwork( ) } -fun getNetwork(networkId: Network.ID, derivationPath: Network.DerivationPath, scanResponse: ScanResponse): Network? { +fun getNetwork( + networkId: Network.ID, + derivationPath: Network.DerivationPath, + scanResponse: ScanResponse, + excludedBlockchains: ExcludedBlockchains, +): Network? { val blockchain = getBlockchain(networkId) - if (blockchain == Blockchain.Unknown) { - Timber.e("Unable to convert Unknown blockchain to the domain network model") + if (!isBlockchainSupported(blockchain, excludedBlockchains)) { return null } @@ -59,16 +64,43 @@ fun getNetwork(networkId: Network.ID, derivationPath: Network.DerivationPath, sc currencySymbol = blockchain.currency, standardType = getNetworkStandardType(blockchain), hasFiatFeeRate = blockchain.feePaidCurrency() !is FeePaidCurrency.FeeResource, - canHandleTokens = scanResponse.card.canHandleToken(blockchain, scanResponse.cardTypesResolver), + canHandleTokens = scanResponse.card.canHandleToken( + blockchain, + scanResponse.cardTypesResolver, + excludedBlockchains, + ), ) } -fun getNetwork(blockchain: Blockchain, extraDerivationPath: String?, scanResponse: ScanResponse): Network? { +private fun isBlockchainSupported(blockchain: Blockchain, excludedBlockchains: ExcludedBlockchains): Boolean { + if (blockchain == Blockchain.Unknown) { + Timber.w("Unable to convert Unknown blockchain to the domain network model") + return false + } + if (blockchain in excludedBlockchains) { + Timber.w("Unable to convert excluded blockchain to the domain network model") + return false + } + + return true +} + +fun getNetwork( + blockchain: Blockchain, + extraDerivationPath: String?, + scanResponse: ScanResponse, + excludedBlockchains: ExcludedBlockchains, +): Network? { return getNetwork( blockchain = blockchain, extraDerivationPath = extraDerivationPath, derivationStyleProvider = scanResponse.derivationStyleProvider, - canHandleTokens = scanResponse.card.canHandleToken(blockchain, scanResponse.cardTypesResolver), + excludedBlockchains = excludedBlockchains, + canHandleTokens = scanResponse.card.canHandleToken( + blockchain, + scanResponse.cardTypesResolver, + excludedBlockchains, + ), ) } diff --git a/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt b/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt index 047150c42e..7cda282ecb 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/currency/ResponseCryptoCurrenciesFactory.kt @@ -3,6 +3,7 @@ package com.tangem.data.common.currency import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.blockchainsdk.compatibility.l2BlockchainsList +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.utils.toCoinId import com.tangem.datasource.api.tangemTech.models.UserTokensResponse @@ -12,7 +13,9 @@ import com.tangem.domain.tokens.model.CryptoCurrency import timber.log.Timber import com.tangem.blockchain.common.Token as SdkToken -class ResponseCryptoCurrenciesFactory { +class ResponseCryptoCurrenciesFactory( + private val excludedBlockchains: ExcludedBlockchains, +) { fun createCurrency(currencyId: String, response: UserTokensResponse, scanResponse: ScanResponse): CryptoCurrency { return response.tokens @@ -65,7 +68,12 @@ class ResponseCryptoCurrenciesFactory { responseToken: UserTokensResponse.Token, scanResponse: ScanResponse, ): CryptoCurrency.Coin? { - val network = getNetwork(blockchain, responseToken.derivationPath, scanResponse) ?: return null + val network = getNetwork( + blockchain, + responseToken.derivationPath, + scanResponse, + excludedBlockchains, + ) ?: return null return CryptoCurrency.Coin( id = getCoinId(network, blockchain.toCoinId()), @@ -111,8 +119,13 @@ class ResponseCryptoCurrenciesFactory { responseDerivationPath: String?, scanResponse: ScanResponse, ): CryptoCurrency.Token? { - val network = getNetwork(blockchain, responseDerivationPath, scanResponse) - ?: return null + val network = getNetwork( + blockchain, + responseDerivationPath, + scanResponse, + excludedBlockchains, + ) ?: return null + val id = getTokenId(network, sdkToken) return CryptoCurrency.Token( diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultCustomTokensRepository.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultCustomTokensRepository.kt index 3c9aabf80e..ba48dfac71 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultCustomTokensRepository.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultCustomTokensRepository.kt @@ -1,6 +1,7 @@ package com.tangem.data.managetokens import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.data.common.api.safeApiCall @@ -36,10 +37,11 @@ internal class DefaultCustomTokensRepository( private val userWalletsStore: UserWalletsStore, private val appPreferencesStore: AppPreferencesStore, private val walletManagersFacade: WalletManagersFacade, + private val excludedBlockchains: ExcludedBlockchains, private val dispatchers: CoroutineDispatcherProvider, ) : CustomTokensRepository { - private val cryptoCurrencyFactory = CryptoCurrencyFactory() + private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains) private val userTokensResponseFactory = UserTokensResponseFactory() private val tokenAddressConverter = TokenAddressesConverter() private val userTokensBackwardCompatibility = UserTokensBackwardCompatibility() @@ -87,7 +89,9 @@ internal class DefaultCustomTokensRepository( val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { "User wallet [$userWalletId] not found while finding token" } - val network = requireNotNull(getNetwork(networkId, derivationPath, userWallet.scanResponse)) { + val network = requireNotNull( + getNetwork(networkId, derivationPath, userWallet.scanResponse, excludedBlockchains), + ) { "Network [$networkId] not found while finding token" } val tokenAddress = tokenAddressConverter.convertTokenAddress( @@ -97,7 +101,7 @@ internal class DefaultCustomTokensRepository( ) val supportedTokenNetworkIds = userWallet.scanResponse.card - .supportedBlockchains(userWallet.scanResponse.cardTypesResolver) + .supportedBlockchains(userWallet.scanResponse.cardTypesResolver, excludedBlockchains) .filter(Blockchain::canHandleTokens) .map(Blockchain::toNetworkId) @@ -137,7 +141,9 @@ internal class DefaultCustomTokensRepository( val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { "User wallet [$userWalletId] not found while creating coin" } - val network = requireNotNull(getNetwork(networkId, derivationPath, userWallet.scanResponse)) { + val network = requireNotNull( + getNetwork(networkId, derivationPath, userWallet.scanResponse, excludedBlockchains), + ) { "Network [$networkId] not found while creating coin" } @@ -168,7 +174,9 @@ internal class DefaultCustomTokensRepository( val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { "User wallet [$userWalletId] not found while creating custom token" } - val network = requireNotNull(getNetwork(networkId, derivationPath, userWallet.scanResponse)) { + val network = requireNotNull( + getNetwork(networkId, derivationPath, userWallet.scanResponse, excludedBlockchains), + ) { "Network [$networkId] not found while creating custom token" } val tokenAddress = tokenAddressConverter.convertTokenAddress( @@ -230,11 +238,18 @@ internal class DefaultCustomTokensRepository( Blockchain.entries .mapNotNull { blockchain -> - if (scanResponse.card.canHandleBlockchain(blockchain, scanResponse.cardTypesResolver)) { + val canHandleBlockchain = scanResponse.card.canHandleBlockchain( + blockchain, + scanResponse.cardTypesResolver, + excludedBlockchains, + ) + + if (canHandleBlockchain) { getNetwork( blockchain = blockchain, extraDerivationPath = null, scanResponse = scanResponse, + excludedBlockchains = excludedBlockchains, ) } else { null diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt index deb08005ef..6e2f02f44c 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt @@ -2,8 +2,8 @@ package com.tangem.data.managetokens import com.tangem.blockchain.common.Blockchain import com.tangem.blockchainsdk.compatibility.l2BlockchainsCoinIds +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.blockchainsdk.utils.isSupportedInApp import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.data.common.api.safeApiCall import com.tangem.data.common.currency.UserTokensResponseFactory @@ -47,12 +47,13 @@ internal class DefaultManageTokensRepository( private val manageTokensUpdateFetcher: ManageTokensUpdateFetcher, private val appPreferencesStore: AppPreferencesStore, private val testnetTokensStorage: TestnetTokensStorage, + private val excludedBlockchains: ExcludedBlockchains, private val dispatchers: CoroutineDispatcherProvider, ) : ManageTokensRepository { - private val managedCryptoCurrencyFactory = ManagedCryptoCurrencyFactory() + private val managedCryptoCurrencyFactory = ManagedCryptoCurrencyFactory(excludedBlockchains) private val userTokensResponseFactory = UserTokensResponseFactory() - private val cardCurrenciesFactory = CardCryptoCurrenciesFactory(DemoConfig()) + private val cardCurrenciesFactory = CardCryptoCurrenciesFactory(DemoConfig(), excludedBlockchains) // region getTokenListBatchFlow override fun getTokenListBatchFlow( @@ -202,9 +203,9 @@ internal class DefaultManageTokensRepository( private fun getSupportedBlockchains(userWallet: UserWallet?): List { return userWallet?.scanResponse?.let { - it.card.supportedBlockchains(it.cardTypesResolver) + it.card.supportedBlockchains(it.cardTypesResolver, excludedBlockchains) } ?: Blockchain.entries.filter { - !it.isTestnet() && it.isSupportedInApp() + !it.isTestnet() && it !in excludedBlockchains } } // endregion @@ -290,6 +291,7 @@ internal class DefaultManageTokensRepository( val canHandleBlockchain = userWallet.scanResponse.card.canHandleBlockchain( blockchain = blockchain, cardTypesResolver = userWallet.cardTypesResolver, + excludedBlockchains = excludedBlockchains, ) return if (!canHandleBlockchain) { @@ -304,7 +306,10 @@ internal class DefaultManageTokensRepository( blockchain: Blockchain, ): CurrencyUnsupportedState.Token? { val cardTypesResolver = userWallet.scanResponse.cardTypesResolver - val supportedTokens = userWallet.scanResponse.card.supportedTokens(cardTypesResolver) + val supportedTokens = userWallet.scanResponse.card.supportedTokens( + cardTypesResolver, + excludedBlockchains, + ) return when { // refactor this later by moving all this logic in card config diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/di/ManageTokensDataModule.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/di/ManageTokensDataModule.kt index a85db459dd..3f64ae5970 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/di/ManageTokensDataModule.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/di/ManageTokensDataModule.kt @@ -1,5 +1,6 @@ package com.tangem.data.managetokens.di +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.data.managetokens.DefaultCustomTokensRepository import com.tangem.data.managetokens.DefaultManageTokensRepository import com.tangem.data.managetokens.utils.ManageTokensUpdateFetcher @@ -30,6 +31,7 @@ internal object ManageTokensDataModule { appPreferencesStore: AppPreferencesStore, testnetTokensStorage: TestnetTokensStorage, dispatchers: CoroutineDispatcherProvider, + excludedBlockchains: ExcludedBlockchains, ): ManageTokensRepository { return DefaultManageTokensRepository( tangemTechApi, @@ -37,6 +39,7 @@ internal object ManageTokensDataModule { manageTokensUpdateFetcher, appPreferencesStore, testnetTokensStorage, + excludedBlockchains, dispatchers, ) } @@ -49,12 +52,14 @@ internal object ManageTokensDataModule { appPreferencesStore: AppPreferencesStore, walletManagersFacade: WalletManagersFacade, dispatchers: CoroutineDispatcherProvider, + excludedBlockchains: ExcludedBlockchains, ): CustomTokensRepository { return DefaultCustomTokensRepository( tangemTechApi, userWalletsStore, appPreferencesStore, walletManagersFacade, + excludedBlockchains, dispatchers, ) } diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt index a5eb111a0d..36475f8fbd 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/utils/ManagedCryptoCurrencyFactory.kt @@ -4,8 +4,8 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.blockchainsdk.compatibility.applyL2Compatibility import com.tangem.blockchainsdk.compatibility.getL2CompatibilityTokenComparison import com.tangem.blockchainsdk.compatibility.l2BlockchainsList +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.blockchainsdk.utils.isSupportedInApp import com.tangem.blockchainsdk.utils.toCoinId import com.tangem.data.common.currency.getCoinId import com.tangem.data.common.currency.getNetwork @@ -22,7 +22,9 @@ import com.tangem.domain.managetokens.model.ManagedCryptoCurrency.SourceNetwork import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.Network -internal class ManagedCryptoCurrencyFactory { +internal class ManagedCryptoCurrencyFactory( + private val excludedBlockchains: ExcludedBlockchains, +) { fun create( coinsResponse: CoinsResponse, @@ -88,7 +90,7 @@ internal class ManagedCryptoCurrencyFactory { scanResponse: ScanResponse, ): ManagedCryptoCurrency? { val blockchain = Blockchain.fromNetworkId(token.networkId) - ?.takeIf { it.isSupportedInApp() } + ?.takeUnless { it in excludedBlockchains } ?: return null if (!checkIsCustomToken(token, blockchain, scanResponse.derivationStyleProvider)) { @@ -99,6 +101,7 @@ internal class ManagedCryptoCurrencyFactory { blockchain = blockchain, extraDerivationPath = token.derivationPath, scanResponse = scanResponse, + excludedBlockchains = excludedBlockchains, ) ?: return null val contractAddress = token.contractAddress @@ -161,15 +164,16 @@ internal class ManagedCryptoCurrencyFactory { extraDerivationPath: String? = null, ): SourceNetwork? { val blockchain = Blockchain.fromNetworkId(networkId) - ?.takeIf { it.isSupportedInApp() } + ?.takeUnless { it in excludedBlockchains } ?: return null val network = getNetwork( blockchain, extraDerivationPath, scanResponse?.derivationStyleProvider, + excludedBlockchains, canHandleTokens = scanResponse?.let { - it.card.canHandleToken(blockchain, it.cardTypesResolver) + it.card.canHandleToken(blockchain, it.cardTypesResolver, excludedBlockchains) } ?: true, ) ?: return null @@ -200,13 +204,14 @@ internal class ManagedCryptoCurrencyFactory { .mapNotNullTo(mutableSetOf()) { token -> val blockchain = Blockchain.fromNetworkId(token.networkId) - if (blockchain != null && blockchain.isSupportedInApp()) { + if (blockchain != null && blockchain !in excludedBlockchains) { getNetwork( blockchain, token.derivationPath, scanResponse?.derivationStyleProvider, + excludedBlockchains, canHandleTokens = scanResponse?.let { - it.card.canHandleToken(blockchain, it.cardTypesResolver) + it.card.canHandleToken(blockchain, it.cardTypesResolver, excludedBlockchains) } ?: true, ) } else { diff --git a/data/markets/build.gradle.kts b/data/markets/build.gradle.kts index ba16c78bf0..632a570f78 100644 --- a/data/markets/build.gradle.kts +++ b/data/markets/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { implementation(projects.core.pagination) implementation(projects.core.analytics) implementation(projects.core.analytics.models) + implementation(projects.core.configToggles) implementation(projects.domain.legacy) implementation(projects.domain.markets) diff --git a/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt b/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt index be0e41c584..61eb79b5e0 100644 --- a/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt +++ b/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt @@ -3,6 +3,7 @@ package com.tangem.data.markets import com.tangem.blockchain.common.Blockchain import com.tangem.blockchainsdk.compatibility.applyL2Compatibility import com.tangem.blockchainsdk.compatibility.getTokenIdIfL2Network +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.data.common.cache.CacheRegistry @@ -37,10 +38,14 @@ internal class DefaultMarketsTokenRepository( private val userWalletsStore: UserWalletsStore, private val dispatcherProvider: CoroutineDispatcherProvider, private val analyticsEventHandler: AnalyticsEventHandler, + private val excludedBlockchains: ExcludedBlockchains, private val cacheRegistry: CacheRegistry, private val tokenExchangesStore: RuntimeStateStore>, ) : MarketsTokenRepository { + private val tokenMarketInfoConverter: TokenMarketInfoConverter = TokenMarketInfoConverter(excludedBlockchains) + private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains) + private fun createTokenMarketsFetcher(firstBatchSize: Int, nextBatchSize: Int) = LimitOffsetBatchFetcher( prefetchDistance = firstBatchSize, batchSize = nextBatchSize, @@ -204,7 +209,7 @@ internal class DefaultMarketsTokenRepository( } val resultResponse = result.applyL2Compatibility(tokenId) - return@withContext TokenMarketInfoConverter.convert(resultResponse) + return@withContext tokenMarketInfoConverter.convert(resultResponse) } override suspend fun getTokenQuotes(fiatCurrencyCode: String, tokenId: String, tokenSymbol: String) = @@ -234,7 +239,7 @@ internal class DefaultMarketsTokenRepository( val blockchain = Blockchain.fromNetworkId(network.networkId) ?: error("Unknown network [${network.networkId}]") return if (network.contractAddress == null) { - CryptoCurrencyFactory().createCoin( + cryptoCurrencyFactory.createCoin( blockchain = blockchain, extraDerivationPath = null, scanResponse = userWallet.scanResponse, @@ -244,9 +249,10 @@ internal class DefaultMarketsTokenRepository( blockchain = blockchain, extraDerivationPath = null, scanResponse = userWallet.scanResponse, + excludedBlockchains = excludedBlockchains, ) ?: return null - CryptoCurrencyFactory().createToken( + cryptoCurrencyFactory.createToken( network = currencyNetwork, rawId = token.id, name = token.name, diff --git a/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt b/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt index 85afc94699..2e0146f681 100644 --- a/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt +++ b/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt @@ -2,8 +2,8 @@ package com.tangem.data.markets.converters import android.net.Uri import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.blockchainsdk.utils.isSupportedInApp import com.tangem.datasource.api.markets.models.response.TokenMarketInfoResponse import com.tangem.domain.markets.BuildConfig import com.tangem.domain.markets.TokenMarketInfo @@ -11,10 +11,9 @@ import com.tangem.domain.markets.TokenQuotes import com.tangem.utils.converter.Converter import java.math.BigDecimal -internal object TokenMarketInfoConverter : Converter { - - private const val PROD_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api/security_provider/" - private const val DEV_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api.dev/security_provider/" +internal class TokenMarketInfoConverter( + private val excludedBlockchains: ExcludedBlockchains, +) : Converter { override fun convert(value: TokenMarketInfoResponse): TokenMarketInfo { return with(value) { @@ -68,7 +67,8 @@ internal object TokenMarketInfoConverter : Converter { + blockchain != null && blockchain !in excludedBlockchains && + blockchain.canHandleTokens() -> { TokenMarketInfo.Network( networkId = network.networkId, exchangeable = network.exchangeable, @@ -193,4 +193,10 @@ internal object TokenMarketInfoConverter : Converter { val card = scanResponse.card diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt index cf827af989..a5129bbb52 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/CardSdk.kt @@ -1,7 +1,7 @@ package com.tangem.domain.common.extensions import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchainsdk.utils.isSupportedInApp +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.common.card.EllipticCurve import com.tangem.common.card.FirmwareVersion import com.tangem.domain.common.CardTypesResolver @@ -15,7 +15,10 @@ import com.tangem.domain.models.scan.CardDTO val FirmwareVersion.Companion.SolanaTokensAvailable get() = FirmwareVersion(4, 52) -fun CardDTO.supportedBlockchains(cardTypesResolver: CardTypesResolver): List { +fun CardDTO.supportedBlockchains( + cardTypesResolver: CardTypesResolver, + excludedBlockchains: ExcludedBlockchains, +): List { val supportedBlockchains = if (firmwareVersion < FirmwareVersion.MultiWalletAvailable) { Blockchain.fromCurve(EllipticCurve.Secp256k1).toMutableList() } else if (!cardTypesResolver.isWallet2() && !cardTypesResolver.isTangemWallet()) { @@ -27,11 +30,14 @@ fun CardDTO.supportedBlockchains(cardTypesResolver: CardTypesResolver): List { - val tokensSupportedByBlockchain = supportedBlockchains(cardTypesResolver) +fun CardDTO.supportedTokens( + cardTypesResolver: CardTypesResolver, + excludedBlockchains: ExcludedBlockchains, +): List { + val tokensSupportedByBlockchain = supportedBlockchains(cardTypesResolver, excludedBlockchains) .filter { it.canHandleTokens() } .toMutableList() val tokensSupportedByCard = when { @@ -68,10 +74,14 @@ fun CardDTO.canHandleToken( } } -fun CardDTO.canHandleToken(blockchain: Blockchain, cardTypesResolver: CardTypesResolver): Boolean { +fun CardDTO.canHandleToken( + blockchain: Blockchain, + cardTypesResolver: CardTypesResolver, + excludedBlockchains: ExcludedBlockchains, +): Boolean { val cardConfig = CardConfig.createConfig(this) val primaryCurveForBlockchain = cardConfig.primaryCurve(blockchain) - val isContainsBlockchain = this.supportedTokens(cardTypesResolver).contains(blockchain) + val isContainsBlockchain = blockchain in supportedTokens(cardTypesResolver, excludedBlockchains) val isWalletForCurveExists = wallets.any { it.curve == primaryCurveForBlockchain } // fixme: check for first wallets with 1 curve and remove condition return if (cardTypesResolver.isTangemWallet() || cardTypesResolver.isWallet2()) { @@ -82,10 +92,14 @@ fun CardDTO.canHandleToken(blockchain: Blockchain, cardTypesResolver: CardTypesR } } -fun CardDTO.canHandleBlockchain(blockchain: Blockchain, cardTypesResolver: CardTypesResolver): Boolean { +fun CardDTO.canHandleBlockchain( + blockchain: Blockchain, + cardTypesResolver: CardTypesResolver, + excludedBlockchains: ExcludedBlockchains, +): Boolean { val cardConfig = CardConfig.createConfig(this) val primaryCurveForBlockchain = cardConfig.primaryCurve(blockchain) - val isContainsBlockchain = this.supportedBlockchains(cardTypesResolver).contains(blockchain) + val isContainsBlockchain = blockchain in supportedBlockchains(cardTypesResolver, excludedBlockchains) val isWalletForCurveExists = wallets.any { it.curve == primaryCurveForBlockchain } // fixme: check for first wallets with 1 curve and remove condition return if (cardTypesResolver.isTangemWallet() || cardTypesResolver.isWallet2()) { diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt index b6d4827fda..5121d721b4 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt @@ -3,6 +3,7 @@ package com.tangem.features.markets.details.impl.model import androidx.compose.runtime.Stable import arrow.core.Either import arrow.core.getOrElse +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.common.ui.charts.state.MarketChartData import com.tangem.common.ui.charts.state.MarketChartDataProducer import com.tangem.common.ui.charts.state.sorted @@ -64,6 +65,7 @@ internal class MarketsTokenDetailsModel @Inject constructor( private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val urlOpener: UrlOpener, private val analyticsEventHandler: AnalyticsEventHandler, + private val excludedBlockchains: ExcludedBlockchains, ) : Model() { private var quotesJob = JobHolder() @@ -400,7 +402,7 @@ internal class MarketsTokenDetailsModel @Inject constructor( } val networks = newInfo.networks?.filter { - BlockchainUtils.isSupportedNetworkId(it.networkId) + BlockchainUtils.isSupportedNetworkId(it.networkId, excludedBlockchains) } networksState.value = if (networks.isNullOrEmpty()) { diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt index c0c257c1c9..ae6768f793 100644 --- a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt @@ -2,6 +2,7 @@ package com.tangem.feature.referral.data import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.datasource.api.tangemTech.TangemTechApi @@ -18,14 +19,18 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext import javax.inject.Inject +@Suppress("LongParameterList") internal class ReferralRepositoryImpl @Inject constructor( private val referralApi: TangemTechApi, private val referralConverter: ReferralConverter, private val coroutineDispatcher: CoroutineDispatcherProvider, private val demoModeDatasource: DemoModeDatasource, private val userWalletsStore: UserWalletsStore, + excludedBlockchains: ExcludedBlockchains, ) : ReferralRepository { + private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains) + override val isDemoMode: Boolean get() = demoModeDatasource.isDemoModeActive @@ -65,8 +70,6 @@ internal class ReferralRepositoryImpl @Inject constructor( val blockchain = Blockchain.fromNetworkId(tokenData.networkId) ?: error("Blockchain ${tokenData.networkId} not found") - val cryptoCurrencyFactory = CryptoCurrencyFactory() - val contractAddress = tokenData.contractAddress val decimalCount = tokenData.decimalCount return if (contractAddress != null && decimalCount != null) { diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt index 6c0f5e9c47..7d01957033 100644 --- a/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/di/ReferralRepositoryModule.kt @@ -1,5 +1,6 @@ package com.tangem.feature.referral.di +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.demo.DemoModeDatasource import com.tangem.datasource.local.userwallet.UserWalletsStore @@ -25,6 +26,7 @@ class ReferralRepositoryModule { coroutineDispatcherProvider: CoroutineDispatcherProvider, demoModeDatasource: DemoModeDatasource, userWalletsStore: UserWalletsStore, + excludedBlockchains: ExcludedBlockchains, ): ReferralRepository { return ReferralRepositoryImpl( referralApi = tangemTechApi, @@ -32,6 +34,7 @@ class ReferralRepositoryModule { coroutineDispatcher = coroutineDispatcherProvider, demoModeDatasource = demoModeDatasource, userWalletsStore = userWalletsStore, + excludedBlockchains = excludedBlockchains, ) } } \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt index 0548a65ea7..8e465b9c2b 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt @@ -7,6 +7,7 @@ import arrow.core.raise.either import arrow.core.right import com.squareup.moshi.Moshi import com.tangem.blockchain.common.* +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.datasource.api.common.response.ApiResponse @@ -48,12 +49,13 @@ internal class DefaultSwapRepository( private val errorsDataConverter: ErrorsDataConverter, private val dataSignatureVerifier: DataSignatureVerifier, moshi: Moshi, + excludedBlockchains: ExcludedBlockchains, ) : SwapRepository { private val expressDataConverter = ExpressDataConverter() private val leastTokenInfoConverter = LeastTokenInfoConverter() private val swapPairInfoConverter = SwapPairInfoConverter() - private val cryptoCurrencyFactory = CryptoCurrencyFactory() + private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains) private val exchangeStatusConverter = ExchangeStatusConverter() private val txDetailsMoshiAdapter = moshi.adapter(TxDetails::class.java) diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt index 9b44aacbef..ed7aa550c5 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectList @@ -18,12 +19,13 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext -class DefaultSwapTransactionRepository( +internal class DefaultSwapTransactionRepository( private val appPreferencesStore: AppPreferencesStore, private val dispatchers: CoroutineDispatcherProvider, + excludedBlockchains: ExcludedBlockchains, ) : SwapTransactionRepository { - private val converter = SavedSwapTransactionListConverter() + private val converter = SavedSwapTransactionListConverter(excludedBlockchains) override suspend fun storeTransaction( userWalletId: UserWalletId, diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SavedSwapTransactionListConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SavedSwapTransactionListConverter.kt index 33112a9591..d3d6093b01 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SavedSwapTransactionListConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SavedSwapTransactionListConverter.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap.converters +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory import com.tangem.data.common.currency.UserTokensResponseFactory import com.tangem.domain.models.scan.ScanResponse @@ -11,10 +12,11 @@ import com.tangem.feature.swap.domain.models.domain.SavedSwapTransactionListMode import com.tangem.feature.swap.domain.models.domain.SavedSwapTransactionModel import com.tangem.utils.converter.Converter -class SavedSwapTransactionListConverter : - Converter { +internal class SavedSwapTransactionListConverter( + excludedBlockchains: ExcludedBlockchains, +) : Converter { - private val responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory() + private val responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory(excludedBlockchains) private val userTokensResponseFactory = UserTokensResponseFactory() override fun convert(value: SavedSwapTransactionListModel) = SavedSwapTransactionListModelInner( 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 fde540c8ab..5a1b3dcf85 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,6 +1,7 @@ package com.tangem.feature.swap.di import com.squareup.moshi.Moshi +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.datasource.api.express.TangemExpressApi import com.tangem.datasource.api.express.models.response.ExpressErrorResponse import com.tangem.datasource.crypto.DataSignatureVerifier @@ -34,6 +35,7 @@ internal class SwapDataModule { userWalletsListManager: UserWalletsListManager, errorsDataConverter: ErrorsDataConverter, @NetworkMoshi moshi: Moshi, + excludedBlockchains: ExcludedBlockchains, ): SwapRepository { return DefaultSwapRepository( tangemExpressApi = tangemExpressApi, @@ -43,6 +45,7 @@ internal class SwapDataModule { errorsDataConverter = errorsDataConverter, dataSignatureVerifier = dataSignature, moshi = moshi, + excludedBlockchains = excludedBlockchains, ) } @@ -51,10 +54,12 @@ internal class SwapDataModule { fun provideSwapTransactionRepository( appPreferencesStore: AppPreferencesStore, dispatcherProvider: CoroutineDispatcherProvider, + excludedBlockchains: ExcludedBlockchains, ): SwapTransactionRepository { return DefaultSwapTransactionRepository( appPreferencesStore = appPreferencesStore, dispatchers = dispatcherProvider, + excludedBlockchains = excludedBlockchains, ) } diff --git a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt index a9830d7036..2d32f24015 100644 --- a/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt +++ b/libs/blockchain-sdk/src/main/java/com/tangem/blockchainsdk/utils/Blockchain.kt @@ -387,10 +387,6 @@ fun Blockchain.toMigratedCointId(): String = when (this) { else -> toCoinId() } -fun Blockchain.isSupportedInApp(): Boolean { - return !excludedBlockchains.contains(this) -} - fun Blockchain.amountToCreateAccount(token: Token? = null): BigDecimal? { return when (this) { Blockchain.Stellar -> if (token?.symbol == NODL) BigDecimal(NODL_AMOUNT_TO_CREATE_ACCOUNT) else BigDecimal.ONE @@ -409,11 +405,4 @@ fun Blockchain.minimalAmount(): BigDecimal { } private const val NODL = "NODL" -private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 - -// no need to add testnets -private val excludedBlockchains = listOf( - Blockchain.Unknown, - Blockchain.Nexa, - Blockchain.NexaTestnet, -) \ No newline at end of file +private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5 \ No newline at end of file diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt index c2205435c2..456959fddd 100644 --- a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt +++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt @@ -3,8 +3,8 @@ package com.tangem.lib.crypto import com.tangem.blockchain.blockchains.xrp.XrpAddressService import com.tangem.blockchain.common.Blockchain import com.tangem.blockchainsdk.compatibility.l2BlockchainsList +import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.fromNetworkId -import com.tangem.blockchainsdk.utils.isSupportedInApp import com.tangem.lib.crypto.converter.XrpTaggedAddressConverter import com.tangem.lib.crypto.models.XrpTaggedAddress @@ -64,8 +64,10 @@ object BlockchainUtils { return blockchain == Blockchain.Tron || blockchain == Blockchain.TronTestnet } - fun isSupportedNetworkId(blockchainId: String): Boolean { - return Blockchain.fromNetworkId(blockchainId)?.isSupportedInApp() ?: false + fun isSupportedNetworkId(blockchainId: String, excludedBlockchains: ExcludedBlockchains): Boolean { + val blockchain = Blockchain.fromNetworkId(blockchainId) + + return blockchain != null && blockchain !in excludedBlockchains } fun isArbitrum(blockchainId: String): Boolean {