@@ -105,7 +105,7 @@ where
105105 )
106106 } ;
107107
108- let ( substrate_hash, api) = match frontier_backend_client:: native_block_id :: < B , C > (
108+ let ( substrate_hash, mut api) = match frontier_backend_client:: native_block_id :: < B , C > (
109109 self . client . as_ref ( ) ,
110110 self . backend . as_ref ( ) ,
111111 number_or_hash,
@@ -127,6 +127,12 @@ where
127127 }
128128 } ;
129129
130+ // Enable proof size recording
131+ api. record_proof ( ) ;
132+ let recorder: sp_trie:: recorder:: Recorder < HashingFor < B > > = Default :: default ( ) ;
133+ let ext = sp_trie:: proof_size_extension:: ProofSizeExt :: new ( recorder. clone ( ) ) ;
134+ api. register_extension ( ext) ;
135+
130136 let api_version = if let Ok ( Some ( api_version) ) =
131137 api. api_version :: < dyn EthereumRuntimeRPCApi < B > > ( substrate_hash)
132138 {
@@ -238,14 +244,21 @@ where
238244 api_version,
239245 state_overrides,
240246 ) ?;
247+
248+ // Enable proof size recording
249+ let recorder: sp_trie:: recorder:: Recorder < HashingFor < B > > = Default :: default ( ) ;
250+ let ext = sp_trie:: proof_size_extension:: ProofSizeExt :: new ( recorder. clone ( ) ) ;
251+ let mut exts = Extensions :: new ( ) ;
252+ exts. register ( ext) ;
253+
241254 let params = CallApiAtParams {
242255 at : substrate_hash,
243256 function : "EthereumRuntimeRPCApi_call" ,
244257 arguments : encoded_params,
245258 overlayed_changes : & RefCell :: new ( overlayed_changes) ,
246259 call_context : CallContext :: Offchain ,
247- recorder : & None ,
248- extensions : & RefCell :: new ( Extensions :: new ( ) ) ,
260+ recorder : & Some ( recorder ) ,
261+ extensions : & RefCell :: new ( exts ) ,
249262 } ;
250263
251264 let value = if api_version == 4 {
@@ -636,27 +649,56 @@ where
636649 ( info. exit_reason , info. value , info. used_gas )
637650 } else {
638651 // Post-london + access list support
639- let access_list = access_list. unwrap_or_default ( ) ;
640- let info = api. call (
641- substrate_hash,
642- from. unwrap_or_default ( ) ,
643- to,
644- data,
645- value. unwrap_or_default ( ) ,
646- gas_limit,
647- max_fee_per_gas,
648- max_priority_fee_per_gas,
649- None ,
650- estimate_mode,
651- Some (
652+ let encoded_params = Encode :: encode ( & (
653+ & from. unwrap_or_default ( ) ,
654+ & to,
655+ & data,
656+ & value. unwrap_or_default ( ) ,
657+ & gas_limit,
658+ & max_fee_per_gas,
659+ & max_priority_fee_per_gas,
660+ & None :: < Option < U256 > > ,
661+ & estimate_mode,
662+ & Some (
652663 access_list
664+ . unwrap_or_default ( )
653665 . into_iter ( )
654666 . map ( |item| ( item. address , item. storage_keys ) )
655- . collect ( ) ,
667+ . collect :: < Vec < ( sp_core :: H160 , Vec < H256 > ) > > ( ) ,
656668 ) ,
657- )
658- . map_err ( |err| internal_err ( format ! ( "runtime error: {err}" ) ) ) ?
659- . map_err ( |err| internal_err ( format ! ( "execution fatal: {err:?}" ) ) ) ?;
669+ ) ) ;
670+
671+ // Proof size recording
672+ let recorder: sp_trie:: recorder:: Recorder < HashingFor < B > > = Default :: default ( ) ;
673+ let ext = sp_trie:: proof_size_extension:: ProofSizeExt :: new ( recorder. clone ( ) ) ;
674+ let mut exts = Extensions :: new ( ) ;
675+ exts. register ( ext) ;
676+
677+ let params = CallApiAtParams {
678+ at : substrate_hash,
679+ function : "EthereumRuntimeRPCApi_call" ,
680+ arguments : encoded_params,
681+ overlayed_changes : & RefCell :: new ( Default :: default ( ) ) ,
682+ call_context : CallContext :: Offchain ,
683+ recorder : & Some ( recorder) ,
684+ extensions : & RefCell :: new ( exts) ,
685+ } ;
686+
687+ let info = self
688+ . client
689+ . call_api_at ( params)
690+ . and_then ( |r| {
691+ Result :: map_err (
692+ <Result < ExecutionInfoV2 :: < Vec < u8 > > , DispatchError > as Decode >:: decode ( & mut & r[ ..] ) ,
693+ |error| sp_api:: ApiError :: FailedToDecodeReturnValue {
694+ function : "EthereumRuntimeRPCApi_call" ,
695+ error,
696+ raw : r
697+ } ,
698+ )
699+ } )
700+ . map_err ( |err| internal_err ( format ! ( "runtime error: {err}" ) ) ) ?
701+ . map_err ( |err| internal_err ( format ! ( "execution fatal: {err:?}" ) ) ) ?;
660702
661703 ( info. exit_reason , info. value , info. used_gas . effective )
662704 }
@@ -724,24 +766,53 @@ where
724766 ( info. exit_reason , Vec :: new ( ) , info. used_gas )
725767 } else {
726768 // Post-london + access list support
727- let access_list = access_list. unwrap_or_default ( ) ;
728- let info = api. create (
729- substrate_hash,
730- from. unwrap_or_default ( ) ,
731- data,
732- value. unwrap_or_default ( ) ,
733- gas_limit,
734- max_fee_per_gas,
735- max_priority_fee_per_gas,
736- None ,
737- estimate_mode,
738- Some (
769+ let encoded_params = Encode :: encode ( & (
770+ & from. unwrap_or_default ( ) ,
771+ & data,
772+ & value. unwrap_or_default ( ) ,
773+ & gas_limit,
774+ & max_fee_per_gas,
775+ & max_priority_fee_per_gas,
776+ & None :: < Option < U256 > > ,
777+ & estimate_mode,
778+ & Some (
739779 access_list
780+ . unwrap_or_default ( )
740781 . into_iter ( )
741782 . map ( |item| ( item. address , item. storage_keys ) )
742- . collect ( ) ,
783+ . collect :: < Vec < ( sp_core :: H160 , Vec < H256 > ) > > ( ) ,
743784 ) ,
744- )
785+ ) ) ;
786+
787+ // Enable proof size recording
788+ let recorder: sp_trie:: recorder:: Recorder < HashingFor < B > > = Default :: default ( ) ;
789+ let ext = sp_trie:: proof_size_extension:: ProofSizeExt :: new ( recorder. clone ( ) ) ;
790+ let mut exts = Extensions :: new ( ) ;
791+ exts. register ( ext) ;
792+
793+ let params = CallApiAtParams {
794+ at : substrate_hash,
795+ function : "EthereumRuntimeRPCApi_create" ,
796+ arguments : encoded_params,
797+ overlayed_changes : & RefCell :: new ( Default :: default ( ) ) ,
798+ call_context : CallContext :: Offchain ,
799+ recorder : & Some ( recorder) ,
800+ extensions : & RefCell :: new ( exts) ,
801+ } ;
802+
803+ let info = self
804+ . client
805+ . call_api_at ( params)
806+ . and_then ( |r| {
807+ Result :: map_err (
808+ <Result < ExecutionInfoV2 :: < H160 > , DispatchError > as Decode >:: decode ( & mut & r[ ..] ) ,
809+ |error| sp_api:: ApiError :: FailedToDecodeReturnValue {
810+ function : "EthereumRuntimeRPCApi_create" ,
811+ error,
812+ raw : r
813+ } ,
814+ )
815+ } )
745816 . map_err ( |err| internal_err ( format ! ( "runtime error: {err}" ) ) ) ?
746817 . map_err ( |err| internal_err ( format ! ( "execution fatal: {err:?}" ) ) ) ?;
747818
0 commit comments