use datasize::DataSize;
use thiserror::Error;
use casper_storage::{system::transfer::TransferError, tracking_copy::TrackingCopyError};
use casper_types::{bytesrepr, system::mint, ApiError, Digest, Key, ProtocolVersion};
use super::InvalidRequest;
use crate::{
execution::ExecError,
runtime::{stack, PreprocessingError},
};
#[derive(Clone, Error, Debug)]
#[non_exhaustive]
pub enum Error {
#[error("Root not found: {0}")]
RootNotFound(Digest),
#[error("Invalid protocol version: {0}")]
InvalidProtocolVersion(ProtocolVersion),
#[error("Wasm preprocessing error: {0}")]
WasmPreprocessing(#[from] PreprocessingError),
#[error(transparent)]
Exec(ExecError),
#[error("Bytesrepr error: {0}")]
Bytesrepr(String),
#[error("Mint error: {0}")]
Mint(String),
#[error("Unsupported key type: {0}")]
InvalidKeyVariant(Key),
#[error("Runtime stack overflow")]
RuntimeStackOverflow,
#[error("Tracking copy error: {0}")]
TrackingCopy(TrackingCopyError),
#[error("Transfer error: {0}")]
Transfer(TransferError),
#[error("Invalid executable item: {0}")]
InvalidExecutableItem(#[from] InvalidRequest),
}
impl Error {
pub fn reverter(api_error: impl Into<ApiError>) -> Error {
Error::Exec(ExecError::Revert(api_error.into()))
}
}
impl From<TransferError> for Error {
fn from(err: TransferError) -> Self {
Error::Transfer(err)
}
}
impl From<ExecError> for Error {
fn from(error: ExecError) -> Self {
match error {
ExecError::WasmPreprocessing(preprocessing_error) => {
Error::WasmPreprocessing(preprocessing_error)
}
_ => Error::Exec(error),
}
}
}
impl From<bytesrepr::Error> for Error {
fn from(error: bytesrepr::Error) -> Self {
Error::Bytesrepr(format!("{}", error))
}
}
impl From<mint::Error> for Error {
fn from(error: mint::Error) -> Self {
Error::Mint(format!("{}", error))
}
}
impl From<stack::RuntimeStackOverflow> for Error {
fn from(_: stack::RuntimeStackOverflow) -> Self {
Self::RuntimeStackOverflow
}
}
impl From<TrackingCopyError> for Error {
fn from(e: TrackingCopyError) -> Self {
Error::TrackingCopy(e)
}
}
impl DataSize for Error {
const IS_DYNAMIC: bool = true;
const STATIC_HEAP_SIZE: usize = 0;
#[inline]
fn estimate_heap_size(&self) -> usize {
12 }
}