revm_precompile/bls12_381/msm.rs
1use crate::bls12_381_const::MSM_MULTIPLIER;
2
3/// Implements the gas schedule for G1/G2 Multiscalar-multiplication assuming 30
4/// MGas/second, see also: <https://eips.ethereum.org/EIPS/eip-2537#g1g2-multiexponentiation>
5#[inline]
6pub fn msm_required_gas(k: usize, discount_table: &[u16], multiplication_cost: u64) -> u64 {
7 if k == 0 {
8 return 0;
9 }
10
11 let index = core::cmp::min(k - 1, discount_table.len() - 1);
12 let discount = discount_table[index] as u64;
13
14 (k as u64 * discount * multiplication_cost) / MSM_MULTIPLIER
15}