/ console / program / src / data / value / serialize.rs
serialize.rs
  1  // Copyright (c) 2025-2026 ACDC Network
  2  // This file is part of the alphavm library.
  3  //
  4  // Alpha Chain | Delta Chain Protocol
  5  // International Monetary Graphite.
  6  //
  7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
  8  // They built world-class ZK infrastructure. We installed the EASY button.
  9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
 10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
 11  //
 12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
 13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
 14  // No rights reserved. No permission required. No warranty. No refunds.
 15  //
 16  // https://creativecommons.org/publicdomain/zero/1.0/
 17  // SPDX-License-Identifier: CC0-1.0
 18  
 19  use super::*;
 20  
 21  impl<N: Network> Serialize for Value<N> {
 22      /// Serializes the value into string or bytes.
 23      fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
 24          match serializer.is_human_readable() {
 25              true => serializer.collect_str(self),
 26              false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
 27          }
 28      }
 29  }
 30  
 31  impl<'de, N: Network> Deserialize<'de> for Value<N> {
 32      /// Deserializes the value from a string or bytes.
 33      fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
 34          match deserializer.is_human_readable() {
 35              true => FromStr::from_str(&String::deserialize(deserializer)?).map_err(de::Error::custom),
 36              false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "value"),
 37          }
 38      }
 39  }
 40  
 41  #[cfg(test)]
 42  mod tests {
 43      use super::*;
 44      use alphavm_console_network::MainnetV0;
 45  
 46      type CurrentNetwork = MainnetV0;
 47  
 48      #[test]
 49      fn test_serde_json() -> Result<()> {
 50          {
 51              // Prepare the plaintext string.
 52              let string = r"{
 53    owner: ax150w2lvhdzychwvzu54ys5zas7tm5s0ycdyw563pms83g9u0vucgqe5fs5w,
 54    token_amount: 100u64
 55  }";
 56              // Construct a new plaintext value.
 57              let expected = Value::<CurrentNetwork>::from_str(string).unwrap();
 58              assert!(matches!(expected, Value::Plaintext(..)));
 59  
 60              // Serialize
 61              let expected_string = &expected.to_string();
 62              let candidate_string = serde_json::to_string(&expected)?;
 63              assert_eq!(expected_string, serde_json::Value::from_str(&candidate_string)?.as_str().unwrap());
 64  
 65              // Deserialize
 66              assert_eq!(expected, Value::from_str(expected_string)?);
 67              assert_eq!(expected, serde_json::from_str(&candidate_string)?);
 68          }
 69          {
 70              // Prepare the record string.
 71              let string = r"{
 72    owner: ax150w2lvhdzychwvzu54ys5zas7tm5s0ycdyw563pms83g9u0vucgqe5fs5w.private,
 73    token_amount: 100u64.private,
 74    _nonce: 6122363155094913586073041054293642159180066699840940609722305038224296461351group.public
 75  }";
 76              // Construct a new record value.
 77              let expected = Value::<CurrentNetwork>::from_str(string).unwrap();
 78              assert!(matches!(expected, Value::Record(..)));
 79  
 80              // Serialize
 81              let expected_string = &expected.to_string();
 82              let candidate_string = serde_json::to_string(&expected)?;
 83              assert_eq!(expected_string, serde_json::Value::from_str(&candidate_string)?.as_str().unwrap());
 84  
 85              // Deserialize
 86              assert_eq!(expected, Value::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          {
 95              // Prepare the plaintext string.
 96              let string = r"{
 97    owner: ax150w2lvhdzychwvzu54ys5zas7tm5s0ycdyw563pms83g9u0vucgqe5fs5w,
 98    token_amount: 100u64
 99  }";
100              // Construct a new plaintext value.
101              let expected = Value::<CurrentNetwork>::from_str(string).unwrap();
102              assert!(matches!(expected, Value::Plaintext(..)));
103  
104              // Serialize
105              let expected_bytes = expected.to_bytes_le()?;
106              let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
107              assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
108  
109              // Deserialize
110              assert_eq!(expected, Value::read_le(&expected_bytes[..])?);
111              assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
112          }
113          {
114              // Prepare the record string.
115              let string = r"{
116    owner: ax150w2lvhdzychwvzu54ys5zas7tm5s0ycdyw563pms83g9u0vucgqe5fs5w.private,
117    token_amount: 100u64.private,
118    _nonce: 6122363155094913586073041054293642159180066699840940609722305038224296461351group.public
119  }";
120              // Construct a new record value.
121              let expected = Value::<CurrentNetwork>::from_str(string).unwrap();
122              assert!(matches!(expected, Value::Record(..)));
123  
124              // Serialize
125              let expected_bytes = expected.to_bytes_le()?;
126              let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
127              assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
128  
129              // Deserialize
130              assert_eq!(expected, Value::read_le(&expected_bytes[..])?);
131              assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
132          }
133          Ok(())
134      }
135  }