Skip to main content

bee/swarm/
network.rs

1//! Block-time aware network selector. Used by stamp duration math —
2//! Bee mainnet is on Ethereum (15-second blocks); Gnosis Chain is the
3//! production Swarm settlement chain (~5-second blocks).
4//!
5//! Mirrors the bee-js `Network` enum (`mainnet` / `gnosis`).
6
7/// Settlement chain selector for stamp duration calculations.
8#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)]
9pub enum Network {
10    /// Ethereum mainnet — 15-second average block time.
11    Mainnet,
12    /// Gnosis Chain — 5-second average block time. Default for Swarm.
13    #[default]
14    Gnosis,
15}
16
17impl Network {
18    /// Average block time in seconds.
19    pub const fn block_time_seconds(self) -> u64 {
20        match self {
21            Network::Mainnet => 15,
22            Network::Gnosis => 5,
23        }
24    }
25
26    /// Number of blocks in `seconds` rounded up to the next block.
27    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    /// Wall-clock seconds covered by `blocks` blocks.
33    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}