From e072b41b86efa851a050435fef77aa1a4ed10441 Mon Sep 17 00:00:00 2001 From: Stanislav Tkach Date: Tue, 29 Aug 2023 12:59:57 +0200 Subject: [PATCH] Fix the deserialization from JSON for I256 and U256 types with custom endianness (#28) --- Cargo.toml | 5 +++++ src/serde.rs | 13 +++++++++++++ tests/serialize_deserialize.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 tests/serialize_deserialize.rs diff --git a/Cargo.toml b/Cargo.toml index f7e523d..0cc451c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,3 +31,8 @@ macros = ["ethnum-macros"] ethnum-intrinsics = { version = "=1.1.0", path = "intrinsics", optional = true } ethnum-macros = { version = "=1.1.0", path = "macros", optional = true } serde = { version = "1", default-features = false, optional = true } + +[dev-dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" +bincode = "1" diff --git a/src/serde.rs b/src/serde.rs index d6fc615..8bcc4bd 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -392,6 +392,19 @@ pub mod bytes { Ok(T::from_bytes(bytes)) } + + fn visit_seq(self, mut seq: S) -> Result + where + S: de::SeqAccess<'de>, + { + let mut bytes: [u8; 32] = [0; 32]; + for i in 0..32 { + bytes[i] = seq + .next_element()? + .ok_or(de::Error::invalid_length(i, &self))?; + } + Ok(T::from_bytes(bytes)) + } } #[doc(hidden)] diff --git a/tests/serialize_deserialize.rs b/tests/serialize_deserialize.rs new file mode 100644 index 0000000..8386656 --- /dev/null +++ b/tests/serialize_deserialize.rs @@ -0,0 +1,34 @@ +#[cfg(feature = "serde")] +#[test] +fn roundtrip() { + use ethnum::{I256, U256}; + use serde::{Deserialize, Serialize}; + + #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] + struct Test { + #[serde(with = "ethnum::serde::bytes::le")] + a: U256, + #[serde(with = "ethnum::serde::bytes::be")] + b: U256, + #[serde(with = "ethnum::serde::bytes::ne")] + c: U256, + #[serde(with = "ethnum::serde::bytes::le")] + d: I256, + #[serde(with = "ethnum::serde::bytes::be")] + e: I256, + #[serde(with = "ethnum::serde::bytes::ne")] + f: I256, + } + + let original = Test { + a: U256::new(1), + b: U256::new(2), + c: U256::new(3), + d: I256::new(4), + e: I256::new(5), + f: I256::new(6), + }; + let serialized = serde_json::to_string(&original).unwrap(); + let deserialized: Test = serde_json::from_str(&serialized).unwrap(); + assert_eq!(original, deserialized); +}