arbos/arbos_types/
message_with_meta.rs

1use alloy_primitives::{keccak256, B256};
2
3use super::incoming_message::L1IncomingMessage;
4
5/// An L1 incoming message with additional metadata.
6#[derive(Debug, Clone)]
7pub struct MessageWithMetadata {
8    pub message: L1IncomingMessage,
9    pub delayed_messages_read: u64,
10}
11
12/// Extended message info including block hash and metadata.
13#[derive(Debug, Clone)]
14pub struct MessageWithMetadataAndBlockInfo {
15    pub message_with_meta: MessageWithMetadata,
16    pub block_hash: Option<B256>,
17    pub block_metadata: Option<Vec<u8>>,
18}
19
20impl MessageWithMetadata {
21    /// Computes a hash of the message for consensus.
22    /// Only includes MEL (minimum execution layer) consensus fields.
23    pub fn hash(&self) -> B256 {
24        let serialized = self.message.serialize();
25        let mut data = Vec::new();
26        data.extend_from_slice(&serialized);
27        data.extend_from_slice(&self.delayed_messages_read.to_be_bytes());
28        keccak256(&data)
29    }
30
31    /// Returns a shallow copy with only consensus-relevant fields.
32    pub fn with_only_mel_consensus_fields(&self) -> Self {
33        MessageWithMetadata {
34            message: L1IncomingMessage {
35                header: self.message.header.clone(),
36                l2_msg: self.message.l2_msg.clone(),
37                batch_gas_left: None,
38            },
39            delayed_messages_read: self.delayed_messages_read,
40        }
41    }
42}