reth_optimism_chainspec/
op.rs

1//! Chain specification for the Optimism Mainnet network.
2
3use crate::{make_op_genesis_header, LazyLock, OpChainSpec};
4use alloc::{sync::Arc, vec};
5use alloy_chains::Chain;
6use alloy_primitives::{b256, U256};
7use reth_chainspec::{BaseFeeParams, BaseFeeParamsKind, ChainSpec, Hardfork};
8use reth_ethereum_forks::EthereumHardfork;
9use reth_optimism_forks::{OpHardfork, OP_MAINNET_HARDFORKS};
10use reth_primitives_traits::SealedHeader;
11
12/// The Optimism Mainnet spec
13pub static OP_MAINNET: LazyLock<Arc<OpChainSpec>> = LazyLock::new(|| {
14    // genesis contains empty alloc field because state at first bedrock block is imported
15    // manually from trusted source
16    let genesis = serde_json::from_str(include_str!("../res/genesis/optimism.json"))
17        .expect("Can't deserialize Optimism Mainnet genesis json");
18    let hardforks = OP_MAINNET_HARDFORKS.clone();
19    OpChainSpec {
20        inner: ChainSpec {
21            chain: Chain::optimism_mainnet(),
22            genesis_header: SealedHeader::new(
23                make_op_genesis_header(&genesis, &hardforks),
24                b256!("0x7ca38a1916c42007829c55e69d3e9a73265554b586a499015373241b8a3fa48b"),
25            ),
26            genesis,
27            paris_block_and_final_difficulty: Some((0, U256::from(0))),
28            hardforks,
29            base_fee_params: BaseFeeParamsKind::Variable(
30                vec![
31                    (EthereumHardfork::London.boxed(), BaseFeeParams::optimism()),
32                    (OpHardfork::Canyon.boxed(), BaseFeeParams::optimism_canyon()),
33                ]
34                .into(),
35            ),
36            prune_delete_limit: 10000,
37            ..Default::default()
38        },
39    }
40    .into()
41});