use alloc::{borrow::Cow, vec::Vec}; use ics23::CommitmentProof; use crate::{ error::ProofError, 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], #[allow(clippy::ptr_arg)] root: &Vec, // TODO(hu55a1n1): fix this using `Cow` types keys: &[Vec; 2], value: &[u8], ) -> Result<(), ProofError> { if root.is_empty() { return Err(ProofError::EmptyMerkleRoot); } self.0 .verify_against_root(proofs, keys, &Cow::Borrowed(value), root)? .then_some(()) .ok_or(ProofError::VerificationFailure) } } impl Default for CwVerifier<'_> { fn default() -> Self { let mv = MultiVerifier::new([ Ics23MembershipVerifier::new(ics23::iavl_spec()), Ics23MembershipVerifier::new(ics23::tendermint_spec()), ]); Self(mv) } }