Updated on 2026-08-14

This commit is contained in:
Tangem 2025-04-11 16:19:02 +04:00
parent 784161880d
commit 3d214007f4
14 changed files with 161 additions and 30 deletions

View file

@ -7,6 +7,7 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
import com.tangem.domain.networks.single.SingleNetworkStatusFetcher import com.tangem.domain.networks.single.SingleNetworkStatusFetcher
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
import com.tangem.domain.promo.PromoRepository import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.quotes.QuotesRepositoryV2
import com.tangem.domain.quotes.multi.MultiQuoteFetcher import com.tangem.domain.quotes.multi.MultiQuoteFetcher
import com.tangem.domain.quotes.single.SingleQuoteSupplier import com.tangem.domain.quotes.single.SingleQuoteSupplier
import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingRepository
@ -59,6 +60,7 @@ internal object TokensDomainModule {
networksRepository: NetworksRepository, networksRepository: NetworksRepository,
stakingRepository: StakingRepository, stakingRepository: StakingRepository,
multiNetworkStatusFetcher: MultiNetworkStatusFetcher, multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
multiQuoteFetcher: MultiQuoteFetcher,
tokensFeatureToggles: TokensFeatureToggles, tokensFeatureToggles: TokensFeatureToggles,
): FetchTokenListUseCase { ): FetchTokenListUseCase {
return FetchTokenListUseCase( return FetchTokenListUseCase(
@ -67,6 +69,7 @@ internal object TokensDomainModule {
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
multiNetworkStatusFetcher = multiNetworkStatusFetcher, multiNetworkStatusFetcher = multiNetworkStatusFetcher,
multiQuoteFetcher = multiQuoteFetcher,
tokensFeatureToggles = tokensFeatureToggles, tokensFeatureToggles = tokensFeatureToggles,
) )
} }
@ -172,6 +175,7 @@ internal object TokensDomainModule {
networksRepository: NetworksRepository, networksRepository: NetworksRepository,
stakingRepository: StakingRepository, stakingRepository: StakingRepository,
singleNetworkStatusFetcher: SingleNetworkStatusFetcher, singleNetworkStatusFetcher: SingleNetworkStatusFetcher,
multiQuoteFetcher: MultiQuoteFetcher,
tokensFeatureToggles: TokensFeatureToggles, tokensFeatureToggles: TokensFeatureToggles,
): FetchCurrencyStatusUseCase { ): FetchCurrencyStatusUseCase {
return FetchCurrencyStatusUseCase( return FetchCurrencyStatusUseCase(
@ -180,6 +184,7 @@ internal object TokensDomainModule {
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
singleNetworkStatusFetcher = singleNetworkStatusFetcher, singleNetworkStatusFetcher = singleNetworkStatusFetcher,
multiQuoteFetcher = multiQuoteFetcher,
tokensFeatureToggles = tokensFeatureToggles, tokensFeatureToggles = tokensFeatureToggles,
) )
} }
@ -192,6 +197,7 @@ internal object TokensDomainModule {
networksRepository: NetworksRepository, networksRepository: NetworksRepository,
stakingRepository: StakingRepository, stakingRepository: StakingRepository,
multiNetworkStatusFetcher: MultiNetworkStatusFetcher, multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
multiQuoteFetcher: MultiQuoteFetcher,
tokensFeatureToggles: TokensFeatureToggles, tokensFeatureToggles: TokensFeatureToggles,
): FetchCardTokenListUseCase { ): FetchCardTokenListUseCase {
return FetchCardTokenListUseCase( return FetchCardTokenListUseCase(
@ -200,6 +206,7 @@ internal object TokensDomainModule {
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
multiNetworkStatusFetcher = multiNetworkStatusFetcher, multiNetworkStatusFetcher = multiNetworkStatusFetcher,
multiQuoteFetcher = multiQuoteFetcher,
tokensFeatureToggles = tokensFeatureToggles, tokensFeatureToggles = tokensFeatureToggles,
) )
} }
@ -394,6 +401,7 @@ internal object TokensDomainModule {
tokensFeatureToggles: TokensFeatureToggles, tokensFeatureToggles: TokensFeatureToggles,
currenciesRepository: CurrenciesRepository, currenciesRepository: CurrenciesRepository,
quotesRepository: QuotesRepository, quotesRepository: QuotesRepository,
quotesRepositoryV2: QuotesRepositoryV2,
networksRepository: NetworksRepository, networksRepository: NetworksRepository,
stakingRepository: StakingRepository, stakingRepository: StakingRepository,
singleNetworkStatusSupplier: SingleNetworkStatusSupplier, singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
@ -405,6 +413,7 @@ internal object TokensDomainModule {
return CachedCurrenciesStatusesOperations( return CachedCurrenciesStatusesOperations(
currenciesRepository = currenciesRepository, currenciesRepository = currenciesRepository,
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
quotesRepositoryV2 = quotesRepositoryV2,
networksRepository = networksRepository, networksRepository = networksRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
singleNetworkStatusSupplier = singleNetworkStatusSupplier, singleNetworkStatusSupplier = singleNetworkStatusSupplier,
@ -422,6 +431,7 @@ internal object TokensDomainModule {
tokensFeatureToggles: TokensFeatureToggles, tokensFeatureToggles: TokensFeatureToggles,
currenciesRepository: CurrenciesRepository, currenciesRepository: CurrenciesRepository,
quotesRepository: QuotesRepository, quotesRepository: QuotesRepository,
quotesRepositoryV2: QuotesRepositoryV2,
networksRepository: NetworksRepository, networksRepository: NetworksRepository,
stakingRepository: StakingRepository, stakingRepository: StakingRepository,
singleNetworkStatusSupplier: SingleNetworkStatusSupplier, singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
@ -433,6 +443,7 @@ internal object TokensDomainModule {
return CachedCurrenciesStatusesOperations( return CachedCurrenciesStatusesOperations(
currenciesRepository = currenciesRepository, currenciesRepository = currenciesRepository,
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
quotesRepositoryV2 = quotesRepositoryV2,
networksRepository = networksRepository, networksRepository = networksRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
singleNetworkStatusSupplier = singleNetworkStatusSupplier, singleNetworkStatusSupplier = singleNetworkStatusSupplier,

View file

@ -0,0 +1,25 @@
package com.tangem.data.quotes
import com.tangem.data.quotes.store.QuotesStoreV2
import com.tangem.domain.quotes.QuotesRepositoryV2
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Quote
import javax.inject.Inject
/**
* Default implementation of [QuotesRepositoryV2]
*
* @property quotesStore quotes store
*
[REDACTED_AUTHOR]
*/
internal class DefaultQuotesRepositoryV2 @Inject constructor(
private val quotesStore: QuotesStoreV2,
) : QuotesRepositoryV2 {
override suspend fun getMultiQuoteSyncOrNull(currenciesIds: Set<CryptoCurrency.RawID>): Set<Quote>? {
return quotesStore.getAllSyncOrNull()?.mapTo(hashSetOf()) {
it.takeIf { it.rawCurrencyId in currenciesIds } ?: Quote.Empty(it.rawCurrencyId)
}
}
}

View file

@ -0,0 +1,18 @@
package com.tangem.data.quotes.di
import com.tangem.data.quotes.DefaultQuotesRepositoryV2
import com.tangem.domain.quotes.QuotesRepositoryV2
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal interface QuotesDataModule {
@Binds
@Singleton
fun bindQuotesRepositoryV2(impl: DefaultQuotesRepositoryV2): QuotesRepositoryV2
}

View file

@ -0,0 +1,15 @@
package com.tangem.domain.quotes
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Quote
/**
* Quotes repository
*
[REDACTED_AUTHOR]
*/
interface QuotesRepositoryV2 {
/** Get quotes by [currenciesIds] synchronously or null */
suspend fun getMultiQuoteSyncOrNull(currenciesIds: Set<CryptoCurrency.RawID>): Set<Quote>?
}

View file

@ -5,6 +5,7 @@ import arrow.core.raise.Raise
import arrow.core.raise.catch import arrow.core.raise.catch
import arrow.core.raise.either import arrow.core.raise.either
import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.tokens.error.TokenListError import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency
@ -17,12 +18,14 @@ import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
@Suppress("LongParameterList")
class FetchCardTokenListUseCase( class FetchCardTokenListUseCase(
private val currenciesRepository: CurrenciesRepository, private val currenciesRepository: CurrenciesRepository,
private val networksRepository: NetworksRepository, private val networksRepository: NetworksRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val stakingRepository: StakingRepository, private val stakingRepository: StakingRepository,
private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher, private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
private val multiQuoteFetcher: MultiQuoteFetcher,
private val tokensFeatureToggles: TokensFeatureToggles, private val tokensFeatureToggles: TokensFeatureToggles,
) { ) {
@ -90,10 +93,16 @@ class FetchCardTokenListUseCase(
} }
private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean) { private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean) {
catch( if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
block = { quotesRepository.getQuotesSync(currenciesIds, refresh) }, multiQuoteFetcher(
catch = { /* Ignore error */ }, params = MultiQuoteFetcher.Params(currenciesIds = currenciesIds, appCurrencyId = null),
) )
} else {
catch(
block = { quotesRepository.getQuotesSync(currenciesIds, refresh) },
catch = { /* Ignore error */ },
)
}
} }
private suspend fun fetchYieldBalances( private suspend fun fetchYieldBalances(

View file

@ -5,6 +5,7 @@ import arrow.core.raise.Raise
import arrow.core.raise.catch import arrow.core.raise.catch
import arrow.core.raise.either import arrow.core.raise.either
import com.tangem.domain.networks.single.SingleNetworkStatusFetcher import com.tangem.domain.networks.single.SingleNetworkStatusFetcher
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.tokens.error.CurrencyStatusError import com.tangem.domain.tokens.error.CurrencyStatusError
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency
@ -27,12 +28,14 @@ import kotlinx.coroutines.coroutineScope
* @param quotesRepository The repository for retrieving cryptocurrency quotes. * @param quotesRepository The repository for retrieving cryptocurrency quotes.
*/ */
// TODO: Add tests // TODO: Add tests
@Suppress("LongParameterList")
class FetchCurrencyStatusUseCase( class FetchCurrencyStatusUseCase(
private val currenciesRepository: CurrenciesRepository, private val currenciesRepository: CurrenciesRepository,
private val networksRepository: NetworksRepository, private val networksRepository: NetworksRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val stakingRepository: StakingRepository, private val stakingRepository: StakingRepository,
private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher, private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher,
private val multiQuoteFetcher: MultiQuoteFetcher,
private val tokensFeatureToggles: TokensFeatureToggles, private val tokensFeatureToggles: TokensFeatureToggles,
) { ) {
@ -134,10 +137,19 @@ class FetchCurrencyStatusUseCase(
} }
private suspend fun Raise<CurrencyStatusError>.fetchQuote(currencyId: CryptoCurrency.ID, refresh: Boolean) { private suspend fun Raise<CurrencyStatusError>.fetchQuote(currencyId: CryptoCurrency.ID, refresh: Boolean) {
catch( if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
block = { quotesRepository.getQuotesSync(setOfNotNull(currencyId.rawCurrencyId), refresh) }, multiQuoteFetcher(
) { params = MultiQuoteFetcher.Params(
raise(CurrencyStatusError.DataError(it)) currenciesIds = setOfNotNull(currencyId.rawCurrencyId),
appCurrencyId = null,
),
)
} else {
catch(
block = { quotesRepository.getQuotesSync(setOfNotNull(currencyId.rawCurrencyId), refresh) },
) {
raise(CurrencyStatusError.DataError(it))
}
} }
} }

View file

@ -7,6 +7,7 @@ import arrow.core.raise.either
import arrow.core.raise.ensureNotNull import arrow.core.raise.ensureNotNull
import arrow.core.toNonEmptyListOrNull import arrow.core.toNonEmptyListOrNull
import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.tokens.error.TokenListError import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency
@ -29,12 +30,14 @@ import kotlinx.coroutines.coroutineScope
* @param stakingRepository The repository for retrieving staking-related data. * @param stakingRepository The repository for retrieving staking-related data.
*/ */
// TODO: Add tests // TODO: Add tests
@Suppress("LongParameterList")
class FetchTokenListUseCase( class FetchTokenListUseCase(
private val currenciesRepository: CurrenciesRepository, private val currenciesRepository: CurrenciesRepository,
private val networksRepository: NetworksRepository, private val networksRepository: NetworksRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val stakingRepository: StakingRepository, private val stakingRepository: StakingRepository,
private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher, private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
private val multiQuoteFetcher: MultiQuoteFetcher,
private val tokensFeatureToggles: TokensFeatureToggles, private val tokensFeatureToggles: TokensFeatureToggles,
) { ) {
@ -125,13 +128,22 @@ class FetchTokenListUseCase(
} }
private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.ID>, refresh: Boolean) { private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.ID>, refresh: Boolean) {
catch( if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
block = { multiQuoteFetcher(
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet() params = MultiQuoteFetcher.Params(
quotesRepository.getQuotesSync(rawIds, refresh) currenciesIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet(),
}, appCurrencyId = null,
) { ),
/* Ignore error */ )
} else {
catch(
block = {
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet()
quotesRepository.getQuotesSync(rawIds, refresh)
},
) {
/* Ignore error */
}
} }
} }

View file

@ -10,6 +10,7 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
import com.tangem.domain.networks.single.SingleNetworkStatusProducer import com.tangem.domain.networks.single.SingleNetworkStatusProducer
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
import com.tangem.domain.quotes.QuotesRepositoryV2
import com.tangem.domain.quotes.single.SingleQuoteProducer import com.tangem.domain.quotes.single.SingleQuoteProducer
import com.tangem.domain.quotes.single.SingleQuoteSupplier import com.tangem.domain.quotes.single.SingleQuoteSupplier
import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.staking.model.stakekit.YieldBalance
@ -39,6 +40,7 @@ import kotlinx.coroutines.flow.*
abstract class BaseCurrencyStatusOperations( abstract class BaseCurrencyStatusOperations(
private val currenciesRepository: CurrenciesRepository, private val currenciesRepository: CurrenciesRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val quotesRepositoryV2: QuotesRepositoryV2,
private val networksRepository: NetworksRepository, private val networksRepository: NetworksRepository,
private val stakingRepository: StakingRepository, private val stakingRepository: StakingRepository,
private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier, private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
@ -249,7 +251,12 @@ abstract class BaseCurrencyStatusOperations(
?: return emptyList<CryptoCurrencyStatus>().right() ?: return emptyList<CryptoCurrencyStatus>().right()
val (networks, currenciesIds) = getIds(nonEmptyCurrencies) val (networks, currenciesIds) = getIds(nonEmptyCurrencies)
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet() val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet()
val quotes = quotesRepository.getQuotesSync(rawIds, false).right()
val quotes = if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
quotesRepositoryV2.getMultiQuoteSyncOrNull(currenciesIds = rawIds)?.right()
} else {
quotesRepository.getQuotesSync(rawIds, false).right()
}
val networkStatuses = if (tokensFeatureToggles.isNetworksLoadingRefactoringEnabled) { val networkStatuses = if (tokensFeatureToggles.isNetworksLoadingRefactoringEnabled) {
multiNetworkStatusSupplier( multiNetworkStatusSupplier(

View file

@ -14,6 +14,7 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
import com.tangem.domain.networks.single.SingleNetworkStatusProducer import com.tangem.domain.networks.single.SingleNetworkStatusProducer
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
import com.tangem.domain.quotes.QuotesRepositoryV2
import com.tangem.domain.quotes.multi.MultiQuoteFetcher import com.tangem.domain.quotes.multi.MultiQuoteFetcher
import com.tangem.domain.quotes.single.SingleQuoteProducer import com.tangem.domain.quotes.single.SingleQuoteProducer
import com.tangem.domain.quotes.single.SingleQuoteSupplier import com.tangem.domain.quotes.single.SingleQuoteSupplier
@ -37,6 +38,7 @@ import kotlinx.coroutines.flow.*
class CachedCurrenciesStatusesOperations( class CachedCurrenciesStatusesOperations(
private val currenciesRepository: CurrenciesRepository, private val currenciesRepository: CurrenciesRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
quotesRepositoryV2: QuotesRepositoryV2,
private val networksRepository: NetworksRepository, private val networksRepository: NetworksRepository,
private val stakingRepository: StakingRepository, private val stakingRepository: StakingRepository,
private val singleNetworkStatusSupplier: SingleNetworkStatusSupplier, private val singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
@ -49,6 +51,7 @@ class CachedCurrenciesStatusesOperations(
BaseCurrencyStatusOperations( BaseCurrencyStatusOperations(
currenciesRepository = currenciesRepository, currenciesRepository = currenciesRepository,
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
quotesRepositoryV2 = quotesRepositoryV2,
networksRepository = networksRepository, networksRepository = networksRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
multiNetworkStatusSupplier = multiNetworkStatusSupplier, multiNetworkStatusSupplier = multiNetworkStatusSupplier,

View file

@ -188,6 +188,7 @@ internal class GetPrimaryCurrencyStatusUpdatesUseCaseTest {
multiNetworkStatusSupplier = mockk(), multiNetworkStatusSupplier = mockk(),
multiQuoteFetcher = mockk(), multiQuoteFetcher = mockk(),
singleQuoteSupplier = mockk(), singleQuoteSupplier = mockk(),
quotesRepositoryV2 = mockk(),
), ),
dispatchers = dispatchers, dispatchers = dispatchers,
) )

View file

@ -1,5 +1,3 @@
import com.tangem.plugin.configuration.configurations.extension.kaptForObfuscatingVariants
plugins { plugins {
alias(deps.plugins.android.library) alias(deps.plugins.android.library)
alias(deps.plugins.kotlin.android) alias(deps.plugins.kotlin.android)
@ -23,22 +21,24 @@ dependencies {
/** Domain */ /** Domain */
implementation(projects.domain.appCurrency) implementation(projects.domain.appCurrency)
implementation(projects.domain.appCurrency.models)
implementation(projects.domain.card)
implementation(projects.domain.demo)
implementation(projects.domain.legacy)
implementation(projects.domain.models) implementation(projects.domain.models)
implementation(projects.domain.quotes)
implementation(projects.domain.staking)
implementation(projects.domain.tokens) implementation(projects.domain.tokens)
implementation(projects.domain.tokens.models) implementation(projects.domain.tokens.models)
implementation(projects.domain.transaction)
implementation(projects.domain.transaction.models)
implementation(projects.domain.txhistory.models)
implementation(projects.domain.wallets) implementation(projects.domain.wallets)
implementation(projects.domain.wallets.models) implementation(projects.domain.wallets.models)
implementation(projects.domain.transaction)
implementation(projects.domain.legacy)
implementation(projects.libs.blockchainSdk)
implementation(projects.domain.demo)
implementation(projects.domain.card)
implementation(projects.domain.appCurrency.models)
implementation(projects.domain.txhistory.models)
implementation(projects.domain.transaction.models)
implementation(projects.features.swap.domain.api) implementation(projects.features.swap.domain.api)
implementation(projects.features.swap.domain.models) implementation(projects.features.swap.domain.models)
implementation(projects.domain.staking) implementation(projects.libs.blockchainSdk)
/** Core modules */ /** Core modules */
implementation(projects.core.utils) implementation(projects.core.utils)

View file

@ -15,8 +15,10 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.extenstions.unwrap import com.tangem.domain.appcurrency.extenstions.unwrap
import com.tangem.domain.appcurrency.repository.AppCurrencyRepository import com.tangem.domain.appcurrency.repository.AppCurrencyRepository
import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.quotes.QuotesRepositoryV2
import com.tangem.domain.tokens.GetCryptoCurrencyStatusesSyncUseCase import com.tangem.domain.tokens.GetCryptoCurrencyStatusesSyncUseCase
import com.tangem.domain.tokens.GetCurrencyCheckUseCase import com.tangem.domain.tokens.GetCurrencyCheckUseCase
import com.tangem.domain.tokens.TokensFeatureToggles
import com.tangem.domain.tokens.model.* import com.tangem.domain.tokens.model.*
import com.tangem.domain.tokens.model.warnings.CryptoCurrencyCheck import com.tangem.domain.tokens.model.warnings.CryptoCurrencyCheck
import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.tokens.repository.CurrenciesRepository
@ -62,6 +64,8 @@ internal class SwapInteractorImpl @AssistedInject constructor(
private val createTransactionExtrasUseCase: CreateTransactionDataExtrasUseCase, private val createTransactionExtrasUseCase: CreateTransactionDataExtrasUseCase,
private val isDemoCardUseCase: IsDemoCardUseCase, private val isDemoCardUseCase: IsDemoCardUseCase,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val quotesRepositoryV2: QuotesRepositoryV2,
private val tokensFeatureToggles: TokensFeatureToggles,
private val swapTransactionRepository: SwapTransactionRepository, private val swapTransactionRepository: SwapTransactionRepository,
private val currencyChecksRepository: CurrencyChecksRepository, private val currencyChecksRepository: CurrencyChecksRepository,
private val appCurrencyRepository: AppCurrencyRepository, private val appCurrencyRepository: AppCurrencyRepository,
@ -2166,7 +2170,11 @@ internal class SwapInteractorImpl @AssistedInject constructor(
private suspend fun Set<CryptoCurrency.RawID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> { private suspend fun Set<CryptoCurrency.RawID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> {
return try { return try {
quotesRepository.getQuotesSync(this, refresh) if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
quotesRepositoryV2.getMultiQuoteSyncOrNull(currenciesIds = this).orEmpty()
} else {
quotesRepository.getQuotesSync(this, refresh)
}
} catch (t: Throwable) { } catch (t: Throwable) {
emptySet() emptySet()
} }

View file

@ -86,6 +86,7 @@ dependencies {
implementation(projects.domain.onramp.models) implementation(projects.domain.onramp.models)
implementation(projects.domain.promo) implementation(projects.domain.promo)
implementation(projects.domain.promo.models) implementation(projects.domain.promo.models)
implementation(projects.domain.quotes)
/** Temp dependency to swap domain */ /** Temp dependency to swap domain */
implementation(projects.features.swap.domain) implementation(projects.features.swap.domain)

View file

@ -5,7 +5,9 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.datasource.local.swaptx.ExpressAnalyticsStatus import com.tangem.datasource.local.swaptx.ExpressAnalyticsStatus
import com.tangem.datasource.local.swaptx.SwapTransactionStatusStore import com.tangem.datasource.local.swaptx.SwapTransactionStatusStore
import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.quotes.QuotesRepositoryV2
import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase
import com.tangem.domain.tokens.TokensFeatureToggles
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Quote import com.tangem.domain.tokens.model.Quote
import com.tangem.domain.tokens.model.analytics.TokenExchangeAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenExchangeAnalyticsEvent
@ -15,10 +17,10 @@ import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.feature.swap.domain.SwapTransactionRepository import com.tangem.feature.swap.domain.SwapTransactionRepository
import com.tangem.feature.swap.domain.api.SwapRepository import com.tangem.feature.swap.domain.api.SwapRepository
import com.tangem.feature.swap.domain.models.domain.* import com.tangem.feature.swap.domain.models.domain.*
import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsClickIntents
import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState
import com.tangem.feature.tokendetails.presentation.tokendetails.state.express.ExchangeUM import com.tangem.feature.tokendetails.presentation.tokendetails.state.express.ExchangeUM
import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsSwapTransactionsStateConverter import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsSwapTransactionsStateConverter
import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsClickIntents
import com.tangem.utils.Provider import com.tangem.utils.Provider
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
@ -35,6 +37,8 @@ internal class ExchangeStatusFactory @AssistedInject constructor(
private val swapTransactionRepository: SwapTransactionRepository, private val swapTransactionRepository: SwapTransactionRepository,
private val swapRepository: SwapRepository, private val swapRepository: SwapRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val quotesRepositoryV2: QuotesRepositoryV2,
private val tokensFeatureToggles: TokensFeatureToggles,
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
private val addCryptoCurrenciesUseCase: AddCryptoCurrenciesUseCase, private val addCryptoCurrenciesUseCase: AddCryptoCurrenciesUseCase,
private val swapTransactionStatusStore: SwapTransactionStatusStore, private val swapTransactionStatusStore: SwapTransactionStatusStore,
@ -198,7 +202,12 @@ internal class ExchangeStatusFactory @AssistedInject constructor(
private suspend fun Set<CryptoCurrency.ID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> { private suspend fun Set<CryptoCurrency.ID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> {
return try { return try {
val rawIds = mapNotNull { it.rawCurrencyId }.toSet() val rawIds = mapNotNull { it.rawCurrencyId }.toSet()
quotesRepository.getQuotesSync(rawIds, refresh)
if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
quotesRepositoryV2.getMultiQuoteSyncOrNull(currenciesIds = rawIds).orEmpty()
} else {
quotesRepository.getQuotesSync(rawIds, refresh)
}
} catch (t: Throwable) { } catch (t: Throwable) {
emptySet() emptySet()
} }