1#[cfg(not(feature = "std"))]
2extern crate alloc;
3
4use crate::bundle::OpaqueBundle;
5use crate::execution_receipt::ExecutionReceipt;
6use crate::{HeaderHashFor, HeaderHashingFor, HeaderNumberFor, OperatorSignature, ProofOfElection};
7#[cfg(not(feature = "std"))]
8use alloc::vec::Vec;
9use parity_scale_codec::{Decode, Encode};
10use scale_info::TypeInfo;
11use sp_runtime::OpaqueExtrinsic;
12use sp_runtime::traits::{Hash, Header as HeaderT};
13use sp_weights::Weight;
14
15#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
16pub struct BundleHeaderV0<Number, Hash, DomainHeader: HeaderT, Balance> {
17    pub proof_of_election: ProofOfElection,
19    pub receipt: ExecutionReceipt<
22        Number,
23        Hash,
24        HeaderNumberFor<DomainHeader>,
25        HeaderHashFor<DomainHeader>,
26        Balance,
27    >,
28    pub estimated_bundle_weight: Weight,
32    pub bundle_extrinsics_root: HeaderHashFor<DomainHeader>,
34}
35
36impl<Number: Encode, Hash: Encode, DomainHeader: HeaderT, Balance: Encode>
37    BundleHeaderV0<Number, Hash, DomainHeader, Balance>
38{
39    pub fn hash(&self) -> HeaderHashFor<DomainHeader> {
41        HeaderHashingFor::<DomainHeader>::hash_of(self)
42    }
43}
44
45#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
47pub struct SealedBundleHeaderV0<Number, Hash, DomainHeader: HeaderT, Balance> {
48    pub header: BundleHeaderV0<Number, Hash, DomainHeader, Balance>,
50    pub signature: OperatorSignature,
52}
53
54impl<Number: Encode, Hash: Encode, DomainHeader: HeaderT, Balance: Encode>
55    SealedBundleHeaderV0<Number, Hash, DomainHeader, Balance>
56{
57    pub fn new(
59        header: BundleHeaderV0<Number, Hash, DomainHeader, Balance>,
60        signature: OperatorSignature,
61    ) -> Self {
62        Self { header, signature }
63    }
64}
65
66#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
68pub struct BundleV0<Extrinsic, Number, Hash, DomainHeader: HeaderT, Balance> {
69    pub sealed_header: SealedBundleHeaderV0<Number, Hash, DomainHeader, Balance>,
71    pub extrinsics: Vec<Extrinsic>,
73}
74
75impl<Extrinsic: Encode, Number, Hash, DomainHeader: HeaderT, Balance>
76    BundleV0<Extrinsic, Number, Hash, DomainHeader, Balance>
77{
78    pub fn into_opaque_bundle(self) -> OpaqueBundle<Number, Hash, DomainHeader, Balance> {
80        let BundleV0 {
81            sealed_header,
82            extrinsics,
83        } = self;
84        let opaque_extrinsics = extrinsics
85            .into_iter()
86            .map(|xt| {
87                OpaqueExtrinsic::from_bytes(&xt.encode())
88                    .expect("We have just encoded a valid extrinsic; qed")
89            })
90            .collect();
91        OpaqueBundle::V0(BundleV0 {
92            sealed_header,
93            extrinsics: opaque_extrinsics,
94        })
95    }
96}