Skip to main content

polyoxide_gamma/
types.rs

1use std::collections::HashMap;
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6/// Market data from Gamma API
7#[cfg_attr(feature = "specta", derive(specta::Type))]
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
9#[serde(rename_all = "camelCase")]
10pub struct Market {
11    pub id: String,
12    pub condition_id: String,
13    pub question_id: Option<String>,
14    pub slug: Option<String>,
15    #[serde(default)]
16    pub tokens: Vec<MarketToken>,
17    #[cfg_attr(feature = "specta", specta(type = Option<HashMap<String, String>>))]
18    pub rewards: Option<HashMap<String, serde_json::Value>>,
19    pub minimum_order_size: Option<String>,
20    pub minimum_tick_size: Option<String>,
21    pub description: String,
22    pub category: Option<String>,
23    pub end_date_iso: Option<String>,
24    pub start_date_iso: Option<String>,
25    pub question: String,
26    pub min_incentive_size: Option<String>,
27    pub max_incentive_spread: Option<String>,
28    pub submitted_by: Option<String>,
29    #[serde(rename = "volume24hr")] // lowercase 'hr' to match API
30    pub volume_24hr: Option<f64>,
31    #[serde(rename = "volume1wk")] // lowercase 'wk' to match API
32    pub volume_1wk: Option<f64>,
33    #[serde(rename = "volume1mo")] // lowercase 'mo' to match API
34    pub volume_1mo: Option<f64>,
35    #[serde(rename = "volume1yr")] // lowercase 'yr' to match API
36    pub volume_1yr: Option<f64>,
37    pub liquidity: Option<String>,
38    #[serde(default)]
39    pub tags: Vec<Tag>,
40    pub neg_risk: Option<bool>,
41    pub neg_risk_market_id: Option<String>,
42    pub neg_risk_request_id: Option<String>,
43    // Use i64 instead of u64 to prevent sentinel value
44    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
45    pub comment_count: Option<i64>,
46    pub twitter_card_image: Option<String>,
47    pub resolution_source: Option<String>,
48    pub amm_type: Option<String>,
49    pub sponsor_name: Option<String>,
50    pub sponsor_image: Option<String>,
51    pub x_axis_value: Option<String>,
52    pub y_axis_value: Option<String>,
53    #[serde(rename = "denomationToken")]
54    pub denomination_token: Option<String>,
55    pub fee: Option<String>,
56    pub image: Option<String>,
57    pub icon: Option<String>,
58    pub lower_bound: Option<String>,
59    pub upper_bound: Option<String>,
60    pub outcomes: Option<String>,
61    pub outcome_prices: Option<String>,
62    pub volume: Option<String>,
63    pub active: Option<bool>,
64    pub market_type: Option<String>,
65    pub format_type: Option<String>,
66    pub lower_bound_date: Option<String>,
67    pub upper_bound_date: Option<String>,
68    pub closed: Option<bool>,
69    pub market_maker_address: String,
70    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
71    pub created_by: Option<i64>,
72    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
73    pub updated_by: Option<i64>,
74    pub created_at: Option<String>,
75    pub updated_at: Option<String>,
76    pub closed_time: Option<String>,
77    pub wide_format: Option<bool>,
78    pub new: Option<bool>,
79    pub mailchimp_tag: Option<String>,
80    pub featured: Option<bool>,
81    pub archived: Option<bool>,
82    pub resolved_by: Option<String>,
83    pub restricted: Option<bool>,
84    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
85    pub market_group: Option<i64>,
86    pub group_item_title: Option<String>,
87    pub group_item_threshold: Option<String>,
88    pub uma_end_date: Option<String>,
89    pub uma_resolution_status: Option<String>,
90    pub uma_end_date_iso: Option<String>,
91    pub uma_resolution_statuses: Option<String>,
92    pub enable_order_book: Option<bool>,
93    pub order_price_min_tick_size: Option<f64>,
94    pub order_min_size: Option<f64>,
95    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
96    pub curation_order: Option<i64>,
97    pub volume_num: Option<f64>,
98    pub liquidity_num: Option<f64>,
99    pub has_review_dates: Option<bool>,
100    pub ready_for_cron: Option<bool>,
101    pub comments_enabled: Option<bool>,
102    pub game_start_time: Option<String>,
103    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
104    pub seconds_delay: Option<i64>,
105    pub clob_token_ids: Option<String>,
106    pub disqus_thread: Option<String>,
107    pub short_outcomes: Option<String>,
108    pub team_aid: Option<String>,
109    pub team_bid: Option<String>,
110    pub uma_bond: Option<String>,
111    pub uma_reward: Option<String>,
112    pub fpmm_live: Option<bool>,
113    #[serde(rename = "volume24hrAmm")] // Match API field names
114    pub volume_24hr_amm: Option<f64>,
115    #[serde(rename = "volume1wkAmm")]
116    pub volume_1wk_amm: Option<f64>,
117    #[serde(rename = "volume1moAmm")]
118    pub volume_1mo_amm: Option<f64>,
119    #[serde(rename = "volume1yrAmm")]
120    pub volume_1yr_amm: Option<f64>,
121    #[serde(rename = "volume24hrClob")]
122    pub volume_24hr_clob: Option<f64>,
123    #[serde(rename = "volume1wkClob")]
124    pub volume_1wk_clob: Option<f64>,
125    #[serde(rename = "volume1moClob")]
126    pub volume_1mo_clob: Option<f64>,
127    #[serde(rename = "volume1yrClob")]
128    pub volume_1yr_clob: Option<f64>,
129    pub volume_amm: Option<f64>,
130    pub volume_clob: Option<f64>,
131    pub liquidity_amm: Option<f64>,
132    pub liquidity_clob: Option<f64>,
133    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
134    pub maker_base_fee: Option<i64>,
135    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
136    pub taker_base_fee: Option<i64>,
137    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
138    pub custom_liveness: Option<i64>,
139    pub accepting_orders: Option<bool>,
140    pub notifications_enabled: Option<bool>,
141    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
142    pub score: Option<i64>,
143    pub creator: Option<String>,
144    pub ready: Option<bool>,
145    pub funded: Option<bool>,
146    pub past_slugs: Option<String>,
147    pub ready_timestamp: Option<String>,
148    pub funded_timestamp: Option<String>,
149    pub accepting_orders_timestamp: Option<String>,
150    pub competitive: Option<f64>,
151    pub rewards_min_size: Option<f64>,
152    pub rewards_max_spreads: Option<f64>,
153    pub spread: Option<f64>,
154    pub automatically_resolved: Option<bool>,
155    pub automatically_active: Option<bool>,
156    pub one_day_price_change: Option<f64>,
157    pub one_hour_price_change: Option<f64>,
158    pub one_week_price_change: Option<f64>,
159    pub one_month_price_change: Option<f64>,
160    pub one_year_price_change: Option<f64>,
161    pub last_trade_price: Option<f64>,
162    pub best_bid: Option<f64>,
163    pub best_ask: Option<f64>,
164    pub clear_book_on_start: Option<bool>,
165    pub chart_color: Option<String>,
166    pub series_color: Option<String>,
167    pub show_gmp_series: Option<bool>,
168    pub show_gmp_outcome: Option<bool>,
169    pub manual_activation: Option<bool>,
170    pub neg_risk_other: Option<bool>,
171    pub game_id: Option<String>,
172    pub group_item_range: Option<String>,
173    pub sports_market_type: Option<String>,
174    pub line: Option<f64>,
175    pub pending_deployment: Option<bool>,
176    pub deploying: Option<bool>,
177    pub deploying_timestamp: Option<String>,
178    pub schedule_deployment_timestamp: Option<String>,
179    pub rfq_enabled: Option<bool>,
180    pub event_start_time: Option<String>,
181}
182
183/// Market token (outcome)
184#[cfg_attr(feature = "specta", derive(specta::Type))]
185#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
186#[serde(rename_all = "camelCase")]
187pub struct MarketToken {
188    pub token_id: String,
189    pub outcome: String,
190    pub price: Option<String>,
191    pub winner: Option<bool>,
192}
193
194#[cfg_attr(feature = "specta", derive(specta::Type))]
195#[derive(Debug, Clone, Serialize, Deserialize)]
196#[serde(rename_all = "camelCase")]
197pub struct Event {
198    pub id: String,
199    pub ticker: Option<String>,
200    pub slug: Option<String>,
201    pub title: Option<String>,
202    pub subtitle: Option<String>,
203    pub description: Option<String>,
204    pub resolution_source: Option<String>,
205    pub start_date: Option<String>,
206    pub creation_date: Option<String>,
207    pub end_date: Option<String>,
208    pub image: Option<String>,
209    pub icon: Option<String>,
210    pub start_date_iso: Option<String>,
211    pub end_date_iso: Option<String>,
212    pub active: Option<bool>,
213    pub closed: Option<bool>,
214    pub archived: Option<bool>,
215    pub new: Option<bool>,
216    pub featured: Option<bool>,
217    pub restricted: Option<bool>,
218    pub liquidity: Option<f64>,
219    pub open_interest: Option<f64>,
220    pub sort_by: Option<String>,
221    pub category: Option<String>,
222    pub subcategory: Option<String>,
223    pub is_template: Option<bool>,
224    pub template_variables: Option<String>,
225    pub published_at: Option<String>,
226    pub created_by: Option<String>,
227    pub updated_by: Option<String>,
228    pub created_at: Option<String>,
229    pub updated_at: Option<String>,
230    pub comments_enabled: Option<bool>,
231    pub competitive: Option<f64>,
232    #[serde(rename = "volume24h")] // API uses '24h' not '24hr' for events
233    pub volume_24hr: Option<f64>,
234    #[serde(rename = "volume1wk")]
235    pub volume_1wk: Option<f64>,
236    #[serde(rename = "volume1mo")]
237    pub volume_1mo: Option<f64>,
238    #[serde(rename = "volume1yr")]
239    pub volume_1yr: Option<f64>,
240    pub featured_image: Option<String>,
241    pub disqus_thread: Option<String>,
242    pub parent_event: Option<String>,
243    pub enable_order_book: Option<bool>,
244    pub liquidity_amm: Option<f64>,
245    pub liquidity_clob: Option<f64>,
246    pub neg_risk: Option<bool>,
247    pub neg_risk_market_id: Option<String>,
248    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
249    pub neg_risk_fee_bips: Option<i64>,
250    #[serde(default)]
251    pub sub_events: Vec<String>,
252    #[serde(default)]
253    pub markets: Vec<Market>,
254    #[serde(default)]
255    pub tags: Vec<Tag>,
256    #[serde(default)]
257    pub series: Vec<SeriesInfo>,
258    pub cyom: Option<bool>,
259    pub closed_time: Option<String>,
260    pub show_all_outcomes: Option<bool>,
261    pub show_market_images: Option<bool>,
262    pub automatically_resolved: Option<bool>,
263    #[serde(rename = "enalbeNegRisk")]
264    pub enable_neg_risk: Option<bool>,
265    pub automatically_active: Option<bool>,
266    pub event_date: Option<String>,
267    pub start_time: Option<String>,
268    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
269    pub event_week: Option<i64>,
270    pub series_slug: Option<String>,
271    pub score: Option<String>,
272    pub elapsed: Option<String>,
273    pub period: Option<String>,
274    pub live: Option<bool>,
275    pub ended: Option<bool>,
276    pub finished_timestamp: Option<String>,
277    pub gmp_chart_mode: Option<String>,
278    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
279    pub tweet_count: Option<i64>,
280    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
281    pub featured_order: Option<i64>,
282    pub estimate_value: Option<bool>,
283    pub cant_estimate: Option<bool>,
284    pub spreads_main_line: Option<f64>,
285    pub totals_main_line: Option<f64>,
286    pub carousel_map: Option<String>,
287    pub pending_deployment: Option<bool>,
288    pub deploying: Option<bool>,
289    pub deploying_timestamp: Option<String>,
290    pub schedule_deployment_timestamp: Option<String>,
291    pub game_status: Option<String>,
292}
293
294/// Series information within an event
295#[cfg_attr(feature = "specta", derive(specta::Type))]
296#[derive(Debug, Clone, Serialize, Deserialize)]
297#[serde(rename_all = "camelCase")]
298pub struct SeriesInfo {
299    pub id: String,
300    pub slug: String,
301    pub title: String,
302}
303
304/// Series data (tournament/season grouping)
305#[cfg_attr(feature = "specta", derive(specta::Type))]
306#[derive(Debug, Clone, Serialize, Deserialize)]
307#[serde(rename_all = "camelCase")]
308pub struct SeriesData {
309    pub id: String,
310    pub slug: String,
311    pub title: String,
312    pub description: Option<String>,
313    pub image: Option<String>,
314    pub icon: Option<String>,
315    pub active: bool,
316    pub closed: bool,
317    pub archived: bool,
318    #[serde(default)]
319    pub tags: Vec<String>,
320    pub volume: Option<f64>,
321    pub liquidity: Option<f64>,
322    #[serde(default)]
323    pub events: Vec<Event>,
324    pub competitive: Option<String>,
325}
326
327/// Tag for categorizing markets/events
328#[cfg_attr(feature = "specta", derive(specta::Type))]
329#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
330#[serde(rename_all = "camelCase")]
331pub struct Tag {
332    pub id: String,
333    pub slug: String,
334    pub label: String,
335    pub force_show: Option<bool>,
336    pub published_at: Option<String>,
337    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
338    pub created_by: Option<u64>,
339    #[cfg_attr(feature = "specta", specta(type = Option<f64>))]
340    pub updated_by: Option<u64>,
341    pub created_at: Option<String>,
342    pub updated_at: Option<String>,
343    pub force_hide: Option<bool>,
344    pub is_carousel: Option<bool>,
345}
346
347/// Sports metadata
348#[cfg_attr(feature = "specta", derive(specta::Type))]
349#[derive(Debug, Clone, Serialize, Deserialize)]
350#[serde(rename_all = "camelCase")]
351pub struct SportMetadata {
352    #[cfg_attr(feature = "specta", specta(type = f64))]
353    pub id: u64,
354    pub sport: String,
355    pub image: Option<String>,
356    pub resolution: Option<String>,
357    pub ordering: Option<String>,
358    pub tags: Option<String>,
359    pub series: Option<String>,
360    pub created_at: Option<String>,
361}
362
363/// Sports team
364#[cfg_attr(feature = "specta", derive(specta::Type))]
365#[derive(Debug, Clone, Serialize, Deserialize)]
366#[serde(rename_all = "camelCase")]
367pub struct Team {
368    #[cfg_attr(feature = "specta", specta(type = f64))]
369    pub id: i64,
370    pub name: Option<String>,
371    pub league: Option<String>,
372    pub record: Option<String>,
373    pub logo: Option<String>,
374    pub abbreviation: Option<String>,
375    pub alias: Option<String>,
376    pub created_at: Option<DateTime<Utc>>,
377    pub updated_at: Option<DateTime<Utc>>,
378}
379
380/// Comment on a market/event/series
381#[cfg_attr(feature = "specta", derive(specta::Type))]
382#[derive(Debug, Clone, Serialize, Deserialize)]
383#[serde(rename_all = "camelCase")]
384pub struct Comment {
385    pub id: String,
386    pub body: String,
387    pub created_at: DateTime<Utc>,
388    pub updated_at: DateTime<Utc>,
389    pub deleted_at: Option<DateTime<Utc>>,
390    pub user: CommentUser,
391    pub market_id: Option<String>,
392    pub event_id: Option<String>,
393    pub series_id: Option<String>,
394    pub parent_id: Option<String>,
395    #[serde(default)]
396    pub reactions: Vec<CommentReaction>,
397    #[serde(default)]
398    pub positions: Vec<CommentPosition>,
399    #[cfg_attr(feature = "specta", specta(type = f64))]
400    pub like_count: u32,
401    #[cfg_attr(feature = "specta", specta(type = f64))]
402    pub dislike_count: u32,
403    #[cfg_attr(feature = "specta", specta(type = f64))]
404    pub reply_count: u32,
405}
406
407/// User who created a comment
408#[cfg_attr(feature = "specta", derive(specta::Type))]
409#[derive(Debug, Clone, Serialize, Deserialize)]
410#[serde(rename_all = "camelCase")]
411pub struct CommentUser {
412    pub id: String,
413    pub name: String,
414    pub avatar: Option<String>,
415}
416
417/// Reaction to a comment
418#[cfg_attr(feature = "specta", derive(specta::Type))]
419#[derive(Debug, Clone, Serialize, Deserialize)]
420#[serde(rename_all = "camelCase")]
421pub struct CommentReaction {
422    pub user_id: String,
423    pub reaction_type: String,
424}
425
426/// Position held by comment author
427#[cfg_attr(feature = "specta", derive(specta::Type))]
428#[derive(Debug, Clone, Serialize, Deserialize)]
429#[serde(rename_all = "camelCase")]
430pub struct CommentPosition {
431    pub token_id: String,
432    pub outcome: String,
433    pub shares: String,
434}
435
436/// Pagination cursor for list operations
437#[cfg_attr(feature = "specta", derive(specta::Type))]
438#[derive(Debug, Clone, Serialize, Deserialize)]
439#[serde(rename_all = "camelCase")]
440pub struct Cursor {
441    pub next_cursor: Option<String>,
442}
443
444/// Paginated response wrapper
445#[cfg_attr(feature = "specta", derive(specta::Type))]
446#[derive(Debug, Clone, Serialize, Deserialize)]
447#[serde(rename_all = "camelCase")]
448pub struct PaginatedResponse<T> {
449    pub data: Vec<T>,
450    pub next_cursor: Option<String>,
451}