ic_web3/types/
work.rs

1use crate::types::{H256, U256};
2use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
3use serde_json::{self, Value};
4
5/// Miner's work package
6#[derive(Debug, PartialEq, Eq)]
7pub struct Work {
8    /// The proof-of-work hash.
9    pub pow_hash: H256,
10    /// The seed hash.
11    pub seed_hash: H256,
12    /// The target.
13    pub target: H256,
14    /// The block number: this isn't always stored.
15    pub number: Option<u64>,
16}
17
18impl<'a> Deserialize<'a> for Work {
19    fn deserialize<D>(deserializer: D) -> Result<Work, D::Error>
20    where
21        D: Deserializer<'a>,
22    {
23        let v: Value = Deserialize::deserialize(deserializer)?;
24
25        let (pow_hash, seed_hash, target, number) = serde_json::from_value::<(H256, H256, H256, u64)>(v.clone())
26            .map(|(pow_hash, seed_hash, target, number)| (pow_hash, seed_hash, target, Some(number)))
27            .or_else(|_| {
28                serde_json::from_value::<(H256, H256, H256)>(v)
29                    .map(|(pow_hash, seed_hash, target)| (pow_hash, seed_hash, target, None))
30            })
31            .map_err(|e| D::Error::custom(format!("Cannot deserialize Work: {:?}", e)))?;
32
33        Ok(Work {
34            pow_hash,
35            seed_hash,
36            target,
37            number,
38        })
39    }
40}
41
42impl Serialize for Work {
43    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        match self.number.as_ref() {
48            Some(num) => (&self.pow_hash, &self.seed_hash, &self.target, U256::from(*num)).serialize(s),
49            None => (&self.pow_hash, &self.seed_hash, &self.target).serialize(s),
50        }
51    }
52}