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