1#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
9pub enum Network {
10 Mainnet,
12 #[default]
14 Gnosis,
15}
16
17impl Network {
18 pub const fn block_time_seconds(self) -> u64 {
20 match self {
21 Network::Mainnet => 15,
22 Network::Gnosis => 5,
23 }
24 }
25
26 pub const fn seconds_to_blocks(self, seconds: u64) -> u64 {
28 let bt = self.block_time_seconds();
29 seconds.div_ceil(bt)
30 }
31
32 pub const fn blocks_to_seconds(self, blocks: u64) -> u64 {
34 blocks * self.block_time_seconds()
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn block_times_match_chain() {
44 assert_eq!(Network::Mainnet.block_time_seconds(), 15);
45 assert_eq!(Network::Gnosis.block_time_seconds(), 5);
46 }
47
48 #[test]
49 fn seconds_to_blocks_rounds_up() {
50 assert_eq!(Network::Gnosis.seconds_to_blocks(0), 0);
51 assert_eq!(Network::Gnosis.seconds_to_blocks(1), 1);
52 assert_eq!(Network::Gnosis.seconds_to_blocks(5), 1);
53 assert_eq!(Network::Gnosis.seconds_to_blocks(6), 2);
54 assert_eq!(Network::Mainnet.seconds_to_blocks(60), 4);
55 assert_eq!(Network::Mainnet.seconds_to_blocks(61), 5);
56 }
57
58 #[test]
59 fn round_trip_blocks_to_seconds() {
60 assert_eq!(Network::Gnosis.blocks_to_seconds(12), 60);
61 assert_eq!(Network::Mainnet.blocks_to_seconds(4), 60);
62 }
63
64 #[test]
65 fn default_is_gnosis() {
66 assert_eq!(Network::default(), Network::Gnosis);
67 }
68}