1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
use std::fmt::Display;
use serde::{Serialize, Deserialize};
use crate::schemas::data_api::InstrumentStatus;
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize)]
/// The exchange to obtain data from.
pub enum OCDEXMarket {
AERODROMESLIPSTREAM,
AERODROMEV1,
BALANCERV2,
CURVE,
PANCAKESWAPV2,
PANCAKESWAPV3,
RAYDIUM,
SUSHISWAPV2,
SUSHISWAPV3,
UNISWAPV1,
#[default]
UNISWAPV2,
UNISWAPV3,
}
impl Display for OCDEXMarket {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::AERODROMESLIPSTREAM => write!(f, "aerodromeslipstream"),
Self::AERODROMEV1 => write!(f, "aerodromev1"),
Self::BALANCERV2 => write!(f, "balancerv2"),
Self::CURVE => write!(f, "curve"),
Self::PANCAKESWAPV2 => write!(f, "pancakeswapv2"),
Self::PANCAKESWAPV3 => write!(f, "pancakeswapv3"),
Self::RAYDIUM => write!(f, "raydium"),
Self::SUSHISWAPV2 => write!(f, "sushiswapv2"),
Self::SUSHISWAPV3 => write!(f, "sushiswapv3"),
Self::UNISWAPV1 => write!(f, "uniswapv1"),
Self::UNISWAPV2 => write!(f, "uniswapv2"),
Self::UNISWAPV3 => write!(f, "uniswapv3"),
}
}
}
// On-Cahin DEX: Historical OHLCV+
/// On-Chain DEX: Historical OHLCV+
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct OCDEXOHLCV {
#[serde(rename = "UNIT")]
/// The unit of the historical period update: MINUTE for minute, HOUR for hour and DAY for day.
pub unit: String,
#[serde(rename = "TIMESTAMP")]
/// The timestamp in seconds of the beginning of the histo period.
/// For minute it would be every minute at the beginning of the minute, for hour it would be the start of the hour and for daily it is 00:00 GMT.
pub timestamp: i64,
#[serde(rename = "TYPE")]
/// The internal type of the message.
pub type_: String,
#[serde(rename = "MARKET")]
/// The market / exchange under consideration (uniswapv2, uniswapv3 etc.).
pub market: String,
#[serde(rename = "INSTRUMENT")]
/// The unmapped instrument address and the CHAIN_ASSET ID separated by underscore (e.g. 0xe83c76c50033a5396d21ceff9fa192e2550d10ca_2, etc.).
pub instrument: String,
#[serde(rename = "MAPPED_INSTRUMENT")]
/// The instrument id based on asset symbols, as derived from our mapping rules. This is the same as the INSTRUMENT and will not change.
pub mapped_instrument: String,
#[serde(rename = "BASE")]
/// Represents the base asset or coin symbol, commonly known as the ticker (e.g., BTC). This symbol may change in cases of asset rebranding.
/// Applicable only to instruments with a mapping.
pub base: String,
#[serde(rename = "QUOTE")]
/// Represents the quote asset or counter coin symbol, commonly known as the ticker (e.g., USD). This symbol may change in cases of asset rebranding.
/// Applicable only to instruments with a mapping.
pub quote: String,
#[serde(rename = "BASE_ID")]
/// Represents the internal CoinDesk ID for the base asset or coin (e.g., 1 for BTC). This ID is unique and immutable, ensuring consistent identification.
/// Applicable only to instruments with a mapping.
pub base_id: i32,
#[serde(rename = "QUOTE_ID")]
/// Represents the internal CoinDesk ID for the quote asset or counter coin (e.g., 5 for USD). This ID is unique and immutable, ensuring consistent identification.
/// Applicable only to instruments with a mapping.
pub quote_id: i32,
#[serde(rename = "TRANSFORM_FUNCTION")]
/// The transform function (or list of functions concatenated by _AND_). This is the function we apply when we do mapping to change values into easier human
/// readable ones and to make sure the mapped direction BASE - QUOTE is constant accross all chains and instruments.
pub transform_function: String,
#[serde(rename = "OPEN")]
/// The open price for the historical period, this is based on the closest swap before the period start.
pub open: f64,
#[serde(rename = "HIGH")]
/// The highest swap price in the time period. If there were no swaps in the time period, the open price will be given.
pub high: f64,
#[serde(rename = "LOW")]
/// The lowest swap price in the time period. If there were no swaps in the time period, the open price will be given.
pub low: f64,
#[serde(rename = "CLOSE")]
/// The price of the last swap in this time period. If there were no swaps in the time period, the open price will be given.
pub close: f64,
#[serde(rename = "FIRST_SWAP_TIMESTAMP")]
/// The timestamp, in seconds, of the first swap in this time period. This is only available when there is at least one swap in the time period.
pub first_swap_timestamp: i64,
#[serde(rename = "FIRST_SWAP_BLOCK")]
/// The block of the first swap in the time period. This is only available when there is at least one swap in the time period.
pub first_swap_block: i64,
#[serde(rename = "LAST_SWAP_TIMESTAMP")]
/// The timestamp, in seconds, of the last swap in this time period. This is only available when there is at least one swap in the time period.
pub last_swap_timestamp: i64,
#[serde(rename = "LAST_SWAP_BLOCK")]
/// The block of the last swap in the time period. This is only available when there is at least one swap in the time period.
pub last_swap_block: i64,
#[serde(rename = "FIRST_SWAP_PRICE")]
/// The price of the first swap in the time period. This is only available when there is at least one swap in the time period.
pub first_swap_price: f64,
#[serde(rename = "HIGH_SWAP_PRICE")]
/// The highest value of the swaps in the time period. This is only available when there is at least one swap in the time period.
pub high_swap_price: f64,
#[serde(rename = "HIGH_SWAP_TIMESTAMP")]
/// The timestamp, in seconds, of the highest swap in the time period. This is only available when there is at least one swap in the time period.
pub high_swap_timestamp: i64,
#[serde(rename = "HIGH_SWAP_BLOCK")]
/// The block of the highest swap in the time period. This is only available when there is at least one swap in the time period.
pub high_swap_block: i64,
#[serde(rename = "LOW_SWAP_PRICE")]
/// The lowest value of the swaps in the time period. This is only available when there is at least one swap in the time period.
pub low_swap_price: f64,
#[serde(rename = "LOW_SWAP_TIMESTAMP")]
/// The timestamp, in seconds, of the lowest swap in the time period. This is only available when there is at least one swap in the time period.
pub low_swap_timestamp: i64,
#[serde(rename = "LOW_SWAP_BLOCK")]
/// The block of the lowest swap in the time period. This is only available when there is at least one swap in the time period.
pub low_swap_block: i64,
#[serde(rename = "LAST_SWAP_PRICE")]
/// The last swap price in the time period. This is only available when there is at least one swap in the time period.
pub last_swap_price: f64,
#[serde(rename = "TOTAL_SWAPS")]
/// The total number of swaps seen in this time period. If there were no swaps in the time period, 0 will be returned.
pub total_swaps: i64,
#[serde(rename = "TOTAL_SWAPS_BUY")]
/// The total number of BUY swaps seen in this time period. If there were no swaps in the time period, 0 will be returned.
pub total_swaps_buy: i64,
#[serde(rename = "TOTAL_SWAPS_SELL")]
/// The total number of SELL swaps seen in this time period. If there were no swaps in the time period, 0 will be returned."
pub total_swaps_sell: i64,
#[serde(rename = "TOTAL_SWAPS_UNKNOWN")]
/// The total number of UNKNOWN swaps seen in this time period. If there were no swaps in the time period, 0 will be returned.
pub total_swaps_unknown: i64,
#[serde(rename = "VOLUME")]
/// The sum of all the swap volumes in the from asset (base symbol / coin) for the time period. If there were no swaps in the time period, 0 will be returned.
pub volume: f64,
#[serde(rename = "QUOTE_VOLUME")]
/// The sum of all the swap volumes in the To asset (quote/counter symbol/coin) for the time period. If there were no swaps in the time period,
/// 0 will be returned.
pub quote_volume: f64,
#[serde(rename = "VOLUME_BUY")]
/// The sum of all the BUY swap volumes in the from asset (base symbol / coin) for the time period.
pub volume_buy: f64,
#[serde(rename = "QUOTE_VOLUME_BUY")]
/// The sum of all the BUY swap volumes in the to asset (quote/counter symbol/coin) for the time period.
pub quote_volume_buy: f64,
#[serde(rename = "VOLUME_SELL")]
/// The sum of all the SELL swap volumes in the from asset (base symbol / coin) for the time period.
pub volume_sell: f64,
#[serde(rename = "QUOTE_VOLUME_SELL")]
/// The sum of all the SELL swap volumes in the To asset (quote/counter symbol/coin) for the time period.
pub quote_volume_sell: f64,
#[serde(rename = "VOLUME_UNKNOWN")]
/// The sum of all the UNKNOWN swap volumes in the from asset (base symbol / coin) for the time period.
pub volume_unknown: String,
#[serde(rename = "QUOTE_VOLUME_UNKNOWN")]
/// The sum of all the UNKNOWN swap volumes in the To asset (quote/counter symbol/coin) for the time period.
pub quote_volume_unknown: String,
}
// On-Chain DEX: Market
/// On-Chain DEX: Market
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct OCDEXMarkets {
#[serde(rename = "TYPE")]
/// Type of the message.
pub type_: String,
#[serde(rename = "EXCHANGE_STATUS")]
/// The status of the echange. We only poll / stream / connect to the ACTIVE ones, for the RETIRED ones we no longer query for data.
pub exchange_status: String,
#[serde(rename = "MAPPED_INSTRUMENTS_TOTAL")]
/// The total number of instruments that have been verified by our mapping team and have been properly assigned with a base, quote, mapping function,
/// nd other necessary fields. This is done to ensure that pairs like XXBTZUSD are accurately mapped to BTC-USD and that the pair refers
/// to the correct assets rather than using the same asset id to represent different assets.
pub mapped_instrument_total: i64,
#[serde(rename = "UNMAPPED_INSTRUMENTS_TOTAL")]
/// The number of instruments that have not yet been verified by our mapping team.
pub unmapped_instruments_total: i64,
#[serde(rename = "INSTRUMENT_STATUS")]
/// An object with the total number of instrument for each of the available instrument statuses.
pub instrument_status: InstrumentStatus,
#[serde(rename = "TOTAL_AMM_SWAPS_ONCHAIN")]
/// The total number of defi swap trades this exchange has processed.
pub total_amm_swaps_onchain: i64,
#[serde(rename = "TOTAL_AMM_LIQUIDITY_UPDATES_ONCHAIN")]
/// The total number of defi liquidity updates this exchange has processed.
pub total_amm_liquidity_updates_onchain: i64,
#[serde(rename = "HAS_ORDERBOOK_L2_MINUTE_SNAPSHOTS_ENABLED")]
pub has_orderbook_l2_minute_snapshots_enabled: Option<bool>,
}