blob_indexer/
network.rs

1use std::{fmt, str::FromStr};
2
3use anyhow::anyhow;
4
5#[derive(Debug, Clone, Copy)]
6pub enum EVMNetworkName {
7    Mainnet,
8    Goerli,
9    Sepolia,
10    Holesky,
11    Hoodi,
12    Gnosis,
13    Chiado,
14}
15
16#[derive(Debug, Clone, Copy)]
17pub enum NetworkName {
18    Preset(EVMNetworkName),
19    Devnet,
20}
21
22#[derive(Debug, Clone, Copy)]
23pub struct Network {
24    pub name: NetworkName,
25    pub chain_id: u64,
26    pub dencun_fork_slot: u32,
27    pub epoch: u32,
28}
29
30impl Network {
31    /// Construct a `Network` from a known network with baked-in params.
32    pub fn new(name: EVMNetworkName) -> Self {
33        match name {
34            EVMNetworkName::Mainnet => Network {
35                name: name.into(),
36                chain_id: 1,
37                dencun_fork_slot: 8_626_176, // epoch 269_568
38                epoch: 269_568,
39            },
40            EVMNetworkName::Goerli => Network {
41                name: name.into(),
42                chain_id: 5,
43                dencun_fork_slot: 7_413_760, // epoch 231_680
44                epoch: 231_680,
45            },
46            EVMNetworkName::Sepolia => Network {
47                name: name.into(),
48                chain_id: 11155111,
49                dencun_fork_slot: 4_243_456, // epoch 132_608
50                epoch: 132_608,
51            },
52            EVMNetworkName::Holesky => Network {
53                name: name.into(),
54                chain_id: 17000,
55                dencun_fork_slot: 950_272, // epoch 29_696
56                epoch: 29_696,
57            },
58            EVMNetworkName::Hoodi => Network {
59                name: name.into(),
60                chain_id: 560_048,
61                dencun_fork_slot: 0,
62                epoch: 0,
63            },
64            EVMNetworkName::Gnosis => Network {
65                name: name.into(),
66                chain_id: 100,
67                dencun_fork_slot: 14_237_696, // epoch 889_856
68                epoch: 889_856,
69            },
70            EVMNetworkName::Chiado => Network {
71                name: name.into(),
72                chain_id: 10_200,
73                dencun_fork_slot: 8_265_728, // epoch 516_608
74                epoch: 516_608,
75            },
76        }
77    }
78
79    /// Construct a custom devnet with your own parameters.
80    pub fn new_devnet(chain_id: u64, dencun_fork_slot: u32, epoch: u32) -> Self {
81        Network {
82            name: NetworkName::Devnet,
83            chain_id,
84            dencun_fork_slot,
85            epoch,
86        }
87    }
88}
89
90impl From<EVMNetworkName> for NetworkName {
91    fn from(value: EVMNetworkName) -> Self {
92        NetworkName::Preset(value)
93    }
94}
95
96impl fmt::Display for EVMNetworkName {
97    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98        let s = match self {
99            EVMNetworkName::Mainnet => "mainnet",
100            EVMNetworkName::Goerli => "goerli",
101            EVMNetworkName::Sepolia => "sepolia",
102            EVMNetworkName::Holesky => "holesky",
103            EVMNetworkName::Hoodi => "hoodi",
104            EVMNetworkName::Gnosis => "gnosis",
105            EVMNetworkName::Chiado => "chiado",
106        };
107        write!(f, "{}", s)
108    }
109}
110
111impl fmt::Display for NetworkName {
112    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
113        match self {
114            NetworkName::Preset(net) => net.fmt(f),
115            NetworkName::Devnet => write!(f, "devnet"),
116        }
117    }
118}
119
120impl FromStr for NetworkName {
121    type Err = anyhow::Error;
122
123    fn from_str(s: &str) -> Result<Self, anyhow::Error> {
124        let network = match s.to_lowercase().as_str() {
125            "mainnet" => EVMNetworkName::Mainnet.into(),
126            "goerli" => EVMNetworkName::Goerli.into(),
127            "gnosis" => EVMNetworkName::Gnosis.into(),
128            "sepolia" => EVMNetworkName::Sepolia.into(),
129            "holesky" => EVMNetworkName::Holesky.into(),
130            "hoodi" => EVMNetworkName::Hoodi.into(),
131            "chiado" => EVMNetworkName::Chiado.into(),
132            "devnet" => NetworkName::Devnet,
133            unknown_network => {
134                return Err(anyhow!("{unknown_network} not supported"));
135            }
136        };
137
138        Ok(network)
139    }
140}