Updated on 2026-08-14

This commit is contained in:
Tangem 2026-03-06 11:13:07 +04:00
parent 9f2b2eac71
commit 5463c87ff0
16 changed files with 11 additions and 295 deletions

View file

@ -40,14 +40,6 @@ internal object ManageTokensDomainModule {
return FindTokenUseCase(customTokensRepository) return FindTokenUseCase(customTokensRepository)
} }
@Provides
@Singleton
fun provideCheckIsCurrencyNotAddedUseCase(
customTokensRepository: CustomTokensRepository,
): CheckIsCurrencyNotAddedUseCase {
return CheckIsCurrencyNotAddedUseCase(customTokensRepository)
}
@Provides @Provides
@Singleton @Singleton
fun provideGetSupportedNetworksUseCase( fun provideGetSupportedNetworksUseCase(
@ -64,12 +56,6 @@ internal object ManageTokensDomainModule {
return ValidateDerivationPathUseCase(customTokensRepository) return ValidateDerivationPathUseCase(customTokensRepository)
} }
@Provides
@Singleton
fun provideCheckHasLinkedTokensUseCase(repository: ManageTokensRepository): CheckHasLinkedTokensUseCase {
return CheckHasLinkedTokensUseCase(repository)
}
@Provides @Provides
@Singleton @Singleton
fun provideCheckCurrencyUnsupportedUseCase(repository: ManageTokensRepository): CheckCurrencyUnsupportedUseCase { fun provideCheckCurrencyUnsupportedUseCase(repository: ManageTokensRepository): CheckCurrencyUnsupportedUseCase {

View file

@ -1,21 +0,0 @@
package com.tangem.datasource.di.local
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.DefaultUserTokensResponseStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object LocalTokenModule {
@Provides
@Singleton
fun provideUserTokensResponseStore(appPreferencesStore: AppPreferencesStore): UserTokensResponseStore {
return DefaultUserTokensResponseStore(appPreferencesStore = appPreferencesStore)
}
}

View file

@ -1,22 +0,0 @@
package com.tangem.datasource.local.token
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.domain.models.wallet.UserWalletId
import kotlinx.coroutines.flow.Flow
/**
* Store of [UserTokensResponse]
*
[REDACTED_AUTHOR]
*/
interface UserTokensResponseStore {
fun get(userWalletId: UserWalletId): Flow<UserTokensResponse?>
/** Get [UserTokensResponse] synchronously by [userWalletId] or null */
suspend fun getSyncOrNull(userWalletId: UserWalletId): UserTokensResponse?
suspend fun store(userWalletId: UserWalletId, response: UserTokensResponse)
suspend fun clear(userWalletId: UserWalletId)
}

View file

@ -1,6 +1,7 @@
package com.tangem.data.account.fetcher package com.tangem.data.account.fetcher
import com.tangem.data.account.fetcher.DefaultWalletAccountsFetcher.FetchResult import com.tangem.data.account.fetcher.DefaultWalletAccountsFetcher.FetchResult
import com.tangem.data.account.store.LegacyUserTokensResponseStore
import com.tangem.data.account.utils.DefaultWalletAccountsResponseFactory import com.tangem.data.account.utils.DefaultWalletAccountsResponseFactory
import com.tangem.data.common.currency.UserTokensResponseAccountIdEnricher import com.tangem.data.common.currency.UserTokensResponseAccountIdEnricher
import com.tangem.data.common.currency.UserTokensSaver import com.tangem.data.common.currency.UserTokensSaver
@ -14,7 +15,6 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO
import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -35,7 +35,7 @@ import javax.inject.Singleton
@Singleton @Singleton
internal class FetchWalletAccountsErrorHandler @Inject constructor( internal class FetchWalletAccountsErrorHandler @Inject constructor(
private val userTokensSaver: UserTokensSaver, private val userTokensSaver: UserTokensSaver,
private val userTokensResponseStore: UserTokensResponseStore, private val userTokensResponseStore: LegacyUserTokensResponseStore,
private val defaultWalletAccountsResponseFactory: DefaultWalletAccountsResponseFactory, private val defaultWalletAccountsResponseFactory: DefaultWalletAccountsResponseFactory,
private val walletServerBinder: WalletServerBinder, private val walletServerBinder: WalletServerBinder,
) { ) {

View file

@ -1,45 +1,30 @@
package com.tangem.datasource.local.token package com.tangem.data.account.store
import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.utils.getObject
import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull
import com.tangem.datasource.local.preferences.utils.storeObject
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import kotlinx.coroutines.flow.Flow import javax.inject.Inject
/** /**
* Default implementation of [UserTokensResponseStore] * Legacy store for user tokens
* *
* @property appPreferencesStore app preferences store * @property appPreferencesStore app preferences store
* *
[REDACTED_AUTHOR] [REDACTED_AUTHOR]
*/ */
internal class DefaultUserTokensResponseStore( internal class LegacyUserTokensResponseStore @Inject constructor(
private val appPreferencesStore: AppPreferencesStore, private val appPreferencesStore: AppPreferencesStore,
) : UserTokensResponseStore { ) {
override fun get(userWalletId: UserWalletId): Flow<UserTokensResponse?> { suspend fun getSyncOrNull(userWalletId: UserWalletId): UserTokensResponse? {
return appPreferencesStore.getObject<UserTokensResponse>(
key = createPreferencesKey(userWalletId = userWalletId.stringValue),
)
}
override suspend fun getSyncOrNull(userWalletId: UserWalletId): UserTokensResponse? {
return appPreferencesStore.getObjectSyncOrNull<UserTokensResponse>( return appPreferencesStore.getObjectSyncOrNull<UserTokensResponse>(
key = createPreferencesKey(userWalletId = userWalletId.stringValue), key = createPreferencesKey(userWalletId = userWalletId.stringValue),
) )
} }
override suspend fun store(userWalletId: UserWalletId, response: UserTokensResponse) { suspend fun clear(userWalletId: UserWalletId) {
appPreferencesStore.storeObject(
key = createPreferencesKey(userWalletId = userWalletId.stringValue),
value = response,
)
}
override suspend fun clear(userWalletId: UserWalletId) {
appPreferencesStore.updateData { preferences -> appPreferencesStore.updateData { preferences ->
val key = createPreferencesKey(userWalletId = userWalletId.stringValue) val key = createPreferencesKey(userWalletId = userWalletId.stringValue)

View file

@ -2,6 +2,7 @@ package com.tangem.data.account.fetcher
import com.tangem.data.account.converter.createGetWalletAccountsResponse import com.tangem.data.account.converter.createGetWalletAccountsResponse
import com.tangem.data.account.converter.createWalletAccountDTO import com.tangem.data.account.converter.createWalletAccountDTO
import com.tangem.data.account.store.LegacyUserTokensResponseStore
import com.tangem.data.account.utils.DefaultWalletAccountsResponseFactory import com.tangem.data.account.utils.DefaultWalletAccountsResponseFactory
import com.tangem.data.common.currency.UserTokensSaver import com.tangem.data.common.currency.UserTokensSaver
import com.tangem.data.common.wallet.WalletServerBinder import com.tangem.data.common.wallet.WalletServerBinder
@ -14,7 +15,6 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO
import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import io.mockk.clearMocks import io.mockk.clearMocks
import io.mockk.coEvery import io.mockk.coEvery
@ -34,7 +34,7 @@ class FetchWalletAccountsErrorHandlerTest {
private val tangemTechApi: TangemTechApi = mockk() private val tangemTechApi: TangemTechApi = mockk()
private val walletServerBinder: WalletServerBinder = mockk() private val walletServerBinder: WalletServerBinder = mockk()
private val userTokensSaver: UserTokensSaver = mockk(relaxUnitFun = true) private val userTokensSaver: UserTokensSaver = mockk(relaxUnitFun = true)
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true) private val userTokensResponseStore: LegacyUserTokensResponseStore = mockk(relaxUnitFun = true)
private val defaultWalletAccountsResponseFactory: DefaultWalletAccountsResponseFactory = mockk() private val defaultWalletAccountsResponseFactory: DefaultWalletAccountsResponseFactory = mockk()
private val handler = FetchWalletAccountsErrorHandler( private val handler = FetchWalletAccountsErrorHandler(

View file

@ -10,7 +10,6 @@ import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.managetokens.utils.TokenAddressesConverter import com.tangem.data.managetokens.utils.TokenAddressesConverter
import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.card.common.extensions.canHandleBlockchain import com.tangem.domain.card.common.extensions.canHandleBlockchain
import com.tangem.domain.card.common.extensions.hotWalletExcludedBlockchains import com.tangem.domain.card.common.extensions.hotWalletExcludedBlockchains
import com.tangem.domain.card.common.extensions.supportedBlockchains import com.tangem.domain.card.common.extensions.supportedBlockchains
@ -27,11 +26,9 @@ import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@Suppress("LongParameterList")
internal class DefaultCustomTokensRepository( internal class DefaultCustomTokensRepository(
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val userWalletsListRepository: UserWalletsListRepository, private val userWalletsListRepository: UserWalletsListRepository,
private val userTokensResponseStore: UserTokensResponseStore,
private val excludedBlockchains: ExcludedBlockchains, private val excludedBlockchains: ExcludedBlockchains,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
private val networkFactory: NetworkFactory, private val networkFactory: NetworkFactory,
@ -64,27 +61,6 @@ internal class DefaultCustomTokensRepository(
} }
} }
override suspend fun isCurrencyNotAdded(
userWalletId: UserWalletId,
networkId: Network.ID,
derivationPath: Network.DerivationPath,
contractAddress: String?,
): Boolean {
return withContext(dispatchers.io) {
val storedCurrencies = userTokensResponseStore.getSyncOrNull(userWalletId)
requireNotNull(storedCurrencies) {
"User tokens not found for user wallet [$userWalletId] while checking if currency is not added"
}
storedCurrencies.tokens.none { token ->
networkId.toBlockchain().toNetworkId() == token.networkId &&
derivationPath.value == token.derivationPath &&
contractAddress.equals(token.contractAddress, ignoreCase = true)
}
}
}
override suspend fun findToken( override suspend fun findToken(
userWalletId: UserWalletId, userWalletId: UserWalletId,
contractAddress: String, contractAddress: String,

View file

@ -17,7 +17,6 @@ import com.tangem.datasource.api.tangemTech.models.CoinsResponse
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.api.tangemTech.models.orDefault import com.tangem.datasource.api.tangemTech.models.orDefault
import com.tangem.datasource.local.config.testnet.TestnetTokensStorage import com.tangem.datasource.local.config.testnet.TestnetTokensStorage
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.card.common.TapWorkarounds.isTestCard import com.tangem.domain.card.common.TapWorkarounds.isTestCard
import com.tangem.domain.card.common.extensions.* import com.tangem.domain.card.common.extensions.*
import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.card.common.util.cardTypesResolver
@ -28,7 +27,6 @@ import com.tangem.domain.managetokens.model.ManagedCryptoCurrency.SourceNetwork
import com.tangem.domain.managetokens.repository.ManageTokensRepository import com.tangem.domain.managetokens.repository.ManageTokensRepository
import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.account.AccountId
import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.pagination.BatchFetchResult import com.tangem.pagination.BatchFetchResult
@ -44,7 +42,6 @@ internal class DefaultManageTokensRepository(
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val userWalletsListRepository: UserWalletsListRepository, private val userWalletsListRepository: UserWalletsListRepository,
private val manageTokensUpdateFetcher: ManageTokensUpdateFetcher, private val manageTokensUpdateFetcher: ManageTokensUpdateFetcher,
private val userTokensResponseStore: UserTokensResponseStore,
private val testnetTokensStorage: TestnetTokensStorage, private val testnetTokensStorage: TestnetTokensStorage,
private val excludedBlockchains: ExcludedBlockchains, private val excludedBlockchains: ExcludedBlockchains,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
@ -280,52 +277,6 @@ internal class DefaultManageTokensRepository(
} }
// endregion // endregion
override suspend fun hasLinkedTokens(
userWalletId: UserWalletId,
network: Network,
tempAddedTokens: Map<ManagedCryptoCurrency.Token, Set<Network>>,
tempRemovedTokens: Map<ManagedCryptoCurrency.Token, Set<Network>>,
): Boolean {
val addedTokens = tempAddedTokens.mapToResponseTokens()
val removedTokens = tempRemovedTokens.mapToResponseTokens()
val storedTokens = requireNotNull(
value = getSavedUserTokensResponseSync(userWalletId),
lazyMessage = { "Unable to find tokens response for user wallet with provided ID: $userWalletId" },
)
val newTokensList = storedTokens.tokens + addedTokens - removedTokens.toSet()
return newTokensList.any { token ->
token.contractAddress != null &&
token.networkId == network.backendId &&
token.derivationPath == network.derivationPath.value
}
}
private fun Map<ManagedCryptoCurrency.Token, Set<Network>>.mapToResponseTokens(): List<UserTokensResponse.Token> {
return flatMap { (token, networks) ->
token.availableNetworks
.filter { sourceNetwork -> networks.contains(sourceNetwork.network) }
.map { sourceNetwork ->
val networkId = sourceNetwork.network.toBlockchain().toNetworkId()
UserTokensResponse.Token(
id = token.id.value,
networkId = networkId,
derivationPath = sourceNetwork.network.derivationPath.value,
name = token.name,
symbol = token.symbol,
decimals = sourceNetwork.decimals,
contractAddress = (sourceNetwork as? SourceNetwork.Default)?.contractAddress,
)
}
}
}
private suspend fun getSavedUserTokensResponseSync(key: UserWalletId): UserTokensResponse? {
return userTokensResponseStore.getSyncOrNull(userWalletId = key)
}
override suspend fun checkCurrencyUnsupportedState( override suspend fun checkCurrencyUnsupportedState(
userWalletId: UserWalletId, userWalletId: UserWalletId,
sourceNetwork: SourceNetwork, sourceNetwork: SourceNetwork,

View file

@ -8,7 +8,6 @@ import com.tangem.data.managetokens.DefaultManageTokensRepository
import com.tangem.data.managetokens.utils.ManageTokensUpdateFetcher import com.tangem.data.managetokens.utils.ManageTokensUpdateFetcher
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.config.testnet.TestnetTokensStorage import com.tangem.datasource.local.config.testnet.TestnetTokensStorage
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.managetokens.repository.CustomTokensRepository import com.tangem.domain.managetokens.repository.CustomTokensRepository
import com.tangem.domain.managetokens.repository.ManageTokensRepository import com.tangem.domain.managetokens.repository.ManageTokensRepository
@ -29,7 +28,6 @@ internal object ManageTokensDataModule {
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
userWalletsListRepository: UserWalletsListRepository, userWalletsListRepository: UserWalletsListRepository,
manageTokensUpdateFetcher: ManageTokensUpdateFetcher, manageTokensUpdateFetcher: ManageTokensUpdateFetcher,
userTokensResponseStore: UserTokensResponseStore,
testnetTokensStorage: TestnetTokensStorage, testnetTokensStorage: TestnetTokensStorage,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
excludedBlockchains: ExcludedBlockchains, excludedBlockchains: ExcludedBlockchains,
@ -40,7 +38,6 @@ internal object ManageTokensDataModule {
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
userWalletsListRepository = userWalletsListRepository, userWalletsListRepository = userWalletsListRepository,
manageTokensUpdateFetcher = manageTokensUpdateFetcher, manageTokensUpdateFetcher = manageTokensUpdateFetcher,
userTokensResponseStore = userTokensResponseStore,
testnetTokensStorage = testnetTokensStorage, testnetTokensStorage = testnetTokensStorage,
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
networkFactory = networkFactory, networkFactory = networkFactory,
@ -54,7 +51,6 @@ internal object ManageTokensDataModule {
fun provideCustomTokensRepository( fun provideCustomTokensRepository(
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
userWalletsListRepository: UserWalletsListRepository, userWalletsListRepository: UserWalletsListRepository,
userTokensResponseStore: UserTokensResponseStore,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
excludedBlockchains: ExcludedBlockchains, excludedBlockchains: ExcludedBlockchains,
networkFactory: NetworkFactory, networkFactory: NetworkFactory,
@ -62,7 +58,6 @@ internal object ManageTokensDataModule {
return DefaultCustomTokensRepository( return DefaultCustomTokensRepository(
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
userWalletsListRepository = userWalletsListRepository, userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore,
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
dispatchers = dispatchers, dispatchers = dispatchers,
networkFactory = networkFactory, networkFactory = networkFactory,

View file

@ -3,7 +3,6 @@ package com.tangem.data.tokens.di
import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.blockchainsdk.utils.ExcludedBlockchains
import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.common.cache.CacheRegistry
import com.tangem.data.common.currency.CardCryptoCurrencyFactory import com.tangem.data.common.currency.CardCryptoCurrencyFactory
import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory
import com.tangem.data.tokens.repository.DefaultCurrenciesRepository import com.tangem.data.tokens.repository.DefaultCurrenciesRepository
import com.tangem.data.tokens.repository.DefaultCurrencyChecksRepository import com.tangem.data.tokens.repository.DefaultCurrencyChecksRepository
import com.tangem.data.tokens.repository.DefaultTokenReceiveWarningsViewedRepository import com.tangem.data.tokens.repository.DefaultTokenReceiveWarningsViewedRepository
@ -11,7 +10,6 @@ import com.tangem.data.tokens.repository.DefaultYieldSupplyWarningsViewedReposit
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.TokenReceiveWarningActionStore import com.tangem.datasource.local.token.TokenReceiveWarningActionStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier
@ -35,7 +33,6 @@ internal object TokensDataModule {
@Singleton @Singleton
fun provideCurrenciesRepository( fun provideCurrenciesRepository(
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
userTokensResponseStore: UserTokensResponseStore,
userWalletsListRepository: UserWalletsListRepository, userWalletsListRepository: UserWalletsListRepository,
walletManagersFacade: WalletManagersFacade, walletManagersFacade: WalletManagersFacade,
cacheRegistry: CacheRegistry, cacheRegistry: CacheRegistry,
@ -43,7 +40,6 @@ internal object TokensDataModule {
expressServiceFetcher: ExpressServiceFetcher, expressServiceFetcher: ExpressServiceFetcher,
excludedBlockchains: ExcludedBlockchains, excludedBlockchains: ExcludedBlockchains,
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory, cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
responseCryptoCurrenciesFactory: ResponseCryptoCurrenciesFactory,
multiWalletCryptoCurrenciesSupplier: MultiWalletCryptoCurrenciesSupplier, multiWalletCryptoCurrenciesSupplier: MultiWalletCryptoCurrenciesSupplier,
): CurrenciesRepository { ): CurrenciesRepository {
return DefaultCurrenciesRepository( return DefaultCurrenciesRepository(
@ -51,12 +47,10 @@ internal object TokensDataModule {
userWalletsListRepository = userWalletsListRepository, userWalletsListRepository = userWalletsListRepository,
walletManagersFacade = walletManagersFacade, walletManagersFacade = walletManagersFacade,
cacheRegistry = cacheRegistry, cacheRegistry = cacheRegistry,
userTokensResponseStore = userTokensResponseStore,
expressServiceFetcher = expressServiceFetcher, expressServiceFetcher = expressServiceFetcher,
dispatchers = dispatchers, dispatchers = dispatchers,
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
cardCryptoCurrencyFactory = cardCryptoCurrencyFactory, cardCryptoCurrencyFactory = cardCryptoCurrencyFactory,
responseCryptoCurrenciesFactory = responseCryptoCurrenciesFactory,
multiWalletCryptoCurrenciesSupplier = multiWalletCryptoCurrenciesSupplier, multiWalletCryptoCurrenciesSupplier = multiWalletCryptoCurrenciesSupplier,
) )
} }

View file

@ -8,12 +8,9 @@ import com.tangem.blockchainsdk.utils.toBlockchain
import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.common.cache.CacheRegistry
import com.tangem.data.common.currency.CardCryptoCurrencyFactory import com.tangem.data.common.currency.CardCryptoCurrencyFactory
import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.data.common.currency.CryptoCurrencyFactory
import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory
import com.tangem.data.common.currency.getTokenId import com.tangem.data.common.currency.getTokenId
import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.domain.card.CardTypesResolver import com.tangem.domain.card.CardTypesResolver
import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.card.common.util.cardTypesResolver
import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.common.wallets.UserWalletsListRepository
@ -21,7 +18,6 @@ import com.tangem.domain.common.wallets.getSyncStrict
import com.tangem.domain.core.error.DataError import com.tangem.domain.core.error.DataError
import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.express.models.ExpressAsset import com.tangem.domain.express.models.ExpressAsset
import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.currency.CryptoCurrencyStatus
import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.Network
@ -36,9 +32,7 @@ import com.tangem.domain.tokens.repository.CurrenciesRepository
import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.plus
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber import timber.log.Timber
import com.tangem.blockchain.common.FeePaidCurrency as FeePaidSdkCurrency import com.tangem.blockchain.common.FeePaidCurrency as FeePaidSdkCurrency
@ -52,28 +46,12 @@ internal class DefaultCurrenciesRepository(
private val expressServiceFetcher: ExpressServiceFetcher, private val expressServiceFetcher: ExpressServiceFetcher,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
private val cardCryptoCurrencyFactory: CardCryptoCurrencyFactory, private val cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
private val userTokensResponseStore: UserTokensResponseStore,
private val responseCryptoCurrenciesFactory: ResponseCryptoCurrenciesFactory,
private val multiWalletCryptoCurrenciesSupplier: MultiWalletCryptoCurrenciesSupplier, private val multiWalletCryptoCurrenciesSupplier: MultiWalletCryptoCurrenciesSupplier,
excludedBlockchains: ExcludedBlockchains, excludedBlockchains: ExcludedBlockchains,
) : CurrenciesRepository { ) : CurrenciesRepository {
private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains) private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains)
override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
return channelFlow {
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) {
getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send)
} else {
val currencies = getSingleCurrencyWalletWithCardCurrencies(userWalletId)
send(currencies)
}
}
}
override suspend fun getSingleCurrencyWalletPrimaryCurrency( override suspend fun getSingleCurrencyWalletPrimaryCurrency(
userWalletId: UserWalletId, userWalletId: UserWalletId,
refresh: Boolean, refresh: Boolean,
@ -143,17 +121,6 @@ internal class DefaultCurrenciesRepository(
} }
} }
private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
return channelFlow {
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
getMultiCurrencyWalletCurrencies(userWallet)
.onEach { send(it) }
.launchIn(scope = this + dispatchers.io)
}
}
override suspend fun getNetworkCoin( override suspend fun getNetworkCoin(
userWalletId: UserWalletId, userWalletId: UserWalletId,
networkId: Network.ID, networkId: Network.ID,
@ -281,16 +248,6 @@ internal class DefaultCurrenciesRepository(
return (userWalletsListRepository.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver return (userWalletsListRepository.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
} }
private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow<List<CryptoCurrency>> {
return getSavedUserTokensResponse(userWallet.walletId).map { storedTokens ->
responseCryptoCurrenciesFactory.createCurrencies(
response = storedTokens,
userWallet = userWallet,
accountIndex = DerivationIndex.Main,
)
}
}
private suspend fun fetchExpressAssetsByNetworkIds( private suspend fun fetchExpressAssetsByNetworkIds(
userWallet: UserWallet, userWallet: UserWallet,
cryptoCurrencies: List<CryptoCurrency>, cryptoCurrencies: List<CryptoCurrency>,
@ -338,8 +295,4 @@ internal class DefaultCurrenciesRepository(
throw error throw error
} }
} }
private fun getSavedUserTokensResponse(key: UserWalletId): Flow<UserTokensResponse> {
return userTokensResponseStore.get(userWalletId = key).filterNotNull()
}
} }

View file

@ -1,28 +0,0 @@
package com.tangem.domain.managetokens
import arrow.core.Either
import com.tangem.domain.managetokens.model.ManagedCryptoCurrency
import com.tangem.domain.managetokens.repository.ManageTokensRepository
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
class CheckHasLinkedTokensUseCase(
private val repository: ManageTokensRepository,
) {
suspend operator fun invoke(
userWalletId: UserWalletId,
network: Network,
tempAddedTokens: Map<ManagedCryptoCurrency.Token, Set<Network>>,
tempRemovedTokens: Map<ManagedCryptoCurrency.Token, Set<Network>>,
): Either<Throwable, Boolean> {
return Either.catch {
repository.hasLinkedTokens(
userWalletId = userWalletId,
network = network,
tempAddedTokens = tempAddedTokens,
tempRemovedTokens = tempRemovedTokens,
)
}
}
}

View file

@ -1,25 +0,0 @@
package com.tangem.domain.managetokens
import arrow.core.Either
import com.tangem.domain.managetokens.repository.CustomTokensRepository
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId
class CheckIsCurrencyNotAddedUseCase(
private val repository: CustomTokensRepository,
) {
suspend operator fun invoke(
userWalletId: UserWalletId,
networkId: Network.ID,
derivationPath: Network.DerivationPath,
contractAddress: String?,
): Either<Throwable, Boolean> = Either.catch {
repository.isCurrencyNotAdded(
userWalletId = userWalletId,
networkId = networkId,
derivationPath = derivationPath,
contractAddress = contractAddress,
)
}
}

View file

@ -10,13 +10,6 @@ interface CustomTokensRepository {
suspend fun validateContractAddress(contractAddress: String, networkId: Network.ID): Boolean suspend fun validateContractAddress(contractAddress: String, networkId: Network.ID): Boolean
suspend fun isCurrencyNotAdded(
userWalletId: UserWalletId,
networkId: Network.ID,
derivationPath: Network.DerivationPath,
contractAddress: String?,
): Boolean
suspend fun findToken( suspend fun findToken(
userWalletId: UserWalletId, userWalletId: UserWalletId,
contractAddress: String, contractAddress: String,

View file

@ -4,7 +4,6 @@ import com.tangem.domain.managetokens.model.CurrencyUnsupportedState
import com.tangem.domain.managetokens.model.ManageTokensListBatchFlow import com.tangem.domain.managetokens.model.ManageTokensListBatchFlow
import com.tangem.domain.managetokens.model.ManageTokensListBatchingContext import com.tangem.domain.managetokens.model.ManageTokensListBatchingContext
import com.tangem.domain.managetokens.model.ManagedCryptoCurrency import com.tangem.domain.managetokens.model.ManagedCryptoCurrency
import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
interface ManageTokensRepository { interface ManageTokensRepository {
@ -15,13 +14,6 @@ interface ManageTokensRepository {
batchSize: Int, batchSize: Int,
): ManageTokensListBatchFlow ): ManageTokensListBatchFlow
suspend fun hasLinkedTokens(
userWalletId: UserWalletId,
network: Network,
tempAddedTokens: Map<ManagedCryptoCurrency.Token, Set<Network>>,
tempRemovedTokens: Map<ManagedCryptoCurrency.Token, Set<Network>>,
): Boolean
suspend fun checkCurrencyUnsupportedState( suspend fun checkCurrencyUnsupportedState(
userWalletId: UserWalletId, userWalletId: UserWalletId,
sourceNetwork: ManagedCryptoCurrency.SourceNetwork, sourceNetwork: ManagedCryptoCurrency.SourceNetwork,

View file

@ -7,7 +7,6 @@ import com.tangem.domain.models.currency.CryptoCurrencyStatus
import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.Network
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.tokens.model.FeePaidCurrency import com.tangem.domain.tokens.model.FeePaidCurrency
import kotlinx.coroutines.flow.Flow
/** /**
* Repository for everything related to the tokens of user wallet * Repository for everything related to the tokens of user wallet
@ -15,18 +14,6 @@ import kotlinx.coroutines.flow.Flow
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
interface CurrenciesRepository { interface CurrenciesRepository {
/**
* Retrieves the list of cryptocurrencies within a user wallet.
*
* This method returns a list of cryptocurrencies associated with the user wallet regardless of whether
* it is a multi-currency or single-currency wallet.
*
* @param userWalletId The unique identifier of the user wallet.
* @return A list of [CryptoCurrency].
*/
@Deprecated("Use MultiWalletCryptoCurrenciesSupplier")
fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>>
/** /**
* Retrieves the primary cryptocurrency for a specific single-currency user wallet. * Retrieves the primary cryptocurrency for a specific single-currency user wallet.
* *