arbos_types/
message_with_meta.rs

1use alloy_primitives::{B256, keccak256};
2use alloy_rlp::{RlpDecodable, RlpEncodable};
3
4use super::incoming_message::L1IncomingMessage;
5
6/// An L1 incoming message with additional metadata.
7#[derive(Debug, Clone, Default, RlpEncodable, RlpDecodable)]
8pub struct MessageWithMetadata {
9    pub message: L1IncomingMessage,
10    pub delayed_messages_read: u64,
11}
12
13/// Extended message info including block hash and metadata.
14#[derive(Debug, Clone)]
15pub struct MessageWithMetadataAndBlockInfo {
16    pub message_with_meta: MessageWithMetadata,
17    pub block_hash: Option<B256>,
18    pub block_metadata: Option<Vec<u8>>,
19}
20
21impl MessageWithMetadata {
22    /// ABI-style commitment hash fed into the MEL local message accumulator.
23    /// Only includes MEL (minimum execution layer) consensus fields.
24    ///
25    /// TODO: packed concatenation, not yet reconciled with the on-chain
26    /// `abi.encode` layout (Nitro's `MessageWithMetadata` hashing uses RLP).
27    pub fn abi_hash(&self) -> B256 {
28        let serialized = self.message.serialize();
29        let mut data = Vec::new();
30        data.extend_from_slice(&serialized);
31        data.extend_from_slice(&self.delayed_messages_read.to_be_bytes());
32        keccak256(&data)
33    }
34
35    /// Returns a shallow copy with only consensus-relevant fields.
36    pub fn with_only_mel_consensus_fields(&self) -> Self {
37        MessageWithMetadata {
38            message: L1IncomingMessage {
39                header: self.message.header.clone(),
40                l2_msg: self.message.l2_msg.clone(),
41                legacy_batch_gas_cost: None,
42                batch_data_stats: None,
43            },
44            delayed_messages_read: self.delayed_messages_read,
45        }
46    }
47}