bridge_hub_common/
barriers.rs1use core::{marker::PhantomData, ops::ControlFlow};
17use cumulus_primitives_core::Weight;
18use frame_support::traits::{Contains, ProcessMessageError};
19use xcm::prelude::{ExportMessage, Instruction, Location, NetworkId};
20
21use xcm_builder::{CreateMatcher, MatchXcm};
22use xcm_executor::traits::{DenyExecution, Properties};
23
24pub struct DenyExportMessageFrom<FromOrigin, ToGlobalConsensus>(
28 PhantomData<(FromOrigin, ToGlobalConsensus)>,
29);
30
31impl<FromOrigin, ToGlobalConsensus> DenyExecution
32 for DenyExportMessageFrom<FromOrigin, ToGlobalConsensus>
33where
34 FromOrigin: Contains<Location>,
35 ToGlobalConsensus: Contains<NetworkId>,
36{
37 fn deny_execution<RuntimeCall>(
38 origin: &Location,
39 message: &mut [Instruction<RuntimeCall>],
40 _max_weight: Weight,
41 _properties: &mut Properties,
42 ) -> Result<(), ProcessMessageError> {
43 if !FromOrigin::contains(origin) {
45 return Ok(())
46 }
47 message.matcher().match_next_inst_while(
48 |_| true,
49 |inst| match inst {
50 ExportMessage { network, .. } if ToGlobalConsensus::contains(network) =>
51 Err(ProcessMessageError::Unsupported),
52 _ => Ok(ControlFlow::Continue(())),
53 },
54 )?;
55 Ok(())
56 }
57}