use crate::AddressList;
use crate::ChainGenesis;
use crate::SuperchainLevel;
use alloc::string::String;
use alloy_primitives::Address;
#[derive(Debug, Clone, Default, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
pub struct AltDAConfig {
pub da_challenge_address: Option<Address>,
pub da_challenge_window: Option<u64>,
pub da_resolve_window: Option<u64>,
}
#[derive(Debug, Clone, Default, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
pub struct HardForkConfiguration {
pub canyon_time: Option<u64>,
pub delta_time: Option<u64>,
pub ecotone_time: Option<u64>,
pub fjord_time: Option<u64>,
pub granite_time: Option<u64>,
pub holocene_time: Option<u64>,
}
#[derive(Debug, Clone, Default, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))]
pub struct ChainConfig {
#[cfg_attr(feature = "serde", serde(rename = "Name"))]
pub name: String,
#[cfg_attr(feature = "serde", serde(rename = "l2_chain_id"))]
pub chain_id: u64,
#[cfg_attr(feature = "serde", serde(skip))]
pub l1_chain_id: u64,
#[cfg_attr(feature = "serde", serde(rename = "PublicRPC"))]
pub public_rpc: String,
#[cfg_attr(feature = "serde", serde(rename = "SequencerRPC"))]
pub sequencer_rpc: String,
#[cfg_attr(feature = "serde", serde(rename = "Explorer"))]
pub explorer: String,
#[cfg_attr(feature = "serde", serde(rename = "SuperchainLevel"))]
pub superchain_level: SuperchainLevel,
#[cfg_attr(feature = "serde", serde(rename = "SuperchainTime"))]
pub superchain_time: Option<u64>,
#[cfg_attr(feature = "serde", serde(rename = "batch_inbox_address"))]
pub batch_inbox_addr: Address,
pub genesis: ChainGenesis,
#[cfg_attr(feature = "serde", serde(rename = "Superchain"))]
pub superchain: String,
#[cfg_attr(feature = "serde", serde(skip))]
pub chain: String,
#[cfg_attr(feature = "serde", serde(flatten))]
pub hardfork_configuration: HardForkConfiguration,
pub alt_da: Option<AltDAConfig>,
#[cfg_attr(feature = "serde", serde(rename = "Addresses"))]
pub addresses: Option<AddressList>,
}
impl ChainConfig {
pub fn set_missing_fork_configs(&mut self, defaults: &HardForkConfiguration) {
let Some(super_time) = self.superchain_time else {
return;
};
let cfg = &mut self.hardfork_configuration;
if cfg.canyon_time.is_none() && defaults.canyon_time.is_some_and(|t| t > super_time) {
cfg.canyon_time = defaults.canyon_time;
}
if cfg.delta_time.is_none() && defaults.delta_time.is_some_and(|t| t > super_time) {
cfg.delta_time = defaults.delta_time;
}
if cfg.ecotone_time.is_none() && defaults.ecotone_time.is_some_and(|t| t > super_time) {
cfg.ecotone_time = defaults.ecotone_time;
}
if cfg.fjord_time.is_none() && defaults.fjord_time.is_some_and(|t| t > super_time) {
cfg.fjord_time = defaults.fjord_time;
}
if cfg.granite_time.is_none() && defaults.granite_time.is_some_and(|t| t > super_time) {
cfg.granite_time = defaults.granite_time;
}
if cfg.holocene_time.is_none() && defaults.holocene_time.is_some_and(|t| t > super_time) {
cfg.holocene_time = defaults.holocene_time;
}
}
}