From 24d163b5e72dd438953b95de58d7a92c72c451ba Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 23 Jan 2026 17:15:32 +0300 Subject: [PATCH] Updated on 2026-08-14 --- data/manage-tokens/build.gradle.kts | 2 ++ .../utils/ManagedCryptoCurrencyFactory.kt | 10 ++++++++++ data/markets/build.gradle.kts | 3 +++ .../converters/TokenMarketInfoConverter.kt | 9 +++++---- .../com/tangem/lib/crypto/BlockchainUtils.kt | 17 +++++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/data/manage-tokens/build.gradle.kts b/data/manage-tokens/build.gradle.kts index bc3abef19a..ce17fcef05 100644 --- a/data/manage-tokens/build.gradle.kts +++ b/data/manage-tokens/build.gradle.kts @@ -13,6 +13,8 @@ android { } dependencies { + /** Libs */ + implementation(projects.libs.crypto) /** Project - Domain */ implementation(projects.domain.account) 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 49ec7c78de..22beb60476 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 @@ -23,6 +23,7 @@ import com.tangem.domain.models.network.Network import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.wallets.derivations.DerivationStyleProvider import com.tangem.domain.wallets.derivations.derivationStyleProvider +import com.tangem.lib.crypto.BlockchainUtils import timber.log.Timber internal class ManagedCryptoCurrencyFactory( @@ -183,6 +184,7 @@ internal class ManagedCryptoCurrencyFactory( val availableNetworks = coinResponse.networks .applyL2Compatibility(coinResponse.id) + .filterTerraTokens(coinResponse.id) .mapNotNull { network -> createSource( networkId = network.networkId, @@ -300,6 +302,14 @@ internal class ManagedCryptoCurrencyFactory( derivationStyleProvider: DerivationStyleProvider, ): Boolean = derivationPath != blockchain.derivationPath(derivationStyleProvider.getDerivationStyle())?.rawPath + /** + * Filter tokens for TerraV1 (Terra Classic) network. + * Only native coin (LUNC) and TerraClassicUSD (USTC) are allowed. + */ + private fun List.filterTerraTokens(coinId: String): List { + return filter { network -> BlockchainUtils.isNotBlockedByTerraV1Filter(network.networkId, coinId) } + } + private companion object { const val DEFAULT_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api/coins/" } diff --git a/data/markets/build.gradle.kts b/data/markets/build.gradle.kts index dec987eadb..1678a61ead 100644 --- a/data/markets/build.gradle.kts +++ b/data/markets/build.gradle.kts @@ -14,6 +14,9 @@ android { } dependencies { + /** Libs */ + implementation(projects.libs.crypto) + implementation(projects.core.datasource) implementation(projects.core.utils) implementation(projects.core.pagination) 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 a1044051b9..347370d0a9 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 @@ -8,6 +8,7 @@ import com.tangem.datasource.api.markets.models.response.TokenMarketInfoResponse import com.tangem.domain.markets.BuildConfig import com.tangem.domain.markets.TokenMarketInfo import com.tangem.domain.markets.TokenQuotes +import com.tangem.lib.crypto.BlockchainUtils import com.tangem.utils.converter.Converter import java.math.BigDecimal @@ -22,7 +23,7 @@ internal class TokenMarketInfoConverter( name = name, symbol = symbol, quotes = getQuotes(), - networks = networks?.convert(), + networks = networks?.convert(coinId = id), shortDescription = shortDescription, fullDescription = fullDescription, insights = insights?.convert(), @@ -55,7 +56,7 @@ internal class TokenMarketInfoConverter( } @JvmName("convertNetwork") - private fun List.convert(): List { + private fun List.convert(coinId: String): List { return mapNotNull { network -> val blockchain = Blockchain.fromNetworkId(network.networkId) when { @@ -68,7 +69,8 @@ internal class TokenMarketInfoConverter( ) } blockchain != null && blockchain !in excludedBlockchains && - blockchain.canHandleTokens() -> { + blockchain.canHandleTokens() && + BlockchainUtils.isNotBlockedByTerraV1Filter(network.networkId, coinId) -> { TokenMarketInfo.Network( networkId = network.networkId, isExchangeable = network.exchangeable, @@ -195,7 +197,6 @@ internal class TokenMarketInfoConverter( } private companion object { - const val PROD_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api/security_provider/" const val DEV_IMAGE_HOST = "https://s3.eu-central-1.amazonaws.com/tangem.api.dev/security_provider/" } 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 76d81ec009..81838cfdbb 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 @@ -21,6 +21,8 @@ import java.math.BigDecimal object BlockchainUtils { private const val XRP_X_ADDRESS = 'X' + private const val TERRA_CLASSIC_USD_COIN_ID = "terrausd" + private const val TERRA_LUNA_CLASSIC_COIN_ID = "terra-luna" const val SOLANA_TRANSACTION_SIZE_THRESHOLD_BYTES = 930 /** Decodes XRP Blockchain address */ @@ -191,4 +193,19 @@ object BlockchainUtils { private fun getNetworkNameWithoutTestnet(blockchain: Blockchain): String { return blockchain.fullName.replace(oldValue = " Testnet", newValue = "") } + + /** + * Checks if token is not blocked by TerraV1 (Terra Classic) filter. + * For non-TerraV1 networks, tokens are never blocked. + * For TerraV1 network, all tokens are blocked except native coin (LUNC) and TerraClassicUSD (USTC). + * + * @param networkId network ID (e.g. "terra") + * @param coinId token/coin ID (e.g. "terrausd") + * @return true if token is not blocked, false otherwise + */ + fun isNotBlockedByTerraV1Filter(networkId: String, coinId: String): Boolean { + return Blockchain.fromNetworkId(networkId) != Blockchain.TerraV1 || + coinId == TERRA_CLASSIC_USD_COIN_ID || + coinId == TERRA_LUNA_CLASSIC_COIN_ID + } } \ No newline at end of file