penumbra_sdk_stake/validator/
state.rs

1use anyhow::anyhow;
2use penumbra_sdk_proto::{penumbra::core::component::stake::v1 as pb, DomainType};
3use serde::{Deserialize, Serialize};
4
5/// The state of a validator in the validator state machine.
6#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Serialize, Deserialize)]
7#[serde(try_from = "pb::ValidatorState", into = "pb::ValidatorState")]
8pub enum State {
9    /// The validator definition has been published, but the validator stake is below the minimum
10    /// threshold required to be indexed.
11    Defined,
12    /// The validator is not currently a part of the consensus set, but could become so if it
13    /// acquired enough voting power.
14    Inactive,
15    /// The validator is an active part of the consensus set.
16    Active,
17    /// The validator has been slashed for downtime, and is prevented from participation
18    /// in consensus until it requests to be reinstated.
19    Jailed,
20    /// The validator has been slashed for byzantine misbehavior, and is permanently banned.
21    Tombstoned,
22    /// The validator operator has disabled this validator's operations.
23    ///
24    /// Delegations to this validator are not allowed.
25    Disabled,
26}
27
28impl std::fmt::Display for State {
29    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
30        match self {
31            State::Defined => write!(f, "Defined"),
32            State::Inactive => write!(f, "Inactive"),
33            State::Active => write!(f, "Active"),
34            State::Jailed => write!(f, "Jailed"),
35            State::Tombstoned => write!(f, "Tombstoned"),
36            State::Disabled => write!(f, "Disabled"),
37        }
38    }
39}
40
41impl DomainType for State {
42    type Proto = pb::ValidatorState;
43}
44
45impl From<State> for pb::ValidatorState {
46    fn from(v: State) -> Self {
47        pb::ValidatorState {
48            state: match v {
49                State::Defined => pb::validator_state::ValidatorStateEnum::Defined,
50                State::Inactive => pb::validator_state::ValidatorStateEnum::Inactive,
51                State::Active => pb::validator_state::ValidatorStateEnum::Active,
52                State::Jailed => pb::validator_state::ValidatorStateEnum::Jailed,
53                State::Tombstoned => pb::validator_state::ValidatorStateEnum::Tombstoned,
54                State::Disabled => pb::validator_state::ValidatorStateEnum::Disabled,
55            } as i32,
56        }
57    }
58}
59
60impl TryFrom<pb::ValidatorState> for State {
61    type Error = anyhow::Error;
62    fn try_from(v: pb::ValidatorState) -> Result<Self, Self::Error> {
63        let validator_state = pb::validator_state::ValidatorStateEnum::try_from(v.state)
64            .map_err(|e| anyhow::anyhow!("invalid validator state, error: {e}"))?;
65
66        match validator_state {
67            pb::validator_state::ValidatorStateEnum::Defined => Ok(State::Defined),
68            pb::validator_state::ValidatorStateEnum::Inactive => Ok(State::Inactive),
69            pb::validator_state::ValidatorStateEnum::Active => Ok(State::Active),
70            pb::validator_state::ValidatorStateEnum::Jailed => Ok(State::Jailed),
71            pb::validator_state::ValidatorStateEnum::Tombstoned => Ok(State::Tombstoned),
72            pb::validator_state::ValidatorStateEnum::Disabled => Ok(State::Disabled),
73            pb::validator_state::ValidatorStateEnum::Unspecified => {
74                Err(anyhow!("unspecified validator state!"))
75            }
76        }
77    }
78}