use super::calc_linear_cost;
use crate::{
crypto, eth_precompile_fn, EthPrecompileOutput, EthPrecompileResult, Precompile,
PrecompileHalt, PrecompileId,
};
eth_precompile_fn!(sha256_precompile, sha256_run);
eth_precompile_fn!(ripemd160_precompile, ripemd160_run);
pub const SHA256: Precompile = Precompile::new(
PrecompileId::Sha256,
crate::u64_to_address(2),
sha256_precompile,
);
pub const RIPEMD160: Precompile = Precompile::new(
PrecompileId::Ripemd160,
crate::u64_to_address(3),
ripemd160_precompile,
);
pub fn sha256_run(input: &[u8], gas_limit: u64) -> EthPrecompileResult {
let cost = calc_linear_cost(input.len(), 60, 12);
if cost > gas_limit {
Err(PrecompileHalt::OutOfGas)
} else {
let output = crypto().sha256(input);
Ok(EthPrecompileOutput::new(cost, output.to_vec().into()))
}
}
pub fn ripemd160_run(input: &[u8], gas_limit: u64) -> EthPrecompileResult {
let gas_used = calc_linear_cost(input.len(), 600, 120);
if gas_used > gas_limit {
Err(PrecompileHalt::OutOfGas)
} else {
let output = crypto().ripemd160(input);
Ok(EthPrecompileOutput::new(gas_used, output.to_vec().into()))
}
}