Updated on 2026-08-14

This commit is contained in:
Tangem 2026-02-10 13:31:07 +04:00
parent 49cf3b9cef
commit e17029ce9b
27 changed files with 184 additions and 207 deletions

View file

@ -6,9 +6,9 @@ import com.tangem.blockchainsdk.utils.toNetworkId
import com.tangem.data.common.account.WalletAccountsFetcher
import com.tangem.data.common.tokens.getDefaultWalletBlockchains
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.common.util.cardTypesResolver
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.currency.CryptoCurrency
@ -29,7 +29,7 @@ import com.tangem.domain.models.wallet.isMultiCurrency
internal class DefaultCardCryptoCurrencyFactory(
private val demoConfig: DemoConfig,
private val excludedBlockchains: ExcludedBlockchains,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val accountsFeatureToggles: AccountsFeatureToggles,
private val walletAccountsFetcher: WalletAccountsFetcher,
private val userTokensResponseStore: UserTokensResponseStore,
@ -42,7 +42,7 @@ internal class DefaultCardCryptoCurrencyFactory(
userWalletId: UserWalletId,
networks: Set<Network>,
): Map<Network, List<CryptoCurrency>> {
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
// multi-currency wallet
if (userWallet !is UserWallet.Cold || userWallet.isMultiCurrency) {
@ -67,7 +67,7 @@ internal class DefaultCardCryptoCurrencyFactory(
}
override suspend fun createByRawId(userWalletId: UserWalletId, network: Network.RawID): List<CryptoCurrency> {
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
val blockchain = network.toBlockchain()

View file

@ -11,8 +11,8 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.api.tangemTech.models.WalletType
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -24,7 +24,7 @@ import timber.log.Timber
@Suppress("LongParameterList")
class UserTokensSaver(
private val tangemTechApi: TangemTechApi,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val userTokensResponseStore: UserTokensResponseStore,
private val dispatchers: CoroutineDispatcherProvider,
private val addressesEnricher: UserTokensResponseAddressesEnricher,
@ -59,7 +59,7 @@ class UserTokensSaver(
useEnricher: Boolean = true,
onFailSend: () -> Unit = {},
) = withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId)
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId)
if (userWallet == null) {
Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.")

View file

@ -13,8 +13,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.repository.WalletsRepository
@ -36,7 +36,7 @@ internal object DataCommonModule {
@Singleton
fun provideCardCryptoCurrencyFactory(
excludedBlockchains: ExcludedBlockchains,
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
accountsFeatureToggles: AccountsFeatureToggles,
walletAccountsFetcher: WalletAccountsFetcher,
userTokensResponseStore: UserTokensResponseStore,
@ -45,7 +45,7 @@ internal object DataCommonModule {
return DefaultCardCryptoCurrencyFactory(
demoConfig = DemoConfig,
excludedBlockchains = excludedBlockchains,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
accountsFeatureToggles = accountsFeatureToggles,
walletAccountsFetcher = walletAccountsFetcher,
userTokensResponseStore = userTokensResponseStore,
@ -71,7 +71,7 @@ internal object DataCommonModule {
@Singleton
fun provideUserTokensSaver(
tangemTechApi: TangemTechApi,
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
userTokensResponseStore: UserTokensResponseStore,
dispatchers: CoroutineDispatcherProvider,
addressesEnricher: UserTokensResponseAddressesEnricher,
@ -81,7 +81,7 @@ internal object DataCommonModule {
): UserTokensSaver {
return UserTokensSaver(
tangemTechApi = tangemTechApi,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore,
dispatchers = dispatchers,
addressesEnricher = addressesEnricher,
@ -109,13 +109,13 @@ internal object DataCommonModule {
@Provides
@Singleton
fun provideWalletServerBinder(
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
appsFlyerStore: AppsFlyerStore,
tangemTechApi: TangemTechApi,
dispatchers: CoroutineDispatcherProvider,
): WalletServerBinder {
return DefaultWalletServerBinder(
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
appsFlyerStore = appsFlyerStore,
tangemTechApi = tangemTechApi,
dispatchers = dispatchers,

View file

@ -4,21 +4,21 @@ import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext
internal class DefaultWalletServerBinder(
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val appsFlyerStore: AppsFlyerStore,
private val tangemTechApi: TangemTechApi,
private val dispatchers: CoroutineDispatcherProvider,
) : WalletServerBinder {
override suspend fun bind(userWalletId: UserWalletId): ApiResponse<Unit>? {
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId) ?: return null
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId) ?: return null
return bind(userWallet)
}

View file

@ -12,10 +12,10 @@ import com.tangem.data.common.account.WalletAccountsFetcher
import com.tangem.data.common.network.NetworkFactory
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.common.util.cardTypesResolver
import com.tangem.domain.card.configs.GenericCardConfig
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.network.Network
@ -36,7 +36,7 @@ import org.junit.jupiter.params.ParameterizedTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class DefaultCardCryptoCurrencyFactoryTest {
private val userWalletsStore: UserWalletsStore = mockk()
private val userWalletsListRepository: UserWalletsListRepository = mockk()
private val userTokensResponseStore: UserTokensResponseStore = mockk()
private val excludedBlockchains = ExcludedBlockchains()
private val accountsFeatureToggles = mockk<AccountsFeatureToggles>()
@ -45,7 +45,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
private val factory = DefaultCardCryptoCurrencyFactory(
demoConfig = DemoConfig,
excludedBlockchains = excludedBlockchains,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore,
responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory(
networkFactory = NetworkFactory(excludedBlockchains = excludedBlockchains),
@ -63,7 +63,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
@BeforeEach
fun init() {
clearMocks(userWalletsStore, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
clearMocks(userWalletsListRepository, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
mockkStatic(Uri::class)
every { Uri.parse(any()) } returns iconUri
@ -82,7 +82,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
val network = ethereum.network
every { accountsFeatureToggles.isFeatureEnabled } returns false
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
coEvery { userTokensResponseStore.getSyncOrNull(userWallet.walletId) } returns userTokensResponse
// Act
@ -94,7 +94,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
Truth.assertThat(actual).isEqualTo(expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = userWallet.walletId)
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
userTokensResponseStore.getSyncOrNull(userWalletId = userWallet.walletId)
}
}
@ -131,7 +131,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
// Arrange
val userWallet = createSingleWallet()
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
// Act
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
@ -142,7 +142,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
Truth.assertThat(actual).isEqualTo(expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = userWallet.walletId)
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
userWallet.scanResponse.cardTypesResolver.getBlockchain()
}
@ -169,7 +169,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
// Arrange
val userWallet = MockUserWalletFactory.createSingleWalletWithToken()
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
// Act
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
@ -186,7 +186,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
Truth.assertThat(actual).isEqualTo(expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = userWallet.walletId)
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
userWallet.scanResponse.cardTypesResolver.getBlockchain()
}

View file

@ -8,8 +8,8 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.api.tangemTech.models.WalletType
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
@ -23,7 +23,7 @@ import org.junit.jupiter.api.TestInstance
class UserTokensSaverTest {
private val tangemTechApi: TangemTechApi = mockk()
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxed = true)
private val enricher: UserTokensResponseAddressesEnricher = mockk()
private val accountsFeatureToggles = mockk<AccountsFeatureToggles> {
@ -34,7 +34,7 @@ class UserTokensSaverTest {
private val userTokensSaver: UserTokensSaver = UserTokensSaver(
tangemTechApi = tangemTechApi,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore,
dispatchers = TestingCoroutineDispatcherProvider(),
addressesEnricher = enricher,
@ -48,7 +48,7 @@ class UserTokensSaverTest {
fun resetMocks() {
clearMocks(
tangemTechApi,
userWalletsStore,
userWalletsListRepository,
userTokensResponseStore,
enricher,
walletServerBinder,
@ -119,7 +119,7 @@ class UserTokensSaverTest {
var onFailSendCalled = false
every { accountsFeatureToggles.isFeatureEnabled } returns true
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { enricher(userWalletId, response) } returns enrichedResponse
coEvery { tangemTechApi.saveTokens(any(), any()) } returns ApiResponse.Error(error) as ApiResponse<Unit>
@ -165,7 +165,7 @@ class UserTokensSaverTest {
walletType = WalletType.COLD,
)
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { enricher(userWalletId, response) } returns enrichedResponse
coEvery {
tangemTechApi.saveTokens(userWalletId.stringValue, enrichedResponse)

View file

@ -7,7 +7,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.WalletIdBody
import com.tangem.datasource.api.tangemTech.models.WalletType
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.wallets.models.AppsFlyerConversionData
@ -26,13 +26,13 @@ import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class DefaultWalletServerBinderTest {
private val userWalletsStore: UserWalletsStore = mockk()
private val userWalletsListRepository: UserWalletsListRepository = mockk()
private val appsFlyerStore: AppsFlyerStore = mockk()
private val tangemTechApi: TangemTechApi = mockk()
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
private val binder = DefaultWalletServerBinder(
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
appsFlyerStore = appsFlyerStore,
tangemTechApi = tangemTechApi,
dispatchers = dispatchers
@ -47,7 +47,7 @@ internal class DefaultWalletServerBinderTest {
@AfterEach
fun tearDown() {
clearMocks(userWalletsStore, appsFlyerStore, tangemTechApi)
clearMocks(userWalletsListRepository, appsFlyerStore, tangemTechApi)
}
@Nested
@ -65,7 +65,7 @@ internal class DefaultWalletServerBinderTest {
)
val apiResponse = ApiResponse.Success(Unit)
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { appsFlyerStore.get() } returns conversionData
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
@ -74,22 +74,22 @@ internal class DefaultWalletServerBinderTest {
Truth.assertThat(actual).isEqualTo(apiResponse)
coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId)
userWalletsListRepository.getSyncOrNull(userWalletId)
appsFlyerStore.get()
tangemTechApi.createWallet(requestBody)
}
}
@Test
fun `bind will skipped if userWalletsStore returns null`() = runTest {
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns null
fun `bind will skipped if userWalletsListRepository returns null`() = runTest {
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns null
val actual = binder.bind(userWalletId = userWalletId)
Truth.assertThat(actual).isEqualTo(null)
coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId)
userWalletsListRepository.getSyncOrNull(userWalletId)
}
coVerify(inverse = true) {
@ -107,7 +107,7 @@ internal class DefaultWalletServerBinderTest {
)
val apiResponse = ApiResponse.Success(Unit)
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { appsFlyerStore.get() } returns null
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
@ -116,7 +116,7 @@ internal class DefaultWalletServerBinderTest {
Truth.assertThat(actual).isEqualTo(apiResponse)
coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId)
userWalletsListRepository.getSyncOrNull(userWalletId)
appsFlyerStore.get()
tangemTechApi.createWallet(requestBody)
}
@ -133,7 +133,7 @@ internal class DefaultWalletServerBinderTest {
)
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit>
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { appsFlyerStore.get() } returns conversionData
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
@ -142,7 +142,7 @@ internal class DefaultWalletServerBinderTest {
Truth.assertThat(actual).isEqualTo(apiResponse)
coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId)
userWalletsListRepository.getSyncOrNull(userWalletId)
appsFlyerStore.get()
tangemTechApi.createWallet(requestBody)
}

View file

@ -19,8 +19,8 @@ import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.markets.TangemTechMarketsApi
import com.tangem.datasource.api.markets.models.response.TokenMarketExchangesResponse
import com.tangem.datasource.local.datastore.RuntimeStateStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.markets.*
import com.tangem.domain.markets.repositories.MarketsTokenRepository
import com.tangem.domain.models.account.DerivationIndex
@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicLong
internal class DefaultMarketsTokenRepository(
private val marketsApi: TangemTechMarketsApi,
private val quotesFetcher: QuotesFetcher,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val dispatcherProvider: CoroutineDispatcherProvider,
private val analyticsEventHandler: AnalyticsEventHandler,
private val cacheRegistry: CacheRegistry,
@ -251,7 +251,7 @@ internal class DefaultMarketsTokenRepository(
network: TokenMarketInfo.Network,
accountIndex: DerivationIndex?,
): CryptoCurrency? {
val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("UserWalletId [$userWalletId] not found")
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
val blockchain = Blockchain.fromNetworkId(network.networkId) ?: error("Unknown network [${network.networkId}]")
return if (network.contractAddress == null) {

View file

@ -8,7 +8,7 @@ import com.tangem.data.common.quote.QuotesFetcher
import com.tangem.data.markets.DefaultMarketsTokenRepository
import com.tangem.datasource.api.markets.TangemTechMarketsApi
import com.tangem.datasource.local.datastore.RuntimeStateStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.markets.repositories.MarketsTokenRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
@ -26,7 +26,7 @@ internal object MarketsDataModule {
fun provideMarketsTokenRepository(
marketsApi: TangemTechMarketsApi,
quotesFetcher: QuotesFetcher,
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
dispatchers: CoroutineDispatcherProvider,
analyticsEventHandler: AnalyticsEventHandler,
cacheRegistry: CacheRegistry,
@ -37,7 +37,7 @@ internal object MarketsDataModule {
marketsApi = marketsApi,
quotesFetcher = quotesFetcher,
dispatcherProvider = dispatchers,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
analyticsEventHandler = analyticsEventHandler,
cacheRegistry = cacheRegistry,
tokenExchangesStore = RuntimeStateStore(defaultValue = emptyList()),

View file

@ -24,11 +24,12 @@ dependencies {
// endregion
// region Project - Domain
implementation(projects.domain.legacy)
implementation(projects.domain.walletManager)
implementation(projects.domain.card)
api(projects.domain.models)
implementation(projects.domain.common)
implementation(projects.domain.legacy)
implementation(projects.domain.models)
implementation(projects.domain.networks)
implementation(projects.domain.walletManager)
// endregion
// region Project - Libs

View file

@ -4,7 +4,7 @@ import arrow.core.Option
import arrow.core.some
import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.networks.store.NetworksStatusesStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.core.flow.FlowProducerTools
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
@ -28,7 +28,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
@Assisted val params: MultiNetworkStatusProducer.Params,
override val flowProducerTools: FlowProducerTools,
private val networksStatusesStore: NetworksStatusesStore,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val networkFactory: NetworkFactory,
private val dispatchers: CoroutineDispatcherProvider,
) : MultiNetworkStatusProducer {
@ -39,7 +39,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
return networksStatusesStore.get(userWalletId = params.userWalletId)
.distinctUntilChanged()
.mapNotNull { statuses ->
val userWallet = userWalletsStore.getSyncOrNull(params.userWalletId)
val userWallet = userWalletsListRepository.getSyncOrNull(params.userWalletId)
if (userWallet == null) {
Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}")

View file

@ -9,8 +9,8 @@ import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.networks.models.SimpleNetworkStatus
import com.tangem.data.networks.store.NetworksStatusesStore
import com.tangem.data.networks.toSimple
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.card.configs.GenericCardConfig
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.core.flow.FlowProducerTools
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
@ -33,7 +33,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
private val params = MultiNetworkStatusProducer.Params(userWalletId = userWallet.walletId)
private val networksStatusesStore = mockk<NetworksStatusesStore>()
private val userWalletsStore = mockk<UserWalletsStore>()
private val userWalletsListRepository = mockk<UserWalletsListRepository>()
private val networkFactory = mockk<NetworkFactory>()
private val dispatchers = TestingCoroutineDispatcherProvider()
private val flowProducerTools: FlowProducerTools = mockk()
@ -41,7 +41,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
private val producer = DefaultMultiNetworkStatusProducer(
params = params,
networksStatusesStore = networksStatusesStore,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
networkFactory = networkFactory,
dispatchers = dispatchers,
flowProducerTools = flowProducerTools,
@ -49,7 +49,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
@BeforeEach
fun resetMocks() {
clearMocks(networksStatusesStore, userWalletsStore, networkFactory)
clearMocks(networksStatusesStore, userWalletsListRepository, networkFactory)
}
@Test
@ -65,7 +65,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
val networksStatusesFlow = flowOf(simpleStatuses)
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every {
networkFactory.create(
@ -94,7 +94,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
verifyOrder {
networksStatusesStore.get(params.userWalletId)
userWalletsStore.getSyncOrNull(params.userWalletId)
userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create(
networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath,
@ -129,7 +129,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
// region every
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every {
networkFactory.create(
networkId = simpleStatuses.first().id,
@ -177,7 +177,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual1.first()).isEqualTo(expected1)
verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId)
userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create(
networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath,
@ -202,7 +202,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual2).isEqualTo(expected2)
verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId)
userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create(
networkId = updatedSimpleStatuses.first().id,
derivationPath = updatedSimpleStatuses.first().id.derivationPath,
@ -230,7 +230,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
// region every
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every {
networkFactory.create(
@ -263,7 +263,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual1.first()).isEqualTo(expected1)
verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId)
userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create(
networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath,
@ -312,7 +312,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
// region every
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every {
networkFactory.create(
networkId = simpleStatuses.first().id,
@ -340,7 +340,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual1.first()).isEqualTo(expected1)
verifyOrder(inverse = true) {
userWalletsStore.getSyncOrNull(any())
userWalletsListRepository.getSyncOrNull(any())
networkFactory.create(networkId = any(), derivationPath = any(), userWallet = any())
}
@ -354,7 +354,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual2.first()).isEqualTo(expected2)
verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId)
userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create(
networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath,
@ -382,7 +382,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual.first()).isEqualTo(expected)
verify { networksStatusesStore.get(params.userWalletId) }
verify(inverse = true) { userWalletsStore.getSyncOrNull(params.userWalletId) }
verify(inverse = true) { userWalletsListRepository.getSyncOrNull(params.userWalletId) }
}
@Test
@ -398,7 +398,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
val networksStatusesFlow = flowOf(simpleStatuses)
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
coEvery { networkFactory.create(networkId = any(), any(), any()) } returns null
// Act
@ -411,7 +411,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
verifyOrder {
networksStatusesStore.get(params.userWalletId)
userWalletsStore.getSyncOrNull(params.userWalletId)
userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create(
networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath,

View file

@ -1,17 +0,0 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>BooleanPropertyNaming:DefaultOnrampRepository.kt$DefaultOnrampRepository$val cachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)</ID>
<ID>MultilineLambdaItParameter:DefaultHotCryptoRepository.kt$DefaultHotCryptoRepository${ Timber.e(it, "Unable to fetch hot crypto") analyticsEventHandler.send( event = MainScreenAnalyticsEvent.HotTokenError( errorCode = (it as? ApiResponseError.HttpException)?.code?.numericCode?.toString().orEmpty(), ), ) }</ID>
<ID>MultilineLambdaItParameter:DefaultHotCryptoRepository.kt$DefaultHotCryptoRepository${ if (it.id == OLD_POLYGON_NAME) { it.copy(id = NEW_POLYGON_NAME) } else { it } }</ID>
<ID>MultilineLambdaItParameter:DefaultHotCryptoRepository.kt$DefaultHotCryptoRepository${ val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("UserWalletId [$userWalletId] not found") HotCryptoCurrencyConverter( userWallet = userWallet, imageHost = it.imageHost, excludedBlockchains = excludedBlockchains, ) .convertList(input = it.tokens) .filterNotNull() }</ID>
<ID>MultilineLambdaItParameter:DefaultOnrampRepository.kt$DefaultOnrampRepository${ Timber.w(it, "Unable to fetch express providers") throw it }</ID>
<ID>MultilineLambdaItParameter:DefaultOnrampRepository.kt$DefaultOnrampRepository${ Timber.w(it, "Unable to fetch onramp pairs") throw it }</ID>
<ID>MultilineLambdaItParameter:DefaultOnrampRepository.kt$DefaultOnrampRepository${ Timber.w(it, "Unable to fetch onramp payment methods") throw it }</ID>
<ID>UnnecessaryLet:DefaultOnrampRepository.kt$DefaultOnrampRepository$let(countryConverter::convert)</ID>
<ID>UnnecessaryLet:DefaultOnrampRepository.kt$DefaultOnrampRepository$let(paymentMethodsConverter::convertList)</ID>
<ID>UnnecessaryLet:DefaultOnrampRepository.kt$DefaultOnrampRepository$let(statusConverter::convert)</ID>
<ID>UseOrEmpty:DefaultOnrampTransactionRepository.kt$DefaultOnrampTransactionRepository$stored ?: emptySet()</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -18,10 +18,10 @@ import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
import com.tangem.datasource.appcurrency.AppCurrencyResponseStore
import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.common.extensions.canHandleBlockchain
import com.tangem.domain.card.common.extensions.canHandleToken
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.onramp.model.HotCryptoCurrency
@ -54,7 +54,7 @@ import timber.log.Timber
internal class DefaultHotCryptoRepository(
private val excludedBlockchains: ExcludedBlockchains,
private val hotCryptoResponseStore: HotCryptoResponseStore,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val tangemTechApi: TangemTechApi,
private val appCurrencyResponseStore: AppCurrencyResponseStore,
private val accountsFeatureToggles: AccountsFeatureToggles,
@ -88,22 +88,22 @@ internal class DefaultHotCryptoRepository(
return hotCryptoResponseStore.get()
.map { it[userWalletId] }
.filterNotNull()
.map {
val userWallet = userWalletsStore.getSyncOrNull(userWalletId)
.map { response ->
val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId)
?: error("UserWalletId [$userWalletId] not found")
HotCryptoCurrencyConverter(
userWallet = userWallet,
imageHost = it.imageHost,
imageHost = response.imageHost,
excludedBlockchains = excludedBlockchains,
)
.convertList(input = it.tokens)
.convertList(input = response.tokens)
.filterNotNull()
}
}
private fun getWalletsWithTokensFlow(): Flow<Map<UserWallet, List<UserTokensResponse.Token>>> {
return userWalletsStore.userWallets.flatMapLatest { userWallets ->
return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
val flows = userWallets.map { userWallet ->
if (accountsFeatureToggles.isFeatureEnabled) {
walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() }
@ -131,12 +131,13 @@ internal class DefaultHotCryptoRepository(
tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow()
}
.onSuccess { Timber.d("HotCrypto is successfully updated") }
.onFailure {
Timber.e(it, "Unable to fetch hot crypto")
.onFailure { throwable ->
Timber.e(throwable, "Unable to fetch hot crypto")
val httpException = throwable as? ApiResponseError.HttpException
analyticsEventHandler.send(
event = MainScreenAnalyticsEvent.HotTokenError(
errorCode = (it as? ApiResponseError.HttpException)?.code?.numericCode?.toString().orEmpty(),
errorCode = httpException?.code?.numericCode?.toString().orEmpty(),
),
)
}
@ -164,11 +165,11 @@ internal class DefaultHotCryptoRepository(
}
private fun List<HotCryptoResponse.Token>.applyTokensIdMigrations(): List<HotCryptoResponse.Token> {
return this.map {
if (it.id == OLD_POLYGON_NAME) {
it.copy(id = NEW_POLYGON_NAME)
return this.map { token ->
if (token.id == OLD_POLYGON_NAME) {
token.copy(id = NEW_POLYGON_NAME)
} else {
it
token
}
}
}

View file

@ -138,7 +138,7 @@ internal class DefaultOnrampRepository(
}
}
val country = onrampApi.getCountryByIp(
val response = onrampApi.getCountryByIp(
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
@ -146,7 +146,8 @@ internal class DefaultOnrampRepository(
),
)
.getOrThrow()
.let(countryConverter::convert)
val country = countryConverter.convert(response)
onrampCurrentCountryByIPStore.store(country)
@ -154,7 +155,7 @@ internal class DefaultOnrampRepository(
}
override suspend fun getStatus(userWallet: UserWallet, txId: String): OnrampStatus = withContext(dispatchers.io) {
onrampApi.getStatus(
val response = onrampApi.getStatus(
userWalletId = userWallet.walletId.stringValue,
refCode = ExpressUtils.getRefCode(
userWallet = userWallet,
@ -163,7 +164,8 @@ internal class DefaultOnrampRepository(
txId = txId,
)
.getOrThrow()
.let(statusConverter::convert)
statusConverter.convert(response)
}
override suspend fun saveDefaultCurrency(currency: OnrampCurrency) = withContext(dispatchers.io) {
@ -218,9 +220,9 @@ internal class DefaultOnrampRepository(
),
).bind()
},
onError = {
Timber.w(it, "Unable to fetch onramp payment methods")
throw it
onError = { error ->
Timber.w(error, "Unable to fetch onramp payment methods")
throw error
},
)
paymentMethodsStore.store(PAYMENT_METHODS_KEY, response.removeApplePay())
@ -253,9 +255,9 @@ internal class DefaultOnrampRepository(
),
).bind()
},
onError = {
Timber.w(it, "Unable to fetch onramp pairs")
throw it
onError = { error ->
Timber.w(error, "Unable to fetch onramp pairs")
throw error
},
)
}
@ -270,9 +272,9 @@ internal class DefaultOnrampRepository(
),
).bind()
},
onError = {
Timber.w(it, "Unable to fetch express providers")
throw it
onError = { error ->
Timber.w(error, "Unable to fetch express providers")
throw error
},
)
}
@ -291,10 +293,10 @@ internal class DefaultOnrampRepository(
cryptoCurrency = cryptoCurrency,
)
val cachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)
val isCachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)
if (cachedValue != null) {
return@withContext cachedValue
if (isCachedValue != null) {
return@withContext isCachedValue
}
val onrampPairs =
@ -318,9 +320,9 @@ internal class DefaultOnrampRepository(
),
).bind()
},
onError = {
Timber.w(it, "Unable to fetch onramp pairs")
throw it
onError = { error ->
Timber.w(error, "Unable to fetch onramp pairs")
throw error
},
)
@ -525,9 +527,11 @@ internal class DefaultOnrampRepository(
}
private suspend fun getPaymentMethods(): List<OnrampPaymentMethod> {
return requireNotNull(paymentMethodsStore.getSyncOrNull(PAYMENT_METHODS_KEY)) {
val methods = requireNotNull(paymentMethodsStore.getSyncOrNull(PAYMENT_METHODS_KEY)) {
"Onramp payment methods is absent in storage"
}.let(paymentMethodsConverter::convertList)
}
return paymentMethodsConverter.convertList(methods)
}
private fun createOnrampTransaction(

View file

@ -100,7 +100,7 @@ internal class DefaultOnrampTransactionRepository(
mutablePreferences.setObjectSet<OnrampTransactionDTO>(
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
value = stored ?: emptySet(),
value = stored.orEmpty(),
)
}
}

View file

@ -28,8 +28,8 @@ import com.tangem.datasource.local.onramp.sepa.OnrampCurrentCountryByIPStore
import com.tangem.datasource.local.onramp.sepa.OnrampSepaAvailabilityStore
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.onramp.repositories.*
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -105,7 +105,7 @@ internal object OnrampDataModule {
fun provideHotCryptoRepository(
excludedBlockchains: ExcludedBlockchains,
hotCryptoResponseStore: HotCryptoResponseStore,
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
tangemTechApi: TangemTechApi,
appCurrencyResponseStore: AppCurrencyResponseStore,
dispatchers: CoroutineDispatcherProvider,
@ -117,7 +117,7 @@ internal object OnrampDataModule {
return DefaultHotCryptoRepository(
excludedBlockchains = excludedBlockchains,
hotCryptoResponseStore = hotCryptoResponseStore,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
tangemTechApi = tangemTechApi,
appCurrencyResponseStore = appCurrencyResponseStore,
dispatchers = dispatchers,

View file

@ -1,10 +0,0 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>MultilineLambdaItParameter:CustomTokensMerger.kt$CustomTokensMerger${ Timber.e(it, "Unable to fetch token:\n$token") null }</ID>
<ID>NullableToStringCall:AccountListCryptoCurrenciesFetcher.kt$AccountListCryptoCurrenciesFetcher$${this::class.simpleName}</ID>
<ID>NullableToStringCall:DefaultMultiWalletCryptoCurrenciesFetcher.kt$DefaultMultiWalletCryptoCurrenciesFetcher$${this::class.simpleName}</ID>
<ID>UseOrEmpty:DefaultYieldSupplyWarningsViewedRepository.kt$DefaultYieldSupplyWarningsViewedRepository$appPreferencesStore.getObjectSet&lt;String&gt;(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY).firstOrNull() ?: emptySet()</ID>
</CurrentIssues>
</SmellBaseline>

View file

@ -4,11 +4,10 @@ import arrow.core.Either
import arrow.core.right
import com.tangem.data.common.account.WalletAccountsFetcher
import com.tangem.datasource.api.tangemTech.models.account.flattenTokens
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.core.utils.catchOn
import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.express.models.ExpressAsset
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.isMultiCurrency
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher.Params
@ -17,7 +16,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
/**
* Implementation of [MultiWalletCryptoCurrenciesFetcher] that fetches crypto currencies of all accounts
*
* @property userWalletsStore [UserWallet]'s store
* @property userWalletsListRepository repository to get user wallets
* @property walletAccountsFetcher instance of [WalletAccountsFetcher] to fetch accounts for a multi wallet
* @property expressServiceFetcher fetcher of express service
* @property dispatchers dispatchers
@ -25,7 +24,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
[REDACTED_AUTHOR]
*/
internal class AccountListCryptoCurrenciesFetcher(
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val walletAccountsFetcher: WalletAccountsFetcher,
private val expressServiceFetcher: ExpressServiceFetcher,
private val dispatchers: CoroutineDispatcherProvider,
@ -33,7 +32,7 @@ internal class AccountListCryptoCurrenciesFetcher(
override suspend fun invoke(params: Params): Either<Throwable, Unit> {
return Either.catchOn(dispatchers.default) {
val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId)
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")

View file

@ -10,7 +10,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
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.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.core.utils.catchOn
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher
@ -26,7 +26,6 @@ import timber.log.Timber
/**
* Default implementation of [MultiWalletCryptoCurrenciesFetcher]
*
* @property userWalletsStore [UserWallet]'s store
* @property tangemTechApi Tangem Tech API
* @property userTokensResponseStore store of [UserTokensResponse]
* @property userTokensSaver user tokens saver
@ -39,7 +38,7 @@ import timber.log.Timber
@Suppress("LongParameterList")
internal class DefaultMultiWalletCryptoCurrenciesFetcher(
private val demoConfig: DemoConfig,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val tangemTechApi: TangemTechApi,
private val customTokensMerger: CustomTokensMerger,
private val userTokensResponseStore: UserTokensResponseStore,
@ -52,7 +51,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcher(
private val userTokensResponseFactory = UserTokensResponseFactory()
override suspend fun invoke(params: Params) = Either.catchOn(dispatchers.default) {
val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId)
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")

View file

@ -8,8 +8,8 @@ import com.tangem.data.tokens.DefaultMultiWalletCryptoCurrenciesFetcher
import com.tangem.data.tokens.utils.CustomTokensMerger
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
@ -29,7 +29,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
fun provideMultiWalletCryptoCurrenciesFetcher(
accountsFeatureToggles: AccountsFeatureToggles,
tangemTechApi: TangemTechApi,
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
userTokensResponseStore: UserTokensResponseStore,
userTokensSaver: UserTokensSaver,
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
@ -39,7 +39,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
): MultiWalletCryptoCurrenciesFetcher {
return if (accountsFeatureToggles.isFeatureEnabled) {
AccountListCryptoCurrenciesFetcher(
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
walletAccountsFetcher = walletAccountsFetcher,
expressServiceFetcher = expressServiceFetcher,
dispatchers = dispatchers,
@ -47,7 +47,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
} else {
DefaultMultiWalletCryptoCurrenciesFetcher(
demoConfig = DemoConfig,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
tangemTechApi = tangemTechApi,
customTokensMerger = CustomTokensMerger(
tangemTechApi = tangemTechApi,

View file

@ -13,8 +13,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.TokenReceiveWarningActionStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier
import com.tangem.domain.tokens.repository.CurrenciesRepository
@ -39,7 +39,7 @@ internal object TokensDataModule {
fun provideCurrenciesRepository(
tangemTechApi: TangemTechApi,
userTokensResponseStore: UserTokensResponseStore,
userWalletsStore: UserWalletsStore,
userWalletsListRepository: UserWalletsListRepository,
walletManagersFacade: WalletManagersFacade,
cacheRegistry: CacheRegistry,
dispatchers: CoroutineDispatcherProvider,
@ -53,7 +53,7 @@ internal object TokensDataModule {
): CurrenciesRepository {
return DefaultCurrenciesRepository(
tangemTechApi = tangemTechApi,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
walletManagersFacade = walletManagersFacade,
cacheRegistry = cacheRegistry,
userTokensResponseStore = userTokensResponseStore,

View file

@ -13,10 +13,10 @@ import com.tangem.datasource.api.common.response.getOrThrow
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.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.CardTypesResolver
import com.tangem.domain.card.common.util.cardTypesResolver
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.core.error.DataError
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher
@ -41,7 +41,7 @@ import com.tangem.blockchain.common.FeePaidCurrency as FeePaidSdkCurrency
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
internal class DefaultCurrenciesRepository(
private val tangemTechApi: TangemTechApi,
private val userWalletsStore: UserWalletsStore,
private val userWalletsListRepository: UserWalletsListRepository,
private val walletManagersFacade: WalletManagersFacade,
private val cacheRegistry: CacheRegistry,
private val expressServiceFetcher: ExpressServiceFetcher,
@ -104,7 +104,7 @@ internal class DefaultCurrenciesRepository(
)
fetchExpressAssetsByNetworkIds(
userWallet = userWalletsStore.getSyncStrict(key = userWalletId),
userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId),
userTokens = updatedResponse,
)
@ -194,7 +194,7 @@ internal class DefaultCurrenciesRepository(
override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) {
getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send)
@ -211,7 +211,7 @@ internal class DefaultCurrenciesRepository(
refresh: Boolean,
): CryptoCurrency {
return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
userWallet.requireColdWallet()
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
@ -234,7 +234,7 @@ internal class DefaultCurrenciesRepository(
refresh: Boolean,
): List<CryptoCurrency> {
return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
val scanResponse = userWallet.requireColdWallet().scanResponse
val currencies = if (scanResponse.cardTypesResolver.isSingleWalletWithToken()) {
@ -261,7 +261,7 @@ internal class DefaultCurrenciesRepository(
id: CryptoCurrency.ID,
): CryptoCurrency {
return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
userWallet.requireColdWallet()
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
@ -277,7 +277,7 @@ internal class DefaultCurrenciesRepository(
private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
getMultiCurrencyWalletCurrencies(userWallet)
@ -290,7 +290,7 @@ internal class DefaultCurrenciesRepository(
userWalletId: UserWalletId,
refresh: Boolean,
): List<CryptoCurrency> = withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
fetchTokensIfCacheExpired(userWallet, refresh)
@ -344,7 +344,7 @@ internal class DefaultCurrenciesRepository(
derivationPath: Network.DerivationPath,
): CryptoCurrency.Coin {
return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet = userWallet, isMultiCurrencyWalletExpected = true)
fetchTokensIfCacheExpired(userWallet = userWallet, refresh = false)
@ -378,7 +378,7 @@ internal class DefaultCurrenciesRepository(
override fun isTokensGrouped(userWalletId: UserWalletId): Flow<Boolean> {
return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) {
getSavedUserTokensResponse(userWalletId)
@ -394,7 +394,7 @@ internal class DefaultCurrenciesRepository(
override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow<Boolean> {
return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) {
getSavedUserTokensResponse(userWalletId)
@ -481,7 +481,7 @@ internal class DefaultCurrenciesRepository(
contractAddress: String,
networkId: String,
): CryptoCurrency.Token {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
val token = withContext(dispatchers.io) {
val foundToken = tangemTechApi.getCoins(
contractAddress = contractAddress,
@ -513,7 +513,7 @@ internal class DefaultCurrenciesRepository(
override fun getAllWalletsCryptoCurrencies(
currencyRawId: CryptoCurrency.RawID,
): Flow<Map<UserWallet, List<CryptoCurrency>>> {
return userWalletsStore.userWallets.flatMapLatest { userWallets ->
return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
userWallets.filter { it.isMultiCurrency }
.forEach { fetchTokensIfCacheExpired(userWallet = it, refresh = false) }
@ -589,7 +589,7 @@ internal class DefaultCurrenciesRepository(
}
override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? {
return (userWalletsStore.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
return (userWalletsListRepository.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
}
private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow<List<CryptoCurrency>> {
@ -711,7 +711,7 @@ internal class DefaultCurrenciesRepository(
)
private fun ensureIsCorrectUserWallet(userWalletId: UserWalletId, isMultiCurrencyWalletExpected: Boolean) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected)
}

View file

@ -14,8 +14,8 @@ internal class DefaultYieldSupplyWarningsViewedRepository(
) : YieldSupplyWarningsViewedRepository {
override suspend fun getViewedWarnings(): Set<String> = withContext(dispatchers.io) {
appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY).firstOrNull()
?: emptySet()
appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY)
.firstOrNull().orEmpty()
}
override suspend fun view(symbol: String) = withContext(dispatchers.io) {

View file

@ -104,8 +104,8 @@ internal class CustomTokensMerger(
networkIds = token.networkId,
).bind()
},
onError = {
Timber.e(it, "Unable to fetch token:\n$token")
onError = { error ->
Timber.e(error, "Unable to fetch token:\n$token")
null
},
)

View file

@ -4,7 +4,7 @@ import arrow.core.left
import arrow.core.right
import com.tangem.data.common.account.WalletAccountsFetcher
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
@ -22,13 +22,13 @@ import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class AccountListCryptoCurrenciesFetcherTest {
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
private val walletAccountsFetcher: WalletAccountsFetcher = mockk(relaxUnitFun = true)
private val expressServiceFetcher: ExpressServiceFetcher = mockk()
private val dispatchers = TestingCoroutineDispatcherProvider()
private val fetcher = AccountListCryptoCurrenciesFetcher(
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
walletAccountsFetcher = walletAccountsFetcher,
expressServiceFetcher = expressServiceFetcher,
dispatchers = dispatchers,
@ -36,7 +36,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
@BeforeEach
fun resetMocks() {
clearMocks(userWalletsStore, walletAccountsFetcher)
clearMocks(userWalletsListRepository, walletAccountsFetcher)
}
@Test
@ -44,7 +44,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
// Arrange
val params = MultiWalletCryptoCurrenciesFetcher.Params(userWalletId = userWalletId)
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns false }
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
// Act
val actual = fetcher(params)
@ -55,7 +55,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
).left()
assertEither(actual, expected)
verify { userWalletsStore.getSyncStrict(key = params.userWalletId) }
verify { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
coVerify(inverse = true) { walletAccountsFetcher.fetch(any()) }
}
@ -66,7 +66,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
val response = mockk<GetWalletAccountsResponse>(relaxed = true)
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } returns response
coEvery { expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) } returns Unit.right()
@ -77,7 +77,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
assertEitherRight(actual)
coVerify(ordering = Ordering.SEQUENCE) {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet())
}
@ -90,7 +90,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
val error = RuntimeException("fetch error")
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } throws error
// Act
@ -101,7 +101,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerify(ordering = Ordering.SEQUENCE) {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
}
}

View file

@ -13,7 +13,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
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.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.express.models.ExpressAsset
@ -38,7 +38,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
private val cryptoCurrencyFactory = MockCryptoCurrencyFactory()
private val userTokensResponseFactory = UserTokensResponseFactory()
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
private val tangemTechApi: TangemTechApi = mockk()
private val customTokensMerger: CustomTokensMerger = mockk()
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true)
@ -48,7 +48,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
private val fetcher = DefaultMultiWalletCryptoCurrenciesFetcher(
demoConfig = DemoConfig,
userWalletsStore = userWalletsStore,
userWalletsListRepository = userWalletsListRepository,
tangemTechApi = tangemTechApi,
customTokensMerger = customTokensMerger,
userTokensResponseStore = userTokensResponseStore,
@ -61,7 +61,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
@BeforeEach
fun resetMocks() {
clearMocks(
userWalletsStore,
userWalletsListRepository,
tangemTechApi,
userTokensResponseStore,
userTokensSaver,
@ -79,7 +79,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
every { isMultiCurrency } returns false
}
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
// Act
val actual = fetcher(params)
@ -90,7 +90,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
).left()
assertEither(actual, expected)
verifyOrder { userWalletsStore.getSyncStrict(key = params.userWalletId) }
verifyOrder { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
coVerify(inverse = true) {
userTokensResponseStore.getSyncOrNull(any())
}
@ -121,7 +121,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
),
)
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns null
every {
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
@ -145,7 +145,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
@ -169,7 +169,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
)
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns defaultResponse
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery {
@ -191,7 +191,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
@ -219,7 +219,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
)
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery {
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
@ -240,7 +240,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
userTokensSaver.store(userWalletId = params.userWalletId, response = apiResponse.data)
@ -283,7 +283,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
),
)
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
coEvery {
@ -308,7 +308,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
@ -337,7 +337,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
cause = ApiResponseError.TimeoutException(),
) as ApiResponse<UserTokensResponse>
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
coEvery {
@ -359,7 +359,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = defaultResponse)
@ -407,7 +407,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
),
)
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
coEvery {
@ -432,7 +432,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
@ -463,7 +463,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
),
) as ApiResponse<UserTokensResponse>
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
coEvery {
@ -485,7 +485,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected)
coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId)
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
userTokensSaver.push(userWalletId = params.userWalletId, response = defaultResponse)