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