Updated on 2026-08-14

This commit is contained in:
Tangem 2025-10-27 12:15:41 +01:00
parent a0d7cd3066
commit 3ca8a415cd
5 changed files with 43 additions and 31 deletions

View file

@ -21,6 +21,7 @@ import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus
import com.tangem.domain.models.currency.yieldSupplyKey
import com.tangem.domain.models.staking.YieldBalance
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.utils.getTotalWithRewardsStakingBalance
import com.tangem.lib.crypto.BlockchainUtils
import com.tangem.utils.StringsSigns.DASH_SIGN
@ -41,7 +42,7 @@ import java.math.BigDecimal
class TokenItemStateConverter(
private val appCurrency: AppCurrency,
private val yieldModuleApyMap: Map<String, String> = emptyMap(),
private val stakingApyMap: Map<String, BigDecimal> = emptyMap(),
private val stakingApyMap: Map<String, List<Yield.Validator>> = emptyMap(),
private val iconStateProvider: (CryptoCurrencyStatus) -> CurrencyIconState = {
CryptoCurrencyToIconStateConverter().convert(it)
},
@ -156,7 +157,7 @@ class TokenItemStateConverter(
private fun createTitleState(
currencyStatus: CryptoCurrencyStatus,
yieldModuleApyMap: Map<String, String>,
stakingApyMap: Map<String, BigDecimal>,
stakingApyMap: Map<String, List<Yield.Validator>>,
): TokenItemState.TitleState {
return when (val value = currencyStatus.value) {
is CryptoCurrencyStatus.Loading,
@ -190,7 +191,7 @@ class TokenItemStateConverter(
private fun resolveEarnApy(
cryptoCurrencyStatus: CryptoCurrencyStatus,
yieldModuleApyMap: Map<String, String>,
stakingApyMap: Map<String, BigDecimal>,
stakingApyMap: Map<String, List<Yield.Validator>>,
): Pair<TextReference?, Boolean> {
val token = cryptoCurrencyStatus.currency as? CryptoCurrency.Token
if (token != null && yieldModuleApyMap.isNotEmpty()) {
@ -210,20 +211,41 @@ class TokenItemStateConverter(
}
if (stakingApyMap.isNotEmpty()) {
val stakingKey = cryptoCurrencyStatus.currency.stakingKey()
val stakingApy = stakingApyMap[stakingKey]?.format { percent(withPercentSign = false) }
if (stakingApy != null) {
val hasStakedBalance = cryptoCurrencyStatus.value.yieldBalance is YieldBalance.Data
val (stakingRate, hasStaked) = findStakingRate(
currencyStatus = cryptoCurrencyStatus,
stakingApyMap = stakingApyMap,
)
if (stakingRate != null) {
return resourceReference(
R.string.yield_module_earn_badge,
wrappedList(stakingApy),
) to hasStakedBalance
wrappedList(stakingRate.format { percent(withPercentSign = false) }),
) to hasStaked
}
}
return null to false
}
private fun findStakingRate(
currencyStatus: CryptoCurrencyStatus,
stakingApyMap: Map<String, List<Yield.Validator>>,
): Pair<BigDecimal?, Boolean> {
val stakingKey = currencyStatus.currency.stakingKey()
val validators = stakingApyMap[stakingKey] ?: return null to false
val yieldBalance = currencyStatus.value.yieldBalance
val hasStakedBalance = yieldBalance is YieldBalance.Data
val rate = if (hasStakedBalance) {
val validatorsByAddress = validators.associateBy { it.address }
yieldBalance.balance.items
.mapNotNull { it.validatorAddress }
.firstNotNullOfOrNull { address -> validatorsByAddress[address]?.rewardInfo?.rate }
?: validators.mapNotNull { it.rewardInfo?.rate }.maxOrNull()
} else {
validators.mapNotNull { it.rewardInfo?.rate }.maxOrNull()
}
return rate to hasStakedBalance
}
private fun createSubtitleState(
currencyStatus: CryptoCurrencyStatus,
appCurrency: AppCurrency,