// SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork //! Types for representing inbound messages #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, DecodeWithMemTracking, Encode}; use pezframe_support::PalletError; use pezsnowbridge_beacon_primitives::{BeaconHeader, ExecutionProof}; use pezsp_core::{RuntimeDebug, H160, H256}; use pezsp_std::prelude::*; use scale_info::TypeInfo; /// A trait for verifying inbound messages from Ethereum. pub trait Verifier { fn verify(event: &Log, proof: &Proof) -> Result<(), VerificationError>; } #[derive(Clone, Encode, Decode, DecodeWithMemTracking, RuntimeDebug, PalletError, TypeInfo)] #[cfg_attr(feature = "std", derive(PartialEq))] pub enum VerificationError { /// Execution header is missing HeaderNotFound, /// Event log was not found in the verified transaction receipt LogNotFound, /// Event log has an invalid format InvalidLog, /// Unable to verify the transaction receipt with the provided proof InvalidProof, /// Unable to verify the execution header with ancestry proof InvalidExecutionProof(#[codec(skip)] &'static str), } /// A bridge message from the Gateway contract on Ethereum #[derive(Clone, Encode, Decode, DecodeWithMemTracking, PartialEq, RuntimeDebug, TypeInfo)] pub struct EventProof { /// Event log emitted by Gateway contract pub event_log: Log, /// Inclusion proof for a transaction receipt containing the event log pub proof: Proof, } /// Event log #[derive(Clone, Encode, Decode, DecodeWithMemTracking, PartialEq, RuntimeDebug, TypeInfo)] pub struct Log { pub address: H160, pub topics: Vec, pub data: Vec, } /// Inclusion proof for a transaction receipt #[derive(Clone, Encode, Decode, DecodeWithMemTracking, PartialEq, RuntimeDebug, TypeInfo)] pub struct Proof { // Proof keys and values (receipts tree) pub receipt_proof: (Vec>, Vec>), // Proof that an execution header was finalized by the beacon chain pub execution_proof: ExecutionProof, } #[derive(Clone, RuntimeDebug)] pub struct EventFixture { pub event: EventProof, pub finalized_header: BeaconHeader, pub block_roots_root: H256, }