superchain_primitives/
chain_config.rs1use crate::AddressList;
4use crate::ChainGenesis;
5use crate::SuperchainLevel;
6use alloc::string::String;
7use alloy_primitives::Address;
8
9#[derive(Debug, Clone, Default, Hash, Eq, PartialEq)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
13pub struct AltDAConfig {
14 pub da_challenge_address: Option<Address>,
16 pub da_challenge_window: Option<u64>,
18 pub da_resolve_window: Option<u64>,
20}
21
22#[derive(Debug, Clone, Default, Hash, Eq, PartialEq)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
26pub struct HardForkConfiguration {
27 pub canyon_time: Option<u64>,
29 pub delta_time: Option<u64>,
31 pub ecotone_time: Option<u64>,
33 pub fjord_time: Option<u64>,
35 pub granite_time: Option<u64>,
37 pub holocene_time: Option<u64>,
39}
40
41#[derive(Debug, Clone, Default, Hash, Eq, PartialEq)]
43#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
44#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
45pub struct ChainConfig {
46 #[cfg_attr(feature = "serde", serde(rename = "Name"))]
48 pub name: String,
49 #[cfg_attr(feature = "serde", serde(rename = "l2_chain_id"))]
51 pub chain_id: u64,
52 #[cfg_attr(feature = "serde", serde(skip))]
54 pub l1_chain_id: u64,
55 #[cfg_attr(feature = "serde", serde(rename = "PublicRPC"))]
57 pub public_rpc: String,
58 #[cfg_attr(feature = "serde", serde(rename = "SequencerRPC"))]
60 pub sequencer_rpc: String,
61 #[cfg_attr(feature = "serde", serde(rename = "Explorer"))]
63 pub explorer: String,
64 #[cfg_attr(feature = "serde", serde(rename = "SuperchainLevel"))]
66 pub superchain_level: SuperchainLevel,
67 #[cfg_attr(feature = "serde", serde(rename = "SuperchainTime"))]
71 pub superchain_time: Option<u64>,
72 #[cfg_attr(feature = "serde", serde(rename = "batch_inbox_address"))]
74 pub batch_inbox_addr: Address,
75 pub genesis: ChainGenesis,
77 #[cfg_attr(feature = "serde", serde(rename = "Superchain"))]
80 pub superchain: String,
81 #[cfg_attr(feature = "serde", serde(skip))]
84 pub chain: String,
85 #[cfg_attr(feature = "serde", serde(flatten))]
87 pub hardfork_configuration: HardForkConfiguration,
88 pub alt_da: Option<AltDAConfig>,
90 #[cfg_attr(feature = "serde", serde(rename = "Addresses"))]
92 pub addresses: Option<AddressList>,
93}
94
95impl ChainConfig {
96 pub fn set_missing_fork_configs(&mut self, defaults: &HardForkConfiguration) {
100 let Some(super_time) = self.superchain_time else {
101 return;
102 };
103 let cfg = &mut self.hardfork_configuration;
104
105 if cfg.canyon_time.is_none() && defaults.canyon_time.is_some_and(|t| t > super_time) {
106 cfg.canyon_time = defaults.canyon_time;
107 }
108 if cfg.delta_time.is_none() && defaults.delta_time.is_some_and(|t| t > super_time) {
109 cfg.delta_time = defaults.delta_time;
110 }
111 if cfg.ecotone_time.is_none() && defaults.ecotone_time.is_some_and(|t| t > super_time) {
112 cfg.ecotone_time = defaults.ecotone_time;
113 }
114 if cfg.fjord_time.is_none() && defaults.fjord_time.is_some_and(|t| t > super_time) {
115 cfg.fjord_time = defaults.fjord_time;
116 }
117 if cfg.granite_time.is_none() && defaults.granite_time.is_some_and(|t| t > super_time) {
118 cfg.granite_time = defaults.granite_time;
119 }
120 if cfg.holocene_time.is_none() && defaults.holocene_time.is_some_and(|t| t > super_time) {
121 cfg.holocene_time = defaults.holocene_time;
122 }
123 }
124}