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.account.WalletAccountsFetcher
import com.tangem.data.common.tokens.getDefaultWalletBlockchains import com.tangem.data.common.tokens.getDefaultWalletBlockchains
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
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.demo.models.DemoConfig import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.account.DerivationIndex
import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrency
@ -29,7 +29,7 @@ import com.tangem.domain.models.wallet.isMultiCurrency
internal class DefaultCardCryptoCurrencyFactory( internal class DefaultCardCryptoCurrencyFactory(
private val demoConfig: DemoConfig, private val demoConfig: DemoConfig,
private val excludedBlockchains: ExcludedBlockchains, private val excludedBlockchains: ExcludedBlockchains,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val accountsFeatureToggles: AccountsFeatureToggles, private val accountsFeatureToggles: AccountsFeatureToggles,
private val walletAccountsFetcher: WalletAccountsFetcher, private val walletAccountsFetcher: WalletAccountsFetcher,
private val userTokensResponseStore: UserTokensResponseStore, private val userTokensResponseStore: UserTokensResponseStore,
@ -42,7 +42,7 @@ internal class DefaultCardCryptoCurrencyFactory(
userWalletId: UserWalletId, userWalletId: UserWalletId,
networks: Set<Network>, networks: Set<Network>,
): Map<Network, List<CryptoCurrency>> { ): Map<Network, List<CryptoCurrency>> {
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
// multi-currency wallet // multi-currency wallet
if (userWallet !is UserWallet.Cold || userWallet.isMultiCurrency) { 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> { 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() 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.api.tangemTech.models.WalletType
import com.tangem.datasource.local.appsflyer.AppsFlyerStore import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
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.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -24,7 +24,7 @@ import timber.log.Timber
@Suppress("LongParameterList") @Suppress("LongParameterList")
class UserTokensSaver( class UserTokensSaver(
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val userTokensResponseStore: UserTokensResponseStore, private val userTokensResponseStore: UserTokensResponseStore,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
private val addressesEnricher: UserTokensResponseAddressesEnricher, private val addressesEnricher: UserTokensResponseAddressesEnricher,
@ -59,7 +59,7 @@ class UserTokensSaver(
useEnricher: Boolean = true, useEnricher: Boolean = true,
onFailSend: () -> Unit = {}, onFailSend: () -> Unit = {},
) = withContext(dispatchers.io) { ) = withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId) val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId)
if (userWallet == null) { if (userWallet == null) {
Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.") 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.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.domain.wallets.repository.WalletsRepository
@ -36,7 +36,7 @@ internal object DataCommonModule {
@Singleton @Singleton
fun provideCardCryptoCurrencyFactory( fun provideCardCryptoCurrencyFactory(
excludedBlockchains: ExcludedBlockchains, excludedBlockchains: ExcludedBlockchains,
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
accountsFeatureToggles: AccountsFeatureToggles, accountsFeatureToggles: AccountsFeatureToggles,
walletAccountsFetcher: WalletAccountsFetcher, walletAccountsFetcher: WalletAccountsFetcher,
userTokensResponseStore: UserTokensResponseStore, userTokensResponseStore: UserTokensResponseStore,
@ -45,7 +45,7 @@ internal object DataCommonModule {
return DefaultCardCryptoCurrencyFactory( return DefaultCardCryptoCurrencyFactory(
demoConfig = DemoConfig, demoConfig = DemoConfig,
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
accountsFeatureToggles = accountsFeatureToggles, accountsFeatureToggles = accountsFeatureToggles,
walletAccountsFetcher = walletAccountsFetcher, walletAccountsFetcher = walletAccountsFetcher,
userTokensResponseStore = userTokensResponseStore, userTokensResponseStore = userTokensResponseStore,
@ -71,7 +71,7 @@ internal object DataCommonModule {
@Singleton @Singleton
fun provideUserTokensSaver( fun provideUserTokensSaver(
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
userTokensResponseStore: UserTokensResponseStore, userTokensResponseStore: UserTokensResponseStore,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
addressesEnricher: UserTokensResponseAddressesEnricher, addressesEnricher: UserTokensResponseAddressesEnricher,
@ -81,7 +81,7 @@ internal object DataCommonModule {
): UserTokensSaver { ): UserTokensSaver {
return UserTokensSaver( return UserTokensSaver(
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore, userTokensResponseStore = userTokensResponseStore,
dispatchers = dispatchers, dispatchers = dispatchers,
addressesEnricher = addressesEnricher, addressesEnricher = addressesEnricher,
@ -109,13 +109,13 @@ internal object DataCommonModule {
@Provides @Provides
@Singleton @Singleton
fun provideWalletServerBinder( fun provideWalletServerBinder(
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
appsFlyerStore: AppsFlyerStore, appsFlyerStore: AppsFlyerStore,
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
): WalletServerBinder { ): WalletServerBinder {
return DefaultWalletServerBinder( return DefaultWalletServerBinder(
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
appsFlyerStore = appsFlyerStore, appsFlyerStore = appsFlyerStore,
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
dispatchers = dispatchers, 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.TangemTechApi
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
import com.tangem.datasource.local.appsflyer.AppsFlyerStore 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.UserWallet
import com.tangem.domain.models.wallet.UserWalletId 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
internal class DefaultWalletServerBinder( internal class DefaultWalletServerBinder(
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val appsFlyerStore: AppsFlyerStore, private val appsFlyerStore: AppsFlyerStore,
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
) : WalletServerBinder { ) : WalletServerBinder {
override suspend fun bind(userWalletId: UserWalletId): ApiResponse<Unit>? { 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) 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.data.common.network.NetworkFactory
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.card.common.util.cardTypesResolver
import com.tangem.domain.card.configs.GenericCardConfig 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.demo.models.DemoConfig
import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.Network
@ -36,7 +36,7 @@ import org.junit.jupiter.params.ParameterizedTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class DefaultCardCryptoCurrencyFactoryTest { internal class DefaultCardCryptoCurrencyFactoryTest {
private val userWalletsStore: UserWalletsStore = mockk() private val userWalletsListRepository: UserWalletsListRepository = mockk()
private val userTokensResponseStore: UserTokensResponseStore = mockk() private val userTokensResponseStore: UserTokensResponseStore = mockk()
private val excludedBlockchains = ExcludedBlockchains() private val excludedBlockchains = ExcludedBlockchains()
private val accountsFeatureToggles = mockk<AccountsFeatureToggles>() private val accountsFeatureToggles = mockk<AccountsFeatureToggles>()
@ -45,7 +45,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
private val factory = DefaultCardCryptoCurrencyFactory( private val factory = DefaultCardCryptoCurrencyFactory(
demoConfig = DemoConfig, demoConfig = DemoConfig,
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore, userTokensResponseStore = userTokensResponseStore,
responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory( responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory(
networkFactory = NetworkFactory(excludedBlockchains = excludedBlockchains), networkFactory = NetworkFactory(excludedBlockchains = excludedBlockchains),
@ -63,7 +63,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
@BeforeEach @BeforeEach
fun init() { fun init() {
clearMocks(userWalletsStore, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri) clearMocks(userWalletsListRepository, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
mockkStatic(Uri::class) mockkStatic(Uri::class)
every { Uri.parse(any()) } returns iconUri every { Uri.parse(any()) } returns iconUri
@ -82,7 +82,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
val network = ethereum.network val network = ethereum.network
every { accountsFeatureToggles.isFeatureEnabled } returns false 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 coEvery { userTokensResponseStore.getSyncOrNull(userWallet.walletId) } returns userTokensResponse
// Act // Act
@ -94,7 +94,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
Truth.assertThat(actual).isEqualTo(expected) Truth.assertThat(actual).isEqualTo(expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = userWallet.walletId) userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
userTokensResponseStore.getSyncOrNull(userWalletId = userWallet.walletId) userTokensResponseStore.getSyncOrNull(userWalletId = userWallet.walletId)
} }
} }
@ -131,7 +131,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
// Arrange // Arrange
val userWallet = createSingleWallet() val userWallet = createSingleWallet()
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
// Act // Act
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network) val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
@ -142,7 +142,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
Truth.assertThat(actual).isEqualTo(expected) Truth.assertThat(actual).isEqualTo(expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = userWallet.walletId) userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
userWallet.scanResponse.cardTypesResolver.getBlockchain() userWallet.scanResponse.cardTypesResolver.getBlockchain()
} }
@ -169,7 +169,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
// Arrange // Arrange
val userWallet = MockUserWalletFactory.createSingleWalletWithToken() val userWallet = MockUserWalletFactory.createSingleWalletWithToken()
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
// Act // Act
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network) val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
@ -186,7 +186,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
Truth.assertThat(actual).isEqualTo(expected) Truth.assertThat(actual).isEqualTo(expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = userWallet.walletId) userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
userWallet.scanResponse.cardTypesResolver.getBlockchain() 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.api.tangemTech.models.WalletType
import com.tangem.datasource.local.appsflyer.AppsFlyerStore import com.tangem.datasource.local.appsflyer.AppsFlyerStore
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
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.utils.coroutines.TestingCoroutineDispatcherProvider import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
@ -23,7 +23,7 @@ import org.junit.jupiter.api.TestInstance
class UserTokensSaverTest { class UserTokensSaverTest {
private val tangemTechApi: TangemTechApi = mockk() 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 userTokensResponseStore: UserTokensResponseStore = mockk(relaxed = true)
private val enricher: UserTokensResponseAddressesEnricher = mockk() private val enricher: UserTokensResponseAddressesEnricher = mockk()
private val accountsFeatureToggles = mockk<AccountsFeatureToggles> { private val accountsFeatureToggles = mockk<AccountsFeatureToggles> {
@ -34,7 +34,7 @@ class UserTokensSaverTest {
private val userTokensSaver: UserTokensSaver = UserTokensSaver( private val userTokensSaver: UserTokensSaver = UserTokensSaver(
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
userTokensResponseStore = userTokensResponseStore, userTokensResponseStore = userTokensResponseStore,
dispatchers = TestingCoroutineDispatcherProvider(), dispatchers = TestingCoroutineDispatcherProvider(),
addressesEnricher = enricher, addressesEnricher = enricher,
@ -48,7 +48,7 @@ class UserTokensSaverTest {
fun resetMocks() { fun resetMocks() {
clearMocks( clearMocks(
tangemTechApi, tangemTechApi,
userWalletsStore, userWalletsListRepository,
userTokensResponseStore, userTokensResponseStore,
enricher, enricher,
walletServerBinder, walletServerBinder,
@ -119,7 +119,7 @@ class UserTokensSaverTest {
var onFailSendCalled = false var onFailSendCalled = false
every { accountsFeatureToggles.isFeatureEnabled } returns true every { accountsFeatureToggles.isFeatureEnabled } returns true
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { enricher(userWalletId, response) } returns enrichedResponse coEvery { enricher(userWalletId, response) } returns enrichedResponse
coEvery { tangemTechApi.saveTokens(any(), any()) } returns ApiResponse.Error(error) as ApiResponse<Unit> coEvery { tangemTechApi.saveTokens(any(), any()) } returns ApiResponse.Error(error) as ApiResponse<Unit>
@ -165,7 +165,7 @@ class UserTokensSaverTest {
walletType = WalletType.COLD, walletType = WalletType.COLD,
) )
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { enricher(userWalletId, response) } returns enrichedResponse coEvery { enricher(userWalletId, response) } returns enrichedResponse
coEvery { coEvery {
tangemTechApi.saveTokens(userWalletId.stringValue, enrichedResponse) 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.WalletIdBody
import com.tangem.datasource.api.tangemTech.models.WalletType import com.tangem.datasource.api.tangemTech.models.WalletType
import com.tangem.datasource.local.appsflyer.AppsFlyerStore 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.UserWallet
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.wallets.models.AppsFlyerConversionData import com.tangem.domain.wallets.models.AppsFlyerConversionData
@ -26,13 +26,13 @@ import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class DefaultWalletServerBinderTest { internal class DefaultWalletServerBinderTest {
private val userWalletsStore: UserWalletsStore = mockk() private val userWalletsListRepository: UserWalletsListRepository = mockk()
private val appsFlyerStore: AppsFlyerStore = mockk() private val appsFlyerStore: AppsFlyerStore = mockk()
private val tangemTechApi: TangemTechApi = mockk() private val tangemTechApi: TangemTechApi = mockk()
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider() private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
private val binder = DefaultWalletServerBinder( private val binder = DefaultWalletServerBinder(
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
appsFlyerStore = appsFlyerStore, appsFlyerStore = appsFlyerStore,
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
dispatchers = dispatchers dispatchers = dispatchers
@ -47,7 +47,7 @@ internal class DefaultWalletServerBinderTest {
@AfterEach @AfterEach
fun tearDown() { fun tearDown() {
clearMocks(userWalletsStore, appsFlyerStore, tangemTechApi) clearMocks(userWalletsListRepository, appsFlyerStore, tangemTechApi)
} }
@Nested @Nested
@ -65,7 +65,7 @@ internal class DefaultWalletServerBinderTest {
) )
val apiResponse = ApiResponse.Success(Unit) val apiResponse = ApiResponse.Success(Unit)
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { appsFlyerStore.get() } returns conversionData coEvery { appsFlyerStore.get() } returns conversionData
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
@ -74,22 +74,22 @@ internal class DefaultWalletServerBinderTest {
Truth.assertThat(actual).isEqualTo(apiResponse) Truth.assertThat(actual).isEqualTo(apiResponse)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId) userWalletsListRepository.getSyncOrNull(userWalletId)
appsFlyerStore.get() appsFlyerStore.get()
tangemTechApi.createWallet(requestBody) tangemTechApi.createWallet(requestBody)
} }
} }
@Test @Test
fun `bind will skipped if userWalletsStore returns null`() = runTest { fun `bind will skipped if userWalletsListRepository returns null`() = runTest {
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns null coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns null
val actual = binder.bind(userWalletId = userWalletId) val actual = binder.bind(userWalletId = userWalletId)
Truth.assertThat(actual).isEqualTo(null) Truth.assertThat(actual).isEqualTo(null)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId) userWalletsListRepository.getSyncOrNull(userWalletId)
} }
coVerify(inverse = true) { coVerify(inverse = true) {
@ -107,7 +107,7 @@ internal class DefaultWalletServerBinderTest {
) )
val apiResponse = ApiResponse.Success(Unit) val apiResponse = ApiResponse.Success(Unit)
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
coEvery { appsFlyerStore.get() } returns null coEvery { appsFlyerStore.get() } returns null
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
@ -116,7 +116,7 @@ internal class DefaultWalletServerBinderTest {
Truth.assertThat(actual).isEqualTo(apiResponse) Truth.assertThat(actual).isEqualTo(apiResponse)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId) userWalletsListRepository.getSyncOrNull(userWalletId)
appsFlyerStore.get() appsFlyerStore.get()
tangemTechApi.createWallet(requestBody) tangemTechApi.createWallet(requestBody)
} }
@ -133,7 +133,7 @@ internal class DefaultWalletServerBinderTest {
) )
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit> 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 { appsFlyerStore.get() } returns conversionData
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
@ -142,7 +142,7 @@ internal class DefaultWalletServerBinderTest {
Truth.assertThat(actual).isEqualTo(apiResponse) Truth.assertThat(actual).isEqualTo(apiResponse)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncOrNull(userWalletId) userWalletsListRepository.getSyncOrNull(userWalletId)
appsFlyerStore.get() appsFlyerStore.get()
tangemTechApi.createWallet(requestBody) 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.TangemTechMarketsApi
import com.tangem.datasource.api.markets.models.response.TokenMarketExchangesResponse import com.tangem.datasource.api.markets.models.response.TokenMarketExchangesResponse
import com.tangem.datasource.local.datastore.RuntimeStateStore 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.appcurrency.model.AppCurrency
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.markets.* import com.tangem.domain.markets.*
import com.tangem.domain.markets.repositories.MarketsTokenRepository import com.tangem.domain.markets.repositories.MarketsTokenRepository
import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.account.DerivationIndex
@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicLong
internal class DefaultMarketsTokenRepository( internal class DefaultMarketsTokenRepository(
private val marketsApi: TangemTechMarketsApi, private val marketsApi: TangemTechMarketsApi,
private val quotesFetcher: QuotesFetcher, private val quotesFetcher: QuotesFetcher,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val dispatcherProvider: CoroutineDispatcherProvider, private val dispatcherProvider: CoroutineDispatcherProvider,
private val analyticsEventHandler: AnalyticsEventHandler, private val analyticsEventHandler: AnalyticsEventHandler,
private val cacheRegistry: CacheRegistry, private val cacheRegistry: CacheRegistry,
@ -251,7 +251,7 @@ internal class DefaultMarketsTokenRepository(
network: TokenMarketInfo.Network, network: TokenMarketInfo.Network,
accountIndex: DerivationIndex?, accountIndex: DerivationIndex?,
): CryptoCurrency? { ): 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}]") val blockchain = Blockchain.fromNetworkId(network.networkId) ?: error("Unknown network [${network.networkId}]")
return if (network.contractAddress == null) { 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.data.markets.DefaultMarketsTokenRepository
import com.tangem.datasource.api.markets.TangemTechMarketsApi import com.tangem.datasource.api.markets.TangemTechMarketsApi
import com.tangem.datasource.local.datastore.RuntimeStateStore 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.domain.markets.repositories.MarketsTokenRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module import dagger.Module
@ -26,7 +26,7 @@ internal object MarketsDataModule {
fun provideMarketsTokenRepository( fun provideMarketsTokenRepository(
marketsApi: TangemTechMarketsApi, marketsApi: TangemTechMarketsApi,
quotesFetcher: QuotesFetcher, quotesFetcher: QuotesFetcher,
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
analyticsEventHandler: AnalyticsEventHandler, analyticsEventHandler: AnalyticsEventHandler,
cacheRegistry: CacheRegistry, cacheRegistry: CacheRegistry,
@ -37,7 +37,7 @@ internal object MarketsDataModule {
marketsApi = marketsApi, marketsApi = marketsApi,
quotesFetcher = quotesFetcher, quotesFetcher = quotesFetcher,
dispatcherProvider = dispatchers, dispatcherProvider = dispatchers,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
analyticsEventHandler = analyticsEventHandler, analyticsEventHandler = analyticsEventHandler,
cacheRegistry = cacheRegistry, cacheRegistry = cacheRegistry,
tokenExchangesStore = RuntimeStateStore(defaultValue = emptyList()), tokenExchangesStore = RuntimeStateStore(defaultValue = emptyList()),

View file

@ -24,11 +24,12 @@ dependencies {
// endregion // endregion
// region Project - Domain // region Project - Domain
implementation(projects.domain.legacy)
implementation(projects.domain.walletManager)
implementation(projects.domain.card) 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.networks)
implementation(projects.domain.walletManager)
// endregion // endregion
// region Project - Libs // region Project - Libs

View file

@ -4,7 +4,7 @@ import arrow.core.Option
import arrow.core.some import arrow.core.some
import com.tangem.data.common.network.NetworkFactory import com.tangem.data.common.network.NetworkFactory
import com.tangem.data.networks.store.NetworksStatusesStore 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.core.flow.FlowProducerTools
import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
@ -28,7 +28,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
@Assisted val params: MultiNetworkStatusProducer.Params, @Assisted val params: MultiNetworkStatusProducer.Params,
override val flowProducerTools: FlowProducerTools, override val flowProducerTools: FlowProducerTools,
private val networksStatusesStore: NetworksStatusesStore, private val networksStatusesStore: NetworksStatusesStore,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val networkFactory: NetworkFactory, private val networkFactory: NetworkFactory,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
) : MultiNetworkStatusProducer { ) : MultiNetworkStatusProducer {
@ -39,7 +39,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
return networksStatusesStore.get(userWalletId = params.userWalletId) return networksStatusesStore.get(userWalletId = params.userWalletId)
.distinctUntilChanged() .distinctUntilChanged()
.mapNotNull { statuses -> .mapNotNull { statuses ->
val userWallet = userWalletsStore.getSyncOrNull(params.userWalletId) val userWallet = userWalletsListRepository.getSyncOrNull(params.userWalletId)
if (userWallet == null) { if (userWallet == null) {
Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}") 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.models.SimpleNetworkStatus
import com.tangem.data.networks.store.NetworksStatusesStore import com.tangem.data.networks.store.NetworksStatusesStore
import com.tangem.data.networks.toSimple import com.tangem.data.networks.toSimple
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.card.configs.GenericCardConfig 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.core.flow.FlowProducerTools
import com.tangem.domain.models.network.NetworkStatus import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
@ -33,7 +33,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
private val params = MultiNetworkStatusProducer.Params(userWalletId = userWallet.walletId) private val params = MultiNetworkStatusProducer.Params(userWalletId = userWallet.walletId)
private val networksStatusesStore = mockk<NetworksStatusesStore>() private val networksStatusesStore = mockk<NetworksStatusesStore>()
private val userWalletsStore = mockk<UserWalletsStore>() private val userWalletsListRepository = mockk<UserWalletsListRepository>()
private val networkFactory = mockk<NetworkFactory>() private val networkFactory = mockk<NetworkFactory>()
private val dispatchers = TestingCoroutineDispatcherProvider() private val dispatchers = TestingCoroutineDispatcherProvider()
private val flowProducerTools: FlowProducerTools = mockk() private val flowProducerTools: FlowProducerTools = mockk()
@ -41,7 +41,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
private val producer = DefaultMultiNetworkStatusProducer( private val producer = DefaultMultiNetworkStatusProducer(
params = params, params = params,
networksStatusesStore = networksStatusesStore, networksStatusesStore = networksStatusesStore,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
networkFactory = networkFactory, networkFactory = networkFactory,
dispatchers = dispatchers, dispatchers = dispatchers,
flowProducerTools = flowProducerTools, flowProducerTools = flowProducerTools,
@ -49,7 +49,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
@BeforeEach @BeforeEach
fun resetMocks() { fun resetMocks() {
clearMocks(networksStatusesStore, userWalletsStore, networkFactory) clearMocks(networksStatusesStore, userWalletsListRepository, networkFactory)
} }
@Test @Test
@ -65,7 +65,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
val networksStatusesFlow = flowOf(simpleStatuses) val networksStatusesFlow = flowOf(simpleStatuses)
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every { every {
networkFactory.create( networkFactory.create(
@ -94,7 +94,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
verifyOrder { verifyOrder {
networksStatusesStore.get(params.userWalletId) networksStatusesStore.get(params.userWalletId)
userWalletsStore.getSyncOrNull(params.userWalletId) userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath, derivationPath = simpleStatuses.first().id.derivationPath,
@ -129,7 +129,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
// region every // region every
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every { every {
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
@ -177,7 +177,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual1.first()).isEqualTo(expected1) Truth.assertThat(actual1.first()).isEqualTo(expected1)
verifyOrder { verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId) userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath, derivationPath = simpleStatuses.first().id.derivationPath,
@ -202,7 +202,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual2).isEqualTo(expected2) Truth.assertThat(actual2).isEqualTo(expected2)
verifyOrder { verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId) userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create( networkFactory.create(
networkId = updatedSimpleStatuses.first().id, networkId = updatedSimpleStatuses.first().id,
derivationPath = updatedSimpleStatuses.first().id.derivationPath, derivationPath = updatedSimpleStatuses.first().id.derivationPath,
@ -230,7 +230,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
// region every // region every
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every { every {
networkFactory.create( networkFactory.create(
@ -263,7 +263,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual1.first()).isEqualTo(expected1) Truth.assertThat(actual1.first()).isEqualTo(expected1)
verifyOrder { verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId) userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath, derivationPath = simpleStatuses.first().id.derivationPath,
@ -312,7 +312,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
// region every // region every
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
every { every {
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
@ -340,7 +340,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual1.first()).isEqualTo(expected1) Truth.assertThat(actual1.first()).isEqualTo(expected1)
verifyOrder(inverse = true) { verifyOrder(inverse = true) {
userWalletsStore.getSyncOrNull(any()) userWalletsListRepository.getSyncOrNull(any())
networkFactory.create(networkId = any(), derivationPath = any(), userWallet = any()) networkFactory.create(networkId = any(), derivationPath = any(), userWallet = any())
} }
@ -354,7 +354,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual2.first()).isEqualTo(expected2) Truth.assertThat(actual2.first()).isEqualTo(expected2)
verifyOrder { verifyOrder {
userWalletsStore.getSyncOrNull(params.userWalletId) userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath, derivationPath = simpleStatuses.first().id.derivationPath,
@ -382,7 +382,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
Truth.assertThat(actual.first()).isEqualTo(expected) Truth.assertThat(actual.first()).isEqualTo(expected)
verify { networksStatusesStore.get(params.userWalletId) } verify { networksStatusesStore.get(params.userWalletId) }
verify(inverse = true) { userWalletsStore.getSyncOrNull(params.userWalletId) } verify(inverse = true) { userWalletsListRepository.getSyncOrNull(params.userWalletId) }
} }
@Test @Test
@ -398,7 +398,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
val networksStatusesFlow = flowOf(simpleStatuses) val networksStatusesFlow = flowOf(simpleStatuses)
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow 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 coEvery { networkFactory.create(networkId = any(), any(), any()) } returns null
// Act // Act
@ -411,7 +411,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
verifyOrder { verifyOrder {
networksStatusesStore.get(params.userWalletId) networksStatusesStore.get(params.userWalletId)
userWalletsStore.getSyncOrNull(params.userWalletId) userWalletsListRepository.getSyncOrNull(params.userWalletId)
networkFactory.create( networkFactory.create(
networkId = simpleStatuses.first().id, networkId = simpleStatuses.first().id,
derivationPath = simpleStatuses.first().id.derivationPath, 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.appcurrency.AppCurrencyResponseStore
import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.common.extensions.canHandleBlockchain import com.tangem.domain.card.common.extensions.canHandleBlockchain
import com.tangem.domain.card.common.extensions.canHandleToken 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.UserWallet
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.onramp.model.HotCryptoCurrency import com.tangem.domain.onramp.model.HotCryptoCurrency
@ -54,7 +54,7 @@ import timber.log.Timber
internal class DefaultHotCryptoRepository( internal class DefaultHotCryptoRepository(
private val excludedBlockchains: ExcludedBlockchains, private val excludedBlockchains: ExcludedBlockchains,
private val hotCryptoResponseStore: HotCryptoResponseStore, private val hotCryptoResponseStore: HotCryptoResponseStore,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val appCurrencyResponseStore: AppCurrencyResponseStore, private val appCurrencyResponseStore: AppCurrencyResponseStore,
private val accountsFeatureToggles: AccountsFeatureToggles, private val accountsFeatureToggles: AccountsFeatureToggles,
@ -88,22 +88,22 @@ internal class DefaultHotCryptoRepository(
return hotCryptoResponseStore.get() return hotCryptoResponseStore.get()
.map { it[userWalletId] } .map { it[userWalletId] }
.filterNotNull() .filterNotNull()
.map { .map { response ->
val userWallet = userWalletsStore.getSyncOrNull(userWalletId) val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId)
?: error("UserWalletId [$userWalletId] not found") ?: error("UserWalletId [$userWalletId] not found")
HotCryptoCurrencyConverter( HotCryptoCurrencyConverter(
userWallet = userWallet, userWallet = userWallet,
imageHost = it.imageHost, imageHost = response.imageHost,
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
) )
.convertList(input = it.tokens) .convertList(input = response.tokens)
.filterNotNull() .filterNotNull()
} }
} }
private fun getWalletsWithTokensFlow(): Flow<Map<UserWallet, List<UserTokensResponse.Token>>> { private fun getWalletsWithTokensFlow(): Flow<Map<UserWallet, List<UserTokensResponse.Token>>> {
return userWalletsStore.userWallets.flatMapLatest { userWallets -> return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
val flows = userWallets.map { userWallet -> val flows = userWallets.map { userWallet ->
if (accountsFeatureToggles.isFeatureEnabled) { if (accountsFeatureToggles.isFeatureEnabled) {
walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() } walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() }
@ -131,12 +131,13 @@ internal class DefaultHotCryptoRepository(
tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow() tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow()
} }
.onSuccess { Timber.d("HotCrypto is successfully updated") } .onSuccess { Timber.d("HotCrypto is successfully updated") }
.onFailure { .onFailure { throwable ->
Timber.e(it, "Unable to fetch hot crypto") Timber.e(throwable, "Unable to fetch hot crypto")
val httpException = throwable as? ApiResponseError.HttpException
analyticsEventHandler.send( analyticsEventHandler.send(
event = MainScreenAnalyticsEvent.HotTokenError( 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> { private fun List<HotCryptoResponse.Token>.applyTokensIdMigrations(): List<HotCryptoResponse.Token> {
return this.map { return this.map { token ->
if (it.id == OLD_POLYGON_NAME) { if (token.id == OLD_POLYGON_NAME) {
it.copy(id = NEW_POLYGON_NAME) token.copy(id = NEW_POLYGON_NAME)
} else { } else {
it token
} }
} }
} }

View file

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

View file

@ -100,7 +100,7 @@ internal class DefaultOnrampTransactionRepository(
mutablePreferences.setObjectSet<OnrampTransactionDTO>( mutablePreferences.setObjectSet<OnrampTransactionDTO>(
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY, 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.onramp.sepa.OnrampSepaAvailabilityStore
import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.onramp.repositories.* import com.tangem.domain.onramp.repositories.*
import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -105,7 +105,7 @@ internal object OnrampDataModule {
fun provideHotCryptoRepository( fun provideHotCryptoRepository(
excludedBlockchains: ExcludedBlockchains, excludedBlockchains: ExcludedBlockchains,
hotCryptoResponseStore: HotCryptoResponseStore, hotCryptoResponseStore: HotCryptoResponseStore,
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
appCurrencyResponseStore: AppCurrencyResponseStore, appCurrencyResponseStore: AppCurrencyResponseStore,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
@ -117,7 +117,7 @@ internal object OnrampDataModule {
return DefaultHotCryptoRepository( return DefaultHotCryptoRepository(
excludedBlockchains = excludedBlockchains, excludedBlockchains = excludedBlockchains,
hotCryptoResponseStore = hotCryptoResponseStore, hotCryptoResponseStore = hotCryptoResponseStore,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
appCurrencyResponseStore = appCurrencyResponseStore, appCurrencyResponseStore = appCurrencyResponseStore,
dispatchers = dispatchers, 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 arrow.core.right
import com.tangem.data.common.account.WalletAccountsFetcher import com.tangem.data.common.account.WalletAccountsFetcher
import com.tangem.datasource.api.tangemTech.models.account.flattenTokens 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.core.utils.catchOn
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.wallet.UserWallet
import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.models.wallet.isMultiCurrency
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher.Params 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 * 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 walletAccountsFetcher instance of [WalletAccountsFetcher] to fetch accounts for a multi wallet
* @property expressServiceFetcher fetcher of express service * @property expressServiceFetcher fetcher of express service
* @property dispatchers dispatchers * @property dispatchers dispatchers
@ -25,7 +24,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
[REDACTED_AUTHOR] [REDACTED_AUTHOR]
*/ */
internal class AccountListCryptoCurrenciesFetcher( internal class AccountListCryptoCurrenciesFetcher(
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val walletAccountsFetcher: WalletAccountsFetcher, private val walletAccountsFetcher: WalletAccountsFetcher,
private val expressServiceFetcher: ExpressServiceFetcher, private val expressServiceFetcher: ExpressServiceFetcher,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
@ -33,7 +32,7 @@ internal class AccountListCryptoCurrenciesFetcher(
override suspend fun invoke(params: Params): Either<Throwable, Unit> { override suspend fun invoke(params: Params): Either<Throwable, Unit> {
return Either.catchOn(dispatchers.default) { 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") 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.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore 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.core.utils.catchOn
import com.tangem.domain.demo.models.DemoConfig import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.express.ExpressServiceFetcher
@ -26,7 +26,6 @@ import timber.log.Timber
/** /**
* Default implementation of [MultiWalletCryptoCurrenciesFetcher] * Default implementation of [MultiWalletCryptoCurrenciesFetcher]
* *
* @property userWalletsStore [UserWallet]'s store
* @property tangemTechApi Tangem Tech API * @property tangemTechApi Tangem Tech API
* @property userTokensResponseStore store of [UserTokensResponse] * @property userTokensResponseStore store of [UserTokensResponse]
* @property userTokensSaver user tokens saver * @property userTokensSaver user tokens saver
@ -39,7 +38,7 @@ import timber.log.Timber
@Suppress("LongParameterList") @Suppress("LongParameterList")
internal class DefaultMultiWalletCryptoCurrenciesFetcher( internal class DefaultMultiWalletCryptoCurrenciesFetcher(
private val demoConfig: DemoConfig, private val demoConfig: DemoConfig,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val customTokensMerger: CustomTokensMerger, private val customTokensMerger: CustomTokensMerger,
private val userTokensResponseStore: UserTokensResponseStore, private val userTokensResponseStore: UserTokensResponseStore,
@ -52,7 +51,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcher(
private val userTokensResponseFactory = UserTokensResponseFactory() private val userTokensResponseFactory = UserTokensResponseFactory()
override suspend fun invoke(params: Params) = Either.catchOn(dispatchers.default) { 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") 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.data.tokens.utils.CustomTokensMerger
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.demo.models.DemoConfig import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.express.ExpressServiceFetcher
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
@ -29,7 +29,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
fun provideMultiWalletCryptoCurrenciesFetcher( fun provideMultiWalletCryptoCurrenciesFetcher(
accountsFeatureToggles: AccountsFeatureToggles, accountsFeatureToggles: AccountsFeatureToggles,
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
userTokensResponseStore: UserTokensResponseStore, userTokensResponseStore: UserTokensResponseStore,
userTokensSaver: UserTokensSaver, userTokensSaver: UserTokensSaver,
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory, cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
@ -39,7 +39,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
): MultiWalletCryptoCurrenciesFetcher { ): MultiWalletCryptoCurrenciesFetcher {
return if (accountsFeatureToggles.isFeatureEnabled) { return if (accountsFeatureToggles.isFeatureEnabled) {
AccountListCryptoCurrenciesFetcher( AccountListCryptoCurrenciesFetcher(
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
walletAccountsFetcher = walletAccountsFetcher, walletAccountsFetcher = walletAccountsFetcher,
expressServiceFetcher = expressServiceFetcher, expressServiceFetcher = expressServiceFetcher,
dispatchers = dispatchers, dispatchers = dispatchers,
@ -47,7 +47,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
} else { } else {
DefaultMultiWalletCryptoCurrenciesFetcher( DefaultMultiWalletCryptoCurrenciesFetcher(
demoConfig = DemoConfig, demoConfig = DemoConfig,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
customTokensMerger = CustomTokensMerger( customTokensMerger = CustomTokensMerger(
tangemTechApi = tangemTechApi, 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.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.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
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
import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.CurrenciesRepository
@ -39,7 +39,7 @@ internal object TokensDataModule {
fun provideCurrenciesRepository( fun provideCurrenciesRepository(
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
userTokensResponseStore: UserTokensResponseStore, userTokensResponseStore: UserTokensResponseStore,
userWalletsStore: UserWalletsStore, userWalletsListRepository: UserWalletsListRepository,
walletManagersFacade: WalletManagersFacade, walletManagersFacade: WalletManagersFacade,
cacheRegistry: CacheRegistry, cacheRegistry: CacheRegistry,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
@ -53,7 +53,7 @@ internal object TokensDataModule {
): CurrenciesRepository { ): CurrenciesRepository {
return DefaultCurrenciesRepository( return DefaultCurrenciesRepository(
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
walletManagersFacade = walletManagersFacade, walletManagersFacade = walletManagersFacade,
cacheRegistry = cacheRegistry, cacheRegistry = cacheRegistry,
userTokensResponseStore = userTokensResponseStore, 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.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore 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.account.featuretoggle.AccountsFeatureToggles
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.core.error.DataError import com.tangem.domain.core.error.DataError
import com.tangem.domain.demo.models.DemoConfig import com.tangem.domain.demo.models.DemoConfig
import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.express.ExpressServiceFetcher
@ -41,7 +41,7 @@ import com.tangem.blockchain.common.FeePaidCurrency as FeePaidSdkCurrency
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions") @Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
internal class DefaultCurrenciesRepository( internal class DefaultCurrenciesRepository(
private val tangemTechApi: TangemTechApi, private val tangemTechApi: TangemTechApi,
private val userWalletsStore: UserWalletsStore, private val userWalletsListRepository: UserWalletsListRepository,
private val walletManagersFacade: WalletManagersFacade, private val walletManagersFacade: WalletManagersFacade,
private val cacheRegistry: CacheRegistry, private val cacheRegistry: CacheRegistry,
private val expressServiceFetcher: ExpressServiceFetcher, private val expressServiceFetcher: ExpressServiceFetcher,
@ -104,7 +104,7 @@ internal class DefaultCurrenciesRepository(
) )
fetchExpressAssetsByNetworkIds( fetchExpressAssetsByNetworkIds(
userWallet = userWalletsStore.getSyncStrict(key = userWalletId), userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId),
userTokens = updatedResponse, userTokens = updatedResponse,
) )
@ -194,7 +194,7 @@ internal class DefaultCurrenciesRepository(
override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> { override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
return channelFlow { return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) { if (userWallet.isMultiCurrency) {
getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send) getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send)
@ -211,7 +211,7 @@ internal class DefaultCurrenciesRepository(
refresh: Boolean, refresh: Boolean,
): CryptoCurrency { ): CryptoCurrency {
return withContext(dispatchers.io) { return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
userWallet.requireColdWallet() userWallet.requireColdWallet()
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false) ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
@ -234,7 +234,7 @@ internal class DefaultCurrenciesRepository(
refresh: Boolean, refresh: Boolean,
): List<CryptoCurrency> { ): List<CryptoCurrency> {
return withContext(dispatchers.io) { return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
val scanResponse = userWallet.requireColdWallet().scanResponse val scanResponse = userWallet.requireColdWallet().scanResponse
val currencies = if (scanResponse.cardTypesResolver.isSingleWalletWithToken()) { val currencies = if (scanResponse.cardTypesResolver.isSingleWalletWithToken()) {
@ -261,7 +261,7 @@ internal class DefaultCurrenciesRepository(
id: CryptoCurrency.ID, id: CryptoCurrency.ID,
): CryptoCurrency { ): CryptoCurrency {
return withContext(dispatchers.io) { return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
userWallet.requireColdWallet() userWallet.requireColdWallet()
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false) ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
@ -277,7 +277,7 @@ internal class DefaultCurrenciesRepository(
private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> { private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
return channelFlow { return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true) ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
getMultiCurrencyWalletCurrencies(userWallet) getMultiCurrencyWalletCurrencies(userWallet)
@ -290,7 +290,7 @@ internal class DefaultCurrenciesRepository(
userWalletId: UserWalletId, userWalletId: UserWalletId,
refresh: Boolean, refresh: Boolean,
): List<CryptoCurrency> = withContext(dispatchers.io) { ): List<CryptoCurrency> = withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true) ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
fetchTokensIfCacheExpired(userWallet, refresh) fetchTokensIfCacheExpired(userWallet, refresh)
@ -344,7 +344,7 @@ internal class DefaultCurrenciesRepository(
derivationPath: Network.DerivationPath, derivationPath: Network.DerivationPath,
): CryptoCurrency.Coin { ): CryptoCurrency.Coin {
return withContext(dispatchers.io) { return withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet = userWallet, isMultiCurrencyWalletExpected = true) ensureIsCorrectUserWallet(userWallet = userWallet, isMultiCurrencyWalletExpected = true)
fetchTokensIfCacheExpired(userWallet = userWallet, refresh = false) fetchTokensIfCacheExpired(userWallet = userWallet, refresh = false)
@ -378,7 +378,7 @@ internal class DefaultCurrenciesRepository(
override fun isTokensGrouped(userWalletId: UserWalletId): Flow<Boolean> { override fun isTokensGrouped(userWalletId: UserWalletId): Flow<Boolean> {
return channelFlow { return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) { if (userWallet.isMultiCurrency) {
getSavedUserTokensResponse(userWalletId) getSavedUserTokensResponse(userWalletId)
@ -394,7 +394,7 @@ internal class DefaultCurrenciesRepository(
override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow<Boolean> { override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow<Boolean> {
return channelFlow { return channelFlow {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
if (userWallet.isMultiCurrency) { if (userWallet.isMultiCurrency) {
getSavedUserTokensResponse(userWalletId) getSavedUserTokensResponse(userWalletId)
@ -481,7 +481,7 @@ internal class DefaultCurrenciesRepository(
contractAddress: String, contractAddress: String,
networkId: String, networkId: String,
): CryptoCurrency.Token { ): CryptoCurrency.Token {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
val token = withContext(dispatchers.io) { val token = withContext(dispatchers.io) {
val foundToken = tangemTechApi.getCoins( val foundToken = tangemTechApi.getCoins(
contractAddress = contractAddress, contractAddress = contractAddress,
@ -513,7 +513,7 @@ internal class DefaultCurrenciesRepository(
override fun getAllWalletsCryptoCurrencies( override fun getAllWalletsCryptoCurrencies(
currencyRawId: CryptoCurrency.RawID, currencyRawId: CryptoCurrency.RawID,
): Flow<Map<UserWallet, List<CryptoCurrency>>> { ): Flow<Map<UserWallet, List<CryptoCurrency>>> {
return userWalletsStore.userWallets.flatMapLatest { userWallets -> return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
userWallets.filter { it.isMultiCurrency } userWallets.filter { it.isMultiCurrency }
.forEach { fetchTokensIfCacheExpired(userWallet = it, refresh = false) } .forEach { fetchTokensIfCacheExpired(userWallet = it, refresh = false) }
@ -589,7 +589,7 @@ internal class DefaultCurrenciesRepository(
} }
override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? { 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>> { private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow<List<CryptoCurrency>> {
@ -711,7 +711,7 @@ internal class DefaultCurrenciesRepository(
) )
private fun ensureIsCorrectUserWallet(userWalletId: UserWalletId, isMultiCurrencyWalletExpected: Boolean) { private fun ensureIsCorrectUserWallet(userWalletId: UserWalletId, isMultiCurrencyWalletExpected: Boolean) {
val userWallet = userWalletsStore.getSyncStrict(userWalletId) val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected) ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected)
} }

View file

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

View file

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

View file

@ -4,7 +4,7 @@ import arrow.core.left
import arrow.core.right import arrow.core.right
import com.tangem.data.common.account.WalletAccountsFetcher import com.tangem.data.common.account.WalletAccountsFetcher
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse 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.express.ExpressServiceFetcher
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
@ -22,13 +22,13 @@ import org.junit.jupiter.api.TestInstance
@TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class AccountListCryptoCurrenciesFetcherTest { 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 walletAccountsFetcher: WalletAccountsFetcher = mockk(relaxUnitFun = true)
private val expressServiceFetcher: ExpressServiceFetcher = mockk() private val expressServiceFetcher: ExpressServiceFetcher = mockk()
private val dispatchers = TestingCoroutineDispatcherProvider() private val dispatchers = TestingCoroutineDispatcherProvider()
private val fetcher = AccountListCryptoCurrenciesFetcher( private val fetcher = AccountListCryptoCurrenciesFetcher(
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
walletAccountsFetcher = walletAccountsFetcher, walletAccountsFetcher = walletAccountsFetcher,
expressServiceFetcher = expressServiceFetcher, expressServiceFetcher = expressServiceFetcher,
dispatchers = dispatchers, dispatchers = dispatchers,
@ -36,7 +36,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
@BeforeEach @BeforeEach
fun resetMocks() { fun resetMocks() {
clearMocks(userWalletsStore, walletAccountsFetcher) clearMocks(userWalletsListRepository, walletAccountsFetcher)
} }
@Test @Test
@ -44,7 +44,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
// Arrange // Arrange
val params = MultiWalletCryptoCurrenciesFetcher.Params(userWalletId = userWalletId) val params = MultiWalletCryptoCurrenciesFetcher.Params(userWalletId = userWalletId)
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns false } 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 // Act
val actual = fetcher(params) val actual = fetcher(params)
@ -55,7 +55,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
).left() ).left()
assertEither(actual, expected) assertEither(actual, expected)
verify { userWalletsStore.getSyncStrict(key = params.userWalletId) } verify { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
coVerify(inverse = true) { walletAccountsFetcher.fetch(any()) } coVerify(inverse = true) { walletAccountsFetcher.fetch(any()) }
} }
@ -66,7 +66,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true } val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
val response = mockk<GetWalletAccountsResponse>(relaxed = 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 { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } returns response
coEvery { expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) } returns Unit.right() coEvery { expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) } returns Unit.right()
@ -77,7 +77,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
assertEitherRight(actual) assertEitherRight(actual)
coVerify(ordering = Ordering.SEQUENCE) { coVerify(ordering = Ordering.SEQUENCE) {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
walletAccountsFetcher.fetch(userWalletId = params.userWalletId) walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet())
} }
@ -90,7 +90,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true } val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
val error = RuntimeException("fetch error") 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 coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } throws error
// Act // Act
@ -101,7 +101,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerify(ordering = Ordering.SEQUENCE) { coVerify(ordering = Ordering.SEQUENCE) {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
walletAccountsFetcher.fetch(userWalletId = 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.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import com.tangem.datasource.local.token.UserTokensResponseStore 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.demo.models.DemoConfig
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
@ -38,7 +38,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
private val cryptoCurrencyFactory = MockCryptoCurrencyFactory() private val cryptoCurrencyFactory = MockCryptoCurrencyFactory()
private val userTokensResponseFactory = UserTokensResponseFactory() 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 tangemTechApi: TangemTechApi = mockk()
private val customTokensMerger: CustomTokensMerger = mockk() private val customTokensMerger: CustomTokensMerger = mockk()
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true) private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true)
@ -48,7 +48,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
private val fetcher = DefaultMultiWalletCryptoCurrenciesFetcher( private val fetcher = DefaultMultiWalletCryptoCurrenciesFetcher(
demoConfig = DemoConfig, demoConfig = DemoConfig,
userWalletsStore = userWalletsStore, userWalletsListRepository = userWalletsListRepository,
tangemTechApi = tangemTechApi, tangemTechApi = tangemTechApi,
customTokensMerger = customTokensMerger, customTokensMerger = customTokensMerger,
userTokensResponseStore = userTokensResponseStore, userTokensResponseStore = userTokensResponseStore,
@ -61,7 +61,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
@BeforeEach @BeforeEach
fun resetMocks() { fun resetMocks() {
clearMocks( clearMocks(
userWalletsStore, userWalletsListRepository,
tangemTechApi, tangemTechApi,
userTokensResponseStore, userTokensResponseStore,
userTokensSaver, userTokensSaver,
@ -79,7 +79,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
every { isMultiCurrency } returns false every { isMultiCurrency } returns false
} }
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
// Act // Act
val actual = fetcher(params) val actual = fetcher(params)
@ -90,7 +90,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
).left() ).left()
assertEither(actual, expected) assertEither(actual, expected)
verifyOrder { userWalletsStore.getSyncStrict(key = params.userWalletId) } verifyOrder { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
coVerify(inverse = true) { coVerify(inverse = true) {
userTokensResponseStore.getSyncOrNull(any()) 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 coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns null
every { every {
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet) cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
@ -145,7 +145,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet) cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse) customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
@ -169,7 +169,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN), 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 { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns defaultResponse
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { coEvery {
@ -191,7 +191,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data) customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
@ -219,7 +219,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN), 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 { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { coEvery {
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data) customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
@ -240,7 +240,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data) customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
userTokensSaver.store(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 { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
coEvery { coEvery {
@ -308,7 +308,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse) customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
@ -337,7 +337,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
cause = ApiResponseError.TimeoutException(), cause = ApiResponseError.TimeoutException(),
) as ApiResponse<UserTokensResponse> ) 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 { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
coEvery { coEvery {
@ -359,7 +359,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = defaultResponse) 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 { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
coEvery { coEvery {
@ -432,7 +432,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet) cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
@ -463,7 +463,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
), ),
) as ApiResponse<UserTokensResponse> ) 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 { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
coEvery { coEvery {
@ -485,7 +485,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
assertEither(actual, expected) assertEither(actual, expected)
coVerifyOrder { coVerifyOrder {
userWalletsStore.getSyncStrict(key = params.userWalletId) userWalletsListRepository.getSyncStrict(id = params.userWalletId)
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
userTokensSaver.push(userWalletId = params.userWalletId, response = defaultResponse) userTokensSaver.push(userWalletId = params.userWalletId, response = defaultResponse)