Updated on 2026-08-14
This commit is contained in:
parent
49cf3b9cef
commit
e17029ce9b
27 changed files with 184 additions and 207 deletions
|
|
@ -6,9 +6,9 @@ import com.tangem.blockchainsdk.utils.toNetworkId
|
|||
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||
import com.tangem.data.common.tokens.getDefaultWalletBlockchains
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.models.account.DerivationIndex
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
|
|
@ -29,7 +29,7 @@ import com.tangem.domain.models.wallet.isMultiCurrency
|
|||
internal class DefaultCardCryptoCurrencyFactory(
|
||||
private val demoConfig: DemoConfig,
|
||||
private val excludedBlockchains: ExcludedBlockchains,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||
private val walletAccountsFetcher: WalletAccountsFetcher,
|
||||
private val userTokensResponseStore: UserTokensResponseStore,
|
||||
|
|
@ -42,7 +42,7 @@ internal class DefaultCardCryptoCurrencyFactory(
|
|||
userWalletId: UserWalletId,
|
||||
networks: Set<Network>,
|
||||
): Map<Network, List<CryptoCurrency>> {
|
||||
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
|
||||
|
||||
// multi-currency wallet
|
||||
if (userWallet !is UserWallet.Cold || userWallet.isMultiCurrency) {
|
||||
|
|
@ -67,7 +67,7 @@ internal class DefaultCardCryptoCurrencyFactory(
|
|||
}
|
||||
|
||||
override suspend fun createByRawId(userWalletId: UserWalletId, network: Network.RawID): List<CryptoCurrency> {
|
||||
val userWallet = userWalletsStore.getSyncStrict(key = userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId)
|
||||
|
||||
val blockchain = network.toBlockchain()
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
|||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
|
|
@ -24,7 +24,7 @@ import timber.log.Timber
|
|||
@Suppress("LongParameterList")
|
||||
class UserTokensSaver(
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val userTokensResponseStore: UserTokensResponseStore,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
private val addressesEnricher: UserTokensResponseAddressesEnricher,
|
||||
|
|
@ -59,7 +59,7 @@ class UserTokensSaver(
|
|||
useEnricher: Boolean = true,
|
||||
onFailSend: () -> Unit = {},
|
||||
) = withContext(dispatchers.io) {
|
||||
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId)
|
||||
|
||||
if (userWallet == null) {
|
||||
Timber.e("UserWallet with id $userWalletId not found. Cannot push tokens.")
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
|||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||
import com.tangem.domain.wallets.repository.WalletsRepository
|
||||
|
|
@ -36,7 +36,7 @@ internal object DataCommonModule {
|
|||
@Singleton
|
||||
fun provideCardCryptoCurrencyFactory(
|
||||
excludedBlockchains: ExcludedBlockchains,
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
accountsFeatureToggles: AccountsFeatureToggles,
|
||||
walletAccountsFetcher: WalletAccountsFetcher,
|
||||
userTokensResponseStore: UserTokensResponseStore,
|
||||
|
|
@ -45,7 +45,7 @@ internal object DataCommonModule {
|
|||
return DefaultCardCryptoCurrencyFactory(
|
||||
demoConfig = DemoConfig,
|
||||
excludedBlockchains = excludedBlockchains,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
accountsFeatureToggles = accountsFeatureToggles,
|
||||
walletAccountsFetcher = walletAccountsFetcher,
|
||||
userTokensResponseStore = userTokensResponseStore,
|
||||
|
|
@ -71,7 +71,7 @@ internal object DataCommonModule {
|
|||
@Singleton
|
||||
fun provideUserTokensSaver(
|
||||
tangemTechApi: TangemTechApi,
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
userTokensResponseStore: UserTokensResponseStore,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
addressesEnricher: UserTokensResponseAddressesEnricher,
|
||||
|
|
@ -81,7 +81,7 @@ internal object DataCommonModule {
|
|||
): UserTokensSaver {
|
||||
return UserTokensSaver(
|
||||
tangemTechApi = tangemTechApi,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
userTokensResponseStore = userTokensResponseStore,
|
||||
dispatchers = dispatchers,
|
||||
addressesEnricher = addressesEnricher,
|
||||
|
|
@ -109,13 +109,13 @@ internal object DataCommonModule {
|
|||
@Provides
|
||||
@Singleton
|
||||
fun provideWalletServerBinder(
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
appsFlyerStore: AppsFlyerStore,
|
||||
tangemTechApi: TangemTechApi,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
): WalletServerBinder {
|
||||
return DefaultWalletServerBinder(
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
tangemTechApi = tangemTechApi,
|
||||
dispatchers = dispatchers,
|
||||
|
|
|
|||
|
|
@ -4,21 +4,21 @@ import com.tangem.datasource.api.common.response.ApiResponse
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.converters.WalletIdBodyConverter
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
internal class DefaultWalletServerBinder(
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : WalletServerBinder {
|
||||
|
||||
override suspend fun bind(userWalletId: UserWalletId): ApiResponse<Unit>? {
|
||||
val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId) ?: return null
|
||||
val userWallet = userWalletsListRepository.getSyncOrNull(id = userWalletId) ?: return null
|
||||
|
||||
return bind(userWallet)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,10 +12,10 @@ import com.tangem.data.common.account.WalletAccountsFetcher
|
|||
import com.tangem.data.common.network.NetworkFactory
|
||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||
import com.tangem.domain.card.configs.GenericCardConfig
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
import com.tangem.domain.models.network.Network
|
||||
|
|
@ -36,7 +36,7 @@ import org.junit.jupiter.params.ParameterizedTest
|
|||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||
internal class DefaultCardCryptoCurrencyFactoryTest {
|
||||
|
||||
private val userWalletsStore: UserWalletsStore = mockk()
|
||||
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
||||
private val userTokensResponseStore: UserTokensResponseStore = mockk()
|
||||
private val excludedBlockchains = ExcludedBlockchains()
|
||||
private val accountsFeatureToggles = mockk<AccountsFeatureToggles>()
|
||||
|
|
@ -45,7 +45,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
private val factory = DefaultCardCryptoCurrencyFactory(
|
||||
demoConfig = DemoConfig,
|
||||
excludedBlockchains = excludedBlockchains,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
userTokensResponseStore = userTokensResponseStore,
|
||||
responseCryptoCurrenciesFactory = ResponseCryptoCurrenciesFactory(
|
||||
networkFactory = NetworkFactory(excludedBlockchains = excludedBlockchains),
|
||||
|
|
@ -63,7 +63,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
|
||||
@BeforeEach
|
||||
fun init() {
|
||||
clearMocks(userWalletsStore, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
|
||||
clearMocks(userWalletsListRepository, userTokensResponseStore, accountsFeatureToggles, walletAccountsFetcher, iconUri)
|
||||
|
||||
mockkStatic(Uri::class)
|
||||
every { Uri.parse(any()) } returns iconUri
|
||||
|
|
@ -82,7 +82,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
val network = ethereum.network
|
||||
|
||||
every { accountsFeatureToggles.isFeatureEnabled } returns false
|
||||
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWallet.walletId) } returns userTokensResponse
|
||||
|
||||
// Act
|
||||
|
|
@ -94,7 +94,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
Truth.assertThat(actual).isEqualTo(expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = userWallet.walletId)
|
||||
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWallet.walletId)
|
||||
}
|
||||
}
|
||||
|
|
@ -131,7 +131,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
// Arrange
|
||||
val userWallet = createSingleWallet()
|
||||
|
||||
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
|
||||
|
||||
// Act
|
||||
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
|
||||
|
|
@ -142,7 +142,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
Truth.assertThat(actual).isEqualTo(expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = userWallet.walletId)
|
||||
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
|
||||
userWallet.scanResponse.cardTypesResolver.getBlockchain()
|
||||
}
|
||||
|
||||
|
|
@ -169,7 +169,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
// Arrange
|
||||
val userWallet = MockUserWalletFactory.createSingleWalletWithToken()
|
||||
|
||||
coEvery { userWalletsStore.getSyncStrict(key = userWallet.walletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncStrict(id = userWallet.walletId) } returns userWallet
|
||||
|
||||
// Act
|
||||
val actual = factory.create(userWalletId = userWallet.walletId, network = model.network)
|
||||
|
|
@ -186,7 +186,7 @@ internal class DefaultCardCryptoCurrencyFactoryTest {
|
|||
Truth.assertThat(actual).isEqualTo(expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = userWallet.walletId)
|
||||
userWalletsListRepository.getSyncStrict(id = userWallet.walletId)
|
||||
userWallet.scanResponse.cardTypesResolver.getBlockchain()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
|||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||
|
|
@ -23,7 +23,7 @@ import org.junit.jupiter.api.TestInstance
|
|||
class UserTokensSaverTest {
|
||||
|
||||
private val tangemTechApi: TangemTechApi = mockk()
|
||||
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
|
||||
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
|
||||
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxed = true)
|
||||
private val enricher: UserTokensResponseAddressesEnricher = mockk()
|
||||
private val accountsFeatureToggles = mockk<AccountsFeatureToggles> {
|
||||
|
|
@ -34,7 +34,7 @@ class UserTokensSaverTest {
|
|||
|
||||
private val userTokensSaver: UserTokensSaver = UserTokensSaver(
|
||||
tangemTechApi = tangemTechApi,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
userTokensResponseStore = userTokensResponseStore,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
addressesEnricher = enricher,
|
||||
|
|
@ -48,7 +48,7 @@ class UserTokensSaverTest {
|
|||
fun resetMocks() {
|
||||
clearMocks(
|
||||
tangemTechApi,
|
||||
userWalletsStore,
|
||||
userWalletsListRepository,
|
||||
userTokensResponseStore,
|
||||
enricher,
|
||||
walletServerBinder,
|
||||
|
|
@ -119,7 +119,7 @@ class UserTokensSaverTest {
|
|||
var onFailSendCalled = false
|
||||
|
||||
every { accountsFeatureToggles.isFeatureEnabled } returns true
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { enricher(userWalletId, response) } returns enrichedResponse
|
||||
coEvery { tangemTechApi.saveTokens(any(), any()) } returns ApiResponse.Error(error) as ApiResponse<Unit>
|
||||
|
||||
|
|
@ -165,7 +165,7 @@ class UserTokensSaverTest {
|
|||
walletType = WalletType.COLD,
|
||||
)
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { enricher(userWalletId, response) } returns enrichedResponse
|
||||
coEvery {
|
||||
tangemTechApi.saveTokens(userWalletId.stringValue, enrichedResponse)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
|||
import com.tangem.datasource.api.tangemTech.models.WalletIdBody
|
||||
import com.tangem.datasource.api.tangemTech.models.WalletType
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
|
|
@ -26,13 +26,13 @@ import org.junit.jupiter.api.TestInstance
|
|||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||
internal class DefaultWalletServerBinderTest {
|
||||
|
||||
private val userWalletsStore: UserWalletsStore = mockk()
|
||||
private val userWalletsListRepository: UserWalletsListRepository = mockk()
|
||||
private val appsFlyerStore: AppsFlyerStore = mockk()
|
||||
private val tangemTechApi: TangemTechApi = mockk()
|
||||
private val dispatchers: CoroutineDispatcherProvider = TestingCoroutineDispatcherProvider()
|
||||
|
||||
private val binder = DefaultWalletServerBinder(
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
tangemTechApi = tangemTechApi,
|
||||
dispatchers = dispatchers
|
||||
|
|
@ -47,7 +47,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
|
||||
@AfterEach
|
||||
fun tearDown() {
|
||||
clearMocks(userWalletsStore, appsFlyerStore, tangemTechApi)
|
||||
clearMocks(userWalletsListRepository, appsFlyerStore, tangemTechApi)
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
|
@ -65,7 +65,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
)
|
||||
val apiResponse = ApiResponse.Success(Unit)
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { appsFlyerStore.get() } returns conversionData
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
|
|
@ -74,22 +74,22 @@ internal class DefaultWalletServerBinderTest {
|
|||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `bind will skipped if userWalletsStore returns null`() = runTest {
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns null
|
||||
fun `bind will skipped if userWalletsListRepository returns null`() = runTest {
|
||||
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns null
|
||||
|
||||
val actual = binder.bind(userWalletId = userWalletId)
|
||||
|
||||
Truth.assertThat(actual).isEqualTo(null)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||
}
|
||||
|
||||
coVerify(inverse = true) {
|
||||
|
|
@ -107,7 +107,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
)
|
||||
val apiResponse = ApiResponse.Success(Unit)
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { appsFlyerStore.get() } returns null
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
|
|
@ -116,7 +116,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
|
|
@ -133,7 +133,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
)
|
||||
val apiResponse = ApiResponse.Error(ApiResponseError.TimeoutException()) as ApiResponse<Unit>
|
||||
|
||||
coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet
|
||||
coEvery { appsFlyerStore.get() } returns conversionData
|
||||
coEvery { tangemTechApi.createWallet(requestBody) } returns apiResponse
|
||||
|
||||
|
|
@ -142,7 +142,7 @@ internal class DefaultWalletServerBinderTest {
|
|||
Truth.assertThat(actual).isEqualTo(apiResponse)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncOrNull(userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||
appsFlyerStore.get()
|
||||
tangemTechApi.createWallet(requestBody)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ import com.tangem.datasource.api.common.response.getOrThrow
|
|||
import com.tangem.datasource.api.markets.TangemTechMarketsApi
|
||||
import com.tangem.datasource.api.markets.models.response.TokenMarketExchangesResponse
|
||||
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.markets.*
|
||||
import com.tangem.domain.markets.repositories.MarketsTokenRepository
|
||||
import com.tangem.domain.models.account.DerivationIndex
|
||||
|
|
@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicLong
|
|||
internal class DefaultMarketsTokenRepository(
|
||||
private val marketsApi: TangemTechMarketsApi,
|
||||
private val quotesFetcher: QuotesFetcher,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val dispatcherProvider: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val cacheRegistry: CacheRegistry,
|
||||
|
|
@ -251,7 +251,7 @@ internal class DefaultMarketsTokenRepository(
|
|||
network: TokenMarketInfo.Network,
|
||||
accountIndex: DerivationIndex?,
|
||||
): CryptoCurrency? {
|
||||
val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("UserWalletId [$userWalletId] not found")
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
val blockchain = Blockchain.fromNetworkId(network.networkId) ?: error("Unknown network [${network.networkId}]")
|
||||
|
||||
return if (network.contractAddress == null) {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import com.tangem.data.common.quote.QuotesFetcher
|
|||
import com.tangem.data.markets.DefaultMarketsTokenRepository
|
||||
import com.tangem.datasource.api.markets.TangemTechMarketsApi
|
||||
import com.tangem.datasource.local.datastore.RuntimeStateStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.markets.repositories.MarketsTokenRepository
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.Module
|
||||
|
|
@ -26,7 +26,7 @@ internal object MarketsDataModule {
|
|||
fun provideMarketsTokenRepository(
|
||||
marketsApi: TangemTechMarketsApi,
|
||||
quotesFetcher: QuotesFetcher,
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
analyticsEventHandler: AnalyticsEventHandler,
|
||||
cacheRegistry: CacheRegistry,
|
||||
|
|
@ -37,7 +37,7 @@ internal object MarketsDataModule {
|
|||
marketsApi = marketsApi,
|
||||
quotesFetcher = quotesFetcher,
|
||||
dispatcherProvider = dispatchers,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
analyticsEventHandler = analyticsEventHandler,
|
||||
cacheRegistry = cacheRegistry,
|
||||
tokenExchangesStore = RuntimeStateStore(defaultValue = emptyList()),
|
||||
|
|
|
|||
|
|
@ -24,11 +24,12 @@ dependencies {
|
|||
// endregion
|
||||
|
||||
// region Project - Domain
|
||||
implementation(projects.domain.legacy)
|
||||
implementation(projects.domain.walletManager)
|
||||
implementation(projects.domain.card)
|
||||
api(projects.domain.models)
|
||||
implementation(projects.domain.common)
|
||||
implementation(projects.domain.legacy)
|
||||
implementation(projects.domain.models)
|
||||
implementation(projects.domain.networks)
|
||||
implementation(projects.domain.walletManager)
|
||||
// endregion
|
||||
|
||||
// region Project - Libs
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import arrow.core.Option
|
|||
import arrow.core.some
|
||||
import com.tangem.data.common.network.NetworkFactory
|
||||
import com.tangem.data.networks.store.NetworksStatusesStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.core.flow.FlowProducerTools
|
||||
import com.tangem.domain.models.network.NetworkStatus
|
||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||
|
|
@ -28,7 +28,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
|
|||
@Assisted val params: MultiNetworkStatusProducer.Params,
|
||||
override val flowProducerTools: FlowProducerTools,
|
||||
private val networksStatusesStore: NetworksStatusesStore,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val networkFactory: NetworkFactory,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : MultiNetworkStatusProducer {
|
||||
|
|
@ -39,7 +39,7 @@ internal class DefaultMultiNetworkStatusProducer @AssistedInject constructor(
|
|||
return networksStatusesStore.get(userWalletId = params.userWalletId)
|
||||
.distinctUntilChanged()
|
||||
.mapNotNull { statuses ->
|
||||
val userWallet = userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
|
||||
if (userWallet == null) {
|
||||
Timber.e("Unable to get UserWallet with provided ID: ${params.userWalletId}")
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ import com.tangem.data.common.network.NetworkFactory
|
|||
import com.tangem.data.networks.models.SimpleNetworkStatus
|
||||
import com.tangem.data.networks.store.NetworksStatusesStore
|
||||
import com.tangem.data.networks.toSimple
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.card.configs.GenericCardConfig
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.core.flow.FlowProducerTools
|
||||
import com.tangem.domain.models.network.NetworkStatus
|
||||
import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||
|
|
@ -33,7 +33,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
private val params = MultiNetworkStatusProducer.Params(userWalletId = userWallet.walletId)
|
||||
|
||||
private val networksStatusesStore = mockk<NetworksStatusesStore>()
|
||||
private val userWalletsStore = mockk<UserWalletsStore>()
|
||||
private val userWalletsListRepository = mockk<UserWalletsListRepository>()
|
||||
private val networkFactory = mockk<NetworkFactory>()
|
||||
private val dispatchers = TestingCoroutineDispatcherProvider()
|
||||
private val flowProducerTools: FlowProducerTools = mockk()
|
||||
|
|
@ -41,7 +41,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
private val producer = DefaultMultiNetworkStatusProducer(
|
||||
params = params,
|
||||
networksStatusesStore = networksStatusesStore,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
networkFactory = networkFactory,
|
||||
dispatchers = dispatchers,
|
||||
flowProducerTools = flowProducerTools,
|
||||
|
|
@ -49,7 +49,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
|
||||
@BeforeEach
|
||||
fun resetMocks() {
|
||||
clearMocks(networksStatusesStore, userWalletsStore, networkFactory)
|
||||
clearMocks(networksStatusesStore, userWalletsListRepository, networkFactory)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -65,7 +65,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
val networksStatusesFlow = flowOf(simpleStatuses)
|
||||
|
||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
|
||||
every {
|
||||
networkFactory.create(
|
||||
|
|
@ -94,7 +94,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
|
||||
verifyOrder {
|
||||
networksStatusesStore.get(params.userWalletId)
|
||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||
|
|
@ -129,7 +129,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
|
||||
// region every
|
||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every {
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
|
|
@ -177,7 +177,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
||||
|
||||
verifyOrder {
|
||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||
|
|
@ -202,7 +202,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
Truth.assertThat(actual2).isEqualTo(expected2)
|
||||
|
||||
verifyOrder {
|
||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
networkFactory.create(
|
||||
networkId = updatedSimpleStatuses.first().id,
|
||||
derivationPath = updatedSimpleStatuses.first().id.derivationPath,
|
||||
|
|
@ -230,7 +230,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
|
||||
// region every
|
||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
|
||||
every {
|
||||
networkFactory.create(
|
||||
|
|
@ -263,7 +263,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
||||
|
||||
verifyOrder {
|
||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||
|
|
@ -312,7 +312,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
|
||||
// region every
|
||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every {
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
|
|
@ -340,7 +340,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
Truth.assertThat(actual1.first()).isEqualTo(expected1)
|
||||
|
||||
verifyOrder(inverse = true) {
|
||||
userWalletsStore.getSyncOrNull(any())
|
||||
userWalletsListRepository.getSyncOrNull(any())
|
||||
networkFactory.create(networkId = any(), derivationPath = any(), userWallet = any())
|
||||
}
|
||||
|
||||
|
|
@ -354,7 +354,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
Truth.assertThat(actual2.first()).isEqualTo(expected2)
|
||||
|
||||
verifyOrder {
|
||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||
|
|
@ -382,7 +382,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
Truth.assertThat(actual.first()).isEqualTo(expected)
|
||||
|
||||
verify { networksStatusesStore.get(params.userWalletId) }
|
||||
verify(inverse = true) { userWalletsStore.getSyncOrNull(params.userWalletId) }
|
||||
verify(inverse = true) { userWalletsListRepository.getSyncOrNull(params.userWalletId) }
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -398,7 +398,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
val networksStatusesFlow = flowOf(simpleStatuses)
|
||||
|
||||
every { networksStatusesStore.get(params.userWalletId) } returns networksStatusesFlow
|
||||
every { userWalletsStore.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
every { userWalletsListRepository.getSyncOrNull(params.userWalletId) } returns userWallet
|
||||
coEvery { networkFactory.create(networkId = any(), any(), any()) } returns null
|
||||
|
||||
// Act
|
||||
|
|
@ -411,7 +411,7 @@ internal class DefaultMultiNetworkStatusProducerTest {
|
|||
|
||||
verifyOrder {
|
||||
networksStatusesStore.get(params.userWalletId)
|
||||
userWalletsStore.getSyncOrNull(params.userWalletId)
|
||||
userWalletsListRepository.getSyncOrNull(params.userWalletId)
|
||||
networkFactory.create(
|
||||
networkId = simpleStatuses.first().id,
|
||||
derivationPath = simpleStatuses.first().id.derivationPath,
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -18,10 +18,10 @@ import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse
|
|||
import com.tangem.datasource.appcurrency.AppCurrencyResponseStore
|
||||
import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.card.common.extensions.canHandleBlockchain
|
||||
import com.tangem.domain.card.common.extensions.canHandleToken
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import com.tangem.domain.onramp.model.HotCryptoCurrency
|
||||
|
|
@ -54,7 +54,7 @@ import timber.log.Timber
|
|||
internal class DefaultHotCryptoRepository(
|
||||
private val excludedBlockchains: ExcludedBlockchains,
|
||||
private val hotCryptoResponseStore: HotCryptoResponseStore,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val appCurrencyResponseStore: AppCurrencyResponseStore,
|
||||
private val accountsFeatureToggles: AccountsFeatureToggles,
|
||||
|
|
@ -88,22 +88,22 @@ internal class DefaultHotCryptoRepository(
|
|||
return hotCryptoResponseStore.get()
|
||||
.map { it[userWalletId] }
|
||||
.filterNotNull()
|
||||
.map {
|
||||
val userWallet = userWalletsStore.getSyncOrNull(userWalletId)
|
||||
.map { response ->
|
||||
val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId)
|
||||
?: error("UserWalletId [$userWalletId] not found")
|
||||
|
||||
HotCryptoCurrencyConverter(
|
||||
userWallet = userWallet,
|
||||
imageHost = it.imageHost,
|
||||
imageHost = response.imageHost,
|
||||
excludedBlockchains = excludedBlockchains,
|
||||
)
|
||||
.convertList(input = it.tokens)
|
||||
.convertList(input = response.tokens)
|
||||
.filterNotNull()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getWalletsWithTokensFlow(): Flow<Map<UserWallet, List<UserTokensResponse.Token>>> {
|
||||
return userWalletsStore.userWallets.flatMapLatest { userWallets ->
|
||||
return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
|
||||
val flows = userWallets.map { userWallet ->
|
||||
if (accountsFeatureToggles.isFeatureEnabled) {
|
||||
walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() }
|
||||
|
|
@ -131,12 +131,13 @@ internal class DefaultHotCryptoRepository(
|
|||
tangemTechApi.getHotCrypto(currencyId = appCurrencyId).getOrThrow()
|
||||
}
|
||||
.onSuccess { Timber.d("HotCrypto is successfully updated") }
|
||||
.onFailure {
|
||||
Timber.e(it, "Unable to fetch hot crypto")
|
||||
.onFailure { throwable ->
|
||||
Timber.e(throwable, "Unable to fetch hot crypto")
|
||||
|
||||
val httpException = throwable as? ApiResponseError.HttpException
|
||||
analyticsEventHandler.send(
|
||||
event = MainScreenAnalyticsEvent.HotTokenError(
|
||||
errorCode = (it as? ApiResponseError.HttpException)?.code?.numericCode?.toString().orEmpty(),
|
||||
errorCode = httpException?.code?.numericCode?.toString().orEmpty(),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
@ -164,11 +165,11 @@ internal class DefaultHotCryptoRepository(
|
|||
}
|
||||
|
||||
private fun List<HotCryptoResponse.Token>.applyTokensIdMigrations(): List<HotCryptoResponse.Token> {
|
||||
return this.map {
|
||||
if (it.id == OLD_POLYGON_NAME) {
|
||||
it.copy(id = NEW_POLYGON_NAME)
|
||||
return this.map { token ->
|
||||
if (token.id == OLD_POLYGON_NAME) {
|
||||
token.copy(id = NEW_POLYGON_NAME)
|
||||
} else {
|
||||
it
|
||||
token
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ internal class DefaultOnrampRepository(
|
|||
}
|
||||
}
|
||||
|
||||
val country = onrampApi.getCountryByIp(
|
||||
val response = onrampApi.getCountryByIp(
|
||||
userWalletId = userWallet.walletId.stringValue,
|
||||
refCode = ExpressUtils.getRefCode(
|
||||
userWallet = userWallet,
|
||||
|
|
@ -146,7 +146,8 @@ internal class DefaultOnrampRepository(
|
|||
),
|
||||
)
|
||||
.getOrThrow()
|
||||
.let(countryConverter::convert)
|
||||
|
||||
val country = countryConverter.convert(response)
|
||||
|
||||
onrampCurrentCountryByIPStore.store(country)
|
||||
|
||||
|
|
@ -154,7 +155,7 @@ internal class DefaultOnrampRepository(
|
|||
}
|
||||
|
||||
override suspend fun getStatus(userWallet: UserWallet, txId: String): OnrampStatus = withContext(dispatchers.io) {
|
||||
onrampApi.getStatus(
|
||||
val response = onrampApi.getStatus(
|
||||
userWalletId = userWallet.walletId.stringValue,
|
||||
refCode = ExpressUtils.getRefCode(
|
||||
userWallet = userWallet,
|
||||
|
|
@ -163,7 +164,8 @@ internal class DefaultOnrampRepository(
|
|||
txId = txId,
|
||||
)
|
||||
.getOrThrow()
|
||||
.let(statusConverter::convert)
|
||||
|
||||
statusConverter.convert(response)
|
||||
}
|
||||
|
||||
override suspend fun saveDefaultCurrency(currency: OnrampCurrency) = withContext(dispatchers.io) {
|
||||
|
|
@ -218,9 +220,9 @@ internal class DefaultOnrampRepository(
|
|||
),
|
||||
).bind()
|
||||
},
|
||||
onError = {
|
||||
Timber.w(it, "Unable to fetch onramp payment methods")
|
||||
throw it
|
||||
onError = { error ->
|
||||
Timber.w(error, "Unable to fetch onramp payment methods")
|
||||
throw error
|
||||
},
|
||||
)
|
||||
paymentMethodsStore.store(PAYMENT_METHODS_KEY, response.removeApplePay())
|
||||
|
|
@ -253,9 +255,9 @@ internal class DefaultOnrampRepository(
|
|||
),
|
||||
).bind()
|
||||
},
|
||||
onError = {
|
||||
Timber.w(it, "Unable to fetch onramp pairs")
|
||||
throw it
|
||||
onError = { error ->
|
||||
Timber.w(error, "Unable to fetch onramp pairs")
|
||||
throw error
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
@ -270,9 +272,9 @@ internal class DefaultOnrampRepository(
|
|||
),
|
||||
).bind()
|
||||
},
|
||||
onError = {
|
||||
Timber.w(it, "Unable to fetch express providers")
|
||||
throw it
|
||||
onError = { error ->
|
||||
Timber.w(error, "Unable to fetch express providers")
|
||||
throw error
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
@ -291,10 +293,10 @@ internal class DefaultOnrampRepository(
|
|||
cryptoCurrency = cryptoCurrency,
|
||||
)
|
||||
|
||||
val cachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)
|
||||
val isCachedValue = onrampSepaAvailabilityStore.getSyncOrNull(key)
|
||||
|
||||
if (cachedValue != null) {
|
||||
return@withContext cachedValue
|
||||
if (isCachedValue != null) {
|
||||
return@withContext isCachedValue
|
||||
}
|
||||
|
||||
val onrampPairs =
|
||||
|
|
@ -318,9 +320,9 @@ internal class DefaultOnrampRepository(
|
|||
),
|
||||
).bind()
|
||||
},
|
||||
onError = {
|
||||
Timber.w(it, "Unable to fetch onramp pairs")
|
||||
throw it
|
||||
onError = { error ->
|
||||
Timber.w(error, "Unable to fetch onramp pairs")
|
||||
throw error
|
||||
},
|
||||
)
|
||||
|
||||
|
|
@ -525,9 +527,11 @@ internal class DefaultOnrampRepository(
|
|||
}
|
||||
|
||||
private suspend fun getPaymentMethods(): List<OnrampPaymentMethod> {
|
||||
return requireNotNull(paymentMethodsStore.getSyncOrNull(PAYMENT_METHODS_KEY)) {
|
||||
val methods = requireNotNull(paymentMethodsStore.getSyncOrNull(PAYMENT_METHODS_KEY)) {
|
||||
"Onramp payment methods is absent in storage"
|
||||
}.let(paymentMethodsConverter::convertList)
|
||||
}
|
||||
|
||||
return paymentMethodsConverter.convertList(methods)
|
||||
}
|
||||
|
||||
private fun createOnrampTransaction(
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ internal class DefaultOnrampTransactionRepository(
|
|||
|
||||
mutablePreferences.setObjectSet<OnrampTransactionDTO>(
|
||||
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
|
||||
value = stored ?: emptySet(),
|
||||
value = stored.orEmpty(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ import com.tangem.datasource.local.onramp.sepa.OnrampCurrentCountryByIPStore
|
|||
import com.tangem.datasource.local.onramp.sepa.OnrampSepaAvailabilityStore
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.onramp.repositories.*
|
||||
import com.tangem.domain.walletmanager.WalletManagersFacade
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
|
|
@ -105,7 +105,7 @@ internal object OnrampDataModule {
|
|||
fun provideHotCryptoRepository(
|
||||
excludedBlockchains: ExcludedBlockchains,
|
||||
hotCryptoResponseStore: HotCryptoResponseStore,
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
tangemTechApi: TangemTechApi,
|
||||
appCurrencyResponseStore: AppCurrencyResponseStore,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
|
|
@ -117,7 +117,7 @@ internal object OnrampDataModule {
|
|||
return DefaultHotCryptoRepository(
|
||||
excludedBlockchains = excludedBlockchains,
|
||||
hotCryptoResponseStore = hotCryptoResponseStore,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
tangemTechApi = tangemTechApi,
|
||||
appCurrencyResponseStore = appCurrencyResponseStore,
|
||||
dispatchers = dispatchers,
|
||||
|
|
|
|||
|
|
@ -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<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY).firstOrNull() ?: emptySet()</ID>
|
||||
</CurrentIssues>
|
||||
</SmellBaseline>
|
||||
|
|
@ -4,11 +4,10 @@ import arrow.core.Either
|
|||
import arrow.core.right
|
||||
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||
import com.tangem.datasource.api.tangemTech.models.account.flattenTokens
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.core.utils.catchOn
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
import com.tangem.domain.express.models.ExpressAsset
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.isMultiCurrency
|
||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
|
||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher.Params
|
||||
|
|
@ -17,7 +16,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
|||
/**
|
||||
* Implementation of [MultiWalletCryptoCurrenciesFetcher] that fetches crypto currencies of all accounts
|
||||
*
|
||||
* @property userWalletsStore [UserWallet]'s store
|
||||
* @property userWalletsListRepository repository to get user wallets
|
||||
* @property walletAccountsFetcher instance of [WalletAccountsFetcher] to fetch accounts for a multi wallet
|
||||
* @property expressServiceFetcher fetcher of express service
|
||||
* @property dispatchers dispatchers
|
||||
|
|
@ -25,7 +24,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
|||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal class AccountListCryptoCurrenciesFetcher(
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val walletAccountsFetcher: WalletAccountsFetcher,
|
||||
private val expressServiceFetcher: ExpressServiceFetcher,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
|
|
@ -33,7 +32,7 @@ internal class AccountListCryptoCurrenciesFetcher(
|
|||
|
||||
override suspend fun invoke(params: Params): Either<Throwable, Unit> {
|
||||
return Either.catchOn(dispatchers.default) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
|
||||
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.core.utils.catchOn
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
|
|
@ -26,7 +26,6 @@ import timber.log.Timber
|
|||
/**
|
||||
* Default implementation of [MultiWalletCryptoCurrenciesFetcher]
|
||||
*
|
||||
* @property userWalletsStore [UserWallet]'s store
|
||||
* @property tangemTechApi Tangem Tech API
|
||||
* @property userTokensResponseStore store of [UserTokensResponse]
|
||||
* @property userTokensSaver user tokens saver
|
||||
|
|
@ -39,7 +38,7 @@ import timber.log.Timber
|
|||
@Suppress("LongParameterList")
|
||||
internal class DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||
private val demoConfig: DemoConfig,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val customTokensMerger: CustomTokensMerger,
|
||||
private val userTokensResponseStore: UserTokensResponseStore,
|
||||
|
|
@ -52,7 +51,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcher(
|
|||
private val userTokensResponseFactory = UserTokensResponseFactory()
|
||||
|
||||
override suspend fun invoke(params: Params) = Either.catchOn(dispatchers.default) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
|
||||
if (!userWallet.isMultiCurrency) error("${this::class.simpleName} supports only multi-currency wallet")
|
||||
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ import com.tangem.data.tokens.DefaultMultiWalletCryptoCurrenciesFetcher
|
|||
import com.tangem.data.tokens.utils.CustomTokensMerger
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesFetcher
|
||||
|
|
@ -29,7 +29,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
|
|||
fun provideMultiWalletCryptoCurrenciesFetcher(
|
||||
accountsFeatureToggles: AccountsFeatureToggles,
|
||||
tangemTechApi: TangemTechApi,
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
userTokensResponseStore: UserTokensResponseStore,
|
||||
userTokensSaver: UserTokensSaver,
|
||||
cardCryptoCurrencyFactory: CardCryptoCurrencyFactory,
|
||||
|
|
@ -39,7 +39,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
|
|||
): MultiWalletCryptoCurrenciesFetcher {
|
||||
return if (accountsFeatureToggles.isFeatureEnabled) {
|
||||
AccountListCryptoCurrenciesFetcher(
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
walletAccountsFetcher = walletAccountsFetcher,
|
||||
expressServiceFetcher = expressServiceFetcher,
|
||||
dispatchers = dispatchers,
|
||||
|
|
@ -47,7 +47,7 @@ internal class MultiWalletCryptoCurrenciesFetcherModule {
|
|||
} else {
|
||||
DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||
demoConfig = DemoConfig,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
tangemTechApi = tangemTechApi,
|
||||
customTokensMerger = CustomTokensMerger(
|
||||
tangemTechApi = tangemTechApi,
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
|||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.token.TokenReceiveWarningActionStore
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
import com.tangem.domain.tokens.MultiWalletCryptoCurrenciesSupplier
|
||||
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
||||
|
|
@ -39,7 +39,7 @@ internal object TokensDataModule {
|
|||
fun provideCurrenciesRepository(
|
||||
tangemTechApi: TangemTechApi,
|
||||
userTokensResponseStore: UserTokensResponseStore,
|
||||
userWalletsStore: UserWalletsStore,
|
||||
userWalletsListRepository: UserWalletsListRepository,
|
||||
walletManagersFacade: WalletManagersFacade,
|
||||
cacheRegistry: CacheRegistry,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
|
|
@ -53,7 +53,7 @@ internal object TokensDataModule {
|
|||
): CurrenciesRepository {
|
||||
return DefaultCurrenciesRepository(
|
||||
tangemTechApi = tangemTechApi,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
walletManagersFacade = walletManagersFacade,
|
||||
cacheRegistry = cacheRegistry,
|
||||
userTokensResponseStore = userTokensResponseStore,
|
||||
|
|
|
|||
|
|
@ -13,10 +13,10 @@ import com.tangem.datasource.api.common.response.getOrThrow
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
|
||||
import com.tangem.domain.card.CardTypesResolver
|
||||
import com.tangem.domain.card.common.util.cardTypesResolver
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.core.error.DataError
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
|
|
@ -41,7 +41,7 @@ import com.tangem.blockchain.common.FeePaidCurrency as FeePaidSdkCurrency
|
|||
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
|
||||
internal class DefaultCurrenciesRepository(
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val userWalletsStore: UserWalletsStore,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val walletManagersFacade: WalletManagersFacade,
|
||||
private val cacheRegistry: CacheRegistry,
|
||||
private val expressServiceFetcher: ExpressServiceFetcher,
|
||||
|
|
@ -104,7 +104,7 @@ internal class DefaultCurrenciesRepository(
|
|||
)
|
||||
|
||||
fetchExpressAssetsByNetworkIds(
|
||||
userWallet = userWalletsStore.getSyncStrict(key = userWalletId),
|
||||
userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId),
|
||||
userTokens = updatedResponse,
|
||||
)
|
||||
|
||||
|
|
@ -194,7 +194,7 @@ internal class DefaultCurrenciesRepository(
|
|||
|
||||
override fun getWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
|
||||
return channelFlow {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
|
||||
if (userWallet.isMultiCurrency) {
|
||||
getMultiCurrencyWalletCurrenciesUpdates(userWalletId).collect(::send)
|
||||
|
|
@ -211,7 +211,7 @@ internal class DefaultCurrenciesRepository(
|
|||
refresh: Boolean,
|
||||
): CryptoCurrency {
|
||||
return withContext(dispatchers.io) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
userWallet.requireColdWallet()
|
||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
|
||||
|
||||
|
|
@ -234,7 +234,7 @@ internal class DefaultCurrenciesRepository(
|
|||
refresh: Boolean,
|
||||
): List<CryptoCurrency> {
|
||||
return withContext(dispatchers.io) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
val scanResponse = userWallet.requireColdWallet().scanResponse
|
||||
|
||||
val currencies = if (scanResponse.cardTypesResolver.isSingleWalletWithToken()) {
|
||||
|
|
@ -261,7 +261,7 @@ internal class DefaultCurrenciesRepository(
|
|||
id: CryptoCurrency.ID,
|
||||
): CryptoCurrency {
|
||||
return withContext(dispatchers.io) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
userWallet.requireColdWallet()
|
||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = false)
|
||||
|
||||
|
|
@ -277,7 +277,7 @@ internal class DefaultCurrenciesRepository(
|
|||
|
||||
private fun getMultiCurrencyWalletCurrenciesUpdates(userWalletId: UserWalletId): Flow<List<CryptoCurrency>> {
|
||||
return channelFlow {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
|
||||
|
||||
getMultiCurrencyWalletCurrencies(userWallet)
|
||||
|
|
@ -290,7 +290,7 @@ internal class DefaultCurrenciesRepository(
|
|||
userWalletId: UserWalletId,
|
||||
refresh: Boolean,
|
||||
): List<CryptoCurrency> = withContext(dispatchers.io) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
|
||||
|
||||
fetchTokensIfCacheExpired(userWallet, refresh)
|
||||
|
|
@ -344,7 +344,7 @@ internal class DefaultCurrenciesRepository(
|
|||
derivationPath: Network.DerivationPath,
|
||||
): CryptoCurrency.Coin {
|
||||
return withContext(dispatchers.io) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
ensureIsCorrectUserWallet(userWallet = userWallet, isMultiCurrencyWalletExpected = true)
|
||||
|
||||
fetchTokensIfCacheExpired(userWallet = userWallet, refresh = false)
|
||||
|
|
@ -378,7 +378,7 @@ internal class DefaultCurrenciesRepository(
|
|||
|
||||
override fun isTokensGrouped(userWalletId: UserWalletId): Flow<Boolean> {
|
||||
return channelFlow {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
|
||||
if (userWallet.isMultiCurrency) {
|
||||
getSavedUserTokensResponse(userWalletId)
|
||||
|
|
@ -394,7 +394,7 @@ internal class DefaultCurrenciesRepository(
|
|||
|
||||
override fun isTokensSortedByBalance(userWalletId: UserWalletId): Flow<Boolean> {
|
||||
return channelFlow {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
|
||||
if (userWallet.isMultiCurrency) {
|
||||
getSavedUserTokensResponse(userWalletId)
|
||||
|
|
@ -481,7 +481,7 @@ internal class DefaultCurrenciesRepository(
|
|||
contractAddress: String,
|
||||
networkId: String,
|
||||
): CryptoCurrency.Token {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
val token = withContext(dispatchers.io) {
|
||||
val foundToken = tangemTechApi.getCoins(
|
||||
contractAddress = contractAddress,
|
||||
|
|
@ -513,7 +513,7 @@ internal class DefaultCurrenciesRepository(
|
|||
override fun getAllWalletsCryptoCurrencies(
|
||||
currencyRawId: CryptoCurrency.RawID,
|
||||
): Flow<Map<UserWallet, List<CryptoCurrency>>> {
|
||||
return userWalletsStore.userWallets.flatMapLatest { userWallets ->
|
||||
return userWalletsListRepository.loadAndGet().flatMapLatest { userWallets ->
|
||||
|
||||
userWallets.filter { it.isMultiCurrency }
|
||||
.forEach { fetchTokensIfCacheExpired(userWallet = it, refresh = false) }
|
||||
|
|
@ -589,7 +589,7 @@ internal class DefaultCurrenciesRepository(
|
|||
}
|
||||
|
||||
override fun getCardTypesResolver(userWalletId: UserWalletId): CardTypesResolver? {
|
||||
return (userWalletsStore.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
|
||||
return (userWalletsListRepository.getSyncStrict(userWalletId) as? UserWallet.Cold)?.cardTypesResolver
|
||||
}
|
||||
|
||||
private fun getMultiCurrencyWalletCurrencies(userWallet: UserWallet): Flow<List<CryptoCurrency>> {
|
||||
|
|
@ -711,7 +711,7 @@ internal class DefaultCurrenciesRepository(
|
|||
)
|
||||
|
||||
private fun ensureIsCorrectUserWallet(userWalletId: UserWalletId, isMultiCurrencyWalletExpected: Boolean) {
|
||||
val userWallet = userWalletsStore.getSyncStrict(userWalletId)
|
||||
val userWallet = userWalletsListRepository.getSyncStrict(userWalletId)
|
||||
|
||||
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@ internal class DefaultYieldSupplyWarningsViewedRepository(
|
|||
) : YieldSupplyWarningsViewedRepository {
|
||||
|
||||
override suspend fun getViewedWarnings(): Set<String> = withContext(dispatchers.io) {
|
||||
appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY).firstOrNull()
|
||||
?: emptySet()
|
||||
appPreferencesStore.getObjectSet<String>(PreferencesKeys.YIELD_SUPPLY_WARNINGS_STATES_KEY)
|
||||
.firstOrNull().orEmpty()
|
||||
}
|
||||
|
||||
override suspend fun view(symbol: String) = withContext(dispatchers.io) {
|
||||
|
|
|
|||
|
|
@ -104,8 +104,8 @@ internal class CustomTokensMerger(
|
|||
networkIds = token.networkId,
|
||||
).bind()
|
||||
},
|
||||
onError = {
|
||||
Timber.e(it, "Unable to fetch token:\n$token")
|
||||
onError = { error ->
|
||||
Timber.e(error, "Unable to fetch token:\n$token")
|
||||
null
|
||||
},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import arrow.core.left
|
|||
import arrow.core.right
|
||||
import com.tangem.data.common.account.WalletAccountsFetcher
|
||||
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
import com.tangem.domain.models.wallet.UserWallet
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
|
|
@ -22,13 +22,13 @@ import org.junit.jupiter.api.TestInstance
|
|||
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||
internal class AccountListCryptoCurrenciesFetcherTest {
|
||||
|
||||
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
|
||||
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
|
||||
private val walletAccountsFetcher: WalletAccountsFetcher = mockk(relaxUnitFun = true)
|
||||
private val expressServiceFetcher: ExpressServiceFetcher = mockk()
|
||||
private val dispatchers = TestingCoroutineDispatcherProvider()
|
||||
|
||||
private val fetcher = AccountListCryptoCurrenciesFetcher(
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
walletAccountsFetcher = walletAccountsFetcher,
|
||||
expressServiceFetcher = expressServiceFetcher,
|
||||
dispatchers = dispatchers,
|
||||
|
|
@ -36,7 +36,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
|
||||
@BeforeEach
|
||||
fun resetMocks() {
|
||||
clearMocks(userWalletsStore, walletAccountsFetcher)
|
||||
clearMocks(userWalletsListRepository, walletAccountsFetcher)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -44,7 +44,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
// Arrange
|
||||
val params = MultiWalletCryptoCurrenciesFetcher.Params(userWalletId = userWalletId)
|
||||
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns false }
|
||||
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
|
||||
|
||||
// Act
|
||||
val actual = fetcher(params)
|
||||
|
|
@ -55,7 +55,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
).left()
|
||||
assertEither(actual, expected)
|
||||
|
||||
verify { userWalletsStore.getSyncStrict(key = params.userWalletId) }
|
||||
verify { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
|
||||
coVerify(inverse = true) { walletAccountsFetcher.fetch(any()) }
|
||||
}
|
||||
|
||||
|
|
@ -66,7 +66,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
|
||||
val response = mockk<GetWalletAccountsResponse>(relaxed = true)
|
||||
|
||||
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
|
||||
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } returns response
|
||||
coEvery { expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet()) } returns Unit.right()
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
assertEitherRight(actual)
|
||||
|
||||
coVerify(ordering = Ordering.SEQUENCE) {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
|
||||
expressServiceFetcher.fetch(userWallet = mockUserWallet, assetIds = emptySet())
|
||||
}
|
||||
|
|
@ -90,7 +90,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
val mockUserWallet = mockk<UserWallet> { every { isMultiCurrency } returns true }
|
||||
val error = RuntimeException("fetch error")
|
||||
|
||||
every { userWalletsStore.getSyncStrict(key = params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(id = params.userWalletId) } returns mockUserWallet
|
||||
coEvery { walletAccountsFetcher.fetch(userWalletId = params.userWalletId) } throws error
|
||||
|
||||
// Act
|
||||
|
|
@ -101,7 +101,7 @@ internal class AccountListCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerify(ordering = Ordering.SEQUENCE) {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
walletAccountsFetcher.fetch(userWalletId = params.userWalletId)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import com.tangem.datasource.api.common.response.ApiResponseError
|
|||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||
import com.tangem.datasource.local.token.UserTokensResponseStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import com.tangem.domain.demo.models.DemoConfig
|
||||
import com.tangem.domain.express.ExpressServiceFetcher
|
||||
import com.tangem.domain.express.models.ExpressAsset
|
||||
|
|
@ -38,7 +38,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
private val cryptoCurrencyFactory = MockCryptoCurrencyFactory()
|
||||
private val userTokensResponseFactory = UserTokensResponseFactory()
|
||||
|
||||
private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true)
|
||||
private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true)
|
||||
private val tangemTechApi: TangemTechApi = mockk()
|
||||
private val customTokensMerger: CustomTokensMerger = mockk()
|
||||
private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true)
|
||||
|
|
@ -48,7 +48,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
|
||||
private val fetcher = DefaultMultiWalletCryptoCurrenciesFetcher(
|
||||
demoConfig = DemoConfig,
|
||||
userWalletsStore = userWalletsStore,
|
||||
userWalletsListRepository = userWalletsListRepository,
|
||||
tangemTechApi = tangemTechApi,
|
||||
customTokensMerger = customTokensMerger,
|
||||
userTokensResponseStore = userTokensResponseStore,
|
||||
|
|
@ -61,7 +61,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
@BeforeEach
|
||||
fun resetMocks() {
|
||||
clearMocks(
|
||||
userWalletsStore,
|
||||
userWalletsListRepository,
|
||||
tangemTechApi,
|
||||
userTokensResponseStore,
|
||||
userTokensSaver,
|
||||
|
|
@ -79,7 +79,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
every { isMultiCurrency } returns false
|
||||
}
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
|
||||
// Act
|
||||
val actual = fetcher(params)
|
||||
|
|
@ -90,7 +90,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
).left()
|
||||
assertEither(actual, expected)
|
||||
|
||||
verifyOrder { userWalletsStore.getSyncStrict(key = params.userWalletId) }
|
||||
verifyOrder { userWalletsListRepository.getSyncStrict(id = params.userWalletId) }
|
||||
coVerify(inverse = true) {
|
||||
userTokensResponseStore.getSyncOrNull(any())
|
||||
}
|
||||
|
|
@ -121,7 +121,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
),
|
||||
)
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns null
|
||||
every {
|
||||
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
||||
|
|
@ -145,7 +145,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
|
||||
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
|
||||
|
|
@ -169,7 +169,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
|
||||
)
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId) } returns defaultResponse
|
||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||
coEvery {
|
||||
|
|
@ -191,7 +191,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = params.userWalletId)
|
||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||
|
|
@ -219,7 +219,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
data = defaultResponse.copy(group = UserTokensResponse.GroupType.TOKEN),
|
||||
)
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||
coEvery {
|
||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||
|
|
@ -240,7 +240,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||
userTokensSaver.store(userWalletId = params.userWalletId, response = apiResponse.data)
|
||||
|
|
@ -283,7 +283,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
),
|
||||
)
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
|
||||
coEvery {
|
||||
|
|
@ -308,7 +308,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = userTokensResponse)
|
||||
|
|
@ -337,7 +337,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
cause = ApiResponseError.TimeoutException(),
|
||||
) as ApiResponse<UserTokensResponse>
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
|
||||
coEvery {
|
||||
|
|
@ -359,7 +359,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||
customTokensMerger.mergeIfPresented(userWalletId = params.userWalletId, response = defaultResponse)
|
||||
|
|
@ -407,7 +407,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
),
|
||||
)
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns null
|
||||
coEvery {
|
||||
|
|
@ -432,7 +432,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||
cardCryptoCurrencyFactory.createDefaultCoinsForMultiCurrencyWallet(mockUserWallet)
|
||||
|
|
@ -463,7 +463,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
),
|
||||
) as ApiResponse<UserTokensResponse>
|
||||
|
||||
every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet
|
||||
coEvery { tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue) } returns apiResponse
|
||||
coEvery { userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId) } returns defaultResponse
|
||||
coEvery {
|
||||
|
|
@ -485,7 +485,7 @@ internal class DefaultMultiWalletCryptoCurrenciesFetcherTest {
|
|||
assertEither(actual, expected)
|
||||
|
||||
coVerifyOrder {
|
||||
userWalletsStore.getSyncStrict(key = params.userWalletId)
|
||||
userWalletsListRepository.getSyncStrict(id = params.userWalletId)
|
||||
tangemTechApi.getUserTokens(userId = params.userWalletId.stringValue)
|
||||
userTokensResponseStore.getSyncOrNull(userWalletId = userWalletId)
|
||||
userTokensSaver.push(userWalletId = params.userWalletId, response = defaultResponse)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue