1#![doc(
11 html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
12 html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
13 issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
14)]
15#![cfg_attr(docsrs, feature(doc_cfg))]
16#![cfg_attr(not(feature = "std"), no_std)]
17#![cfg_attr(not(test), warn(unused_crate_dependencies))]
18
19extern crate alloc;
20
21use alloy_op_hardforks::{
22 BASE_MAINNET_JOVIAN_TIMESTAMP, BASE_SEPOLIA_JOVIAN_TIMESTAMP, OP_MAINNET_JOVIAN_TIMESTAMP,
23 OP_SEPOLIA_JOVIAN_TIMESTAMP,
24};
25pub use alloy_op_hardforks::{OpHardfork, OpHardforks};
27
28use alloc::vec;
29use alloy_primitives::U256;
30use once_cell::sync::Lazy as LazyLock;
31use reth_ethereum_forks::{ChainHardforks, EthereumHardfork, ForkCondition, Hardfork};
32
33pub static DEV_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
35 const JOVIAN_TIMESTAMP: ForkCondition = ForkCondition::Timestamp(1761840000);
36 ChainHardforks::new(vec![
37 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
38 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
39 (EthereumHardfork::Dao.boxed(), ForkCondition::Block(0)),
40 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
41 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
42 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
43 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
44 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
45 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
46 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
47 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
48 (
49 EthereumHardfork::Paris.boxed(),
50 ForkCondition::TTD {
51 activation_block_number: 0,
52 fork_block: None,
53 total_difficulty: U256::ZERO,
54 },
55 ),
56 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
57 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
58 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0)),
59 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(0)),
60 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0)),
61 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(0)),
62 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(0)),
63 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(0)),
64 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(0)),
65 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0)),
66 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(0)),
67 (OpHardfork::Jovian.boxed(), JOVIAN_TIMESTAMP),
68 ])
69});
70
71pub static OP_MAINNET_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
73 ChainHardforks::new(vec![
74 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
75 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
76 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
77 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
78 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
79 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
80 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
81 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
82 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
83 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(3950000)),
84 (EthereumHardfork::London.boxed(), ForkCondition::Block(105235063)),
85 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(105235063)),
86 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(105235063)),
87 (
88 EthereumHardfork::Paris.boxed(),
89 ForkCondition::TTD {
90 activation_block_number: 105235063,
91 fork_block: Some(105235063),
92 total_difficulty: U256::ZERO,
93 },
94 ),
95 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(105235063)),
96 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
97 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1704992401)),
98 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1704992401)),
99 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1710374401)),
100 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1710374401)),
101 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1720627201)),
102 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1726070401)),
103 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)),
104 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)),
105 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)),
106 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(OP_MAINNET_JOVIAN_TIMESTAMP)),
107 ])
108});
109pub static OP_SEPOLIA_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
111 ChainHardforks::new(vec![
112 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
113 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
114 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
115 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
116 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
117 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
118 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
119 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
120 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
121 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
122 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
123 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
124 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
125 (
126 EthereumHardfork::Paris.boxed(),
127 ForkCondition::TTD {
128 activation_block_number: 0,
129 fork_block: Some(0),
130 total_difficulty: U256::ZERO,
131 },
132 ),
133 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
134 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
135 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1699981200)),
136 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1699981200)),
137 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1708534800)),
138 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1708534800)),
139 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1716998400)),
140 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1723478400)),
141 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)),
142 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)),
143 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)),
144 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(OP_SEPOLIA_JOVIAN_TIMESTAMP)),
145 ])
146});
147
148pub static BASE_SEPOLIA_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
150 ChainHardforks::new(vec![
151 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
152 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
153 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
154 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
155 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
156 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
157 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
158 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
159 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
160 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
161 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
162 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
163 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
164 (
165 EthereumHardfork::Paris.boxed(),
166 ForkCondition::TTD {
167 activation_block_number: 0,
168 fork_block: Some(0),
169 total_difficulty: U256::ZERO,
170 },
171 ),
172 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
173 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
174 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1699981200)),
175 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1699981200)),
176 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1708534800)),
177 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1708534800)),
178 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1716998400)),
179 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1723478400)),
180 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)),
181 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)),
182 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)),
183 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(BASE_SEPOLIA_JOVIAN_TIMESTAMP)),
184 ])
185});
186
187pub static BASE_MAINNET_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
189 ChainHardforks::new(vec![
190 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
191 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
192 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
193 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
194 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
195 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
196 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
197 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
198 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
199 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
200 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
201 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
202 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
203 (
204 EthereumHardfork::Paris.boxed(),
205 ForkCondition::TTD {
206 activation_block_number: 0,
207 fork_block: Some(0),
208 total_difficulty: U256::ZERO,
209 },
210 ),
211 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
212 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
213 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1704992401)),
214 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1704992401)),
215 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1710374401)),
216 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1710374401)),
217 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1720627201)),
218 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1726070401)),
219 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)),
220 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)),
221 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)),
222 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(BASE_MAINNET_JOVIAN_TIMESTAMP)),
223 ])
224});