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 price_index: Option<String>,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub kind: Option<InstrumentKind>,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub currency: Option<String>,
62 #[serde(skip_serializing_if = "Option::is_none")]
64 pub is_active: Option<bool>,
65 pub expiration_timestamp: Option<i64>,
67 pub strike: Option<f64>,
69 pub option_type: Option<OptionType>,
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub tick_size: Option<f64>,
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub min_trade_amount: Option<f64>,
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub contract_size: Option<f64>,
80 pub settlement_period: Option<String>,
82 pub instrument_type: Option<InstrumentType>,
84 pub quote_currency: Option<String>,
86 pub settlement_currency: Option<String>,
88 pub creation_timestamp: Option<i64>,
90 pub max_leverage: Option<f64>,
92 pub maker_commission: Option<f64>,
94 pub taker_commission: Option<f64>,
96 pub instrument_id: Option<u32>,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub base_currency: Option<String>,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub counter_currency: Option<String>,
104}
105
106impl Instrument {
107 pub fn is_perpetual(&self) -> bool {
109 self.expiration_timestamp.is_none()
110 && self
111 .kind
112 .as_ref()
113 .is_some_and(|k| matches!(k, InstrumentKind::Future))
114 }
115
116 pub fn is_option(&self) -> bool {
118 self.kind
119 .as_ref()
120 .is_some_and(|k| matches!(k, InstrumentKind::Option | InstrumentKind::OptionCombo))
121 }
122
123 pub fn is_future(&self) -> bool {
125 self.kind
126 .as_ref()
127 .is_some_and(|k| matches!(k, InstrumentKind::Future | InstrumentKind::FutureCombo))
128 }
129
130 pub fn is_spot(&self) -> bool {
132 self.kind
133 .as_ref()
134 .is_some_and(|k| matches!(k, InstrumentKind::Spot))
135 }
136}
137
138#[derive(Clone, Serialize, Deserialize)]
140pub struct IndexData {
141 pub btc: Option<f64>,
143 pub eth: Option<f64>,
145 pub usdc: Option<f64>,
147 pub usdt: Option<f64>,
149 pub eurr: Option<f64>,
151 pub edp: f64,
153}
154
155#[derive(Clone, Serialize, Deserialize)]
157pub struct IndexPriceData {
158 pub index_price: f64,
160 pub estimated_delivery_price: f64,
162}
163
164impl_json_debug_pretty!(Instrument, IndexData, IndexPriceData);
166
167impl_json_display!(Instrument, IndexData, IndexPriceData);