Skip to content

Commit 256cc50

Browse files
authored
feat/fix(anvil): add genesis number CLI option, fix genesis block construction (#10258)
* feat(anvil): add genesis block number support - Introduced `genesis_block_number` field in `NodeConfig` and `NodeArgs`. - Added methods to set and retrieve the genesis block number. - Updated `into_node_config` to include the genesis block number. - Added tests to verify setting and defaulting of the genesis block number. * fix(anvil): include genesis block number in storage initialization - Added the `number` field to the storage initialization to support the genesis block number.
1 parent b455c5b commit 256cc50

File tree

4 files changed

+40
-2
lines changed

4 files changed

+40
-2
lines changed

crates/anvil/src/cmd.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ pub struct NodeArgs {
4747
#[arg(long, value_name = "NUM")]
4848
pub timestamp: Option<u64>,
4949

50+
/// The number of the genesis block.
51+
#[arg(long, value_name = "NUM")]
52+
pub number: Option<u64>,
53+
5054
/// BIP39 mnemonic phrase used for generating accounts.
5155
/// Cannot be used if `mnemonic_random` or `mnemonic_seed` are used.
5256
#[arg(long, short, conflicts_with_all = &["mnemonic_seed", "mnemonic_random"])]
@@ -234,6 +238,7 @@ impl NodeArgs {
234238
.with_account_generator(self.account_generator())?
235239
.with_genesis_balance(genesis_balance)
236240
.with_genesis_timestamp(self.timestamp)
241+
.with_genesis_block_number(self.number)
237242
.with_port(self.port)
238243
.with_fork_choice(match (self.evm.fork_block_number, self.evm.fork_transaction_hash) {
239244
(Some(block), None) => Some(ForkChoice::Block(block)),

crates/anvil/src/config.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ pub struct NodeConfig {
105105
pub genesis_balance: U256,
106106
/// Genesis block timestamp
107107
pub genesis_timestamp: Option<u64>,
108+
/// Genesis block number
109+
pub genesis_block_number: Option<u64>,
108110
/// Signer accounts that can sign messages/transactions from the EVM node
109111
pub signer_accounts: Vec<PrivateKeySigner>,
110112
/// Configured block time for the EVM chain. Use `None` to mine a new block for every tx
@@ -430,6 +432,7 @@ impl Default for NodeConfig {
430432
hardfork: None,
431433
signer_accounts: genesis_accounts.clone(),
432434
genesis_timestamp: None,
435+
genesis_block_number: None,
433436
genesis_accounts,
434437
// 100ETH default balance
435438
genesis_balance: Unit::ETHER.wei().saturating_mul(U256::from(100u64)),
@@ -669,9 +672,20 @@ impl NodeConfig {
669672
self
670673
}
671674

675+
/// Sets the genesis number
676+
#[must_use]
677+
pub fn with_genesis_block_number<U: Into<u64>>(mut self, number: Option<U>) -> Self {
678+
if let Some(number) = number {
679+
self.genesis_block_number = Some(number.into());
680+
}
681+
self
682+
}
683+
672684
/// Returns the genesis number
673685
pub fn get_genesis_number(&self) -> u64 {
674-
self.genesis.as_ref().and_then(|g| g.number).unwrap_or(0)
686+
self.genesis_block_number
687+
.or_else(|| self.genesis.as_ref().and_then(|g| g.number))
688+
.unwrap_or(0)
675689
}
676690

677691
/// Sets the hardfork

crates/anvil/src/eth/backend/mem/storage.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ impl BlockchainStorage {
291291
difficulty: env.block.difficulty,
292292
blob_gas_used: env.block.blob_excess_gas_and_price.as_ref().map(|_| 0),
293293
excess_blob_gas: env.block.get_blob_excess_gas(),
294-
294+
number: genesis_number,
295295
parent_beacon_block_root: is_cancun.then_some(Default::default()),
296296
withdrawals_root: is_shanghai.then_some(EMPTY_WITHDRAWALS),
297297
requests_hash: is_prague.then_some(EMPTY_REQUESTS_HASH),

crates/anvil/tests/it/anvil.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,22 @@ async fn test_cancun_fields() {
115115
assert!(block.header.blob_gas_used.is_some());
116116
assert!(block.header.excess_blob_gas.is_some());
117117
}
118+
119+
#[tokio::test(flavor = "multi_thread")]
120+
async fn test_can_set_genesis_block_number() {
121+
let (_api, handle) = spawn(NodeConfig::test().with_genesis_block_number(Some(1337u64))).await;
122+
let provider = handle.http_provider();
123+
124+
let block_number = provider.get_block_number().await.unwrap();
125+
assert_eq!(block_number, 1337u64);
126+
127+
assert_eq!(1337, provider.get_block(1337.into()).await.unwrap().unwrap().header.number);
128+
}
129+
130+
#[tokio::test(flavor = "multi_thread")]
131+
async fn test_can_use_default_genesis_block_number() {
132+
let (_api, handle) = spawn(NodeConfig::test()).await;
133+
let provider = handle.http_provider();
134+
135+
assert_eq!(0, provider.get_block(0.into()).await.unwrap().unwrap().header.number);
136+
}

0 commit comments

Comments
 (0)