Skip to content

Commit eb336c5

Browse files
authored
fix(anvil): fix chain-id precedence (#10239)
1 parent 89b7470 commit eb336c5

File tree

3 files changed

+58
-13
lines changed

3 files changed

+58
-13
lines changed

crates/anvil/src/cmd.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,6 @@ impl NodeArgs {
223223
None => None,
224224
};
225225

226-
// --chain-id takes precedence over the genesis config
227-
// if both are missing, use the default chain id
228-
// <https://github.com/foundry-rs/foundry/issues/10059>
229-
let chain_id = self
230-
.evm
231-
.chain_id
232-
.map_or(self.init.as_ref().map_or(CHAIN_ID, |g| g.config.chain_id), |c| c.into());
233226
Ok(NodeConfig::default()
234227
.with_gas_limit(self.evm.gas_limit)
235228
.disable_block_gas_limit(self.evm.disable_block_gas_limit)
@@ -261,7 +254,7 @@ impl NodeArgs {
261254
.with_host(self.host)
262255
.set_silent(shell::is_quiet())
263256
.set_config_out(self.config_out)
264-
.with_chain_id(Some(chain_id))
257+
.with_chain_id(self.evm.chain_id)
265258
.with_transaction_order(self.order)
266259
.with_genesis(self.init)
267260
.with_steps_tracing(self.evm.steps_tracing)

crates/anvil/src/config.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,11 @@ impl NodeConfig {
10371037

10381038
// if provided use all settings of `genesis.json`
10391039
if let Some(ref genesis) = self.genesis {
1040-
env.cfg.chain_id = genesis.config.chain_id;
1040+
// --chain-id flag gets precedence over the genesis.json chain id
1041+
// <https://github.com/foundry-rs/foundry/issues/10059>
1042+
if self.chain_id.is_none() {
1043+
env.cfg.chain_id = genesis.config.chain_id;
1044+
}
10411045
env.block.timestamp = U256::from(genesis.timestamp);
10421046
if let Some(base_fee) = genesis.base_fee_per_gas {
10431047
env.block.basefee = U256::from(base_fee);

crates/anvil/tests/it/genesis.rs

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
//! genesis.json tests
22
3+
use crate::fork::fork_config;
34
use alloy_genesis::Genesis;
45
use alloy_primitives::{Address, U256};
56
use alloy_provider::Provider;
67
use anvil::{spawn, NodeConfig};
78
use std::str::FromStr;
89

9-
#[tokio::test(flavor = "multi_thread")]
10-
async fn can_apply_genesis() {
11-
let genesis = r#"{
10+
const GENESIS: &str = r#"{
1211
"config": {
1312
"chainId": 19763,
1413
"homesteadBlock": 0,
@@ -35,7 +34,10 @@ async fn can_apply_genesis() {
3534
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
3635
}
3736
"#;
38-
let genesis: Genesis = serde_json::from_str(genesis).unwrap();
37+
38+
#[tokio::test(flavor = "multi_thread")]
39+
async fn can_apply_genesis() {
40+
let genesis: Genesis = serde_json::from_str(GENESIS).unwrap();
3941
let (_api, handle) = spawn(NodeConfig::test().with_genesis(Some(genesis))).await;
4042

4143
let provider = handle.http_provider();
@@ -51,3 +53,49 @@ async fn can_apply_genesis() {
5153
let block_number = provider.get_block_number().await.unwrap();
5254
assert_eq!(block_number, 73u64);
5355
}
56+
57+
// <https://github.com/foundry-rs/foundry/issues/10059>
58+
// <https://github.com/foundry-rs/foundry/issues/10238>
59+
#[tokio::test(flavor = "multi_thread")]
60+
async fn chain_id_precedence() {
61+
// Order: --chain-id > fork-chain-id > Genesis > default.
62+
63+
// --chain-id > Genesis.
64+
let genesis: Genesis = serde_json::from_str(GENESIS).unwrap();
65+
let (_api, handle) =
66+
spawn(NodeConfig::test().with_genesis(Some(genesis.clone())).with_chain_id(Some(300u64)))
67+
.await;
68+
let provider = handle.http_provider();
69+
let chain_id = provider.get_chain_id().await.unwrap();
70+
assert_eq!(chain_id, 300u64);
71+
72+
// fork > Genesis.
73+
let (_api, handle) = spawn(fork_config().with_genesis(Some(genesis.clone()))).await;
74+
let provider = handle.http_provider();
75+
let chain_id = provider.get_chain_id().await.unwrap();
76+
assert_eq!(chain_id, 1);
77+
78+
// --chain-id > fork.
79+
let (_api, handle) = spawn(fork_config().with_chain_id(Some(300u64))).await;
80+
let provider = handle.http_provider();
81+
let chain_id = provider.get_chain_id().await.unwrap();
82+
assert_eq!(chain_id, 300u64);
83+
84+
// fork
85+
let (_api, handle) = spawn(fork_config()).await;
86+
let provider = handle.http_provider();
87+
let chain_id = provider.get_chain_id().await.unwrap();
88+
assert_eq!(chain_id, 1);
89+
90+
// Genesis
91+
let (_api, handle) = spawn(NodeConfig::test().with_genesis(Some(genesis))).await;
92+
let provider = handle.http_provider();
93+
let chain_id = provider.get_chain_id().await.unwrap();
94+
assert_eq!(chain_id, 19763u64);
95+
96+
// default
97+
let (_api, handle) = spawn(NodeConfig::test()).await;
98+
let provider = handle.http_provider();
99+
let chain_id = provider.get_chain_id().await.unwrap();
100+
assert_eq!(chain_id, 31337);
101+
}

0 commit comments

Comments
 (0)