avail_rust_core/
header.rs

1use 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/* #[cfg(feature = "generated_metadata")]
68pub mod with_subxt_metadata {
69	use super::*;
70	pub use crate::subxt_avail::runtime_types::{
71		avail_core::header::{extension::HeaderExtension, Header as ApiHeader},
72		sp_runtime::generic::digest::{Digest as ApiDigest, DigestItem as ApiDigestItem},
73	};
74	use avail_rust_core::marker::PhantomData;
75
76	impl<B, H> From<AvailHeader> for ApiHeader<B, H>
77	where
78		B: From<u32>,
79	{
80		fn from(h: AvailHeader) -> Self {
81			Self {
82				parent_hash: h.parent_hash,
83				number: h.number.into(),
84				state_root: h.state_root,
85				extrinsics_root: h.extrinsics_root,
86				digest: h.digest.into(),
87				extension: h.extension,
88				__ignore: PhantomData,
89			}
90		}
91	}
92
93	impl From<Digest> for ApiDigest {
94		fn from(d: Digest) -> Self {
95			let logs = d.logs.into_iter().map(|xt_item| xt_item.into()).collect::<Vec<_>>();
96			Self { logs }
97		}
98	}
99
100	impl From<DigestItem> for ApiDigestItem {
101		fn from(di: DigestItem) -> Self {
102			match di {
103				DigestItem::PreRuntime(id, data) => ApiDigestItem::PreRuntime(id, data),
104				DigestItem::Consensus(id, data) => ApiDigestItem::Consensus(id, data),
105				DigestItem::Seal(id, data) => ApiDigestItem::Seal(id, data),
106				DigestItem::Other(data) => ApiDigestItem::Other(data),
107				DigestItem::RuntimeEnvironmentUpdated => ApiDigestItem::RuntimeEnvironmentUpdated,
108			}
109		}
110	}
111}
112	*/
113
114#[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}