use std::error;
use derive_more::Display;
use vapory_types::Address;
use tetsy_rlp::DecoderError;
use vaptrie::TrieError;
use types::{
errors::{VapcoreError, ExecutionError},
transaction::Error as TransactionError,
};
use crypto::publickey::Error as CryptoError;
use txpool::VerifiedTransaction;
use crate::private_transactions::VerifiedPrivateTransaction;
use serde_json::{Error as SerdeError};
type TxPoolError = txpool::Error<<VerifiedPrivateTransaction as VerifiedTransaction>::Hash>;
#[derive(Debug, Display)]
pub enum Error {
#[display(fmt = "Io Error: {}", _0)]
Io(::std::io::Error),
#[display(fmt = "Decoder Error: {}", _0)]
Decoder(DecoderError),
#[display(fmt = "Trie Error: {}", _0)]
Trie(TrieError),
#[display(fmt = "Transaction Pool Error: {}", _0)]
TxPool(TxPoolError),
#[display(fmt = "Crypto Error {}", _0)]
Crypto(CryptoError),
#[display(fmt = "Serialization Error {}", _0)]
Json(SerdeError),
#[display(fmt = "Encryption error. ({})", _0)]
Encrypt(String),
#[display(fmt = "Decryption error. ({})", _0)]
Decrypt(String),
#[display(fmt = "Private transaction execution is not authorised for {}", _0)]
NotAuthorised(Address),
#[display(fmt = "Private transaction created too many contracts")]
TooManyContracts,
#[display(fmt = "Contract call error. ({})", _0)]
Call(String),
#[display(fmt = "State is not available")]
StatePruned,
#[display(fmt = "State is incorrect")]
StateIncorrect,
#[display(fmt = "Wrong private transaction type")]
BadTransactionType,
#[display(fmt = "Contract does not exist or was not created")]
ContractDoesNotExist,
#[display(fmt = "Reference to the client is corrupted")]
ClientIsMalformed,
#[display(fmt = "Queue of private transactions for verification is full")]
QueueIsFull,
#[display(fmt = "The transaction already exists in queue of private transactions.")]
PrivateTransactionAlreadyImported,
#[display(fmt = "The information about private transaction is not found in the store.")]
PrivateTransactionNotFound,
#[display(fmt = "Account for signing public transactions not set.")]
SignerAccountNotSet,
#[display(fmt = "Account for validating private transactions not set.")]
ValidatorAccountNotSet,
#[display(fmt = "Account for signing requests to key server not set.")]
KeyServerAccountNotSet,
#[display(fmt = "Private state for the contract was not found in the local storage.")]
PrivateStateNotFound,
#[display(fmt = "Cannot write state to the local database.")]
DatabaseWriteError,
#[display(fmt = "Encryption key is not found on key server for {}", _0)]
EncryptionKeyNotFound(Address),
#[display(fmt = "Key server URL is not set.")]
KeyServerNotSet,
#[display(fmt = "Private transaction not found in logs.")]
TxNotFoundInLog,
#[display(fmt = "Path for logging not set.")]
LoggingPathNotSet,
#[display(fmt = "Timestamp overflow error.")]
TimestampOverflow,
#[display(fmt = "VM execution error {}", _0)]
Execution(ExecutionError),
#[display(fmt = "Error of transactions processing {}", _0)]
Transaction(TransactionError),
#[display(fmt = "General vapcore error {}", _0)]
Vapcore(VapcoreError),
#[display(fmt = "{}", _0)]
Msg(String),
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
Error::Decoder(e) => Some(e),
Error::Trie(e) => Some(e),
Error::TxPool(e) => Some(e),
Error::Json(e) => Some(e),
Error::Crypto(e) => Some(e),
Error::Execution(e) => Some(e),
Error::Transaction(e) => Some(e),
Error::Vapcore(e) => Some(e),
_ => None,
}
}
}
impl From<String> for Error {
fn from(s: String) -> Self {
Error::Msg(s)
}
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err).into()
}
}
impl From<CryptoError> for Error {
fn from(err: CryptoError) -> Self {
Error::Crypto(err).into()
}
}
impl From<DecoderError> for Error {
fn from(err: DecoderError) -> Self {
Error::Decoder(err).into()
}
}
impl From<ExecutionError> for Error {
fn from(err: ExecutionError) -> Self {
Error::Execution(err).into()
}
}
impl From<TransactionError> for Error {
fn from(err: TransactionError) -> Self {
Error::Transaction(err).into()
}
}
impl From<TrieError> for Error {
fn from(err: TrieError) -> Self {
Error::Trie(err).into()
}
}
impl From<TxPoolError> for Error {
fn from(err: TxPoolError) -> Self {
Error::TxPool(err).into()
}
}
impl From<SerdeError> for Error {
fn from(err: SerdeError) -> Self {
Error::Json(err).into()
}
}
impl From<VapcoreError> for Error {
fn from(err: VapcoreError) -> Self {
Error::Vapcore(err).into()
}
}
impl<E> From<Box<E>> for Error where Error: From<E> {
fn from(err: Box<E>) -> Error {
Error::from(*err)
}
}