diff --git a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/test/TestAddCostomTokenActions.kt b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/test/TestAddCostomTokenActions.kt index 1a2a44613d..ea41adc0e6 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/test/TestAddCostomTokenActions.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/test/TestAddCostomTokenActions.kt @@ -63,7 +63,7 @@ private fun AllInOne() { address = "0x1111111111111111112111111111111111111113" ) ContractAddressButton( - name = "full unk", + name = "full custom", address = "0x3019BF2a2eF8040C242C9a4c5c4BD4C81678b2A1", tokenNetwork = Blockchain.Ethereum, tokenName = "Test unknown", diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt index ac4ce3a994..868ab66b95 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/AddCustomTokenService.kt @@ -1,8 +1,6 @@ package com.tangem.domain.features.addCustomToken -import com.tangem.blockchain.common.Blockchain import com.tangem.common.services.Result -import com.tangem.domain.common.extensions.toNetworkId import com.tangem.network.api.tangemTech.CoinsResponse import com.tangem.network.api.tangemTech.TangemTechService @@ -10,7 +8,8 @@ import com.tangem.network.api.tangemTech.TangemTechService [REDACTED_AUTHOR] */ class AddCustomTokenService( - private val tangemTechService: TangemTechService + private val tangemTechService: TangemTechService, + private val supportedTokenNetworkIds: List, ) { suspend fun findToken( @@ -26,8 +25,7 @@ class AddCustomTokenService( val networksWithTheSameAddress = coin.networks .filter { it.contractAddress != null || it.decimalCount != null } .filter { it.contractAddress == contractAddress } - //TODO: Solana token - .filter { it.networkId != Blockchain.Solana.toNetworkId() } + .filter { supportedTokenNetworkIds.contains(it.networkId) } if (networksWithTheSameAddress.isNotEmpty()) { val newToken = coin.copy(networks = networksWithTheSameAddress) coinsList.add(newToken) diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt index b895c985ba..0353f8cfb9 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenHub.kt @@ -530,7 +530,11 @@ internal class AddCustomTokenHub : BaseStoreHub("AddCustomT } is OnCreate -> { val card = requireNotNull(globalState.scanResponse?.card) - val tangemTechServiceManager = AddCustomTokenService(globalState.networkServices.tangemTechService) + val supportedTokenNetworkIds = AddCustomTokenState.getSupportedTokens().map { it.toNetworkId() } + val tangemTechServiceManager = AddCustomTokenService( + tangemTechService = globalState.networkServices.tangemTechService, + supportedTokenNetworkIds = supportedTokenNetworkIds + ) var derivationPathState = state.screenState.derivationPath derivationPathState = when (card.derivationStyle) { diff --git a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt index 5476567b36..b985f0c17e 100644 --- a/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt +++ b/domain/src/main/java/com/tangem/domain/features/addCustomToken/redux/AddCustomTokenState.kt @@ -132,7 +132,7 @@ data class AddCustomTokenState( } fun getNetworks(type: CustomTokenType): List { - return getSupportedNetworks(type) + return getNetworksList(type) } companion object { @@ -141,7 +141,7 @@ data class AddCustomTokenState( * If an user select derivation path (derivationNetwork) as Blockchain.Unknown, * then we should use a blockchain from the mainNetwork to determine a DerivationPath */ - fun getDerivationPath( + internal fun getDerivationPath( mainNetwork: Blockchain, derivationNetwork: Blockchain, derivationStyle: DerivationStyle? @@ -153,7 +153,7 @@ data class AddCustomTokenState( internal fun createFormFields(type: CustomTokenType): List> { return listOf( TokenField(ContractAddress), - TokenBlockchainField(Network, getSupportedNetworks(type)), + TokenBlockchainField(Network, getNetworksList(type)), TokenField(Name), TokenField(Symbol), TokenField(Decimals), @@ -161,6 +161,54 @@ data class AddCustomTokenState( ) } + /** + * Serves to determine the tokens that can be received from the TangemTech service + */ + internal fun getSupportedTokens(): List { + val supportedBlockchains = getNetworksList(CustomTokenType.Token).toMutableList() + supportedBlockchains.remove(Blockchain.Unknown) + return supportedBlockchains + } + + /** + * Serves to determine the networks (blockchains & tokens) that can be selected by Form.Networks. + * Blockchain.Unknown - is the default selection + */ + internal fun getNetworksList(type: CustomTokenType): List { + val default = Blockchain.Unknown + + val evmBlockchains = Blockchain.values() + .filter { it.isEvm() } + .filter { !it.isTestnet() } + + val additionalBlockchains = listOf( + Blockchain.Binance, + Blockchain.Solana, + ) + + val networks = (evmBlockchains + additionalBlockchains).toMutableList() + networks.add(0, default) + + //life hack + val fwCardVersion = domainStore.state.globalState.scanResponse?.card?.firmwareVersion + ?: FirmwareVersion(0, 0) + + val solanaUnsupportedByCard = fwCardVersion < FirmwareVersion.SolanaAvailable + val solanaTokensUnsupportedByCard = fwCardVersion < FirmwareVersion.SolanaTokensAvailable + if (solanaUnsupportedByCard || solanaTokensUnsupportedByCard) networks.remove(Blockchain.Solana) + + networks.removeAll(getNetworksUnsupportedByApp(type)) + + return networks + } + + private fun getNetworksUnsupportedByApp(type: CustomTokenType): List { + return when (type) { + CustomTokenType.Token -> listOf(Blockchain.Solana) + CustomTokenType.Blockchain -> emptyList() + } + } + private fun createFormValidators(): Map> { return mapOf( ContractAddress to TokenContractAddressValidator(), @@ -171,31 +219,6 @@ data class AddCustomTokenState( ) } - private fun getSupportedNetworks(type: CustomTokenType): List { - val networks = mutableListOf( - Blockchain.Unknown, - Blockchain.Ethereum, - Blockchain.BSC, - Blockchain.Polygon, - Blockchain.Avalanche, - Blockchain.Fantom, - Blockchain.Binance, // not evm - Blockchain.Solana, // not evm - ) - //life hack - val fwCardVersion = domainStore.state.globalState.scanResponse?.card?.firmwareVersion - ?: FirmwareVersion(0, 0) - - val solanaUnsupportedByCard = fwCardVersion < FirmwareVersion.SolanaAvailable - val solanaTokensUnsupportedByCard = fwCardVersion < FirmwareVersion.SolanaTokensAvailable - if (solanaUnsupportedByCard || solanaTokensUnsupportedByCard) networks.remove(Blockchain.Solana) - - //TODO: Solana - if (type == CustomTokenType.Token) networks.remove(Blockchain.Solana) - - return networks - } - private fun getSupportedDerivations(): List { val evmBlockchains = Blockchain.values().filter { !it.isTestnet() && it.getChainId() != null