diff --git a/Cargo.lock b/Cargo.lock index a9f67976..0b342b69 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", @@ -1549,6 +1551,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" @@ -3495,6 +3520,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" @@ -4467,6 +4512,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" @@ -4548,6 +4613,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" @@ -4745,6 +4819,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.12.15" @@ -4832,6 +4915,36 @@ dependencies = [ "windows-sys 0.52.0", ] +[[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", +] + +[[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" @@ -5403,6 +5516,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" @@ -6695,6 +6814,7 @@ dependencies = [ "arbitrary", "hex", "hex-literal", + "rkyv", "serde", "serde_with", "sha2", @@ -6743,6 +6863,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[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 d4dc076f..c8757210 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,6 +71,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 a80731ac..2995e16a 100644 --- a/crates/agglayer-primitives/Cargo.toml +++ b/crates/agglayer-primitives/Cargo.toml @@ -20,6 +20,7 @@ arbitrary = { workspace = true, optional = true } byteorder.workspace = true derive_more.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/address.rs b/crates/agglayer-primitives/src/address.rs index fa83e18b..e90c12c4 100644 --- a/crates/agglayer-primitives/src/address.rs +++ b/crates/agglayer-primitives/src/address.rs @@ -1,5 +1,16 @@ pub use alloy_primitives::Address as AlloyAddress; +#[derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(remote = AlloyAddress)] +pub struct AddressDef([u8; 20]); + +impl From for AlloyAddress { + #[inline] + fn from(value: AddressDef) -> Self { + AlloyAddress::from_slice(&value.0) + } +} + /// A wrapper over [alloy_primitives::Address] that allows us to add custom /// methods and trait implementations. #[derive( @@ -20,6 +31,9 @@ pub use alloy_primitives::Address as AlloyAddress; derive_more::Display, derive_more::LowerHex, derive_more::UpperHex, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, )] #[cfg_attr(feature = "testutils", derive(arbitrary::Arbitrary))] #[from(AlloyAddress, [u8; 20])] @@ -27,7 +41,8 @@ pub use alloy_primitives::Address as AlloyAddress; #[as_ref(AlloyAddress, [u8; 20], [u8])] #[repr(transparent)] #[serde(rename = "agglayer_primitives::Address")] -pub struct Address(AlloyAddress); + +pub struct Address(#[rkyv(with = AddressDef)] pub AlloyAddress); impl Address { pub const ZERO: Self = Self::from_alloy(AlloyAddress::ZERO); diff --git a/crates/agglayer-primitives/src/digest.rs b/crates/agglayer-primitives/src/digest.rs index ba263ede..71298ab8 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/lib.rs b/crates/agglayer-primitives/src/lib.rs index aef70b1c..9f7f7641 100644 --- a/crates/agglayer-primitives/src/lib.rs +++ b/crates/agglayer-primitives/src/lib.rs @@ -10,6 +10,6 @@ pub mod keccak; mod signature; mod utils; -pub use address::Address; +pub use address::{Address, AddressDef}; pub use digest::Digest; pub use utils::{FromBool, FromU256, Hashable}; diff --git a/crates/agglayer-primitives/src/signature.rs b/crates/agglayer-primitives/src/signature.rs index 293e01cf..8b2f6c2b 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)] + AlloySignature, +); impl Signature { #[inline] @@ -22,7 +83,8 @@ impl Signature { #[inline] pub fn recover_address_from_prehash(&self, prehash: &B256) -> Result { - self.0 + let signature: AlloySignature = self.0.into(); + signature .recover_address_from_prehash(prehash) .map(Address::from) } 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 952eae1b..5a193ccb 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..a3c7bcb9 100644 --- a/crates/unified-bridge/src/bridge_exit.rs +++ b/crates/unified-bridge/src/bridge_exit.rs @@ -21,9 +21,35 @@ 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) + } +} + /// 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, @@ -37,6 +63,7 @@ pub struct BridgeExit { 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 504f154f..898396a4 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, @@ -137,7 +157,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, @@ -164,14 +194,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), + Mainnet(ClaimFromMainnet), + Rollup(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 ClaimFromMainnet { /// Proof from bridge exit leaf to MER @@ -214,7 +264,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 @@ -273,7 +333,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 c62481f6..e1b70cda 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 5cde1829..4613b649 100644 --- a/crates/unified-bridge/src/token_info.rs +++ b/crates/unified-bridge/src/token_info.rs @@ -11,7 +11,20 @@ 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 @@ -21,7 +34,18 @@ pub struct TokenInfo { 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,