//! Error types emitted by types or implementations of this crate. use reth_errors::{ProviderError, RethError}; use reth_primitives::{revm_primitives::EVMError, B256}; use reth_transaction_pool::BlobStoreError; use tokio::sync::oneshot; /// Possible error variants during payload building. #[derive(Debug, thiserror::Error)] pub enum PayloadBuilderError { /// Thrown when the parent block is missing. #[error("missing parent block {0}")] MissingParentBlock(B256), /// An oneshot channels has been closed. #[error("sender has been dropped")] ChannelClosed, /// If there's no payload to resolve. #[error("missing payload")] MissingPayload, /// Error occurring in the blob store. #[error(transparent)] BlobStore(#[from] BlobStoreError), /// Other internal error #[error(transparent)] Internal(#[from] RethError), /// Unrecoverable error during evm execution. #[error("evm execution error: {0}")] EvmExecutionError(EVMError), /// Thrown if the payload requests withdrawals before Shanghai activation. #[error("withdrawals set before Shanghai activation")] WithdrawalsBeforeShanghai, /// Any other payload building errors. #[error(transparent)] Other(Box), } impl PayloadBuilderError { /// Create a new error from a boxed error. pub fn other(error: E) -> Self where E: std::error::Error + Send + Sync + 'static, { Self::Other(Box::new(error)) } } impl From for PayloadBuilderError { fn from(error: ProviderError) -> Self { Self::Internal(RethError::Provider(error)) } } impl From for PayloadBuilderError { fn from(_: oneshot::error::RecvError) -> Self { Self::ChannelClosed } }