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 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0)),
65 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(0)),
66 (OpHardfork::Jovian.boxed(), JOVIAN_TIMESTAMP),
67 ])
68});
69
70pub static OP_MAINNET_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
72 ChainHardforks::new(vec![
73 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
74 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
75 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
76 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
77 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
78 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
79 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
80 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
81 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
82 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(3950000)),
83 (EthereumHardfork::London.boxed(), ForkCondition::Block(105235063)),
84 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(105235063)),
85 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(105235063)),
86 (
87 EthereumHardfork::Paris.boxed(),
88 ForkCondition::TTD {
89 activation_block_number: 105235063,
90 fork_block: Some(105235063),
91 total_difficulty: U256::ZERO,
92 },
93 ),
94 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(105235063)),
95 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
96 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1704992401)),
97 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1704992401)),
98 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1710374401)),
99 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1710374401)),
100 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1720627201)),
101 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1726070401)),
102 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)),
103 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)),
104 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)),
105 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(OP_MAINNET_JOVIAN_TIMESTAMP)),
106 ])
107});
108pub static OP_SEPOLIA_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
110 ChainHardforks::new(vec![
111 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
112 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
113 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
114 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
115 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
116 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
117 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
118 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
119 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
120 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
121 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
122 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
123 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
124 (
125 EthereumHardfork::Paris.boxed(),
126 ForkCondition::TTD {
127 activation_block_number: 0,
128 fork_block: Some(0),
129 total_difficulty: U256::ZERO,
130 },
131 ),
132 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
133 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
134 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1699981200)),
135 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1699981200)),
136 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1708534800)),
137 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1708534800)),
138 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1716998400)),
139 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1723478400)),
140 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)),
141 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)),
142 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)),
143 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(OP_SEPOLIA_JOVIAN_TIMESTAMP)),
144 ])
145});
146
147pub static BASE_SEPOLIA_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
149 ChainHardforks::new(vec![
150 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
151 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
152 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
153 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
154 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
155 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
156 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
157 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
158 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
159 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
160 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
161 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
162 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
163 (
164 EthereumHardfork::Paris.boxed(),
165 ForkCondition::TTD {
166 activation_block_number: 0,
167 fork_block: Some(0),
168 total_difficulty: U256::ZERO,
169 },
170 ),
171 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
172 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
173 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1699981200)),
174 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1699981200)),
175 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1708534800)),
176 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1708534800)),
177 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1716998400)),
178 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1723478400)),
179 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)),
180 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)),
181 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)),
182 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(BASE_SEPOLIA_JOVIAN_TIMESTAMP)),
183 ])
184});
185
186pub static BASE_MAINNET_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
188 ChainHardforks::new(vec![
189 (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
190 (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
191 (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
192 (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
193 (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
194 (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
195 (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
196 (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
197 (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
198 (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
199 (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
200 (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
201 (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
202 (
203 EthereumHardfork::Paris.boxed(),
204 ForkCondition::TTD {
205 activation_block_number: 0,
206 fork_block: Some(0),
207 total_difficulty: U256::ZERO,
208 },
209 ),
210 (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
211 (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
212 (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1704992401)),
213 (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1704992401)),
214 (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1710374401)),
215 (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1710374401)),
216 (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1720627201)),
217 (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1726070401)),
218 (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)),
219 (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)),
220 (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)),
221 (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(BASE_MAINNET_JOVIAN_TIMESTAMP)),
222 ])
223});