diff --git a/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt index 92e80ff6db..6fae7d3ea2 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/StakingDomainModule.kt @@ -6,6 +6,7 @@ import com.tangem.domain.staking.repositories.StakingErrorResolver import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingTransactionHashRepository import com.tangem.domain.staking.single.SingleYieldBalanceFetcher +import com.tangem.domain.staking.toggles.StakingFeatureToggles import com.tangem.domain.staking.usecase.StakingApyFlowUseCase import com.tangem.domain.walletmanager.WalletManagersFacade import dagger.Module @@ -220,7 +221,10 @@ internal object StakingDomainModule { @Provides @Singleton - fun provideStakingApyFlowUseCase(stakingRepository: StakingRepository): StakingApyFlowUseCase { - return StakingApyFlowUseCase(stakingRepository) + fun provideStakingApyFlowUseCase( + stakingRepository: StakingRepository, + stakingFeatureToggles: StakingFeatureToggles, + ): StakingApyFlowUseCase { + return StakingApyFlowUseCase(stakingRepository, stakingFeatureToggles) } } \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt index bb9191de43..e055e89e36 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt @@ -35,6 +35,7 @@ import com.tangem.domain.card.common.TapWorkarounds.isWallet2 import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.network.Network import com.tangem.domain.models.staking.NetworkType +import com.tangem.domain.models.staking.StakingID import com.tangem.domain.models.staking.YieldBalance import com.tangem.domain.models.staking.action.StakingActionType import com.tangem.domain.models.wallet.UserWallet @@ -174,9 +175,11 @@ internal class DefaultStakingRepository( } private fun getAvailableIntegrationsIds(): List { - return StakingIntegrationID.entries.filterNot { - it.blockchain == Blockchain.Cardano && !stakingFeatureToggles.isCardanoStakingEnabled - } + return StakingIntegrationID.entries + // load all integrations for now and filter in use cases if needed + // .filterNot { + // it.blockchain == Blockchain.Cardano && !stakingFeatureToggles.isCardanoStakingEnabled + // } } private fun NetworkTypeDTO.extractJsonName(): String { @@ -208,7 +211,7 @@ internal class DefaultStakingRepository( cryptoCurrency: CryptoCurrency, ): Flow { return channelFlow { - if (!checkFeatureToggleEnabled(cryptoCurrency.network.id)) { + if (!checkFeatureToggleEnabled(userWalletId, cryptoCurrency)) { send(StakingAvailability.Unavailable) return@channelFlow } @@ -257,7 +260,7 @@ internal class DefaultStakingRepository( userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, ): StakingAvailability { - if (!checkFeatureToggleEnabled(cryptoCurrency.network.id)) { + if (!checkFeatureToggleEnabled(userWalletId, cryptoCurrency)) { return StakingAvailability.Unavailable } @@ -294,10 +297,25 @@ internal class DefaultStakingRepository( } } - private fun checkFeatureToggleEnabled(networkId: Network.ID): Boolean { - return when (networkId.toBlockchain()) { + private suspend fun checkFeatureToggleEnabled(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency): Boolean { + return when (cryptoCurrency.network.id.toBlockchain()) { Blockchain.TON -> stakingFeatureToggles.isTonStakingEnabled - Blockchain.Cardano -> stakingFeatureToggles.isCardanoStakingEnabled + Blockchain.Cardano -> { + val address = walletManagersFacade.getDefaultAddress(userWalletId, cryptoCurrency.network).orEmpty() + val balance = stakingBalanceStoreV2.getSyncOrNull( + userWalletId = userWalletId, + stakingId = StakingID( + integrationId = StakingIntegrationID.create(currencyId = cryptoCurrency.id)?.value + ?: return false, + address = address, + ), + ) + if (balance != null && balance is YieldBalance.Data && balance.balance.items.isNotEmpty()) { + return true + } else { + stakingFeatureToggles.isCardanoStakingEnabled + } + } else -> true } } @@ -490,13 +508,6 @@ internal class DefaultStakingRepository( } private fun findPrefetchedYield(yields: List, currencyId: CryptoCurrency.RawID, symbol: String): Yield? { - if (!stakingFeatureToggles.isCardanoStakingEnabled && symbol.equals( - Blockchain.Cardano.currency, - ignoreCase = true, - ) - ) { - return null - } return yields.find { yield -> yield.tokens.any { it.coinGeckoId == currencyId.value && it.symbol == symbol } } diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/usecase/StakingApyFlowUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/usecase/StakingApyFlowUseCase.kt index 3b50f3a63c..f2ee167562 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/usecase/StakingApyFlowUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/usecase/StakingApyFlowUseCase.kt @@ -1,7 +1,10 @@ package com.tangem.domain.staking.usecase +import com.tangem.blockchain.common.Blockchain +import com.tangem.blockchainsdk.utils.toCoinId import com.tangem.domain.staking.model.stakekit.Yield import com.tangem.domain.staking.repositories.StakingRepository +import com.tangem.domain.staking.toggles.StakingFeatureToggles import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map @@ -12,12 +15,18 @@ import kotlinx.coroutines.flow.map * - key: currency staking key (network.backendId + "_" + symbol) * - value: validators */ -class StakingApyFlowUseCase(private val stakingRepository: StakingRepository) { +class StakingApyFlowUseCase( + private val stakingRepository: StakingRepository, + private val stakingFeatureToggles: StakingFeatureToggles, +) { operator fun invoke(): Flow>> { return stakingRepository.getEnabledYields() .map { yields -> - yields.associate { yield -> + yields.filterNot { yield -> + val isCardanoYield = yield.token.coinGeckoId == Blockchain.Cardano.toCoinId() + isCardanoYield && !stakingFeatureToggles.isCardanoStakingEnabled + }.associate { yield -> val key = "${yield.token.coinGeckoId}_${yield.token.symbol}" val apy = yield.validators key to apy