dig_network_block/
emission.rs1use crate::dig_l2_definition as definitions;
8use serde::{Deserialize, Serialize};
9use thiserror::Error;
10
11#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
17pub struct Emission {
18 #[serde(with = "crate::serde_hex::hex48")]
20 pub pubkey: [u8; 48],
21 pub weight: u64,
23}
24
25impl Emission {
26 pub fn calculate_root(&self) -> definitions::Hash32 {
30 definitions::COMPUTE_EMISSION_HASH(&self.pubkey, self.weight)
31 }
32}
33
34#[derive(Debug, Error)]
36pub enum EmissionError {
37 #[error("emission error: {0}")]
39 Generic(String),
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn emission_hash_matches_definition() {
48 let e = Emission {
49 pubkey: [7u8; 48],
50 weight: 42,
51 };
52 let h1 = e.calculate_root();
53 let h2 = definitions::COMPUTE_EMISSION_HASH(&e.pubkey, e.weight);
54 assert_eq!(h1, h2);
55 }
56
57 #[test]
58 fn emission_json_round_trip() {
59 let e = Emission {
60 pubkey: [0x11u8; 48],
61 weight: 9,
62 };
63 let s = serde_json::to_string(&e).unwrap();
64 let v: serde_json::Value = serde_json::from_str(&s).unwrap();
66 let pk_str = v.get("pubkey").and_then(|x| x.as_str()).unwrap();
67 assert!(pk_str.starts_with("0x"));
68 assert_eq!(pk_str.len(), 2 + 48 * 2);
69 let back: Emission = serde_json::from_str(&s).unwrap();
70 assert_eq!(back, e);
71 }
72}