miden-crypto/src/merkle/smt/full/error.rs
src/merkle/smt/full/error.rsRaw
1use alloc::vec::Vec;
2use core::fmt;
3
4use crate::{
5 hash::rpo::RpoDigest,
6 merkle::{LeafIndex, SMT_DEPTH},
7 Word,
8};
9
10// SMT LEAF ERROR
11// =================================================================================================
12
13#[derive(Clone, Debug, PartialEq, Eq)]
14pub enum SmtLeafError {
15 InconsistentKeys {
16 entries: Vec<(RpoDigest, Word)>,
17 key_1: RpoDigest,
18 key_2: RpoDigest,
19 },
20 InvalidNumEntriesForMultiple(usize),
21 SingleKeyInconsistentWithLeafIndex {
22 key: RpoDigest,
23 leaf_index: LeafIndex<SMT_DEPTH>,
24 },
25 MultipleKeysInconsistentWithLeafIndex {
26 leaf_index_from_keys: LeafIndex<SMT_DEPTH>,
27 leaf_index_supplied: LeafIndex<SMT_DEPTH>,
28 },
29}
30
31#[cfg(feature = "std")]
32impl std::error::Error for SmtLeafError {}
33
34impl fmt::Display for SmtLeafError {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36 use SmtLeafError::*;
37 match self {
38 InvalidNumEntriesForMultiple(num_entries) => {
39 write!(f, "Multiple leaf requires 2 or more entries. Got: {num_entries}")
40 }
41 InconsistentKeys { entries, key_1, key_2 } => {
42 write!(f, "Multiple leaf requires all keys to map to the same leaf index. Offending keys: {key_1} and {key_2}. Entries: {entries:?}.")
43 }
44 SingleKeyInconsistentWithLeafIndex { key, leaf_index } => {
45 write!(
46 f,
47 "Single key in leaf inconsistent with leaf index. Key: {key}, leaf index: {}",
48 leaf_index.value()
49 )
50 }
51 MultipleKeysInconsistentWithLeafIndex {
52 leaf_index_from_keys,
53 leaf_index_supplied,
54 } => {
55 write!(
56 f,
57 "Keys in entries map to leaf index {}, but leaf index {} was supplied",
58 leaf_index_from_keys.value(),
59 leaf_index_supplied.value()
60 )
61 }
62 }
63 }
64}
65
66// SMT PROOF ERROR
67// =================================================================================================
68
69#[derive(Clone, Debug, PartialEq, Eq)]
70pub enum SmtProofError {
71 InvalidPathLength(usize),
72}
73
74#[cfg(feature = "std")]
75impl std::error::Error for SmtProofError {}
76
77impl fmt::Display for SmtProofError {
78 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79 use SmtProofError::*;
80 match self {
81 InvalidPathLength(path_length) => {
82 write!(f, "Invalid Merkle path length. Expected {SMT_DEPTH}, got {path_length}")
83 }
84 }
85 }
86}