Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-23 17:15:32 +03:00
parent 035a094201
commit 24d163b5e7
5 changed files with 37 additions and 4 deletions

View file

@ -13,6 +13,8 @@ android {
}
dependencies {
/** Libs */
implementation(projects.libs.crypto)
/** Project - Domain */
implementation(projects.domain.account)

View file

@ -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<CoinsResponse.Coin.Network>.filterTerraTokens(coinId: String): List<CoinsResponse.Coin.Network> {
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/"
}

View file

@ -14,6 +14,9 @@ android {
}
dependencies {
/** Libs */
implementation(projects.libs.crypto)
implementation(projects.core.datasource)
implementation(projects.core.utils)
implementation(projects.core.pagination)

View file

@ -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<TokenMarketInfoResponse.Network>.convert(): List<TokenMarketInfo.Network> {
private fun List<TokenMarketInfoResponse.Network>.convert(coinId: String): List<TokenMarketInfo.Network> {
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/"
}

View file

@ -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
}
}