deribit_base/model/
instrument.rs1use serde::{Deserialize, Serialize};
8
9use crate::{impl_json_debug_pretty, impl_json_display};
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum InstrumentKind {
14 Future,
16 Option,
18 Spot,
20 #[serde(rename = "future_combo")]
22 FutureCombo,
23 #[serde(rename = "option_combo")]
25 OptionCombo,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30#[serde(rename_all = "lowercase")]
31pub enum OptionType {
32 Call,
34 Put,
36}
37
38#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
40#[serde(rename_all = "lowercase")]
41pub enum InstrumentType {
42 Linear,
44 Reversed,
46}
47
48#[derive(Clone, Serialize, Deserialize)]
50pub struct Instrument {
51 pub instrument_name: String,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub kind: Option<InstrumentKind>,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub currency: Option<String>,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub is_active: Option<bool>,
62 pub expiration_timestamp: Option<i64>,
64 pub strike: Option<f64>,
66 pub option_type: Option<OptionType>,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub tick_size: Option<f64>,
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub min_trade_amount: Option<f64>,
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub contract_size: Option<f64>,
77 pub settlement_period: Option<String>,
79 pub instrument_type: Option<InstrumentType>,
81 pub quote_currency: Option<String>,
83 pub settlement_currency: Option<String>,
85 pub creation_timestamp: Option<i64>,
87 pub max_leverage: Option<f64>,
89 pub maker_commission: Option<f64>,
91 pub taker_commission: Option<f64>,
93 pub instrument_id: Option<u32>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub base_currency: Option<String>,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub counter_currency: Option<String>,
101}
102
103impl Instrument {
104 pub fn is_perpetual(&self) -> bool {
106 self.expiration_timestamp.is_none()
107 && self
108 .kind
109 .as_ref()
110 .is_some_and(|k| matches!(k, InstrumentKind::Future))
111 }
112
113 pub fn is_option(&self) -> bool {
115 self.kind
116 .as_ref()
117 .is_some_and(|k| matches!(k, InstrumentKind::Option | InstrumentKind::OptionCombo))
118 }
119
120 pub fn is_future(&self) -> bool {
122 self.kind
123 .as_ref()
124 .is_some_and(|k| matches!(k, InstrumentKind::Future | InstrumentKind::FutureCombo))
125 }
126
127 pub fn is_spot(&self) -> bool {
129 self.kind
130 .as_ref()
131 .is_some_and(|k| matches!(k, InstrumentKind::Spot))
132 }
133}
134
135#[derive(Clone, Serialize, Deserialize)]
137pub struct IndexData {
138 pub btc: Option<f64>,
140 pub eth: Option<f64>,
142 pub usdc: Option<f64>,
144 pub usdt: Option<f64>,
146 pub eurr: Option<f64>,
148 pub edp: f64,
150}
151
152#[derive(Clone, Serialize, Deserialize)]
154pub struct IndexPriceData {
155 pub index_price: f64,
157 pub estimated_delivery_price: f64,
159}
160
161impl_json_debug_pretty!(Instrument, IndexData, IndexPriceData);
163
164impl_json_display!(Instrument, IndexData, IndexPriceData);