use crate::{Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData};
use codec::{Decode, DecodeWithMemTracking, Encode, Error as CodecError};
use pezbp_runtime::{
messages::MessageDispatchResult, raw_storage_proof_size, RawStorageProof, Size,
};
use pezframe_support::weights::Weight;
use pezsp_core::RuntimeDebug;
use pezsp_std::{fmt::Debug, marker::PhantomData, prelude::*};
use scale_info::TypeInfo;
#[derive(Clone, Decode, DecodeWithMemTracking, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)]
pub struct FromBridgedChainMessagesProof<BridgedHeaderHash, Lane> {
pub bridged_header_hash: BridgedHeaderHash,
pub storage_proof: RawStorageProof,
pub lane: Lane,
pub nonces_start: MessageNonce,
pub nonces_end: MessageNonce,
}
impl<BridgedHeaderHash, Lane> Size for FromBridgedChainMessagesProof<BridgedHeaderHash, Lane> {
fn size(&self) -> u32 {
use pezframe_support::pezsp_runtime::SaturatedConversion;
raw_storage_proof_size(&self.storage_proof).saturated_into()
}
}
pub type ProvedMessages<LaneId, Message> = (LaneId, ProvedLaneMessages<Message>);
#[derive(RuntimeDebug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)]
pub struct ProvedLaneMessages<Message> {
pub lane_state: Option<OutboundLaneData>,
pub messages: Vec<Message>,
}
#[derive(RuntimeDebug)]
pub struct DispatchMessageData<DispatchPayload> {
pub payload: Result<DispatchPayload, CodecError>,
}
#[derive(RuntimeDebug)]
pub struct DispatchMessage<DispatchPayload, LaneId: Encode> {
pub key: MessageKey<LaneId>,
pub data: DispatchMessageData<DispatchPayload>,
}
pub trait MessageDispatch {
type DispatchPayload: Decode;
type DispatchLevelResult: Clone + pezsp_std::fmt::Debug + Eq;
type LaneId: Encode;
fn is_active(lane: Self::LaneId) -> bool;
fn dispatch_weight(
message: &mut DispatchMessage<Self::DispatchPayload, Self::LaneId>,
) -> Weight;
fn dispatch(
message: DispatchMessage<Self::DispatchPayload, Self::LaneId>,
) -> MessageDispatchResult<Self::DispatchLevelResult>;
}
pub trait DeliveryPayments<AccountId> {
type Error: Debug + Into<&'static str>;
fn pay_reward(
relayer: AccountId,
total_messages: MessageNonce,
valid_messages: MessageNonce,
actual_weight: Weight,
);
}
impl<Message> Default for ProvedLaneMessages<Message> {
fn default() -> Self {
ProvedLaneMessages { lane_state: None, messages: Vec::new() }
}
}
impl<DispatchPayload: Decode, LaneId: Encode> From<Message<LaneId>>
for DispatchMessage<DispatchPayload, LaneId>
{
fn from(message: Message<LaneId>) -> Self {
DispatchMessage { key: message.key, data: message.payload.into() }
}
}
impl<DispatchPayload: Decode> From<MessagePayload> for DispatchMessageData<DispatchPayload> {
fn from(payload: MessagePayload) -> Self {
DispatchMessageData { payload: DispatchPayload::decode(&mut &payload[..]) }
}
}
impl<AccountId> DeliveryPayments<AccountId> for () {
type Error = &'static str;
fn pay_reward(
_relayer: AccountId,
_total_messages: MessageNonce,
_valid_messages: MessageNonce,
_actual_weight: Weight,
) {
}
}
pub struct ForbidInboundMessages<DispatchPayload, LaneId>(PhantomData<(DispatchPayload, LaneId)>);
impl<DispatchPayload: Decode, LaneId: Encode> MessageDispatch
for ForbidInboundMessages<DispatchPayload, LaneId>
{
type DispatchPayload = DispatchPayload;
type DispatchLevelResult = ();
type LaneId = LaneId;
fn is_active(_: LaneId) -> bool {
false
}
fn dispatch_weight(
_message: &mut DispatchMessage<Self::DispatchPayload, Self::LaneId>,
) -> Weight {
Weight::MAX
}
fn dispatch(
_: DispatchMessage<Self::DispatchPayload, Self::LaneId>,
) -> MessageDispatchResult<Self::DispatchLevelResult> {
MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result: () }
}
}