Skip to main content

bullet_exchange_interface/
types.rs

1//! Simple types and enums.
2
3pub 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); // 0 is reserved for OTC (liquidation) orders
9pub const RESERVED_TRADE_ID: TradeId = TradeId(0); // 0 is reserved for force settlement of positions
10pub 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, // TODO: Delete this
108    PostOnlyFront = 5  // TODO: Delete this
109});
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 borrows from trading operations (PnL, margin, etc.)
132    Internal = 0,
133    /// Unrealized loss borrow (synthetic)
134    UnrealizedLoss = 1,
135    /// User-initiated borrows with actual fund withdrawal
136    External = 2,
137});
138
139define_simple_enum!(RepayType {
140    /// Borrow repayment from PnL processing
141    PnlProcessing,
142    /// Borrow repayment from unrealized loss borrow rebalancing
143    Rebalance,
144    /// Borrow repayment from balance updates in the form of a deposit
145    BalanceUpdate,
146});
147
148define_simple_enum!(MarketTradingStatus {
149    /// It can be actively traded.
150    Active = 0,
151    /// It cannot be traded, but can be pruned or force settled.
152    /// Can go from Halted to Active, if the only action taken is pruning.
153    Halted = 1,
154    /// If force settling has started, the market enters Cleaning state.
155    /// Nothing else can be done here.
156    Cleaning = 2,
157    /// Once the market is cleaned, it can become active again or it can be safely deleted.
158    Cleaned = 3,
159});
160
161define_enum!(
162    enum TakeFromInsuranceFundReason {
163        LiquidateBorrowLendLiability,
164        LiquidateIsoPerpPosition(MarketId),
165    }
166);