use crate::{MessageNonce, UnrewardedRelayersState};
use codec::{Decode, Encode};
use pezframe_support::weights::Weight;
use pezsp_core::RuntimeDebug;
use pezsp_std::ops::RangeInclusive;
use scale_info::TypeInfo;
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
#[allow(non_camel_case_types)]
pub enum BridgeMessagesCall<AccountId, MessagesProof, MessagesDeliveryProof> {
#[codec(index = 2)]
receive_messages_proof {
relayer_id_at_bridged_chain: AccountId,
proof: MessagesProof,
messages_count: u32,
dispatch_weight: Weight,
},
#[codec(index = 3)]
receive_messages_delivery_proof {
proof: MessagesDeliveryProof,
relayers_state: UnrewardedRelayersState,
},
}
#[derive(PartialEq, RuntimeDebug)]
pub struct BaseMessagesProofInfo<LaneId> {
pub lane_id: LaneId,
pub bundled_range: RangeInclusive<MessageNonce>,
pub best_stored_nonce: MessageNonce,
}
impl<LaneId> BaseMessagesProofInfo<LaneId> {
pub fn appends_to_stored_nonce(&self) -> bool {
Some(*self.bundled_range.start()) == self.best_stored_nonce.checked_add(1)
}
}
#[derive(PartialEq, RuntimeDebug)]
#[cfg_attr(test, derive(Default))]
pub struct UnrewardedRelayerOccupation {
pub free_relayer_slots: MessageNonce,
pub free_message_slots: MessageNonce,
}
#[derive(PartialEq, RuntimeDebug)]
pub struct ReceiveMessagesProofInfo<LaneId> {
pub base: BaseMessagesProofInfo<LaneId>,
pub unrewarded_relayers: UnrewardedRelayerOccupation,
}
impl<LaneId> ReceiveMessagesProofInfo<LaneId> {
pub fn is_obsolete(&self, is_dispatcher_active: bool) -> bool {
if !is_dispatcher_active {
return true;
}
if self.base.bundled_range.is_empty() {
let empty_transactions_allowed =
self.unrewarded_relayers.free_relayer_slots == 0 ||
self.unrewarded_relayers.free_message_slots == 0;
return !empty_transactions_allowed;
}
!self.base.appends_to_stored_nonce()
}
}
#[derive(PartialEq, RuntimeDebug)]
pub struct ReceiveMessagesDeliveryProofInfo<LaneId>(pub BaseMessagesProofInfo<LaneId>);
impl<LaneId> ReceiveMessagesDeliveryProofInfo<LaneId> {
pub fn is_obsolete(&self) -> bool {
self.0.bundled_range.is_empty() || !self.0.appends_to_stored_nonce()
}
}
#[derive(PartialEq, RuntimeDebug)]
pub enum MessagesCallInfo<LaneId: Clone + Copy> {
ReceiveMessagesProof(ReceiveMessagesProofInfo<LaneId>),
ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo<LaneId>),
}
impl<LaneId: Clone + Copy> MessagesCallInfo<LaneId> {
pub fn lane_id(&self) -> LaneId {
match *self {
Self::ReceiveMessagesProof(ref info) => info.base.lane_id,
Self::ReceiveMessagesDeliveryProof(ref info) => info.0.lane_id,
}
}
pub fn bundled_messages(&self) -> RangeInclusive<MessageNonce> {
match *self {
Self::ReceiveMessagesProof(ref info) => info.base.bundled_range.clone(),
Self::ReceiveMessagesDeliveryProof(ref info) => info.0.bundled_range.clone(),
}
}
}