revm_precompile/bls12_381/
g1_add.rs1use super::crypto_backend::{encode_g1_point, p1_add_affine, read_g1_no_subgroup_check};
2use super::utils::remove_g1_padding;
3use crate::bls12_381_const::{
4 G1_ADD_ADDRESS, G1_ADD_BASE_GAS_FEE, G1_ADD_INPUT_LENGTH, PADDED_G1_LENGTH,
5};
6use crate::{PrecompileError, PrecompileOutput, PrecompileResult, PrecompileWithAddress};
7use primitives::Bytes;
8
9pub const PRECOMPILE: PrecompileWithAddress = PrecompileWithAddress(G1_ADD_ADDRESS, g1_add);
11
12pub(super) fn g1_add(input: &Bytes, gas_limit: u64) -> PrecompileResult {
18 if G1_ADD_BASE_GAS_FEE > gas_limit {
19 return Err(PrecompileError::OutOfGas);
20 }
21
22 if input.len() != G1_ADD_INPUT_LENGTH {
23 return Err(PrecompileError::Other(format!(
24 "G1ADD input should be {G1_ADD_INPUT_LENGTH} bytes, was {}",
25 input.len()
26 )));
27 }
28
29 let [a_x, a_y] = remove_g1_padding(&input[..PADDED_G1_LENGTH])?;
30 let [b_x, b_y] = remove_g1_padding(&input[PADDED_G1_LENGTH..])?;
31
32 let a_aff = &read_g1_no_subgroup_check(a_x, a_y)?;
37 let b_aff = &read_g1_no_subgroup_check(b_x, b_y)?;
38 let p_aff = p1_add_affine(a_aff, b_aff);
39
40 let out = encode_g1_point(&p_aff);
41 Ok(PrecompileOutput::new(G1_ADD_BASE_GAS_FEE, out.into()))
42}