Skip to content

Commit ad63dbc

Browse files
committed
Use StateOverridesBuilder, nit
1 parent 08f2194 commit ad63dbc

File tree

2 files changed

+51
-65
lines changed

2 files changed

+51
-65
lines changed

crates/cast/src/cmd/call.rs

+49-63
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ use crate::{
44
Cast,
55
};
66
use alloy_primitives::{Address, Bytes, TxKind, U256};
7-
use alloy_rpc_types::{state::StateOverride, BlockId, BlockNumberOrTag};
7+
use alloy_rpc_types::{
8+
state::{StateOverride, StateOverridesBuilder},
9+
BlockId, BlockNumberOrTag,
10+
};
811
use clap::Parser;
912
use eyre::Result;
1013
use foundry_cli::{
@@ -173,7 +176,7 @@ impl CallArgs {
173176
let figment = Into::<Figment>::into(&self.eth).merge(&self);
174177
let evm_opts = figment.extract::<EvmOpts>()?;
175178
let mut config = Config::from_provider(figment)?.sanitized();
176-
let state_override = &self.get_state_overrides()?;
179+
let state_overrides = self.get_state_overrides()?;
177180

178181
let Self {
179182
to,
@@ -289,88 +292,51 @@ impl CallArgs {
289292

290293
sh_println!(
291294
"{}",
292-
Cast::new(provider).call(&tx, func.as_ref(), block, state_override.clone()).await?
295+
Cast::new(provider).call(&tx, func.as_ref(), block, state_overrides).await?
293296
)?;
294297

295298
Ok(())
296299
}
297300
/// Parse state overrides from command line arguments
298-
pub fn get_state_overrides(&self) -> eyre::Result<Option<StateOverride>> {
299-
let mut state_override = StateOverride::default();
301+
pub fn get_state_overrides(&self) -> eyre::Result<StateOverride> {
302+
let mut state_overrides_builder = StateOverridesBuilder::default();
300303

301-
// Store state_diff_overrides in a local variable to avoid partial move
302-
let balance_overrides = &self.balance_overrides;
303304
// Parse balance overrides
304-
for override_str in balance_overrides.iter().flatten() {
305-
let (addr, balance) = Self::parse_address_value(override_str)?;
306-
state_override.entry(addr).or_default().balance = Some(balance);
305+
for override_str in self.balance_overrides.iter().flatten() {
306+
let (addr, balance) = address_value_override(override_str)?;
307+
state_overrides_builder =
308+
state_overrides_builder.with_balance(addr.parse()?, balance.parse()?);
307309
}
308310

309-
// Store state_diff_overrides in a local variable to avoid partial move
310-
let nonce_overrides = &self.nonce_overrides;
311311
// Parse nonce overrides
312-
for override_str in nonce_overrides.iter().flatten() {
313-
let (addr, nonce) = Self::parse_address_value(override_str)?;
314-
state_override.entry(addr).or_default().nonce = Some(nonce);
312+
for override_str in self.nonce_overrides.iter().flatten() {
313+
let (addr, nonce) = address_value_override(override_str)?;
314+
state_overrides_builder =
315+
state_overrides_builder.with_nonce(addr.parse()?, nonce.parse()?);
315316
}
316317

317-
// Store state_diff_overrides in a local variable to avoid partial move
318-
let code_overrides = &self.code_overrides;
319318
// Parse code overrides
320-
for override_str in code_overrides.iter().flatten() {
321-
let (addr, code_str) = override_str.split_once(':').ok_or_else(|| {
322-
eyre::eyre!("Invalid code override format. Expected <address>:<code>")
323-
})?;
324-
let addr = addr.parse()?;
325-
let code = Bytes::from_str(code_str)?;
326-
state_override.entry(addr).or_default().code = Some(code);
319+
for override_str in self.code_overrides.iter().flatten() {
320+
let (addr, code_str) = address_value_override(override_str)?;
321+
state_overrides_builder =
322+
state_overrides_builder.with_code(addr.parse()?, Bytes::from_str(code_str)?);
327323
}
328324

329-
// Store state_diff_overrides in a local variable to avoid partial move
330-
let state_overrides = &self.state_overrides;
331325
// Parse state overrides
332-
for override_str in state_overrides.iter().flatten() {
333-
let (addr, slot, value) = Self::parse_address_slot_value(override_str)?;
334-
let state_map = state_override.entry(addr).or_default().state.get_or_insert_default();
335-
state_map.insert(slot.into(), value.into());
326+
for override_str in self.state_overrides.iter().flatten() {
327+
let (addr, slot, value) = address_slot_value_override(override_str)?;
328+
state_overrides_builder =
329+
state_overrides_builder.with_state(addr, [(slot.into(), value.into())]);
336330
}
337331

338-
// Store state_diff_overrides in a local variable to avoid partial move
339-
let state_diff_overrides = &self.state_diff_overrides;
340332
// Parse state diff overrides
341-
for override_str in state_diff_overrides.iter().flatten() {
342-
let (addr, slot, value) = Self::parse_address_slot_value(override_str)?;
343-
let state_diff_map =
344-
state_override.entry(addr).or_default().state_diff.get_or_insert_default();
345-
state_diff_map.insert(slot.into(), value.into());
333+
for override_str in self.state_diff_overrides.iter().flatten() {
334+
let (addr, slot, value) = address_slot_value_override(override_str)?;
335+
state_overrides_builder =
336+
state_overrides_builder.with_state_diff(addr, [(slot.into(), value.into())]);
346337
}
347338

348-
Ok(if state_override.is_empty() { None } else { Some(state_override) })
349-
}
350-
351-
/// Parse an override string in the format address:value
352-
pub fn parse_address_value<T>(s: &str) -> eyre::Result<(Address, T)>
353-
where
354-
T: FromStr,
355-
T::Err: std::error::Error + Send + Sync + 'static,
356-
{
357-
let (addr, value) = s
358-
.split_once(':')
359-
.ok_or_else(|| eyre::eyre!("Invalid override format. Expected <address>:<value>"))?;
360-
Ok((addr.parse()?, value.parse()?))
361-
}
362-
363-
/// Parse an override string in the format address:slot:value
364-
pub fn parse_address_slot_value(s: &str) -> Result<(Address, U256, U256)> {
365-
let captures = OVERRIDE_PATTERN.captures(s).ok_or_else(|| {
366-
eyre::eyre!("Invalid override format. Expected <address>:<slot>:<value>")
367-
})?;
368-
369-
Ok((
370-
captures[1].parse()?, // Address
371-
captures[2].parse()?, // Slot (U256)
372-
captures[3].parse()?, // Value (U256)
373-
))
339+
Ok(state_overrides_builder.build())
374340
}
375341
}
376342

@@ -394,6 +360,26 @@ impl figment::Provider for CallArgs {
394360
}
395361
}
396362

363+
/// Parse an override string in the format address:value.
364+
fn address_value_override(address_override: &str) -> Result<(&str, &str)> {
365+
address_override.split_once(':').ok_or_else(|| {
366+
eyre::eyre!("Invalid override {address_override}. Expected <address>:<value>")
367+
})
368+
}
369+
370+
/// Parse an override string in the format address:slot:value.
371+
fn address_slot_value_override(address_override: &str) -> Result<(Address, U256, U256)> {
372+
let captures = OVERRIDE_PATTERN.captures(address_override).ok_or_else(|| {
373+
eyre::eyre!("Invalid override {address_override}. Expected <address>:<slot>:<value>")
374+
})?;
375+
376+
Ok((
377+
captures[1].parse()?, // Address
378+
captures[2].parse()?, // Slot (U256)
379+
captures[3].parse()?, // Value (U256)
380+
))
381+
}
382+
397383
#[cfg(test)]
398384
mod tests {
399385
use super::*;

crates/cast/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,13 @@ impl<P: Provider<AnyNetwork>> Cast<P> {
146146
req: &WithOtherFields<TransactionRequest>,
147147
func: Option<&Function>,
148148
block: Option<BlockId>,
149-
state_override: Option<StateOverride>,
149+
state_override: StateOverride,
150150
) -> Result<String> {
151151
let res = self
152152
.provider
153153
.call(req.clone())
154154
.block(block.unwrap_or_default())
155-
.overrides(state_override.unwrap_or_default())
155+
.overrides(state_override)
156156
.await?;
157157

158158
let mut decoded = vec![];

0 commit comments

Comments
 (0)