use core::fmt; use crate::{ hash::rpo::RpoDigest, merkle::{LeafIndex, SMT_DEPTH}, utils::collections::*, Word, }; // SMT LEAF ERROR // ================================================================================================= #[derive(Clone, Debug, PartialEq, Eq)] pub enum SmtLeafError { InconsistentKeys { entries: Vec<(RpoDigest, Word)>, key_1: RpoDigest, key_2: RpoDigest, }, InvalidNumEntriesForMultiple(usize), SingleKeyInconsistentWithLeafIndex { key: RpoDigest, leaf_index: LeafIndex, }, MultipleKeysInconsistentWithLeafIndex { leaf_index_from_keys: LeafIndex, leaf_index_supplied: LeafIndex, }, } #[cfg(feature = "std")] impl std::error::Error for SmtLeafError {} impl fmt::Display for SmtLeafError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use SmtLeafError::*; match self { InvalidNumEntriesForMultiple(num_entries) => { write!(f, "Multiple leaf requires 2 or more entries. Got: {num_entries}") } InconsistentKeys { entries, key_1, key_2 } => { write!(f, "Multiple leaf requires all keys to map to the same leaf index. Offending keys: {key_1} and {key_2}. Entries: {entries:?}.") } SingleKeyInconsistentWithLeafIndex { key, leaf_index } => { write!( f, "Single key in leaf inconsistent with leaf index. Key: {key}, leaf index: {}", leaf_index.value() ) } MultipleKeysInconsistentWithLeafIndex { leaf_index_from_keys, leaf_index_supplied, } => { write!( f, "Keys in entries map to leaf index {}, but leaf index {} was supplied", leaf_index_from_keys.value(), leaf_index_supplied.value() ) } } } } // SMT PROOF ERROR // ================================================================================================= #[derive(Clone, Debug, PartialEq, Eq)] pub enum SmtProofError { InvalidPathLength(usize), } #[cfg(feature = "std")] impl std::error::Error for SmtProofError {} impl fmt::Display for SmtProofError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use SmtProofError::*; match self { InvalidPathLength(path_length) => { write!(f, "Invalid Merkle path length. Expected {SMT_DEPTH}, got {path_length}") } } } }