snarkvm_ledger_block/transaction/fee/
serialize.rs1use super::*;
17
18impl<N: Network> Serialize for Fee<N> {
19 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21 match serializer.is_human_readable() {
22 true => {
23 let mut fee = serializer.serialize_struct("Fee", 2 + self.proof.is_some() as usize)?;
24 fee.serialize_field("transition", &self.transition)?;
25 fee.serialize_field("global_state_root", &self.global_state_root)?;
26 if let Some(proof) = &self.proof {
27 fee.serialize_field("proof", proof)?;
28 }
29 fee.end()
30 }
31 false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
32 }
33 }
34}
35
36impl<'de, N: Network> Deserialize<'de> for Fee<N> {
37 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
39 match deserializer.is_human_readable() {
40 true => {
41 let mut fee = serde_json::Value::deserialize(deserializer)?;
43 let transition = DeserializeExt::take_from_value::<D>(&mut fee, "transition")?;
45 let global_state_root = DeserializeExt::take_from_value::<D>(&mut fee, "global_state_root")?;
47 let proof = DeserializeExt::take_from_value::<D>(&mut fee, "proof")?;
49 Self::from(transition, global_state_root, proof).map_err(de::Error::custom)
51 }
52 false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "fee"),
53 }
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_serde_json() -> Result<()> {
63 let rng = &mut TestRng::default();
64
65 let expected = crate::transaction::fee::test_helpers::sample_fee_private_hardcoded(rng);
67
68 let expected_string = &expected.to_string();
70 let candidate_string = serde_json::to_string(&expected)?;
71 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
72
73 assert_eq!(expected, Fee::from_str(expected_string)?);
75 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
76
77 let expected = crate::transaction::fee::test_helpers::sample_fee_public_hardcoded(rng);
79
80 let expected_string = &expected.to_string();
82 let candidate_string = serde_json::to_string(&expected)?;
83 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
84
85 assert_eq!(expected, Fee::from_str(expected_string)?);
87 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
88
89 Ok(())
90 }
91
92 #[test]
93 fn test_bincode() -> Result<()> {
94 let rng = &mut TestRng::default();
95
96 let expected = crate::transaction::fee::test_helpers::sample_fee_private_hardcoded(rng);
98
99 let expected_bytes = expected.to_bytes_le()?;
101 let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
102 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
103
104 assert_eq!(expected, Fee::read_le(&expected_bytes[..])?);
106 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
107
108 let expected = crate::transaction::fee::test_helpers::sample_fee_public_hardcoded(rng);
110
111 let expected_bytes = expected.to_bytes_le()?;
113 let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
114 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
115
116 assert_eq!(expected, Fee::read_le(&expected_bytes[..])?);
118 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
119
120 Ok(())
121 }
122}