substrate_relay_helper/parachains/
mod.rs1use async_trait::async_trait;
21use bp_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber};
22use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId};
23use pallet_bridge_parachains::{Call as BridgeParachainsCall, Config as BridgeParachainsConfig};
24use parachains_relay::ParachainsPipeline;
25use relay_substrate_client::{
26 CallOf, Chain, ChainWithTransactions, HeaderIdOf, Parachain, RelayChain,
27};
28use std::{fmt::Debug, marker::PhantomData};
29
30pub mod source;
31pub mod target;
32
33#[async_trait]
38pub trait SubstrateParachainsPipeline: 'static + Clone + Debug + Send + Sync {
39 type SourceParachain: Parachain;
41 type SourceRelayChain: RelayChain;
43 type TargetChain: ChainWithTransactions;
45
46 type SubmitParachainHeadsCallBuilder: SubmitParachainHeadsCallBuilder<Self>;
48}
49
50#[derive(Clone, Debug)]
52pub struct ParachainsPipelineAdapter<P: SubstrateParachainsPipeline> {
53 _phantom: PhantomData<P>,
54}
55
56impl<P: SubstrateParachainsPipeline> ParachainsPipeline for ParachainsPipelineAdapter<P> {
57 type SourceParachain = P::SourceParachain;
58 type SourceRelayChain = P::SourceRelayChain;
59 type TargetChain = P::TargetChain;
60}
61
62pub trait SubmitParachainHeadsCallBuilder<P: SubstrateParachainsPipeline>:
64 'static + Send + Sync
65{
66 fn build_submit_parachain_heads_call(
69 at_relay_block: HeaderIdOf<P::SourceRelayChain>,
70 parachains: Vec<(ParaId, ParaHash)>,
71 parachain_heads_proof: ParaHeadsProof,
72 is_free_execution_expected: bool,
73 ) -> CallOf<P::TargetChain>;
74}
75
76pub struct DirectSubmitParachainHeadsCallBuilder<P, R, I> {
79 _phantom: PhantomData<(P, R, I)>,
80}
81
82impl<P, R, I> SubmitParachainHeadsCallBuilder<P> for DirectSubmitParachainHeadsCallBuilder<P, R, I>
83where
84 P: SubstrateParachainsPipeline,
85 P::SourceRelayChain: Chain<Hash = RelayBlockHash, BlockNumber = RelayBlockNumber>,
86 R: BridgeParachainsConfig<I> + Send + Sync,
87 I: 'static + Send + Sync,
88 R::BridgedChain: bp_runtime::Chain<
89 BlockNumber = RelayBlockNumber,
90 Hash = RelayBlockHash,
91 Hasher = RelayBlockHasher,
92 >,
93 CallOf<P::TargetChain>: From<BridgeParachainsCall<R, I>>,
94{
95 fn build_submit_parachain_heads_call(
96 at_relay_block: HeaderIdOf<P::SourceRelayChain>,
97 parachains: Vec<(ParaId, ParaHash)>,
98 parachain_heads_proof: ParaHeadsProof,
99 _is_free_execution_expected: bool,
100 ) -> CallOf<P::TargetChain> {
101 BridgeParachainsCall::<R, I>::submit_parachain_heads {
102 at_relay_block: (at_relay_block.0, at_relay_block.1),
103 parachains,
104 parachain_heads_proof,
105 }
106 .into()
107 }
108}