1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4use crate::validator::ValidatorSet;
5use crate::view::ViewNumber;
6
7#[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#[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}