light_hasher/
errors.rs

1use light_poseidon::PoseidonError;
2use thiserror::Error;
3
4use crate::poseidon::PoseidonSyscallError;
5
6#[derive(Debug, Error, PartialEq)]
7pub enum HasherError {
8    #[error("Integer overflow, value too large")]
9    IntegerOverflow,
10    #[error("Poseidon hasher error: {0}")]
11    Poseidon(#[from] PoseidonError),
12    #[error("Poseidon syscall error: {0}")]
13    PoseidonSyscall(#[from] PoseidonSyscallError),
14    #[error("Unknown Solana syscall error: {0}")]
15    UnknownSolanaSyscall(u64),
16    #[error("Allowed input length {0} provided {1}")]
17    InvalidInputLength(usize, usize),
18    #[error("Invalid number of fields")]
19    InvalidNumFields,
20    #[error("Empty input")]
21    EmptyInput,
22    #[error("Borsh serialization failed.")]
23    BorshError,
24    #[error(
25        "Option hash to field size returned [0u8;32], a collision with None for an Option type."
26    )]
27    OptionHashToFieldSizeZero,
28}
29
30// NOTE(vadorovsky): Unfortunately, we need to do it by hand. `num_derive::ToPrimitive`
31// doesn't support data-carrying enums.
32impl From<HasherError> for u32 {
33    fn from(e: HasherError) -> u32 {
34        match e {
35            HasherError::IntegerOverflow => 7001,
36            HasherError::Poseidon(_) => 7002,
37            HasherError::PoseidonSyscall(e) => (u64::from(e)).try_into().unwrap_or(7003),
38            HasherError::UnknownSolanaSyscall(e) => e.try_into().unwrap_or(7004),
39            HasherError::InvalidInputLength(_, _) => 7005,
40            HasherError::InvalidNumFields => 7006,
41            HasherError::EmptyInput => 7007,
42            HasherError::BorshError => 7008,
43            HasherError::OptionHashToFieldSizeZero => 7009,
44        }
45    }
46}
47
48#[cfg(feature = "solana")]
49impl From<HasherError> for solana_program_error::ProgramError {
50    fn from(e: HasherError) -> Self {
51        solana_program_error::ProgramError::Custom(e.into())
52    }
53}
54
55#[cfg(feature = "pinocchio")]
56impl From<HasherError> for pinocchio::program_error::ProgramError {
57    fn from(e: HasherError) -> Self {
58        pinocchio::program_error::ProgramError::Custom(e.into())
59    }
60}