sp_domains/bundle/
bundle_v0.rs

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    /// Proof of bundle producer election.
18    pub proof_of_election: ProofOfElection,
19    /// Execution receipt that should extend the receipt chain or add confirmations
20    /// to the head receipt.
21    pub receipt: ExecutionReceipt<
22        Number,
23        Hash,
24        HeaderNumberFor<DomainHeader>,
25        HeaderHashFor<DomainHeader>,
26        Balance,
27    >,
28    /// The total (estimated) weight of all extrinsics in the bundle.
29    ///
30    /// Used to prevent overloading the bundle with compute.
31    pub estimated_bundle_weight: Weight,
32    /// The Merkle root of all new extrinsics included in this bundle.
33    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    /// Returns the hash of this header.
40    pub fn hash(&self) -> HeaderHashFor<DomainHeader> {
41        HeaderHashingFor::<DomainHeader>::hash_of(self)
42    }
43}
44
45/// Header of bundle.
46#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
47pub struct SealedBundleHeaderV0<Number, Hash, DomainHeader: HeaderT, Balance> {
48    /// Unsealed header.
49    pub header: BundleHeaderV0<Number, Hash, DomainHeader, Balance>,
50    /// Signature of the bundle.
51    pub signature: OperatorSignature,
52}
53
54impl<Number: Encode, Hash: Encode, DomainHeader: HeaderT, Balance: Encode>
55    SealedBundleHeaderV0<Number, Hash, DomainHeader, Balance>
56{
57    /// Constructs a new instance of [`SealedBundleHeaderV0`].
58    pub fn new(
59        header: BundleHeaderV0<Number, Hash, DomainHeader, Balance>,
60        signature: OperatorSignature,
61    ) -> Self {
62        Self { header, signature }
63    }
64}
65
66/// Domain bundle v0.
67#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
68pub struct BundleV0<Extrinsic, Number, Hash, DomainHeader: HeaderT, Balance> {
69    /// Sealed bundle header.
70    pub sealed_header: SealedBundleHeaderV0<Number, Hash, DomainHeader, Balance>,
71    /// The accompanying extrinsics.
72    pub extrinsics: Vec<Extrinsic>,
73}
74
75impl<Extrinsic: Encode, Number, Hash, DomainHeader: HeaderT, Balance>
76    BundleV0<Extrinsic, Number, Hash, DomainHeader, Balance>
77{
78    /// Convert a bundle with generic extrinsic to a bundle with opaque extrinsic.
79    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}