From 87e237c3f960e9ca22c5fb738be6a7a7ffa03a98 Mon Sep 17 00:00:00 2001 From: colinlyguo Date: Tue, 12 Aug 2025 20:30:35 +0800 Subject: [PATCH 1/3] feat: use from_custom_genesis for custom genesis files and set Scroll fee parameters --- crates/scroll/chainspec/src/lib.rs | 38 ++++++++++++++++++++++++++++-- crates/scroll/cli/src/spec.rs | 2 +- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/crates/scroll/chainspec/src/lib.rs b/crates/scroll/chainspec/src/lib.rs index ad921a03b8a..c4412bc3575 100644 --- a/crates/scroll/chainspec/src/lib.rs +++ b/crates/scroll/chainspec/src/lib.rs @@ -8,20 +8,21 @@ #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] #![cfg_attr(not(feature = "std"), no_std)] -use alloc::{boxed::Box, vec::Vec}; +use alloc::{boxed::Box, vec, vec::Vec}; use alloy_chains::Chain; use alloy_consensus::Header; use alloy_genesis::Genesis; use alloy_primitives::{B256, U256}; use derive_more::{Constructor, Deref, From, Into}; use reth_chainspec::{ - BaseFeeParams, ChainSpec, ChainSpecBuilder, DepositContract, EthChainSpec, + BaseFeeParams, BaseFeeParamsKind, ChainSpec, ChainSpecBuilder, DepositContract, EthChainSpec, EthereumCapabilities, EthereumHardforks, ForkFilter, ForkId, Hardforks, Head, }; use reth_ethereum_forks::{ ChainHardforks, EthereumHardfork, ForkCondition, ForkFilterKey, ForkHash, Hardfork, }; use reth_network_peers::NodeRecord; +use reth_primitives_traits::SealedHeader; use scroll_alloy_hardforks::{ScrollHardfork, ScrollHardforks}; use alloy_eips::eip7840::BlobParams; @@ -184,6 +185,39 @@ impl ScrollChainSpecBuilder { } } +// Used by the CLI for custom genesis files. +impl ScrollChainSpec { + /// Build from a custom `Genesis`, ensuring: + /// - `genesis_header` has `base_fee_per_gas` (0 if Feynman@genesis) + /// - `base_fee_params` switch to Scroll defaults at Feynman + pub fn from_custom_genesis(genesis: Genesis) -> Self { + // Use the existing From as the base. + let mut spec: Self = genesis.into(); + + // Determine whether Feynman is active at genesis. + let scroll_info = ScrollConfigInfo::extract_from(&spec.inner.genesis); + let feynman_active_at_genesis = scroll_info + .scroll_chain_info + .hard_fork_info + .and_then(|h| h.feynman_time) + .map(|t| t <= spec.inner.genesis.timestamp) + .unwrap_or(false); + + // Ensure the genesis header has a base fee when required. + let mut header = make_genesis_header(&spec.inner.genesis); + if header.base_fee_per_gas.is_none() && feynman_active_at_genesis { + header.base_fee_per_gas = Some(0); + } + spec.inner.genesis_header = SealedHeader::new_unhashed(header); + + // Use Scroll's EIP-1559 params from Feynman onwards. + spec.inner.base_fee_params = BaseFeeParamsKind::Variable( + vec![(ScrollHardfork::Feynman.boxed(), SCROLL_BASE_FEE_PARAMS_FEYNMAN)].into(), + ); + spec + } +} + /// Returns the chain configuration. #[auto_impl::auto_impl(Arc)] pub trait ChainConfig { diff --git a/crates/scroll/cli/src/spec.rs b/crates/scroll/cli/src/spec.rs index 361029d9d1f..d7d8a22b432 100644 --- a/crates/scroll/cli/src/spec.rs +++ b/crates/scroll/cli/src/spec.rs @@ -15,7 +15,7 @@ impl ChainSpecParser for ScrollChainSpecParser { "dev" => SCROLL_DEV.clone(), "scroll-mainnet" => SCROLL_MAINNET.clone(), "scroll-sepolia" => SCROLL_SEPOLIA.clone(), - _ => Arc::new(parse_genesis(s)?.into()), + _ => Arc::new(ScrollChainSpec::from_custom_genesis(parse_genesis(s)?)), }) } } From d0ab22d94bab48ab628e64f6363ca3543548c781 Mon Sep 17 00:00:00 2001 From: colinlyguo Date: Tue, 12 Aug 2025 23:51:21 +0800 Subject: [PATCH 2/3] fix CI --- Cargo.lock | 4 ++-- deny.toml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97d81f9d9a6..34de63d9cde 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12372,9 +12372,9 @@ checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" diff --git a/deny.toml b/deny.toml index 395ef4a1a6f..82bacf4df6d 100644 --- a/deny.toml +++ b/deny.toml @@ -62,7 +62,6 @@ exceptions = [ # TODO: decide on MPL-2.0 handling # These dependencies are grandfathered in https://github.com/paradigmxyz/reth/pull/6980 { allow = ["MPL-2.0"], name = "option-ext" }, - { allow = ["MPL-2.0"], name = "webpki-root-certs" }, ] # Skip the poseidon-bn254, bn254 and zktrie crates for license verification. We should at some point publish a license for them. From 27bc55300c23dee29fdcbdaa99ef93d08f6568f7 Mon Sep 17 00:00:00 2001 From: colinlyguo Date: Tue, 12 Aug 2025 23:57:10 +0800 Subject: [PATCH 3/3] address a comment --- crates/scroll/chainspec/src/lib.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/crates/scroll/chainspec/src/lib.rs b/crates/scroll/chainspec/src/lib.rs index c4412bc3575..db91abe0aa9 100644 --- a/crates/scroll/chainspec/src/lib.rs +++ b/crates/scroll/chainspec/src/lib.rs @@ -195,13 +195,8 @@ impl ScrollChainSpec { let mut spec: Self = genesis.into(); // Determine whether Feynman is active at genesis. - let scroll_info = ScrollConfigInfo::extract_from(&spec.inner.genesis); - let feynman_active_at_genesis = scroll_info - .scroll_chain_info - .hard_fork_info - .and_then(|h| h.feynman_time) - .map(|t| t <= spec.inner.genesis.timestamp) - .unwrap_or(false); + let feynman_active_at_genesis = + spec.is_feynman_active_at_timestamp(spec.inner.genesis.timestamp); // Ensure the genesis header has a base fee when required. let mut header = make_genesis_header(&spec.inner.genesis);