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))]
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};
25// Re-export alloy-op-hardforks types.
26pub 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
33/// Dev hardforks
34pub 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
70/// Optimism mainnet list of hardforks.
71pub 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});
108/// Optimism Sepolia list of hardforks.
109pub 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
147/// Base Sepolia list of hardforks.
148pub 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
186/// Base mainnet list of hardforks.
187pub 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});