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;
11
12define_simple_type!(OrderId(u64));
13impl OrderId {
14    pub fn reserved() -> Self {
15        RESERVED_ORDER_ID
16    }
17
18    pub fn first_non_reserved() -> Self {
19        Self(RESERVED_ORDER_ID.0 + 1)
20    }
21
22    pub fn is_reserved(&self) -> bool {
23        self.0 == RESERVED_ORDER_ID.0
24    }
25}
26
27define_simple_type!(TradeId(u64));
28impl TradeId {
29    pub fn reserved() -> Self {
30        RESERVED_TRADE_ID
31    }
32
33    pub fn first_non_reserved() -> Self {
34        Self(RESERVED_TRADE_ID.0 + 1)
35    }
36
37    pub fn is_reserved(&self) -> bool {
38        self.0 == RESERVED_TRADE_ID.0
39    }
40}
41
42define_simple_type!(TriggerOrderId(u64));
43define_simple_type!(TwapId(u64));
44define_simple_type!(ClientOrderId(u64));
45define_enum! {
46    enum OrderIdKind {
47        Server(OrderId)  = 0,
48        Client(ClientOrderId) = 1,
49    }
50}
51define_simple_type!(AssetId(u16));
52define_simple_type!(MarketId(u16));
53impl MarketId {
54    pub fn kind(&self) -> MarketKind {
55        match self.0 {
56            id if id < SPOT_MARKET_ID_OFFSET => MarketKind::Perp,
57            _ => MarketKind::Spot,
58        }
59    }
60}
61
62define_simple_enum!(MarketKind{ Perp = 0, Spot = 1 });
63
64define_simple_enum!(Side{ Bid = 0, Ask = 1});
65impl Side {
66    pub fn reverse(&self) -> Self {
67        match self {
68            Side::Bid => Side::Ask,
69            Side::Ask => Side::Bid,
70        }
71    }
72}
73
74define_simple_enum! {
75    #[derive(strum::EnumIter)]
76    FeeTier {
77        Tier0,
78        Tier1,
79        Tier2,
80        Tier3,
81        Tier4,
82        Tier5,
83        Tier6,
84        Tier7,
85        Tier8,
86        Tier9
87    }
88}
89#[allow(clippy::derivable_impls)]
90impl Default for FeeTier {
91    fn default() -> Self {
92        Self::Tier0
93    }
94}
95define_simple_enum!(TriggerPriceCondition{Mark = 0, Oracle = 1, LastTrade = 2});
96define_simple_enum!(
97    #[derive(strum::EnumIter)]
98    TriggerDirection{ GreaterThanOrEqual = 0, LessThanOrEqual = 1}
99);
100define_simple_enum!(OrderType {
101    Limit = 0,
102    PostOnly = 1,
103    FillOrKill = 2,
104    ImmediateOrCancel = 3,
105    PostOnlySlide = 4, // TODO: Delete this
106    PostOnlyFront = 5  // TODO: Delete this
107});
108define_simple_enum!(SpotCollateralTransferDirection {
109    MarginToSpot = 0,
110    SpotToMargin = 1
111});
112define_simple_enum!(AdminType { Protocol, Funding, Pricing, FeeTier, Credits, Referrals });
113
114define_simple_type!(
115    #[cfg_attr(feature = "schema", derive(sov_universal_wallet::UniversalWallet))]
116    TokenId(CustomString)
117        + Debug
118);
119impl std::str::FromStr for TokenId {
120    type Err = ();
121    fn from_str(v: &str) -> Result<Self, Self::Err> {
122        Ok(Self(CustomString::from(v)))
123    }
124}
125
126define_simple_enum!(TradingMode{ Iso = 0, Cross = 1 });
127
128define_simple_enum!(BorrowType {
129    /// Internal borrows from trading operations (PnL, margin, etc.)
130    Internal = 0,
131    /// Unrealized loss borrow (synthetic)
132    UnrealizedLoss = 1,
133    /// User-initiated borrows with actual fund withdrawal
134    External = 2,
135});
136
137define_simple_enum!(RepayType {
138    /// Borrow repayment from PnL processing
139    PnlProcessing,
140    /// Borrow repayment from unrealized loss borrow rebalancing
141    Rebalance,
142    /// Borrow repayment from balance updates in the form of a deposit
143    BalanceUpdate,
144});
145
146define_simple_enum!(MarketTradingStatus {
147    /// It can be actively traded.
148    Active = 0,
149    /// It cannot be traded, but can be pruned or force settled.
150    /// Can go from Halted to Active, if the only action taken is pruning.
151    Halted = 1,
152    /// If force settling has started, the market enters Cleaning state.
153    /// Nothing else can be done here.
154    Cleaning = 2,
155    /// Once the market is cleaned, it can become active again or it can be safely deleted.
156    Cleaned = 3,
157});
158
159define_enum!(
160    enum TakeFromInsuranceFundReason {
161        LiquidateBorrowLendLiability,
162        LiquidateIsoPerpPosition(MarketId),
163    }
164);