avail_rust_core/
header.rs1use codec::{Decode, Encode};
2use primitive_types::H256;
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use subxt_core::config::{Hasher, Header, substrate::BlakeTwo256};
5
6pub use subxt_core::config::substrate::{Digest, DigestItem};
7
8#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
9#[serde(rename_all = "camelCase")]
10pub struct AvailHeader {
11 pub parent_hash: H256,
12 #[serde(serialize_with = "number_to_hex", deserialize_with = "number_from_hex")]
13 #[codec(compact)]
14 pub number: u32,
15 pub state_root: H256,
16 pub extrinsics_root: H256,
17 pub digest: Digest,
18 pub extension: HeaderExtension,
19}
20
21impl AvailHeader {
22 pub fn data_root(&self) -> H256 {
23 match &self.extension {
24 HeaderExtension::V3(ext) => ext.commitment.data_root,
25 }
26 }
27
28 pub fn hash(&self) -> H256 {
29 BlakeTwo256::hash_of(self)
30 }
31}
32
33impl Header for AvailHeader {
34 type Hasher = BlakeTwo256;
35 type Number = u32;
36
37 fn number(&self) -> Self::Number {
38 self.number
39 }
40
41 fn hash(&self) -> <Self::Hasher as Hasher>::Output {
42 self.hash()
43 }
44}
45
46fn number_to_hex<S>(value: &u32, serializer: S) -> Result<S::Ok, S::Error>
47where
48 S: Serializer,
49{
50 let hex_string = format!("{:X}", value);
51 serializer.serialize_str(&hex_string)
52}
53
54fn number_from_hex<'de, D>(deserializer: D) -> Result<u32, D::Error>
55where
56 D: Deserializer<'de>,
57{
58 let buf = String::deserialize(deserializer)?;
59 let without_prefix = buf.trim_start_matches("0x");
60 let result = u32::from_str_radix(without_prefix, 16);
61 match result {
62 Ok(res) => Ok(res),
63 Err(err) => Err(serde::de::Error::custom(err)),
64 }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
115#[repr(u8)]
116pub enum HeaderExtension {
117 V3(V3HeaderExtension) = 2,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
121#[serde(rename_all = "camelCase")]
122pub struct V3HeaderExtension {
123 pub app_lookup: CompactDataLookup,
124 pub commitment: KateCommitment,
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
128#[serde(rename_all = "camelCase")]
129pub struct CompactDataLookup {
130 #[codec(compact)]
131 pub size: u32,
132 pub index: Vec<DataLookupItem>,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
136#[serde(rename_all = "camelCase")]
137pub struct DataLookupItem {
138 #[codec(compact)]
139 pub app_id: u32,
140 #[codec(compact)]
141 pub start: u32,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize, Encode, Decode)]
145#[serde(rename_all = "camelCase")]
146pub struct KateCommitment {
147 #[codec(compact)]
148 pub rows: u16,
149 #[codec(compact)]
150 pub cols: u16,
151 pub commitment: Vec<u8>,
152 pub data_root: H256,
153}