use crate::dig_l2_definition as definitions;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Emission {
#[serde(with = "crate::serde_hex::hex48")]
pub pubkey: [u8; 48],
pub weight: u64,
}
impl Emission {
pub fn calculate_root(&self) -> definitions::Hash32 {
definitions::COMPUTE_EMISSION_HASH(&self.pubkey, self.weight)
}
}
#[derive(Debug, Error)]
pub enum EmissionError {
#[error("emission error: {0}")]
Generic(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn emission_hash_matches_definition() {
let e = Emission {
pubkey: [7u8; 48],
weight: 42,
};
let h1 = e.calculate_root();
let h2 = definitions::COMPUTE_EMISSION_HASH(&e.pubkey, e.weight);
assert_eq!(h1, h2);
}
#[test]
fn emission_json_round_trip() {
let e = Emission {
pubkey: [0x11u8; 48],
weight: 9,
};
let s = serde_json::to_string(&e).unwrap();
let v: serde_json::Value = serde_json::from_str(&s).unwrap();
let pk_str = v.get("pubkey").and_then(|x| x.as_str()).unwrap();
assert!(pk_str.starts_with("0x"));
assert_eq!(pk_str.len(), 2 + 48 * 2);
let back: Emission = serde_json::from_str(&s).unwrap();
assert_eq!(back, e);
}
}