1mod event;
2mod extension;
3mod order;
4mod request;
5mod trade;
6
7use std::{fmt::Display, str::FromStr};
8
9use alloy::primitives::Address;
10use chrono::{DateTime, Utc};
11pub use event::*;
12pub use extension::*;
13pub use order::{OrderSide, OrderType};
14pub use request::{OrderRequest, RequestType};
15pub use trade::*;
16
17pub type PerpetualId = u32;
19
20pub const MAX_PERPETUAL_ID: PerpetualId = 1020;
23
24pub type AccountId = u32;
26
27pub type FeeTier = u8;
30
31pub type BuilderId = u8;
33
34#[derive(Clone, Copy, Debug)]
36pub enum AccountAddressOrID {
37 Address(Address),
38 ID(AccountId),
39}
40
41pub type OrderId = std::num::NonZeroU16;
47
48pub type RequestId = u64;
50
51#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Default)]
53pub struct StateInstant {
54 block_number: u64,
55 block_timestamp: u64,
56}
57
58impl StateInstant {
59 pub fn new(block_number: u64, block_timestamp: u64) -> Self {
60 Self { block_number, block_timestamp }
61 }
62
63 pub fn block_number(&self) -> u64 { self.block_number }
64
65 pub fn block_timestamp(&self) -> u64 { self.block_timestamp }
66
67 pub fn next(&self) -> Self {
68 Self { block_number: self.block_number + 1, block_timestamp: self.block_timestamp }
69 }
70}
71
72impl Display for StateInstant {
73 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74 let ts = DateTime::<Utc>::from_timestamp(self.block_timestamp as i64, 0)
75 .unwrap()
76 .format("%Y-%m-%d %H:%M:%S");
77 if self.block_number > 0 {
78 write!(f, "#{} @ {}", self.block_number, ts)
79 } else {
80 write!(f, "{}", ts)
81 }
82 }
83}
84
85impl FromStr for AccountAddressOrID {
86 type Err = crate::error::DexError;
87
88 fn from_str(s: &str) -> Result<Self, Self::Err> {
89 if let Ok(address) = Address::from_str(s) {
90 return Ok(AccountAddressOrID::Address(address));
91 }
92 if let Ok(id) = AccountId::from_str(s) {
93 return Ok(AccountAddressOrID::ID(id));
94 }
95 Err(crate::error::DexError::InvalidArgument(format!(
96 "invalid account address or ID: {}",
97 s
98 )))
99 }
100}
101
102impl TryFrom<String> for AccountAddressOrID {
103 type Error = crate::error::DexError;
104
105 fn try_from(value: String) -> Result<Self, Self::Error> { AccountAddressOrID::from_str(&value) }
106}