diff --git a/crates/common/types/genesis.rs b/crates/common/types/genesis.rs index eb0c33abc1d..47cc7589f88 100644 --- a/crates/common/types/genesis.rs +++ b/crates/common/types/genesis.rs @@ -138,6 +138,8 @@ pub struct BlobSchedule { pub bpo4: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub bpo5: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub amsterdam: Option, } impl Default for BlobSchedule { @@ -151,6 +153,7 @@ impl Default for BlobSchedule { bpo3: None, bpo4: None, bpo5: None, + amsterdam: None, } } } @@ -251,6 +254,8 @@ pub struct ChainConfig { pub bpo4_time: Option, pub bpo5_time: Option, + pub amsterdam_time: Option, + /// Amount of total difficulty reached by the network that triggers the consensus upgrade. pub terminal_total_difficulty: Option, /// Network has already passed the terminal total difficult @@ -308,6 +313,7 @@ pub enum Fork { BPO3 = 22, BPO4 = 23, BPO5 = 24, + Amsterdam = 25, } impl From for &str { @@ -338,29 +344,35 @@ impl From for &str { Fork::BPO3 => "BPO3", Fork::BPO4 => "BPO4", Fork::BPO5 => "BPO5", + Fork::Amsterdam => "Amsterdam", } } } impl ChainConfig { - pub fn is_bpo1_activated(&self, block_timestamp: u64) -> bool { - self.bpo1_time.is_some_and(|time| time <= block_timestamp) + pub fn is_amsterdam_activated(&self, block_timestamp: u64) -> bool { + self.amsterdam_time + .is_some_and(|time| time <= block_timestamp) } - pub fn is_bpo2_activated(&self, block_timestamp: u64) -> bool { - self.bpo2_time.is_some_and(|time| time <= block_timestamp) + pub fn is_bpo5_activated(&self, block_timestamp: u64) -> bool { + self.bpo5_time.is_some_and(|time| time <= block_timestamp) + } + + pub fn is_bpo4_activated(&self, block_timestamp: u64) -> bool { + self.bpo4_time.is_some_and(|time| time <= block_timestamp) } pub fn is_bpo3_activated(&self, block_timestamp: u64) -> bool { self.bpo3_time.is_some_and(|time| time <= block_timestamp) } - pub fn is_bpo4_activated(&self, block_timestamp: u64) -> bool { - self.bpo4_time.is_some_and(|time| time <= block_timestamp) + pub fn is_bpo2_activated(&self, block_timestamp: u64) -> bool { + self.bpo2_time.is_some_and(|time| time <= block_timestamp) } - pub fn is_bpo5_activated(&self, block_timestamp: u64) -> bool { - self.bpo5_time.is_some_and(|time| time <= block_timestamp) + pub fn is_bpo1_activated(&self, block_timestamp: u64) -> bool { + self.bpo1_time.is_some_and(|time| time <= block_timestamp) } pub fn is_osaka_activated(&self, block_timestamp: u64) -> bool { @@ -402,6 +414,7 @@ impl ChainConfig { ("Prague", self.prague_time), ("Verkle", self.verkle_time), ("Osaka", self.osaka_time), + ("Amsterdam", self.amsterdam_time), ]; let active_forks: Vec<_> = post_merge_forks @@ -421,7 +434,9 @@ impl ChainConfig { } pub fn get_fork(&self, block_timestamp: u64) -> Fork { - if self.is_bpo5_activated(block_timestamp) { + if self.is_amsterdam_activated(block_timestamp) { + Fork::Amsterdam + } else if self.is_bpo5_activated(block_timestamp) { Fork::BPO5 } else if self.is_bpo4_activated(block_timestamp) { Fork::BPO4 @@ -445,7 +460,9 @@ impl ChainConfig { } pub fn get_fork_blob_schedule(&self, block_timestamp: u64) -> Option { - if self.is_bpo5_activated(block_timestamp) { + if self.is_amsterdam_activated(block_timestamp) { + Some(self.blob_schedule.amsterdam.unwrap_or_default()) + } else if self.is_bpo5_activated(block_timestamp) { Some(self.blob_schedule.bpo5.unwrap_or_default()) } else if self.is_bpo4_activated(block_timestamp) { Some(self.blob_schedule.bpo4.unwrap_or_default()) @@ -471,8 +488,10 @@ impl ChainConfig { } pub fn next_fork(&self, block_timestamp: u64) -> Option { - let next = if self.is_bpo5_activated(block_timestamp) { + let next = if self.is_amsterdam_activated(block_timestamp) { None + } else if self.is_bpo5_activated(block_timestamp) && self.amsterdam_time.is_some() { + Some(Fork::Amsterdam) } else if self.is_bpo4_activated(block_timestamp) && self.bpo5_time.is_some() { Some(Fork::BPO5) } else if self.is_bpo3_activated(block_timestamp) && self.bpo4_time.is_some() { @@ -499,7 +518,9 @@ impl ChainConfig { } pub fn get_last_scheduled_fork(&self) -> Fork { - if self.bpo5_time.is_some() { + if self.amsterdam_time.is_some() { + Fork::Amsterdam + } else if self.bpo5_time.is_some() { Fork::BPO5 } else if self.bpo4_time.is_some() { Fork::BPO4 @@ -530,6 +551,7 @@ impl ChainConfig { Fork::BPO3 => self.bpo3_time, Fork::BPO4 => self.bpo4_time, Fork::BPO5 => self.bpo5_time, + Fork::Amsterdam => self.amsterdam_time, Fork::Homestead => self.homestead_block, Fork::DaoFork => self.dao_fork_block, Fork::Byzantium => self.byzantium_block, @@ -557,6 +579,7 @@ impl ChainConfig { Fork::BPO3 => self.blob_schedule.bpo3, Fork::BPO4 => self.blob_schedule.bpo4, Fork::BPO5 => self.blob_schedule.bpo5, + Fork::Amsterdam => self.blob_schedule.amsterdam, _ => None, } } @@ -601,6 +624,7 @@ impl ChainConfig { self.bpo3_time, self.bpo4_time, self.bpo5_time, + self.amsterdam_time, self.verkle_time, ] .into_iter() diff --git a/crates/networking/rpc/rpc.rs b/crates/networking/rpc/rpc.rs index 5529093de69..3cab9e75c43 100644 --- a/crates/networking/rpc/rpc.rs +++ b/crates/networking/rpc/rpc.rs @@ -750,6 +750,7 @@ mod tests { "bpo3Time": null, "bpo4Time": null, "bpo5Time": null, + "amsterdamTime": null, "terminalTotalDifficulty": 0, "terminalTotalDifficultyPassed": true, "blobSchedule": blob_schedule, diff --git a/tooling/ef_tests/state/runner/revm_runner.rs b/tooling/ef_tests/state/runner/revm_runner.rs index c04d74c19aa..2de3a783071 100644 --- a/tooling/ef_tests/state/runner/revm_runner.rs +++ b/tooling/ef_tests/state/runner/revm_runner.rs @@ -700,6 +700,7 @@ pub fn fork_to_spec_id(fork: Fork) -> SpecId { Fork::BPO3 => SpecId::OSAKA, Fork::BPO4 => SpecId::OSAKA, Fork::BPO5 => SpecId::OSAKA, + Fork::Amsterdam => todo!(), } }