mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 20:29:23 +00:00
In response to https://gist.github.com/tevador/50160d160d24cfc6c52ae02eb3d17024?permalink_comment_id=4665372#gistcomment-4665372
106 lines
2.3 KiB
Rust
106 lines
2.3 KiB
Rust
#![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};
|
|
|
|
pub use sp_application_crypto as crypto;
|
|
|
|
mod amount;
|
|
pub use amount::*;
|
|
|
|
mod block;
|
|
pub use block::*;
|
|
|
|
mod networks;
|
|
pub use networks::*;
|
|
|
|
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 112 or potentially even 142 bytes
|
|
pub const MAX_ADDRESS_LEN: u32 = 196;
|
|
|
|
#[derive(
|
|
Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Encode, Decode, MaxEncodedLen, TypeInfo,
|
|
)]
|
|
pub struct ExternalAddress(BoundedVec<u8, ConstU32<{ MAX_ADDRESS_LEN }>>);
|
|
|
|
#[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<u8>) -> Result<ExternalAddress, &'static str> {
|
|
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<u8> {
|
|
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<u8, ConstU32<{ MAX_DATA_LEN }>>);
|
|
|
|
#[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<u8>) -> Result<Data, &'static str> {
|
|
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<u8> {
|
|
self.0.into_inner()
|
|
}
|
|
}
|
|
|
|
impl AsRef<[u8]> for Data {
|
|
fn as_ref(&self) -> &[u8] {
|
|
self.0.as_ref()
|
|
}
|
|
}
|