@@ -2,11 +2,17 @@ use primitive_types::{H160, U256};
22use zk_evm_abstractions:: {
33 aux:: Timestamp ,
44 precompiles:: {
5+ ecadd:: ecadd_function, ecmul:: ecmul_function, ecpairing:: ecpairing_function,
56 ecrecover:: ecrecover_function, keccak256:: keccak256_rounds_function,
6- secp256r1_verify:: secp256r1_verify_function, sha256:: sha256_rounds_function,
7+ modexp:: modexp_function, secp256r1_verify:: secp256r1_verify_function,
8+ sha256:: sha256_rounds_function,
79 } ,
810 queries:: { LogQuery , MemoryQuery } ,
911 vm:: Memory ,
12+ zkevm_opcode_defs:: {
13+ ECADD_PRECOMPILE_ADDRESS , ECMUL_PRECOMPILE_ADDRESS , ECPAIRING_PRECOMPILE_ADDRESS ,
14+ MODEXP_PRECOMPILE_ADDRESS ,
15+ } ,
1016} ;
1117use zkevm_opcode_defs:: {
1218 PrecompileCallABI , ECRECOVER_INNER_FUNCTION_PRECOMPILE_ADDRESS ,
@@ -67,7 +73,7 @@ impl Memory for LegacyIo<'_> {
6773 ) -> MemoryQuery {
6874 let start_word = query. location . index . 0 ;
6975 if query. rw_flag {
70- assert ! ( start_word < 2 , "standard precompiles never write >2 words" ) ;
76+ assert ! ( start_word < 3 , "standard precompiles never write >3 words" ) ;
7177 self . output . buffer [ start_word as usize ] = query. value ;
7278 self . output . len = self . output . len . max ( start_word + 1 ) ;
7379 } else {
@@ -126,6 +132,24 @@ impl Precompiles for LegacyPrecompiles {
126132 io. output
127133 . with_cycle_stats ( CycleStats :: Secp256r1Verify ( cycles as u32 ) )
128134 }
135+ MODEXP_PRECOMPILE_ADDRESS => {
136+ let cycles = modexp_function :: < _ , false > ( 0 , query, & mut io) . 0 ;
137+ io. output
138+ . with_cycle_stats ( CycleStats :: ModExp ( cycles as u32 ) )
139+ }
140+ ECADD_PRECOMPILE_ADDRESS => {
141+ let cycles = ecadd_function :: < _ , false > ( 0 , query, & mut io) . 0 ;
142+ io. output . with_cycle_stats ( CycleStats :: EcAdd ( cycles as u32 ) )
143+ }
144+ ECMUL_PRECOMPILE_ADDRESS => {
145+ let cycles = ecmul_function :: < _ , false > ( 0 , query, & mut io) . 0 ;
146+ io. output . with_cycle_stats ( CycleStats :: EcMul ( cycles as u32 ) )
147+ }
148+ ECPAIRING_PRECOMPILE_ADDRESS => {
149+ let cycles = ecpairing_function :: < _ , false > ( 0 , query, & mut io) . 0 ;
150+ io. output
151+ . with_cycle_stats ( CycleStats :: EcPairing ( cycles as u32 ) )
152+ }
129153 _ => PrecompileOutput :: default ( ) ,
130154 }
131155 }
@@ -311,7 +335,7 @@ mod tests {
311335
312336 prop_assert_eq ! ( output. len, 2 ) ;
313337 let expected_address = key_to_address ( signing_key. verifying_key ( ) ) ;
314- let [ is_success, address] = output. buffer ;
338+ let [ is_success, address, _ ] = output. buffer ;
315339 if mutation. is_some ( ) {
316340 prop_assert_ne ! ( address, expected_address) ;
317341 } else {
@@ -416,7 +440,7 @@ mod tests {
416440 LegacyPrecompiles . call_precompile ( SECP256R1_VERIFY_PRECOMPILE_ADDRESS , memory, 0 ) ;
417441
418442 prop_assert_eq ! ( output. len, 2 ) ;
419- let [ is_ok, is_verified] = output. buffer ;
443+ let [ is_ok, is_verified, _ ] = output. buffer ;
420444 if mutation. is_none ( ) {
421445 prop_assert_eq ! ( is_ok, U256 :: one( ) ) ;
422446 prop_assert_eq ! ( is_verified, U256 :: one( ) ) ;
0 commit comments