pallet_revive/precompiles/builtin/
ripemd160.rs1use crate::{
19 precompiles::{BuiltinAddressMatcher, Error, Ext, PrimitivePrecompile},
20 vm::RuntimeCosts,
21 Config,
22};
23use alloc::vec::Vec;
24use core::{marker::PhantomData, num::NonZero};
25use ripemd::Digest;
26
27pub struct Ripemd160<T>(PhantomData<T>);
28
29impl<T: Config> PrimitivePrecompile for Ripemd160<T> {
30 type T = T;
31 const MATCHER: BuiltinAddressMatcher = BuiltinAddressMatcher::Fixed(NonZero::new(3).unwrap());
32 const HAS_CONTRACT_INFO: bool = false;
33
34 fn call(
35 _address: &[u8; 20],
36 input: Vec<u8>,
37 env: &mut impl Ext<T = Self::T>,
38 ) -> Result<Vec<u8>, Error> {
39 env.gas_meter_mut().charge(RuntimeCosts::Ripemd160(input.len() as _))?;
40 let mut ret = [0u8; 32];
41 ret[12..32].copy_from_slice(&ripemd::Ripemd160::digest(input));
42 Ok(ret.to_vec())
43 }
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49 use crate::{precompiles::tests::run_test_vectors, tests::Test};
50
51 #[test]
52 fn test_ripemd160() {
53 run_test_vectors::<Ripemd160<Test>>(include_str!("./testdata/3-ripemd160.json"));
54 }
55}