use crate::{pallet, OutboundState};
use cumulus_primitives_core::ParaId;
use frame_support::pallet_prelude::Get;
pub struct InAndOutXcmpChannelStatusProvider<SiblingBridgeHubParaId, Runtime>(
sp_std::marker::PhantomData<(SiblingBridgeHubParaId, Runtime)>,
);
impl<SiblingBridgeHubParaId: Get<ParaId>, Runtime: crate::Config>
bp_xcm_bridge_hub_router::XcmChannelStatusProvider
for InAndOutXcmpChannelStatusProvider<SiblingBridgeHubParaId, Runtime>
{
fn is_congested() -> bool {
if pallet::Pallet::<Runtime>::is_inbound_channel_suspended(SiblingBridgeHubParaId::get()) {
return true
}
OutXcmpChannelStatusProvider::<SiblingBridgeHubParaId, Runtime>::is_congested()
}
}
pub struct OutXcmpChannelStatusProvider<SiblingBridgeHubParaId, Runtime>(
sp_std::marker::PhantomData<(SiblingBridgeHubParaId, Runtime)>,
);
impl<SiblingBridgeHubParaId: Get<ParaId>, Runtime: crate::Config>
bp_xcm_bridge_hub_router::XcmChannelStatusProvider
for OutXcmpChannelStatusProvider<SiblingBridgeHubParaId, Runtime>
{
fn is_congested() -> bool {
let sibling_bridge_hub_id: ParaId = SiblingBridgeHubParaId::get();
let Some((outbound_state, queued_pages)) =
pallet::Pallet::<Runtime>::outbound_channel_state(sibling_bridge_hub_id)
else {
return false
};
if outbound_state == OutboundState::Suspended {
return true
}
const MAX_QUEUED_PAGES_BEFORE_DEACTIVATION: u16 = 4;
if queued_pages > MAX_QUEUED_PAGES_BEFORE_DEACTIVATION {
return true
}
false
}
}
#[cfg(feature = "runtime-benchmarks")]
pub fn suspend_channel_for_benchmarks<T: crate::Config>(target: ParaId) {
pallet::Pallet::<T>::suspend_channel(target)
}