Updated on 2026-08-14

This commit is contained in:
Tangem 2025-07-16 13:35:39 +03:00
parent 8541957ee3
commit 189ffd9927
73 changed files with 547 additions and 409 deletions

View file

@ -95,7 +95,7 @@ internal class DefaultCustomTokensRepository(
networkFactory.create(
networkId = networkId,
derivationPath = derivationPath,
scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY]
userWallet = userWallet,
),
) {
"Network [$networkId] not found while finding token"
@ -106,8 +106,8 @@ internal class DefaultCustomTokensRepository(
symbol = null,
)
val supportedTokenNetworkIds = userWallet.scanResponse.card
.supportedBlockchains(userWallet.scanResponse.cardTypesResolver, excludedBlockchains)
val supportedTokenNetworkIds = userWallet
.supportedBlockchains(excludedBlockchains = excludedBlockchains)
.filter(Blockchain::canHandleTokens)
.map(Blockchain::toNetworkId)
@ -151,7 +151,7 @@ internal class DefaultCustomTokensRepository(
networkFactory.create(
networkId = networkId,
derivationPath = derivationPath,
scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY]
userWallet = userWallet,
),
) {
"Network [$networkId] not found while creating coin"
@ -188,7 +188,7 @@ internal class DefaultCustomTokensRepository(
networkFactory.create(
networkId = networkId,
derivationPath = derivationPath,
scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY]
userWallet = userWallet,
),
) {
"Network [$networkId] not found while creating custom token"
@ -261,7 +261,7 @@ internal class DefaultCustomTokensRepository(
networkFactory.create(
blockchain = blockchain,
extraDerivationPath = null,
scanResponse = scanResponse,
userWallet = userWallet,
)
} else {
null

View file

@ -31,7 +31,6 @@ import com.tangem.domain.managetokens.repository.ManageTokensRepository
import com.tangem.domain.models.network.Network
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.models.requireColdWallet
import com.tangem.pagination.BatchFetchResult
import com.tangem.pagination.BatchListSource
import com.tangem.pagination.fetcher.LimitOffsetBatchFetcher
@ -142,13 +141,13 @@ internal class DefaultManageTokensRepository(
managedCryptoCurrencyFactory.createWithCustomTokens(
coinsResponse = updatedCoinsResponse,
tokensResponse = tokensResponse,
scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY]
userWallet = userWallet,
)
} else {
managedCryptoCurrencyFactory.create(
coinsResponse = updatedCoinsResponse,
tokensResponse = tokensResponse,
scanResponse = userWallet?.requireColdWallet()?.scanResponse, // TODO [REDACTED_TASK_KEY]
userWallet = userWallet,
)
}
@ -178,7 +177,7 @@ internal class DefaultManageTokensRepository(
testnetTokensConfig
},
tokensResponse = getSavedUserTokensResponseSync(userWallet.walletId),
scanResponse = userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY]
userWallet = userWallet,
)
return BatchFetchResult.Success(
@ -190,8 +189,8 @@ internal class DefaultManageTokensRepository(
private fun createDefaultUserTokensResponse(userWallet: UserWallet) =
userTokensResponseFactory.createUserTokensResponse(
currencies = cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyCard(
userWallet.requireColdWallet().scanResponse, // TODO [REDACTED_TASK_KEY]
currencies = cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(
userWallet = userWallet,
),
isGroupedByNetwork = false,
isSortedByBalance = false,

View file

@ -15,13 +15,12 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.config.testnet.models.TestnetTokensConfig
import com.tangem.domain.common.DerivationStyleProvider
import com.tangem.domain.common.extensions.canHandleToken
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.common.util.derivationStyleProvider
import com.tangem.domain.managetokens.model.ManagedCryptoCurrency
import com.tangem.domain.managetokens.model.ManagedCryptoCurrency.SourceNetwork
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.wallets.models.UserWallet
import timber.log.Timber
internal class ManagedCryptoCurrencyFactory(
@ -32,20 +31,20 @@ internal class ManagedCryptoCurrencyFactory(
fun create(
coinsResponse: CoinsResponse,
tokensResponse: UserTokensResponse?,
scanResponse: ScanResponse?,
userWallet: UserWallet?,
): List<ManagedCryptoCurrency> {
return coinsResponse.coins.mapNotNull { coin ->
createToken(coin, tokensResponse, coinsResponse.imageHost, scanResponse)
createToken(coin, tokensResponse, coinsResponse.imageHost, userWallet)
}
}
fun createWithCustomTokens(
coinsResponse: CoinsResponse,
tokensResponse: UserTokensResponse,
scanResponse: ScanResponse,
userWallet: UserWallet,
): List<ManagedCryptoCurrency> {
val customTokens = createCustomTokens(tokensResponse, scanResponse)
val tokens = create(coinsResponse, tokensResponse, scanResponse)
val customTokens = createCustomTokens(tokensResponse, userWallet)
val tokens = create(coinsResponse, tokensResponse, userWallet)
return customTokens + tokens
}
@ -53,10 +52,10 @@ internal class ManagedCryptoCurrencyFactory(
fun createTestnetWithCustomTokens(
testnetTokensConfig: TestnetTokensConfig,
tokensResponse: UserTokensResponse?,
scanResponse: ScanResponse,
userWallet: UserWallet,
): List<ManagedCryptoCurrency> {
val customTokens = tokensResponse
?.let { createCustomTokens(it, scanResponse) }
?.let { createCustomTokens(it, userWallet) }
?: emptyList()
val testnetTokens = testnetTokensConfig.tokens.map { testnetToken ->
ManagedCryptoCurrency.Token(
@ -69,10 +68,10 @@ internal class ManagedCryptoCurrencyFactory(
networkId = network.id,
contractAddress = network.address,
decimals = network.decimalCount,
scanResponse = scanResponse,
userWallet = userWallet,
)
} ?: emptyList(),
addedIn = findAddedInNetworks(testnetToken.id, tokensResponse, scanResponse),
addedIn = findAddedInNetworks(testnetToken.id, tokensResponse, userWallet),
)
}
@ -81,28 +80,28 @@ internal class ManagedCryptoCurrencyFactory(
private fun createCustomTokens(
tokensResponse: UserTokensResponse,
scanResponse: ScanResponse,
userWallet: UserWallet,
): List<ManagedCryptoCurrency> = tokensResponse.tokens
.mapNotNull { token ->
maybeCreateCustomToken(token, scanResponse)
maybeCreateCustomToken(token, userWallet)
}
private fun maybeCreateCustomToken(
token: UserTokensResponse.Token,
scanResponse: ScanResponse,
userWallet: UserWallet,
): ManagedCryptoCurrency? {
val blockchain = Blockchain.fromNetworkId(token.networkId)
?.takeUnless { it in excludedBlockchains }
?: return null
if (!checkIsCustomToken(token, blockchain, scanResponse.derivationStyleProvider)) {
if (!checkIsCustomToken(token, blockchain, userWallet.derivationStyleProvider)) {
return null
}
val network = networkFactory.create(
blockchain = blockchain,
extraDerivationPath = token.derivationPath,
scanResponse = scanResponse,
userWallet = userWallet,
) ?: return null
val contractAddress = token.contractAddress
@ -135,7 +134,7 @@ internal class ManagedCryptoCurrencyFactory(
coinResponse: CoinsResponse.Coin,
tokensResponse: UserTokensResponse?,
imageHost: String?,
scanResponse: ScanResponse?,
userWallet: UserWallet?,
): ManagedCryptoCurrency? {
if (coinResponse.networks.isEmpty() || !coinResponse.active) return null
@ -146,7 +145,7 @@ internal class ManagedCryptoCurrencyFactory(
networkId = network.networkId,
contractAddress = network.contractAddress,
decimals = network.decimalCount?.toInt(),
scanResponse = scanResponse,
userWallet = userWallet,
)
}
.ifEmpty { return null }
@ -157,7 +156,7 @@ internal class ManagedCryptoCurrencyFactory(
symbol = coinResponse.symbol,
iconUrl = getIconUrl(coinResponse.id, imageHost),
availableNetworks = availableNetworks,
addedIn = findAddedInNetworks(coinResponse.id, tokensResponse, scanResponse),
addedIn = findAddedInNetworks(coinResponse.id, tokensResponse, userWallet),
)
}
@ -165,7 +164,7 @@ internal class ManagedCryptoCurrencyFactory(
networkId: String,
contractAddress: String?,
decimals: Int?,
scanResponse: ScanResponse?,
userWallet: UserWallet?,
extraDerivationPath: String? = null,
): SourceNetwork? {
val blockchain = Blockchain.fromNetworkId(networkId)
@ -175,10 +174,8 @@ internal class ManagedCryptoCurrencyFactory(
val network = networkFactory.create(
blockchain = blockchain,
extraDerivationPath = extraDerivationPath,
derivationStyleProvider = scanResponse?.derivationStyleProvider,
canHandleTokens = scanResponse?.let {
it.card.canHandleToken(blockchain, it.cardTypesResolver, excludedBlockchains)
} ?: false, // use card specific check if available
derivationStyleProvider = userWallet?.derivationStyleProvider,
canHandleTokens = userWallet?.canHandleToken(blockchain, excludedBlockchains) ?: false,
) ?: return null
return when {
@ -207,7 +204,7 @@ internal class ManagedCryptoCurrencyFactory(
private fun findAddedInNetworks(
currencyId: String,
tokensResponse: UserTokensResponse?,
scanResponse: ScanResponse?,
userWallet: UserWallet?,
): Set<Network> {
if (tokensResponse == null) return emptySet()
@ -220,10 +217,8 @@ internal class ManagedCryptoCurrencyFactory(
networkFactory.create(
blockchain = blockchain,
extraDerivationPath = token.derivationPath,
derivationStyleProvider = scanResponse?.derivationStyleProvider,
canHandleTokens = scanResponse?.let {
it.card.canHandleToken(blockchain, it.cardTypesResolver, excludedBlockchains)
} ?: true,
derivationStyleProvider = userWallet?.derivationStyleProvider,
canHandleTokens = userWallet?.canHandleToken(blockchain, excludedBlockchains) ?: true,
)
} else {
null