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        (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
71/// Optimism mainnet list of hardforks.
72pub 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});
109/// Optimism Sepolia list of hardforks.
110pub 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
148/// Base Sepolia list of hardforks.
149pub 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
187/// Base mainnet list of hardforks.
188pub 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});