diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index 0ee86bc7d24b..907599fe2a29 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -36,7 +36,7 @@ use reth_chainspec::{ }; use reth_ethereum_forks::{ChainHardforks, EthereumHardfork, ForkCondition, Hardfork}; use reth_network_peers::NodeRecord; -use reth_optimism_forks::OpHardforks; +use reth_optimism_forks::{OpHardfork, OpHardforks}; #[cfg(feature = "std")] pub(crate) use std::sync::LazyLock; @@ -166,6 +166,13 @@ impl OpChainSpecBuilder { self } + /// Enable Isthmus at genesis + pub fn isthmus_activated(mut self) -> Self { + self = self.holocene_activated(); + self.inner = self.inner.with_fork(OpHardfork::Isthmus, ForkCondition::Timestamp(0)); + self + } + /// Build the resulting [`OpChainSpec`]. /// /// # Panics @@ -414,6 +421,7 @@ impl From for OpChainSpec { (OpHardfork::Fjord.boxed(), genesis_info.fjord_time), (OpHardfork::Granite.boxed(), genesis_info.granite_time), (OpHardfork::Holocene.boxed(), genesis_info.holocene_time), + (OpHardfork::Isthmus.boxed(), genesis_info.isthmus_time), ]; let mut time_hardforks = time_hardfork_opts @@ -1030,6 +1038,7 @@ mod tests { OpHardfork::Fjord.boxed(), OpHardfork::Granite.boxed(), OpHardfork::Holocene.boxed(), + // OpHardfork::Isthmus.boxed(), ]; assert!(expected_hardforks diff --git a/crates/optimism/evm/src/config.rs b/crates/optimism/evm/src/config.rs index 4a37860efc6b..b32b0929424d 100644 --- a/crates/optimism/evm/src/config.rs +++ b/crates/optimism/evm/src/config.rs @@ -12,7 +12,9 @@ pub fn revm_spec_by_timestamp_after_bedrock( chain_spec: &OpChainSpec, timestamp: u64, ) -> revm_primitives::SpecId { - if chain_spec.fork(OpHardfork::Holocene).active_at_timestamp(timestamp) { + if chain_spec.fork(OpHardfork::Isthmus).active_at_timestamp(timestamp) { + todo!() + } else if chain_spec.fork(OpHardfork::Holocene).active_at_timestamp(timestamp) { revm_primitives::HOLOCENE } else if chain_spec.fork(OpHardfork::Granite).active_at_timestamp(timestamp) { revm_primitives::GRANITE @@ -31,7 +33,9 @@ pub fn revm_spec_by_timestamp_after_bedrock( /// Map the latest active hardfork at the given block to a revm [`SpecId`](revm_primitives::SpecId). pub fn revm_spec(chain_spec: &OpChainSpec, block: &Head) -> revm_primitives::SpecId { - if chain_spec.fork(OpHardfork::Holocene).active_at_head(block) { + if chain_spec.fork(OpHardfork::Isthmus).active_at_head(block) { + todo!() + } else if chain_spec.fork(OpHardfork::Holocene).active_at_head(block) { revm_primitives::HOLOCENE } else if chain_spec.fork(OpHardfork::Granite).active_at_head(block) { revm_primitives::GRANITE diff --git a/crates/optimism/hardforks/src/hardfork.rs b/crates/optimism/hardforks/src/hardfork.rs index 661816ae5fe0..962d7bca4bcd 100644 --- a/crates/optimism/hardforks/src/hardfork.rs +++ b/crates/optimism/hardforks/src/hardfork.rs @@ -33,6 +33,8 @@ hardfork!( Granite, /// Holocene: Holocene, + /// Isthmus: + Isthmus, } ); @@ -159,6 +161,7 @@ impl OpHardfork { Self::Fjord => Some(1716998400), Self::Granite => Some(1723478400), Self::Holocene => Some(1732633200), + Self::Isthmus => todo!(), }, ) } @@ -194,6 +197,7 @@ impl OpHardfork { Self::Fjord => Some(1720627201), Self::Granite => Some(1726070401), Self::Holocene => None, + Self::Isthmus => todo!(), }, ) } @@ -357,7 +361,7 @@ mod tests { #[test] fn check_op_hardfork_from_str() { let hardfork_str = - ["beDrOck", "rEgOlITH", "cAnYoN", "eCoToNe", "FJorD", "GRaNiTe", "hOlOcEnE"]; + ["beDrOck", "rEgOlITH", "cAnYoN", "eCoToNe", "FJorD", "GRaNiTe", "hOlOcEnE", "isthMUS"]; let expected_hardforks = [ OpHardfork::Bedrock, OpHardfork::Regolith, @@ -366,6 +370,7 @@ mod tests { OpHardfork::Fjord, OpHardfork::Granite, OpHardfork::Holocene, + OpHardfork::Isthmus, ]; let hardforks: Vec = diff --git a/crates/optimism/hardforks/src/lib.rs b/crates/optimism/hardforks/src/lib.rs index bf6ca98ce4e9..36f42155e942 100644 --- a/crates/optimism/hardforks/src/lib.rs +++ b/crates/optimism/hardforks/src/lib.rs @@ -27,6 +27,12 @@ pub trait OpHardforks: EthereumHardforks { self.fork(OpHardfork::Bedrock).active_at_block(block_number) } + /// Returns `true` if [`Regolith`](OpHardfork::Regolith) is active at given block + /// timestamp. + fn is_regolith_active_at_timestamp(&self, timestamp: u64) -> bool { + self.fork(OpHardfork::Regolith).active_at_timestamp(timestamp) + } + /// Returns `true` if [`Canyon`](OpHardfork::Canyon) is active at given block timestamp. fn is_canyon_active_at_timestamp(&self, timestamp: u64) -> bool { self.fork(OpHardfork::Canyon).active_at_timestamp(timestamp) @@ -53,9 +59,9 @@ pub trait OpHardforks: EthereumHardforks { self.fork(OpHardfork::Holocene).active_at_timestamp(timestamp) } - /// Returns `true` if [`Regolith`](OpHardfork::Regolith) is active at given block + /// Returns `true` if [`Isthmus`](OpHardfork::Isthmus) is active at given block /// timestamp. - fn is_regolith_active_at_timestamp(&self, timestamp: u64) -> bool { - self.fork(OpHardfork::Regolith).active_at_timestamp(timestamp) + fn is_isthmus_active_at_timestamp(&self, timestamp: u64) -> bool { + self.fork(OpHardfork::Isthmus).active_at_timestamp(timestamp) } }