Skip to main content

o2_api_types/websocket/
requests.rs

1use crate::{
2    OrderId,
3    domain::{
4        bars::SubscriptionFrequency,
5        book::MarketId,
6        event::Identity,
7    },
8    fuel_types::{
9        Address,
10        AssetId,
11        Bytes32,
12        Bytes64,
13        UtxoId,
14    },
15};
16use serde::{
17    Deserialize,
18    Serialize,
19};
20use serde_with::{
21    DisplayFromStr,
22    serde_as,
23};
24
25/// @TODO: Add precision based on the market pair
26pub const PRECISIONS: [u64; 9] = [
27    10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000,
28];
29
30#[derive(Serialize, Deserialize, Debug)]
31#[serde(tag = "action")]
32pub enum Request {
33    #[serde(rename = "subscribe_depth")]
34    SubscribeDepth(SubscribeDepthRequest),
35    #[serde(rename = "subscribe_depth_view")]
36    SubscribeDepthView(SubscribeDepthViewRequest),
37    #[serde(rename = "subscribe_orders")]
38    SubscribeOrders(SubscribeOrdersRequest),
39    #[serde(rename = "subscribe_trades")]
40    SubscribeTrades(SubscribeTradesRequest),
41    #[serde(rename = "unsubscribe_depth")]
42    UnsubscribeDepth(UnsubscribeDepthRequest),
43    #[serde(rename = "unsubscribe_depth_view")]
44    UnsubscribeDepthView(UnsubscribeDepthViewRequest),
45    #[serde(rename = "unsubscribe_orders")]
46    UnsubscribeOrders(UnsubscribeOrdersRequest),
47    #[serde(rename = "unsubscribe_trades")]
48    UnsubscribeTrades(UnsubscribeTradesRequest),
49    #[serde(rename = "subscribe_balances")]
50    SubscribeBalances(SubscribeBalancesRequest),
51    #[serde(rename = "unsubscribe_balances")]
52    UnsubscribeBalances(UnsubscribeBalancesRequest),
53    #[serde(rename = "subscribe_nonce")]
54    SubscribeNonce(SubscribeNonceRequest),
55    #[serde(rename = "unsubscribe_nonce")]
56    UnsubscribeNonce(UnsubscribeNonceRequest),
57}
58
59#[serde_as]
60#[derive(Serialize, Deserialize, Debug, Clone)]
61pub struct SubscribeDepthRequest {
62    #[serde(default = "depth")]
63    pub topic: String,
64    pub market_id: MarketId,
65    #[serde_as(as = "DisplayFromStr")]
66    pub precision: u64,
67}
68
69#[serde_as]
70#[derive(Serialize, Deserialize, Debug, Clone)]
71pub struct SubscribeDepthViewRequest {
72    #[serde(default = "depth")]
73    pub topic: String,
74    pub market_id: MarketId,
75    #[serde_as(as = "DisplayFromStr")]
76    pub precision: u64,
77    #[serde_as(as = "DisplayFromStr")]
78    pub frequency: SubscriptionFrequency,
79}
80
81#[derive(Serialize, Deserialize, Debug)]
82pub struct SubscribeOrdersRequest {
83    #[serde(default = "orders")]
84    pub topic: String,
85    pub identities: Vec<Identity>,
86}
87
88#[derive(Serialize, Deserialize, Debug)]
89pub struct SubscribeNonceRequest {
90    #[serde(default = "nonce")]
91    pub topic: String,
92    pub identities: Vec<Identity>,
93}
94
95#[derive(Serialize, Deserialize, Debug)]
96pub struct SubscribeTradesRequest {
97    #[serde(default = "trades")]
98    pub topic: String,
99    pub market_id: MarketId,
100}
101
102fn depth() -> String {
103    "depth".to_string()
104}
105
106fn orders() -> String {
107    "orders".to_string()
108}
109
110fn trades() -> String {
111    "trades".to_string()
112}
113
114fn balances() -> String {
115    "balances".to_string()
116}
117
118fn nonce() -> String {
119    "nonce".to_string()
120}
121
122#[derive(Serialize, Deserialize, Debug)]
123pub struct UnsubscribeDepthRequest {
124    #[serde(default = "depth")]
125    pub topic: String,
126    pub market_id: MarketId,
127}
128
129#[derive(Serialize, Deserialize, Debug)]
130pub struct UnsubscribeDepthViewRequest {
131    #[serde(default = "depth")]
132    pub topic: String,
133    pub market_id: MarketId,
134}
135
136#[derive(Serialize, Deserialize, Debug)]
137pub struct UnsubscribeOrdersRequest {
138    #[serde(default = "orders")]
139    pub topic: String,
140}
141
142#[derive(Serialize, Deserialize, Debug)]
143pub struct UnsubscribeTradesRequest {
144    #[serde(default = "trades")]
145    pub topic: String,
146    pub market_id: MarketId,
147}
148
149#[derive(Serialize, Deserialize, Debug)]
150pub struct SubscribeBalancesRequest {
151    #[serde(default = "balances")]
152    pub topic: String,
153    pub identities: Vec<Identity>,
154}
155
156#[derive(Serialize, Deserialize, Debug)]
157pub struct UnsubscribeBalancesRequest {
158    #[serde(default = "balances")]
159    pub topic: String,
160    pub identities: Vec<Identity>,
161}
162
163#[derive(Serialize, Deserialize, Debug)]
164pub struct UnsubscribeNonceRequest {
165    #[serde(default = "nonce")]
166    pub topic: String,
167    pub identities: Vec<Identity>,
168}
169
170#[serde_as]
171#[derive(Serialize, Deserialize, Debug)]
172pub struct CancelOrderRequest {
173    pub market_id: MarketId,
174    #[serde_as(as = "DisplayFromStr")]
175    pub order_id: OrderId,
176}
177
178#[derive(Serialize, Deserialize, Debug, Clone)]
179pub struct CreateLimitOrderRequest {
180    pub market_id: MarketId,
181    pub account: Address,
182    pub inputs: Vec<UtxoId>,
183    pub order: CreateLimitOrderParams,
184    pub signature: Bytes64,
185}
186
187#[derive(Serialize, Deserialize, Debug, Clone)]
188pub struct Intent {
189    pub asset_id: AssetId,
190    pub amount: u64,
191}
192
193#[serde_as]
194#[derive(Serialize, Deserialize, Debug, Clone, Hash, Eq, PartialEq)]
195pub struct CreateLimitOrderParams {
196    pub side: String,
197    #[serde_as(as = "DisplayFromStr")]
198    pub quantity: u64,
199    #[serde_as(as = "DisplayFromStr")]
200    pub price: u64,
201}
202
203#[derive(Serialize, Deserialize, Debug)]
204pub struct GetUtxosRequest {
205    pub account: Bytes32,
206}
207
208#[derive(Serialize, Deserialize, Debug)]
209pub struct GetTrades {
210    pub market_id: Bytes32,
211}
212
213#[derive(Serialize, Deserialize, Debug)]
214pub struct GetTradeDataRequest {
215    pub market_id: MarketId,
216    pub period: String,
217}