1
1
use crate :: { context:: InstructionsContext , BoxedInstructionWithOpCode } ;
2
2
use revm:: { Database , Evm } ;
3
3
use revm_interpreter:: {
4
- gas, instructions:: host:: get_memory_input_and_out_ranges, pop, pop_address, resize_memory,
5
- CallContext , CallInputs , CallScheme , InstructionResult , Interpreter , InterpreterAction ,
6
- Transfer ,
4
+ gas,
5
+ instructions:: host:: { calc_call_gas, get_memory_input_and_out_ranges} ,
6
+ pop, pop_address, resize_memory, CallContext , CallInputs , CallScheme , InstructionResult ,
7
+ Interpreter , InterpreterAction , Transfer ,
7
8
} ;
8
9
use revm_precompile:: secp256k1:: ecrecover;
9
- use revm_primitives:: { alloy_primitives:: B512 , keccak256, Address , B256 , U256 } ;
10
+ use revm_primitives:: {
11
+ alloy_primitives:: B512 , keccak256, spec_to_generic, Address , SpecId , B256 , U256 ,
12
+ } ;
10
13
11
14
const AUTH_OPCODE : u8 = 0xF6 ;
12
15
const AUTHCALL_OPCODE : u8 = 0xF7 ;
@@ -123,7 +126,7 @@ fn auth_instruction<EXT, DB: Database>(
123
126
124
127
fn authcall_instruction < EXT , DB : Database > (
125
128
interp : & mut Interpreter ,
126
- _evm : & mut Evm < ' _ , EXT , DB > ,
129
+ evm : & mut Evm < ' _ , EXT , DB > ,
127
130
ctx : & InstructionsContext ,
128
131
) {
129
132
let authorized = match ctx. get ( AUTHORIZED_VAR_NAME ) {
@@ -137,7 +140,7 @@ fn authcall_instruction<EXT, DB: Database>(
137
140
pop ! ( interp, local_gas_limit) ;
138
141
pop_address ! ( interp, to) ;
139
142
// max gas limit is not possible in real ethereum situation.
140
- let _local_gas_limit = u64:: try_from ( local_gas_limit) . unwrap_or ( u64:: MAX ) ;
143
+ let local_gas_limit = u64:: try_from ( local_gas_limit) . unwrap_or ( u64:: MAX ) ;
141
144
142
145
pop ! ( interp, value) ;
143
146
if interp. is_static && value != U256 :: ZERO {
@@ -149,11 +152,18 @@ fn authcall_instruction<EXT, DB: Database>(
149
152
return ;
150
153
} ;
151
154
152
- let Some ( mut gas_limit) =
153
- // TODO: calc_call_gas requires SPEC.
154
- //calc_call_gas(interp, evm, to, value != U256::ZERO, local_gas_limit, true, true)
155
- Some ( 100 )
156
- else {
155
+ let Some ( mut gas_limit) = spec_to_generic ! (
156
+ evm. spec_id( ) ,
157
+ calc_call_gas:: <Evm <' _, EXT , DB >, SPEC >(
158
+ interp,
159
+ evm,
160
+ to,
161
+ value != U256 :: ZERO ,
162
+ local_gas_limit,
163
+ true ,
164
+ true
165
+ )
166
+ ) else {
157
167
return ;
158
168
} ;
159
169
0 commit comments