Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-04 21:32:48 +03:00
parent 5c4f10f90e
commit 2cf60002a4
8 changed files with 61 additions and 11 deletions

View file

@ -8,6 +8,7 @@ import com.tangem.datasource.api.stakekit.models.response.model.NetworkTypeDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO.MetadataDTO.RewardClaimingDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO.MetadataDTO.RewardScheduleDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO.RewardTypeDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO.ValidatorDTO.ValidatorStatusDTO
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionStatusDTO
import com.tangem.datasource.api.stakekit.models.response.model.action.StakingActionTypeDTO
import com.tangem.datasource.api.stakekit.models.response.model.transaction.StakingTransactionStatusDTO
@ -35,6 +36,7 @@ fun Moshi.Builder.addStakeKitEnumFallbackAdapters(): Moshi.Builder {
StakingActionTypeDTO::class.java to StakingActionTypeDTO.UNKNOWN,
StakingTransactionStatusDTO::class.java to StakingTransactionStatusDTO.UNKNOWN,
StakingTransactionTypeDTO::class.java to StakingTransactionTypeDTO.UNKNOWN,
ValidatorStatusDTO::class.java to ValidatorStatusDTO.UNKNOWN,
)
return apply {

View file

@ -67,7 +67,7 @@ data class YieldDTO(
@Json(name = "address")
val address: String,
@Json(name = "status")
val status: String,
val status: ValidatorStatusDTO,
@Json(name = "name")
val name: String,
@Json(name = "image")
@ -84,7 +84,24 @@ data class YieldDTO(
val votingPower: Double?,
@Json(name = "preferred")
val preferred: Boolean,
)
) {
@JsonClass(generateAdapter = true)
enum class ValidatorStatusDTO {
@Json(name = "active")
ACTIVE,
@Json(name = "deactivating")
DEACTIVATING,
@Json(name = "inactive")
INACTIVE,
@Json(name = "jailed")
JAILED,
UNKNOWN,
}
}
@JsonClass(generateAdapter = true)
data class MetadataDTO(

View file

@ -30,14 +30,18 @@ dependencies {
implementation(projects.features.staking.api)
// region DI
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)
// endregion
// region Others dependencies
implementation(deps.androidx.datastore)
implementation(deps.jodatime)
implementation(deps.kotlin.coroutines)
implementation(deps.kotlin.immutable.collections)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)

View file

@ -3,10 +3,13 @@ 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.YieldDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO.MetadataDTO.RewardScheduleDTO
import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO.ValidatorDTO.ValidatorStatusDTO
import com.tangem.domain.staking.model.stakekit.AddressArgument
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.Yield.Metadata.RewardSchedule
import com.tangem.domain.staking.model.stakekit.Yield.Validator.ValidatorStatus
import com.tangem.utils.converter.Converter
import kotlinx.collections.immutable.toImmutableList
class YieldConverter(
private val tokenConverter: TokenConverter,
@ -24,9 +27,11 @@ class YieldConverter(
rewardType = convertRewardType(value.rewardType),
metadata = convertMetadata(value.metadata),
validators = value.validators
.filter { it.preferred }
.asSequence()
.filter { it.preferred && it.status == ValidatorStatusDTO.ACTIVE }
.sortedByDescending { it.apr }
.map { convertValidator(it) }
.sortedByDescending { it.apr },
.toImmutableList(),
isAvailable = value.isAvailable,
)
}
@ -109,7 +114,7 @@ class YieldConverter(
private fun convertValidator(validatorDTO: YieldDTO.ValidatorDTO): Yield.Validator {
return Yield.Validator(
address = validatorDTO.address,
status = validatorDTO.status,
status = convertValidatorStatus(validatorDTO.status),
name = validatorDTO.name,
image = validatorDTO.image,
website = validatorDTO.website,
@ -129,6 +134,16 @@ class YieldConverter(
}
}
private fun convertValidatorStatus(validatorStatusDTO: ValidatorStatusDTO): ValidatorStatus {
return when (validatorStatusDTO) {
ValidatorStatusDTO.ACTIVE -> ValidatorStatus.ACTIVE
ValidatorStatusDTO.DEACTIVATING -> ValidatorStatus.DEACTIVATING
ValidatorStatusDTO.INACTIVE -> ValidatorStatus.INACTIVE
ValidatorStatusDTO.JAILED -> ValidatorStatus.JAILED
else -> ValidatorStatus.UNKNOWN
}
}
private fun convertRewardSchedule(rewardTypeDTO: RewardScheduleDTO): RewardSchedule {
return when (rewardTypeDTO) {
RewardScheduleDTO.BLOCK -> RewardSchedule.BLOCK

View file

@ -32,5 +32,6 @@ dependencies {
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)
/** Other */
implementation(deps.timber)
}

View file

@ -53,7 +53,7 @@ data class Yield(
@Serializable
data class Validator(
val address: String,
val status: String,
val status: ValidatorStatus,
val name: String,
val image: String? = null,
val website: String? = null,
@ -62,7 +62,16 @@ data class Yield(
val stakedBalance: String? = null,
val votingPower: Double? = null,
val preferred: Boolean,
)
) {
enum class ValidatorStatus {
ACTIVE,
DEACTIVATING,
INACTIVE,
JAILED,
UNKNOWN,
}
}
@Serializable
data class Metadata(

View file

@ -8,6 +8,7 @@ import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.Yield.Validator.ValidatorStatus
import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.*
import kotlinx.collections.immutable.persistentListOf
@ -18,7 +19,7 @@ internal object ConfirmationStatePreviewData {
private val validatorList = listOf(
Yield.Validator(
address = "0xa6e768fef2d1af36c0cfdb276422e7881a83e951",
status = "active",
status = ValidatorStatus.ACTIVE,
name = "Luganodes",
image = "https://assets.stakek.it/validators/luganodes.png",
apr = BigDecimal("0.054823398040640445"),
@ -30,7 +31,7 @@ internal object ConfirmationStatePreviewData {
),
Yield.Validator(
address = "0x35b1ca0f398905cf752e6fe122b51c88022fca32",
status = "active",
status = ValidatorStatus.ACTIVE,
name = "InfStones",
image = "https://assets.stakek.it/validators/infstones.png",
apr = BigDecimal("0.057786472172836965"),
@ -42,7 +43,7 @@ internal object ConfirmationStatePreviewData {
),
Yield.Validator(
address = "0xd14a87025109013b0a2354a775cb335f926af65a",
status = "active",
status = ValidatorStatus.ACTIVE,
name = "Kiln",
image = "https://assets.stakek.it/validators/kiln.png",
apr = BigDecimal("0.057786472172836965"),

View file

@ -6,6 +6,7 @@ import com.tangem.core.ui.extensions.stringReference
import com.tangem.domain.staking.model.stakekit.BalanceType
import com.tangem.domain.staking.model.stakekit.RewardBlockType
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.Yield.Validator.ValidatorStatus
import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.*
import com.tangem.features.staking.impl.presentation.state.StakingStates
@ -77,7 +78,7 @@ internal object InitialStakingStatePreview {
rawCurrencyId = null,
validator = Yield.Validator(
address = "address",
status = "status",
status = ValidatorStatus.ACTIVE,
name = "Binance",
image = null,
website = null,