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 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,
39 },
40 EVMNetworkName::Goerli => Network {
41 name: name.into(),
42 chain_id: 5,
43 dencun_fork_slot: 7_413_760, 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,
51 },
52 EVMNetworkName::Holesky => Network {
53 name: name.into(),
54 chain_id: 17000,
55 dencun_fork_slot: 950_272, 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,
69 },
70 EVMNetworkName::Chiado => Network {
71 name: name.into(),
72 chain_id: 10_200,
73 dencun_fork_slot: 8_265_728, epoch: 516_608,
75 },
76 }
77 }
78
79 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}