Updated on 2026-08-14

This commit is contained in:
Tangem 2025-05-22 16:04:01 +04:00
parent a667fcc955
commit db6157cae4
20 changed files with 435 additions and 500 deletions

View file

@ -7,7 +7,8 @@ import com.tangem.crypto.hdWallet.DerivationPath
import com.tangem.data.common.currency.CryptoCurrencyFactory
import com.tangem.data.common.currency.UserTokensResponseFactory
import com.tangem.data.common.currency.UserTokensSaver
import com.tangem.data.common.currency.getNetwork
import com.tangem.data.common.currency.getBlockchain
import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.managetokens.utils.TokenAddressesConverter
import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi
@ -38,6 +39,7 @@ internal class DefaultCustomTokensRepository(
private val excludedBlockchains: ExcludedBlockchains,
private val dispatchers: CoroutineDispatcherProvider,
private val userTokensSaver: UserTokensSaver,
private val networkFactory: NetworkFactory,
) : CustomTokensRepository {
private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains)
@ -74,7 +76,7 @@ internal class DefaultCustomTokensRepository(
}
storedCurrencies.tokens.none { token ->
Blockchain.fromId(networkId.rawId.value).toNetworkId() == token.networkId &&
getBlockchain(networkId).toNetworkId() == token.networkId &&
derivationPath.value == token.derivationPath &&
contractAddress.equals(token.contractAddress, ignoreCase = true)
}
@ -91,7 +93,11 @@ internal class DefaultCustomTokensRepository(
"User wallet [$userWalletId] not found while finding token"
}
val network = requireNotNull(
getNetwork(networkId, derivationPath, userWallet.scanResponse, excludedBlockchains),
networkFactory.create(
networkId = networkId,
derivationPath = derivationPath,
scanResponse = userWallet.scanResponse,
),
) {
"Network [$networkId] not found while finding token"
}
@ -143,7 +149,11 @@ internal class DefaultCustomTokensRepository(
"User wallet [$userWalletId] not found while creating coin"
}
val network = requireNotNull(
getNetwork(networkId, derivationPath, userWallet.scanResponse, excludedBlockchains),
networkFactory.create(
networkId = networkId,
derivationPath = derivationPath,
scanResponse = userWallet.scanResponse,
),
) {
"Network [$networkId] not found while creating coin"
}
@ -176,7 +186,11 @@ internal class DefaultCustomTokensRepository(
"User wallet [$userWalletId] not found while creating custom token"
}
val network = requireNotNull(
getNetwork(networkId, derivationPath, userWallet.scanResponse, excludedBlockchains),
networkFactory.create(
networkId = networkId,
derivationPath = derivationPath,
scanResponse = userWallet.scanResponse,
),
) {
"Network [$networkId] not found while creating custom token"
}
@ -246,11 +260,10 @@ internal class DefaultCustomTokensRepository(
)
if (canHandleBlockchain) {
getNetwork(
networkFactory.create(
blockchain = blockchain,
extraDerivationPath = null,
scanResponse = scanResponse,
excludedBlockchains = excludedBlockchains,
)
} else {
null

View file

@ -9,6 +9,7 @@ import com.tangem.data.common.api.safeApiCall
import com.tangem.data.common.currency.CardCryptoCurrencyFactory
import com.tangem.data.common.currency.UserTokensResponseFactory
import com.tangem.data.common.currency.getBlockchain
import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.common.utils.retryOnError
import com.tangem.data.managetokens.utils.ManageTokensUpdateFetcher
import com.tangem.data.managetokens.utils.ManagedCryptoCurrencyFactory
@ -49,9 +50,10 @@ internal class DefaultManageTokensRepository(
private val excludedBlockchains: ExcludedBlockchains,
private val cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
private val dispatchers: CoroutineDispatcherProvider,
networkFactory: NetworkFactory,
) : ManageTokensRepository {
private val managedCryptoCurrencyFactory = ManagedCryptoCurrencyFactory(excludedBlockchains)
private val managedCryptoCurrencyFactory = ManagedCryptoCurrencyFactory(networkFactory, excludedBlockchains)
private val userTokensResponseFactory = UserTokensResponseFactory()
// region getTokenListBatchFlow

View file

@ -3,6 +3,7 @@ package com.tangem.data.managetokens.di
import com.tangem.blockchainsdk.utils.ExcludedBlockchains
import com.tangem.data.common.currency.CardCryptoCurrencyFactory
import com.tangem.data.common.currency.UserTokensSaver
import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.managetokens.DefaultCustomTokensRepository
import com.tangem.data.managetokens.DefaultManageTokensRepository
import com.tangem.data.managetokens.utils.ManageTokensUpdateFetcher
@ -35,6 +36,7 @@ internal object ManageTokensDataModule {
dispatchers: CoroutineDispatcherProvider,
excludedBlockchains: ExcludedBlockchains,
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
networkFactory: NetworkFactory,
): ManageTokensRepository {
return DefaultManageTokensRepository(
tangemTechApi = tangemTechApi,
@ -44,6 +46,7 @@ internal object ManageTokensDataModule {
testnetTokensStorage = testnetTokensStorage,
excludedBlockchains = excludedBlockchains,
cardCryptoCurrencyFactory = cardCryptoCurrencyFactory,
networkFactory = networkFactory,
dispatchers = dispatchers,
)
}
@ -58,6 +61,7 @@ internal object ManageTokensDataModule {
dispatchers: CoroutineDispatcherProvider,
excludedBlockchains: ExcludedBlockchains,
userTokensSaver: UserTokensSaver,
networkFactory: NetworkFactory,
): CustomTokensRepository {
return DefaultCustomTokensRepository(
tangemTechApi = tangemTechApi,
@ -67,6 +71,7 @@ internal object ManageTokensDataModule {
excludedBlockchains = excludedBlockchains,
dispatchers = dispatchers,
userTokensSaver = userTokensSaver,
networkFactory = networkFactory,
)
}
}

View file

@ -8,8 +8,8 @@ import com.tangem.blockchainsdk.utils.ExcludedBlockchains
import com.tangem.blockchainsdk.utils.fromNetworkId
import com.tangem.blockchainsdk.utils.toCoinId
import com.tangem.data.common.currency.getCoinId
import com.tangem.data.common.currency.getNetwork
import com.tangem.data.common.currency.getTokenId
import com.tangem.data.common.network.NetworkFactory
import com.tangem.datasource.api.tangemTech.models.CoinsResponse
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.config.testnet.models.TestnetTokensConfig
@ -25,6 +25,7 @@ import com.tangem.domain.models.scan.ScanResponse
import timber.log.Timber
internal class ManagedCryptoCurrencyFactory(
private val networkFactory: NetworkFactory,
private val excludedBlockchains: ExcludedBlockchains,
) {
@ -98,11 +99,10 @@ internal class ManagedCryptoCurrencyFactory(
return null
}
val network = getNetwork(
val network = networkFactory.create(
blockchain = blockchain,
extraDerivationPath = token.derivationPath,
scanResponse = scanResponse,
excludedBlockchains = excludedBlockchains,
) ?: return null
val contractAddress = token.contractAddress
@ -172,11 +172,10 @@ internal class ManagedCryptoCurrencyFactory(
?.takeUnless { it in excludedBlockchains }
?: return null
val network = getNetwork(
blockchain,
extraDerivationPath,
scanResponse?.derivationStyleProvider,
excludedBlockchains,
val network = networkFactory.create(
blockchain = blockchain,
extraDerivationPath = extraDerivationPath,
derivationStyleProvider = scanResponse?.derivationStyleProvider,
canHandleTokens = scanResponse?.let {
it.card.canHandleToken(blockchain, it.cardTypesResolver, excludedBlockchains)
} ?: true,
@ -217,11 +216,10 @@ internal class ManagedCryptoCurrencyFactory(
val blockchain = Blockchain.fromNetworkId(token.networkId)
if (blockchain != null && blockchain !in excludedBlockchains) {
getNetwork(
blockchain,
token.derivationPath,
scanResponse?.derivationStyleProvider,
excludedBlockchains,
networkFactory.create(
blockchain = blockchain,
extraDerivationPath = token.derivationPath,
derivationStyleProvider = scanResponse?.derivationStyleProvider,
canHandleTokens = scanResponse?.let {
it.card.canHandleToken(blockchain, it.cardTypesResolver, excludedBlockchains)
} ?: true,