@@ -3,7 +3,7 @@ use super::{
3
3
from_bytes,
4
4
math_gadget:: { IsEqualWordGadget , IsZeroGadget , IsZeroWordGadget , LtGadget } ,
5
5
memory_gadget:: { CommonMemoryAddressGadget , MemoryExpansionGadget } ,
6
- AccountAddress , CachedRegion ,
6
+ CachedRegion ,
7
7
} ;
8
8
use crate :: {
9
9
evm_circuit:: {
@@ -28,7 +28,7 @@ use crate::{
28
28
} ;
29
29
use bus_mapping:: state_db:: CodeDB ;
30
30
use either:: Either ;
31
- use eth_types:: { evm_types:: GasCost , Field , ToAddress , ToLittleEndian , ToScalar , ToWord , U256 } ;
31
+ use eth_types:: { evm_types:: GasCost , Field , ToLittleEndian , ToScalar , ToWord , U256 } ;
32
32
use gadgets:: util:: { select, sum} ;
33
33
use halo2_proofs:: {
34
34
circuit:: Value ,
@@ -1052,7 +1052,7 @@ pub(crate) struct CommonCallGadget<F, MemAddrGadget, const IS_SUCCESS_CALL: bool
1052
1052
1053
1053
pub gas : Word32Cell < F > ,
1054
1054
pub gas_is_u64 : IsZeroGadget < F > ,
1055
- pub callee_address : AccountAddress < F > ,
1055
+ pub callee_address_word : Word32Cell < F > ,
1056
1056
pub value : Word32Cell < F > ,
1057
1057
pub cd_address : MemAddrGadget ,
1058
1058
pub rd_address : MemAddrGadget ,
@@ -1093,7 +1093,7 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
1093
1093
) ;
1094
1094
1095
1095
let gas_word = cb. query_word32 ( ) ;
1096
- let callee_address = cb. query_account_address ( ) ;
1096
+ let callee_address_word = cb. query_word32 ( ) ;
1097
1097
let value = cb. query_word32 ( ) ;
1098
1098
let is_success = cb. query_bool ( ) ;
1099
1099
@@ -1109,7 +1109,7 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
1109
1109
// For both CALL and STATICCALL, caller address is
1110
1110
// `current_callee_address` and callee address is `callee_address`.
1111
1111
cb. stack_pop ( gas_word. to_word ( ) ) ;
1112
- cb. stack_pop ( callee_address . to_word ( ) ) ;
1112
+ cb. stack_pop ( callee_address_word . to_word ( ) ) ;
1113
1113
1114
1114
// `CALL` and `CALLCODE` opcodes have an additional stack pop `value`.
1115
1115
cb. condition ( is_call. clone ( ) + is_callcode. clone ( ) , |cb| {
@@ -1142,8 +1142,10 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
1142
1142
) ;
1143
1143
1144
1144
let callee_code_hash = cb. query_word_unchecked ( ) ;
1145
+ let callee_address_normal = Self :: callee_address_valid ( & callee_address_word) ;
1146
+
1145
1147
cb. account_read (
1146
- callee_address . to_word ( ) ,
1148
+ callee_address_normal ,
1147
1149
AccountFieldTag :: CodeHash ,
1148
1150
callee_code_hash. to_word ( ) ,
1149
1151
) ;
@@ -1154,7 +1156,7 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
1154
1156
1155
1157
Self {
1156
1158
is_success,
1157
- callee_address ,
1159
+ callee_address_word ,
1158
1160
gas : gas_word,
1159
1161
gas_is_u64,
1160
1162
value,
@@ -1175,7 +1177,14 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
1175
1177
}
1176
1178
1177
1179
pub fn callee_address ( & self ) -> Word < Expression < F > > {
1178
- self . callee_address . to_word ( )
1180
+ Self :: callee_address_valid ( & self . callee_address_word )
1181
+ }
1182
+
1183
+ pub fn callee_address_valid ( callee_address_word : & Word32Cell < F > ) -> Word < Expression < F > > {
1184
+ let limbs: [ Expression < F > ; 32 ] = callee_address_word. limbs . clone ( ) . map ( |l| l. expr ( ) ) ;
1185
+ let callee_address_lo = from_bytes:: expr ( & limbs[ 0 ..16 ] ) ;
1186
+ let callee_address_hi = from_bytes:: expr ( & limbs[ 16 ..20 ] ) ;
1187
+ Word :: new ( [ callee_address_lo, callee_address_hi] )
1179
1188
}
1180
1189
1181
1190
pub fn gas_expr ( & self ) -> Expression < F > {
@@ -1216,8 +1225,9 @@ impl<F: Field, MemAddrGadget: CommonMemoryAddressGadget<F>, const IS_SUCCESS_CAL
1216
1225
callee_code_hash : U256 ,
1217
1226
) -> Result < u64 , Error > {
1218
1227
self . gas . assign_u256 ( region, offset, gas) ?;
1219
- self . callee_address
1220
- . assign_h160 ( region, offset, callee_address. to_address ( ) ) ?;
1228
+ self . callee_address_word
1229
+ . assign_u256 ( region, offset, callee_address) ?;
1230
+
1221
1231
self . value . assign_u256 ( region, offset, value) ?;
1222
1232
if IS_SUCCESS_CALL {
1223
1233
self . is_success
0 commit comments