Updated on 2026-08-14
This commit is contained in:
parent
27a864a0a9
commit
0e29df4ce9
45 changed files with 731 additions and 137 deletions
|
|
@ -14,6 +14,7 @@ dependencies {
|
|||
|
||||
implementation(projects.core.datasource)
|
||||
implementation(projects.core.utils)
|
||||
implementation(projects.domain.tokens.models)
|
||||
implementation(projects.domain.staking)
|
||||
implementation(projects.features.staking.api)
|
||||
|
||||
|
|
@ -29,6 +30,7 @@ dependencies {
|
|||
implementation(deps.moshi)
|
||||
implementation(deps.moshi.kotlin)
|
||||
|
||||
implementation(projects.libs.blockchainSdk)
|
||||
implementation(deps.tangem.blockchain) {
|
||||
exclude(module = "joda-time")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,16 @@
|
|||
package com.tangem.data.staking
|
||||
|
||||
import com.tangem.blockchain.common.Blockchain
|
||||
import com.tangem.data.staking.converters.StakingTokenConverter
|
||||
import com.tangem.blockchainsdk.utils.toCoinId
|
||||
import com.tangem.data.staking.converters.YieldConverter
|
||||
import com.tangem.datasource.api.common.response.getOrThrow
|
||||
import com.tangem.datasource.api.stakekit.StakeKitApi
|
||||
import com.tangem.datasource.local.token.StakingTokensStore
|
||||
import com.tangem.datasource.local.token.StakingYieldsStore
|
||||
import com.tangem.domain.staking.model.StakingAvailability
|
||||
import com.tangem.domain.staking.model.StakingEntryInfo
|
||||
import com.tangem.domain.staking.model.Yield
|
||||
import com.tangem.domain.staking.repositories.StakingRepository
|
||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||
import com.tangem.features.staking.api.featuretoggles.StakingFeatureToggles
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.coroutines.withContext
|
||||
|
|
@ -15,65 +18,90 @@ import kotlinx.coroutines.withContext
|
|||
internal class DefaultStakingRepository(
|
||||
private val stakeKitApi: StakeKitApi,
|
||||
private val stakingFeatureToggles: StakingFeatureToggles,
|
||||
private val stakingTokenStore: StakingTokensStore,
|
||||
private val stakingYieldsStore: StakingYieldsStore,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : StakingRepository {
|
||||
|
||||
private val tokenWithYieldConverter = StakingTokenConverter()
|
||||
private val yieldConverter = YieldConverter()
|
||||
|
||||
override suspend fun getStakingAvailabilityForActions(
|
||||
cryptoCurrencyId: CryptoCurrency.ID,
|
||||
symbol: String,
|
||||
): StakingAvailability {
|
||||
val rawCurrencyId = cryptoCurrencyId.rawCurrencyId ?: return StakingAvailability.Unavailable
|
||||
|
||||
override fun getStakingAvailability(blockchainId: String): StakingAvailability {
|
||||
if (!stakingFeatureToggles.isStakingEnabled) {
|
||||
return StakingAvailability.Unavailable
|
||||
}
|
||||
return withContext(dispatchers.io) {
|
||||
val yields = getEnabledYields() ?: return@withContext StakingAvailability.Unavailable
|
||||
|
||||
return integrationIdMap[Blockchain.fromId(blockchainId)]?.let {
|
||||
StakingAvailability.Available(it)
|
||||
} ?: StakingAvailability.Unavailable
|
||||
}
|
||||
val prefetchedYield = findPrefetchedYield(yields, rawCurrencyId, symbol)
|
||||
val isSupported = isStakingSupported(rawCurrencyId)
|
||||
|
||||
override suspend fun getEntryInfo(integrationId: String): StakingEntryInfo {
|
||||
val yield = stakeKitApi.getSingleYield(integrationId).getOrThrow()
|
||||
|
||||
return StakingEntryInfo(
|
||||
interestRate = yield.apy,
|
||||
periodInDays = yield.metadata.cooldownPeriod.days,
|
||||
tokenSymbol = yield.token.symbol,
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun fetchEnabledTokens() {
|
||||
withContext(dispatchers.io) {
|
||||
val stakingTokensWithYields = stakeKitApi.getTokens().getOrThrow()
|
||||
|
||||
stakingTokenStore.store(stakingTokensWithYields.map { tokenWithYieldConverter.convert(it) })
|
||||
when {
|
||||
prefetchedYield != null && isSupported -> {
|
||||
StakingAvailability.Available(prefetchedYield.id)
|
||||
}
|
||||
prefetchedYield == null && isSupported -> {
|
||||
StakingAvailability.TemporaryDisabled
|
||||
}
|
||||
else -> StakingAvailability.Unavailable
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val SOLANA_INTEGRATION_ID = "solana-sol-native-multivalidator-staking"
|
||||
private const val COSMOS_INTEGRATION_ID = "cosmos-atom-native-staking"
|
||||
private const val POLKADOT_INTEGRATION_ID = "polkadot-dot-validator-staking"
|
||||
private const val ETHEREUM_INTEGRATION_ID = "ethereum-matic-native-staking"
|
||||
private const val AVALANCHE_INTEGRATION_ID = "avalanche-avax-native-staking"
|
||||
private const val TRON_INTEGRATION_ID = "tron-trx-native-staking"
|
||||
private const val CRONOS_INTEGRATION_ID = "cronos-cro-native-staking"
|
||||
private const val BINANCE_INTEGRATION_ID = "binance-bnb-native-staking"
|
||||
private const val KAVA_INTEGRATION_ID = "kava-kava-native-staking"
|
||||
private const val NEAR_INTEGRATION_ID = "near-near-native-staking"
|
||||
private const val TEZOS_INTEGRATION_ID = "tezos-xtz-native-staking"
|
||||
private fun findPrefetchedYield(yields: List<Yield>, currencyId: String, symbol: String): Yield? {
|
||||
return yields
|
||||
.find { it.token.coinGeckoId == currencyId && it.token.symbol == symbol }
|
||||
}
|
||||
|
||||
private val integrationIdMap = mapOf(
|
||||
Blockchain.Solana to SOLANA_INTEGRATION_ID,
|
||||
Blockchain.Cosmos to COSMOS_INTEGRATION_ID,
|
||||
Blockchain.Polkadot to POLKADOT_INTEGRATION_ID,
|
||||
Blockchain.Polygon to ETHEREUM_INTEGRATION_ID,
|
||||
Blockchain.Avalanche to AVALANCHE_INTEGRATION_ID,
|
||||
Blockchain.Tron to TRON_INTEGRATION_ID,
|
||||
Blockchain.Cronos to CRONOS_INTEGRATION_ID,
|
||||
Blockchain.Binance to BINANCE_INTEGRATION_ID,
|
||||
Blockchain.Kava to KAVA_INTEGRATION_ID,
|
||||
Blockchain.Near to NEAR_INTEGRATION_ID,
|
||||
Blockchain.Tezos to TEZOS_INTEGRATION_ID,
|
||||
override fun isStakingSupported(currencyId: String): Boolean {
|
||||
return integrationIds.contains(currencyId)
|
||||
}
|
||||
|
||||
override suspend fun getEntryInfo(integrationId: String): StakingEntryInfo {
|
||||
return withContext(dispatchers.io) {
|
||||
val yield = stakeKitApi.getSingleYield(integrationId).getOrThrow()
|
||||
|
||||
StakingEntryInfo(
|
||||
interestRate = yield.apy,
|
||||
periodInDays = yield.metadata.cooldownPeriod.days,
|
||||
tokenSymbol = yield.token.symbol,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun fetchEnabledYields() {
|
||||
if (!stakingFeatureToggles.isStakingEnabled) {
|
||||
return
|
||||
}
|
||||
|
||||
withContext(dispatchers.io) {
|
||||
val stakingTokensWithYields = stakeKitApi.getMultipleYields().getOrThrow()
|
||||
|
||||
stakingYieldsStore.store(stakingTokensWithYields.data)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getEnabledYields(): List<Yield>? {
|
||||
val yields = stakingYieldsStore.getSyncOrNull() ?: return null
|
||||
return yields.map { yieldConverter.convert(it) }
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val integrationIds = setOf(
|
||||
Blockchain.Solana.toCoinId(),
|
||||
Blockchain.Cosmos.toCoinId(),
|
||||
Blockchain.Polkadot.toCoinId(),
|
||||
Blockchain.Polygon.toCoinId(),
|
||||
Blockchain.Avalanche.toCoinId(),
|
||||
Blockchain.Tron.toCoinId(),
|
||||
Blockchain.Cronos.toCoinId(),
|
||||
Blockchain.Binance.toCoinId(),
|
||||
Blockchain.Kava.toCoinId(),
|
||||
Blockchain.Near.toCoinId(),
|
||||
Blockchain.Tezos.toCoinId(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
package com.tangem.data.staking.converters
|
||||
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.TokenWithYield
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.TokenWithYieldDTO
|
||||
import com.tangem.domain.staking.model.StakingToken
|
||||
import com.tangem.domain.staking.model.StakingTokenWithYield
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
class StakingTokenConverter : Converter<TokenWithYield, StakingTokenWithYield> {
|
||||
class StakingTokenConverter : Converter<TokenWithYieldDTO, StakingTokenWithYield> {
|
||||
|
||||
override fun convert(value: TokenWithYield): StakingTokenWithYield {
|
||||
override fun convert(value: TokenWithYieldDTO): StakingTokenWithYield {
|
||||
return StakingTokenWithYield(
|
||||
token = StakingToken(
|
||||
name = value.token.name,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,206 @@
|
|||
package com.tangem.data.staking.converters
|
||||
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.AddressArgumentDTO
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.TokenDTO
|
||||
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO
|
||||
import com.tangem.domain.staking.model.*
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
class YieldConverter : Converter<YieldDTO, Yield> {
|
||||
|
||||
override fun convert(value: YieldDTO): Yield {
|
||||
return Yield(
|
||||
id = value.id,
|
||||
token = convertToken(value.token),
|
||||
tokens = value.tokens.map { convertToken(it) },
|
||||
args = convertArgs(value.args),
|
||||
status = convertStatus(value.status),
|
||||
apy = value.apy,
|
||||
rewardRate = value.rewardRate,
|
||||
rewardType = convertRewardType(value.rewardType),
|
||||
metadata = convertMetadata(value.metadata),
|
||||
validators = value.validators.map { convertValidator(it) },
|
||||
isAvailable = value.isAvailable,
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertToken(tokenDTO: TokenDTO): Token {
|
||||
return Token(
|
||||
name = tokenDTO.name,
|
||||
network = convertNetworkType(tokenDTO.network),
|
||||
symbol = tokenDTO.symbol,
|
||||
decimals = tokenDTO.decimals,
|
||||
address = tokenDTO.address,
|
||||
coinGeckoId = tokenDTO.coinGeckoId,
|
||||
logoURI = tokenDTO.logoURI,
|
||||
isPoints = tokenDTO.isPoints,
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("LongMethod", "CyclomaticComplexMethod")
|
||||
private fun convertNetworkType(networkTypeDTO: TokenDTO.NetworkTypeDTO): Token.NetworkType {
|
||||
return when (networkTypeDTO) {
|
||||
TokenDTO.NetworkTypeDTO.AVALANCHE_C -> Token.NetworkType.AVALANCHE_C
|
||||
TokenDTO.NetworkTypeDTO.AVALANCHE_ATOMIC -> Token.NetworkType.AVALANCHE_ATOMIC
|
||||
TokenDTO.NetworkTypeDTO.AVALANCHE_P -> Token.NetworkType.AVALANCHE_P
|
||||
TokenDTO.NetworkTypeDTO.ARBITRUM -> Token.NetworkType.ARBITRUM
|
||||
TokenDTO.NetworkTypeDTO.BINANCE -> Token.NetworkType.BINANCE
|
||||
TokenDTO.NetworkTypeDTO.CELO -> Token.NetworkType.CELO
|
||||
TokenDTO.NetworkTypeDTO.ETHEREUM -> Token.NetworkType.ETHEREUM
|
||||
TokenDTO.NetworkTypeDTO.ETHEREUM_GOERLI -> Token.NetworkType.ETHEREUM_GOERLI
|
||||
TokenDTO.NetworkTypeDTO.ETHEREUM_HOLESKY -> Token.NetworkType.ETHEREUM_HOLESKY
|
||||
TokenDTO.NetworkTypeDTO.FANTOM -> Token.NetworkType.FANTOM
|
||||
TokenDTO.NetworkTypeDTO.HARMONY -> Token.NetworkType.HARMONY
|
||||
TokenDTO.NetworkTypeDTO.OPTIMISM -> Token.NetworkType.OPTIMISM
|
||||
TokenDTO.NetworkTypeDTO.POLYGON -> Token.NetworkType.POLYGON
|
||||
TokenDTO.NetworkTypeDTO.GNOSIS -> Token.NetworkType.GNOSIS
|
||||
TokenDTO.NetworkTypeDTO.MOONRIVER -> Token.NetworkType.MOONRIVER
|
||||
TokenDTO.NetworkTypeDTO.OKC -> Token.NetworkType.OKC
|
||||
TokenDTO.NetworkTypeDTO.ZKSYNC -> Token.NetworkType.ZKSYNC
|
||||
TokenDTO.NetworkTypeDTO.VICTION -> Token.NetworkType.VICTION
|
||||
TokenDTO.NetworkTypeDTO.AGORIC -> Token.NetworkType.AGORIC
|
||||
TokenDTO.NetworkTypeDTO.AKASH -> Token.NetworkType.AKASH
|
||||
TokenDTO.NetworkTypeDTO.AXELAR -> Token.NetworkType.AXELAR
|
||||
TokenDTO.NetworkTypeDTO.BAND_PROTOCOL -> Token.NetworkType.BAND_PROTOCOL
|
||||
TokenDTO.NetworkTypeDTO.BITSONG -> Token.NetworkType.BITSONG
|
||||
TokenDTO.NetworkTypeDTO.CANTO -> Token.NetworkType.CANTO
|
||||
TokenDTO.NetworkTypeDTO.CHIHUAHUA -> Token.NetworkType.CHIHUAHUA
|
||||
TokenDTO.NetworkTypeDTO.COMDEX -> Token.NetworkType.COMDEX
|
||||
TokenDTO.NetworkTypeDTO.COREUM -> Token.NetworkType.COREUM
|
||||
TokenDTO.NetworkTypeDTO.COSMOS -> Token.NetworkType.COSMOS
|
||||
TokenDTO.NetworkTypeDTO.CRESCENT -> Token.NetworkType.CRESCENT
|
||||
TokenDTO.NetworkTypeDTO.CRONOS -> Token.NetworkType.CRONOS
|
||||
TokenDTO.NetworkTypeDTO.CUDOS -> Token.NetworkType.CUDOS
|
||||
TokenDTO.NetworkTypeDTO.DESMOS -> Token.NetworkType.DESMOS
|
||||
TokenDTO.NetworkTypeDTO.DYDX -> Token.NetworkType.DYDX
|
||||
TokenDTO.NetworkTypeDTO.EVMOS -> Token.NetworkType.EVMOS
|
||||
TokenDTO.NetworkTypeDTO.FETCH_AI -> Token.NetworkType.FETCH_AI
|
||||
TokenDTO.NetworkTypeDTO.GRAVITY_BRIDGE -> Token.NetworkType.GRAVITY_BRIDGE
|
||||
TokenDTO.NetworkTypeDTO.INJECTIVE -> Token.NetworkType.INJECTIVE
|
||||
TokenDTO.NetworkTypeDTO.IRISNET -> Token.NetworkType.IRISNET
|
||||
TokenDTO.NetworkTypeDTO.JUNO -> Token.NetworkType.JUNO
|
||||
TokenDTO.NetworkTypeDTO.KAVA -> Token.NetworkType.KAVA
|
||||
TokenDTO.NetworkTypeDTO.KI_NETWORK -> Token.NetworkType.KI_NETWORK
|
||||
TokenDTO.NetworkTypeDTO.MARS_PROTOCOL -> Token.NetworkType.MARS_PROTOCOL
|
||||
TokenDTO.NetworkTypeDTO.NYM -> Token.NetworkType.NYM
|
||||
TokenDTO.NetworkTypeDTO.OKEX_CHAIN -> Token.NetworkType.OKEX_CHAIN
|
||||
TokenDTO.NetworkTypeDTO.ONOMY -> Token.NetworkType.ONOMY
|
||||
TokenDTO.NetworkTypeDTO.OSMOSIS -> Token.NetworkType.OSMOSIS
|
||||
TokenDTO.NetworkTypeDTO.PERSISTENCE -> Token.NetworkType.PERSISTENCE
|
||||
TokenDTO.NetworkTypeDTO.QUICKSILVER -> Token.NetworkType.QUICKSILVER
|
||||
TokenDTO.NetworkTypeDTO.REGEN -> Token.NetworkType.REGEN
|
||||
TokenDTO.NetworkTypeDTO.SECRET -> Token.NetworkType.SECRET
|
||||
TokenDTO.NetworkTypeDTO.SENTINEL -> Token.NetworkType.SENTINEL
|
||||
TokenDTO.NetworkTypeDTO.SOMMELIER -> Token.NetworkType.SOMMELIER
|
||||
TokenDTO.NetworkTypeDTO.STAFI -> Token.NetworkType.STAFI
|
||||
TokenDTO.NetworkTypeDTO.STARGAZE -> Token.NetworkType.STARGAZE
|
||||
TokenDTO.NetworkTypeDTO.STRIDE -> Token.NetworkType.STRIDE
|
||||
TokenDTO.NetworkTypeDTO.TERITORI -> Token.NetworkType.TERITORI
|
||||
TokenDTO.NetworkTypeDTO.TGRADE -> Token.NetworkType.TGRADE
|
||||
TokenDTO.NetworkTypeDTO.UMEE -> Token.NetworkType.UMEE
|
||||
TokenDTO.NetworkTypeDTO.POLKADOT -> Token.NetworkType.POLKADOT
|
||||
TokenDTO.NetworkTypeDTO.KUSAMA -> Token.NetworkType.KUSAMA
|
||||
TokenDTO.NetworkTypeDTO.WESTEND -> Token.NetworkType.WESTEND
|
||||
TokenDTO.NetworkTypeDTO.BINANCEBEACON -> Token.NetworkType.BINANCEBEACON
|
||||
TokenDTO.NetworkTypeDTO.NEAR -> Token.NetworkType.NEAR
|
||||
TokenDTO.NetworkTypeDTO.SOLANA -> Token.NetworkType.SOLANA
|
||||
TokenDTO.NetworkTypeDTO.TEZOS -> Token.NetworkType.TEZOS
|
||||
TokenDTO.NetworkTypeDTO.TRON -> Token.NetworkType.TRON
|
||||
else -> Token.NetworkType.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
private fun convertArgs(argsDTO: YieldDTO.ArgsDTO): Yield.Args {
|
||||
return Yield.Args(
|
||||
enter = convertEnter(argsDTO.enter),
|
||||
exit = argsDTO.exit?.let { convertEnter(it) },
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertEnter(enterDTO: YieldDTO.ArgsDTO.Enter): Yield.Args.Enter {
|
||||
return Yield.Args.Enter(
|
||||
addresses = convertAddresses(enterDTO.addresses),
|
||||
args = enterDTO.args.mapValues { convertAddressArgument(it.value) },
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertAddresses(addressesDTO: YieldDTO.ArgsDTO.Enter.Addresses): Yield.Args.Enter.Addresses {
|
||||
return Yield.Args.Enter.Addresses(
|
||||
address = convertAddressArgument(addressesDTO.address),
|
||||
additionalAddresses = addressesDTO.additionalAddresses?.mapValues { convertAddressArgument(it.value) },
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertAddressArgument(addressArgumentDTO: AddressArgumentDTO): AddressArgument {
|
||||
return AddressArgument(
|
||||
required = addressArgumentDTO.required,
|
||||
network = addressArgumentDTO.network,
|
||||
minimum = addressArgumentDTO.minimum,
|
||||
maximum = addressArgumentDTO.maximum,
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertStatus(statusDTO: YieldDTO.StatusDTO): Yield.Status {
|
||||
return Yield.Status(
|
||||
enter = statusDTO.enter,
|
||||
exit = statusDTO.exit,
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertMetadata(metadataDTO: YieldDTO.MetadataDTO): Yield.Metadata {
|
||||
return Yield.Metadata(
|
||||
name = metadataDTO.name,
|
||||
logoUri = metadataDTO.logoUri,
|
||||
description = metadataDTO.description,
|
||||
documentation = metadataDTO.documentation,
|
||||
gasFeeToken = convertToken(metadataDTO.gasFeeTokenDTO),
|
||||
token = convertToken(metadataDTO.tokenDTO),
|
||||
tokens = metadataDTO.tokensDTO.map { convertToken(it) },
|
||||
type = metadataDTO.type,
|
||||
rewardSchedule = metadataDTO.rewardSchedule,
|
||||
cooldownPeriod = convertPeriod(metadataDTO.cooldownPeriod),
|
||||
warmupPeriod = convertPeriod(metadataDTO.warmupPeriod),
|
||||
rewardClaiming = metadataDTO.rewardClaiming,
|
||||
defaultValidator = metadataDTO.defaultValidator,
|
||||
minimumStake = metadataDTO.minimumStake,
|
||||
supportsMultipleValidators = metadataDTO.supportsMultipleValidators,
|
||||
revshare = convertEnabled(metadataDTO.revshare),
|
||||
fee = convertEnabled(metadataDTO.fee),
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertPeriod(periodDTO: YieldDTO.MetadataDTO.PeriodDTO): Yield.Metadata.Period {
|
||||
return Yield.Metadata.Period(
|
||||
days = periodDTO.days,
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertEnabled(enabledDTO: YieldDTO.MetadataDTO.EnabledDTO): Yield.Metadata.Enabled {
|
||||
return Yield.Metadata.Enabled(
|
||||
enabled = enabledDTO.enabled,
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertValidator(validatorDTO: YieldDTO.ValidatorDTO): Yield.Validator {
|
||||
return Yield.Validator(
|
||||
address = validatorDTO.address,
|
||||
status = validatorDTO.status,
|
||||
name = validatorDTO.name,
|
||||
image = validatorDTO.image,
|
||||
website = validatorDTO.website,
|
||||
apr = validatorDTO.apr,
|
||||
commission = validatorDTO.commission,
|
||||
stakedBalance = validatorDTO.stakedBalance,
|
||||
votingPower = validatorDTO.votingPower,
|
||||
preferred = validatorDTO.preferred,
|
||||
)
|
||||
}
|
||||
|
||||
private fun convertRewardType(rewardTypeDTO: YieldDTO.RewardTypeDTO): Yield.RewardType {
|
||||
return when (rewardTypeDTO) {
|
||||
YieldDTO.RewardTypeDTO.APY -> Yield.RewardType.APY
|
||||
YieldDTO.RewardTypeDTO.APR -> Yield.RewardType.APR
|
||||
else -> Yield.RewardType.UNKNOWN
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ package com.tangem.data.staking.di
|
|||
|
||||
import com.tangem.data.staking.DefaultStakingRepository
|
||||
import com.tangem.datasource.api.stakekit.StakeKitApi
|
||||
import com.tangem.datasource.local.token.StakingTokensStore
|
||||
import com.tangem.datasource.local.token.StakingYieldsStore
|
||||
import com.tangem.domain.staking.repositories.StakingRepository
|
||||
import com.tangem.features.staking.api.featuretoggles.StakingFeatureToggles
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
|
|
@ -21,13 +21,13 @@ internal object StakingDataModule {
|
|||
fun provideStakingRepository(
|
||||
stakeKitApi: StakeKitApi,
|
||||
stakingFeatureToggles: StakingFeatureToggles,
|
||||
stakingTokenStore: StakingTokensStore,
|
||||
stakingTokenStore: StakingYieldsStore,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
): StakingRepository {
|
||||
return DefaultStakingRepository(
|
||||
stakeKitApi = stakeKitApi,
|
||||
stakingFeatureToggles = stakingFeatureToggles,
|
||||
stakingTokenStore = stakingTokenStore,
|
||||
stakingYieldsStore = stakingTokenStore,
|
||||
dispatchers = dispatchers,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue