kona_engine/task_queue/tasks/build/
error.rs1use crate::{
4 EngineTaskError, InsertTaskError, SynchronizeTaskError,
5 task_queue::tasks::task::EngineTaskErrorSeverity,
6};
7use alloy_rpc_types_engine::PayloadStatusEnum;
8use alloy_transport::{RpcError, TransportErrorKind};
9use kona_protocol::FromBlockError;
10use op_alloy_rpc_types_engine::OpExecutionPayloadEnvelope;
11use thiserror::Error;
12use tokio::sync::mpsc;
13
14#[derive(Debug, Error)]
29pub enum EngineBuildError {
30 #[error("Finalized head is ahead of unsafe head")]
32 FinalizedAheadOfUnsafe(u64, u64),
33 #[error("Failed to build payload attributes in the engine. Forkchoice RPC error: {0}")]
35 AttributesInsertionFailed(#[from] RpcError<TransportErrorKind>),
36 #[error("The inserted payload is invalid: {0}")]
38 InvalidPayload(String),
39 #[error("The inserted payload status is unexpected: {0}")]
41 UnexpectedPayloadStatus(PayloadStatusEnum),
42 #[error("The inserted payload ID is missing")]
44 MissingPayloadId,
45 #[error("The engine is syncing")]
47 EngineSyncing,
48}
49
50#[derive(Debug, Error)]
52pub enum BuildTaskError {
53 #[error("An error occurred when building the payload attributes to the engine.")]
55 EngineBuildError(EngineBuildError),
56 #[error(transparent)]
58 ForkchoiceUpdateFailed(#[from] SynchronizeTaskError),
59 #[error(transparent)]
61 PayloadInsertionFailed(#[from] InsertTaskError),
62 #[error(transparent)]
64 GetPayloadFailed(RpcError<TransportErrorKind>),
65 #[error("Deposit-only payload failed to import")]
67 DepositOnlyPayloadFailed,
68 #[error("Failed to re-attempt payload import with deposit-only payload")]
70 DepositOnlyPayloadReattemptFailed,
71 #[error("Invalid payload, must flush post-holocene")]
74 HoloceneInvalidFlush,
75 #[error(transparent)]
80 FromBlock(#[from] FromBlockError),
81 #[error(transparent)]
83 MpscSend(#[from] mpsc::error::SendError<OpExecutionPayloadEnvelope>),
84}
85
86impl EngineTaskError for BuildTaskError {
87 fn severity(&self) -> EngineTaskErrorSeverity {
88 match self {
89 Self::ForkchoiceUpdateFailed(inner) => inner.severity(),
90 Self::PayloadInsertionFailed(inner) => inner.severity(),
91 Self::EngineBuildError(EngineBuildError::FinalizedAheadOfUnsafe(_, _)) => {
92 EngineTaskErrorSeverity::Critical
93 }
94 Self::EngineBuildError(EngineBuildError::AttributesInsertionFailed(_)) => {
95 EngineTaskErrorSeverity::Temporary
96 }
97 Self::EngineBuildError(EngineBuildError::InvalidPayload(_)) => {
98 EngineTaskErrorSeverity::Temporary
99 }
100 Self::EngineBuildError(EngineBuildError::UnexpectedPayloadStatus(_)) => {
101 EngineTaskErrorSeverity::Temporary
102 }
103 Self::EngineBuildError(EngineBuildError::MissingPayloadId) => {
104 EngineTaskErrorSeverity::Temporary
105 }
106 Self::EngineBuildError(EngineBuildError::EngineSyncing) => {
107 EngineTaskErrorSeverity::Temporary
108 }
109 Self::GetPayloadFailed(_) => EngineTaskErrorSeverity::Temporary,
110 Self::HoloceneInvalidFlush => EngineTaskErrorSeverity::Flush,
111 Self::DepositOnlyPayloadReattemptFailed => EngineTaskErrorSeverity::Critical,
112 Self::DepositOnlyPayloadFailed => EngineTaskErrorSeverity::Critical,
113 Self::FromBlock(_) => EngineTaskErrorSeverity::Critical,
114 Self::MpscSend(_) => EngineTaskErrorSeverity::Critical,
115 }
116 }
117}