diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index 9f7ed16e79106..0c4cecfddce97 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -345,7 +345,8 @@ pub struct Config { /// the initial balance of each deployed test contract pub initial_balance: U256, /// the block.number value during EVM execution - pub block_number: u64, + #[serde(deserialize_with = "crate::deser_u64_to_u256")] + pub block_number: U256, /// pins the block number for the state fork pub fork_block_number: Option, /// The chain name or EIP-155 chain ID. @@ -365,7 +366,8 @@ pub struct Config { /// The `block.coinbase` value during EVM execution. pub block_coinbase: Address, /// The `block.timestamp` value during EVM execution. - pub block_timestamp: u64, + #[serde(deserialize_with = "crate::deser_u64_to_u256")] + pub block_timestamp: U256, /// The `block.difficulty` value during EVM execution. pub block_difficulty: u64, /// Before merge the `block.max_hash`, after merge it is `block.prevrandao`. @@ -1660,8 +1662,8 @@ impl Config { pub fn dapptools() -> Self { Self { chain: Some(Chain::from_id(99)), - block_timestamp: 0, - block_number: 0, + block_timestamp: U256::ZERO, + block_number: U256::ZERO, ..Self::default() } } @@ -2352,7 +2354,7 @@ impl Default for Config { sender: Self::DEFAULT_SENDER, tx_origin: Self::DEFAULT_SENDER, initial_balance: U256::from((1u128 << 96) - 1), - block_number: 1, + block_number: U256::from(1), fork_block_number: None, chain: None, gas_limit: (1u64 << 30).into(), // ~1B @@ -2360,7 +2362,7 @@ impl Default for Config { gas_price: None, block_base_fee_per_gas: 0, block_coinbase: Address::ZERO, - block_timestamp: 1, + block_timestamp: U256::from(1), block_difficulty: 0, block_prevrandao: Default::default(), block_gas_limit: None, diff --git a/crates/config/src/utils.rs b/crates/config/src/utils.rs index bcb20ab698afb..39b6e6c88a0d3 100644 --- a/crates/config/src/utils.rs +++ b/crates/config/src/utils.rs @@ -213,6 +213,24 @@ where deserialize_u64_or_max(deserializer)?.try_into().map_err(D::Error::custom) } +/// Deserialize into `U256` from either a `u64` or a `U256` hex string. +pub fn deser_u64_to_u256<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum NumericValue { + U256(U256), + U64(u64), + } + + match NumericValue::deserialize(deserializer)? { + NumericValue::U64(n) => Ok(U256::from(n)), + NumericValue::U256(n) => Ok(n), + } +} + /// Helper type to parse both `u64` and `U256` #[derive(Clone, Copy, Deserialize)] #[serde(untagged)] diff --git a/crates/evm/core/src/opts.rs b/crates/evm/core/src/opts.rs index ee20d7f55c69c..aa06eea4f35ac 100644 --- a/crates/evm/core/src/opts.rs +++ b/crates/evm/core/src/opts.rs @@ -278,9 +278,11 @@ pub struct Env { pub block_coinbase: Address, /// the block.timestamp value during EVM execution + #[serde(deserialize_with = "foundry_config::deser_u64_to_u256")] pub block_timestamp: U256, /// the block.number value during EVM execution" + #[serde(deserialize_with = "foundry_config::deser_u64_to_u256")] pub block_number: U256, /// the block.difficulty value during EVM execution diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index 05f1b78340157..2063646778fd4 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -101,7 +101,7 @@ forgetest!(can_extract_config_values, |prj, cmd| { sender: "00a329c0648769A73afAc7F9381D08FB43dBEA72".parse().unwrap(), tx_origin: "00a329c0648769A73afAc7F9F81E08FB43dBEA72".parse().unwrap(), initial_balance: U256::from(0xffffffffffffffffffffffffu128), - block_number: 10, + block_number: U256::from(10), fork_block_number: Some(200), chain: Some(9999.into()), gas_limit: 99_000_000u64.into(), @@ -109,7 +109,7 @@ forgetest!(can_extract_config_values, |prj, cmd| { gas_price: Some(999), block_base_fee_per_gas: 10, block_coinbase: Address::random(), - block_timestamp: 10, + block_timestamp: U256::from(10), block_difficulty: 10, block_prevrandao: B256::random(), block_gas_limit: Some(100u64.into()), diff --git a/crates/forge/tests/it/test_helpers.rs b/crates/forge/tests/it/test_helpers.rs index 22e6df8724ed7..2209fb9409230 100644 --- a/crates/forge/tests/it/test_helpers.rs +++ b/crates/forge/tests/it/test_helpers.rs @@ -100,8 +100,8 @@ impl ForgeTestProfile { config.gas_limit = u64::MAX.into(); config.chain = None; config.tx_origin = CALLER; - config.block_number = 1; - config.block_timestamp = 1; + config.block_number = U256::from(1); + config.block_timestamp = U256::from(1); config.sender = CALLER; config.initial_balance = U256::MAX;