// SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork use pezsnowbridge_core::ChannelId; use pezsnowbridge_inbound_queue_primitives::Log; use pezsp_core::{RuntimeDebug, H160, H256}; use pezsp_std::prelude::*; use alloy_core::{primitives::B256, sol, sol_types::SolEvent}; sol! { event OutboundMessageAccepted(bytes32 indexed channel_id, uint64 nonce, bytes32 indexed message_id, bytes payload); } /// An inbound message that has had its outer envelope decoded. #[derive(Clone, RuntimeDebug)] pub struct Envelope { /// The address of the outbound queue on Ethereum that emitted this message as an event log pub gateway: H160, /// The message Channel pub channel_id: ChannelId, /// A nonce for enforcing replay protection and ordering. pub nonce: u64, /// An id for tracing the message on its route (has no role in bridge consensus) pub message_id: H256, /// The inner payload generated from the source application. pub payload: Vec, } #[derive(Copy, Clone, RuntimeDebug)] pub struct EnvelopeDecodeError; impl TryFrom<&Log> for Envelope { type Error = EnvelopeDecodeError; fn try_from(log: &Log) -> Result { let topics: Vec = log.topics.iter().map(|x| B256::from_slice(x.as_ref())).collect(); let event = OutboundMessageAccepted::decode_raw_log_validate(topics, &log.data) .map_err(|_| EnvelopeDecodeError)?; Ok(Self { gateway: log.address, channel_id: ChannelId::from(event.channel_id.as_ref()), nonce: event.nonce, message_id: H256::from(event.message_id.as_ref()), payload: event.payload.into(), }) } }