revm_precompile/bls12_381/
g1_add.rs1use super::utils::{pad_g1_point, remove_g1_padding};
3use crate::{
4 bls12_381_const::{G1_ADD_ADDRESS, G1_ADD_BASE_GAS_FEE, G1_ADD_INPUT_LENGTH, PADDED_G1_LENGTH},
5 crypto, eth_precompile_fn, EthPrecompileOutput, EthPrecompileResult, Precompile,
6 PrecompileHalt, PrecompileId,
7};
8
9eth_precompile_fn!(g1_add_precompile, g1_add);
10
11pub const PRECOMPILE: Precompile =
13 Precompile::new(PrecompileId::Bls12G1Add, G1_ADD_ADDRESS, g1_add_precompile);
14
15pub fn g1_add(input: &[u8], gas_limit: u64) -> EthPrecompileResult {
21 if G1_ADD_BASE_GAS_FEE > gas_limit {
22 return Err(PrecompileHalt::OutOfGas);
23 }
24
25 if input.len() != G1_ADD_INPUT_LENGTH {
26 return Err(PrecompileHalt::Bls12381G1AddInputLength);
27 }
28
29 let [a_x, a_y] = remove_g1_padding(&input[..PADDED_G1_LENGTH])?;
31 let [b_x, b_y] = remove_g1_padding(&input[PADDED_G1_LENGTH..])?;
32
33 let a = (*a_x, *a_y);
34 let b = (*b_x, *b_y);
35
36 let unpadded_result = crypto().bls12_381_g1_add(a, b)?;
37
38 let padded_result = pad_g1_point(&unpadded_result);
40
41 Ok(EthPrecompileOutput::new(
42 G1_ADD_BASE_GAS_FEE,
43 padded_result.into(),
44 ))
45}