use super::calc_linear_cost;
use crate::{
eth_precompile_fn, EthPrecompileOutput, EthPrecompileResult, Precompile, PrecompileHalt,
PrecompileId,
};
use primitives::Bytes;
eth_precompile_fn!(identity_precompile, identity_run);
pub const FUN: Precompile = Precompile::new(
PrecompileId::Identity,
crate::u64_to_address(4),
identity_precompile,
);
pub const IDENTITY_BASE: u64 = 15;
pub const IDENTITY_PER_WORD: u64 = 3;
pub fn identity_run(input: &[u8], gas_limit: u64) -> EthPrecompileResult {
let gas_used = calc_linear_cost(input.len(), IDENTITY_BASE, IDENTITY_PER_WORD);
if gas_used > gas_limit {
return Err(PrecompileHalt::OutOfGas);
}
Ok(EthPrecompileOutput::new(
gas_used,
Bytes::copy_from_slice(input),
))
}