#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] use zeroize::Zeroize; use serde::{Serialize, Deserialize}; use scale::{Encode, Decode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_core::{ConstU32, bounded::BoundedVec}; mod amount; pub use amount::*; mod block; pub use block::*; mod coins; pub use coins::*; mod balance; pub use balance::*; mod account; pub use account::*; // Monero, our current longest address candidate, has a longest address of featured // 1 (enum) + 1 (flags) + 64 (two keys) = 66 // When JAMTIS arrives, it'll become 114 bytes pub const MAX_ADDRESS_LEN: u32 = 128; #[derive( Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Encode, Decode, MaxEncodedLen, TypeInfo, )] pub struct ExternalAddress(BoundedVec>); #[cfg(feature = "std")] impl Zeroize for ExternalAddress { fn zeroize(&mut self) { self.0.as_mut().zeroize() } } impl ExternalAddress { #[cfg(feature = "std")] pub fn new(address: Vec) -> Result { Ok(ExternalAddress(address.try_into().map_err(|_| "address length exceeds {MAX_ADDRESS_LEN}")?)) } pub fn address(&self) -> &[u8] { self.0.as_ref() } #[cfg(feature = "std")] pub fn consume(self) -> Vec { self.0.into_inner() } } impl AsRef<[u8]> for ExternalAddress { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } // Should be enough for a Uniswap v3 call pub const MAX_DATA_LEN: u32 = 512; #[derive( Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Encode, Decode, MaxEncodedLen, TypeInfo, )] pub struct Data(BoundedVec>); #[cfg(feature = "std")] impl Zeroize for Data { fn zeroize(&mut self) { self.0.as_mut().zeroize() } } impl Data { #[cfg(feature = "std")] pub fn new(data: Vec) -> Result { Ok(Data(data.try_into().map_err(|_| "data length exceeds {MAX_DATA_LEN}")?)) } pub fn data(&self) -> &[u8] { self.0.as_ref() } #[cfg(feature = "std")] pub fn consume(self) -> Vec { self.0.into_inner() } } impl AsRef<[u8]> for Data { fn as_ref(&self) -> &[u8] { self.0.as_ref() } }