arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
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}