use std::io;
use dusk_bytes::Serializable;
use dusk_core::signatures::bls::PublicKey as BlsPublicKey;
use dusk_core::transfer::phoenix::CoreError as PhoenixError;
use dusk_core::{BlsScalar, Error as ExecErr};
use dusk_vm::Error as VMError;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("Out of gas")]
OutOfGas,
#[error("Nullifiers already spent: {0:?}")]
RepeatingNullifiers(Vec<BlsScalar>),
#[error("Double nullifiers")]
DoubleNullifiers,
#[error("Nonce repeat: {} {1}", bs58::encode(.0.to_bytes()).into_string())]
RepeatingNonce(Box<BlsPublicKey>, u64),
#[error("Expected: 0 < (inputs: {0}) < 5, 0 ≤ (outputs: {1}) < 3")]
InvalidCircuitArguments(usize, usize),
#[error("Failed to fetch opening of position {0}")]
OpeningPositionNotFound(u64),
#[error("Serialization Error: {0:?}")]
Serialization(dusk_bytes::Error),
#[error("Transaction Error: {0}")]
Transaction(ExecErr),
#[error("Phoenix Error: {0}")]
Phoenix(PhoenixError),
#[error("VM Error: {0}")]
Vm(#[from] VMError),
#[error("IO Error: {0}")]
Io(#[from] io::Error),
#[error("Other Error: {0}")]
Other(#[from] Box<dyn std::error::Error>),
#[error("Commit not found, id = {}", hex::encode(.0))]
CommitNotFound([u8; 32]),
#[error("Invalid credits: H= {0}, credits= {1}")]
InvalidCreditsCount(u64, usize),
#[error("The memo size {0} is too large")]
MemoTooLarge(usize),
#[error("Blob error: {0}")]
Blob(String),
}
impl From<dusk_core::Error> for Error {
fn from(err: ExecErr) -> Self {
match err {
ExecErr::InsufficientBalance => {
Self::Transaction(ExecErr::InsufficientBalance)
}
ExecErr::Replay => Self::Transaction(ExecErr::Replay),
ExecErr::PhoenixOwnership => {
Self::Transaction(ExecErr::PhoenixOwnership)
}
ExecErr::PhoenixCircuit(e) => {
Self::Transaction(ExecErr::PhoenixCircuit(e))
}
ExecErr::PhoenixProver(e) => {
Self::Transaction(ExecErr::PhoenixProver(e))
}
ExecErr::InvalidData => {
Self::Serialization(dusk_bytes::Error::InvalidData)
}
ExecErr::BadLength(found, expected) => {
Self::Serialization(dusk_bytes::Error::BadLength {
found,
expected,
})
}
ExecErr::InvalidChar(ch, index) => {
Self::Serialization(dusk_bytes::Error::InvalidChar {
ch,
index,
})
}
ExecErr::Rkyv(e) => Self::Transaction(ExecErr::Rkyv(e)),
ExecErr::MemoTooLarge(size) => Self::MemoTooLarge(size),
ExecErr::Blob(e) => Self::Blob(e),
}
}
}
impl From<dusk_bytes::Error> for Error {
fn from(err: dusk_bytes::Error) -> Self {
Self::Serialization(err)
}
}
impl From<PhoenixError> for Error {
fn from(pe: PhoenixError) -> Self {
Self::Phoenix(pe)
}
}