pub mod types { use arrayref::array_ref; tonic::include_proto!("types"); macro_rules! U { ($proto:ty, $h:ty, $u:ty) => { impl From<$u> for $proto { fn from(value: $u) -> Self { Self::from(<$h>::from(<[u8; <$h>::len_bytes()]>::from(value))) } } impl From<$proto> for $u { fn from(value: $proto) -> Self { Self::from(<$h>::from(value).0) } } }; } // to PB impl From for H128 { fn from(value: ethereum_types::H128) -> Self { Self { hi: u64::from_be_bytes(*array_ref!(value, 0, 8)), lo: u64::from_be_bytes(*array_ref!(value, 8, 8)), } } } impl From for H160 { fn from(value: ethereum_types::H160) -> Self { Self { hi: Some(ethereum_types::H128::from_slice(&value[..16]).into()), lo: u32::from_be_bytes(*array_ref!(value, 16, 4)), } } } impl From for H256 { fn from(value: ethereum_types::H256) -> Self { Self { hi: Some(ethereum_types::H128::from_slice(&value[..16]).into()), lo: Some(ethereum_types::H128::from_slice(&value[16..]).into()), } } } impl From for H512 { fn from(value: ethereum_types::H512) -> Self { Self { hi: Some(ethereum_types::H256::from_slice(&value[..32]).into()), lo: Some(ethereum_types::H256::from_slice(&value[32..]).into()), } } } // from PB impl From for ethereum_types::H128 { fn from(value: H128) -> Self { let mut v = [0; Self::len_bytes()]; v[..8].copy_from_slice(&value.hi.to_be_bytes()); v[8..].copy_from_slice(&value.lo.to_be_bytes()); v.into() } } impl From for ethereum_types::H160 { fn from(value: H160) -> Self { type H = ethereum_types::H128; let mut v = [0; Self::len_bytes()]; v[..H::len_bytes()] .copy_from_slice(H::from(value.hi.unwrap_or_default()).as_fixed_bytes()); v[H::len_bytes()..].copy_from_slice(&value.lo.to_be_bytes()); v.into() } } impl From for ethereum_types::H256 { fn from(value: H256) -> Self { type H = ethereum_types::H128; let mut v = [0; Self::len_bytes()]; v[..H::len_bytes()] .copy_from_slice(H::from(value.hi.unwrap_or_default()).as_fixed_bytes()); v[H::len_bytes()..] .copy_from_slice(H::from(value.lo.unwrap_or_default()).as_fixed_bytes()); v.into() } } impl From for ethereum_types::H512 { fn from(value: H512) -> Self { type H = ethereum_types::H256; let mut v = [0; Self::len_bytes()]; v[..H::len_bytes()] .copy_from_slice(H::from(value.hi.unwrap_or_default()).as_fixed_bytes()); v[H::len_bytes()..] .copy_from_slice(H::from(value.lo.unwrap_or_default()).as_fixed_bytes()); v.into() } } U!(H128, ethereum_types::H128, ethereum_types::U128); U!(H256, ethereum_types::H256, ethereum_types::U256); U!(H512, ethereum_types::H512, ethereum_types::U512); } #[cfg(feature = "consensus")] pub mod consensus { tonic::include_proto!("consensus"); } #[cfg(feature = "sentry")] pub mod sentry { tonic::include_proto!("sentry"); } #[cfg(feature = "remotekv")] pub mod remotekv { tonic::include_proto!("remote"); } #[cfg(feature = "snapshotsync")] pub mod snapshotsync { tonic::include_proto!("downloader"); } #[cfg(feature = "txpool")] pub mod txpool { tonic::include_proto!("txpool"); tonic::include_proto!("txpool_control"); } #[cfg(feature = "db")] pub mod db { use once_cell::sync::Lazy; use serde::Deserialize; use std::collections::HashMap; #[derive(Deserialize)] pub struct AutoDupSortConfig { pub from: usize, pub to: usize, } #[derive(Deserialize)] pub struct DupSortConfig { pub auto: Option, } #[derive(Deserialize)] pub struct TableInfo { pub dup_sort: Option, } pub static TABLES: Lazy> = Lazy::new(|| toml::from_str(include_str!("../db_tables.toml")).unwrap()); } #[cfg(feature = "web3")] pub mod web3 { tonic::include_proto!("web3"); }