reth_optimism_forks/
lib.rs

1//! OP-Reth hard forks.
2//!
3//! This defines the [`ChainHardforks`] for certain op chains.
4//! It keeps L2 hardforks that correspond to L1 hardforks in sync by defining both at the same
5//! activation timestamp, this includes:
6//!  - Canyon : Shanghai
7//!  - Ecotone : Cancun
8//!  - Isthmus : Prague
9
10#![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, doc_auto_cfg))]
16#![cfg_attr(not(feature = "std"), no_std)]
17#![cfg_attr(not(test), warn(unused_crate_dependencies))]
18
19extern crate alloc;
20
21// Re-export alloy-op-hardforks types.
22pub use alloy_op_hardforks::{OpHardfork, OpHardforks};
23
24use alloc::vec;
25use alloy_primitives::U256;
26use once_cell::sync::Lazy as LazyLock;
27use reth_ethereum_forks::{ChainHardforks, EthereumHardfork, ForkCondition, Hardfork};
28
29/// Dev hardforks
30pub static DEV_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
31    ChainHardforks::new(vec![
32        (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
33        (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
34        (EthereumHardfork::Dao.boxed(), ForkCondition::Block(0)),
35        (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
36        (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
37        (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
38        (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
39        (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
40        (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
41        (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
42        (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
43        (
44            EthereumHardfork::Paris.boxed(),
45            ForkCondition::TTD {
46                activation_block_number: 0,
47                fork_block: None,
48                total_difficulty: U256::ZERO,
49            },
50        ),
51        (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
52        (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
53        (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(0)),
54        (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(0)),
55        (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(0)),
56        (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(0)),
57        (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(0)),
58        (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(0)),
59        (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(0)),
60        (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(0)),
61        // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(0)),
62    ])
63});
64
65/// Optimism mainnet list of hardforks.
66pub static OP_MAINNET_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
67    ChainHardforks::new(vec![
68        (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
69        (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
70        (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
71        (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
72        (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
73        (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
74        (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
75        (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
76        (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
77        (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(3950000)),
78        (EthereumHardfork::London.boxed(), ForkCondition::Block(105235063)),
79        (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(105235063)),
80        (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(105235063)),
81        (
82            EthereumHardfork::Paris.boxed(),
83            ForkCondition::TTD {
84                activation_block_number: 105235063,
85                fork_block: Some(105235063),
86                total_difficulty: U256::ZERO,
87            },
88        ),
89        (OpHardfork::Bedrock.boxed(), ForkCondition::Block(105235063)),
90        (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
91        (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1704992401)),
92        (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1704992401)),
93        (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1710374401)),
94        (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1710374401)),
95        (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1720627201)),
96        (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1726070401)),
97        (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)),
98        (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)),
99        (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)),
100        // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update
101        // timestamp when Jovian is planned */
102    ])
103});
104/// Optimism Sepolia list of hardforks.
105pub static OP_SEPOLIA_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
106    ChainHardforks::new(vec![
107        (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
108        (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
109        (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
110        (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
111        (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
112        (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
113        (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
114        (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
115        (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
116        (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
117        (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
118        (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
119        (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
120        (
121            EthereumHardfork::Paris.boxed(),
122            ForkCondition::TTD {
123                activation_block_number: 0,
124                fork_block: Some(0),
125                total_difficulty: U256::ZERO,
126            },
127        ),
128        (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
129        (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
130        (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1699981200)),
131        (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1699981200)),
132        (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1708534800)),
133        (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1708534800)),
134        (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1716998400)),
135        (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1723478400)),
136        (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)),
137        (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)),
138        (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)),
139        // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update
140        // timestamp when Jovian is planned */
141    ])
142});
143
144/// Base Sepolia list of hardforks.
145pub static BASE_SEPOLIA_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
146    ChainHardforks::new(vec![
147        (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
148        (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
149        (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
150        (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
151        (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
152        (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
153        (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
154        (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
155        (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
156        (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
157        (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
158        (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
159        (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
160        (
161            EthereumHardfork::Paris.boxed(),
162            ForkCondition::TTD {
163                activation_block_number: 0,
164                fork_block: Some(0),
165                total_difficulty: U256::ZERO,
166            },
167        ),
168        (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
169        (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
170        (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1699981200)),
171        (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1699981200)),
172        (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1708534800)),
173        (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1708534800)),
174        (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1716998400)),
175        (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1723478400)),
176        (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1732633200)),
177        (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1744905600)),
178        (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1744905600)),
179        // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update
180        // timestamp when Jovian is planned */
181    ])
182});
183
184/// Base mainnet list of hardforks.
185pub static BASE_MAINNET_HARDFORKS: LazyLock<ChainHardforks> = LazyLock::new(|| {
186    ChainHardforks::new(vec![
187        (EthereumHardfork::Frontier.boxed(), ForkCondition::Block(0)),
188        (EthereumHardfork::Homestead.boxed(), ForkCondition::Block(0)),
189        (EthereumHardfork::Tangerine.boxed(), ForkCondition::Block(0)),
190        (EthereumHardfork::SpuriousDragon.boxed(), ForkCondition::Block(0)),
191        (EthereumHardfork::Byzantium.boxed(), ForkCondition::Block(0)),
192        (EthereumHardfork::Constantinople.boxed(), ForkCondition::Block(0)),
193        (EthereumHardfork::Petersburg.boxed(), ForkCondition::Block(0)),
194        (EthereumHardfork::Istanbul.boxed(), ForkCondition::Block(0)),
195        (EthereumHardfork::MuirGlacier.boxed(), ForkCondition::Block(0)),
196        (EthereumHardfork::Berlin.boxed(), ForkCondition::Block(0)),
197        (EthereumHardfork::London.boxed(), ForkCondition::Block(0)),
198        (EthereumHardfork::ArrowGlacier.boxed(), ForkCondition::Block(0)),
199        (EthereumHardfork::GrayGlacier.boxed(), ForkCondition::Block(0)),
200        (
201            EthereumHardfork::Paris.boxed(),
202            ForkCondition::TTD {
203                activation_block_number: 0,
204                fork_block: Some(0),
205                total_difficulty: U256::ZERO,
206            },
207        ),
208        (OpHardfork::Bedrock.boxed(), ForkCondition::Block(0)),
209        (OpHardfork::Regolith.boxed(), ForkCondition::Timestamp(0)),
210        (EthereumHardfork::Shanghai.boxed(), ForkCondition::Timestamp(1704992401)),
211        (OpHardfork::Canyon.boxed(), ForkCondition::Timestamp(1704992401)),
212        (EthereumHardfork::Cancun.boxed(), ForkCondition::Timestamp(1710374401)),
213        (OpHardfork::Ecotone.boxed(), ForkCondition::Timestamp(1710374401)),
214        (OpHardfork::Fjord.boxed(), ForkCondition::Timestamp(1720627201)),
215        (OpHardfork::Granite.boxed(), ForkCondition::Timestamp(1726070401)),
216        (OpHardfork::Holocene.boxed(), ForkCondition::Timestamp(1736445601)),
217        (EthereumHardfork::Prague.boxed(), ForkCondition::Timestamp(1746806401)),
218        (OpHardfork::Isthmus.boxed(), ForkCondition::Timestamp(1746806401)),
219        // (OpHardfork::Jovian.boxed(), ForkCondition::Timestamp(u64::MAX)), /* TODO: Update
220        // timestamp when Jovian is planned */
221    ])
222});