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}