Skip to main content

hotmint_types/
epoch.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4use crate::validator::ValidatorSet;
5use crate::view::ViewNumber;
6
7/// Epoch number — changes when the validator set changes
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
9pub struct EpochNumber(pub u64);
10
11impl EpochNumber {
12    pub const GENESIS: Self = Self(0);
13
14    pub fn next(self) -> Self {
15        Self(self.0 + 1)
16    }
17
18    pub fn as_u64(self) -> u64 {
19        self.0
20    }
21}
22
23impl fmt::Display for EpochNumber {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        write!(f, "e{}", self.0)
26    }
27}
28
29/// An epoch defines a validator set with a starting view
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct Epoch {
32    pub number: EpochNumber,
33    pub start_view: ViewNumber,
34    pub validator_set: ValidatorSet,
35}
36
37impl Epoch {
38    pub fn new(number: EpochNumber, start_view: ViewNumber, validator_set: ValidatorSet) -> Self {
39        Self {
40            number,
41            start_view,
42            validator_set,
43        }
44    }
45
46    pub fn genesis(validator_set: ValidatorSet) -> Self {
47        Self::new(EpochNumber::GENESIS, ViewNumber(1), validator_set)
48    }
49
50    pub fn contains_view(&self, view: ViewNumber) -> bool {
51        view >= self.start_view
52    }
53}