diff --git a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt index 27d5a8a0fa..f5e45540e0 100644 --- a/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/card/DefaultDerivationsRepository.kt @@ -13,7 +13,6 @@ import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.data.common.currency.getNetwork import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.card.repository.DerivationsRepository -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network @@ -48,7 +47,7 @@ internal class DefaultDerivationsRepository( getNetwork( blockchain = Blockchain.fromNetworkId(it.value) ?: return@mapNotNull null, extraDerivationPath = null, - derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) }, ) @@ -84,7 +83,7 @@ internal class DefaultDerivationsRepository( getNetwork( blockchain = Blockchain.fromNetworkId(networkId.value) ?: return@mapNotNull null, extraDerivationPath = extraDerivationPath, - derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) }, ) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 130eddc672..3b3e81c1a1 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -8,9 +8,7 @@ import com.tangem.common.routing.AppRoute import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.models.Basic import com.tangem.data.common.currency.CryptoCurrencyFactory - import com.tangem.domain.common.util.cardTypesResolver -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType @@ -152,7 +150,7 @@ object OnboardingHelper { val cryptoCurrency = CryptoCurrencyFactory().createCoin( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = scanResponse.derivationStyleProvider, + scanResponse = scanResponse, ) ?: return val topUpUrl = walletManager.getTopUpUrl(cryptoCurrency) ?: return diff --git a/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt b/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt index d7a9569c4c..520d262847 100644 --- a/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt +++ b/app/src/main/java/com/tangem/tap/network/exchangeServices/CryptoCurrencyConverter.kt @@ -3,7 +3,6 @@ package com.tangem.tap.network.exchangeServices import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.data.common.currency.CryptoCurrencyFactory -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.tap.common.extensions.inject import com.tangem.tap.domain.model.Currency @@ -21,10 +20,9 @@ internal class CryptoCurrencyConverter : TwoWayConverter( key = PreferencesKeys.getUserTokensKey(userWalletId.stringValue), - ) ?: error("User tokens not found") + ) + requireNotNull(storedCurrencies) { + "User tokens not found for user wallet [$userWalletId] while checking if currency is not added" + } storedCurrencies.tokens.none { token -> Blockchain.fromId(networkId.value).toNetworkId() == token.networkId && @@ -83,9 +84,12 @@ internal class DefaultCustomTokensRepository( networkId: Network.ID, derivationPath: Network.DerivationPath, ): CryptoCurrency.Token? = withContext(dispatchers.io) { - val userWallet = userWalletsStore.getSyncOrNull(userWalletId) - ?: error("User wallet not found") - val network = getNetwork(networkId, derivationPath) + val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { + "User wallet [$userWalletId] not found while finding token" + } + val network = requireNotNull(getNetwork(networkId, derivationPath, userWallet.scanResponse)) { + "Network [$networkId] not found while finding token" + } val tokenAddress = tokenAddressConverter.convertTokenAddress( networkId, contractAddress, @@ -125,13 +129,22 @@ internal class DefaultCustomTokensRepository( } } - override fun createCoin(networkId: Network.ID, derivationPath: Network.DerivationPath): CryptoCurrency.Coin { - val network = getNetwork(networkId, derivationPath) + override suspend fun createCoin( + userWalletId: UserWalletId, + networkId: Network.ID, + derivationPath: Network.DerivationPath, + ): CryptoCurrency.Coin { + val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { + "User wallet [$userWalletId] not found while creating coin" + } + val network = requireNotNull(getNetwork(networkId, derivationPath, userWallet.scanResponse)) { + "Network [$networkId] not found while creating coin" + } return cryptoCurrencyFactory.createCoin(network) } - override fun createToken( + override suspend fun createToken( managedCryptoCurrency: ManagedCryptoCurrency.Token, sourceNetwork: ManagedCryptoCurrency.SourceNetwork.Default, rawId: String?, @@ -147,11 +160,17 @@ internal class DefaultCustomTokensRepository( } override suspend fun createCustomToken( + userWalletId: UserWalletId, networkId: Network.ID, derivationPath: Network.DerivationPath, formValues: AddCustomTokenForm.Validated.All, ): CryptoCurrency.Token { - val network = getNetwork(networkId, derivationPath) + val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { + "User wallet [$userWalletId] not found while creating custom token" + } + val network = requireNotNull(getNetwork(networkId, derivationPath, userWallet.scanResponse)) { + "Network [$networkId] not found while creating custom token" + } val tokenAddress = tokenAddressConverter.convertTokenAddress( networkId, formValues.contractAddress, @@ -171,7 +190,11 @@ internal class DefaultCustomTokensRepository( override suspend fun removeCurrency(userWalletId: UserWalletId, currency: ManagedCryptoCurrency.Custom) = withContext(dispatchers.io) { val cryptoCurrency = when (currency) { - is ManagedCryptoCurrency.Custom.Coin -> createCoin(currency.network.id, currency.network.derivationPath) + is ManagedCryptoCurrency.Custom.Coin -> createCoin( + userWalletId = userWalletId, + networkId = currency.network.id, + derivationPath = currency.network.derivationPath, + ) is ManagedCryptoCurrency.Custom.Token -> cryptoCurrencyFactory.createToken( network = currency.network, rawId = currency.currencyId.rawCurrencyId, @@ -181,15 +204,17 @@ internal class DefaultCustomTokensRepository( contractAddress = currency.contractAddress, ) } - - val savedCurrencies = requireNotNull( - value = getSavedUserTokensResponseSync(key = userWalletId), - lazyMessage = { "Saved tokens empty. Can not perform remove currency action" }, + val storedCurrencies = appPreferencesStore.getObjectSyncOrNull( + key = PreferencesKeys.getUserTokensKey(userWalletId.stringValue), ) + requireNotNull(storedCurrencies) { + "User tokens not found for user wallet [$userWalletId] while removing currency" + } + val token = userTokensResponseFactory.createResponseToken(cryptoCurrency) storeAndPushTokens( userWalletId = userWalletId, - response = savedCurrencies.copy(tokens = savedCurrencies.tokens.filterNot { it == token }), + response = storedCurrencies.copy(tokens = storedCurrencies.tokens.filterNot { it == token }), ) when (cryptoCurrency) { is CryptoCurrency.Coin -> walletManagersFacade.remove(userWalletId, setOf(cryptoCurrency.network)) @@ -198,8 +223,9 @@ internal class DefaultCustomTokensRepository( } override suspend fun getSupportedNetworks(userWalletId: UserWalletId): List = withContext(dispatchers.io) { - val userWallet = userWalletsStore.getSyncOrNull(userWalletId) - ?: error("User wallet not found") + val userWallet = requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { + "User wallet [$userWalletId] not found while getting supported networks" + } val scanResponse = userWallet.scanResponse Blockchain.entries @@ -208,9 +234,7 @@ internal class DefaultCustomTokensRepository( getNetwork( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = scanResponse.derivationStyleProvider, - )?.copy( - canHandleTokens = scanResponse.card.canHandleToken(blockchain, scanResponse.cardTypesResolver), + scanResponse = scanResponse, ) } else { null @@ -238,13 +262,7 @@ internal class DefaultCustomTokensRepository( private suspend fun pushTokens(userWalletId: UserWalletId, response: UserTokensResponse) { safeApiCall({ tangemTechApi.saveUserTokens(userWalletId.stringValue, response).bind() }) { - Timber.e(it, "Unable to save user tokens for: ${userWalletId.stringValue}") + Timber.e(it, "Unable to push user tokens for: ${userWalletId.stringValue}") } } - - private suspend fun getSavedUserTokensResponseSync(key: UserWalletId): UserTokensResponse? { - return appPreferencesStore.getObjectSyncOrNull( - key = PreferencesKeys.getUserTokensKey(key.stringValue), - ) - } } \ No newline at end of file diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt index 49b58cb102..b0c406b0f5 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt @@ -1,8 +1,8 @@ package com.tangem.data.managetokens import com.tangem.blockchain.common.Blockchain -import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.compatibility.l2BlockchainsCoinIds +import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.utils.isSupportedInApp import com.tangem.blockchainsdk.utils.toNetworkId import com.tangem.data.common.currency.getBlockchain @@ -21,7 +21,6 @@ import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.supportedBlockchains import com.tangem.domain.common.extensions.supportedTokens import com.tangem.domain.common.util.cardTypesResolver -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.managetokens.model.* import com.tangem.domain.managetokens.model.ManagedCryptoCurrency.SourceNetwork import com.tangem.domain.managetokens.repository.ManageTokensRepository @@ -102,13 +101,13 @@ internal class DefaultManageTokensRepository( managedCryptoCurrencyFactory.createWithCustomTokens( coinsResponse = updatedCoinsResponse, tokensResponse = tokensResponse, - derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) } else { managedCryptoCurrencyFactory.create( coinsResponse = updatedCoinsResponse, tokensResponse = tokensResponse, - derivationStyleProvider = userWallet?.scanResponse?.derivationStyleProvider, + scanResponse = userWallet?.scanResponse, ) } 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 5a5b9fd6eb..ae23245484 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 @@ -13,8 +13,12 @@ import com.tangem.data.common.currency.getTokenId import com.tangem.datasource.api.tangemTech.models.CoinsResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse 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.scan.ScanResponse import com.tangem.domain.tokens.model.Network internal class ManagedCryptoCurrencyFactory { @@ -22,24 +26,28 @@ internal class ManagedCryptoCurrencyFactory { fun create( coinsResponse: CoinsResponse, tokensResponse: UserTokensResponse?, - derivationStyleProvider: DerivationStyleProvider?, + scanResponse: ScanResponse?, ): List { return coinsResponse.coins.mapNotNull { coin -> - createToken(coin, tokensResponse, coinsResponse.imageHost, derivationStyleProvider) + createToken(coin, tokensResponse, coinsResponse.imageHost, scanResponse) } } fun createWithCustomTokens( coinsResponse: CoinsResponse, tokensResponse: UserTokensResponse, - derivationStyleProvider: DerivationStyleProvider, + scanResponse: ScanResponse, ): List { val customTokens = tokensResponse.tokens .mapNotNull { token -> - maybeCreateCustomToken(token, coinsResponse.imageHost, derivationStyleProvider) + maybeCreateCustomToken(token, coinsResponse.imageHost, scanResponse) } - val tokens = create(coinsResponse, tokensResponse, derivationStyleProvider) + val tokens = create( + coinsResponse, + tokensResponse, + scanResponse, + ) return customTokens + tokens } @@ -47,20 +55,20 @@ internal class ManagedCryptoCurrencyFactory { private fun maybeCreateCustomToken( token: UserTokensResponse.Token, imageHost: String?, - derivationStyleProvider: DerivationStyleProvider, + scanResponse: ScanResponse, ): ManagedCryptoCurrency? { val blockchain = Blockchain.fromNetworkId(token.networkId) ?.takeIf { it.isSupportedInApp() } ?: return null - if (!checkIsCustomToken(token, blockchain, derivationStyleProvider)) { + if (!checkIsCustomToken(token, blockchain, scanResponse.derivationStyleProvider)) { return null } val network = getNetwork( blockchain = blockchain, extraDerivationPath = token.derivationPath, - derivationStyleProvider = derivationStyleProvider, + scanResponse = scanResponse, ) ?: return null val contractAddress = token.contractAddress @@ -89,7 +97,7 @@ internal class ManagedCryptoCurrencyFactory { coinResponse: CoinsResponse.Coin, tokensResponse: UserTokensResponse?, imageHost: String?, - derivationStyleProvider: DerivationStyleProvider?, + scanResponse: ScanResponse?, ): ManagedCryptoCurrency? { if (coinResponse.networks.isEmpty() || !coinResponse.active) return null @@ -100,22 +108,29 @@ internal class ManagedCryptoCurrencyFactory { symbol = coinResponse.symbol, iconUrl = getIconUrl(coinResponse.id, imageHost), availableNetworks = updatedNetworks.mapNotNull { network -> - createSource(network, derivationStyleProvider) + createSource(network, scanResponse) }, - addedIn = findAddedInNetworks(coinResponse.id, tokensResponse, derivationStyleProvider), + addedIn = findAddedInNetworks(coinResponse.id, tokensResponse, scanResponse), ) } private fun createSource( networkResponse: CoinsResponse.Coin.Network, - derivationStyleProvider: DerivationStyleProvider?, + scanResponse: ScanResponse?, extraDerivationPath: String? = null, ): SourceNetwork? { val blockchain = Blockchain.fromNetworkId(networkResponse.networkId) ?.takeIf { it.isSupportedInApp() } ?: return null - val network = getNetwork(blockchain, extraDerivationPath, derivationStyleProvider) ?: return null + val network = getNetwork( + blockchain, + extraDerivationPath, + scanResponse?.derivationStyleProvider, + canHandleTokens = scanResponse?.let { + it.card.canHandleToken(blockchain, it.cardTypesResolver) + } ?: true, + ) ?: return null val contractAddress = networkResponse.contractAddress return if (contractAddress.isNullOrBlank()) { @@ -136,7 +151,7 @@ internal class ManagedCryptoCurrencyFactory { private fun findAddedInNetworks( currencyId: String, tokensResponse: UserTokensResponse?, - derivationStyleProvider: DerivationStyleProvider?, + scanResponse: ScanResponse?, ): Set { if (tokensResponse == null) return emptySet() @@ -147,9 +162,12 @@ internal class ManagedCryptoCurrencyFactory { if (blockchain != null && blockchain.isSupportedInApp()) { getNetwork( - blockchain = blockchain, - extraDerivationPath = token.derivationPath, - derivationStyleProvider = derivationStyleProvider, + blockchain, + token.derivationPath, + scanResponse?.derivationStyleProvider, + canHandleTokens = scanResponse?.let { + it.card.canHandleToken(blockchain, it.cardTypesResolver) + } ?: true, ) } else { null diff --git a/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt b/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt index 20ca3a308c..6b98bead9e 100644 --- a/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt +++ b/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt @@ -10,18 +10,12 @@ import com.tangem.data.common.currency.getNetwork import com.tangem.data.common.utils.retryOnError import com.tangem.data.markets.analytics.MarketsDataAnalyticsEvent import com.tangem.data.markets.converters.* -import com.tangem.data.markets.converters.TokenChartConverter -import com.tangem.data.markets.converters.TokenMarketInfoConverter -import com.tangem.data.markets.converters.TokenMarketListConverter -import com.tangem.data.markets.converters.TokenQuotesShortConverter -import com.tangem.data.markets.converters.toRequestParam import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.markets.TangemTechMarketsApi import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi.Companion.marketsQuoteFields import com.tangem.datasource.local.userwallet.UserWalletsStore -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.markets.* import com.tangem.domain.markets.repositories.MarketsTokenRepository import com.tangem.domain.tokens.model.CryptoCurrency @@ -248,13 +242,13 @@ internal class DefaultMarketsTokenRepository( CryptoCurrencyFactory().createCoin( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) } else { val currencyNetwork = getNetwork( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) ?: return null CryptoCurrencyFactory().createToken( diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index 05cd191036..8d14d7cd8f 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -26,7 +26,6 @@ import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull import com.tangem.datasource.local.preferences.utils.storeObject import com.tangem.datasource.local.token.ExpressAssetsStore import com.tangem.datasource.local.userwallet.UserWalletsStore -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.core.error.DataError import com.tangem.domain.core.lce.LceFlow import com.tangem.domain.core.lce.lceFlow @@ -137,7 +136,7 @@ internal class DefaultCurrenciesRepository( cryptoCurrencyFactory.createCoin( blockchain = getBlockchain(networkId = it.network.id), extraDerivationPath = it.network.derivationPath.value, - derivationStyleProvider = getUserWallet(userWalletId).scanResponse.derivationStyleProvider, + scanResponse = getUserWallet(userWalletId).scanResponse, ) } .distinct() @@ -456,7 +455,7 @@ internal class DefaultCurrenciesRepository( token = token, networkId = networkId, extraDerivationPath = null, - derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) ?: error("Unable to create token") } diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt index 4d6056cbb0..b7dff69acb 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt @@ -4,7 +4,6 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.domain.common.TapWorkarounds.isTestCard import com.tangem.domain.common.util.cardTypesResolver -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.demo.DemoConfig import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.CryptoCurrency @@ -14,7 +13,6 @@ internal class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { private val cryptoCurrencyFactory = CryptoCurrencyFactory() fun createDefaultCoinsForMultiCurrencyCard(scanResponse: ScanResponse): List { - val cardDerivationStyleProvider = scanResponse.derivationStyleProvider val card = scanResponse.card var blockchains = if (demoConfig.isDemoCardId(card.cardId)) { @@ -31,20 +29,19 @@ internal class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { cryptoCurrencyFactory.createCoin( blockchain = it, extraDerivationPath = null, - derivationStyleProvider = cardDerivationStyleProvider, + scanResponse = scanResponse, ) } } fun createPrimaryCurrencyForSingleCurrencyCard(scanResponse: ScanResponse): CryptoCurrency { - val cardDerivationStyleProvider = scanResponse.derivationStyleProvider val resolver = scanResponse.cardTypesResolver val blockchain = resolver.getBlockchain() val coin = cryptoCurrencyFactory.createCoin( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = cardDerivationStyleProvider, + scanResponse = scanResponse, ) requireNotNull(coin) { "Coin for the single currency card cannot be null" } @@ -53,7 +50,7 @@ internal class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { sdkToken = token, blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = cardDerivationStyleProvider, + scanResponse = scanResponse, ) } @@ -61,14 +58,13 @@ internal class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { } fun createCurrenciesForSingleCurrencyCardWithToken(scanResponse: ScanResponse): List { - val cardDerivationStyleProvider = scanResponse.derivationStyleProvider val resolver = scanResponse.cardTypesResolver val blockchain = resolver.getBlockchain() val coin = cryptoCurrencyFactory.createCoin( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = cardDerivationStyleProvider, + scanResponse = scanResponse, ) requireNotNull(coin) { "Coin for the single currency card cannot be null" } @@ -77,7 +73,7 @@ internal class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { sdkToken = token, blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = cardDerivationStyleProvider, + scanResponse = scanResponse, ) } diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/CreateCurrencyUseCase.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/CreateCurrencyUseCase.kt index dc935f08af..a6692459b7 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/CreateCurrencyUseCase.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/CreateCurrencyUseCase.kt @@ -5,20 +5,22 @@ import com.tangem.domain.managetokens.model.AddCustomTokenForm import com.tangem.domain.managetokens.repository.CustomTokensRepository import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network +import com.tangem.domain.wallets.models.UserWalletId class CreateCurrencyUseCase( private val repository: CustomTokensRepository, ) { suspend operator fun invoke( + userWalletId: UserWalletId, networkId: Network.ID, derivationPath: Network.DerivationPath, formValues: AddCustomTokenForm.Validated.All?, ): Either = Either.catch { if (formValues == null) { - repository.createCoin(networkId, derivationPath) + repository.createCoin(userWalletId, networkId, derivationPath) } else { - repository.createCustomToken(networkId, derivationPath, formValues) + repository.createCustomToken(userWalletId, networkId, derivationPath, formValues) } } } \ No newline at end of file diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt index 2db0a45d91..f39a31dc49 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt @@ -38,7 +38,7 @@ class SaveManagedTokensUseCase( ) { if (currenciesToRemove.isEmpty()) return - val currencies = currenciesToRemove.mapToCryptoCurrencies() + val currencies = currenciesToRemove.mapToCryptoCurrencies(userWalletId) currenciesRepository.removeCurrencies(userWalletId = userWalletId, currencies = currencies) walletManagersFacade.remove( @@ -61,7 +61,7 @@ class SaveManagedTokensUseCase( if (currenciesToAdd.isEmpty()) return val existingCurrencies = currenciesRepository.getMultiCurrencyWalletCurrenciesSync(userWalletId) - val currencies = currenciesToAdd.mapToCryptoCurrencies() + val currencies = currenciesToAdd.mapToCryptoCurrencies(userWalletId) derivationsRepository.derivePublicKeysByNetworks( userWalletId = userWalletId, networks = currenciesToAdd.values.flatten(), @@ -105,7 +105,9 @@ class SaveManagedTokensUseCase( } } - private fun Map>.mapToCryptoCurrencies(): List { + private suspend fun Map>.mapToCryptoCurrencies( + userWalletId: UserWalletId, + ): List { return flatMap { (token, networks) -> token.availableNetworks .filter { sourceNetwork -> networks.contains(sourceNetwork.network) } @@ -117,6 +119,7 @@ class SaveManagedTokensUseCase( rawId = token.id.value, ) is ManagedCryptoCurrency.SourceNetwork.Main -> customTokensRepository.createCoin( + userWalletId = userWalletId, networkId = sourceNetwork.id, derivationPath = sourceNetwork.network.derivationPath, ) diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/CustomTokensRepository.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/CustomTokensRepository.kt index eb45ba52ad..3b0d13aba6 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/CustomTokensRepository.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/CustomTokensRepository.kt @@ -24,15 +24,20 @@ interface CustomTokensRepository { derivationPath: Network.DerivationPath, ): CryptoCurrency.Token? - fun createCoin(networkId: Network.ID, derivationPath: Network.DerivationPath): CryptoCurrency.Coin + suspend fun createCoin( + userWalletId: UserWalletId, + networkId: Network.ID, + derivationPath: Network.DerivationPath, + ): CryptoCurrency.Coin - fun createToken( + suspend fun createToken( managedCryptoCurrency: ManagedCryptoCurrency.Token, sourceNetwork: ManagedCryptoCurrency.SourceNetwork.Default, rawId: String?, ): CryptoCurrency.Token suspend fun createCustomToken( + userWalletId: UserWalletId, networkId: Network.ID, derivationPath: Network.DerivationPath, formValues: AddCustomTokenForm.Validated.All, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt index c4876c9914..685849ec59 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/CustomCurrencyValidator.kt @@ -166,6 +166,7 @@ internal class CustomCurrencyValidator @Inject constructor( validatedForm: AddCustomTokenForm.Validated.All?, ) { val currency = createCustomCurrencyUseCase( + userWalletId = userWalletId, networkId = networkId, derivationPath = derivationPath, formValues = validatedForm, diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt index 9a901c1b69..63b2305951 100644 --- a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt @@ -9,7 +9,6 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.StartReferralBody import com.tangem.datasource.demo.DemoModeDatasource import com.tangem.datasource.local.userwallet.UserWalletsStore -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.referral.converters.ReferralConverter @@ -68,7 +67,6 @@ internal class ReferralRepositoryImpl @Inject constructor( override suspend fun getCryptoCurrency(userWalletId: UserWalletId, tokenData: TokenData): CryptoCurrency? { val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("Wallet $userWalletId not found") - val derivationStyleProvider = userWallet.scanResponse.derivationStyleProvider val blockchain = Blockchain.fromNetworkId(tokenData.networkId) ?: error("Blockchain ${tokenData.networkId} not found") @@ -89,13 +87,13 @@ internal class ReferralRepositoryImpl @Inject constructor( sdkToken = sdkToken, blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) } else { cryptoCurrencyFactory.createCoin( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = derivationStyleProvider, + scanResponse = userWallet.scanResponse, ) } } diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt index f55cfe8655..e47861902f 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt @@ -20,7 +20,6 @@ import com.tangem.datasource.api.express.models.response.SwapPair import com.tangem.datasource.api.express.models.response.SwapPairsWithProviders import com.tangem.datasource.api.express.models.response.TxDetails import com.tangem.datasource.crypto.DataSignatureVerifier -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.UserWalletsListManager @@ -390,11 +389,10 @@ internal class DefaultSwapRepository @Inject constructor( cryptoCurrencyFactory.createCoin( blockchain = blockchain, extraDerivationPath = null, - derivationStyleProvider = requireNotNull( + scanResponse = requireNotNull( userWalletsListManager .selectedUserWalletSync - ?.scanResponse - ?.derivationStyleProvider, + ?.scanResponse, ), ), )