@@ -11,7 +11,8 @@ use crate::{
11
11
Transition :: { Delta , To } ,
12
12
} ,
13
13
math_gadget:: {
14
- ConstantDivisionGadget , IsZeroGadget , LtGadget , LtWordGadget , MinMaxGadget ,
14
+ ConstantDivisionGadget , IsEqualGadget , IsZeroGadget , LtGadget , LtWordGadget ,
15
+ MinMaxGadget ,
15
16
} ,
16
17
memory_gadget:: { CommonMemoryAddressGadget , MemoryAddressGadget } ,
17
18
not, or,
@@ -44,10 +45,10 @@ use std::cmp::min;
44
45
45
46
pub ( crate ) struct CallOpGadget < F > {
46
47
opcode : Cell < F > ,
47
- is_call : IsZeroGadget < F > ,
48
- is_callcode : IsZeroGadget < F > ,
49
- is_delegatecall : IsZeroGadget < F > ,
50
- is_staticcall : IsZeroGadget < F > ,
48
+ is_call : IsEqualGadget < F > ,
49
+ is_callcode : IsEqualGadget < F > ,
50
+ is_delegatecall : IsEqualGadget < F > ,
51
+ is_staticcall : IsEqualGadget < F > ,
51
52
tx_id : Cell < F > ,
52
53
reversion_info : ReversionInfo < F > ,
53
54
current_callee_address : WordLoHiCell < F > ,
@@ -94,12 +95,10 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
94
95
fn configure ( cb : & mut EVMConstraintBuilder < F > ) -> Self {
95
96
let opcode = cb. query_cell ( ) ;
96
97
cb. opcode_lookup ( opcode. expr ( ) , 1 . expr ( ) ) ;
97
- let is_call = IsZeroGadget :: construct ( cb, opcode. expr ( ) - OpcodeId :: CALL . expr ( ) ) ;
98
- let is_callcode = IsZeroGadget :: construct ( cb, opcode. expr ( ) - OpcodeId :: CALLCODE . expr ( ) ) ;
99
- let is_delegatecall =
100
- IsZeroGadget :: construct ( cb, opcode. expr ( ) - OpcodeId :: DELEGATECALL . expr ( ) ) ;
101
- let is_staticcall =
102
- IsZeroGadget :: construct ( cb, opcode. expr ( ) - OpcodeId :: STATICCALL . expr ( ) ) ;
98
+ let is_call = cb. is_eq ( opcode. expr ( ) , OpcodeId :: CALL . expr ( ) ) ;
99
+ let is_callcode = cb. is_eq ( opcode. expr ( ) , OpcodeId :: CALLCODE . expr ( ) ) ;
100
+ let is_delegatecall = cb. is_eq ( opcode. expr ( ) , OpcodeId :: DELEGATECALL . expr ( ) ) ;
101
+ let is_staticcall = cb. is_eq ( opcode. expr ( ) , OpcodeId :: STATICCALL . expr ( ) ) ;
103
102
104
103
// Use rw_counter of the step which triggers next call as its call_id.
105
104
let callee_call_id = cb. curr . state . rw_counter . clone ( ) ;
@@ -196,9 +195,9 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
196
195
// rwc_delta = 8 + is_delegatecall * 2 + call_gadget.rw_delta() +
197
196
// callee_reversion_info.rw_delta()
198
197
let is_insufficient_balance =
199
- LtWordGadget :: construct ( cb , & caller_balance. to_word ( ) , & call_gadget. value . to_word ( ) ) ;
198
+ cb . is_lt_word ( & caller_balance. to_word ( ) , & call_gadget. value . to_word ( ) ) ;
200
199
// depth < 1025
201
- let is_depth_ok = LtGadget :: construct ( cb , depth. expr ( ) , 1025 . expr ( ) ) ;
200
+ let is_depth_ok = cb . is_lt ( depth. expr ( ) , 1025 . expr ( ) ) ;
202
201
203
202
let is_precheck_ok = and:: expr ( [
204
203
is_depth_ok. expr ( ) ,
@@ -215,18 +214,15 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
215
214
216
215
// whether the call is to a precompiled contract.
217
216
// precompile contracts are stored from address 0x01 to 0x09.
218
- let is_code_address_zero = IsZeroGadget :: construct ( cb, call_gadget. callee_address . expr ( ) ) ;
219
- let is_precompile_lt =
220
- LtGadget :: construct ( cb, call_gadget. callee_address . expr ( ) , 0x0A . expr ( ) ) ;
217
+ let is_code_address_zero = cb. is_zero ( call_gadget. callee_address . expr ( ) ) ;
218
+ let is_precompile_lt = cb. is_lt ( call_gadget. callee_address . expr ( ) , 0x0A . expr ( ) ) ;
221
219
let is_precompile = and:: expr ( [
222
220
not:: expr ( is_code_address_zero. expr ( ) ) ,
223
221
is_precompile_lt. expr ( ) ,
224
222
] ) ;
225
223
let precompile_return_length = cb. query_cell ( ) ;
226
- let precompile_return_length_zero =
227
- IsZeroGadget :: construct ( cb, precompile_return_length. expr ( ) ) ;
228
- let precompile_return_data_copy_size = MinMaxGadget :: construct (
229
- cb,
224
+ let precompile_return_length_zero = cb. is_zero ( precompile_return_length. expr ( ) ) ;
225
+ let precompile_return_data_copy_size = cb. min_max (
230
226
precompile_return_length. expr ( ) ,
231
227
call_gadget. rd_address . length ( ) ,
232
228
) ;
@@ -275,10 +271,10 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
275
271
let gas_cost = call_gadget. gas_cost_expr ( is_warm_prev. expr ( ) , is_call. expr ( ) ) ;
276
272
// Apply EIP 150
277
273
let gas_available = cb. curr . state . gas_left . expr ( ) - gas_cost. clone ( ) ;
278
- let one_64th_gas = ConstantDivisionGadget :: construct ( cb , gas_available. clone ( ) , 64 ) ;
274
+ let one_64th_gas = cb . div_by_const ( gas_available. clone ( ) , 64 ) ;
279
275
let all_but_one_64th_gas = gas_available - one_64th_gas. quotient ( ) ;
280
276
let capped_callee_gas_left =
281
- MinMaxGadget :: construct ( cb , call_gadget. gas_expr ( ) , all_but_one_64th_gas. clone ( ) ) ;
277
+ cb . min_max ( call_gadget. gas_expr ( ) , all_but_one_64th_gas. clone ( ) ) ;
282
278
let callee_gas_left = select:: expr (
283
279
call_gadget. gas_is_u64 . expr ( ) ,
284
280
capped_callee_gas_left. min ( ) ,
@@ -480,10 +476,10 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
480
476
let callee_gas_left = callee_gas_left. expr ( )
481
477
+ call_gadget. has_value . clone ( ) * GAS_STIPEND_CALL_WITH_VALUE . expr ( ) ;
482
478
483
- let precompile_output_word_size_div: ConstantDivisionGadget < F , N_BYTES_U64 > =
484
- ConstantDivisionGadget :: construct ( cb , precompile_output_rws. expr ( ) , 32 ) ;
479
+ let precompile_output_word_size_div =
480
+ cb . div_by_const ( precompile_output_rws. expr ( ) , 32 ) ;
485
481
let precompile_output_word_size_div_remainder_zero =
486
- IsZeroGadget :: construct ( cb , precompile_output_word_size_div. remainder ( ) ) ;
482
+ cb . is_zero ( precompile_output_word_size_div. remainder ( ) ) ;
487
483
let precompile_output_word_size = precompile_output_word_size_div. quotient ( )
488
484
+ 1 . expr ( )
489
485
- precompile_output_word_size_div_remainder_zero. expr ( ) ;
@@ -891,22 +887,26 @@ impl<F: Field> ExecutionGadget<F> for CallOpGadget<F> {
891
887
self . is_call . assign (
892
888
region,
893
889
offset,
894
- F :: from ( opcode. as_u64 ( ) ) - F :: from ( OpcodeId :: CALL . as_u64 ( ) ) ,
890
+ F :: from ( opcode. as_u64 ( ) ) ,
891
+ F :: from ( OpcodeId :: CALL . as_u64 ( ) ) ,
895
892
) ?;
896
893
self . is_callcode . assign (
897
894
region,
898
895
offset,
899
- F :: from ( opcode. as_u64 ( ) ) - F :: from ( OpcodeId :: CALLCODE . as_u64 ( ) ) ,
896
+ F :: from ( opcode. as_u64 ( ) ) ,
897
+ F :: from ( OpcodeId :: CALLCODE . as_u64 ( ) ) ,
900
898
) ?;
901
899
self . is_delegatecall . assign (
902
900
region,
903
901
offset,
904
- F :: from ( opcode. as_u64 ( ) ) - F :: from ( OpcodeId :: DELEGATECALL . as_u64 ( ) ) ,
902
+ F :: from ( opcode. as_u64 ( ) ) ,
903
+ F :: from ( OpcodeId :: DELEGATECALL . as_u64 ( ) ) ,
905
904
) ?;
906
905
self . is_staticcall . assign (
907
906
region,
908
907
offset,
909
- F :: from ( opcode. as_u64 ( ) ) - F :: from ( OpcodeId :: STATICCALL . as_u64 ( ) ) ,
908
+ F :: from ( opcode. as_u64 ( ) ) ,
909
+ F :: from ( OpcodeId :: STATICCALL . as_u64 ( ) ) ,
910
910
) ?;
911
911
self . tx_id
912
912
. assign ( region, offset, Value :: known ( F :: from ( tx_id. low_u64 ( ) ) ) ) ?;
0 commit comments