use crate::InteropProvider;
use alloy_primitives::{Address, B256};
use core::fmt::Debug;
use kona_registry::HashMap;
use thiserror::Error;
#[derive(Debug, Clone, PartialEq, Eq, Error)]
pub enum MessageGraphError<E: Debug> {
#[error("Dependency set is impossibly empty")]
EmptyDependencySet,
#[error("Missing a RollupConfig for chain ID {0}")]
MissingRollupConfig(u64),
#[error("Interop provider: {0}")]
InteropProviderError(#[from] E),
#[error("Remote message not found on chain ID {chain_id} with message hash {message_hash}")]
RemoteMessageNotFound {
chain_id: u64,
message_hash: B256,
},
#[error("Invalid message origin. Expected {expected}, got {actual}")]
InvalidMessageOrigin {
expected: Address,
actual: Address,
},
#[error("Invalid message hash. Expected {expected}, got {actual}")]
InvalidMessageHash {
expected: B256,
actual: B256,
},
#[error("Invalid message timestamp. Expected {expected}, got {actual}")]
InvalidMessageTimestamp {
expected: u64,
actual: u64,
},
#[error(
"Interop has not been active for at least one block on initiating message's chain. Activation time: {activation_time}, initiating message time: {initiating_message_time}"
)]
InitiatedTooEarly {
activation_time: u64,
initiating_message_time: u64,
},
#[error("Message is in the future. Expected timestamp to be <= {max}, got {actual}")]
MessageInFuture {
max: u64,
actual: u64,
},
#[error(
"Message has exceeded the expiry window. Initiating Timestamp: {initiating_timestamp}, Executing Timestamp: {executing_timestamp}"
)]
MessageExpired {
initiating_timestamp: u64,
executing_timestamp: u64,
},
#[error("Invalid messages found on chains: {0:?}")]
InvalidMessages(HashMap<u64, MessageGraphError<E>>),
}
#[allow(type_alias_bounds)]
pub type MessageGraphResult<T, P: InteropProvider> =
core::result::Result<T, MessageGraphError<P::Error>>;
#[derive(Debug, Clone, Error)]
pub enum SuperRootError {
#[error("Invalid super root version byte")]
InvalidVersionByte,
#[error("Unexpected encoded super root length")]
UnexpectedLength,
#[error("Slice conversion error: {0}")]
SliceConversionError(#[from] core::array::TryFromSliceError),
}
pub type SuperRootResult<T> = core::result::Result<T, SuperRootError>;
#[derive(Debug, Error, PartialEq, Eq)]
pub enum InteropValidationError {
#[error("interop not enabled")]
InteropNotEnabled,
#[error(
"executing timestamp is earlier than initiating timestamp, executing: {executing}, initiating: {initiating}"
)]
InvalidTimestampInvariant {
executing: u64,
initiating: u64,
},
#[error("timestamp outside allowed interop window, timestamp: {0}")]
InvalidInteropTimestamp(u64),
}