op_revm/
result.rs

1//! Contains the `[OpHaltReason]` type.
2use revm::context_interface::result::HaltReason;
3
4/// Optimism halt reason.
5#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub enum OpHaltReason {
8    /// Base halt reason.
9    Base(HaltReason),
10    /// Failed deposit halt reason.
11    FailedDeposit,
12}
13
14impl From<HaltReason> for OpHaltReason {
15    fn from(value: HaltReason) -> Self {
16        Self::Base(value)
17    }
18}
19
20impl TryFrom<OpHaltReason> for HaltReason {
21    type Error = OpHaltReason;
22
23    fn try_from(value: OpHaltReason) -> Result<HaltReason, OpHaltReason> {
24        match value {
25            OpHaltReason::Base(reason) => Ok(reason),
26            OpHaltReason::FailedDeposit => Err(value),
27        }
28    }
29}
30
31#[cfg(all(test, feature = "serde"))]
32mod tests {
33    use super::*;
34    use revm::context_interface::result::OutOfGasError;
35
36    #[test]
37    fn test_serialize_json_op_halt_reason() {
38        let response = r#"{"Base":{"OutOfGas":"Basic"}}"#;
39
40        let op_halt_reason: OpHaltReason = serde_json::from_str(response).unwrap();
41        assert_eq!(
42            op_halt_reason,
43            HaltReason::OutOfGas(OutOfGasError::Basic).into()
44        );
45    }
46}