@@ -305,6 +305,81 @@ where
305305 } ;
306306
307307 Ok ( Bytes ( value) )
308+ } else if api_version == 6 {
309+ // Pectra - authorization list support (EIP-7702)
310+ let access_list = access_list
311+ . unwrap_or_default ( )
312+ . into_iter ( )
313+ . map ( |item| ( item. address , item. storage_keys ) )
314+ . collect :: < Vec < ( sp_core:: H160 , Vec < H256 > ) > > ( ) ;
315+
316+ let authorization_list = authorization_list
317+ . unwrap_or_default ( )
318+ . iter ( )
319+ . map ( |d| {
320+ (
321+ U256 :: from ( d. chain_id ) ,
322+ d. address ,
323+ d. nonce ,
324+ d. authorizing_address ( ) ,
325+ )
326+ } )
327+ . collect :: < Vec < ( U256 , sp_core:: H160 , U256 , sp_core:: H160 ) > > ( ) ;
328+
329+ let encoded_params = Encode :: encode ( & (
330+ & from. unwrap_or_default ( ) ,
331+ & to,
332+ & data,
333+ & value. unwrap_or_default ( ) ,
334+ & gas_limit,
335+ & max_fee_per_gas,
336+ & max_priority_fee_per_gas,
337+ & nonce,
338+ & false ,
339+ & Some ( access_list) ,
340+ & Some ( authorization_list) ,
341+ ) ) ;
342+ let overlayed_changes = self . create_overrides_overlay (
343+ substrate_hash,
344+ api_version,
345+ state_overrides,
346+ ) ?;
347+
348+ // Enable proof size recording
349+ let recorder: sp_trie:: recorder:: Recorder < HashingFor < B > > = Default :: default ( ) ;
350+ let ext = sp_trie:: proof_size_extension:: ProofSizeExt :: new ( recorder. clone ( ) ) ;
351+ let mut exts = Extensions :: new ( ) ;
352+ exts. register ( ext) ;
353+
354+ let params = CallApiAtParams {
355+ at : substrate_hash,
356+ function : "EthereumRuntimeRPCApi_call" ,
357+ arguments : encoded_params,
358+ overlayed_changes : & RefCell :: new ( overlayed_changes) ,
359+ call_context : CallContext :: Offchain ,
360+ recorder : & Some ( recorder) ,
361+ extensions : & RefCell :: new ( exts) ,
362+ } ;
363+
364+ let info =
365+ self . client
366+ . call_api_at ( params)
367+ . and_then ( |r| {
368+ Result :: map_err (
369+ <Result < ExecutionInfoV2 :: < Vec < u8 > > , DispatchError > as Decode >:: decode ( & mut & r[ ..] ) ,
370+ |error| sp_api:: ApiError :: FailedToDecodeReturnValue {
371+ function : "EthereumRuntimeRPCApi_call" ,
372+ error,
373+ raw : r
374+ } ,
375+ )
376+ } )
377+ . map_err ( |err| internal_err ( format ! ( "runtime error: {err}" ) ) ) ?
378+ . map_err ( |err| internal_err ( format ! ( "execution fatal: {err:?}" ) ) ) ?;
379+
380+ error_on_execution_failure ( & info. exit_reason , & info. value ) ?;
381+
382+ Ok ( Bytes ( info. value ) )
308383 } else {
309384 Err ( internal_err ( "failed to retrieve Runtime Api version" ) )
310385 }
0 commit comments