diff --git a/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt b/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt index 86dfb3f5d9..f9e23d40cd 100644 --- a/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt +++ b/data/nft/src/main/kotlin/com/tangem/data/nft/DefaultNFTRepository.kt @@ -16,6 +16,8 @@ import com.tangem.datasource.local.nft.converter.NFTSdkAssetSalePriceConverter import com.tangem.datasource.local.nft.converter.NFTSdkCollectionConverter import com.tangem.datasource.local.nft.converter.NFTSdkCollectionIdentifierConverter import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.common.extensions.canHandleToken +import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.models.StatusSource import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network @@ -50,7 +52,7 @@ internal class DefaultNFTRepository @Inject constructor( private val userWalletsStore: UserWalletsStore, private val nftFeatureToggles: NFTFeatureToggles, private val networkFactory: NetworkFactory, - excludedBlockchains: ExcludedBlockchains, + private val excludedBlockchains: ExcludedBlockchains, resources: Resources, ) : NFTRepository { @@ -123,7 +125,7 @@ internal class DefaultNFTRepository @Inject constructor( private suspend fun observeCollectionsInternal( userWalletId: UserWalletId, network: Network, - ): Flow = if (network.canHandleNFTs()) { + ): Flow = if (network.canHandleNFTs(userWalletId)) { getNFTRuntimeStore(userWalletId, network).getCollections() } else { flowOf(NFTCollections.empty(network)) @@ -194,13 +196,14 @@ internal class DefaultNFTRepository @Inject constructor( }.saveIn(getCollectionJobHolder(collectionId)).join() } - override suspend fun isNFTSupported(network: Network): Boolean = network.canHandleNFTs() + override suspend fun isNFTSupported(userWalletId: UserWalletId, network: Network): Boolean = + network.canHandleNFTs(userWalletId) override suspend fun getNFTSupportedNetworks(userWalletId: UserWalletId): List { val userWallet = userWalletsStore.getSyncStrict(userWalletId) return Blockchain .entries - .filter { it.canHandleNFTs() && !it.isTestnet() } + .filter { !it.isTestnet() } .mapNotNull { networkFactory.create( blockchain = it, @@ -208,6 +211,7 @@ internal class DefaultNFTRepository @Inject constructor( scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY] ) } + .filter { it.canHandleNFTs(userWalletId) } } override suspend fun getNFTExploreUrl(network: Network, assetIdentifier: NFTAsset.Identifier): String? = @@ -229,7 +233,7 @@ internal class DefaultNFTRepository @Inject constructor( refreshAssets: Boolean, ) = coroutineScope { networks.mapNotNull { network -> - if (network.canHandleNFTs()) { + if (network.canHandleNFTs(userWalletId)) { launch(dispatchers.io) { Either.catch { expireCollections(userWalletId, network) @@ -537,14 +541,15 @@ internal class DefaultNFTRepository @Inject constructor( return walletId.stringValue + "_" + network.rawId + "_" + network.derivationPath.value } - private fun Network.canHandleNFTs(): Boolean { + private fun Network.canHandleNFTs(userWalletId: UserWalletId): Boolean { + val scanResponse = userWalletsStore.getSyncStrict(userWalletId).requireColdWallet().scanResponse val blockchain = Blockchain.fromNetworkId(backendId) return when { blockchain == null -> false blockchain.isEvm() && !nftFeatureToggles.isNFTEVMEnabled -> false - (blockchain == Blockchain.Solana || blockchain == Blockchain.SolanaTestnet) && - !nftFeatureToggles.isNFTSolanaEnabled -> false - else -> blockchain.canHandleNFTs() + blockchain == Blockchain.Solana && !nftFeatureToggles.isNFTSolanaEnabled -> false + else -> blockchain.canHandleNFTs() && + scanResponse.card.canHandleToken(blockchain, scanResponse.cardTypesResolver, excludedBlockchains) } } } \ No newline at end of file diff --git a/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworksUseCase.kt b/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworksUseCase.kt index 8a87f0ca6f..ccbaf5c789 100644 --- a/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworksUseCase.kt +++ b/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworksUseCase.kt @@ -16,7 +16,7 @@ class GetNFTNetworksUseCase( .map { cryptoCurrencies -> val availableNetworks = cryptoCurrencies .map { cryptoCurrency -> cryptoCurrency.network } - .filter { nftRepository.isNFTSupported(it) } + .filter { nftRepository.isNFTSupported(userWalletId, it) } .sortedBy { it.name } val unavailableNetworks = nftRepository diff --git a/domain/nft/src/main/kotlin/com/tangem/domain/nft/repository/NFTRepository.kt b/domain/nft/src/main/kotlin/com/tangem/domain/nft/repository/NFTRepository.kt index f656ab2301..8312f91dbe 100644 --- a/domain/nft/src/main/kotlin/com/tangem/domain/nft/repository/NFTRepository.kt +++ b/domain/nft/src/main/kotlin/com/tangem/domain/nft/repository/NFTRepository.kt @@ -27,7 +27,7 @@ interface NFTRepository { suspend fun refreshAll(userWalletId: UserWalletId, networks: List) - suspend fun isNFTSupported(network: Network): Boolean + suspend fun isNFTSupported(userWalletId: UserWalletId, network: Network): Boolean suspend fun getNFTSupportedNetworks(userWalletId: UserWalletId): List