From 17314c8bcf9d455cd20226079c74d6a1ecfbbd65 Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Fri, 23 May 2025 22:23:59 +0530 Subject: [PATCH 1/9] chore: replaced anvil hardforks with alloy hardforks --- Cargo.lock | 2 ++ Cargo.toml | 3 ++ crates/anvil/Cargo.toml | 2 ++ crates/anvil/src/hardfork.rs | 62 +++++++++++++++++++----------------- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ea0b862ec1302..5d1e7afdd1ed1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1056,8 +1056,10 @@ dependencies = [ "alloy-eips 1.0.5", "alloy-evm", "alloy-genesis", + "alloy-hardforks", "alloy-network", "alloy-op-evm", + "alloy-op-hardforks", "alloy-primitives", "alloy-provider", "alloy-pubsub", diff --git a/Cargo.toml b/Cargo.toml index 76f51d5337151..5e57429b1ea26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -230,6 +230,9 @@ alloy-transport = { version = "1.0.5", default-features = false } alloy-transport-http = { version = "1.0.5", default-features = false } alloy-transport-ipc = { version = "1.0.5", default-features = false } alloy-transport-ws = { version = "1.0.5", default-features = false } +alloy-hardforks = { version = "0.2.2", default-features = false } +alloy-op-hardforks = { version = "0.2.2", default-features = false } + ## alloy-core alloy-dyn-abi = "1.0" diff --git a/crates/anvil/Cargo.toml b/crates/anvil/Cargo.toml index e45c95e49f85e..23ff53b271895 100644 --- a/crates/anvil/Cargo.toml +++ b/crates/anvil/Cargo.toml @@ -55,6 +55,8 @@ alloy-transport.workspace = true alloy-chains.workspace = true alloy-genesis.workspace = true alloy-trie.workspace = true +alloy-hardforks.workspace = true +alloy-op-hardforks.workspace = true op-alloy-consensus = { workspace = true, features = ["serde"] } # revm diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index 34fe97fa1de41..15f9b162a3989 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -1,5 +1,6 @@ use std::str::FromStr; +use alloy_hardforks::ethereum::mainnet::*; use alloy_rpc_types::BlockNumberOrTag; use eyre::bail; use op_revm::OpSpecId; @@ -60,22 +61,23 @@ impl EthereumHardfork { /// Get the first block number of the hardfork. pub fn fork_block(&self) -> u64 { match *self { - Self::Frontier => 0, - Self::Homestead => 1150000, - Self::Dao => 1920000, - Self::Tangerine => 2463000, - Self::SpuriousDragon => 2675000, - Self::Byzantium => 4370000, - Self::Constantinople | Self::Petersburg => 7280000, - Self::Istanbul => 9069000, - Self::Muirglacier => 9200000, - Self::Berlin => 12244000, - Self::London => 12965000, - Self::ArrowGlacier => 13773000, - Self::GrayGlacier => 15050000, - Self::Paris => 15537394, - Self::Shanghai => 17034870, - Self::Cancun | Self::Latest => 19426587, + Self::Frontier => MAINNET_FRONTIER_BLOCK, + Self::Homestead => MAINNET_HOMESTEAD_BLOCK, + Self::Dao => MAINNET_DAO_BLOCK, + Self::Tangerine => MAINNET_TANGERINE_BLOCK, + Self::SpuriousDragon => MAINNET_SPURIOUS_DRAGON_BLOCK, + Self::Byzantium => MAINNET_BYZANTIUM_BLOCK, + Self::Constantinople => MAINNET_CONSTANTINOPLE_BLOCK, + Self::Petersburg => MAINNET_PETERSBURG_BLOCK, + Self::Istanbul => MAINNET_ISTANBUL_BLOCK, + Self::Muirglacier => MAINNET_MUIR_GLACIER_BLOCK, + Self::Berlin => MAINNET_BERLIN_BLOCK, + Self::London => MAINNET_LONDON_BLOCK, + Self::ArrowGlacier => MAINNET_ARROW_GLACIER_BLOCK, + Self::GrayGlacier => MAINNET_GRAY_GLACIER_BLOCK, + Self::Paris => MAINNET_PARIS_BLOCK, + Self::Shanghai => MAINNET_SHANGHAI_BLOCK, + Self::Cancun | Self::Latest => MAINNET_CANCUN_BLOCK, Self::Prague => 22431084, } } @@ -146,20 +148,20 @@ impl> From for EthereumHardfork { }; match num { - _i if num < 1_150_000 => Self::Frontier, - _i if num < 1_920_000 => Self::Dao, - _i if num < 2_463_000 => Self::Homestead, - _i if num < 2_675_000 => Self::Tangerine, - _i if num < 4_370_000 => Self::SpuriousDragon, - _i if num < 7_280_000 => Self::Byzantium, - _i if num < 9_069_000 => Self::Constantinople, - _i if num < 9_200_000 => Self::Istanbul, - _i if num < 12_244_000 => Self::Muirglacier, - _i if num < 12_965_000 => Self::Berlin, - _i if num < 13_773_000 => Self::London, - _i if num < 15_050_000 => Self::ArrowGlacier, - _i if num < 17_034_870 => Self::Paris, - _i if num < 19_426_587 => Self::Shanghai, + _i if num < MAINNET_HOMESTEAD_BLOCK => Self::Frontier, + _i if num < MAINNET_DAO_BLOCK => Self::Homestead, + _i if num < MAINNET_TANGERINE_BLOCK => Self::Dao, + _i if num < MAINNET_SPURIOUS_DRAGON_BLOCK => Self::Tangerine, + _i if num < MAINNET_BYZANTIUM_BLOCK => Self::SpuriousDragon, + _i if num < MAINNET_CONSTANTINOPLE_BLOCK => Self::Byzantium, + _i if num < MAINNET_ISTANBUL_BLOCK => Self::Constantinople, + _i if num < MAINNET_MUIR_GLACIER_BLOCK => Self::Istanbul, + _i if num < MAINNET_BERLIN_BLOCK => Self::Muirglacier, + _i if num < MAINNET_LONDON_BLOCK => Self::Berlin, + _i if num < MAINNET_ARROW_GLACIER_BLOCK => Self::London, + _i if num < MAINNET_PARIS_BLOCK => Self::ArrowGlacier, + _i if num < MAINNET_SHANGHAI_BLOCK => Self::Paris, + _i if num < MAINNET_CANCUN_BLOCK => Self::Shanghai, _ => Self::Latest, } } From 576f4ec9713ae82a4e6eece80f85ffc8defb185c Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Sat, 24 May 2025 14:12:16 +0530 Subject: [PATCH 2/9] fixes --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- crates/anvil/src/hardfork.rs | 23 ++++++++++++++++++++++- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d1e7afdd1ed1..20541b69291fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -274,9 +274,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40cc82a2283e3ce6317bc1f0134ea50d20e8c1965393045ee952fb28a65ddbd" +checksum = "1d6b8067561eb8f884b215ace4c962313c5467e47bde6b457c8c51e268fb5d99" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -369,9 +369,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a79617217008626a24fb52b02d532bf4554ac9b184a2d22bd6c5df628c151601" +checksum = "08043c9284e597f9b5cf741cc6d906fdb26c195a01d88423c84c00ffda835713" dependencies = [ "alloy-hardforks", "auto_impl", diff --git a/Cargo.toml b/Cargo.toml index 5e57429b1ea26..849b7be8a0353 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -230,8 +230,8 @@ alloy-transport = { version = "1.0.5", default-features = false } alloy-transport-http = { version = "1.0.5", default-features = false } alloy-transport-ipc = { version = "1.0.5", default-features = false } alloy-transport-ws = { version = "1.0.5", default-features = false } -alloy-hardforks = { version = "0.2.2", default-features = false } -alloy-op-hardforks = { version = "0.2.2", default-features = false } +alloy-hardforks = { version = "0.2.3", default-features = false } +alloy-op-hardforks = { version = "0.2.3", default-features = false } ## alloy-core diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index 15f9b162a3989..c60150ff20287 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -78,9 +78,30 @@ impl EthereumHardfork { Self::Paris => MAINNET_PARIS_BLOCK, Self::Shanghai => MAINNET_SHANGHAI_BLOCK, Self::Cancun | Self::Latest => MAINNET_CANCUN_BLOCK, - Self::Prague => 22431084, + Self::Prague => MAINNET_PRAGUE_BLOCK, } } + pub fn from_block_number(block: u64) -> Option { + Some(match block { + _i if block < MAINNET_HOMESTEAD_BLOCK => Self::Frontier, + _i if block < MAINNET_DAO_BLOCK => Self::Homestead, + _i if block < MAINNET_TANGERINE_BLOCK => Self::Dao, + _i if block < MAINNET_SPURIOUS_DRAGON_BLOCK => Self::Tangerine, + _i if block < MAINNET_BYZANTIUM_BLOCK => Self::SpuriousDragon, + _i if block < MAINNET_CONSTANTINOPLE_BLOCK => Self::Byzantium, + _i if block < MAINNET_ISTANBUL_BLOCK => Self::Constantinople, + _i if block < MAINNET_MUIR_GLACIER_BLOCK => Self::Istanbul, + _i if block < MAINNET_BERLIN_BLOCK => Self::Muirglacier, + _i if block < MAINNET_LONDON_BLOCK => Self::Berlin, + _i if block < MAINNET_ARROW_GLACIER_BLOCK => Self::London, + _i if block < MAINNET_PARIS_BLOCK => Self::ArrowGlacier, + _i if block < MAINNET_SHANGHAI_BLOCK => Self::Paris, + _i if block < MAINNET_CANCUN_BLOCK => Self::Shanghai, + _i if block < MAINNET_PRAGUE_BLOCK => Self::Cancun, + _i if block <= u64::MAX => Self::Prague, + _ => return None, + }) + } } impl FromStr for EthereumHardfork { From 02a0533b9e2fbef349b5b98a47eac0262bf2739b Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Sat, 24 May 2025 14:20:23 +0530 Subject: [PATCH 3/9] fixes --- crates/anvil/src/hardfork.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index c60150ff20287..8dd18c1702b04 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -98,8 +98,7 @@ impl EthereumHardfork { _i if block < MAINNET_SHANGHAI_BLOCK => Self::Paris, _i if block < MAINNET_CANCUN_BLOCK => Self::Shanghai, _i if block < MAINNET_PRAGUE_BLOCK => Self::Cancun, - _i if block <= u64::MAX => Self::Prague, - _ => return None, + _ => Self::Prague, }) } } From 95800ee2601f65d8c72bf019ac53becc6c0519ec Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Sat, 24 May 2025 16:00:16 +0530 Subject: [PATCH 4/9] fixes --- crates/anvil/src/hardfork.rs | 44 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index 8dd18c1702b04..adf1cc43ea48f 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -1,5 +1,6 @@ use std::str::FromStr; +use alloy_chains::Chain; use alloy_hardforks::ethereum::mainnet::*; use alloy_rpc_types::BlockNumberOrTag; use eyre::bail; @@ -60,26 +61,29 @@ pub enum EthereumHardfork { impl EthereumHardfork { /// Get the first block number of the hardfork. pub fn fork_block(&self) -> u64 { - match *self { - Self::Frontier => MAINNET_FRONTIER_BLOCK, - Self::Homestead => MAINNET_HOMESTEAD_BLOCK, - Self::Dao => MAINNET_DAO_BLOCK, - Self::Tangerine => MAINNET_TANGERINE_BLOCK, - Self::SpuriousDragon => MAINNET_SPURIOUS_DRAGON_BLOCK, - Self::Byzantium => MAINNET_BYZANTIUM_BLOCK, - Self::Constantinople => MAINNET_CONSTANTINOPLE_BLOCK, - Self::Petersburg => MAINNET_PETERSBURG_BLOCK, - Self::Istanbul => MAINNET_ISTANBUL_BLOCK, - Self::Muirglacier => MAINNET_MUIR_GLACIER_BLOCK, - Self::Berlin => MAINNET_BERLIN_BLOCK, - Self::London => MAINNET_LONDON_BLOCK, - Self::ArrowGlacier => MAINNET_ARROW_GLACIER_BLOCK, - Self::GrayGlacier => MAINNET_GRAY_GLACIER_BLOCK, - Self::Paris => MAINNET_PARIS_BLOCK, - Self::Shanghai => MAINNET_SHANGHAI_BLOCK, - Self::Cancun | Self::Latest => MAINNET_CANCUN_BLOCK, - Self::Prague => MAINNET_PRAGUE_BLOCK, - } + let alloy_fork = match self { + Self::Frontier => alloy_hardforks::EthereumHardfork::Frontier, + Self::Homestead => alloy_hardforks::EthereumHardfork::Homestead, + Self::Dao => alloy_hardforks::EthereumHardfork::Dao, + Self::Tangerine => alloy_hardforks::EthereumHardfork::Tangerine, + Self::SpuriousDragon => alloy_hardforks::EthereumHardfork::SpuriousDragon, + Self::Byzantium => alloy_hardforks::EthereumHardfork::Byzantium, + Self::Constantinople => alloy_hardforks::EthereumHardfork::Constantinople, + Self::Petersburg => alloy_hardforks::EthereumHardfork::Petersburg, + Self::Istanbul => alloy_hardforks::EthereumHardfork::Istanbul, + Self::Muirglacier => alloy_hardforks::EthereumHardfork::MuirGlacier, + Self::Berlin => alloy_hardforks::EthereumHardfork::Berlin, + Self::London => alloy_hardforks::EthereumHardfork::London, + Self::ArrowGlacier => alloy_hardforks::EthereumHardfork::ArrowGlacier, + Self::GrayGlacier => alloy_hardforks::EthereumHardfork::GrayGlacier, + Self::Paris => alloy_hardforks::EthereumHardfork::Paris, + Self::Shanghai => alloy_hardforks::EthereumHardfork::Shanghai, + Self::Cancun => alloy_hardforks::EthereumHardfork::Cancun, + Self::Prague => alloy_hardforks::EthereumHardfork::Prague, + Self::Latest => alloy_hardforks::EthereumHardfork::Osaka, + }; + alloy_hardforks::EthereumHardfork::activation_block(&alloy_fork, Chain::mainnet()) + .unwrap_or(u64::MAX) } pub fn from_block_number(block: u64) -> Option { Some(match block { From 67f1bd55b13dab659c245e82f71600f335e94e62 Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Sun, 25 May 2025 12:38:25 +0530 Subject: [PATCH 5/9] removed redundant op and alloy hardforks enum --- Cargo.lock | 2 + crates/anvil/src/cmd.rs | 9 +- crates/anvil/src/config.rs | 15 +- crates/anvil/src/hardfork.rs | 316 ++++++++------------------- crates/anvil/src/lib.rs | 3 +- crates/anvil/tests/it/anvil.rs | 3 +- crates/anvil/tests/it/anvil_api.rs | 5 +- crates/anvil/tests/it/eip4844.rs | 3 +- crates/anvil/tests/it/eip7702.rs | 3 +- crates/anvil/tests/it/otterscan.rs | 3 +- crates/anvil/tests/it/traces.rs | 3 +- crates/anvil/tests/it/transaction.rs | 3 +- crates/cast/Cargo.toml | 1 + crates/cast/tests/cli/main.rs | 3 +- crates/forge/Cargo.toml | 1 + crates/forge/tests/cli/script.rs | 3 +- 16 files changed, 134 insertions(+), 242 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 20541b69291fe..b268b6eefe33d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2386,6 +2386,7 @@ dependencies = [ "alloy-contract", "alloy-dyn-abi", "alloy-ens", + "alloy-hardforks", "alloy-json-abi", "alloy-json-rpc", "alloy-network", @@ -3813,6 +3814,7 @@ version = "1.2.1" dependencies = [ "alloy-chains", "alloy-dyn-abi", + "alloy-hardforks", "alloy-json-abi", "alloy-network", "alloy-primitives", diff --git a/crates/anvil/src/cmd.rs b/crates/anvil/src/cmd.rs index d4b91e14f20fd..4af179e613a68 100644 --- a/crates/anvil/src/cmd.rs +++ b/crates/anvil/src/cmd.rs @@ -1,9 +1,10 @@ use crate::{ config::{ForkChoice, DEFAULT_MNEMONIC}, eth::{backend::db::SerializableState, pool::transactions::TransactionOrder, EthApi}, - AccountGenerator, EthereumHardfork, NodeConfig, OptimismHardfork, CHAIN_ID, + AccountGenerator, EthereumHardfork, NodeConfig, CHAIN_ID, }; use alloy_genesis::Genesis; +use alloy_op_hardforks::OpHardfork; use alloy_primitives::{utils::Unit, B256, U256}; use alloy_signer_local::coins_bip39::{English, Mnemonic}; use anvil_server::ServerConfig; @@ -218,9 +219,9 @@ impl NodeArgs { let hardfork = match &self.hardfork { Some(hf) => { if self.evm.optimism { - Some(OptimismHardfork::from_str(hf)?.into()) + Some(OpHardfork::from_str(hf).unwrap().into()) } else { - Some(EthereumHardfork::from_str(hf)?.into()) + Some(EthereumHardfork::from_str(hf).unwrap().into()) } } None => None, @@ -836,7 +837,7 @@ mod tests { let args: NodeArgs = NodeArgs::parse_from(["anvil", "--optimism", "--hardfork", "Regolith"]); let config = args.into_node_config().unwrap(); - assert_eq!(config.hardfork, Some(OptimismHardfork::Regolith.into())); + assert_eq!(config.hardfork, Some(OpHardfork::Regolith.into())); } #[test] diff --git a/crates/anvil/src/config.rs b/crates/anvil/src/config.rs index 722408c72a9c4..18fe7c294db0b 100644 --- a/crates/anvil/src/config.rs +++ b/crates/anvil/src/config.rs @@ -11,13 +11,14 @@ use crate::{ fees::{INITIAL_BASE_FEE, INITIAL_GAS_PRICE}, pool::transactions::{PoolTransaction, TransactionOrder}, }, - hardfork::ChainHardfork, + hardfork::{ethereum_hardfork_from_block_tag, spec_id_from_ethereum_hardfork, ChainHardfork}, mem::{self, in_memory_db::MemDb}, - EthereumHardfork, FeeManager, OptimismHardfork, PrecompileFactory, + EthereumHardfork, FeeManager, PrecompileFactory, }; use alloy_consensus::BlockHeader; use alloy_genesis::Genesis; use alloy_network::{AnyNetwork, TransactionResponse}; +use alloy_op_hardforks::OpHardfork; use alloy_primitives::{hex, map::HashMap, utils::Unit, BlockNumber, TxHash, U256}; use alloy_provider::Provider; use alloy_rpc_types::{Block, BlockNumberOrTag}; @@ -530,9 +531,9 @@ impl NodeConfig { return hardfork; } if self.enable_optimism { - return OptimismHardfork::default().into(); + return OpHardfork::Interop.into(); } - EthereumHardfork::default().into() + EthereumHardfork::Prague.into() } /// Sets a custom code size limit @@ -1186,8 +1187,10 @@ impl NodeConfig { let chain_id = provider.get_chain_id().await.wrap_err("failed to fetch network chain ID")?; if alloy_chains::NamedChain::Mainnet == chain_id { - let hardfork: EthereumHardfork = fork_block_number.into(); - env.evm_env.cfg_env.spec = hardfork.into(); + let hardfork: EthereumHardfork = + ethereum_hardfork_from_block_tag(fork_block_number); + + env.evm_env.cfg_env.spec = spec_id_from_ethereum_hardfork(hardfork); self.hardfork = Some(ChainHardfork::Ethereum(hardfork)); } Some(U256::from(chain_id)) diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index adf1cc43ea48f..bc7f46b05b4b5 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -1,16 +1,14 @@ -use std::str::FromStr; - -use alloy_chains::Chain; -use alloy_hardforks::ethereum::mainnet::*; +use alloy_hardforks::{ethereum::mainnet::*, EthereumHardfork}; +use alloy_op_hardforks::OpHardfork::{self}; use alloy_rpc_types::BlockNumberOrTag; -use eyre::bail; + use op_revm::OpSpecId; use revm::primitives::hardfork::SpecId; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum ChainHardfork { Ethereum(EthereumHardfork), - Optimism(OptimismHardfork), + Optimism(OpHardfork), } impl From for ChainHardfork { @@ -19,8 +17,8 @@ impl From for ChainHardfork { } } -impl From for ChainHardfork { - fn from(value: OptimismHardfork) -> Self { +impl From for ChainHardfork { + fn from(value: OpHardfork) -> Self { Self::Optimism(value) } } @@ -28,237 +26,115 @@ impl From for ChainHardfork { impl From for SpecId { fn from(fork: ChainHardfork) -> Self { match fork { - ChainHardfork::Ethereum(hardfork) => hardfork.into(), - ChainHardfork::Optimism(hardfork) => hardfork.into_eth_spec(), + ChainHardfork::Ethereum(hardfork) => spec_id_from_ethereum_hardfork(hardfork), + ChainHardfork::Optimism(hardfork) => spec_id_from_optimism_hardfork(hardfork).into(), } } } -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum EthereumHardfork { - Frontier, - Homestead, - Dao, - Tangerine, - SpuriousDragon, - Byzantium, - Constantinople, - Petersburg, - Istanbul, - Muirglacier, - Berlin, - London, - ArrowGlacier, - GrayGlacier, - Paris, - Shanghai, - Cancun, - Prague, - #[default] - Latest, -} - -impl EthereumHardfork { - /// Get the first block number of the hardfork. - pub fn fork_block(&self) -> u64 { - let alloy_fork = match self { - Self::Frontier => alloy_hardforks::EthereumHardfork::Frontier, - Self::Homestead => alloy_hardforks::EthereumHardfork::Homestead, - Self::Dao => alloy_hardforks::EthereumHardfork::Dao, - Self::Tangerine => alloy_hardforks::EthereumHardfork::Tangerine, - Self::SpuriousDragon => alloy_hardforks::EthereumHardfork::SpuriousDragon, - Self::Byzantium => alloy_hardforks::EthereumHardfork::Byzantium, - Self::Constantinople => alloy_hardforks::EthereumHardfork::Constantinople, - Self::Petersburg => alloy_hardforks::EthereumHardfork::Petersburg, - Self::Istanbul => alloy_hardforks::EthereumHardfork::Istanbul, - Self::Muirglacier => alloy_hardforks::EthereumHardfork::MuirGlacier, - Self::Berlin => alloy_hardforks::EthereumHardfork::Berlin, - Self::London => alloy_hardforks::EthereumHardfork::London, - Self::ArrowGlacier => alloy_hardforks::EthereumHardfork::ArrowGlacier, - Self::GrayGlacier => alloy_hardforks::EthereumHardfork::GrayGlacier, - Self::Paris => alloy_hardforks::EthereumHardfork::Paris, - Self::Shanghai => alloy_hardforks::EthereumHardfork::Shanghai, - Self::Cancun => alloy_hardforks::EthereumHardfork::Cancun, - Self::Prague => alloy_hardforks::EthereumHardfork::Prague, - Self::Latest => alloy_hardforks::EthereumHardfork::Osaka, - }; - alloy_hardforks::EthereumHardfork::activation_block(&alloy_fork, Chain::mainnet()) - .unwrap_or(u64::MAX) - } - pub fn from_block_number(block: u64) -> Option { - Some(match block { - _i if block < MAINNET_HOMESTEAD_BLOCK => Self::Frontier, - _i if block < MAINNET_DAO_BLOCK => Self::Homestead, - _i if block < MAINNET_TANGERINE_BLOCK => Self::Dao, - _i if block < MAINNET_SPURIOUS_DRAGON_BLOCK => Self::Tangerine, - _i if block < MAINNET_BYZANTIUM_BLOCK => Self::SpuriousDragon, - _i if block < MAINNET_CONSTANTINOPLE_BLOCK => Self::Byzantium, - _i if block < MAINNET_ISTANBUL_BLOCK => Self::Constantinople, - _i if block < MAINNET_MUIR_GLACIER_BLOCK => Self::Istanbul, - _i if block < MAINNET_BERLIN_BLOCK => Self::Muirglacier, - _i if block < MAINNET_LONDON_BLOCK => Self::Berlin, - _i if block < MAINNET_ARROW_GLACIER_BLOCK => Self::London, - _i if block < MAINNET_PARIS_BLOCK => Self::ArrowGlacier, - _i if block < MAINNET_SHANGHAI_BLOCK => Self::Paris, - _i if block < MAINNET_CANCUN_BLOCK => Self::Shanghai, - _i if block < MAINNET_PRAGUE_BLOCK => Self::Cancun, - _ => Self::Prague, - }) +/// Map an EthereumHardfork enum into its corresponding SpecId. +pub fn spec_id_from_ethereum_hardfork(hardfork: EthereumHardfork) -> SpecId { + match hardfork { + EthereumHardfork::Frontier => SpecId::FRONTIER, + EthereumHardfork::Homestead => SpecId::HOMESTEAD, + EthereumHardfork::Dao => SpecId::DAO_FORK, + EthereumHardfork::Tangerine => SpecId::TANGERINE, + EthereumHardfork::SpuriousDragon => SpecId::SPURIOUS_DRAGON, + EthereumHardfork::Byzantium => SpecId::BYZANTIUM, + EthereumHardfork::Constantinople => SpecId::CONSTANTINOPLE, + EthereumHardfork::Petersburg => SpecId::PETERSBURG, + EthereumHardfork::Istanbul => SpecId::ISTANBUL, + EthereumHardfork::MuirGlacier => SpecId::MUIR_GLACIER, + EthereumHardfork::Berlin => SpecId::BERLIN, + EthereumHardfork::London => SpecId::LONDON, + EthereumHardfork::ArrowGlacier => SpecId::ARROW_GLACIER, + EthereumHardfork::GrayGlacier => SpecId::GRAY_GLACIER, + EthereumHardfork::Paris => SpecId::MERGE, + EthereumHardfork::Shanghai => SpecId::SHANGHAI, + EthereumHardfork::Cancun => SpecId::CANCUN, + EthereumHardfork::Prague => SpecId::PRAGUE, + EthereumHardfork::Osaka => SpecId::OSAKA, } } -impl FromStr for EthereumHardfork { - type Err = eyre::Report; - - fn from_str(s: &str) -> Result { - let s = s.to_lowercase(); - let hardfork = match s.as_str() { - "frontier" | "1" => Self::Frontier, - "homestead" | "2" => Self::Homestead, - "dao" | "3" => Self::Dao, - "tangerine" | "4" => Self::Tangerine, - "spuriousdragon" | "5" => Self::SpuriousDragon, - "byzantium" | "6" => Self::Byzantium, - "constantinople" | "7" => Self::Constantinople, - "petersburg" | "8" => Self::Petersburg, - "istanbul" | "9" => Self::Istanbul, - "muirglacier" | "10" => Self::Muirglacier, - "berlin" | "11" => Self::Berlin, - "london" | "12" => Self::London, - "arrowglacier" | "13" => Self::ArrowGlacier, - "grayglacier" | "14" => Self::GrayGlacier, - "paris" | "merge" | "15" => Self::Paris, - "shanghai" | "16" => Self::Shanghai, - "cancun" | "17" => Self::Cancun, - "prague" | "18" => Self::Prague, - "latest" => Self::Latest, - _ => bail!("Unknown hardfork {s}"), - }; - Ok(hardfork) +/// Map an OptimismHardfork enum into its corresponding OpSpecId. +pub fn spec_id_from_optimism_hardfork(hardfork: OpHardfork) -> OpSpecId { + match hardfork { + OpHardfork::Bedrock => OpSpecId::BEDROCK, + OpHardfork::Regolith => OpSpecId::REGOLITH, + OpHardfork::Canyon => OpSpecId::CANYON, + OpHardfork::Ecotone => OpSpecId::ECOTONE, + OpHardfork::Fjord => OpSpecId::FJORD, + OpHardfork::Granite => OpSpecId::GRANITE, + OpHardfork::Holocene => OpSpecId::HOLOCENE, + OpHardfork::Isthmus => OpSpecId::ISTHMUS, + OpHardfork::Interop => OpSpecId::INTEROP, } } -impl From for SpecId { - fn from(fork: EthereumHardfork) -> Self { - match fork { - EthereumHardfork::Frontier => Self::FRONTIER, - EthereumHardfork::Homestead => Self::HOMESTEAD, - EthereumHardfork::Dao => Self::HOMESTEAD, - EthereumHardfork::Tangerine => Self::TANGERINE, - EthereumHardfork::SpuriousDragon => Self::SPURIOUS_DRAGON, - EthereumHardfork::Byzantium => Self::BYZANTIUM, - EthereumHardfork::Constantinople => Self::CONSTANTINOPLE, - EthereumHardfork::Petersburg => Self::PETERSBURG, - EthereumHardfork::Istanbul => Self::ISTANBUL, - EthereumHardfork::Muirglacier => Self::MUIR_GLACIER, - EthereumHardfork::Berlin => Self::BERLIN, - EthereumHardfork::London => Self::LONDON, - EthereumHardfork::ArrowGlacier => Self::LONDON, - EthereumHardfork::GrayGlacier => Self::GRAY_GLACIER, - EthereumHardfork::Paris => Self::MERGE, - EthereumHardfork::Shanghai => Self::SHANGHAI, - EthereumHardfork::Cancun | EthereumHardfork::Latest => Self::CANCUN, - EthereumHardfork::Prague => Self::PRAGUE, - } +/// Convert a `BlockNumberOrTag` into an `EthereumHardfork`. +pub fn ethereum_hardfork_from_block_tag(block: impl Into) -> EthereumHardfork { + let num = match block.into() { + BlockNumberOrTag::Earliest => 0, + BlockNumberOrTag::Number(num) => num, + _ => u64::MAX, + }; + + match num { + _i if num < MAINNET_HOMESTEAD_BLOCK => EthereumHardfork::Frontier, + _i if num < MAINNET_DAO_BLOCK => EthereumHardfork::Homestead, + _i if num < MAINNET_TANGERINE_BLOCK => EthereumHardfork::Dao, + _i if num < MAINNET_SPURIOUS_DRAGON_BLOCK => EthereumHardfork::Tangerine, + _i if num < MAINNET_BYZANTIUM_BLOCK => EthereumHardfork::SpuriousDragon, + _i if num < MAINNET_CONSTANTINOPLE_BLOCK => EthereumHardfork::Byzantium, + _i if num < MAINNET_ISTANBUL_BLOCK => EthereumHardfork::Constantinople, + _i if num < MAINNET_MUIR_GLACIER_BLOCK => EthereumHardfork::Istanbul, + _i if num < MAINNET_BERLIN_BLOCK => EthereumHardfork::MuirGlacier, + _i if num < MAINNET_LONDON_BLOCK => EthereumHardfork::Berlin, + _i if num < MAINNET_ARROW_GLACIER_BLOCK => EthereumHardfork::London, + _i if num < MAINNET_PARIS_BLOCK => EthereumHardfork::ArrowGlacier, + _i if num < MAINNET_SHANGHAI_BLOCK => EthereumHardfork::Paris, + _i if num < MAINNET_CANCUN_BLOCK => EthereumHardfork::Shanghai, + _i if num < MAINNET_PRAGUE_BLOCK => EthereumHardfork::Cancun, + _ => EthereumHardfork::Prague, } } -impl> From for EthereumHardfork { - fn from(block: T) -> Self { - let num = match block.into() { - BlockNumberOrTag::Earliest => 0, - BlockNumberOrTag::Number(num) => num, - _ => u64::MAX, - }; - - match num { - _i if num < MAINNET_HOMESTEAD_BLOCK => Self::Frontier, - _i if num < MAINNET_DAO_BLOCK => Self::Homestead, - _i if num < MAINNET_TANGERINE_BLOCK => Self::Dao, - _i if num < MAINNET_SPURIOUS_DRAGON_BLOCK => Self::Tangerine, - _i if num < MAINNET_BYZANTIUM_BLOCK => Self::SpuriousDragon, - _i if num < MAINNET_CONSTANTINOPLE_BLOCK => Self::Byzantium, - _i if num < MAINNET_ISTANBUL_BLOCK => Self::Constantinople, - _i if num < MAINNET_MUIR_GLACIER_BLOCK => Self::Istanbul, - _i if num < MAINNET_BERLIN_BLOCK => Self::Muirglacier, - _i if num < MAINNET_LONDON_BLOCK => Self::Berlin, - _i if num < MAINNET_ARROW_GLACIER_BLOCK => Self::London, - _i if num < MAINNET_PARIS_BLOCK => Self::ArrowGlacier, - _i if num < MAINNET_SHANGHAI_BLOCK => Self::Paris, - _i if num < MAINNET_CANCUN_BLOCK => Self::Shanghai, - _ => Self::Latest, - } - } -} +#[cfg(test)] +mod tests { + use super::*; + #[allow(unused_imports)] + use alloy_rpc_types::BlockNumberOrTag; -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum OptimismHardfork { - Bedrock, - Regolith, - Canyon, - Ecotone, - Fjord, - Granite, - Holocene, - #[default] - Isthmus, -} + #[test] + fn test_ethereum_spec_id_mapping() { + assert_eq!(spec_id_from_ethereum_hardfork(EthereumHardfork::Frontier), SpecId::FRONTIER); + assert_eq!(spec_id_from_ethereum_hardfork(EthereumHardfork::Homestead), SpecId::HOMESTEAD); -impl OptimismHardfork { - pub fn into_eth_spec(self) -> SpecId { - let op_spec: OpSpecId = self.into(); - op_spec.into_eth_spec() + // Test latest hardforks + assert_eq!(spec_id_from_ethereum_hardfork(EthereumHardfork::Cancun), SpecId::CANCUN); + assert_eq!(spec_id_from_ethereum_hardfork(EthereumHardfork::Prague), SpecId::PRAGUE); } -} -impl FromStr for OptimismHardfork { - type Err = eyre::Report; + #[test] + fn test_optimism_spec_id_mapping() { + assert_eq!(spec_id_from_optimism_hardfork(OpHardfork::Bedrock), OpSpecId::BEDROCK); + assert_eq!(spec_id_from_optimism_hardfork(OpHardfork::Regolith), OpSpecId::REGOLITH); - fn from_str(s: &str) -> Result { - let s = s.to_lowercase(); - let hardfork = match s.as_str() { - "bedrock" => Self::Bedrock, - "regolith" => Self::Regolith, - "canyon" => Self::Canyon, - "ecotone" => Self::Ecotone, - "fjord" => Self::Fjord, - "granite" => Self::Granite, - "holocene" => Self::Holocene, - "isthmus" => Self::Isthmus, - _ => bail!("Unknown hardfork {s}"), - }; - Ok(hardfork) + // Test latest hardforks + assert_eq!(spec_id_from_optimism_hardfork(OpHardfork::Holocene), OpSpecId::HOLOCENE); + assert_eq!(spec_id_from_optimism_hardfork(OpHardfork::Interop), OpSpecId::INTEROP); } -} - -impl From for OpSpecId { - fn from(fork: OptimismHardfork) -> Self { - match fork { - OptimismHardfork::Bedrock => Self::BEDROCK, - OptimismHardfork::Regolith => Self::REGOLITH, - OptimismHardfork::Canyon => Self::CANYON, - OptimismHardfork::Ecotone => Self::ECOTONE, - OptimismHardfork::Fjord => Self::FJORD, - OptimismHardfork::Granite => Self::GRANITE, - OptimismHardfork::Holocene => Self::HOLOCENE, - OptimismHardfork::Isthmus => Self::ISTHMUS, - } - } -} - -#[cfg(test)] -mod tests { - use crate::EthereumHardfork; #[test] - fn test_hardfork_blocks() { - let hf: EthereumHardfork = 12_965_000u64.into(); - assert_eq!(hf, EthereumHardfork::London); - - let hf: EthereumHardfork = 4370000u64.into(); - assert_eq!(hf, EthereumHardfork::Byzantium); - - let hf: EthereumHardfork = 12244000u64.into(); - assert_eq!(hf, EthereumHardfork::Berlin); + fn test_hardfork_from_block_tag_numbers() { + assert_eq!( + ethereum_hardfork_from_block_tag(MAINNET_HOMESTEAD_BLOCK - 1), + EthereumHardfork::Frontier + ); + assert_eq!( + ethereum_hardfork_from_block_tag(MAINNET_LONDON_BLOCK + 1), + EthereumHardfork::London + ); } -} +} \ No newline at end of file diff --git a/crates/anvil/src/lib.rs b/crates/anvil/src/lib.rs index 77e072e0aa1f2..5ee4fead559b2 100644 --- a/crates/anvil/src/lib.rs +++ b/crates/anvil/src/lib.rs @@ -47,8 +47,7 @@ pub use config::{ }; mod hardfork; -pub use hardfork::{EthereumHardfork, OptimismHardfork}; - +pub use alloy_hardforks::EthereumHardfork; /// ethereum related implementations pub mod eth; /// Evm related abstractions diff --git a/crates/anvil/tests/it/anvil.rs b/crates/anvil/tests/it/anvil.rs index 329caea844b45..721aa404b36e1 100644 --- a/crates/anvil/tests/it/anvil.rs +++ b/crates/anvil/tests/it/anvil.rs @@ -2,9 +2,10 @@ use alloy_consensus::EMPTY_ROOT_HASH; use alloy_eips::BlockNumberOrTag; +use alloy_hardforks::EthereumHardfork; use alloy_primitives::Address; use alloy_provider::Provider; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; #[tokio::test(flavor = "multi_thread")] async fn test_can_change_mining_mode() { diff --git a/crates/anvil/tests/it/anvil_api.rs b/crates/anvil/tests/it/anvil_api.rs index ce337714587b9..5b4bcd78d2059 100644 --- a/crates/anvil/tests/it/anvil_api.rs +++ b/crates/anvil/tests/it/anvil_api.rs @@ -6,6 +6,7 @@ use crate::{ utils::http_provider_with_signer, }; use alloy_consensus::{SignableTransaction, TxEip1559}; +use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, TransactionBuilder, TxSignerSync}; use alloy_primitives::{address, fixed_bytes, utils::Unit, Address, Bytes, TxKind, U256}; use alloy_provider::{ext::TxPoolApi, Provider}; @@ -21,7 +22,7 @@ use anvil::{ api::CLIENT_VERSION, backend::mem::{EXECUTOR, P256_DELEGATION_CONTRACT, P256_DELEGATION_RUNTIME_CODE}, }, - spawn, EthereumHardfork, NodeConfig, + spawn, NodeConfig, }; use anvil_core::{ eth::{ @@ -448,7 +449,7 @@ async fn can_get_node_info() { let block_number = provider.get_block_number().await.unwrap(); let block = provider.get_block(BlockId::from(block_number)).await.unwrap().unwrap(); - let hard_fork: &str = SpecId::CANCUN.into(); + let hard_fork: &str = SpecId::PRAGUE.into(); let expected_node_info = NodeInfo { current_block_number: 0_u64, diff --git a/crates/anvil/tests/it/eip4844.rs b/crates/anvil/tests/it/eip4844.rs index 633c8a01bdef0..2d713c3d955e3 100644 --- a/crates/anvil/tests/it/eip4844.rs +++ b/crates/anvil/tests/it/eip4844.rs @@ -4,12 +4,13 @@ use alloy_eips::{ eip4844::{BLOB_TX_MIN_BLOB_GASPRICE, DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK_DENCUN}, Typed2718, }; +use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, ReceiptResponse, TransactionBuilder, TransactionBuilder4844}; use alloy_primitives::{b256, Address, U256}; use alloy_provider::Provider; use alloy_rpc_types::{BlockId, TransactionRequest}; use alloy_serde::WithOtherFields; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; #[tokio::test(flavor = "multi_thread")] async fn can_send_eip4844_transaction() { diff --git a/crates/anvil/tests/it/eip7702.rs b/crates/anvil/tests/it/eip7702.rs index c09412c85e306..9424360119e4e 100644 --- a/crates/anvil/tests/it/eip7702.rs +++ b/crates/anvil/tests/it/eip7702.rs @@ -1,12 +1,13 @@ use crate::utils::http_provider; use alloy_consensus::{transaction::TxEip7702, SignableTransaction}; +use alloy_hardforks::EthereumHardfork; use alloy_network::{ReceiptResponse, TransactionBuilder, TxSignerSync}; use alloy_primitives::{bytes, U256}; use alloy_provider::{PendingTransactionConfig, Provider}; use alloy_rpc_types::{Authorization, TransactionRequest}; use alloy_serde::WithOtherFields; use alloy_signer::SignerSync; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; #[tokio::test(flavor = "multi_thread")] async fn can_send_eip7702_tx() { diff --git a/crates/anvil/tests/it/otterscan.rs b/crates/anvil/tests/it/otterscan.rs index 3809e3183e1a7..ffd70d1349ddb 100644 --- a/crates/anvil/tests/it/otterscan.rs +++ b/crates/anvil/tests/it/otterscan.rs @@ -1,6 +1,7 @@ //! Tests for otterscan endpoints. use crate::abi::Multicall; +use alloy_hardforks::EthereumHardfork; use alloy_network::TransactionResponse; use alloy_primitives::{address, Address, Bytes, U256}; use alloy_provider::Provider; @@ -10,7 +11,7 @@ use alloy_rpc_types::{ }; use alloy_serde::WithOtherFields; use alloy_sol_types::{sol, SolCall, SolError, SolValue}; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; use std::collections::VecDeque; #[tokio::test(flavor = "multi_thread")] diff --git a/crates/anvil/tests/it/traces.rs b/crates/anvil/tests/it/traces.rs index 849956cabe5dd..2e073ca9c8735 100644 --- a/crates/anvil/tests/it/traces.rs +++ b/crates/anvil/tests/it/traces.rs @@ -4,6 +4,7 @@ use crate::{ utils::http_provider_with_signer, }; use alloy_eips::BlockId; +use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, TransactionBuilder}; use alloy_primitives::{ hex::{self, FromHex}, @@ -27,7 +28,7 @@ use alloy_rpc_types::{ }; use alloy_serde::WithOtherFields; use alloy_sol_types::sol; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; #[tokio::test(flavor = "multi_thread")] async fn test_get_transfer_parity_traces() { diff --git a/crates/anvil/tests/it/transaction.rs b/crates/anvil/tests/it/transaction.rs index 953c30515d3ef..7cb681af85a14 100644 --- a/crates/anvil/tests/it/transaction.rs +++ b/crates/anvil/tests/it/transaction.rs @@ -2,6 +2,7 @@ use crate::{ abi::{Greeter, Multicall, SimpleStorage}, utils::{connect_pubsub, http_provider_with_signer}, }; +use alloy_hardforks::EthereumHardfork; use alloy_network::{EthereumWallet, TransactionBuilder, TransactionResponse}; use alloy_primitives::{address, hex, map::B256HashSet, Address, Bytes, FixedBytes, U256}; use alloy_provider::{Provider, WsConnect}; @@ -12,7 +13,7 @@ use alloy_rpc_types::{ }; use alloy_serde::WithOtherFields; use alloy_sol_types::SolValue; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; use eyre::Ok; use futures::{future::join_all, FutureExt, StreamExt}; use std::{str::FromStr, time::Duration}; diff --git a/crates/cast/Cargo.toml b/crates/cast/Cargo.toml index 26f001132baff..2dda3ba341872 100644 --- a/crates/cast/Cargo.toml +++ b/crates/cast/Cargo.toml @@ -53,6 +53,7 @@ alloy-signer.workspace = true alloy-sol-types.workspace = true alloy-transport.workspace = true alloy-ens = { workspace = true, features = ["provider"] } +alloy-hardforks.workspace = true op-alloy-flz.workspace = true op-alloy-consensus = { workspace = true, features = ["alloy-compat"] } diff --git a/crates/cast/tests/cli/main.rs b/crates/cast/tests/cli/main.rs index 4735a8ce1abbc..ce41ac67e9020 100644 --- a/crates/cast/tests/cli/main.rs +++ b/crates/cast/tests/cli/main.rs @@ -1,11 +1,12 @@ //! Contains various tests for checking cast commands use alloy_chains::NamedChain; +use alloy_hardforks::EthereumHardfork; use alloy_network::{TransactionBuilder, TransactionResponse}; use alloy_primitives::{address, b256, Bytes, B256}; use alloy_provider::{Provider, ProviderBuilder}; use alloy_rpc_types::{BlockNumberOrTag, Index, TransactionRequest}; -use anvil::{EthereumHardfork, NodeConfig}; +use anvil::NodeConfig; use foundry_test_utils::{ rpc::{ next_etherscan_api_key, next_http_archive_rpc_url, next_http_rpc_endpoint, diff --git a/crates/forge/Cargo.toml b/crates/forge/Cargo.toml index c3251ed76c9eb..d823ca3285140 100644 --- a/crates/forge/Cargo.toml +++ b/crates/forge/Cargo.toml @@ -63,6 +63,7 @@ alloy-rpc-types.workspace = true alloy-serde.workspace = true alloy-signer.workspace = true alloy-transport.workspace = true +alloy-hardforks.workspace = true revm.workspace = true diff --git a/crates/forge/tests/cli/script.rs b/crates/forge/tests/cli/script.rs index d72c21fce60ff..1d6f415aef1d4 100644 --- a/crates/forge/tests/cli/script.rs +++ b/crates/forge/tests/cli/script.rs @@ -1,8 +1,9 @@ //! Contains various tests related to `forge script`. use crate::constants::TEMPLATE_CONTRACT; +use alloy_hardforks::EthereumHardfork; use alloy_primitives::{address, hex, Address, Bytes}; -use anvil::{spawn, EthereumHardfork, NodeConfig}; +use anvil::{spawn, NodeConfig}; use forge_script_sequence::ScriptSequence; use foundry_test_utils::{ rpc::{self, next_http_archive_rpc_url}, From 66bc151807c6cc90a56c3defd8c99359a8a583d4 Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Sun, 25 May 2025 13:06:12 +0530 Subject: [PATCH 6/9] fixes --- crates/anvil/src/cmd.rs | 6 ++++-- crates/anvil/src/hardfork.rs | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/anvil/src/cmd.rs b/crates/anvil/src/cmd.rs index 4af179e613a68..e62a4d73c0f28 100644 --- a/crates/anvil/src/cmd.rs +++ b/crates/anvil/src/cmd.rs @@ -219,9 +219,11 @@ impl NodeArgs { let hardfork = match &self.hardfork { Some(hf) => { if self.evm.optimism { - Some(OpHardfork::from_str(hf).unwrap().into()) + let hf = OpHardfork::from_str(hf).map_err(|s| eyre::eyre!(s))?.into(); + Some(hf) } else { - Some(EthereumHardfork::from_str(hf).unwrap().into()) + let hf = EthereumHardfork::from_str(hf).map_err(|s| eyre::eyre!(s))?.into(); + Some(hf) } } None => None, diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index bc7f46b05b4b5..af6e34805ab0d 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -137,4 +137,4 @@ mod tests { EthereumHardfork::London ); } -} \ No newline at end of file +} From 4a474caea8f16fa053d6a2568e3ec8ef33ddf9d5 Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Mon, 26 May 2025 21:02:09 +0530 Subject: [PATCH 7/9] fixes --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- crates/anvil/src/cmd.rs | 6 ++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ea48bf9f6ec1..8c77648d22351 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6b8067561eb8f884b215ace4c962313c5467e47bde6b457c8c51e268fb5d99" +checksum = "2d94ec9830aa2f1d906d41167c0cfecbcf37643b87854b21f233726a934dd065" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08043c9284e597f9b5cf741cc6d906fdb26c195a01d88423c84c00ffda835713" +checksum = "ae6ee0a44eccd3a1d8e51c109bfb64561dbb4edade67044159d9c8611f421374" dependencies = [ "alloy-hardforks", "auto_impl", diff --git a/Cargo.toml b/Cargo.toml index a29c38ecfe26b..143e5fab74aa1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -230,8 +230,8 @@ alloy-transport = { version = "1.0.7", default-features = false } alloy-transport-http = { version = "1.0.7", default-features = false } alloy-transport-ipc = { version = "1.0.7", default-features = false } alloy-transport-ws = { version = "1.0.7", default-features = false } -alloy-hardforks = { version = "0.2.3", default-features = false } -alloy-op-hardforks = { version = "0.2.3", default-features = false } +alloy-hardforks = { version = "0.2.4", default-features = false } +alloy-op-hardforks = { version = "0.2.4", default-features = false } ## alloy-core alloy-dyn-abi = "1.0" diff --git a/crates/anvil/src/cmd.rs b/crates/anvil/src/cmd.rs index e62a4d73c0f28..c8223a76ed959 100644 --- a/crates/anvil/src/cmd.rs +++ b/crates/anvil/src/cmd.rs @@ -219,11 +219,9 @@ impl NodeArgs { let hardfork = match &self.hardfork { Some(hf) => { if self.evm.optimism { - let hf = OpHardfork::from_str(hf).map_err(|s| eyre::eyre!(s))?.into(); - Some(hf) + Some(OpHardfork::from_str(hf)?.into()) } else { - let hf = EthereumHardfork::from_str(hf).map_err(|s| eyre::eyre!(s))?.into(); - Some(hf) + Some(EthereumHardfork::from_str(hf)?.into()) } } None => None, From 9316a6344f11d87f5ce88e44295db47fbb1832f9 Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Tue, 27 May 2025 10:11:01 +0530 Subject: [PATCH 8/9] bumped alloy hardforks and kept default to prague and isthmus --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- crates/anvil/src/config.rs | 4 ++-- crates/anvil/tests/it/anvil_api.rs | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c77648d22351..2fa997f667791 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d94ec9830aa2f1d906d41167c0cfecbcf37643b87854b21f233726a934dd065" +checksum = "d49ebd18eef287ae48628d03436d32f3645cbcc0a2233e89127321094564abab" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6ee0a44eccd3a1d8e51c109bfb64561dbb4edade67044159d9c8611f421374" +checksum = "4ac2b9e1585c04723f235d94c79d89349330585191df08324429bb6598c6bb17" dependencies = [ "alloy-hardforks", "auto_impl", diff --git a/Cargo.toml b/Cargo.toml index 143e5fab74aa1..a8141f1ea4700 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -230,8 +230,8 @@ alloy-transport = { version = "1.0.7", default-features = false } alloy-transport-http = { version = "1.0.7", default-features = false } alloy-transport-ipc = { version = "1.0.7", default-features = false } alloy-transport-ws = { version = "1.0.7", default-features = false } -alloy-hardforks = { version = "0.2.4", default-features = false } -alloy-op-hardforks = { version = "0.2.4", default-features = false } +alloy-hardforks = { version = "0.2.5", default-features = false } +alloy-op-hardforks = { version = "0.2.5", default-features = false } ## alloy-core alloy-dyn-abi = "1.0" diff --git a/crates/anvil/src/config.rs b/crates/anvil/src/config.rs index 18fe7c294db0b..1cde743c3e952 100644 --- a/crates/anvil/src/config.rs +++ b/crates/anvil/src/config.rs @@ -531,9 +531,9 @@ impl NodeConfig { return hardfork; } if self.enable_optimism { - return OpHardfork::Interop.into(); + return OpHardfork::Isthmus.into(); } - EthereumHardfork::Prague.into() + EthereumHardfork::Cancun.into() } /// Sets a custom code size limit diff --git a/crates/anvil/tests/it/anvil_api.rs b/crates/anvil/tests/it/anvil_api.rs index 5b4bcd78d2059..d4af986814ed6 100644 --- a/crates/anvil/tests/it/anvil_api.rs +++ b/crates/anvil/tests/it/anvil_api.rs @@ -449,7 +449,7 @@ async fn can_get_node_info() { let block_number = provider.get_block_number().await.unwrap(); let block = provider.get_block(BlockId::from(block_number)).await.unwrap().unwrap(); - let hard_fork: &str = SpecId::PRAGUE.into(); + let hard_fork: &str = SpecId::CANCUN.into(); let expected_node_info = NodeInfo { current_block_number: 0_u64, From 708caa569aeba824a2e75a92d3ab7d71a68bab69 Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Tue, 27 May 2025 18:26:38 +0530 Subject: [PATCH 9/9] bumped alloy-hardforks and fixes --- Cargo.lock | 8 ++++---- Cargo.toml | 4 ++-- crates/anvil/src/hardfork.rs | 22 +++------------------- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2fa997f667791..9b89fb6a67229 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "alloy-hardforks" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49ebd18eef287ae48628d03436d32f3645cbcc0a2233e89127321094564abab" +checksum = "fbff8445282ec080c2673692062bd4930d7a0d6bda257caf138cfc650c503000" dependencies = [ "alloy-chains", "alloy-eip2124", @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "alloy-op-hardforks" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac2b9e1585c04723f235d94c79d89349330585191df08324429bb6598c6bb17" +checksum = "9ddfbb5cc9f614efa5d56e0d7226214bb67b29271d44b6ddfcbbe25eb0ff898b" dependencies = [ "alloy-hardforks", "auto_impl", diff --git a/Cargo.toml b/Cargo.toml index a8141f1ea4700..3baefd5dca836 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -230,8 +230,8 @@ alloy-transport = { version = "1.0.7", default-features = false } alloy-transport-http = { version = "1.0.7", default-features = false } alloy-transport-ipc = { version = "1.0.7", default-features = false } alloy-transport-ws = { version = "1.0.7", default-features = false } -alloy-hardforks = { version = "0.2.5", default-features = false } -alloy-op-hardforks = { version = "0.2.5", default-features = false } +alloy-hardforks = { version = "0.2.6", default-features = false } +alloy-op-hardforks = { version = "0.2.6", default-features = false } ## alloy-core alloy-dyn-abi = "1.0" diff --git a/crates/anvil/src/hardfork.rs b/crates/anvil/src/hardfork.rs index af6e34805ab0d..f5e063aafc625 100644 --- a/crates/anvil/src/hardfork.rs +++ b/crates/anvil/src/hardfork.rs @@ -1,4 +1,4 @@ -use alloy_hardforks::{ethereum::mainnet::*, EthereumHardfork}; +use alloy_hardforks::EthereumHardfork; use alloy_op_hardforks::OpHardfork::{self}; use alloy_rpc_types::BlockNumberOrTag; @@ -80,29 +80,13 @@ pub fn ethereum_hardfork_from_block_tag(block: impl Into) -> E _ => u64::MAX, }; - match num { - _i if num < MAINNET_HOMESTEAD_BLOCK => EthereumHardfork::Frontier, - _i if num < MAINNET_DAO_BLOCK => EthereumHardfork::Homestead, - _i if num < MAINNET_TANGERINE_BLOCK => EthereumHardfork::Dao, - _i if num < MAINNET_SPURIOUS_DRAGON_BLOCK => EthereumHardfork::Tangerine, - _i if num < MAINNET_BYZANTIUM_BLOCK => EthereumHardfork::SpuriousDragon, - _i if num < MAINNET_CONSTANTINOPLE_BLOCK => EthereumHardfork::Byzantium, - _i if num < MAINNET_ISTANBUL_BLOCK => EthereumHardfork::Constantinople, - _i if num < MAINNET_MUIR_GLACIER_BLOCK => EthereumHardfork::Istanbul, - _i if num < MAINNET_BERLIN_BLOCK => EthereumHardfork::MuirGlacier, - _i if num < MAINNET_LONDON_BLOCK => EthereumHardfork::Berlin, - _i if num < MAINNET_ARROW_GLACIER_BLOCK => EthereumHardfork::London, - _i if num < MAINNET_PARIS_BLOCK => EthereumHardfork::ArrowGlacier, - _i if num < MAINNET_SHANGHAI_BLOCK => EthereumHardfork::Paris, - _i if num < MAINNET_CANCUN_BLOCK => EthereumHardfork::Shanghai, - _i if num < MAINNET_PRAGUE_BLOCK => EthereumHardfork::Cancun, - _ => EthereumHardfork::Prague, - } + EthereumHardfork::from_mainnet_block_number(num) } #[cfg(test)] mod tests { use super::*; + use alloy_hardforks::ethereum::mainnet::*; #[allow(unused_imports)] use alloy_rpc_types::BlockNumberOrTag;