bullet_exchange_interface/
types.rs1pub use rust_decimal::Decimal;
4
5use crate::string::CustomString;
6use crate::{define_enum, define_simple_enum, define_simple_type};
7
8pub const RESERVED_ORDER_ID: OrderId = OrderId(0); pub const RESERVED_TRADE_ID: TradeId = TradeId(0); pub const SPOT_MARKET_ID_OFFSET: u16 = 10_000;
11pub const RWA_PERP_MARKET_ID_OFFSET: u16 = 20_000;
12
13define_simple_type!(OrderId(u64));
14impl OrderId {
15 pub fn reserved() -> Self {
16 RESERVED_ORDER_ID
17 }
18
19 pub fn first_non_reserved() -> Self {
20 Self(RESERVED_ORDER_ID.0 + 1)
21 }
22
23 pub fn is_reserved(&self) -> bool {
24 self.0 == RESERVED_ORDER_ID.0
25 }
26}
27
28define_simple_type!(TradeId(u64));
29impl TradeId {
30 pub fn reserved() -> Self {
31 RESERVED_TRADE_ID
32 }
33
34 pub fn first_non_reserved() -> Self {
35 Self(RESERVED_TRADE_ID.0 + 1)
36 }
37
38 pub fn is_reserved(&self) -> bool {
39 self.0 == RESERVED_TRADE_ID.0
40 }
41}
42
43define_simple_type!(TriggerOrderId(u64));
44define_simple_type!(TwapId(u64));
45define_simple_type!(ClientOrderId(u64));
46define_enum! {
47 enum OrderIdKind {
48 Server(OrderId) = 0,
49 Client(ClientOrderId) = 1,
50 }
51}
52define_simple_type!(AssetId(u16));
53define_simple_type!(MarketId(u16));
54impl MarketId {
55 pub fn kind(&self) -> MarketKind {
56 match self.0 {
57 id if id < SPOT_MARKET_ID_OFFSET => MarketKind::Perp,
58 id if id < RWA_PERP_MARKET_ID_OFFSET => MarketKind::Spot,
59 _ => MarketKind::RwaPerp,
60 }
61 }
62}
63
64define_simple_enum!(MarketKind{ Perp = 0, Spot = 1, RwaPerp = 2 });
65
66define_simple_enum!(Side{ Bid = 0, Ask = 1});
67impl Side {
68 pub fn reverse(&self) -> Self {
69 match self {
70 Side::Bid => Side::Ask,
71 Side::Ask => Side::Bid,
72 }
73 }
74}
75
76define_simple_enum! {
77 #[derive(strum::EnumIter)]
78 FeeTier {
79 Tier0,
80 Tier1,
81 Tier2,
82 Tier3,
83 Tier4,
84 Tier5,
85 Tier6,
86 Tier7,
87 Tier8,
88 Tier9
89 }
90}
91#[allow(clippy::derivable_impls)]
92impl Default for FeeTier {
93 fn default() -> Self {
94 Self::Tier0
95 }
96}
97define_simple_enum!(TriggerPriceCondition{Mark = 0, Oracle = 1, LastTrade = 2});
98define_simple_enum!(
99 #[derive(strum::EnumIter)]
100 TriggerDirection{ GreaterThanOrEqual = 0, LessThanOrEqual = 1}
101);
102define_simple_enum!(OrderType {
103 Limit = 0,
104 PostOnly = 1,
105 FillOrKill = 2,
106 ImmediateOrCancel = 3,
107 PostOnlySlide = 4, PostOnlyFront = 5 });
110define_simple_enum!(SpotCollateralTransferDirection {
111 MarginToSpot = 0,
112 SpotToMargin = 1
113});
114define_simple_enum!(AdminType { Protocol, Funding, Pricing, FeeTier, Credits, Referrals });
115
116define_simple_type!(
117 #[cfg_attr(feature = "schema", derive(sov_universal_wallet::UniversalWallet))]
118 TokenId(CustomString)
119 + Debug
120);
121impl std::str::FromStr for TokenId {
122 type Err = ();
123 fn from_str(v: &str) -> Result<Self, Self::Err> {
124 Ok(Self(CustomString::from(v)))
125 }
126}
127
128define_simple_enum!(TradingMode{ Iso = 0, Cross = 1 });
129
130define_simple_enum!(BorrowType {
131 Internal = 0,
133 UnrealizedLoss = 1,
135 External = 2,
137});
138
139define_simple_enum!(RepayType {
140 PnlProcessing,
142 Rebalance,
144 BalanceUpdate,
146});
147
148define_simple_enum!(MarketTradingStatus {
149 Active = 0,
151 Halted = 1,
154 Cleaning = 2,
157 Cleaned = 3,
159});
160
161define_enum!(
162 enum TakeFromInsuranceFundReason {
163 LiquidateBorrowLendLiability,
164 LiquidateIsoPerpPosition(MarketId),
165 }
166);