From 1479d4b255d674f4414edc9030f7596407cb89a2 Mon Sep 17 00:00:00 2001 From: benluelo Date: Tue, 14 Jan 2025 16:05:44 +0000 Subject: [PATCH] refactor: move uint into unionlabs-primitives and split linea types --- Cargo.lock | 37 +- Cargo.toml | 6 +- clippy.toml | 2 +- .../light-clients/arbitrum/src/client.rs | 2 +- .../light-clients/ethereum/src/client.rs | 7 +- .../light-clients/ethereum/src/errors.rs | 2 +- .../light-clients/linea/src/client.rs | 3 +- .../light-clients/movement/src/client.rs | 3 +- .../light-clients/scroll/src/client.rs | 2 +- .../state-lens-ics23-mpt/src/client.rs | 3 +- .../state-lens-ics23-mpt/src/errors.rs | 3 +- cosmwasm/ucs02-nft/src/contract.rs | 2 +- .../src/client_state.rs | 4 +- .../src/l2_header.rs | 5 +- lib/arbitrum-verifier/src/lib.rs | 3 +- lib/beacon-api-types/src/execution_payload.rs | 5 +- .../src/execution_payload_header.rs | 5 +- .../src/client_state.rs | 2 +- lib/chain-utils/src/arbitrum.rs | 3 +- lib/chain-utils/src/berachain.rs | 3 +- lib/chain-utils/src/ethereum.rs | 3 +- lib/chain-utils/src/scroll.rs | 3 +- lib/cometbls-groth16-verifier/src/lib.rs | 5 +- .../src/client_state.rs | 3 +- lib/ethereum-light-client-types/src/header.rs | 3 +- .../src/light_client_update.rs | 3 +- .../src/storage_proof.rs | 4 +- lib/evm-storage-verifier/src/lib.rs | 3 +- lib/ibc-union-spec/src/lib.rs | 3 +- lib/linea-light-client-types/Cargo.toml | 1 + .../src/client_state.rs | 5 +- lib/linea-light-client-types/src/header.rs | 3 +- lib/linea-types/Cargo.toml | 13 + .../src/linea => linea-types/src}/account.rs | 6 +- .../src/linea.rs => linea-types/src/lib.rs} | 0 .../src/linea => linea-types/src}/proof.rs | 20 +- lib/linea-verifier/Cargo.toml | 1 + lib/linea-verifier/src/lib.rs | 7 +- lib/linea-zktrie/Cargo.toml | 1 + lib/linea-zktrie/src/verify.rs | 22 +- .../src/client_state.rs | 5 +- lib/scroll-rpc/src/lib.rs | 9 +- lib/scroll-rpc/tests/tests.rs | 2 +- lib/scroll-verifier/src/lib.rs | 3 +- lib/serde-utils/src/lib.rs | 27 -- lib/ssz/src/lib.rs | 38 ++ lib/ssz/tests-generator/src/main.rs | 5 +- .../spec_conformance/basic_vector_invalid.rs | 2 +- .../spec_conformance/basic_vector_valid.rs | 2 +- .../tests/spec_conformance/bitlist_invalid.rs | 2 +- .../tests/spec_conformance/bitlist_valid.rs | 2 +- .../spec_conformance/bitvector_invalid.rs | 2 +- .../tests/spec_conformance/bitvector_valid.rs | 2 +- .../tests/spec_conformance/boolean_invalid.rs | 2 +- .../tests/spec_conformance/boolean_valid.rs | 2 +- .../spec_conformance/containers_invalid.rs | 2 +- .../spec_conformance/containers_valid.rs | 2 +- .../tests/spec_conformance/uints_invalid.rs | 2 +- lib/ssz/tests/spec_conformance/uints_valid.rs | 2 +- lib/unionlabs-primitives/Cargo.toml | 15 +- lib/unionlabs-primitives/src/lib.rs | 4 + .../src/uint.rs | 341 ++++++++---------- lib/unionlabs/Cargo.toml | 1 - lib/unionlabs/src/ethereum.rs | 3 +- lib/unionlabs/src/ethereum/slot.rs | 5 +- lib/unionlabs/src/lib.rs | 6 - lib/unionlabs/src/scroll/account.rs | 3 +- .../client-bootstrap/movement/src/main.rs | 3 +- voyager/modules/proof/ethereum/src/main.rs | 4 +- voyager/modules/proof/movement/src/main.rs | 3 +- 70 files changed, 349 insertions(+), 363 deletions(-) create mode 100644 lib/linea-types/Cargo.toml rename lib/{unionlabs/src/linea => linea-types/src}/account.rs (97%) rename lib/{unionlabs/src/linea.rs => linea-types/src/lib.rs} (100%) rename lib/{unionlabs/src/linea => linea-types/src}/proof.rs (65%) rename lib/{unionlabs => unionlabs-primitives}/src/uint.rs (60%) diff --git a/Cargo.lock b/Cargo.lock index 5bcb4e415f..78317fcf42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4896,6 +4896,17 @@ dependencies = [ "bytes", ] +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec 0.7.4", + "auto_impl", + "bytes", +] + [[package]] name = "ff" version = "0.13.0" @@ -7001,6 +7012,15 @@ version = "0.1.0" dependencies = [ "ethereum-light-client-types", "hex-literal", + "linea-types", + "serde", + "unionlabs", +] + +[[package]] +name = "linea-types" +version = "0.1.0" +dependencies = [ "serde", "unionlabs", ] @@ -7012,6 +7032,7 @@ dependencies = [ "evm-storage-verifier", "gnark-mimc", "linea-light-client-types", + "linea-types", "linea-zktrie", "rlp", "thiserror", @@ -7025,6 +7046,7 @@ dependencies = [ "gnark-mimc", "hex", "hex-literal", + "linea-types", "serde", "serde_json", "thiserror", @@ -9207,9 +9229,9 @@ dependencies = [ [[package]] name = "proptest" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", @@ -9947,16 +9969,18 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", - "fastrlp", + "fastrlp 0.3.1", + "fastrlp 0.4.0", "num-bigint 0.4.6", + "num-integer", "num-traits", "parity-scale-codec 3.6.9", "primitive-types 0.12.2", @@ -12707,7 +12731,6 @@ dependencies = [ "subtle-encoding", "thiserror", "typenum", - "uint", "unionlabs-primitives", "wasmparser", ] @@ -12727,6 +12750,8 @@ dependencies = [ "serde_bytes", "thiserror", "typenum", + "uint", + "unionlabs", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9123cc4c4c..25a6d5c262 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -172,6 +172,7 @@ members = [ "lib/ibc-classic-spec", "lib/state-lens-light-client-types", "lib/create3", + "lib/linea-types", ] [workspace.package] @@ -229,6 +230,7 @@ tendermint-light-client-types = { path = "lib/tendermint-light-client-types", de tendermint-verifier = { path = "lib/tendermint-verifier", default-features = false } linea-light-client-types = { path = "lib/linea-light-client-types", default-features = false } +linea-types = { path = "lib/linea-types", default-features = false } linea-zktrie = { path = "lib/linea-zktrie", default-features = false } ibc-solidity = { path = "lib/ibc-solidity", default-features = false } @@ -272,8 +274,6 @@ voyager-core = { path = "lib/voyager-core", default-features = false } voyager-message = { path = "lib/voyager-message", default-features = false } voyager-vm = { path = "lib/voyager-vm", default-features = false } -voyager-consensus-module-tendermint = { path = "voyager/modules/consensus/tendermint", default-features = false } - # external dependencies milagro_bls = { git = "https://github.com/Snowfork/milagro_bls", rev = "bc2b5b5e8d48b7e2e1bfaa56dc2d93e13cb32095", default-features = false } tendermint-rpc = { git = "https://github.com/unionlabs/tendermint-rs", branch = "v0.39.1-bn254", default-features = false } @@ -307,7 +307,6 @@ ethabi = { version = "18.0.0", default-features = false } frame-support-procedural = { version = "30.0.0", default-features = false } futures = { version = "0.3.28", default-features = false } generic-array = { version = "0.14.7", default-features = false } -go-parse-duration = { version = "0.1.1", default-features = false } hex = { version = "0.4.3", default-features = false } hex-literal = { version = "0.4.1", default-features = false } jsonrpsee = { version = "0.24.2", default-features = false } @@ -322,7 +321,6 @@ ripemd = { version = "0.1.3", default-features = false } rlp = { version = "0.5.2", default-features = false } schemars = { version = "0.8.3", default-features = false } serde = { version = "1.0.0", default-features = false } -serde-json-wasm = { version = "1.0.0", default-features = false } serde_json = { version = "1.0.0", default-features = false, features = ["alloc"] } # serde-json requires one of "std" or "alloc" serde_with = { version = "3.7.0", default-features = false, features = ["macros"] } sha2 = { version = "0.10.7", default-features = false } diff --git a/clippy.toml b/clippy.toml index 009c4d9fff..40d5a36121 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1 +1 @@ -disallowed-types = [{ path = "primitive_types::U256", reason = "use unionlabs::uint::U256" }] +disallowed-types = [{ path = "primitive_types::U256", reason = "use unionlabs::primimtives::U256" }] diff --git a/cosmwasm/ibc-union/light-clients/arbitrum/src/client.rs b/cosmwasm/ibc-union/light-clients/arbitrum/src/client.rs index ef909c6e2a..f5fd2278f1 100644 --- a/cosmwasm/ibc-union/light-clients/arbitrum/src/client.rs +++ b/cosmwasm/ibc-union/light-clients/arbitrum/src/client.rs @@ -146,7 +146,7 @@ impl IbcClient for ArbitrumLightClient { // primitives::{H160, H256}, // ibc::core::client::height::Height, // id::ClientId, -// uint::U256, +// primitives::U256, // }; // use super::{ diff --git a/cosmwasm/ibc-union/light-clients/ethereum/src/client.rs b/cosmwasm/ibc-union/light-clients/ethereum/src/client.rs index 78f156de6c..1251bc5f4b 100644 --- a/cosmwasm/ibc-union/light-clients/ethereum/src/client.rs +++ b/cosmwasm/ibc-union/light-clients/ethereum/src/client.rs @@ -15,8 +15,11 @@ use evm_storage_verifier::{ use ibc_union_light_client::{IbcClientCtx, IbcClientError}; use ibc_union_msg::lightclient::Status; use unionlabs::{ - encoding::Bincode, ensure, ethereum::ibc_commitment_key, ibc::core::client::height::Height, - primitives::H256, uint::U256, + encoding::Bincode, + ensure, + ethereum::ibc_commitment_key, + ibc::core::client::height::Height, + primitives::{H256, U256}, }; use crate::{errors::Error, verification::VerificationContext}; diff --git a/cosmwasm/ibc-union/light-clients/ethereum/src/errors.rs b/cosmwasm/ibc-union/light-clients/ethereum/src/errors.rs index 15f3e27e47..9de34885dc 100644 --- a/cosmwasm/ibc-union/light-clients/ethereum/src/errors.rs +++ b/cosmwasm/ibc-union/light-clients/ethereum/src/errors.rs @@ -1,7 +1,7 @@ use beacon_api_types::Slot; use cosmwasm_std::StdError; use ibc_union_light_client::IbcClientError; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; use crate::client::EthereumLightClient; diff --git a/cosmwasm/ibc-union/light-clients/linea/src/client.rs b/cosmwasm/ibc-union/light-clients/linea/src/client.rs index c7b29b2c64..8d0eaaeffc 100644 --- a/cosmwasm/ibc-union/light-clients/linea/src/client.rs +++ b/cosmwasm/ibc-union/light-clients/linea/src/client.rs @@ -26,8 +26,7 @@ use unionlabs::{ account::ZkAccount, proof::{InclusionProof, NonInclusionProof}, }, - primitives::H256, - uint::U256, + primitives::{H256, U256}, }; use crate::errors::Error; diff --git a/cosmwasm/ibc-union/light-clients/movement/src/client.rs b/cosmwasm/ibc-union/light-clients/movement/src/client.rs index c7a7558ec8..e76622f520 100644 --- a/cosmwasm/ibc-union/light-clients/movement/src/client.rs +++ b/cosmwasm/ibc-union/light-clients/movement/src/client.rs @@ -8,8 +8,7 @@ use unionlabs::{ account::AccountAddress, storage_proof::StorageProof, transaction_info::TransactionInfo, }, encoding::Bincode, - primitives::H256, - uint::U256, + primitives::{H256, U256}, }; use crate::error::Error; diff --git a/cosmwasm/ibc-union/light-clients/scroll/src/client.rs b/cosmwasm/ibc-union/light-clients/scroll/src/client.rs index 4acaf13f69..8c8fb1be51 100644 --- a/cosmwasm/ibc-union/light-clients/scroll/src/client.rs +++ b/cosmwasm/ibc-union/light-clients/scroll/src/client.rs @@ -181,7 +181,7 @@ pub fn verify_header( // google::protobuf::any::Any, // primitives::{H160, H256}, // ibc::core::client::height::Height, -// uint::U256, +// primitives::U256, // }; // use super::{ diff --git a/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/client.rs b/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/client.rs index ffdf44ae64..8aeb5724ef 100644 --- a/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/client.rs +++ b/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/client.rs @@ -10,8 +10,7 @@ use unionlabs::{ encoding::{Bincode, DecodeAs}, ethereum::{ibc_commitment_key, keccak256}, ibc::core::commitment::merkle_proof::MerkleProof, - primitives::H256, - uint::U256, + primitives::{H256, U256}, }; use crate::errors::Error; diff --git a/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/errors.rs b/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/errors.rs index 44c0d0eaec..12ef21645f 100644 --- a/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/errors.rs +++ b/cosmwasm/ibc-union/light-clients/state-lens-ics23-mpt/src/errors.rs @@ -3,8 +3,7 @@ use cosmwasm_std::StdError; use ibc_union_light_client::IbcClientError; use unionlabs::{ ibc::core::client::height::Height, - primitives::{Bytes, H256}, - uint::U256, + primitives::{Bytes, H256, U256}, }; use crate::client::StateLensIcs23MptLightClient; diff --git a/cosmwasm/ucs02-nft/src/contract.rs b/cosmwasm/ucs02-nft/src/contract.rs index 03c5648de4..247b5eb533 100644 --- a/cosmwasm/ucs02-nft/src/contract.rs +++ b/cosmwasm/ucs02-nft/src/contract.rs @@ -16,7 +16,7 @@ use ics721::{ execute::Ics721Execute, ibc::Ics721Ibc, query::Ics721Query, NonFungibleTokenPacketData, }; use thiserror::Error; -use unionlabs::uint::U256; +use unionlabs::primitives::U256; pub const CHANNEL_VERSION: Map<&str, Version> = Map::new("channel_version"); diff --git a/lib/arbitrum-light-client-types/src/client_state.rs b/lib/arbitrum-light-client-types/src/client_state.rs index 27acda4d6f..182b77772d 100644 --- a/lib/arbitrum-light-client-types/src/client_state.rs +++ b/lib/arbitrum-light-client-types/src/client_state.rs @@ -1,5 +1,7 @@ use unionlabs::{ - bounded::BoundedU32, ibc::core::client::height::Height, primitives::H160, uint::U256, + bounded::BoundedU32, + ibc::core::client::height::Height, + primitives::{H160, U256}, }; #[derive(Debug, Clone, PartialEq)] diff --git a/lib/arbitrum-light-client-types/src/l2_header.rs b/lib/arbitrum-light-client-types/src/l2_header.rs index b14d7602c6..3989f8ab58 100644 --- a/lib/arbitrum-light-client-types/src/l2_header.rs +++ b/lib/arbitrum-light-client-types/src/l2_header.rs @@ -1,9 +1,6 @@ use rlp::Encodable; use sha3::{Digest, Keccak256}; -use unionlabs::{ - primitives::{H160, H2048, H256, H64}, - uint::U256, -}; +use unionlabs::primitives::{H160, H2048, H256, H64, U256}; #[derive(Debug, Clone, PartialEq, rlp::RlpEncodable)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] diff --git a/lib/arbitrum-verifier/src/lib.rs b/lib/arbitrum-verifier/src/lib.rs index cdbfb07eb5..d8ef983978 100644 --- a/lib/arbitrum-verifier/src/lib.rs +++ b/lib/arbitrum-verifier/src/lib.rs @@ -5,8 +5,7 @@ use evm_storage_verifier::{verify_account_storage_root, verify_storage_proof}; use sha3::{Digest, Keccak256}; use unionlabs::{ ethereum::slot::{MappingKey, Slot}, - primitives::H256, - uint::U256, + primitives::{H256, U256}, }; #[derive(thiserror::Error, Debug, PartialEq, Clone)] diff --git a/lib/beacon-api-types/src/execution_payload.rs b/lib/beacon-api-types/src/execution_payload.rs index dd6cfd02d7..4e18a71b0d 100644 --- a/lib/beacon-api-types/src/execution_payload.rs +++ b/lib/beacon-api-types/src/execution_payload.rs @@ -1,7 +1,4 @@ -use unionlabs::{ - primitives::{Bytes, H160, H256}, - uint::U256, -}; +use unionlabs::primitives::{Bytes, H160, H256, U256}; #[cfg(feature = "ssz")] use { crate::{ diff --git a/lib/beacon-api-types/src/execution_payload_header.rs b/lib/beacon-api-types/src/execution_payload_header.rs index e9aa2a1dbe..498193c3f3 100644 --- a/lib/beacon-api-types/src/execution_payload_header.rs +++ b/lib/beacon-api-types/src/execution_payload_header.rs @@ -1,7 +1,4 @@ -use unionlabs::{ - primitives::{Bytes, H160, H256}, - uint::U256, -}; +use unionlabs::primitives::{Bytes, H160, H256, U256}; #[cfg(feature = "ssz")] use { crate::{BYTES_PER_LOGS_BLOOM, MAX_EXTRA_DATA_BYTES}, diff --git a/lib/berachain-light-client-types/src/client_state.rs b/lib/berachain-light-client-types/src/client_state.rs index 9557ba455c..6c79db35a4 100644 --- a/lib/berachain-light-client-types/src/client_state.rs +++ b/lib/berachain-light-client-types/src/client_state.rs @@ -1,4 +1,4 @@ -use unionlabs::{primitives::H160, uint::U256}; +use unionlabs::primitives::{H160, U256}; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] diff --git a/lib/chain-utils/src/arbitrum.rs b/lib/chain-utils/src/arbitrum.rs index 1137da9184..790ef41e59 100644 --- a/lib/chain-utils/src/arbitrum.rs +++ b/lib/chain-utils/src/arbitrum.rs @@ -17,8 +17,7 @@ use unionlabs::{ ethereum::{self, storage_proof::StorageProof}, }, }, - primitives::{H160, H256}, - uint::U256, + primitives::{H160, H256, U256}, validated::ValidateT, }; diff --git a/lib/chain-utils/src/berachain.rs b/lib/chain-utils/src/berachain.rs index 3ca7e5f6ea..dd97c849db 100644 --- a/lib/chain-utils/src/berachain.rs +++ b/lib/chain-utils/src/berachain.rs @@ -26,9 +26,8 @@ use unionlabs::{ }, }, option_unwrap, - primitives::H160, + primitives::{H160, U256}, result_unwrap, - uint::U256, }; use crate::{ diff --git a/lib/chain-utils/src/ethereum.rs b/lib/chain-utils/src/ethereum.rs index e15a6c11ee..5dea3c6180 100644 --- a/lib/chain-utils/src/ethereum.rs +++ b/lib/chain-utils/src/ethereum.rs @@ -37,8 +37,7 @@ use unionlabs::{ NextConnectionSequencePath, NextSequenceAckPath, NextSequenceRecvPath, NextSequenceSendPath, ReceiptPath, }, - primitives::{H160, H256}, - uint::U256, + primitives::{H160, H256, U256}, ErrorReporter, }; diff --git a/lib/chain-utils/src/scroll.rs b/lib/chain-utils/src/scroll.rs index a9f850db39..1bab5f0224 100644 --- a/lib/chain-utils/src/scroll.rs +++ b/lib/chain-utils/src/scroll.rs @@ -14,8 +14,7 @@ use unionlabs::{ lightclients::{ethereum, scroll}, }, id::ClientId, - primitives::{H160, H256}, - uint::U256, + primitives::{H160, H256, U256}, }; use crate::{ diff --git a/lib/cometbls-groth16-verifier/src/lib.rs b/lib/cometbls-groth16-verifier/src/lib.rs index dd9068a058..905d251a9a 100644 --- a/lib/cometbls-groth16-verifier/src/lib.rs +++ b/lib/cometbls-groth16-verifier/src/lib.rs @@ -12,7 +12,10 @@ use constants::*; use hex_literal::hex; use sha3::Digest; use substrate_bn::G1; -use unionlabs::{primitives::H256, uint::U256, ByteArrayExt}; +use unionlabs::{ + primitives::{H256, U256}, + ByteArrayExt, +}; mod constants; diff --git a/lib/ethereum-light-client-types/src/client_state.rs b/lib/ethereum-light-client-types/src/client_state.rs index 29afaa7c31..b21d4b1366 100644 --- a/lib/ethereum-light-client-types/src/client_state.rs +++ b/lib/ethereum-light-client-types/src/client_state.rs @@ -1,8 +1,7 @@ use beacon_api_types::{ForkParameters, PresetBaseKind}; use unionlabs::{ ibc::core::client::height::Height, - primitives::{H160, H256}, - uint::U256, + primitives::{H160, H256, U256}, }; #[derive(Debug, Clone, PartialEq)] diff --git a/lib/ethereum-light-client-types/src/header.rs b/lib/ethereum-light-client-types/src/header.rs index a1b15f8eec..a5028ea924 100644 --- a/lib/ethereum-light-client-types/src/header.rs +++ b/lib/ethereum-light-client-types/src/header.rs @@ -24,9 +24,8 @@ mod tests { }; use unionlabs::{ encoding::{Bincode, Json}, - primitives::{H160, H256, H384, H768}, + primitives::{H160, H256, H384, H768, U256}, test_utils::assert_codec_iso, - uint::U256, }; use super::*; diff --git a/lib/ethereum-light-client-types/src/light_client_update.rs b/lib/ethereum-light-client-types/src/light_client_update.rs index fb91bc398a..8fcfca9ee5 100644 --- a/lib/ethereum-light-client-types/src/light_client_update.rs +++ b/lib/ethereum-light-client-types/src/light_client_update.rs @@ -90,9 +90,8 @@ mod tests { }; use unionlabs::{ encoding::{Bincode, Json}, - primitives::{H160, H256, H384, H768}, + primitives::{H160, H256, H384, H768, U256}, test_utils::assert_codec_iso, - uint::U256, }; use super::*; diff --git a/lib/ethereum-light-client-types/src/storage_proof.rs b/lib/ethereum-light-client-types/src/storage_proof.rs index 9c79a6c76b..dd4c020f93 100644 --- a/lib/ethereum-light-client-types/src/storage_proof.rs +++ b/lib/ethereum-light-client-types/src/storage_proof.rs @@ -1,4 +1,4 @@ -use unionlabs::{primitives::Bytes, uint::U256}; +use unionlabs::primitives::{Bytes, U256}; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -13,8 +13,8 @@ pub struct StorageProof { mod tests { use unionlabs::{ encoding::{Bincode, Json}, + primitives::U256, test_utils::assert_codec_iso, - uint::U256, }; use super::*; diff --git a/lib/evm-storage-verifier/src/lib.rs b/lib/evm-storage-verifier/src/lib.rs index b525f9c562..ca36e3141e 100644 --- a/lib/evm-storage-verifier/src/lib.rs +++ b/lib/evm-storage-verifier/src/lib.rs @@ -5,8 +5,7 @@ use rlp::RlpDecodable; use trie_db::{Trie, TrieDBBuilder}; use unionlabs::{ ensure, - primitives::{H160, H256}, - uint::U256, + primitives::{H160, H256, U256}, }; use crate::rlp_node_codec::{keccak_256, EthLayout, KeccakHasher}; diff --git a/lib/ibc-union-spec/src/lib.rs b/lib/ibc-union-spec/src/lib.rs index 0a54d035e8..79f6df7f67 100644 --- a/lib/ibc-union-spec/src/lib.rs +++ b/lib/ibc-union-spec/src/lib.rs @@ -4,8 +4,7 @@ use serde::{Deserialize, Serialize}; use sha3::{Digest, Keccak256}; use unionlabs::{ ibc::core::client::height::Height, - primitives::{Bytes, H256}, - uint::U256, + primitives::{Bytes, H256, U256}, }; use voyager_core::{ClientType, IbcSpec, IbcSpecId, IbcStorePathKey}; diff --git a/lib/linea-light-client-types/Cargo.toml b/lib/linea-light-client-types/Cargo.toml index 4e2ddfb8e1..38b86c577f 100644 --- a/lib/linea-light-client-types/Cargo.toml +++ b/lib/linea-light-client-types/Cargo.toml @@ -5,6 +5,7 @@ version = "0.1.0" [dependencies] ethereum-light-client-types = { workspace = true } +linea-types = { workspace = true } serde = { workspace = true, optional = true, features = ["derive"] } unionlabs = { workspace = true } diff --git a/lib/linea-light-client-types/src/client_state.rs b/lib/linea-light-client-types/src/client_state.rs index 78fe34ab92..ac17278ab8 100644 --- a/lib/linea-light-client-types/src/client_state.rs +++ b/lib/linea-light-client-types/src/client_state.rs @@ -1,4 +1,7 @@ -use unionlabs::{ibc::core::client::height::Height, primitives::H160, uint::U256}; +use unionlabs::{ + ibc::core::client::height::Height, + primitives::{H160, U256}, +}; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] diff --git a/lib/linea-light-client-types/src/header.rs b/lib/linea-light-client-types/src/header.rs index 3c18530fc8..4e7450466b 100644 --- a/lib/linea-light-client-types/src/header.rs +++ b/lib/linea-light-client-types/src/header.rs @@ -1,5 +1,6 @@ use ethereum_light_client_types::{AccountProof, StorageProof}; -use unionlabs::{ibc::core::client::height::Height, linea::proof::InclusionProof}; +use linea_types::proof::InclusionProof; +use unionlabs::ibc::core::client::height::Height; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] diff --git a/lib/linea-types/Cargo.toml b/lib/linea-types/Cargo.toml new file mode 100644 index 0000000000..5ecff60e55 --- /dev/null +++ b/lib/linea-types/Cargo.toml @@ -0,0 +1,13 @@ +[package] +edition = { workspace = true } +license-file = { workspace = true } +name = "linea-types" +repository = { workspace = true } +version = "0.1.0" + +[dependencies] +serde.workspace = true +unionlabs = { workspace = true } + +[lints] +workspace = true diff --git a/lib/unionlabs/src/linea/account.rs b/lib/linea-types/src/account.rs similarity index 97% rename from lib/unionlabs/src/linea/account.rs rename to lib/linea-types/src/account.rs index 35907e3ef7..ce4a0cf4cc 100644 --- a/lib/unionlabs/src/linea/account.rs +++ b/lib/linea-types/src/account.rs @@ -1,9 +1,7 @@ use serde::{Deserialize, Serialize}; - -use crate::{ +use unionlabs::{ errors::{ExpectedLength, InvalidLength}, - primitives::H256, - uint::U256, + primitives::{H256, U256}, ByteArrayExt, }; diff --git a/lib/unionlabs/src/linea.rs b/lib/linea-types/src/lib.rs similarity index 100% rename from lib/unionlabs/src/linea.rs rename to lib/linea-types/src/lib.rs diff --git a/lib/unionlabs/src/linea/proof.rs b/lib/linea-types/src/proof.rs similarity index 65% rename from lib/unionlabs/src/linea/proof.rs rename to lib/linea-types/src/proof.rs index 0bbb76c703..5c8717aa98 100644 --- a/lib/unionlabs/src/linea/proof.rs +++ b/lib/linea-types/src/proof.rs @@ -1,31 +1,25 @@ -use macros::model; use serde::{Deserialize, Serialize}; +use unionlabs::primitives::Bytes; #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct MerklePath { - #[serde(with = "::serde_utils::hex_string")] - pub value: Vec, - #[serde(with = "::serde_utils::hex_string_list")] - pub proof_related_nodes: Vec>, + pub value: Bytes, + pub proof_related_nodes: Vec, } -#[model(no_serde)] -#[derive(Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InclusionProof { - #[serde(with = "::serde_utils::hex_string")] - pub key: Vec, + pub key: Bytes, pub leaf_index: u64, pub proof: MerklePath, } -#[model(no_serde)] -#[derive(Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NonInclusionProof { - #[serde(with = "::serde_utils::hex_string")] - pub key: Vec, + pub key: Bytes, pub left_leaf_index: u64, pub left_proof: MerklePath, pub right_leaf_index: u64, diff --git a/lib/linea-verifier/Cargo.toml b/lib/linea-verifier/Cargo.toml index 1d318c1c8d..c0c2f014a4 100644 --- a/lib/linea-verifier/Cargo.toml +++ b/lib/linea-verifier/Cargo.toml @@ -15,6 +15,7 @@ test-include = ["lib/scroll-verifier/tests"] evm-storage-verifier = { workspace = true } gnark-mimc = { workspace = true } linea-light-client-types = { workspace = true } +linea-types = { workspace = true } linea-zktrie = { workspace = true } rlp = { workspace = true } thiserror = { workspace = true } diff --git a/lib/linea-verifier/src/lib.rs b/lib/linea-verifier/src/lib.rs index 5c9487abaa..333fd703f2 100644 --- a/lib/linea-verifier/src/lib.rs +++ b/lib/linea-verifier/src/lib.rs @@ -3,11 +3,10 @@ use core::fmt::Debug; use evm_storage_verifier::{verify_account_storage_root, verify_storage_proof}; use gnark_mimc::new_mimc_constants_bls12_377; use linea_light_client_types::{ClientState, Header}; +use linea_types::account::ZkAccount; use unionlabs::{ ethereum::slot::{MappingKey, Slot}, - linea::account::ZkAccount, - primitives::H256, - uint::U256, + primitives::{H256, U256}, }; #[derive(Debug, Clone, PartialEq, thiserror::Error)] @@ -94,7 +93,7 @@ pub fn state_root_hashes_mapping_key(slot: &U256, l2_block_number: &U256) -> U25 // mod tests { // use hex_literal::hex; // use linea_light_client_types::{ClientState, Header}; -// use unionlabs::{ibc::core::client::height::Height, uint::U256}; +// use unionlabs::{ibc::core::client::height::Height, primitives::U256}; // use crate::{state_root_hashes_mapping_key, verify_header}; diff --git a/lib/linea-zktrie/Cargo.toml b/lib/linea-zktrie/Cargo.toml index 786d1f796d..7bf8c62097 100644 --- a/lib/linea-zktrie/Cargo.toml +++ b/lib/linea-zktrie/Cargo.toml @@ -9,6 +9,7 @@ version = "0.1.0" gnark-mimc = { workspace = true } hex = { workspace = true } hex-literal = { workspace = true } +linea-types = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } thiserror = { workspace = true } diff --git a/lib/linea-zktrie/src/verify.rs b/lib/linea-zktrie/src/verify.rs index c4fb634e8f..12625cc54c 100644 --- a/lib/linea-zktrie/src/verify.rs +++ b/lib/linea-zktrie/src/verify.rs @@ -1,13 +1,12 @@ use gnark_mimc::{mimc_sum_bl12377, MiMCBls12377, MiMCBls12377Constants}; +use linea_types::{ + account::{MimcSafeBytes, ZkAccount}, + proof::{MerklePath, MerkleProof, NonInclusionProof}, +}; use serde::{Deserialize, Serialize}; use unionlabs::{ errors::{ExpectedLength, InvalidLength}, - linea::{ - account::{MimcSafeBytes, ZkAccount}, - proof::{MerklePath, MerkleProof, NonInclusionProof}, - }, - primitives::{H160, H256}, - uint::U256, + primitives::{H160, H256, U256}, }; use crate::node::{get_leaf_path, BranchNode, Direction, LeafNode, Node, RootNode, Terminator}; @@ -99,7 +98,10 @@ impl ZkValue for U256 { where Self: Sized, { - Self::try_from_be_bytes(value.as_ref()) + Self::try_from_be_bytes(value.as_ref()).map_err(|e| InvalidLength { + expected: ExpectedLength::Between(0, e.expected_max_len), + found: e.found_len, + }) } } @@ -336,10 +338,8 @@ pub fn verify_inclusion( mod tests { use gnark_mimc::{new_mimc_bls12_377, new_mimc_constants_bls12_377}; use hex_literal::hex; - use unionlabs::{ - linea::{account::ZkAccount, proof::GetProof}, - primitives::{H160, H256}, - }; + use linea_types::{account::ZkAccount, proof::GetProof}; + use unionlabs::primitives::{H160, H256}; use super::verify; diff --git a/lib/scroll-light-client-types/src/client_state.rs b/lib/scroll-light-client-types/src/client_state.rs index 08d4fd2777..0a75a8ff96 100644 --- a/lib/scroll-light-client-types/src/client_state.rs +++ b/lib/scroll-light-client-types/src/client_state.rs @@ -1,4 +1,7 @@ -use unionlabs::{ibc::core::client::height::Height, primitives::H160, uint::U256}; +use unionlabs::{ + ibc::core::client::height::Height, + primitives::{H160, U256}, +}; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] diff --git a/lib/scroll-rpc/src/lib.rs b/lib/scroll-rpc/src/lib.rs index 3c3d0b398b..385c305228 100644 --- a/lib/scroll-rpc/src/lib.rs +++ b/lib/scroll-rpc/src/lib.rs @@ -7,10 +7,7 @@ use jsonrpsee::{ ws_client::{WsClient, WsClientBuilder}, }; use serde::{Deserialize, Serialize}; -use unionlabs::{ - primitives::{H160, H256}, - uint::U256, -}; +use unionlabs::primitives::{H160, H256, U256}; #[derive(macros::Debug, Clone, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase", deny_unknown_fields)] @@ -19,11 +16,11 @@ pub struct ScrollEip1186ProofResponse { #[debug(wrap = ::serde_utils::fmt::DebugListAsHex)] pub account_proof: Vec>, pub address: H160, - #[serde(with = "unionlabs::uint::u256_big_endian_hex")] + #[serde(with = "unionlabs::primitives::uint::u256_big_endian_hex")] pub balance: U256, pub poseidon_code_hash: H256, pub keccak_code_hash: H256, - #[serde(with = "unionlabs::uint::u256_big_endian_hex")] + #[serde(with = "unionlabs::primitives::uint::u256_big_endian_hex")] pub code_size: U256, #[serde(with = "::serde_utils::u64_hex")] pub nonce: u64, diff --git a/lib/scroll-rpc/tests/tests.rs b/lib/scroll-rpc/tests/tests.rs index c9f7f89f63..8fde56c40c 100644 --- a/lib/scroll-rpc/tests/tests.rs +++ b/lib/scroll-rpc/tests/tests.rs @@ -1,5 +1,5 @@ use scroll_rpc::{BlockId, JsonRpcClient}; -use unionlabs::uint::U256; +use unionlabs::primitives::U256; #[tokio::test] #[ignore = "needs network"] diff --git a/lib/scroll-verifier/src/lib.rs b/lib/scroll-verifier/src/lib.rs index 2a57e4609d..3b31ac07e6 100644 --- a/lib/scroll-verifier/src/lib.rs +++ b/lib/scroll-verifier/src/lib.rs @@ -5,9 +5,8 @@ use scroll_codec::{hash_batch, HashBatchError}; use scroll_light_client_types::{ClientState, Header}; use unionlabs::{ ethereum::slot::{MappingKey, Slot}, - primitives::{H160, H256}, + primitives::{H160, H256, U256}, scroll::account::Account, - uint::U256, }; use zktrie::{decode_smt_proofs, Byte32, Database, Hash, MemDB, PoseidonHash, TrieData, ZkTrie}; diff --git a/lib/serde-utils/src/lib.rs b/lib/serde-utils/src/lib.rs index 27d0f74d8f..4c45697d5a 100644 --- a/lib/serde-utils/src/lib.rs +++ b/lib/serde-utils/src/lib.rs @@ -657,33 +657,6 @@ pub mod string_opt { } } -pub mod u256_from_dec_str { - #![allow(clippy::disallowed_types)] // need to access the inner type to do ser/de - - use alloc::{format, string::String}; - - use primitive_types::U256; - use serde::{de::Deserialize, Deserializer, Serializer}; - - pub fn serialize(data: &U256, serializer: S) -> Result - where - S: Serializer, - { - serializer.collect_str(&data) - } - - pub fn deserialize<'de, D>(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - String::deserialize(deserializer).and_then(|s| { - U256::from_dec_str(&s).map_err(|err| { - serde::de::Error::custom(format!("failure to parse string data: {err}")) - }) - }) - } -} - pub mod bitvec_string { use alloc::string::String; diff --git a/lib/ssz/src/lib.rs b/lib/ssz/src/lib.rs index 577af10609..8ddeb76e8b 100644 --- a/lib/ssz/src/lib.rs +++ b/lib/ssz/src/lib.rs @@ -465,6 +465,44 @@ where } } +impl Ssz for unionlabs_primitives::U256 { + const SSZ_FIXED_LEN: Option = Some(option_unwrap!(NonZeroUsize::new(32))); + + const TREE_HASH_TYPE: TreeHashType = TreeHashType::Basic { size: 32 }; + + fn tree_hash_root(&self) -> H256 { + let mut result = [0; 32]; + self.0.to_little_endian(&mut result[..]); + H256::new(result) + } + + fn ssz_bytes_len(&self) -> NonZeroUsize { + option_unwrap!(NonZeroUsize::new(32)) + } + + fn ssz_append(&self, buf: &mut Vec) { + let n = 32; + let s = buf.len(); + + buf.resize(s + n, 0); + self.0.to_little_endian(&mut buf[s..]); + } + + fn from_ssz_bytes(bytes: &[u8]) -> Result { + let len = bytes.len(); + let expected = 32; + + if len == expected { + Ok(Self::from_le_bytes(bytes.try_into().unwrap())) + } else { + Err(DecodeError::InvalidByteLength { + found: len, + expected, + }) + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/lib/ssz/tests-generator/src/main.rs b/lib/ssz/tests-generator/src/main.rs index b436fa4086..6d8f56e276 100644 --- a/lib/ssz/tests-generator/src/main.rs +++ b/lib/ssz/tests-generator/src/main.rs @@ -11,7 +11,7 @@ use hex::ToHex; use serde::{de::DeserializeOwned, Deserialize}; use ssz::types::{BitList, BitVector, List, Vector}; use typenum::{NonZero, Unsigned}; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; // alias primitive types to their respective eth names, as that's whats used in the testdata folder names type uint8 = u8; @@ -93,8 +93,7 @@ const HEADER: &str = r#" use hex_literal::hex; use ssz::types::*; use ssz::Ssz; -use unionlabs::uint::U256; -use unionlabs::primitives::H256; +use unionlabs::primitives::{H256, U256}; use typenum::U; pub mod container_types { diff --git a/lib/ssz/tests/spec_conformance/basic_vector_invalid.rs b/lib/ssz/tests/spec_conformance/basic_vector_invalid.rs index b76eea592e..f001282937 100644 --- a/lib/ssz/tests/spec_conformance/basic_vector_invalid.rs +++ b/lib/ssz/tests/spec_conformance/basic_vector_invalid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/basic_vector_valid.rs b/lib/ssz/tests/spec_conformance/basic_vector_valid.rs index bb8b7a24df..db788407b3 100644 --- a/lib/ssz/tests/spec_conformance/basic_vector_valid.rs +++ b/lib/ssz/tests/spec_conformance/basic_vector_valid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/bitlist_invalid.rs b/lib/ssz/tests/spec_conformance/bitlist_invalid.rs index 56d185e418..e6b159e9dc 100644 --- a/lib/ssz/tests/spec_conformance/bitlist_invalid.rs +++ b/lib/ssz/tests/spec_conformance/bitlist_invalid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/bitlist_valid.rs b/lib/ssz/tests/spec_conformance/bitlist_valid.rs index dc4af57cbd..fbb0e96a84 100644 --- a/lib/ssz/tests/spec_conformance/bitlist_valid.rs +++ b/lib/ssz/tests/spec_conformance/bitlist_valid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/bitvector_invalid.rs b/lib/ssz/tests/spec_conformance/bitvector_invalid.rs index b5cc4a37bc..90470e746a 100644 --- a/lib/ssz/tests/spec_conformance/bitvector_invalid.rs +++ b/lib/ssz/tests/spec_conformance/bitvector_invalid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/bitvector_valid.rs b/lib/ssz/tests/spec_conformance/bitvector_valid.rs index 4950d6d242..d06e403c43 100644 --- a/lib/ssz/tests/spec_conformance/bitvector_valid.rs +++ b/lib/ssz/tests/spec_conformance/bitvector_valid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/boolean_invalid.rs b/lib/ssz/tests/spec_conformance/boolean_invalid.rs index 0958eb499e..5c69c39351 100644 --- a/lib/ssz/tests/spec_conformance/boolean_invalid.rs +++ b/lib/ssz/tests/spec_conformance/boolean_invalid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/boolean_valid.rs b/lib/ssz/tests/spec_conformance/boolean_valid.rs index 9aa9e79a17..2acfdd9286 100644 --- a/lib/ssz/tests/spec_conformance/boolean_valid.rs +++ b/lib/ssz/tests/spec_conformance/boolean_valid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/containers_invalid.rs b/lib/ssz/tests/spec_conformance/containers_invalid.rs index 7f88f2b055..57da3e5e5c 100644 --- a/lib/ssz/tests/spec_conformance/containers_invalid.rs +++ b/lib/ssz/tests/spec_conformance/containers_invalid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/containers_valid.rs b/lib/ssz/tests/spec_conformance/containers_valid.rs index 4e74e57f08..34d86f67c9 100644 --- a/lib/ssz/tests/spec_conformance/containers_valid.rs +++ b/lib/ssz/tests/spec_conformance/containers_valid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/uints_invalid.rs b/lib/ssz/tests/spec_conformance/uints_invalid.rs index cb2207cc8d..58e0839ff3 100644 --- a/lib/ssz/tests/spec_conformance/uints_invalid.rs +++ b/lib/ssz/tests/spec_conformance/uints_invalid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/ssz/tests/spec_conformance/uints_valid.rs b/lib/ssz/tests/spec_conformance/uints_valid.rs index 2eedc87c66..95a8f8c3df 100644 --- a/lib/ssz/tests/spec_conformance/uints_valid.rs +++ b/lib/ssz/tests/spec_conformance/uints_valid.rs @@ -3,7 +3,7 @@ use hex_literal::hex; use ssz::{types::*, Ssz}; use typenum::U; -use unionlabs::{primitives::H256, uint::U256}; +use unionlabs::primitives::{H256, U256}; pub mod container_types { include!("../../tests-generator/src/container_types.rs"); diff --git a/lib/unionlabs-primitives/Cargo.toml b/lib/unionlabs-primitives/Cargo.toml index a2f1e3f668..64dea28abc 100644 --- a/lib/unionlabs-primitives/Cargo.toml +++ b/lib/unionlabs-primitives/Cargo.toml @@ -11,13 +11,19 @@ base64 = { workspace = true, optional = true, features = ["std"] } bincode = { workspace = true, optional = true, features = ["alloc"] } generic-array = { workspace = true, optional = true } hex = { workspace = true, features = ["std"] } -primitive-types = { workspace = true, optional = true } +primitive-types = { workspace = true } rlp = { workspace = true, optional = true } serde = { workspace = true, features = ["derive"], optional = true } serde_bytes = { version = "0.11.15", optional = true } thiserror = { workspace = true } typenum = { workspace = true, optional = true } +# TODO: This is only used for uint, replace with ruint +uint = "0.9.0" + +[dev-dependencies] +unionlabs = { workspace = true, features = ["test-utils"] } + [lints] workspace = true @@ -30,5 +36,8 @@ rlp = ["dep:rlp"] serde = ["dep:serde", "dep:serde_bytes"] alloy-primitives-compat = ["dep:alloy-primitives"] -generic-array-compat = ["dep:generic-array", "dep:typenum", "typenum/const-generics"] -primitive-types-compat = ["dep:primitive-types"] +generic-array-compat = ["dep:generic-array", "dep:typenum", "typenum/const-generics"] +primitive-types-compat = [ + # TODO: Make this dep optional again once we switch to ruint + # "dep:primitive-types" +] diff --git a/lib/unionlabs-primitives/src/lib.rs b/lib/unionlabs-primitives/src/lib.rs index b87b68b8cf..9ec76ee12a 100644 --- a/lib/unionlabs-primitives/src/lib.rs +++ b/lib/unionlabs-primitives/src/lib.rs @@ -15,11 +15,15 @@ mod fixed_bytes; mod bytes; +// TODO: Replace with something like +pub mod uint; + mod compat; pub use crate::{ bytes::Bytes, fixed_bytes::{FixedBytes, FixedBytesError}, + uint::U256, }; pub type H64 = FixedBytes<8, E>; diff --git a/lib/unionlabs/src/uint.rs b/lib/unionlabs-primitives/src/uint.rs similarity index 60% rename from lib/unionlabs/src/uint.rs rename to lib/unionlabs-primitives/src/uint.rs index b8598153fa..bd65510faa 100644 --- a/lib/unionlabs/src/uint.rs +++ b/lib/unionlabs-primitives/src/uint.rs @@ -3,38 +3,76 @@ use core::{ fmt::{self, Display}, iter::Sum, - num::NonZeroUsize, ops::{Add, AddAssign, Div, Rem}, str::FromStr, }; -use serde::{Deserialize, Serialize}; -use serde_utils::HEX_ENCODING_PREFIX; - -use crate::{ - encoding::{Decode, Encode, Proto}, - errors::{ExpectedLength, InvalidLength}, - option_unwrap, - primitives::H256, -}; - /// [`primitive_types::U256`] can't roundtrip through string conversion since it parses from hex but displays as decimal. -#[derive( - ::macros::Debug, - Clone, - Copy, - Hash, - PartialEq, - Eq, - PartialOrd, - Ord, - Default, - Serialize, - Deserialize, -)] +#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Default)] #[repr(transparent)] -#[debug("U256({})", self)] -pub struct U256(#[serde(with = "::serde_utils::u256_from_dec_str")] pub primitive_types::U256); +pub struct U256(pub primitive_types::U256); + +impl fmt::Debug for U256 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "U256({self})") + } +} + +impl Display for U256 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!("{}", self.0)) + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for U256 { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.collect_str(self) + } +} + +#[cfg(feature = "serde")] +impl<'de> serde::Deserialize<'de> for U256 { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + String::deserialize(deserializer) + .and_then(|s| { + primitive_types::U256::from_dec_str(&s).map_err(|err| { + serde::de::Error::custom(format!("failure to parse string data: {err}")) + }) + }) + .map(Self) + } +} + +#[cfg(feature = "serde")] +#[allow(clippy::missing_errors_doc)] +pub mod u256_big_endian_hex { + use serde::de::{self, Deserialize}; + + use crate::U256; + + pub fn serialize(data: &U256, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(&data.to_be_hex_packed()) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + String::deserialize(deserializer).and_then(|s| -> Result { + U256::from_be_hex(s).map_err(de::Error::custom) + }) + } +} #[cfg(feature = "bincode")] impl bincode::Decode for U256 { @@ -175,15 +213,20 @@ impl U256 { buffer[leading_empty_bytes..].to_vec() } - pub fn try_from_be_bytes(bz: &[u8]) -> Result { + /// Attempt to convert the provided big-endian bytes into a [`U256`]. + /// + /// # Errors + /// + /// See [`TryFromBytesError`] for the possible failure modes for this function. + pub fn try_from_be_bytes(bz: &[u8]) -> Result { let len = bz.len(); if (0..=32).contains(&len) { Ok(Self(primitive_types::U256::from_big_endian(bz))) } else { - Err(InvalidLength { - expected: ExpectedLength::Between(0, 32), - found: len, + Err(TryFromBytesError { + expected_max_len: 32, + found_len: len, }) } } @@ -210,31 +253,41 @@ impl U256 { #[must_use] pub fn to_be_hex(&self) -> String { - serde_utils::to_hex(self.to_be_bytes()) + let encoded = if self == &Self::ZERO { + "0".to_string() + } else { + hex::encode(self.to_be_bytes()) + }; + + format!("0x{encoded}") } #[must_use] pub fn to_be_hex_packed(&self) -> String { if self.0.is_zero() { - format!("{HEX_ENCODING_PREFIX}{}", 0) + format!("0x{}", 0) } else { // NOTE: Can't use serde_utils::to_hex here as it ensures there's an even number of bytes (by prepending a 0) which we don't want for u256 format!( - "{HEX_ENCODING_PREFIX}{}", + "0x{}", hex::encode(self.to_be_bytes_packed()).trim_start_matches('0') ) } } + /// Attempt to convert the provided big-endian hex string into a [`U256`]. + /// + /// # Errors + /// + /// See [`TryFromHexError`] for the possible failure modes for this function. pub fn from_be_hex(s: impl AsRef) -> Result { if s.as_ref().is_empty() { - return Err(serde_utils::FromHexStringError::EmptyString.into()); + return Err(TryFromHexError::EmptyString); } s.as_ref() - .strip_prefix(HEX_ENCODING_PREFIX) - .ok_or_else(|| serde_utils::FromHexStringError::MissingPrefix(s.as_ref().to_owned())) - .map_err(Into::into) + .strip_prefix("0x") + .ok_or(TryFromHexError::MissingPrefix) .and_then(|maybe_hex| { Ok(U256::try_from_be_bytes( &if maybe_hex.len() % 2 == 1 { @@ -242,135 +295,40 @@ impl U256 { } else { hex::decode(maybe_hex) } - .map_err(serde_utils::FromHexStringError::Hex)?, + .map_err(TryFromHexError::Hex)?, )?) }) } } #[derive(Debug, Clone, PartialEq, thiserror::Error)] -pub enum TryFromHexError { - #[error("error parsing hex")] - Hex(#[from] serde_utils::FromHexStringError), - #[error("error converting from bytes")] - FromBytes(#[from] InvalidLength), -} - -pub mod u256_big_endian_hex { - use serde::de::{self, Deserialize}; - - use crate::uint::U256; - - pub fn serialize(data: &U256, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(&data.to_be_hex_packed()) - } - - pub fn deserialize<'de, D>(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - String::deserialize(deserializer).and_then(|s| -> Result { - U256::from_be_hex(s).map_err(de::Error::custom) - }) - } +#[error("invalid bytes length, expected between 0..={expected_max_len} but found {found_len}")] +pub struct TryFromBytesError { + pub expected_max_len: usize, + pub found_len: usize, } -// impl TryFrom> for U256 { -// type Error = InvalidLength; - -// fn try_from(value: Vec) -> Result { -// if value.len() > 32 { -// Err(InvalidLength { -// expected: ExpectedLength::LessThan(32), -// found: value.len(), -// }) -// } else { -// // NOTE: This can panic if len > 32, hence the check above -// Ok(Self(primitive_types::U256::from_little_endian(&value))) -// } -// } -// } - -// // REVIEW: Should this trim leading zeros? -// impl From for Vec { -// fn from(value: U256) -> Self { -// let mut slice = [0_u8; 32]; -// value.0.to_little_endian(&mut slice); -// slice.into() -// } -// } - -impl Encode for U256 { - fn encode(self) -> Vec { - self.to_be_bytes().into() - } -} - -impl Decode for U256 { - type Error = InvalidLength; - - fn decode(bytes: &[u8]) -> Result { - Self::try_from_be_bytes(bytes) - } -} - -impl ssz::Ssz for U256 { - const SSZ_FIXED_LEN: Option = Some(option_unwrap!(NonZeroUsize::new(32))); - - const TREE_HASH_TYPE: ssz::tree_hash::TreeHashType = - ssz::tree_hash::TreeHashType::Basic { size: 32 }; - - fn tree_hash_root(&self) -> H256 { - let mut result = [0; 32]; - self.0.to_little_endian(&mut result[..]); - H256::new(result) - } - - fn ssz_bytes_len(&self) -> NonZeroUsize { - option_unwrap!(NonZeroUsize::new(32)) - } - - fn ssz_append(&self, buf: &mut Vec) { - let n = 32; - let s = buf.len(); - - buf.resize(s + n, 0); - self.0.to_little_endian(&mut buf[s..]); - } - - fn from_ssz_bytes(bytes: &[u8]) -> Result { - let len = bytes.len(); - let expected = 32; - - if len == expected { - Ok(Self(primitive_types::U256::from_little_endian(bytes))) - } else { - Err(ssz::decode::DecodeError::InvalidByteLength { - found: len, - expected, - }) - } - } +#[derive(Debug, Clone, PartialEq, thiserror::Error)] +pub enum TryFromHexError { + #[error("missing `0x` prefix")] + MissingPrefix, + #[error("cannot parse empty string as hex")] + EmptyString, + #[error(transparent)] + TryFromBytes(#[from] TryFromBytesError), + #[error(transparent)] + Hex(#[from] hex::FromHexError), } impl FromStr for U256 { - type Err = uint::FromDecStrErr; + type Err = ::uint::FromDecStrErr; fn from_str(s: &str) -> Result { primitive_types::U256::from_dec_str(s).map(Self) } } -pub use uint::FromDecStrErr; - -impl Display for U256 { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - f.write_fmt(format_args!("{}", self.0)) - } -} +pub use ::uint::FromDecStrErr; #[cfg(feature = "rlp")] impl rlp::Encodable for U256 { @@ -426,66 +384,59 @@ impl Div for U256 { mod u256_tests { use core::str::FromStr; - use serde::{Deserialize, Serialize}; + use crate::U256; - use crate::{ - primitives::H256, - test_utils::{assert_json_roundtrip, assert_proto_roundtrip, assert_string_roundtrip}, - uint::U256, - }; + // #[test] + // fn hex_string() { + // #[derive(Debug, Deserialize, Serialize)] + // struct T { + // #[serde(with = "super::u256_big_endian_hex")] + // u256: U256, + // } - #[test] - fn hex_string() { - #[derive(Debug, Deserialize, Serialize)] - struct T { - #[serde(with = "super::u256_big_endian_hex")] - u256: U256, - } - - fn assert_big_endian_hex_roundtrip(hex: &'static str) { - let n: u64 = { - // assume the prefix is provided - let hex = &hex[2..]; - let vec = if hex.len() % 2 == 1 { - hex::decode(format!("0{hex}")) - } else { - hex::decode(hex) - } - .unwrap(); - let vec: Vec<_> = vec![0; 8 - vec.len()].into_iter().chain(vec).collect(); - u64::from_be_bytes(vec.try_into().unwrap()) - }; + // fn assert_big_endian_hex_roundtrip(hex: &'static str) { + // let n: u64 = { + // // assume the prefix is provided + // let hex = &hex[2..]; + // let vec = if hex.len() % 2 == 1 { + // hex::decode(format!("0{hex}")) + // } else { + // hex::decode(hex) + // } + // .unwrap(); + // let vec: Vec<_> = vec![0; 8 - vec.len()].into_iter().chain(vec).collect(); + // u64::from_be_bytes(vec.try_into().unwrap()) + // }; - let string = format!(r#"{{"u256":"{hex}"}}"#); - let t = serde_json::from_str::(&string).unwrap(); + // let string = format!(r#"{{"u256":"{hex}"}}"#); + // let t = serde_json::from_str::(&string).unwrap(); - dbg!(::new(t.u256.to_be_bytes())); + // dbg!(::new(t.u256.to_be_bytes())); - assert_eq!(t.u256.0.as_u64(), n); + // assert_eq!(t.u256.0.as_u64(), n); - let roundtrip = serde_json::to_string(&t).unwrap(); + // let roundtrip = serde_json::to_string(&t).unwrap(); - assert_eq!(string, roundtrip); - } + // assert_eq!(string, roundtrip); + // } - // even length - assert_big_endian_hex_roundtrip("0x1234"); + // // even length + // assert_big_endian_hex_roundtrip("0x1234"); - // odd length - assert_big_endian_hex_roundtrip("0x56789"); + // // odd length + // assert_big_endian_hex_roundtrip("0x56789"); - // single digit - assert_big_endian_hex_roundtrip("0x3"); + // // single digit + // assert_big_endian_hex_roundtrip("0x3"); - // zero - assert_big_endian_hex_roundtrip("0x0"); - } + // // zero + // assert_big_endian_hex_roundtrip("0x0"); + // } #[test] fn roundtrip() { - assert_json_roundtrip(&U256::from_str("123456").unwrap()); - assert_proto_roundtrip(&U256::from_str("123456").unwrap()); - assert_string_roundtrip(&U256::from_str("123456").unwrap()); + unionlabs::test_utils::assert_json_roundtrip(&U256::from_str("123456").unwrap()); + unionlabs::test_utils::assert_string_roundtrip(&U256::from_str("123456").unwrap()); } #[test] diff --git a/lib/unionlabs/Cargo.toml b/lib/unionlabs/Cargo.toml index 7bdb4efa74..7dfeae8b2c 100644 --- a/lib/unionlabs/Cargo.toml +++ b/lib/unionlabs/Cargo.toml @@ -40,7 +40,6 @@ static_assertions = { workspace = true } subtle-encoding = { workspace = true, features = ["bech32-preview"] } thiserror = { workspace = true } typenum = { workspace = true, features = ["const-generics", "no_std"] } -uint = "0.9.0" wasmparser = { version = "0.113" } alloy = { workspace = true, optional = true, features = ["std", "sol-types"] } diff --git a/lib/unionlabs/src/ethereum.rs b/lib/unionlabs/src/ethereum.rs index bd467b7e7d..4928cc2f46 100644 --- a/lib/unionlabs/src/ethereum.rs +++ b/lib/unionlabs/src/ethereum.rs @@ -3,8 +3,7 @@ use sha3::Keccak256; use crate::{ ethereum::slot::{MappingKey, Slot}, - primitives::H256, - uint::U256, + primitives::{H256, U256}, }; pub mod slot; diff --git a/lib/unionlabs/src/ethereum/slot.rs b/lib/unionlabs/src/ethereum/slot.rs index 2967a04aa4..d35d6fa52a 100644 --- a/lib/unionlabs/src/ethereum/slot.rs +++ b/lib/unionlabs/src/ethereum/slot.rs @@ -1,7 +1,10 @@ use sha2::Digest; use sha3::Keccak256; -use crate::{ethereum::keccak256, primitives::H256, uint::U256}; +use crate::{ + ethereum::keccak256, + primitives::{H256, U256}, +}; /// Solidity storage slot calculations. Note that this currently does not handle dynamic arrays with packed values; the index passed to [`Slot::Array`] will need to be calculated manually in this case. pub enum Slot<'a> { diff --git a/lib/unionlabs/src/lib.rs b/lib/unionlabs/src/lib.rs index 14dfd70c60..69cdea2bd3 100644 --- a/lib/unionlabs/src/lib.rs +++ b/lib/unionlabs/src/lib.rs @@ -54,9 +54,6 @@ pub mod union; /// Types specific to the scroll protocol. pub mod scroll; -/// Types specific to the linea protocol. -pub mod linea; - /// Types specific to the berachain protocol. pub mod berachain; @@ -85,9 +82,6 @@ pub mod signer; pub mod traits; -// TODO: Replace with something like -pub mod uint; - pub(crate) mod macros; pub mod errors; diff --git a/lib/unionlabs/src/scroll/account.rs b/lib/unionlabs/src/scroll/account.rs index 914d5160f4..72b90df520 100644 --- a/lib/unionlabs/src/scroll/account.rs +++ b/lib/unionlabs/src/scroll/account.rs @@ -1,7 +1,6 @@ use crate::{ errors::{ExpectedLength, InvalidLength}, - primitives::H256, - uint::U256, + primitives::{H256, U256}, ByteArrayExt, }; diff --git a/voyager/modules/client-bootstrap/movement/src/main.rs b/voyager/modules/client-bootstrap/movement/src/main.rs index a298a00d79..b49bab0a6c 100644 --- a/voyager/modules/client-bootstrap/movement/src/main.rs +++ b/voyager/modules/client-bootstrap/movement/src/main.rs @@ -14,8 +14,7 @@ use unionlabs::{ transaction_proof::TransactionInfoWithProof, }, ibc::core::client::height::Height, - primitives::{FixedBytes, H160}, - uint::U256, + primitives::{FixedBytes, H160, U256}, }; use voyager_message::{ core::{ChainId, ClientType}, diff --git a/voyager/modules/proof/ethereum/src/main.rs b/voyager/modules/proof/ethereum/src/main.rs index 26de18ec5f..f9cfb211c9 100644 --- a/voyager/modules/proof/ethereum/src/main.rs +++ b/voyager/modules/proof/ethereum/src/main.rs @@ -15,7 +15,9 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use tracing::{debug, instrument}; use unionlabs::{ - ethereum::ibc_commitment_key, ibc::core::client::height::Height, primitives::H160, uint::U256, + ethereum::ibc_commitment_key, + ibc::core::client::height::Height, + primitives::{H160, U256}, ErrorReporter, }; use voyager_message::{ diff --git a/voyager/modules/proof/movement/src/main.rs b/voyager/modules/proof/movement/src/main.rs index 235a06b7d7..f28e23c4ec 100644 --- a/voyager/modules/proof/movement/src/main.rs +++ b/voyager/modules/proof/movement/src/main.rs @@ -18,8 +18,7 @@ use unionlabs::{ storage_proof::{StateValue, StateValueMetadata, StorageProof}, }, ibc::core::client::height::Height, - primitives::H256, - uint::U256, + primitives::{H256, U256}, ErrorReporter, }; use voyager_message::{