use crate::crypto::PublicKey;
use crate::staking::{Commission, Description};
use crate::{proto, AccountId, ErrorReport, Result};
use cosmos_sdk_proto::Timestamp;
use tendermint::Time;
#[derive(Clone, Debug, PartialEq)]
pub struct Validator {
pub operator_address: AccountId,
pub consensus_pubkey: Option<PublicKey>,
pub jailed: bool,
pub status: i32,
pub tokens: String,
pub delegator_shares: String,
pub description: Option<Description>,
pub unbonding_height: i64,
pub unbonding_ids: Vec<u64>,
pub unbonding_on_hold_ref_count: i64,
pub unbonding_time: Option<Time>,
pub commission: Option<Commission>,
pub min_self_delegation: String,
}
impl TryFrom<proto::cosmos::staking::v1beta1::Validator> for Validator {
type Error = ErrorReport;
fn try_from(proto: cosmos_sdk_proto::cosmos::staking::v1beta1::Validator) -> Result<Self> {
Ok(Validator {
operator_address: proto.operator_address.parse()?,
consensus_pubkey: proto.consensus_pubkey.map(TryInto::try_into).transpose()?,
jailed: proto.jailed,
status: proto.status,
tokens: proto.tokens,
delegator_shares: proto.delegator_shares,
description: proto.description.map(Into::into),
unbonding_height: proto.unbonding_height,
unbonding_ids: proto.unbonding_ids,
unbonding_on_hold_ref_count: proto.unbonding_on_hold_ref_count,
unbonding_time: proto
.unbonding_time
.map(|jailed_until| {
cosmos_sdk_proto::tendermint::google::protobuf::Timestamp {
seconds: jailed_until.seconds,
nanos: jailed_until.nanos,
}
.try_into()
})
.transpose()?,
commission: proto.commission.map(TryInto::try_into).transpose()?,
min_self_delegation: proto.min_self_delegation,
})
}
}
impl From<Validator> for proto::cosmos::staking::v1beta1::Validator {
fn from(validator: Validator) -> Self {
proto::cosmos::staking::v1beta1::Validator {
operator_address: validator.operator_address.to_string(),
consensus_pubkey: validator.consensus_pubkey.map(Into::into),
jailed: validator.jailed,
status: validator.status,
tokens: validator.tokens,
delegator_shares: validator.delegator_shares,
description: validator.description.map(Into::into),
unbonding_height: validator.unbonding_height,
unbonding_ids: validator.unbonding_ids,
unbonding_on_hold_ref_count: validator.unbonding_on_hold_ref_count,
unbonding_time: validator
.unbonding_time
.map(cosmos_sdk_proto::tendermint::google::protobuf::Timestamp::from)
.map(|t| Timestamp {
seconds: t.seconds,
nanos: t.nanos,
}),
commission: validator.commission.map(Into::into),
min_self_delegation: validator.min_self_delegation,
}
}
}