foundry_evm_core/
precompiles.rs1use alloy_primitives::{address, Address, Bytes, B256};
2use revm::{
3 precompile::{secp256r1::p256_verify as revm_p256_verify, PrecompileWithAddress},
4 primitives::{Precompile, PrecompileResult},
5};
6
7pub const EC_RECOVER: Address = address!("0000000000000000000000000000000000000001");
9
10pub const SHA_256: Address = address!("0000000000000000000000000000000000000002");
12
13pub const RIPEMD_160: Address = address!("0000000000000000000000000000000000000003");
15
16pub const IDENTITY: Address = address!("0000000000000000000000000000000000000004");
18
19pub const MOD_EXP: Address = address!("0000000000000000000000000000000000000005");
21
22pub const EC_ADD: Address = address!("0000000000000000000000000000000000000006");
24
25pub const EC_MUL: Address = address!("0000000000000000000000000000000000000007");
27
28pub const EC_PAIRING: Address = address!("0000000000000000000000000000000000000008");
30
31pub const BLAKE_2F: Address = address!("0000000000000000000000000000000000000009");
33
34pub const POINT_EVALUATION: Address = address!("000000000000000000000000000000000000000a");
36
37pub const PRECOMPILES: &[Address] = &[
39 EC_RECOVER,
40 SHA_256,
41 RIPEMD_160,
42 IDENTITY,
43 MOD_EXP,
44 EC_ADD,
45 EC_MUL,
46 EC_PAIRING,
47 BLAKE_2F,
48 POINT_EVALUATION,
49 ODYSSEY_P256_ADDRESS,
50];
51
52pub const ODYSSEY_P256_ADDRESS: Address = address!("0000000000000000000000000000000000000014");
56
57pub fn p256_verify(input: &Bytes, gas_limit: u64) -> PrecompileResult {
62 revm_p256_verify(input, gas_limit).map(|mut result| {
63 if result.bytes.is_empty() {
64 result.bytes = B256::default().into();
65 }
66
67 result
68 })
69}
70
71pub const ODYSSEY_P256: PrecompileWithAddress =
73 PrecompileWithAddress(ODYSSEY_P256_ADDRESS, Precompile::Standard(p256_verify));