use alloc::borrow::Cow; use alloc::vec::Vec; use ics23::CommitmentProof; use crate::error::ProofError; use crate::verifier::{ics23::Ics23MembershipVerifier, multi::MultiVerifier, Verifier}; type Key = Vec; type Value<'a> = Cow<'a, [u8]>; #[derive(Clone, Debug)] pub struct CwVerifier<'a>(MultiVerifier>, 2>); impl CwVerifier<'_> { pub fn verify( &self, proofs: &[CommitmentProof; 2], root: &Vec, keys: &[Vec; 2], value: &[u8], ) -> Result<(), ProofError> { if root.is_empty() { return Err(ProofError::EmptyMerkleRoot); } let value = Cow::Borrowed(value); let verified = self.0.verify_against_root(proofs, keys, &value, root)?; if !verified { return Err(ProofError::VerificationFailure); } Ok(()) } } impl Default for CwVerifier<'_> { fn default() -> Self { let mv = MultiVerifier::new([ Ics23MembershipVerifier::new(ics23::iavl_spec()), Ics23MembershipVerifier::new(ics23::tendermint_spec()), ]); Self(mv) } }