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