Skip to main content

bulk_client/msgs/
order.rs

1use solana_hash::Hash;
2use std::sync::Arc;
3use serde::{Deserialize, Serialize};
4use sha2::Digest;
5use solana_pubkey::Pubkey;
6use crate::common::tif::TimeInForce;
7use crate::transaction::ActionMeta;
8// ─────────────────────────────────────────────────────────────────────────────
9// Market Order
10// ─────────────────────────────────────────────────────────────────────────────
11
12#[derive(Clone, Debug, Serialize, Deserialize)]
13pub struct MarketOrder {
14    #[serde(rename = "c")]
15    pub symbol: Arc<str>,
16
17    #[serde(rename = "b")]
18    pub is_buy: bool,
19
20    #[serde(rename = "sz", with = "crate::msgs::fixed_point")]
21    pub size: f64,
22
23    #[serde(rename = "r")]
24    pub reduce_only: bool,
25
26    #[serde(rename = "i", default)]
27    pub iso: bool,
28
29    #[serde(skip)]
30    pub meta: ActionMeta,
31}
32
33impl MarketOrder {
34    /// Compute order ID
35    ///
36    /// # Arguments
37    /// - `account`: account associated with order
38    /// - `nonce`: nonce associated with tx
39    /// - `seqno`: action sequence number
40    pub fn order_id(&self, account: Pubkey, nonce: u64, seqno: u32) -> Hash {
41        let mut bin = Vec::<u8>::new();
42        bin.extend(seqno.to_le_bytes());
43        bin.extend(bincode::serialize(&self).unwrap());
44        bin.extend_from_slice(account.as_ref());
45        bin.extend_from_slice(&nonce.to_le_bytes());
46
47        let mut hasher = sha2::Sha256::new();
48        hasher.update(&bin);
49        let hash: [u8; 32] = hasher.finalize().into();
50        Hash::from(hash)
51    }
52}
53
54// ─────────────────────────────────────────────────────────────────────────────
55// Limit Order
56// ─────────────────────────────────────────────────────────────────────────────
57
58#[derive(Clone, Debug, Serialize, Deserialize)]
59pub struct LimitOrder {
60    #[serde(rename = "c")]
61    pub symbol: Arc<str>,
62
63    #[serde(rename = "b")]
64    pub is_buy: bool,
65
66    #[serde(rename = "px", with = "crate::msgs::fixed_point")]
67    pub price: f64,
68
69    #[serde(rename = "sz", with = "crate::msgs::fixed_point")]
70    pub size: f64,
71
72    #[serde(rename = "tif")]
73    pub tif: TimeInForce,
74
75    #[serde(rename = "r")]
76    pub reduce_only: bool,
77
78    #[serde(rename = "i", default)]
79    pub iso: bool,
80
81    #[serde(skip)]
82    pub meta: ActionMeta,
83}
84
85impl LimitOrder {
86    /// Compute order ID
87    ///
88    /// # Arguments
89    /// - `account`: account associated with order
90    /// - `nonce`: nonce associated with tx
91    /// - `seqno`: action sequence number
92    pub fn order_id(&self, account: Pubkey, nonce: u64, seqno: u32) -> Hash {
93        let mut bin = Vec::<u8>::new();
94        bin.extend(seqno.to_le_bytes());
95        bin.extend(bincode::serialize(&self).unwrap());
96        bin.extend_from_slice(account.as_ref());
97        bin.extend_from_slice(&nonce.to_le_bytes());
98
99        let mut hasher = sha2::Sha256::new();
100        hasher.update(&bin);
101        let hash: [u8; 32] = hasher.finalize().into();
102        Hash::from(hash)
103    }
104}
105
106// ─────────────────────────────────────────────────────────────────────────────
107// Modify Order
108// ─────────────────────────────────────────────────────────────────────────────
109
110/// Update order: changing order size
111#[derive(Clone, Debug, Serialize, Deserialize)]
112pub struct ModifyOrder {
113    #[serde(with = "crate::msgs::serde_hash", rename = "oid")]
114    pub order_id: Hash,
115    #[serde(rename = "c")]
116    pub symbol: String,
117    #[serde(rename = "sz")]
118    pub amount: f64,
119
120    #[serde(skip)]
121    pub meta: ActionMeta,
122}
123
124// ─────────────────────────────────────────────────────────────────────────────
125// Cancel Order
126// ─────────────────────────────────────────────────────────────────────────────
127
128#[derive(Clone, Debug, Serialize, Deserialize)]
129pub struct CancelOrder {
130    #[serde(rename = "c")]
131    pub symbol: String,
132    #[serde(with = "crate::msgs::serde_hash", rename = "oid")]
133    pub oid: Hash,
134
135    #[serde(skip)]
136    pub meta: ActionMeta,
137}
138
139// ─────────────────────────────────────────────────────────────────────────────
140// Cancel All Orders
141// ─────────────────────────────────────────────────────────────────────────────
142
143#[derive(Clone, Debug, Serialize, Deserialize)]
144pub struct CancelAll {
145    #[serde(rename = "c")]
146    pub symbols: Vec<String>,
147
148    #[serde(skip)]
149    pub meta: ActionMeta,
150}
151