use midnight_proofs::plonk::Error as PlonkError;
use thiserror::Error;
use crate::StmError;
#[cfg_attr(not(test), allow(dead_code))]
#[derive(Debug, Error, Clone, PartialEq, Eq)]
pub enum StmCircuitError {
#[error(
"Circuit::validate_parameters failed: expected k < m <= 2^LOTTERY_BIT_BOUND - 1, got k={k}, m={m}"
)]
InvalidCircuitParameters { k: u32, m: u32 },
#[error("Circuit::validate_witness_length failed: expected k {expected_k}, got {actual}")]
WitnessLengthMismatch { expected_k: u32, actual: u32 },
#[error(
"Circuit::validate_lottery_index failed: index ({index}) exceeds max supported ({max_supported})"
)]
LotteryIndexTooLarge { index: u64, max_supported: u64 },
#[error("Circuit::validate_lottery_index failed: index ({index}) must be lower than m ({m})")]
LotteryIndexOutOfBounds { index: u64, m: u32 },
#[error(
"Circuit::validate_merkle_sibling_length failed: expected depth {expected_depth}, got {actual}"
)]
MerkleSiblingLengthMismatch { expected_depth: u32, actual: u32 },
#[error(
"Circuit::validate_merkle_position_length failed: expected depth {expected_depth}, got {actual}"
)]
MerklePositionLengthMismatch { expected_depth: u32, actual: u32 },
#[error("Field modulus parse failed")]
FieldModulusParseFailed,
#[error("Field element conversion failed")]
FieldElementConversionFailed,
#[error("Invalid bit decomposition range ({num_bits}) for field size ({field_bits})")]
InvalidBitDecompositionRange { num_bits: u32, field_bits: u32 },
#[error("Invalid merkle tree depth ({depth})")]
InvalidMerkleTreeDepth { depth: u32 },
#[error("Invalid selected leaf index ({index}) for {num_leaves} leaves")]
InvalidSelectedLeafIndex { index: u32, num_leaves: u32 },
#[error("Empty indices")]
EmptyIndices,
#[error("Witness too short (got {actual}, expected at least 2)")]
WitnessTooShort { actual: u32 },
#[error("No distinct witness entries")]
NoDistinctWitnessEntries,
#[error("Empty signer leaves")]
EmptySignerLeaves,
#[error("Invalid signer leaf index ({index}) for {num_signers} signers")]
InvalidSignerFixtureIndex { index: u32, num_signers: u32 },
#[error("Invalid challenge bytes")]
InvalidChallengeBytes,
#[error("Challenge endianness mismatch")]
ChallengeEndiannessMismatch,
#[error("Invalid merkle root digest length ({actual})")]
InvalidMerkleRootDigestLength { actual: u32 },
#[error("Non-canonical merkle root digest")]
NonCanonicalMerkleRootDigest,
#[error("Merkle path verification failed")]
MerklePathVerificationFailed,
#[error("Failed to create params assets directory")]
ParamsAssetsDirCreate,
#[error("Circuit keys cache lock poisoned ({operation})")]
CircuitKeysCacheLockPoisoned { operation: &'static str },
#[error("Signature generation failed")]
SignatureGenerationFailed,
#[error("Signature verification failed")]
SignatureVerificationFailed,
#[error("Proof verification rejected")]
VerificationRejected,
}
pub(crate) fn to_synthesis_error(error: StmError) -> PlonkError {
let error = match error.downcast::<PlonkError>() {
Ok(plonk_error) => return plonk_error,
Err(error) => error,
};
let error = match error.downcast::<StmCircuitError>() {
Ok(stm_error) => return PlonkError::Synthesis(stm_error.to_string()),
Err(error) => error,
};
PlonkError::Synthesis(error.to_string())
}