@@ -4,7 +4,10 @@ use crate::{
4
4
Cast ,
5
5
} ;
6
6
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
+ } ;
8
11
use clap:: Parser ;
9
12
use eyre:: Result ;
10
13
use foundry_cli:: {
@@ -173,7 +176,7 @@ impl CallArgs {
173
176
let figment = Into :: < Figment > :: into ( & self . eth ) . merge ( & self ) ;
174
177
let evm_opts = figment. extract :: < EvmOpts > ( ) ?;
175
178
let mut config = Config :: from_provider ( figment) ?. sanitized ( ) ;
176
- let state_override = & self . get_state_overrides ( ) ?;
179
+ let state_overrides = self . get_state_overrides ( ) ?;
177
180
178
181
let Self {
179
182
to,
@@ -289,88 +292,51 @@ impl CallArgs {
289
292
290
293
sh_println ! (
291
294
"{}" ,
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 ?
293
296
) ?;
294
297
295
298
Ok ( ( ) )
296
299
}
297
300
/// 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 ( ) ;
300
303
301
- // Store state_diff_overrides in a local variable to avoid partial move
302
- let balance_overrides = & self . balance_overrides ;
303
304
// 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 ( ) ?) ;
307
309
}
308
310
309
- // Store state_diff_overrides in a local variable to avoid partial move
310
- let nonce_overrides = & self . nonce_overrides ;
311
311
// 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 ( ) ?) ;
315
316
}
316
317
317
- // Store state_diff_overrides in a local variable to avoid partial move
318
- let code_overrides = & self . code_overrides ;
319
318
// 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) ?) ;
327
323
}
328
324
329
- // Store state_diff_overrides in a local variable to avoid partial move
330
- let state_overrides = & self . state_overrides ;
331
325
// 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 ( ) ) ] ) ;
336
330
}
337
331
338
- // Store state_diff_overrides in a local variable to avoid partial move
339
- let state_diff_overrides = & self . state_diff_overrides ;
340
332
// 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 ( ) ) ] ) ;
346
337
}
347
338
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 ( ) )
374
340
}
375
341
}
376
342
@@ -394,6 +360,26 @@ impl figment::Provider for CallArgs {
394
360
}
395
361
}
396
362
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
+
397
383
#[ cfg( test) ]
398
384
mod tests {
399
385
use super :: * ;
0 commit comments