diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/adapter/UnknownEnumMoshiAdapter.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/adapter/UnknownEnumMoshiAdapter.kt index f5627c6f96..d594d91b51 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/adapter/UnknownEnumMoshiAdapter.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/adapter/UnknownEnumMoshiAdapter.kt @@ -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 { diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt index cff84d1ce7..614184aee4 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/stakekit/models/response/model/YieldDTO.kt @@ -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( diff --git a/data/staking/build.gradle.kts b/data/staking/build.gradle.kts index 6bcc1ccd0b..4a9ba3d819 100644 --- a/data/staking/build.gradle.kts +++ b/data/staking/build.gradle.kts @@ -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) diff --git a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt index e383d63f49..c08359c098 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldConverter.kt @@ -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 diff --git a/data/transaction/build.gradle.kts b/data/transaction/build.gradle.kts index 41baa4a4ba..709f743912 100644 --- a/data/transaction/build.gradle.kts +++ b/data/transaction/build.gradle.kts @@ -32,5 +32,6 @@ dependencies { implementation(deps.hilt.android) kapt(deps.hilt.kapt) + /** Other */ implementation(deps.timber) } \ No newline at end of file diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt index 036f187b28..4be9bad438 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/Yield.kt @@ -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( diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/ConfirmationStatePreviewData.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/ConfirmationStatePreviewData.kt index 09143b30de..5e63fa4e32 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/ConfirmationStatePreviewData.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/ConfirmationStatePreviewData.kt @@ -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"), diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/InitialStakingStatePreview.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/InitialStakingStatePreview.kt index b6a1eabe64..a6ac4963e9 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/InitialStakingStatePreview.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/previewdata/InitialStakingStatePreview.kt @@ -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,