use tari_service_framework::reply_channel::TransportChannelError;
use tari_transaction_components::{BanPeriod, BanReason, transaction_components::TransactionError};
use thiserror::Error;
use tokio::task::JoinError;
use crate::mempool::unconfirmed_pool::UnconfirmedPoolError;
#[derive(Debug, Error)]
pub enum MempoolError {
#[error("Unconfirmed pool error: `{0}`")]
UnconfirmedPoolError(#[from] UnconfirmedPoolError),
#[error("Transaction error: `{0}`")]
TransactionError(#[from] TransactionError),
#[error("Internal reply channel error: `{0}`")]
TransportChannelError(#[from] TransportChannelError),
#[error("The transaction did not contain any kernels")]
TransactionNoKernels,
#[error("Mempool lock poisoned. This indicates that the mempool has panicked while holding a RwLockGuard.")]
RwLockPoisonError,
#[error(transparent)]
BlockingTaskError(#[from] JoinError),
#[error("Internal error: {0}")]
InternalError(String),
#[error("Mempool indexes out of sync: transaction exists in txs_by_signature but not in tx_by_key")]
IndexOutOfSync,
}
impl MempoolError {
pub fn get_ban_reason(&self) -> Option<BanReason> {
match self {
_err @ MempoolError::UnconfirmedPoolError(e) => e.get_ban_reason(),
err @ MempoolError::TransactionError(_) | err @ MempoolError::TransactionNoKernels => Some(BanReason {
reason: err.to_string(),
ban_duration: BanPeriod::Long,
}),
err @ MempoolError::TransportChannelError(_) => Some(BanReason {
reason: err.to_string(),
ban_duration: BanPeriod::Short,
}),
_err @ MempoolError::RwLockPoisonError |
_err @ MempoolError::BlockingTaskError(_) |
_err @ MempoolError::InternalError(_) |
_err @ MempoolError::IndexOutOfSync => None,
}
}
}