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
25pub 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}