Skip to main content

anvil/eth/error/
optimism.rs

1//! Optimism-specific error conversions for [`BlockchainError`] and
2//! [`InvalidTransactionError`].
3
4use super::{BlockchainError, InvalidTransactionError};
5use op_revm::OpTransactionError;
6use revm::context_interface::result::{EVMError, InvalidHeader};
7
8impl<T> From<EVMError<T, OpTransactionError>> for BlockchainError
9where
10    T: Into<Self>,
11{
12    fn from(err: EVMError<T, OpTransactionError>) -> Self {
13        match err {
14            EVMError::Transaction(err) => match err {
15                OpTransactionError::Base(err) => InvalidTransactionError::from(err).into(),
16                OpTransactionError::DepositSystemTxPostRegolith => {
17                    Self::DepositTransactionUnsupported
18                }
19                OpTransactionError::HaltedDepositPostRegolith => {
20                    Self::DepositTransactionUnsupported
21                }
22                OpTransactionError::MissingEnvelopedTx => Self::InvalidTransaction(err.into()),
23            },
24            EVMError::Header(err) => match err {
25                InvalidHeader::ExcessBlobGasNotSet => Self::ExcessBlobGasNotSet,
26                InvalidHeader::PrevrandaoNotSet => Self::PrevrandaoNotSet,
27            },
28            EVMError::Database(err) => err.into(),
29            EVMError::Custom(err) => Self::Message(err),
30            EVMError::CustomAny(err) => Self::Message(err.to_string()),
31        }
32    }
33}
34
35impl<T> From<EVMError<T, alloy_op_evm::OpTxError>> for BlockchainError
36where
37    T: Into<Self>,
38{
39    fn from(err: EVMError<T, alloy_op_evm::OpTxError>) -> Self {
40        match err {
41            EVMError::Transaction(err) => {
42                let op_err: OpTransactionError = err.0;
43                EVMError::<T, OpTransactionError>::Transaction(op_err).into()
44            }
45            EVMError::Header(err) => EVMError::<T, OpTransactionError>::Header(err).into(),
46            EVMError::Database(err) => err.into(),
47            EVMError::Custom(err) => Self::Message(err),
48            EVMError::CustomAny(err) => Self::Message(err.to_string()),
49        }
50    }
51}
52
53impl From<OpTransactionError> for InvalidTransactionError {
54    fn from(value: OpTransactionError) -> Self {
55        match value {
56            OpTransactionError::Base(err) => err.into(),
57            OpTransactionError::DepositSystemTxPostRegolith
58            | OpTransactionError::HaltedDepositPostRegolith => Self::DepositTxErrorPostRegolith,
59            OpTransactionError::MissingEnvelopedTx => Self::MissingEnvelopedTx,
60        }
61    }
62}