@@ -233,29 +233,20 @@ impl Cheatcode for isPersistentCall {
233233 }
234234}
235235
236- impl Cheatcode for rpcCall {
236+ impl Cheatcode for rpc_0Call {
237237 fn apply_stateful < DB : DatabaseExt > ( & self , ccx : & mut CheatsCtxt < DB > ) -> Result {
238238 let Self { method, params } = self ;
239239 let url =
240240 ccx. ecx . db . active_fork_url ( ) . ok_or_else ( || fmt_err ! ( "no active fork URL found" ) ) ?;
241- let provider = ProviderBuilder :: new ( & url) . build ( ) ?;
242- let params_json: serde_json:: Value = serde_json:: from_str ( params) ?;
243- let result =
244- foundry_common:: block_on ( provider. raw_request ( method. clone ( ) . into ( ) , params_json) )
245- . map_err ( |err| fmt_err ! ( "{method:?}: {err}" ) ) ?;
246-
247- let result_as_tokens = match crate :: json:: json_value_to_token ( & result)
248- . map_err ( |err| fmt_err ! ( "failed to parse result: {err}" ) ) ?
249- {
250- DynSolValue :: FixedBytes ( bytes, size) => {
251- // converted fixed bytes to bytes to prevent evm encoding issues: <https://github.com/foundry-rs/foundry/issues/8287>
252- DynSolValue :: Bytes ( bytes. as_slice ( ) [ ..size] . to_vec ( ) )
253- }
254- DynSolValue :: Address ( addr) => DynSolValue :: Bytes ( addr. to_vec ( ) ) ,
255- val => val,
256- } ;
241+ rpc_call ( & url, method, params)
242+ }
243+ }
257244
258- Ok ( result_as_tokens. abi_encode ( ) )
245+ impl Cheatcode for rpc_1Call {
246+ fn apply ( & self , state : & mut Cheatcodes ) -> Result {
247+ let Self { urlOrAlias, method, params } = self ;
248+ let url = state. config . rpc_url ( urlOrAlias) ?;
249+ rpc_call ( & url, method, params)
259250 }
260251}
261252
@@ -392,3 +383,26 @@ fn check_broadcast(state: &Cheatcodes) -> Result<()> {
392383fn persist_caller < DB : DatabaseExt > ( ccx : & mut CheatsCtxt < DB > ) {
393384 ccx. ecx . db . add_persistent_account ( ccx. caller ) ;
394385}
386+
387+ /// Performs an Ethereum JSON-RPC request to the given endpoint.
388+ fn rpc_call ( url : & str , method : & str , params : & str ) -> Result {
389+ let provider = ProviderBuilder :: new ( url) . build ( ) ?;
390+ let params_json: serde_json:: Value = serde_json:: from_str ( params) ?;
391+ let result =
392+ foundry_common:: block_on ( provider. raw_request ( method. to_string ( ) . into ( ) , params_json) )
393+ . map_err ( |err| fmt_err ! ( "{method:?}: {err}" ) ) ?;
394+
395+ let result_as_tokens = match crate :: json:: json_value_to_token ( & result)
396+ . map_err ( |err| fmt_err ! ( "failed to parse result: {err}" ) ) ?
397+ {
398+ // Convert fixed bytes to bytes to prevent encoding issues.
399+ // See: <https://github.com/foundry-rs/foundry/issues/8287>
400+ DynSolValue :: FixedBytes ( bytes, size) => {
401+ DynSolValue :: Bytes ( bytes. as_slice ( ) [ ..size] . to_vec ( ) )
402+ }
403+ DynSolValue :: Address ( addr) => DynSolValue :: Bytes ( addr. to_vec ( ) ) ,
404+ val => val,
405+ } ;
406+
407+ Ok ( result_as_tokens. abi_encode ( ) )
408+ }
0 commit comments