alloy_rpc_types_eth/
work.rs

1use alloy_primitives::B256;
2
3/// The result of an `eth_getWork` request
4#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
5pub struct Work {
6    /// The proof-of-work hash.
7    pub pow_hash: B256,
8    /// The seed hash.
9    pub seed_hash: B256,
10    /// The target.
11    pub target: B256,
12    /// The block number: this isn't always stored.
13    pub number: Option<u64>,
14}
15
16#[cfg(feature = "serde")]
17impl serde::Serialize for Work {
18    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
19    where
20        S: serde::Serializer,
21    {
22        match self.number.map(alloy_primitives::U64::from) {
23            Some(num) => (&self.pow_hash, &self.seed_hash, &self.target, num).serialize(s),
24            None => (&self.pow_hash, &self.seed_hash, &self.target).serialize(s),
25        }
26    }
27}
28
29#[cfg(feature = "serde")]
30impl<'a> serde::Deserialize<'a> for Work {
31    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
32    where
33        D: serde::Deserializer<'a>,
34    {
35        struct WorkVisitor;
36
37        impl<'a> serde::de::Visitor<'a> for WorkVisitor {
38            type Value = Work;
39
40            fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
41                write!(formatter, "Work object")
42            }
43
44            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
45            where
46                A: serde::de::SeqAccess<'a>,
47            {
48                use serde::de::Error;
49                let pow_hash = seq
50                    .next_element::<B256>()?
51                    .ok_or_else(|| A::Error::custom("missing pow hash"))?;
52                let seed_hash = seq
53                    .next_element::<B256>()?
54                    .ok_or_else(|| A::Error::custom("missing seed hash"))?;
55                let target = seq
56                    .next_element::<B256>()?
57                    .ok_or_else(|| A::Error::custom("missing target"))?;
58                let number = seq.next_element::<u64>()?;
59                Ok(Work { pow_hash, seed_hash, target, number })
60            }
61        }
62
63        deserializer.deserialize_any(WorkVisitor)
64    }
65}