Skip to main content

miden_objects/decoded/
error.rs

1use alloc::boxed::Box;
2use core::error::Error;
3
4#[cfg(test)]
5mod tests;
6
7/// A verification failure from a composite object, preserving its concrete domain source.
8///
9/// Nested verifiers propagate this wrapper unchanged instead of introducing an error enum at
10/// every layer. Walk the [`Error::source`] chain to distinguish domain failures or the invariant
11/// errors defined alongside individual verifiers. Generated collection wrappers attach field
12/// and index context when verified; other checks provide their own context.
13#[derive(Debug, thiserror::Error)]
14#[error("{0}")]
15pub struct VerificationError(#[source] Box<dyn Error + Send + Sync>);
16
17impl VerificationError {
18    pub fn new(source: impl Error + Send + Sync + 'static) -> Self {
19        let source: Box<dyn Error + Send + Sync> = Box::new(source);
20        match source.downcast::<Self>() {
21            Ok(error) => *error,
22            Err(source) => Self(source),
23        }
24    }
25}
26
27macro_rules! impl_verification_error_from {
28    ($($ty:ty),* $(,)?) => {$(
29        impl From<$ty> for VerificationError {
30            fn from(error: $ty) -> Self {
31                Self::new(error)
32            }
33        }
34    )*};
35}
36
37impl_verification_error_from!(
38    core::num::TryFromIntError,
39    miden_protobuf::ConversionError,
40    miden_protocol::assembly::mast::MastForestError,
41    miden_protocol::block::SignedBlockError,
42    miden_protocol::crypto::merkle::MerkleError,
43    miden_protocol::crypto::merkle::mmr::MmrError,
44    miden_protocol::crypto::merkle::smt::SmtLeafError,
45    miden_protocol::crypto::merkle::smt::SmtProofError,
46    miden_protocol::errors::AccountError,
47    miden_protocol::errors::AccountIdError,
48    miden_protocol::errors::AccountPatchError,
49    miden_protocol::errors::AccountTreeError,
50    miden_protocol::errors::AssetError,
51    miden_protocol::errors::AssetVaultError,
52    miden_protocol::errors::BatchAccountUpdateError,
53    miden_protocol::errors::BlockAccountUpdateError,
54    miden_protocol::errors::BlockBodyError,
55    miden_protocol::errors::NoteError,
56    miden_protocol::errors::OutputNoteError,
57    miden_protocol::errors::PartialAssetVaultError,
58    miden_protocol::errors::PartialBlockchainError,
59    miden_protocol::errors::ProposedBatchError,
60    miden_protocol::errors::ProtocolConfigError,
61    miden_protocol::errors::ProvenBatchError,
62    miden_protocol::errors::ProvenTransactionError,
63    miden_protocol::errors::StorageMapError,
64    miden_protocol::errors::StorageSlotNameError,
65    miden_protocol::errors::TransactionHeaderError,
66    miden_protocol::errors::TransactionInputError,
67    miden_protocol::errors::TransactionOutputError,
68    miden_protocol::errors::ValidatorConfigError,
69    miden_protocol::utils::serde::DeserializationError,
70    super::account::AccountHeaderError,
71    super::account::AccountPatchError,
72    super::account::AccountVersionError,
73    super::account::PartialStorageError,
74    super::account::StorageMapEntryError,
75    super::account::StorageMapPatchError,
76    super::account::VaultPatchError,
77    super::asset::AssetIdError,
78    super::asset::AssetVaultEntryError,
79    super::blockchain::BlockHeaderError,
80    super::blockchain::PartialBlockchainError,
81    super::note::NoteMetadataError,
82    super::note_file::CommittedNoteError,
83    super::primitives::AdviceError,
84    super::primitives::PartialMmrError,
85    super::primitives::PartialSmtError,
86    super::transaction::ForeignAccountSlotNameError,
87    super::transaction::InputNoteError,
88    super::transaction::ProposedBatchError,
89    super::transaction::ProvenBatchError,
90    super::transaction::TransactionArgsError,
91    super::transaction::TransactionHeaderBuildError,
92    super::transaction::TransactionInputsError,
93);