From b4ccc6863628e4890f13fa6fed8b676a8c216862 Mon Sep 17 00:00:00 2001 From: Alonso Gonzalez Date: Wed, 9 Jul 2025 14:31:33 +0200 Subject: [PATCH] Add rkyv deserializatio --- Cargo.lock | 132 +++++++++++++++++- Cargo.toml | 1 + crates/agglayer-primitives/Cargo.toml | 1 + crates/agglayer-primitives/src/digest.rs | 14 +- crates/agglayer-primitives/src/keccak.rs | 2 +- crates/agglayer-primitives/src/signature.rs | 88 ++++++++++-- crates/agglayer-tries/Cargo.toml | 1 + crates/agglayer-tries/src/proof.rs | 12 +- crates/agglayer-tries/src/smt.rs | 4 +- crates/unified-bridge/Cargo.toml | 1 + crates/unified-bridge/src/bridge_exit.rs | 41 +++++- crates/unified-bridge/src/global_index.rs | 15 +- .../src/imported_bridge_exit.rs | 84 ++++++++++- .../unified-bridge/src/local_exit_tree/mod.rs | 10 +- .../src/local_exit_tree/proof.rs | 19 ++- crates/unified-bridge/src/network_id.rs | 16 ++- crates/unified-bridge/src/rollup_index.rs | 15 +- crates/unified-bridge/src/token_info.rs | 29 +++- 18 files changed, 442 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7991d5d0..5bacb145 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,6 +133,7 @@ dependencies = [ "hex", "k256", "rand 0.9.1", + "rkyv", "serde", "tiny-keccak", ] @@ -144,6 +145,7 @@ dependencies = [ "agglayer-primitives", "hex", "rand 0.9.1", + "rkyv", "rs_merkle", "serde", "serde_with", @@ -1601,6 +1603,29 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" +[[package]] +name = "bytecheck" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50690fb3370fb9fe3550372746084c46f2ac8c9685c583d2be10eefd89d3d1a3" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb7846e0cb180355c2dec69e721edafa36919850f1a9f52ffba4ebc0393cb71" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "bytemuck" version = "1.22.0" @@ -2586,7 +2611,7 @@ dependencies = [ "sha2", "sha3", "thiserror 1.0.69", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -4288,6 +4313,26 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "munge" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cce144fab80fbb74ec5b89d1ca9d41ddf6b644ab7e986f7d3ed0aab31625cb1" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "574af9cd5b9971cbfdf535d6a8d533778481b241c447826d976101e0149392a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "native-tls" version = "0.2.14" @@ -5401,6 +5446,26 @@ dependencies = [ "prost", ] +[[package]] +name = "ptr_meta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -5482,6 +5547,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "rancor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" +dependencies = [ + "ptr_meta", +] + [[package]] name = "rand" version = "0.8.5" @@ -5679,6 +5753,15 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" +[[package]] +name = "rend" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35e8a6bf28cd121053a66aa2e6a2e3eaffad4a60012179f0e864aa5ffeff215" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.11.27" @@ -5831,6 +5914,36 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "rkyv" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e147371c75553e1e2fcdb483944a8540b8438c31426279553b9a8182a9b7b65" +dependencies = [ + "bytecheck", + "bytes", + "hashbrown 0.15.2", + "indexmap 2.9.0", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid 1.17.0", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246b40ac189af6c675d124b802e8ef6d5246c53e17367ce9501f8f66a81abb7a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "rlp" version = "0.5.2" @@ -6491,6 +6604,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "similar" version = "2.7.0" @@ -7923,6 +8042,7 @@ dependencies = [ "hex", "hex-literal", "rand 0.9.1", + "rkyv", "rs_merkle", "serde", "serde_with", @@ -7988,6 +8108,16 @@ dependencies = [ "serde", ] +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" diff --git a/Cargo.toml b/Cargo.toml index 3ca4a0e3..6d4611d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,6 +64,7 @@ pbjson = "0.7.0" pin-project = "1.1" prost = "0.13.4" rand = "0.9.0" +rkyv = { version = "0.8", features = ["hashbrown-0_15", "std", "bytecheck"] } rs_merkle = { version = "1.4", default-features = false } rstest = "0.25.0" serde = { version = "1.0", features = ["derive"] } diff --git a/crates/agglayer-primitives/Cargo.toml b/crates/agglayer-primitives/Cargo.toml index c4bfc273..01d57925 100644 --- a/crates/agglayer-primitives/Cargo.toml +++ b/crates/agglayer-primitives/Cargo.toml @@ -19,6 +19,7 @@ alloy-primitives.workspace = true arbitrary = { workspace = true, optional = true } byteorder.workspace = true k256.workspace = true +rkyv.workspace = true serde.workspace = true hex.workspace = true rand = { workspace = true, optional = true } diff --git a/crates/agglayer-primitives/src/digest.rs b/crates/agglayer-primitives/src/digest.rs index a60c5fcc..d4cf93f2 100644 --- a/crates/agglayer-primitives/src/digest.rs +++ b/crates/agglayer-primitives/src/digest.rs @@ -9,7 +9,19 @@ use crate::{ U256, }; -#[derive(Default, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)] +#[derive( + Default, + Hash, + PartialEq, + Eq, + PartialOrd, + Ord, + Clone, + Copy, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct Digest(pub [u8; 32]); diff --git a/crates/agglayer-primitives/src/keccak.rs b/crates/agglayer-primitives/src/keccak.rs index 1d45c219..c33aaf72 100644 --- a/crates/agglayer-primitives/src/keccak.rs +++ b/crates/agglayer-primitives/src/keccak.rs @@ -42,7 +42,7 @@ pub trait Hasher { } /// A Keccak hasher with a 256-bit security level. -#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq, rkyv::Archive)] pub struct Keccak256Hasher; impl Hasher for Keccak256Hasher { diff --git a/crates/agglayer-primitives/src/signature.rs b/crates/agglayer-primitives/src/signature.rs index 324a1343..69e94392 100644 --- a/crates/agglayer-primitives/src/signature.rs +++ b/crates/agglayer-primitives/src/signature.rs @@ -1,13 +1,74 @@ use alloy_primitives::Signature as AlloySignature; use k256::ecdsa; +use rkyv::{Archive, Deserialize, Serialize}; use super::{Address, SignatureError, B256, U256}; +#[derive( + Copy, + Debug, + Hash, + PartialEq, + Eq, + Clone, + serde::Serialize, + serde::Deserialize, + Archive, + Serialize, + Deserialize, +)] +#[rkyv(remote = AlloySignature)] +struct AlloySignatureDef { + #[rkyv(getter = AlloySignature::v)] + y_parity: bool, + #[rkyv(getter = AlloySignature::r, with = U256Def)] + r: U256, + #[rkyv(getter = AlloySignature::s, with = U256Def)] + s: U256, +} + +impl From for AlloySignature { + #[inline] + fn from(value: AlloySignatureDef) -> Self { + AlloySignature::new(value.r, value.s, value.y_parity) + } +} + +#[derive(Archive, Serialize, Deserialize)] +#[rkyv(remote = U256)] +pub struct U256Def { + #[rkyv(getter = U256::as_limbs)] + limbs: [u64; 4], +} + +impl From for U256 { + #[inline] + fn from(value: U256Def) -> Self { + U256::from_limbs(value.limbs) + } +} + /// A wrapper over [AlloySignature] with custom serialization. -#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[derive( + Clone, + Copy, + Debug, + Hash, + PartialEq, + Eq, + serde::Serialize, + serde::Deserialize, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] #[serde(from = "compat::Signature", into = "compat::Signature")] -pub struct Signature(AlloySignature); +pub struct Signature { + #[serde(with = "AlloySignatureDef")] + #[rkyv(with = AlloySignatureDef)] + inner: AlloySignature, +} impl Signature { #[inline] @@ -22,46 +83,47 @@ impl Signature { #[inline] pub fn recover_address_from_prehash(&self, prehash: &B256) -> Result { - self.0.recover_address_from_prehash(prehash) + let signature: AlloySignature = self.inner.into(); + signature.recover_address_from_prehash(prehash) } #[inline] pub fn as_primitive_signature(&self) -> &AlloySignature { - &self.0 + &self.inner } #[inline] pub fn as_bytes(&self) -> [u8; 65] { - self.0.as_bytes() + self.inner.as_bytes() } #[inline] pub fn r(&self) -> U256 { - self.0.r() + self.inner.r() } #[inline] pub fn s(&self) -> U256 { - self.0.s() + self.inner.s() } #[inline] pub fn v(&self) -> bool { - self.0.v() + self.inner.v() } } impl From for Signature { #[inline] fn from(ps: AlloySignature) -> Self { - Self(ps) + Self { inner: ps.into() } } } impl From for AlloySignature { #[inline] fn from(value: Signature) -> Self { - value.0 + value.inner } } @@ -70,7 +132,7 @@ impl TryFrom<&[u8]> for Signature { #[inline] fn try_from(sig: &[u8]) -> Result { - sig.try_into().map(Self) + sig.try_into().map(|inner| Self { inner }) } } @@ -79,7 +141,7 @@ impl std::str::FromStr for Signature { #[inline] fn from_str(s: &str) -> Result { - s.parse().map(Self) + s.parse().map(|inner| Self { inner }) } } @@ -104,7 +166,7 @@ mod compat { impl From for Signature { #[inline] fn from(sig: super::Signature) -> Self { - Self::new(sig.0.r(), sig.0.s(), sig.0.v()) + Self::new(sig.inner.r(), sig.inner.s(), sig.inner.v()) } } diff --git a/crates/agglayer-tries/Cargo.toml b/crates/agglayer-tries/Cargo.toml index 7fba0708..da05b064 100644 --- a/crates/agglayer-tries/Cargo.toml +++ b/crates/agglayer-tries/Cargo.toml @@ -13,6 +13,7 @@ workspace = true agglayer-primitives.workspace = true hex.workspace = true +rkyv.workspace = true serde.workspace = true serde_with.workspace = true thiserror.workspace = true diff --git a/crates/agglayer-tries/src/proof.rs b/crates/agglayer-tries/src/proof.rs index 5776e84d..7c06a946 100644 --- a/crates/agglayer-tries/src/proof.rs +++ b/crates/agglayer-tries/src/proof.rs @@ -23,18 +23,22 @@ impl ToBits<32> for u32 { } #[serde_as] -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive( + Clone, Debug, Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, +)] pub struct SmtMerkleProof where H: Hasher, - H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned, + H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned + rkyv::Archive, { #[serde_as(as = "[_; DEPTH]")] pub siblings: [H::Digest; DEPTH], } #[serde_as] -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive( + Clone, Debug, Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, +)] pub struct SmtNonInclusionProof where H: Hasher, @@ -47,7 +51,7 @@ where impl SmtMerkleProof where H: Hasher, - H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned, + H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned + rkyv::Archive, { pub fn verify(&self, key: K, value: H::Digest, root: H::Digest) -> bool where diff --git a/crates/agglayer-tries/src/smt.rs b/crates/agglayer-tries/src/smt.rs index e7eb947d..fa47d026 100644 --- a/crates/agglayer-tries/src/smt.rs +++ b/crates/agglayer-tries/src/smt.rs @@ -39,7 +39,7 @@ where impl Default for Smt where H: Hasher, - H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned + Default, + H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned + Default + rkyv::Archive, { #[inline] fn default() -> Self { @@ -50,7 +50,7 @@ where impl Smt where H: Hasher, - H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned, + H::Digest: Copy + Eq + Hash + Serialize + DeserializeOwned + rkyv::Archive, { #[inline] pub fn new() -> Self diff --git a/crates/unified-bridge/Cargo.toml b/crates/unified-bridge/Cargo.toml index dc9ee769..b7df7171 100644 --- a/crates/unified-bridge/Cargo.toml +++ b/crates/unified-bridge/Cargo.toml @@ -19,6 +19,7 @@ agglayer-tries.workspace = true arbitrary = { workspace = true, optional = true } hex-literal.workspace = true +rkyv.workspace = true serde.workspace = true serde_with.workspace = true sha2.workspace = true diff --git a/crates/unified-bridge/src/bridge_exit.rs b/crates/unified-bridge/src/bridge_exit.rs index 907dcd59..63d6e1cf 100644 --- a/crates/unified-bridge/src/bridge_exit.rs +++ b/crates/unified-bridge/src/bridge_exit.rs @@ -21,9 +21,46 @@ impl Hashable for TokenInfo { } } +// TODO: Repeated code (crates/agglayer-primitives/src/signature.rs), consider +// refactoring +#[derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(remote = U256)] +pub struct U256Def { + #[rkyv(getter = U256::as_limbs)] + limbs: [u64; 4], +} + +impl From for U256 { + #[inline] + fn from(value: U256Def) -> Self { + U256::from_limbs(value.limbs) + } +} + +#[derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(remote = Address)] +pub struct AddressDef([u8; 20]); + +impl From for Address { + #[inline] + fn from(value: AddressDef) -> Self { + Address::from_slice(&value.0) + } +} + /// Represents a token bridge exit from the network. // TODO: Change it to an enum depending on `leaf_type`. -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct BridgeExit { pub leaf_type: LeafType, @@ -34,9 +71,11 @@ pub struct BridgeExit { /// Network which the token is transferred to pub dest_network: NetworkId, /// Address which will own the received token + #[rkyv(with = AddressDef)] pub dest_address: Address, /// Token amount sent + #[rkyv(with = U256Def)] pub amount: U256, pub metadata: Option, diff --git a/crates/unified-bridge/src/global_index.rs b/crates/unified-bridge/src/global_index.rs index b195eed6..c3f66b47 100644 --- a/crates/unified-bridge/src/global_index.rs +++ b/crates/unified-bridge/src/global_index.rs @@ -9,7 +9,20 @@ use crate::{InvalidRollupIndexError, NetworkId, RollupIndex}; /// Further defined by the LXLY specifications. /// | 191 bits | 1 bit | 32 bits | 32 bits | /// | 0 | mainnet flag | rollup index | leaf index | -#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, PartialOrd, Ord, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + Copy, + PartialEq, + PartialOrd, + Ord, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] pub struct GlobalIndex { mainnet_flag: bool, rollup_index: RollupIndex, diff --git a/crates/unified-bridge/src/imported_bridge_exit.rs b/crates/unified-bridge/src/imported_bridge_exit.rs index 34131ff5..d5443611 100644 --- a/crates/unified-bridge/src/imported_bridge_exit.rs +++ b/crates/unified-bridge/src/imported_bridge_exit.rs @@ -56,7 +56,17 @@ impl Hashable for ClaimFromRollup { ]) } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct L1InfoTreeLeafInner { pub global_exit_root: Digest, @@ -75,7 +85,17 @@ impl L1InfoTreeLeafInner { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct L1InfoTreeLeaf { pub l1_info_tree_index: u32, @@ -136,7 +156,17 @@ pub enum Error { InvalidExitNetwork, } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct MerkleProof { pub proof: LETMerkleProof, @@ -163,14 +193,34 @@ impl MerkleProof { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub enum Claim { Mainnet(Box), Rollup(Box), } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct ClaimFromMainnet { /// Proof from bridge exit leaf to MER @@ -213,7 +263,17 @@ impl ClaimFromMainnet { } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct ClaimFromRollup { /// Proof from bridge exit leaf to LER @@ -272,7 +332,17 @@ impl ClaimFromRollup { /// Represents a token bridge exit originating on another network but claimed on /// the current network. -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Debug, + Clone, + Serialize, + Deserialize, + PartialEq, + Eq, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct ImportedBridgeExit { /// The bridge exit initiated on another network, called the "sending" diff --git a/crates/unified-bridge/src/local_exit_tree/mod.rs b/crates/unified-bridge/src/local_exit_tree/mod.rs index 0937484f..5e384c87 100644 --- a/crates/unified-bridge/src/local_exit_tree/mod.rs +++ b/crates/unified-bridge/src/local_exit_tree/mod.rs @@ -7,11 +7,13 @@ pub mod proof; /// Represents a local exit tree as defined by the LxLy bridge. #[serde_as] -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive( + Clone, Debug, Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, +)] pub struct LocalExitTree where H: Hasher, - H::Digest: Serialize + for<'a> Deserialize<'a>, + H::Digest: Serialize + for<'a> Deserialize<'a> + rkyv::Archive, { /// The number of inserted (non-empty) leaves. pub leaf_count: u32, @@ -41,7 +43,7 @@ pub enum LocalExitTreeError { impl Default for LocalExitTree where H: Hasher, - H::Digest: Copy + Default + Serialize + for<'a> Deserialize<'a>, + H::Digest: Copy + Default + Serialize + for<'a> Deserialize<'a> + rkyv::Archive, { #[inline] fn default() -> Self { @@ -55,7 +57,7 @@ where impl LocalExitTree where H: Hasher, - H::Digest: Copy + Default + Serialize + for<'a> Deserialize<'a>, + H::Digest: Copy + Default + Serialize + for<'a> Deserialize<'a> + rkyv::Archive, { const MAX_NUM_LEAVES: u32 = ((1u64 << TREE_DEPTH) - 1) as u32; diff --git a/crates/unified-bridge/src/local_exit_tree/proof.rs b/crates/unified-bridge/src/local_exit_tree/proof.rs index 3de9f9ad..a0771614 100644 --- a/crates/unified-bridge/src/local_exit_tree/proof.rs +++ b/crates/unified-bridge/src/local_exit_tree/proof.rs @@ -6,11 +6,22 @@ use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_with::serde_as; #[serde_as] -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +#[derive( + Clone, + Debug, + Serialize, + Deserialize, + PartialEq, + Eq, + Hash, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] pub struct LETMerkleProof where H: Hasher, - H::Digest: Serialize + DeserializeOwned, + H::Digest: Serialize + DeserializeOwned + rkyv::Archive, { #[serde_as(as = "[_; TREE_DEPTH]")] pub siblings: [H::Digest; TREE_DEPTH], @@ -20,7 +31,7 @@ where impl<'a, H, const TREE_DEPTH: usize> arbitrary::Arbitrary<'a> for LETMerkleProof where H: Hasher, - H::Digest: Serialize + DeserializeOwned + arbitrary::Arbitrary<'a>, + H::Digest: Serialize + DeserializeOwned + arbitrary::Arbitrary<'a> + rkyv::Archive, { #[inline] fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { @@ -32,7 +43,7 @@ where impl LETMerkleProof where H: Hasher, - H::Digest: Eq + Copy + Default + Serialize + DeserializeOwned, + H::Digest: Eq + Copy + Default + Serialize + DeserializeOwned + rkyv::Archive, { #[inline] pub fn verify(&self, leaf: H::Digest, leaf_index: u32, root: H::Digest) -> bool { diff --git a/crates/unified-bridge/src/network_id.rs b/crates/unified-bridge/src/network_id.rs index b980efdb..939e773c 100644 --- a/crates/unified-bridge/src/network_id.rs +++ b/crates/unified-bridge/src/network_id.rs @@ -5,7 +5,21 @@ use serde::{Deserialize, Serialize}; /// A network ID. /// /// 0 refers to ethereum, and rollups are numbered from 1 to `u32::MAX`. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash)] +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Serialize, + Deserialize, + Hash, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct NetworkId(u32); diff --git a/crates/unified-bridge/src/rollup_index.rs b/crates/unified-bridge/src/rollup_index.rs index 575270f7..feb9e67a 100644 --- a/crates/unified-bridge/src/rollup_index.rs +++ b/crates/unified-bridge/src/rollup_index.rs @@ -5,7 +5,20 @@ use crate::{NetworkId, RollupId}; /// A rollup index. /// /// Rollups are numbered from 0 to `u32::MAX - 1`. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Hash)] +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Serialize, + Hash, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct RollupIndex( #[cfg_attr(feature = "testutils", arbitrary(with = |u: &mut arbitrary::Unstructured| u.int_in_range(0..=u32::MAX - 1)))] diff --git a/crates/unified-bridge/src/token_info.rs b/crates/unified-bridge/src/token_info.rs index c119c014..4f1b3a50 100644 --- a/crates/unified-bridge/src/token_info.rs +++ b/crates/unified-bridge/src/token_info.rs @@ -11,17 +11,42 @@ pub const L1_ETH: TokenInfo = TokenInfo { /// Encapsulates the information to uniquely identify a token on the origin /// network. -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Copy)] +#[derive( + Debug, + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Serialize, + Deserialize, + Copy, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub struct TokenInfo { /// Network which the token originates from pub origin_network: NetworkId, /// The address of the token on the origin network + #[rkyv(with = crate::bridge_exit::AddressDef)] pub origin_token_address: Address, } -#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive( + Debug, + Copy, + Clone, + PartialEq, + Eq, + Serialize, + Deserialize, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, +)] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] pub enum LeafType { Transfer = 0,