use std::{collections::BTreeMap, sync::LazyLock};
use crate::{
config::{ChainSpec, ForkCondition},
serde::RlpHeader,
EvmBlockHeader, EvmEnv, EvmInput,
};
use alloy_primitives::{BlockNumber, B256, U256};
use revm::primitives::{BlockEnv, SpecId};
pub static ETH_SEPOLIA_CHAIN_SPEC: LazyLock<ChainSpec> = LazyLock::new(|| ChainSpec {
chain_id: 11155111,
forks: BTreeMap::from([
(SpecId::MERGE, ForkCondition::Block(1735371)),
(SpecId::SHANGHAI, ForkCondition::Timestamp(1677557088)),
(SpecId::CANCUN, ForkCondition::Timestamp(1706655072)),
]),
});
pub static ETH_HOLESKY_CHAIN_SPEC: LazyLock<ChainSpec> = LazyLock::new(|| ChainSpec {
chain_id: 17000,
forks: BTreeMap::from([
(SpecId::MERGE, ForkCondition::Block(0)),
(SpecId::SHANGHAI, ForkCondition::Timestamp(1696000704)),
(SpecId::CANCUN, ForkCondition::Timestamp(1707305664)),
]),
});
pub static ETH_MAINNET_CHAIN_SPEC: LazyLock<ChainSpec> = LazyLock::new(|| ChainSpec {
chain_id: 1,
forks: BTreeMap::from([
(SpecId::MERGE, ForkCondition::Block(15537394)),
(SpecId::SHANGHAI, ForkCondition::Timestamp(1681338455)),
(SpecId::CANCUN, ForkCondition::Timestamp(1710338135)),
]),
});
pub type EthEvmEnv<D, C> = EvmEnv<D, EthBlockHeader, C>;
pub type EthEvmInput = EvmInput<EthBlockHeader>;
pub type EthBlockHeader = RlpHeader<alloy_consensus::Header>;
impl EvmBlockHeader for EthBlockHeader {
#[inline]
fn parent_hash(&self) -> &B256 {
&self.inner().parent_hash
}
#[inline]
fn number(&self) -> BlockNumber {
self.inner().number
}
#[inline]
fn timestamp(&self) -> u64 {
self.inner().timestamp
}
#[inline]
fn state_root(&self) -> &B256 {
&self.inner().state_root
}
#[cfg(feature = "unstable-event")]
#[inline]
fn receipts_root(&self) -> &B256 {
&self.inner().receipts_root
}
#[cfg(feature = "unstable-event")]
#[inline]
fn logs_bloom(&self) -> &alloy_primitives::Bloom {
&self.inner().logs_bloom
}
#[inline]
fn fill_block_env(&self, blk_env: &mut BlockEnv) {
let header = self.inner();
blk_env.number = U256::from(header.number);
blk_env.coinbase = header.beneficiary;
blk_env.timestamp = U256::from(header.timestamp);
blk_env.gas_limit = U256::from(header.gas_limit);
blk_env.basefee = U256::from(header.base_fee_per_gas.unwrap_or_default());
blk_env.difficulty = header.difficulty;
blk_env.prevrandao = Some(header.mix_hash);
if let Some(excess_blob_gas) = header.excess_blob_gas {
blk_env.set_blob_excess_gas_and_price(excess_blob_gas, false);
};
}
}