use alloy_primitives::{Address, B256, FixedBytes};
use serde::{Deserialize, Serialize};
pub type OrderUid = FixedBytes<56>;
pub trait OrderUidParts {
fn from_parts(hash: B256, owner: Address, valid_to: u32) -> Self;
fn to_parts(&self) -> (B256, Address, u32);
}
#[derive(Debug, thiserror::Error)]
pub enum OrderUidParseError {
#[error("order UID must be 0x-prefixed")]
MissingPrefix,
#[error("invalid order UID hex: {0}")]
Hex(#[from] alloy_primitives::hex::FromHexError),
}
pub fn parse_order_uid(s: &str) -> Result<OrderUid, OrderUidParseError> {
if !s.starts_with("0x") {
return Err(OrderUidParseError::MissingPrefix);
}
Ok(s.parse::<OrderUid>()?)
}
impl OrderUidParts for OrderUid {
fn from_parts(hash: B256, owner: Address, valid_to: u32) -> Self {
let mut uid = [0u8; 56];
uid[0..32].copy_from_slice(hash.as_slice());
uid[32..52].copy_from_slice(owner.as_slice());
uid[52..56].copy_from_slice(&valid_to.to_be_bytes());
Self::new(uid)
}
fn to_parts(&self) -> (B256, Address, u32) {
let bytes = self.as_slice();
let mut valid_to = [0u8; 4];
valid_to.copy_from_slice(&bytes[52..56]);
(
B256::from_slice(&bytes[0..32]),
Address::from_slice(&bytes[32..52]),
u32::from_be_bytes(valid_to),
)
}
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum OrderClass {
#[default]
Market,
Liquidity,
Limit,
}