Skip to main content

bybit_api/models/
earn.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4#[serde(rename_all = "camelCase")]
5pub struct PaginatedList {
6    #[serde(skip_serializing_if = "Option::is_none")]
7    pub next_page_cursor: Option<String>,
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub struct DualAssetsProduct {
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub category: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub product_id: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub base_coin: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub quote_coin: Option<String>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub expect_receive_at: Option<String>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub duration: Option<String>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub status: Option<String>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub is_vip_product: Option<bool>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub subscribe_start_at: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub subscribe_end_at: Option<String>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub apply_start_at: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub settlement_time: Option<String>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub min_purchase_quote_amount: Option<String>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub min_purchase_base_amount: Option<String>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub remaining_amount_quote: Option<String>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub remaining_amount_base: Option<String>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub order_precision_digital_quote: Option<i32>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub order_precision_digital_base: Option<i32>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52#[serde(rename_all = "camelCase")]
53pub struct GetAdvanceProductResult {
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub category: Option<String>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub list: Option<Vec<DualAssetsProduct>>,
58}
59
60pub type GetAdvanceEarnProductResponse = GetAdvanceProductResult;
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
63#[serde(rename_all = "camelCase")]
64pub struct PriceQuote {
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub select_price: Option<String>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub apy_e8: Option<i64>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub max_investment_amount: Option<String>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub expired_at: Option<String>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76#[serde(rename_all = "camelCase")]
77pub struct ProductOffer {
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub product_id: Option<String>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub current_price: Option<String>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub buy_low_price: Option<Vec<PriceQuote>>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub sell_high_price: Option<Vec<PriceQuote>>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase")]
90pub struct GetProductExtraInfoResult {
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub category: Option<String>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub list: Option<Vec<ProductOffer>>,
95}
96
97pub type GetAdvanceEarnProductExtraInfoResponse = GetProductExtraInfoResult;
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100#[serde(rename_all = "camelCase")]
101pub struct DualAssetsExtra {
102    pub order_direction: String,
103    pub select_price: String,
104    pub apy_e8: i64,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108#[serde(rename_all = "camelCase")]
109pub struct InterestCard {
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub award_id: Option<i64>,
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub spec_code: Option<String>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct SmartLeverageStakeExtra {
119    pub initial_price: String,
120    pub breakeven_price: String,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
124#[serde(rename_all = "camelCase")]
125pub struct SmartLeverageRedeemExtra {
126    pub position_id: String,
127    pub est_redeem_amount: String,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub is_slippage_protected: Option<bool>,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
133#[serde(rename_all = "camelCase")]
134pub struct PlaceAdvanceEarnOrderParams {
135    pub category: String,
136    pub product_id: i64,
137    pub order_type: String,
138    pub amount: String,
139    pub account_type: String,
140    pub coin: String,
141    pub order_link_id: String,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub dual_assets_extra: Option<DualAssetsExtra>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub interest_card: Option<InterestCard>,
146    #[serde(skip_serializing_if = "Option::is_none")]
147    pub smart_leverage_stake_extra: Option<SmartLeverageStakeExtra>,
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub smart_leverage_redeem_extra: Option<SmartLeverageRedeemExtra>,
150    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
151    // spec did not provide a matching inner type at generation time. Replace
152    // with a typed struct in a follow-up PR after consulting the V5 docs.
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub double_win_stake_extra: Option<serde_json::Value>,
155    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
156    // spec did not provide a matching inner type at generation time. Replace
157    // with a typed struct in a follow-up PR after consulting the V5 docs.
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub double_win_redeem_extra: Option<serde_json::Value>,
160    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
161    // spec did not provide a matching inner type at generation time. Replace
162    // with a typed struct in a follow-up PR after consulting the V5 docs.
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub discount_buy_extra: Option<serde_json::Value>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct PlaceAdvanceOrderResult {
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub order_id: Option<String>,
172    #[serde(skip_serializing_if = "Option::is_none")]
173    pub order_link_id: Option<String>,
174}
175
176pub type PlaceAdvanceEarnOrderResponse = PlaceAdvanceOrderResult;
177
178#[derive(Debug, Clone, Serialize, Deserialize)]
179#[serde(rename_all = "camelCase")]
180pub struct DualAssetsPosition {
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub position_id: Option<String>,
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub product_id: Option<String>,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub category: Option<String>,
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub base_coin: Option<String>,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub quote_coin: Option<String>,
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub invest_coin: Option<String>,
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub amount: Option<String>,
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub apy_e8: Option<String>,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub direction: Option<String>,
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub target_price: Option<String>,
201    #[serde(skip_serializing_if = "Option::is_none")]
202    pub settlement_time: Option<String>,
203    #[serde(skip_serializing_if = "Option::is_none")]
204    pub status: Option<String>,
205    #[serde(skip_serializing_if = "Option::is_none")]
206    pub order_id: Option<String>,
207    #[serde(skip_serializing_if = "Option::is_none")]
208    pub duration: Option<String>,
209    #[serde(skip_serializing_if = "Option::is_none")]
210    pub expect_return_coin: Option<String>,
211    #[serde(skip_serializing_if = "Option::is_none")]
212    pub expect_return_amount: Option<String>,
213    #[serde(skip_serializing_if = "Option::is_none")]
214    pub account_type: Option<String>,
215    #[serde(skip_serializing_if = "Option::is_none")]
216    pub to_account_type: Option<String>,
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub yield_start_at: Option<String>,
219    #[serde(skip_serializing_if = "Option::is_none")]
220    pub yield_end_at: Option<String>,
221}
222
223#[derive(Debug, Clone, Serialize, Deserialize)]
224#[serde(rename_all = "camelCase")]
225pub struct GetAdvancePositionResult {
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub next_page_cursor: Option<String>,
228    #[serde(skip_serializing_if = "Option::is_none")]
229    pub category: Option<String>,
230    #[serde(skip_serializing_if = "Option::is_none")]
231    pub list: Option<Vec<DualAssetsPosition>>,
232}
233
234pub type GetAdvanceEarnPositionResponse = GetAdvancePositionResult;
235
236#[derive(Debug, Clone, Serialize, Deserialize)]
237#[serde(rename_all = "camelCase")]
238pub struct DualAssetsOrder {
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub order_id: Option<String>,
241    #[serde(skip_serializing_if = "Option::is_none")]
242    pub order_link_id: Option<String>,
243    #[serde(skip_serializing_if = "Option::is_none")]
244    pub product_id: Option<String>,
245    #[serde(skip_serializing_if = "Option::is_none")]
246    pub category: Option<String>,
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub order_type: Option<String>,
249    #[serde(skip_serializing_if = "Option::is_none")]
250    pub amount: Option<String>,
251    #[serde(skip_serializing_if = "Option::is_none")]
252    pub coin: Option<String>,
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub base_coin: Option<String>,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub quote_coin: Option<String>,
257    #[serde(skip_serializing_if = "Option::is_none")]
258    pub status: Option<String>,
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub created_time: Option<String>,
261    #[serde(skip_serializing_if = "Option::is_none")]
262    pub updated_time: Option<String>,
263    #[serde(skip_serializing_if = "Option::is_none")]
264    pub direction: Option<String>,
265    #[serde(skip_serializing_if = "Option::is_none")]
266    pub target_price: Option<String>,
267    #[serde(skip_serializing_if = "Option::is_none")]
268    pub settlement_time: Option<String>,
269    #[serde(skip_serializing_if = "Option::is_none")]
270    pub estimate_apy_e8: Option<String>,
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub duration: Option<String>,
273    #[serde(skip_serializing_if = "Option::is_none")]
274    pub account_type: Option<String>,
275    #[serde(skip_serializing_if = "Option::is_none")]
276    pub to_account_type: Option<String>,
277    #[serde(skip_serializing_if = "Option::is_none")]
278    pub select_apy_e8: Option<String>,
279    #[serde(skip_serializing_if = "Option::is_none")]
280    pub is_vip: Option<bool>,
281    #[serde(skip_serializing_if = "Option::is_none")]
282    pub settlement_coin: Option<String>,
283    #[serde(skip_serializing_if = "Option::is_none")]
284    pub settlement_amount: Option<String>,
285    #[serde(skip_serializing_if = "Option::is_none")]
286    pub order_mode: Option<String>,
287    #[serde(skip_serializing_if = "Option::is_none")]
288    pub settlement_price: Option<String>,
289    #[serde(skip_serializing_if = "Option::is_none")]
290    pub refund_status: Option<String>,
291    #[serde(skip_serializing_if = "Option::is_none")]
292    pub trial_bonus_amount: Option<String>,
293    #[serde(skip_serializing_if = "Option::is_none")]
294    pub trial_bonus_pnl: Option<String>,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
298#[serde(rename_all = "camelCase")]
299pub struct GetAdvanceOrderResult {
300    #[serde(skip_serializing_if = "Option::is_none")]
301    pub next_page_cursor: Option<String>,
302    #[serde(skip_serializing_if = "Option::is_none")]
303    pub category: Option<String>,
304    #[serde(skip_serializing_if = "Option::is_none")]
305    pub list: Option<Vec<DualAssetsOrder>>,
306}
307
308pub type GetAdvanceEarnOrderResponse = GetAdvanceOrderResult;
309
310#[derive(Debug, Clone, Serialize, Deserialize)]
311#[serde(rename_all = "camelCase")]
312pub struct SmartLeverageProduct {
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub category: Option<String>,
315    #[serde(skip_serializing_if = "Option::is_none")]
316    pub product_id: Option<String>,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub invest_coin: Option<String>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub underlying_asset: Option<String>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub direction: Option<String>,
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub leverage: Option<String>,
325    #[serde(skip_serializing_if = "Option::is_none")]
326    pub duration: Option<String>,
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub expect_receive_at: Option<String>,
329    #[serde(skip_serializing_if = "Option::is_none")]
330    pub subscribe_start_at: Option<String>,
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub subscribe_end_at: Option<String>,
333    #[serde(skip_serializing_if = "Option::is_none")]
334    pub settlement_time: Option<String>,
335    #[serde(skip_serializing_if = "Option::is_none")]
336    pub min_purchase_amount: Option<String>,
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub remaining_amount: Option<String>,
339    #[serde(skip_serializing_if = "Option::is_none")]
340    pub order_precision_digital: Option<i32>,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize)]
344#[serde(rename_all = "camelCase")]
345pub struct GetSmartLeverageProductResult {
346    #[serde(skip_serializing_if = "Option::is_none")]
347    pub category: Option<String>,
348    #[serde(skip_serializing_if = "Option::is_none")]
349    pub list: Option<Vec<SmartLeverageProduct>>,
350}
351
352pub type GetSmartLeverageProductResponse = GetSmartLeverageProductResult;
353
354#[derive(Debug, Clone, Serialize, Deserialize)]
355#[serde(rename_all = "camelCase")]
356pub struct SmartLeverageProductExtraInfo {
357    #[serde(skip_serializing_if = "Option::is_none")]
358    pub category: Option<String>,
359    #[serde(skip_serializing_if = "Option::is_none")]
360    pub product_id: Option<String>,
361    #[serde(skip_serializing_if = "Option::is_none")]
362    pub breakeven_price: Option<String>,
363    #[serde(skip_serializing_if = "Option::is_none")]
364    pub current_price: Option<String>,
365    #[serde(skip_serializing_if = "Option::is_none")]
366    pub expire_at: Option<String>,
367    #[serde(skip_serializing_if = "Option::is_none")]
368    pub max_investment_amount: Option<String>,
369}
370
371pub type GetSmartLeverageProductExtraInfoResponse = SmartLeverageProductExtraInfo;
372
373#[derive(Debug, Clone, Serialize, Deserialize)]
374#[serde(rename_all = "camelCase")]
375pub struct SmartLeveragePosition {
376    #[serde(skip_serializing_if = "Option::is_none")]
377    pub position_id: Option<String>,
378    #[serde(skip_serializing_if = "Option::is_none")]
379    pub product_id: Option<String>,
380    #[serde(skip_serializing_if = "Option::is_none")]
381    pub category: Option<String>,
382    #[serde(skip_serializing_if = "Option::is_none")]
383    pub invest_coin: Option<String>,
384    #[serde(skip_serializing_if = "Option::is_none")]
385    pub underlying_asset: Option<String>,
386    #[serde(skip_serializing_if = "Option::is_none")]
387    pub direction: Option<String>,
388    #[serde(skip_serializing_if = "Option::is_none")]
389    pub leverage: Option<String>,
390    #[serde(skip_serializing_if = "Option::is_none")]
391    pub amount: Option<String>,
392    #[serde(skip_serializing_if = "Option::is_none")]
393    pub breakeven_price: Option<String>,
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub initial_price: Option<String>,
396    #[serde(skip_serializing_if = "Option::is_none")]
397    pub duration: Option<String>,
398    #[serde(skip_serializing_if = "Option::is_none")]
399    pub settlement_time: Option<String>,
400    #[serde(skip_serializing_if = "Option::is_none")]
401    pub created_time: Option<String>,
402    #[serde(skip_serializing_if = "Option::is_none")]
403    pub status: Option<String>,
404    #[serde(skip_serializing_if = "Option::is_none")]
405    pub redeemable: Option<bool>,
406    #[serde(skip_serializing_if = "Option::is_none")]
407    pub account_type: Option<String>,
408    #[serde(skip_serializing_if = "Option::is_none")]
409    pub order_link_id: Option<String>,
410    #[serde(skip_serializing_if = "Option::is_none")]
411    pub order_id: Option<String>,
412}
413
414#[derive(Debug, Clone, Serialize, Deserialize)]
415#[serde(rename_all = "camelCase")]
416pub struct GetSmartLeveragePositionResult {
417    #[serde(skip_serializing_if = "Option::is_none")]
418    pub next_page_cursor: Option<String>,
419    #[serde(skip_serializing_if = "Option::is_none")]
420    pub category: Option<String>,
421    #[serde(skip_serializing_if = "Option::is_none")]
422    pub list: Option<Vec<SmartLeveragePosition>>,
423}
424
425pub type GetSmartLeveragePositionResponse = GetSmartLeveragePositionResult;
426
427#[derive(Debug, Clone, Serialize, Deserialize)]
428#[serde(rename_all = "camelCase")]
429pub struct SmartLeverageOrder {
430    #[serde(skip_serializing_if = "Option::is_none")]
431    pub order_id: Option<String>,
432    #[serde(skip_serializing_if = "Option::is_none")]
433    pub order_link_id: Option<String>,
434    #[serde(skip_serializing_if = "Option::is_none")]
435    pub product_id: Option<String>,
436    #[serde(skip_serializing_if = "Option::is_none")]
437    pub category: Option<String>,
438    #[serde(skip_serializing_if = "Option::is_none")]
439    pub order_type: Option<String>,
440    #[serde(skip_serializing_if = "Option::is_none")]
441    pub invest_coin: Option<String>,
442    #[serde(skip_serializing_if = "Option::is_none")]
443    pub amount: Option<String>,
444    #[serde(skip_serializing_if = "Option::is_none")]
445    pub underlying_asset: Option<String>,
446    #[serde(skip_serializing_if = "Option::is_none")]
447    pub direction: Option<String>,
448    #[serde(skip_serializing_if = "Option::is_none")]
449    pub leverage: Option<String>,
450    #[serde(skip_serializing_if = "Option::is_none")]
451    pub breakeven_price: Option<String>,
452    #[serde(skip_serializing_if = "Option::is_none")]
453    pub initial_price: Option<String>,
454    #[serde(skip_serializing_if = "Option::is_none")]
455    pub settlement_time: Option<String>,
456    #[serde(skip_serializing_if = "Option::is_none")]
457    pub duration: Option<String>,
458    #[serde(skip_serializing_if = "Option::is_none")]
459    pub created_time: Option<String>,
460    #[serde(skip_serializing_if = "Option::is_none")]
461    pub status: Option<String>,
462    #[serde(skip_serializing_if = "Option::is_none")]
463    pub settlement_price: Option<String>,
464    #[serde(skip_serializing_if = "Option::is_none")]
465    pub pnl: Option<String>,
466    #[serde(skip_serializing_if = "Option::is_none")]
467    pub refund_status: Option<String>,
468    #[serde(skip_serializing_if = "Option::is_none")]
469    pub account_type: Option<String>,
470    #[serde(skip_serializing_if = "Option::is_none")]
471    pub to_account_type: Option<String>,
472}
473
474#[derive(Debug, Clone, Serialize, Deserialize)]
475#[serde(rename_all = "camelCase")]
476pub struct GetSmartLeverageOrderResult {
477    #[serde(skip_serializing_if = "Option::is_none")]
478    pub next_page_cursor: Option<String>,
479    #[serde(skip_serializing_if = "Option::is_none")]
480    pub category: Option<String>,
481    #[serde(skip_serializing_if = "Option::is_none")]
482    pub list: Option<Vec<SmartLeverageOrder>>,
483}
484
485pub type GetSmartLeverageOrderResponse = GetSmartLeverageOrderResult;
486
487#[derive(Debug, Clone, Serialize, Deserialize)]
488#[serde(rename_all = "camelCase")]
489pub struct GetRedeemEstAmountListResult {
490    #[serde(skip_serializing_if = "Option::is_none")]
491    pub category: Option<String>,
492    #[serde(skip_serializing_if = "Option::is_none")]
493    pub list: Option<Vec<serde_json::Value>>,
494}
495
496pub type GetRedeemEstAmountListResponse = GetRedeemEstAmountListResult;
497
498#[derive(Debug, Clone, Serialize, Deserialize)]
499#[serde(rename_all = "camelCase")]
500pub struct GetDoubleWinLeverageResult {
501    #[serde(skip_serializing_if = "Option::is_none")]
502    pub product_id: Option<String>,
503    #[serde(skip_serializing_if = "Option::is_none")]
504    pub leverage: Option<String>,
505    #[serde(skip_serializing_if = "Option::is_none")]
506    pub initial_price: Option<String>,
507    #[serde(skip_serializing_if = "Option::is_none")]
508    pub lower_price: Option<String>,
509    #[serde(skip_serializing_if = "Option::is_none")]
510    pub upper_price: Option<String>,
511}
512
513pub type GetDoubleWinLeverageResponse = GetDoubleWinLeverageResult;
514
515#[derive(Debug, Clone, Serialize, Deserialize)]
516#[serde(rename_all = "camelCase")]
517pub struct PlaceTokenOrderParams {
518    pub coin: String,
519    pub order_link_id: String,
520    pub order_type: String,
521    pub amount: String,
522    pub account_type: String,
523}
524
525#[derive(Debug, Clone, Serialize, Deserialize)]
526#[serde(rename_all = "camelCase")]
527pub struct PlaceTokenOrderResult {
528    #[serde(skip_serializing_if = "Option::is_none")]
529    pub order_id: Option<String>,
530    #[serde(skip_serializing_if = "Option::is_none")]
531    pub order_link_id: Option<String>,
532}
533
534pub type PlaceTokenOrderResponse = PlaceTokenOrderResult;
535
536#[derive(Debug, Clone, Serialize, Deserialize)]
537#[serde(rename_all = "camelCase")]
538pub struct TokenOrder {
539    #[serde(skip_serializing_if = "Option::is_none")]
540    pub order_id: Option<String>,
541    #[serde(skip_serializing_if = "Option::is_none")]
542    pub order_link_id: Option<String>,
543    #[serde(skip_serializing_if = "Option::is_none")]
544    pub coin: Option<String>,
545    #[serde(skip_serializing_if = "Option::is_none")]
546    pub order_type: Option<String>,
547    #[serde(skip_serializing_if = "Option::is_none")]
548    pub amount: Option<String>,
549    #[serde(skip_serializing_if = "Option::is_none")]
550    pub account_type: Option<String>,
551    #[serde(skip_serializing_if = "Option::is_none")]
552    pub status: Option<String>,
553    #[serde(skip_serializing_if = "Option::is_none")]
554    pub created_time: Option<String>,
555    #[serde(skip_serializing_if = "Option::is_none")]
556    pub updated_time: Option<String>,
557}
558
559#[derive(Debug, Clone, Serialize, Deserialize)]
560#[serde(rename_all = "camelCase")]
561pub struct TokenOrderListResult {
562    #[serde(skip_serializing_if = "Option::is_none")]
563    pub next_page_cursor: Option<String>,
564    #[serde(skip_serializing_if = "Option::is_none")]
565    pub list: Option<Vec<TokenOrder>>,
566}
567
568pub type TokenOrderListResponse = TokenOrderListResult;
569
570#[derive(Debug, Clone, Serialize, Deserialize)]
571#[serde(rename_all = "camelCase")]
572pub struct TokenProduct {
573    #[serde(skip_serializing_if = "Option::is_none")]
574    pub coin: Option<String>,
575    #[serde(skip_serializing_if = "Option::is_none")]
576    pub status: Option<String>,
577    #[serde(skip_serializing_if = "Option::is_none")]
578    pub apr: Option<String>,
579    #[serde(skip_serializing_if = "Option::is_none")]
580    pub min_purchase_amount: Option<String>,
581    #[serde(skip_serializing_if = "Option::is_none")]
582    pub max_purchase_amount: Option<String>,
583}
584
585pub type TokenProductResponse = TokenProduct;
586
587#[derive(Debug, Clone, Serialize, Deserialize)]
588#[serde(rename_all = "camelCase")]
589pub struct TokenPosition {
590    #[serde(skip_serializing_if = "Option::is_none")]
591    pub coin: Option<String>,
592    #[serde(skip_serializing_if = "Option::is_none")]
593    pub amount: Option<String>,
594    #[serde(skip_serializing_if = "Option::is_none")]
595    pub principal: Option<String>,
596    #[serde(skip_serializing_if = "Option::is_none")]
597    pub yield_amount: Option<String>,
598    #[serde(skip_serializing_if = "Option::is_none")]
599    pub account_type: Option<String>,
600}
601
602pub type TokenPositionResponse = TokenPosition;
603
604#[derive(Debug, Clone, Serialize, Deserialize)]
605#[serde(rename_all = "camelCase")]
606pub struct TokenDailyYield {
607    #[serde(skip_serializing_if = "Option::is_none")]
608    pub coin: Option<String>,
609    #[serde(skip_serializing_if = "Option::is_none")]
610    pub yield_amount: Option<String>,
611    #[serde(skip_serializing_if = "Option::is_none")]
612    pub yield_date: Option<String>,
613}
614
615#[derive(Debug, Clone, Serialize, Deserialize)]
616#[serde(rename_all = "camelCase")]
617pub struct TokenDailyYieldResult {
618    #[serde(skip_serializing_if = "Option::is_none")]
619    pub next_page_cursor: Option<String>,
620    #[serde(skip_serializing_if = "Option::is_none")]
621    pub list: Option<Vec<TokenDailyYield>>,
622}
623
624pub type TokenDailyYieldResponse = TokenDailyYieldResult;
625
626#[derive(Debug, Clone, Serialize, Deserialize)]
627#[serde(rename_all = "camelCase")]
628pub struct TokenHourlyYield {
629    #[serde(skip_serializing_if = "Option::is_none")]
630    pub coin: Option<String>,
631    #[serde(skip_serializing_if = "Option::is_none")]
632    pub yield_amount: Option<String>,
633    #[serde(skip_serializing_if = "Option::is_none")]
634    pub yield_time: Option<String>,
635}
636
637#[derive(Debug, Clone, Serialize, Deserialize)]
638#[serde(rename_all = "camelCase")]
639pub struct TokenHourlyYieldResult {
640    #[serde(skip_serializing_if = "Option::is_none")]
641    pub next_page_cursor: Option<String>,
642    #[serde(skip_serializing_if = "Option::is_none")]
643    pub list: Option<Vec<TokenHourlyYield>>,
644}
645
646pub type TokenHourlyYieldResponse = TokenHourlyYieldResult;
647
648#[derive(Debug, Clone, Serialize, Deserialize)]
649#[serde(rename_all = "camelCase")]
650pub struct TokenAprHistory {
651    #[serde(skip_serializing_if = "Option::is_none")]
652    pub coin: Option<String>,
653    #[serde(skip_serializing_if = "Option::is_none")]
654    pub apr: Option<String>,
655    #[serde(skip_serializing_if = "Option::is_none")]
656    pub apr_date: Option<String>,
657}
658
659#[derive(Debug, Clone, Serialize, Deserialize)]
660#[serde(rename_all = "camelCase")]
661pub struct TokenAprHistoryResult {
662    #[serde(skip_serializing_if = "Option::is_none")]
663    pub list: Option<Vec<TokenAprHistory>>,
664}
665
666pub type TokenAprHistoryResponse = TokenAprHistoryResult;
667
668#[derive(Debug, Clone, Serialize, Deserialize)]
669#[serde(rename_all = "camelCase")]
670pub struct FixedTermProduct {
671    #[serde(skip_serializing_if = "Option::is_none")]
672    pub product_id: Option<String>,
673    #[serde(skip_serializing_if = "Option::is_none")]
674    pub coin: Option<String>,
675    #[serde(skip_serializing_if = "Option::is_none")]
676    pub duration: Option<String>,
677    #[serde(skip_serializing_if = "Option::is_none")]
678    pub apr: Option<String>,
679    #[serde(skip_serializing_if = "Option::is_none")]
680    pub min_purchase_amount: Option<String>,
681    #[serde(skip_serializing_if = "Option::is_none")]
682    pub max_purchase_amount: Option<String>,
683    #[serde(skip_serializing_if = "Option::is_none")]
684    pub status: Option<String>,
685}
686
687#[derive(Debug, Clone, Serialize, Deserialize)]
688#[serde(rename_all = "camelCase")]
689pub struct GetFixedTermProductResult {
690    #[serde(skip_serializing_if = "Option::is_none")]
691    pub list: Option<Vec<FixedTermProduct>>,
692}
693
694pub type GetFixedTermProductResponse = GetFixedTermProductResult;
695
696#[derive(Debug, Clone, Serialize, Deserialize)]
697#[serde(rename_all = "camelCase")]
698pub struct RedeemEstItem {
699    #[serde(skip_serializing_if = "Option::is_none")]
700    pub success: Option<bool>,
701    #[serde(skip_serializing_if = "Option::is_none")]
702    pub position_id: Option<String>,
703    #[serde(skip_serializing_if = "Option::is_none")]
704    pub est_redeem_amount: Option<String>,
705    #[serde(skip_serializing_if = "Option::is_none")]
706    pub est_redeem_time: Option<String>,
707    #[serde(skip_serializing_if = "Option::is_none")]
708    pub slippage_rate: Option<String>,
709}
710
711pub type GetSmartLeverageRedeemEstAmountListResponse = GetRedeemEstAmountListResult;
712
713#[derive(Debug, Clone, Serialize, Deserialize)]
714#[serde(rename_all = "camelCase")]
715pub struct DoubleWinProduct {
716    #[serde(skip_serializing_if = "Option::is_none")]
717    pub category: Option<String>,
718    #[serde(skip_serializing_if = "Option::is_none")]
719    pub product_id: Option<String>,
720    #[serde(skip_serializing_if = "Option::is_none")]
721    pub invest_coin: Option<String>,
722    #[serde(skip_serializing_if = "Option::is_none")]
723    pub underlying_asset: Option<String>,
724    #[serde(skip_serializing_if = "Option::is_none")]
725    pub duration: Option<String>,
726    #[serde(skip_serializing_if = "Option::is_none")]
727    pub expect_receive_at: Option<String>,
728    #[serde(skip_serializing_if = "Option::is_none")]
729    pub subscribe_start_at: Option<String>,
730    #[serde(skip_serializing_if = "Option::is_none")]
731    pub subscribe_end_at: Option<String>,
732    #[serde(skip_serializing_if = "Option::is_none")]
733    pub settlement_time: Option<String>,
734    #[serde(skip_serializing_if = "Option::is_none")]
735    pub min_purchase_amount: Option<String>,
736    #[serde(skip_serializing_if = "Option::is_none")]
737    pub order_precision_digital: Option<i32>,
738    #[serde(skip_serializing_if = "Option::is_none")]
739    pub is_rfq_product: Option<bool>,
740    #[serde(skip_serializing_if = "Option::is_none")]
741    pub lower_price_buffer: Option<String>,
742    #[serde(skip_serializing_if = "Option::is_none")]
743    pub upper_price_buffer: Option<String>,
744    #[serde(skip_serializing_if = "Option::is_none")]
745    pub min_deviation_ratio: Option<String>,
746    #[serde(skip_serializing_if = "Option::is_none")]
747    pub max_deviation_ratio: Option<String>,
748    #[serde(skip_serializing_if = "Option::is_none")]
749    pub price_tick_size: Option<String>,
750}
751
752pub type GetDoubleWinProductResponse = GetDoubleWinProductResult;
753
754#[derive(Debug, Clone, Serialize, Deserialize)]
755#[serde(rename_all = "camelCase")]
756pub struct GetDoubleWinProductResult {
757    #[serde(skip_serializing_if = "Option::is_none")]
758    pub category: Option<String>,
759    #[serde(skip_serializing_if = "Option::is_none")]
760    pub list: Option<Vec<DoubleWinProduct>>,
761}
762
763#[derive(Debug, Clone, Serialize, Deserialize)]
764#[serde(rename_all = "camelCase")]
765pub struct DoubleWinProductExtraInfo {
766    #[serde(skip_serializing_if = "Option::is_none")]
767    pub category: Option<String>,
768    #[serde(skip_serializing_if = "Option::is_none")]
769    pub product_id: Option<String>,
770    #[serde(skip_serializing_if = "Option::is_none")]
771    pub leverage: Option<String>,
772    #[serde(skip_serializing_if = "Option::is_none")]
773    pub current_price: Option<String>,
774    #[serde(skip_serializing_if = "Option::is_none")]
775    pub expire_time: Option<String>,
776    #[serde(skip_serializing_if = "Option::is_none")]
777    pub max_investment_amount: Option<String>,
778}
779
780pub type GetDoubleWinProductExtraInfoResponse = DoubleWinProductExtraInfo;
781
782#[derive(Debug, Clone, Serialize, Deserialize)]
783#[serde(rename_all = "camelCase")]
784pub struct DoubleWinStakeExtra {
785    pub leverage: String,
786    pub initial_price: String,
787    #[serde(skip_serializing_if = "Option::is_none")]
788    pub lower_price: Option<String>,
789    #[serde(skip_serializing_if = "Option::is_none")]
790    pub upper_price: Option<String>,
791}
792
793#[derive(Debug, Clone, Serialize, Deserialize)]
794#[serde(rename_all = "camelCase")]
795pub struct DoubleWinRedeemExtra {
796    pub position_id: String,
797    pub est_redeem_amount: String,
798    #[serde(skip_serializing_if = "Option::is_none")]
799    pub is_slippage_protected: Option<bool>,
800}
801
802#[derive(Debug, Clone, Serialize, Deserialize)]
803#[serde(rename_all = "camelCase")]
804pub struct DoubleWinPosition {
805    #[serde(skip_serializing_if = "Option::is_none")]
806    pub position_id: Option<String>,
807    #[serde(skip_serializing_if = "Option::is_none")]
808    pub product_id: Option<String>,
809    #[serde(skip_serializing_if = "Option::is_none")]
810    pub category: Option<String>,
811    #[serde(skip_serializing_if = "Option::is_none")]
812    pub invest_coin: Option<String>,
813    #[serde(skip_serializing_if = "Option::is_none")]
814    pub underlying_asset: Option<String>,
815    #[serde(skip_serializing_if = "Option::is_none")]
816    pub amount: Option<String>,
817    #[serde(skip_serializing_if = "Option::is_none")]
818    pub leverage: Option<String>,
819    #[serde(skip_serializing_if = "Option::is_none")]
820    pub initial_price: Option<String>,
821    #[serde(skip_serializing_if = "Option::is_none")]
822    pub lower_price: Option<String>,
823    #[serde(skip_serializing_if = "Option::is_none")]
824    pub upper_price: Option<String>,
825    #[serde(skip_serializing_if = "Option::is_none")]
826    pub duration: Option<String>,
827    #[serde(skip_serializing_if = "Option::is_none")]
828    pub settlement_time: Option<String>,
829    #[serde(skip_serializing_if = "Option::is_none")]
830    pub created_time: Option<String>,
831    #[serde(skip_serializing_if = "Option::is_none")]
832    pub status: Option<String>,
833    #[serde(skip_serializing_if = "Option::is_none")]
834    pub redeemable: Option<bool>,
835    #[serde(skip_serializing_if = "Option::is_none")]
836    pub account_type: Option<String>,
837    #[serde(skip_serializing_if = "Option::is_none")]
838    pub order_id: Option<String>,
839}
840
841pub type GetDoubleWinPositionResponse = GetDoubleWinPositionResult;
842
843#[derive(Debug, Clone, Serialize, Deserialize)]
844#[serde(rename_all = "camelCase")]
845pub struct GetDoubleWinPositionResult {
846    #[serde(skip_serializing_if = "Option::is_none")]
847    pub next_page_cursor: Option<String>,
848    #[serde(skip_serializing_if = "Option::is_none")]
849    pub category: Option<String>,
850    #[serde(skip_serializing_if = "Option::is_none")]
851    pub list: Option<Vec<DoubleWinPosition>>,
852}
853
854#[derive(Debug, Clone, Serialize, Deserialize)]
855#[serde(rename_all = "camelCase")]
856pub struct DoubleWinOrder {
857    #[serde(skip_serializing_if = "Option::is_none")]
858    pub order_id: Option<String>,
859    #[serde(skip_serializing_if = "Option::is_none")]
860    pub order_link_id: Option<String>,
861    #[serde(skip_serializing_if = "Option::is_none")]
862    pub product_id: Option<String>,
863    #[serde(skip_serializing_if = "Option::is_none")]
864    pub category: Option<String>,
865    #[serde(skip_serializing_if = "Option::is_none")]
866    pub order_type: Option<String>,
867    #[serde(skip_serializing_if = "Option::is_none")]
868    pub invest_coin: Option<String>,
869    #[serde(skip_serializing_if = "Option::is_none")]
870    pub amount: Option<String>,
871    #[serde(skip_serializing_if = "Option::is_none")]
872    pub underlying_asset: Option<String>,
873    #[serde(skip_serializing_if = "Option::is_none")]
874    pub initial_price: Option<String>,
875    #[serde(skip_serializing_if = "Option::is_none")]
876    pub lower_price: Option<String>,
877    #[serde(skip_serializing_if = "Option::is_none")]
878    pub upper_price: Option<String>,
879    #[serde(skip_serializing_if = "Option::is_none")]
880    pub leverage: Option<String>,
881    #[serde(skip_serializing_if = "Option::is_none")]
882    pub settlement_time: Option<String>,
883    #[serde(skip_serializing_if = "Option::is_none")]
884    pub duration: Option<String>,
885    #[serde(skip_serializing_if = "Option::is_none")]
886    pub created_time: Option<String>,
887    #[serde(skip_serializing_if = "Option::is_none")]
888    pub updated_time: Option<String>,
889    #[serde(skip_serializing_if = "Option::is_none")]
890    pub status: Option<String>,
891    #[serde(skip_serializing_if = "Option::is_none")]
892    pub settlement_price: Option<String>,
893    #[serde(skip_serializing_if = "Option::is_none")]
894    pub pnl: Option<String>,
895    #[serde(skip_serializing_if = "Option::is_none")]
896    pub refund_status: Option<String>,
897    #[serde(skip_serializing_if = "Option::is_none")]
898    pub account_type: Option<String>,
899    #[serde(skip_serializing_if = "Option::is_none")]
900    pub to_account_type: Option<String>,
901}
902
903pub type GetDoubleWinOrderResponse = GetDoubleWinOrderResult;
904
905#[derive(Debug, Clone, Serialize, Deserialize)]
906#[serde(rename_all = "camelCase")]
907pub struct GetDoubleWinOrderResult {
908    #[serde(skip_serializing_if = "Option::is_none")]
909    pub next_page_cursor: Option<String>,
910    #[serde(skip_serializing_if = "Option::is_none")]
911    pub category: Option<String>,
912    #[serde(skip_serializing_if = "Option::is_none")]
913    pub list: Option<Vec<DoubleWinOrder>>,
914}
915
916#[derive(Debug, Clone, Serialize, Deserialize)]
917#[serde(rename_all = "camelCase")]
918pub struct AdvDiscountBuyProduct {
919    #[serde(skip_serializing_if = "Option::is_none")]
920    pub category: Option<String>,
921    #[serde(skip_serializing_if = "Option::is_none")]
922    pub product_id: Option<i64>,
923    #[serde(skip_serializing_if = "Option::is_none")]
924    pub coin: Option<String>,
925    #[serde(skip_serializing_if = "Option::is_none")]
926    pub underlying_asset: Option<String>,
927    #[serde(skip_serializing_if = "Option::is_none")]
928    pub settlement_time: Option<i64>,
929    #[serde(skip_serializing_if = "Option::is_none")]
930    pub duration: Option<String>,
931    #[serde(skip_serializing_if = "Option::is_none")]
932    pub is_vip_product: Option<bool>,
933    #[serde(skip_serializing_if = "Option::is_none")]
934    pub subscribe_start_at: Option<i64>,
935    #[serde(skip_serializing_if = "Option::is_none")]
936    pub subscribe_end_at: Option<i64>,
937    #[serde(skip_serializing_if = "Option::is_none")]
938    pub min_purchase_amount: Option<String>,
939    #[serde(skip_serializing_if = "Option::is_none")]
940    pub remaining_amount: Option<String>,
941    #[serde(skip_serializing_if = "Option::is_none")]
942    pub order_precision_digital: Option<i32>,
943    #[serde(skip_serializing_if = "Option::is_none")]
944    pub expect_receive_at: Option<i64>,
945}
946
947pub type GetDiscountBuyProductResponse = GetDiscountBuyProductResult;
948
949#[derive(Debug, Clone, Serialize, Deserialize)]
950#[serde(rename_all = "camelCase")]
951pub struct GetDiscountBuyProductResult {
952    #[serde(skip_serializing_if = "Option::is_none")]
953    pub category: Option<String>,
954    #[serde(skip_serializing_if = "Option::is_none")]
955    pub list: Option<Vec<AdvDiscountBuyProduct>>,
956}
957
958#[derive(Debug, Clone, Serialize, Deserialize)]
959#[serde(rename_all = "camelCase")]
960pub struct DiscountBuyPriceOfferItem {
961    #[serde(skip_serializing_if = "Option::is_none")]
962    pub category: Option<String>,
963    #[serde(skip_serializing_if = "Option::is_none")]
964    pub product_id: Option<i64>,
965    #[serde(skip_serializing_if = "Option::is_none")]
966    pub current_price: Option<String>,
967    #[serde(skip_serializing_if = "Option::is_none")]
968    pub purchase_price: Option<String>,
969    #[serde(skip_serializing_if = "Option::is_none")]
970    pub knockout_price: Option<String>,
971    #[serde(skip_serializing_if = "Option::is_none")]
972    pub knockout_coupon_e8: Option<i64>,
973    #[serde(skip_serializing_if = "Option::is_none")]
974    pub max_investment_amount: Option<String>,
975    #[serde(skip_serializing_if = "Option::is_none")]
976    pub inst_uid: Option<i64>,
977    #[serde(skip_serializing_if = "Option::is_none")]
978    pub expired_at: Option<i64>,
979}
980
981#[derive(Debug, Clone, Serialize, Deserialize)]
982#[serde(rename_all = "camelCase")]
983pub struct DiscountBuyProductExtraInfo {
984    #[serde(skip_serializing_if = "Option::is_none")]
985    pub offers: Option<Vec<DiscountBuyPriceOfferItem>>,
986}
987
988pub type GetDiscountBuyProductExtraInfoResponse = DiscountBuyProductExtraInfo;
989
990#[derive(Debug, Clone, Serialize, Deserialize)]
991#[serde(rename_all = "camelCase")]
992pub struct DiscountBuyExtra {
993    pub initial_price: String,
994    pub purchase_price: String,
995    pub knockout_price: String,
996    pub knockout_coupon_e8: i64,
997    pub inst_uid: i64,
998    pub settle_type: String,
999}
1000
1001#[derive(Debug, Clone, Serialize, Deserialize)]
1002#[serde(rename_all = "camelCase")]
1003pub struct AdvDiscountBuyPosition {
1004    #[serde(skip_serializing_if = "Option::is_none")]
1005    pub position_id: Option<String>,
1006    #[serde(skip_serializing_if = "Option::is_none")]
1007    pub product_id: Option<i64>,
1008    #[serde(skip_serializing_if = "Option::is_none")]
1009    pub category: Option<String>,
1010    #[serde(skip_serializing_if = "Option::is_none")]
1011    pub coin: Option<String>,
1012    #[serde(skip_serializing_if = "Option::is_none")]
1013    pub underlying_asset: Option<String>,
1014    #[serde(skip_serializing_if = "Option::is_none")]
1015    pub amount: Option<String>,
1016    #[serde(skip_serializing_if = "Option::is_none")]
1017    pub purchase_price: Option<String>,
1018    #[serde(skip_serializing_if = "Option::is_none")]
1019    pub knockout_price: Option<String>,
1020    #[serde(skip_serializing_if = "Option::is_none")]
1021    pub knockout_coupon_e8: Option<i64>,
1022    #[serde(skip_serializing_if = "Option::is_none")]
1023    pub status: Option<String>,
1024    #[serde(skip_serializing_if = "Option::is_none")]
1025    pub order_id: Option<String>,
1026    #[serde(skip_serializing_if = "Option::is_none")]
1027    pub duration: Option<String>,
1028    #[serde(skip_serializing_if = "Option::is_none")]
1029    pub settlement_time: Option<i64>,
1030    #[serde(skip_serializing_if = "Option::is_none")]
1031    pub account_type: Option<String>,
1032    #[serde(skip_serializing_if = "Option::is_none")]
1033    pub to_account_type: Option<String>,
1034    #[serde(skip_serializing_if = "Option::is_none")]
1035    pub settle_type: Option<String>,
1036    #[serde(skip_serializing_if = "Option::is_none")]
1037    pub expect_receive_at: Option<i64>,
1038}
1039
1040pub type GetDiscountBuyPositionResponse = GetDiscountBuyPositionResult;
1041
1042#[derive(Debug, Clone, Serialize, Deserialize)]
1043#[serde(rename_all = "camelCase")]
1044pub struct GetDiscountBuyPositionResult {
1045    #[serde(skip_serializing_if = "Option::is_none")]
1046    pub next_page_cursor: Option<String>,
1047    #[serde(skip_serializing_if = "Option::is_none")]
1048    pub category: Option<String>,
1049    #[serde(skip_serializing_if = "Option::is_none")]
1050    pub list: Option<Vec<AdvDiscountBuyPosition>>,
1051}
1052
1053#[derive(Debug, Clone, Serialize, Deserialize)]
1054#[serde(rename_all = "camelCase")]
1055pub struct AdvDiscountBuyOrder {
1056    #[serde(skip_serializing_if = "Option::is_none")]
1057    pub order_id: Option<String>,
1058    #[serde(skip_serializing_if = "Option::is_none")]
1059    pub order_link_id: Option<String>,
1060    #[serde(skip_serializing_if = "Option::is_none")]
1061    pub product_id: Option<i64>,
1062    #[serde(skip_serializing_if = "Option::is_none")]
1063    pub category: Option<String>,
1064    #[serde(skip_serializing_if = "Option::is_none")]
1065    pub order_type: Option<String>,
1066    #[serde(skip_serializing_if = "Option::is_none")]
1067    pub amount: Option<String>,
1068    #[serde(skip_serializing_if = "Option::is_none")]
1069    pub coin: Option<String>,
1070    #[serde(skip_serializing_if = "Option::is_none")]
1071    pub underlying_asset: Option<String>,
1072    #[serde(skip_serializing_if = "Option::is_none")]
1073    pub status: Option<String>,
1074    #[serde(skip_serializing_if = "Option::is_none")]
1075    pub created_time: Option<String>,
1076    #[serde(skip_serializing_if = "Option::is_none")]
1077    pub purchase_price: Option<String>,
1078    #[serde(skip_serializing_if = "Option::is_none")]
1079    pub knockout_price: Option<String>,
1080    #[serde(skip_serializing_if = "Option::is_none")]
1081    pub knockout_coupon_e8: Option<i64>,
1082    #[serde(skip_serializing_if = "Option::is_none")]
1083    pub duration: Option<String>,
1084    #[serde(skip_serializing_if = "Option::is_none")]
1085    pub settlement_time: Option<i64>,
1086    #[serde(skip_serializing_if = "Option::is_none")]
1087    pub account_type: Option<String>,
1088    #[serde(skip_serializing_if = "Option::is_none")]
1089    pub to_account_type: Option<String>,
1090    #[serde(skip_serializing_if = "Option::is_none")]
1091    pub settlement_price: Option<String>,
1092    #[serde(skip_serializing_if = "Option::is_none")]
1093    pub settlement_coin: Option<String>,
1094    #[serde(skip_serializing_if = "Option::is_none")]
1095    pub settlement_amount: Option<String>,
1096    #[serde(skip_serializing_if = "Option::is_none")]
1097    pub settle_type: Option<String>,
1098    #[serde(skip_serializing_if = "Option::is_none")]
1099    pub is_vip: Option<bool>,
1100    #[serde(skip_serializing_if = "Option::is_none")]
1101    pub refund_status: Option<String>,
1102}
1103
1104pub type GetDiscountBuyOrderResponse = GetDiscountBuyOrderResult;
1105
1106#[derive(Debug, Clone, Serialize, Deserialize)]
1107#[serde(rename_all = "camelCase")]
1108pub struct GetDiscountBuyOrderResult {
1109    #[serde(skip_serializing_if = "Option::is_none")]
1110    pub next_page_cursor: Option<String>,
1111    #[serde(skip_serializing_if = "Option::is_none")]
1112    pub category: Option<String>,
1113    #[serde(skip_serializing_if = "Option::is_none")]
1114    pub list: Option<Vec<AdvDiscountBuyOrder>>,
1115}
1116
1117#[derive(Debug, Clone, Serialize, Deserialize)]
1118#[serde(rename_all = "camelCase")]
1119pub struct PlaceFixedTermOrderParams {
1120    pub product_id: String,
1121    pub category: String,
1122    pub coin: String,
1123    pub amount: String,
1124    pub account_type: String,
1125    pub order_link_id: String,
1126    #[serde(skip_serializing_if = "Option::is_none")]
1127    pub auto_invest: Option<bool>,
1128}
1129
1130pub type PlaceFixedTermOrderResponse = PlaceFixedTermOrderResult;
1131
1132#[derive(Debug, Clone, Serialize, Deserialize)]
1133#[serde(rename_all = "camelCase")]
1134pub struct PlaceFixedTermOrderResult {
1135    #[serde(skip_serializing_if = "Option::is_none")]
1136    pub order_id: Option<String>,
1137    #[serde(skip_serializing_if = "Option::is_none")]
1138    pub order_link_id: Option<String>,
1139}
1140
1141#[derive(Debug, Clone, Serialize, Deserialize)]
1142#[serde(rename_all = "camelCase")]
1143pub struct RedeemFixedTermParams {
1144    pub product_id: String,
1145    pub category: String,
1146    pub position_id: String,
1147}
1148
1149pub type RedeemFixedTermResponse = RedeemFixedTermResult;
1150
1151#[derive(Debug, Clone, Serialize, Deserialize)]
1152#[serde(rename_all = "camelCase")]
1153pub struct RedeemFixedTermResult {
1154    #[serde(skip_serializing_if = "Option::is_none")]
1155    pub position_id: Option<String>,
1156    #[serde(skip_serializing_if = "Option::is_none")]
1157    pub est_redeem_amount: Option<String>,
1158    #[serde(skip_serializing_if = "Option::is_none")]
1159    pub est_redeem_time: Option<String>,
1160}
1161
1162pub type GetFixedTermPositionResponse = GetFixedTermPositionResult;
1163
1164#[derive(Debug, Clone, Serialize, Deserialize)]
1165#[serde(rename_all = "camelCase")]
1166pub struct GetFixedTermPositionResult {
1167    #[serde(skip_serializing_if = "Option::is_none")]
1168    pub list: Option<Vec<FixedTermPosition>>,
1169}
1170
1171#[derive(Debug, Clone, Serialize, Deserialize)]
1172#[serde(rename_all = "camelCase")]
1173pub struct FixedTermPosition {
1174    #[serde(skip_serializing_if = "Option::is_none")]
1175    pub position_id: Option<String>,
1176    #[serde(skip_serializing_if = "Option::is_none")]
1177    pub product_id: Option<String>,
1178    #[serde(skip_serializing_if = "Option::is_none")]
1179    pub category: Option<String>,
1180    #[serde(skip_serializing_if = "Option::is_none")]
1181    pub coin: Option<String>,
1182    #[serde(skip_serializing_if = "Option::is_none")]
1183    pub amount: Option<String>,
1184    #[serde(skip_serializing_if = "Option::is_none")]
1185    pub duration: Option<String>,
1186    #[serde(skip_serializing_if = "Option::is_none")]
1187    pub apy: Option<String>,
1188    #[serde(skip_serializing_if = "Option::is_none")]
1189    pub status: Option<String>,
1190    #[serde(skip_serializing_if = "Option::is_none")]
1191    pub settlement_time: Option<String>,
1192    #[serde(skip_serializing_if = "Option::is_none")]
1193    pub created_time: Option<String>,
1194    #[serde(skip_serializing_if = "Option::is_none")]
1195    pub auto_invest: Option<bool>,
1196}
1197
1198pub type GetFixedTermOrderResponse = GetFixedTermOrderResult;
1199
1200#[derive(Debug, Clone, Serialize, Deserialize)]
1201#[serde(rename_all = "camelCase")]
1202pub struct GetFixedTermOrderResult {
1203    #[serde(skip_serializing_if = "Option::is_none")]
1204    pub next_page_cursor: Option<String>,
1205    #[serde(skip_serializing_if = "Option::is_none")]
1206    pub list: Option<Vec<FixedTermOrder>>,
1207}
1208
1209#[derive(Debug, Clone, Serialize, Deserialize)]
1210#[serde(rename_all = "camelCase")]
1211pub struct FixedTermOrder {
1212    #[serde(skip_serializing_if = "Option::is_none")]
1213    pub order_id: Option<String>,
1214    #[serde(skip_serializing_if = "Option::is_none")]
1215    pub order_link_id: Option<String>,
1216    #[serde(skip_serializing_if = "Option::is_none")]
1217    pub product_id: Option<String>,
1218    #[serde(skip_serializing_if = "Option::is_none")]
1219    pub category: Option<String>,
1220    #[serde(skip_serializing_if = "Option::is_none")]
1221    pub coin: Option<String>,
1222    #[serde(skip_serializing_if = "Option::is_none")]
1223    pub amount: Option<String>,
1224    #[serde(skip_serializing_if = "Option::is_none")]
1225    pub order_type: Option<String>,
1226    #[serde(skip_serializing_if = "Option::is_none")]
1227    pub status: Option<String>,
1228    #[serde(skip_serializing_if = "Option::is_none")]
1229    pub created_time: Option<String>,
1230    #[serde(skip_serializing_if = "Option::is_none")]
1231    pub updated_time: Option<String>,
1232}
1233
1234#[derive(Debug, Clone, Serialize, Deserialize)]
1235#[serde(rename_all = "camelCase")]
1236pub struct SetFixedTermAutoInvestParams {
1237    pub product_id: String,
1238    pub category: String,
1239    pub position_id: String,
1240    pub status: String,
1241}
1242
1243pub type RwaProductListResponse = RwaProductListResult;
1244
1245#[derive(Debug, Clone, Serialize, Deserialize)]
1246#[serde(rename_all = "camelCase")]
1247pub struct RwaProductListResult {
1248    #[serde(skip_serializing_if = "Option::is_none")]
1249    pub list: Option<Vec<RwaProduct>>,
1250}
1251
1252#[derive(Debug, Clone, Serialize, Deserialize)]
1253#[serde(rename_all = "camelCase")]
1254pub struct RwaProduct {
1255    #[serde(skip_serializing_if = "Option::is_none")]
1256    pub product_id: Option<i64>,
1257    #[serde(skip_serializing_if = "Option::is_none")]
1258    pub coin: Option<String>,
1259    #[serde(skip_serializing_if = "Option::is_none")]
1260    pub name: Option<String>,
1261    #[serde(skip_serializing_if = "Option::is_none")]
1262    pub apy: Option<String>,
1263    #[serde(skip_serializing_if = "Option::is_none")]
1264    pub min_stake_amount: Option<String>,
1265    #[serde(skip_serializing_if = "Option::is_none")]
1266    pub status: Option<String>,
1267}
1268
1269#[derive(Debug, Clone, Serialize, Deserialize)]
1270#[serde(rename_all = "camelCase")]
1271pub struct PlaceRwaOrderParams {
1272    pub product_id: i64,
1273    pub order_type: String,
1274    pub coin: String,
1275    #[serde(skip_serializing_if = "Option::is_none")]
1276    pub stake_amount: Option<String>,
1277    #[serde(skip_serializing_if = "Option::is_none")]
1278    pub redeem_shares: Option<String>,
1279    #[serde(skip_serializing_if = "Option::is_none")]
1280    pub account_type: Option<String>,
1281    pub order_link_id: String,
1282}
1283
1284pub type PlaceRwaOrderResponse = PlaceRwaOrderResult;
1285
1286#[derive(Debug, Clone, Serialize, Deserialize)]
1287#[serde(rename_all = "camelCase")]
1288pub struct PlaceRwaOrderResult {
1289    #[serde(skip_serializing_if = "Option::is_none")]
1290    pub order_id: Option<String>,
1291    #[serde(skip_serializing_if = "Option::is_none")]
1292    pub order_link_id: Option<String>,
1293}
1294
1295pub type RwaPositionListResponse = RwaPositionListResult;
1296
1297#[derive(Debug, Clone, Serialize, Deserialize)]
1298#[serde(rename_all = "camelCase")]
1299pub struct RwaPositionListResult {
1300    #[serde(skip_serializing_if = "Option::is_none")]
1301    pub list: Option<Vec<RwaPosition>>,
1302}
1303
1304#[derive(Debug, Clone, Serialize, Deserialize)]
1305#[serde(rename_all = "camelCase")]
1306pub struct RwaPosition {
1307    #[serde(skip_serializing_if = "Option::is_none")]
1308    pub product_id: Option<i64>,
1309    #[serde(skip_serializing_if = "Option::is_none")]
1310    pub coin: Option<String>,
1311    #[serde(skip_serializing_if = "Option::is_none")]
1312    pub shares: Option<String>,
1313    #[serde(skip_serializing_if = "Option::is_none")]
1314    pub stake_amount: Option<String>,
1315    #[serde(skip_serializing_if = "Option::is_none")]
1316    pub nav: Option<String>,
1317    #[serde(skip_serializing_if = "Option::is_none")]
1318    pub status: Option<String>,
1319}
1320
1321pub type RwaOrderListResponse = RwaOrderListResult;
1322
1323#[derive(Debug, Clone, Serialize, Deserialize)]
1324#[serde(rename_all = "camelCase")]
1325pub struct RwaOrderListResult {
1326    #[serde(skip_serializing_if = "Option::is_none")]
1327    pub next_page_cursor: Option<String>,
1328    #[serde(skip_serializing_if = "Option::is_none")]
1329    pub list: Option<Vec<RwaOrder>>,
1330}
1331
1332#[derive(Debug, Clone, Serialize, Deserialize)]
1333#[serde(rename_all = "camelCase")]
1334pub struct RwaOrder {
1335    #[serde(skip_serializing_if = "Option::is_none")]
1336    pub order_id: Option<String>,
1337    #[serde(skip_serializing_if = "Option::is_none")]
1338    pub order_link_id: Option<String>,
1339    #[serde(skip_serializing_if = "Option::is_none")]
1340    pub product_id: Option<i64>,
1341    #[serde(skip_serializing_if = "Option::is_none")]
1342    pub order_type: Option<String>,
1343    #[serde(skip_serializing_if = "Option::is_none")]
1344    pub coin: Option<String>,
1345    #[serde(skip_serializing_if = "Option::is_none")]
1346    pub stake_amount: Option<String>,
1347    #[serde(skip_serializing_if = "Option::is_none")]
1348    pub redeem_shares: Option<String>,
1349    #[serde(skip_serializing_if = "Option::is_none")]
1350    pub status: Option<String>,
1351    #[serde(skip_serializing_if = "Option::is_none")]
1352    pub created_time: Option<String>,
1353    #[serde(skip_serializing_if = "Option::is_none")]
1354    pub updated_time: Option<String>,
1355}
1356
1357pub type RwaNavChartResponse = RwaNavChartResult;
1358
1359#[derive(Debug, Clone, Serialize, Deserialize)]
1360#[serde(rename_all = "camelCase")]
1361pub struct RwaNavChartResult {
1362    #[serde(skip_serializing_if = "Option::is_none")]
1363    pub list: Option<Vec<RwaNavPoint>>,
1364}
1365
1366#[derive(Debug, Clone, Serialize, Deserialize)]
1367#[serde(rename_all = "camelCase")]
1368pub struct RwaNavPoint {
1369    #[serde(skip_serializing_if = "Option::is_none")]
1370    pub time: Option<i64>,
1371    #[serde(skip_serializing_if = "Option::is_none")]
1372    pub nav: Option<String>,
1373}
1374
1375pub type GetProductResponse = GetProductResult;
1376
1377#[derive(Debug, Clone, Serialize, Deserialize)]
1378#[serde(rename_all = "camelCase")]
1379pub struct GetProductResult {
1380    #[serde(skip_serializing_if = "Option::is_none")]
1381    pub category: Option<String>,
1382    #[serde(skip_serializing_if = "Option::is_none")]
1383    pub list: Option<Vec<EarnProduct>>,
1384}
1385
1386#[derive(Debug, Clone, Serialize, Deserialize)]
1387#[serde(rename_all = "camelCase")]
1388pub struct EarnProduct {
1389    #[serde(skip_serializing_if = "Option::is_none")]
1390    pub category: Option<String>,
1391    #[serde(skip_serializing_if = "Option::is_none")]
1392    pub estimate_apr: Option<String>,
1393    #[serde(skip_serializing_if = "Option::is_none")]
1394    pub coin: Option<String>,
1395    #[serde(skip_serializing_if = "Option::is_none")]
1396    pub min_stake_amount: Option<String>,
1397    #[serde(skip_serializing_if = "Option::is_none")]
1398    pub max_stake_amount: Option<String>,
1399    #[serde(skip_serializing_if = "Option::is_none")]
1400    pub precision: Option<String>,
1401    #[serde(skip_serializing_if = "Option::is_none")]
1402    pub product_id: Option<String>,
1403    #[serde(skip_serializing_if = "Option::is_none")]
1404    pub status: Option<String>,
1405}
1406
1407#[derive(Debug, Clone, Serialize, Deserialize)]
1408#[serde(rename_all = "camelCase")]
1409pub struct PlaceEarnOrderParams {
1410    pub category: String,
1411    pub order_type: String,
1412    pub account_type: String,
1413    pub amount: String,
1414    pub coin: String,
1415    pub product_id: String,
1416    pub order_link_id: String,
1417    #[serde(skip_serializing_if = "Option::is_none")]
1418    pub redeem_position_id: Option<String>,
1419    #[serde(skip_serializing_if = "Option::is_none")]
1420    pub to_account_type: Option<String>,
1421    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
1422    // spec did not provide a matching inner type at generation time. Replace
1423    // with a typed struct in a follow-up PR after consulting the V5 docs.
1424    #[serde(skip_serializing_if = "Option::is_none")]
1425    pub interest_card: Option<serde_json::Value>,
1426}
1427
1428pub type PlaceOrderResponse = PlaceOrderResult;
1429
1430#[derive(Debug, Clone, Serialize, Deserialize)]
1431#[serde(rename_all = "camelCase")]
1432pub struct PlaceOrderResult {
1433    #[serde(skip_serializing_if = "Option::is_none")]
1434    pub order_id: Option<String>,
1435    #[serde(skip_serializing_if = "Option::is_none")]
1436    pub order_link_id: Option<String>,
1437}
1438
1439pub type OrderHistoryResponse = OrderHistoryResult;
1440
1441#[derive(Debug, Clone, Serialize, Deserialize)]
1442#[serde(rename_all = "camelCase")]
1443pub struct OrderHistoryResult {
1444    #[serde(skip_serializing_if = "Option::is_none")]
1445    pub next_page_cursor: Option<String>,
1446    #[serde(skip_serializing_if = "Option::is_none")]
1447    pub list: Option<Vec<EarnOrderHistoryItem>>,
1448}
1449
1450#[derive(Debug, Clone, Serialize, Deserialize)]
1451#[serde(rename_all = "camelCase")]
1452pub struct EarnOrderHistoryItem {
1453    #[serde(skip_serializing_if = "Option::is_none")]
1454    pub order_id: Option<String>,
1455    #[serde(skip_serializing_if = "Option::is_none")]
1456    pub order_link_id: Option<String>,
1457    #[serde(skip_serializing_if = "Option::is_none")]
1458    pub category: Option<String>,
1459    #[serde(skip_serializing_if = "Option::is_none")]
1460    pub product_id: Option<String>,
1461    #[serde(skip_serializing_if = "Option::is_none")]
1462    pub coin: Option<String>,
1463    #[serde(skip_serializing_if = "Option::is_none")]
1464    pub amount: Option<String>,
1465    #[serde(skip_serializing_if = "Option::is_none")]
1466    pub order_type: Option<String>,
1467    #[serde(skip_serializing_if = "Option::is_none")]
1468    pub status: Option<String>,
1469    #[serde(skip_serializing_if = "Option::is_none")]
1470    pub created_time: Option<String>,
1471    #[serde(skip_serializing_if = "Option::is_none")]
1472    pub updated_time: Option<String>,
1473}
1474
1475pub type PositionResponse = PositionResult;
1476
1477#[derive(Debug, Clone, Serialize, Deserialize)]
1478#[serde(rename_all = "camelCase")]
1479pub struct PositionResult {
1480    #[serde(skip_serializing_if = "Option::is_none")]
1481    pub list: Option<Vec<EarnPositionItem>>,
1482}
1483
1484#[derive(Debug, Clone, Serialize, Deserialize)]
1485#[serde(rename_all = "camelCase")]
1486pub struct EarnPositionItem {
1487    #[serde(skip_serializing_if = "Option::is_none")]
1488    pub position_id: Option<String>,
1489    #[serde(skip_serializing_if = "Option::is_none")]
1490    pub product_id: Option<String>,
1491    #[serde(skip_serializing_if = "Option::is_none")]
1492    pub category: Option<String>,
1493    #[serde(skip_serializing_if = "Option::is_none")]
1494    pub coin: Option<String>,
1495    #[serde(skip_serializing_if = "Option::is_none")]
1496    pub amount: Option<String>,
1497    #[serde(skip_serializing_if = "Option::is_none")]
1498    pub apr: Option<String>,
1499    #[serde(skip_serializing_if = "Option::is_none")]
1500    pub status: Option<String>,
1501    #[serde(skip_serializing_if = "Option::is_none")]
1502    pub created_time: Option<String>,
1503    #[serde(skip_serializing_if = "Option::is_none")]
1504    pub updated_time: Option<String>,
1505}
1506
1507pub type YieldHistoryResponse = YieldHistoryResult;
1508
1509#[derive(Debug, Clone, Serialize, Deserialize)]
1510#[serde(rename_all = "camelCase")]
1511pub struct YieldHistoryResult {
1512    #[serde(skip_serializing_if = "Option::is_none")]
1513    pub next_page_cursor: Option<String>,
1514    #[serde(skip_serializing_if = "Option::is_none")]
1515    pub list: Option<Vec<YieldHistoryItem>>,
1516}
1517
1518#[derive(Debug, Clone, Serialize, Deserialize)]
1519#[serde(rename_all = "camelCase")]
1520pub struct YieldHistoryItem {
1521    #[serde(skip_serializing_if = "Option::is_none")]
1522    pub category: Option<String>,
1523    #[serde(skip_serializing_if = "Option::is_none")]
1524    pub product_id: Option<String>,
1525    #[serde(skip_serializing_if = "Option::is_none")]
1526    pub coin: Option<String>,
1527    #[serde(skip_serializing_if = "Option::is_none")]
1528    pub yield_amount: Option<String>,
1529    #[serde(skip_serializing_if = "Option::is_none")]
1530    pub yield_time: Option<String>,
1531}
1532
1533#[derive(Debug, Clone, Serialize, Deserialize)]
1534#[serde(rename_all = "camelCase")]
1535pub struct ModifyEarnPositionParams {
1536    pub category: String,
1537    pub product_id: i64,
1538    pub position_id: i64,
1539    pub auto_reinvest: i32,
1540}
1541
1542#[derive(Debug, Clone, Serialize, Deserialize)]
1543#[serde(rename_all = "camelCase")]
1544pub struct AddLiquidityParams {
1545    pub product_id: String,
1546    pub order_link_id: String,
1547    #[serde(skip_serializing_if = "Option::is_none")]
1548    pub quote_account_type: Option<String>,
1549    #[serde(skip_serializing_if = "Option::is_none")]
1550    pub base_account_type: Option<String>,
1551    #[serde(skip_serializing_if = "Option::is_none")]
1552    pub quote_amount: Option<String>,
1553    #[serde(skip_serializing_if = "Option::is_none")]
1554    pub base_amount: Option<String>,
1555    #[serde(skip_serializing_if = "Option::is_none")]
1556    pub leverage: Option<String>,
1557}
1558
1559#[derive(Debug, Clone, Serialize, Deserialize)]
1560#[serde(rename_all = "camelCase")]
1561pub struct RemoveLiquidityParams {
1562    pub product_id: String,
1563    pub order_link_id: String,
1564    pub position_id: String,
1565    #[serde(skip_serializing_if = "Option::is_none")]
1566    pub remove_rate: Option<i32>,
1567    #[serde(skip_serializing_if = "Option::is_none")]
1568    pub remove_type: Option<String>,
1569}
1570
1571#[derive(Debug, Clone, Serialize, Deserialize)]
1572#[serde(rename_all = "camelCase")]
1573pub struct ReinvestLiquidityParams {
1574    pub product_id: String,
1575    pub order_link_id: String,
1576    pub position_id: String,
1577}
1578
1579#[derive(Debug, Clone, Serialize, Deserialize)]
1580#[serde(rename_all = "camelCase")]
1581pub struct ClaimLiquidityInterestParams {
1582    pub product_id: String,
1583}
1584
1585pub type HourlyYieldResponse = HourlyYieldResult;
1586
1587#[derive(Debug, Clone, Serialize, Deserialize)]
1588#[serde(rename_all = "camelCase")]
1589pub struct HourlyYieldResult {
1590    #[serde(default)]
1591    pub list: Vec<HourlyYieldRecord>,
1592    #[serde(skip_serializing_if = "Option::is_none")]
1593    pub next_page_cursor: Option<String>,
1594}
1595
1596#[derive(Debug, Clone, Serialize, Deserialize)]
1597#[serde(rename_all = "camelCase")]
1598pub struct HourlyYieldRecord {
1599    #[serde(default)]
1600    pub effective_amount: String,
1601    #[serde(default, rename = "yield")]
1602    pub yield_: String,
1603    #[serde(default)]
1604    pub reward_type: i32,
1605    #[serde(default)]
1606    pub apr_e8: i64,
1607    #[serde(default)]
1608    pub hourly_date: i64,
1609    #[serde(default)]
1610    pub created_time: i64,
1611}
1612
1613pub type AprHistoryResponse = AprHistoryResult;
1614
1615#[derive(Debug, Clone, Serialize, Deserialize)]
1616#[serde(rename_all = "camelCase")]
1617pub struct AprHistoryResult {
1618    #[serde(default)]
1619    pub list: Vec<AprRecord>,
1620}
1621
1622#[derive(Debug, Clone, Serialize, Deserialize)]
1623#[serde(rename_all = "camelCase")]
1624pub struct AprRecord {
1625    #[serde(default)]
1626    pub timestamp: i64,
1627    #[serde(default)]
1628    pub apr_e8: i64,
1629}
1630
1631pub type ListCouponsResponse = ListCouponsResult;
1632
1633#[derive(Debug, Clone, Serialize, Deserialize)]
1634#[serde(rename_all = "camelCase")]
1635pub struct ListCouponsResult {
1636    #[serde(default)]
1637    pub list: Vec<EarnCoupon>,
1638}
1639
1640#[derive(Debug, Clone, Serialize, Deserialize)]
1641#[serde(rename_all = "camelCase")]
1642pub struct EarnCoupon {
1643    #[serde(default)]
1644    pub coupon_id: String,
1645    #[serde(default)]
1646    pub coupon_type: String,
1647    #[serde(default)]
1648    pub coin: String,
1649    #[serde(default)]
1650    pub amount: String,
1651    #[serde(default)]
1652    pub status: String,
1653    #[serde(default)]
1654    pub start_time: i64,
1655    #[serde(default)]
1656    pub end_time: i64,
1657}
1658
1659pub type GetHoldToEarnProductResponse = GetHoldToEarnProductResult;
1660
1661#[derive(Debug, Clone, Serialize, Deserialize)]
1662#[serde(rename_all = "camelCase")]
1663pub struct GetHoldToEarnProductResult {
1664    #[serde(default)]
1665    pub list: Vec<HoldToEarnProduct>,
1666}
1667
1668#[derive(Debug, Clone, Serialize, Deserialize)]
1669#[serde(rename_all = "camelCase")]
1670pub struct HoldToEarnProduct {
1671    #[serde(default)]
1672    pub product_id: String,
1673    #[serde(default)]
1674    pub coin: String,
1675    #[serde(default)]
1676    pub status: String,
1677    #[serde(default)]
1678    pub min_stake_amount: String,
1679    #[serde(default)]
1680    pub max_stake_amount: String,
1681    #[serde(default)]
1682    pub precision: i32,
1683    #[serde(default)]
1684    pub apy: String,
1685}
1686
1687pub type GetHoldToEarnYieldHistoryResponse = GetHoldToEarnYieldHistoryResult;
1688
1689#[derive(Debug, Clone, Serialize, Deserialize)]
1690#[serde(rename_all = "camelCase")]
1691pub struct GetHoldToEarnYieldHistoryResult {
1692    #[serde(default)]
1693    pub list: Vec<HoldToEarnYieldRecord>,
1694    #[serde(skip_serializing_if = "Option::is_none")]
1695    pub next_page_cursor: Option<String>,
1696}
1697
1698#[derive(Debug, Clone, Serialize, Deserialize)]
1699#[serde(rename_all = "camelCase")]
1700pub struct HoldToEarnYieldRecord {
1701    #[serde(default)]
1702    pub coin: String,
1703    #[serde(default)]
1704    pub amount: String,
1705    #[serde(default, rename = "yield")]
1706    pub yield_: String,
1707    #[serde(default)]
1708    pub status: String,
1709    #[serde(default)]
1710    pub created_time: i64,
1711}
1712
1713pub type GetLMProductsResponse = GetLMProductsResult;
1714
1715#[derive(Debug, Clone, Serialize, Deserialize)]
1716#[serde(rename_all = "camelCase")]
1717pub struct GetLMProductsResult {
1718    #[serde(default)]
1719    pub list: Vec<LMProduct>,
1720}
1721
1722#[derive(Debug, Clone, Serialize, Deserialize)]
1723#[serde(rename_all = "camelCase")]
1724pub struct LMProduct {
1725    #[serde(default)]
1726    pub product_id: String,
1727    #[serde(default)]
1728    pub base_coin: String,
1729    #[serde(default)]
1730    pub quote_coin: String,
1731    #[serde(default)]
1732    pub status: String,
1733    #[serde(default)]
1734    pub min_leverage: String,
1735    #[serde(default)]
1736    pub max_leverage: String,
1737    #[serde(default)]
1738    pub min_quote_amount: String,
1739    #[serde(default)]
1740    pub max_quote_amount: String,
1741    #[serde(default)]
1742    pub min_base_amount: String,
1743    #[serde(default)]
1744    pub max_base_amount: String,
1745    #[serde(default)]
1746    pub apy: String,
1747    #[serde(default)]
1748    pub precision: i32,
1749}
1750
1751pub type LMOrderResponse = LMOrderResult;
1752
1753#[derive(Debug, Clone, Serialize, Deserialize)]
1754#[serde(rename_all = "camelCase")]
1755pub struct LMOrderResult {
1756    #[serde(skip_serializing_if = "Option::is_none")]
1757    pub order_id: Option<String>,
1758    #[serde(skip_serializing_if = "Option::is_none")]
1759    pub order_link_id: Option<String>,
1760}
1761
1762pub type GetLMPositionsResponse = GetLMPositionsResult;
1763
1764#[derive(Debug, Clone, Serialize, Deserialize)]
1765#[serde(rename_all = "camelCase")]
1766pub struct GetLMPositionsResult {
1767    #[serde(default)]
1768    pub list: Vec<LMPosition>,
1769}
1770
1771#[derive(Debug, Clone, Serialize, Deserialize)]
1772#[serde(rename_all = "camelCase")]
1773pub struct LMPosition {
1774    #[serde(default)]
1775    pub position_id: String,
1776    #[serde(default)]
1777    pub product_id: String,
1778    #[serde(default)]
1779    pub base_coin: String,
1780    #[serde(default)]
1781    pub quote_coin: String,
1782    #[serde(default)]
1783    pub base_amount: String,
1784    #[serde(default)]
1785    pub quote_amount: String,
1786    #[serde(default)]
1787    pub leverage: String,
1788    #[serde(default)]
1789    pub margin: String,
1790    #[serde(default)]
1791    pub status: String,
1792    #[serde(default)]
1793    pub created_time: i64,
1794}
1795
1796pub type GetLMOrdersResponse = GetLMOrdersResult;
1797
1798#[derive(Debug, Clone, Serialize, Deserialize)]
1799#[serde(rename_all = "camelCase")]
1800pub struct GetLMOrdersResult {
1801    #[serde(default)]
1802    pub list: Vec<LMOrder>,
1803    #[serde(skip_serializing_if = "Option::is_none")]
1804    pub next_page_cursor: Option<String>,
1805}
1806
1807#[derive(Debug, Clone, Serialize, Deserialize)]
1808#[serde(rename_all = "camelCase")]
1809pub struct LMOrder {
1810    #[serde(default)]
1811    pub order_id: String,
1812    #[serde(default)]
1813    pub order_link_id: String,
1814    #[serde(default)]
1815    pub product_id: String,
1816    #[serde(default)]
1817    pub position_id: String,
1818    #[serde(default)]
1819    pub order_type: String,
1820    #[serde(default)]
1821    pub status: String,
1822    #[serde(default)]
1823    pub base_coin: String,
1824    #[serde(default)]
1825    pub quote_coin: String,
1826    #[serde(default)]
1827    pub base_amount: String,
1828    #[serde(default)]
1829    pub quote_amount: String,
1830    #[serde(default)]
1831    pub leverage: String,
1832    #[serde(default)]
1833    pub created_time: i64,
1834    #[serde(default)]
1835    pub updated_time: i64,
1836}
1837
1838pub type GetLMYieldRecordsResponse = GetLMYieldRecordsResult;
1839
1840#[derive(Debug, Clone, Serialize, Deserialize)]
1841#[serde(rename_all = "camelCase")]
1842pub struct GetLMYieldRecordsResult {
1843    #[serde(default)]
1844    pub list: Vec<LMYieldRecord>,
1845    #[serde(skip_serializing_if = "Option::is_none")]
1846    pub next_page_cursor: Option<String>,
1847}
1848
1849#[derive(Debug, Clone, Serialize, Deserialize)]
1850#[serde(rename_all = "camelCase")]
1851pub struct LMYieldRecord {
1852    #[serde(default)]
1853    pub product_id: String,
1854    #[serde(default)]
1855    pub position_id: String,
1856    #[serde(default)]
1857    pub base_coin: String,
1858    #[serde(default)]
1859    pub quote_coin: String,
1860    #[serde(default)]
1861    pub coin: String,
1862    #[serde(default)]
1863    pub amount: String,
1864    #[serde(default)]
1865    pub status: String,
1866    #[serde(default)]
1867    pub created_time: i64,
1868}
1869
1870pub type GetTokenOrderListResponse = TokenOrderListResult;
1871
1872pub type GetTokenProductResponse = TokenProduct;
1873
1874pub type GetTokenPositionResponse = TokenPosition;
1875
1876#[derive(Debug, Clone, Serialize, Deserialize)]
1877#[serde(rename_all = "camelCase")]
1878pub struct DailyYieldRecord {
1879    #[serde(default, rename = "yield")]
1880    pub yield_: String,
1881    #[serde(default)]
1882    pub bonus_yield: String,
1883    #[serde(default)]
1884    pub status: String,
1885    #[serde(default)]
1886    pub created_time: i64,
1887}
1888
1889pub type GetTokenDailyYieldResponse = TokenDailyYieldResult;
1890
1891pub type GetTokenHourlyYieldResponse = TokenHourlyYieldResult;
1892
1893pub type GetTokenHistoricalAprResponse = TokenAprHistoryResult;
1894
1895#[derive(Debug, Clone, Serialize, Deserialize)]
1896#[serde(rename_all = "camelCase")]
1897pub struct TieredApy {
1898    #[serde(default)]
1899    pub min: String,
1900    #[serde(default)]
1901    pub max: String,
1902    #[serde(default)]
1903    pub apy: String,
1904}
1905
1906#[derive(Debug, Clone, Serialize, Deserialize)]
1907#[serde(rename_all = "camelCase")]
1908pub struct InterestCoinApy {
1909    #[serde(default)]
1910    pub coin: String,
1911    #[serde(default)]
1912    pub apy: String,
1913    #[serde(default)]
1914    pub expect_unit_earning: String,
1915    #[serde(default)]
1916    pub current_price: String,
1917}
1918
1919#[derive(Debug, Clone, Serialize, Deserialize)]
1920#[serde(rename_all = "camelCase")]
1921pub struct PositionInterestCoinApy {
1922    #[serde(default)]
1923    pub coin: String,
1924    #[serde(default)]
1925    pub apy: String,
1926    #[serde(default)]
1927    pub expect_return_earning: String,
1928    #[serde(default)]
1929    pub price: String,
1930}
1931
1932#[derive(Debug, Clone, Serialize, Deserialize)]
1933#[serde(rename_all = "camelCase")]
1934pub struct YieldInfo {
1935    #[serde(default)]
1936    pub coin: String,
1937    #[serde(default)]
1938    pub amount: String,
1939    #[serde(default)]
1940    pub status: String,
1941    #[serde(default)]
1942    pub created_at: i64,
1943    #[serde(default)]
1944    pub apy: String,
1945}
1946
1947#[derive(Debug, Clone, Serialize, Deserialize)]
1948#[serde(rename_all = "camelCase")]
1949pub struct EarlyRedeemInfo {
1950    #[serde(default)]
1951    pub allow_early_redeem: bool,
1952    #[serde(default)]
1953    pub early_redeem_earning: String,
1954    #[serde(default)]
1955    pub return_coin: String,
1956    #[serde(default)]
1957    pub redemption_limit_duration: String,
1958}
1959
1960#[derive(Debug, Clone, Serialize, Deserialize)]
1961#[serde(rename_all = "camelCase")]
1962pub struct PwmInstSettleProfitParams {
1963    pub fund_id: String,
1964    pub req_link_id: String,
1965}
1966
1967#[derive(Debug, Clone, Serialize, Deserialize)]
1968#[serde(rename_all = "camelCase")]
1969pub struct PwmInstCreateFundParams {
1970    pub fund_name: String,
1971    pub coin: String,
1972    pub profit_share_rate: String,
1973    pub management_fee_rate: String,
1974    #[serde(skip_serializing_if = "Option::is_none")]
1975    pub fund_introduction: Option<String>,
1976    pub req_link_id: String,
1977}
1978
1979#[derive(Debug, Clone, Serialize, Deserialize)]
1980#[serde(rename_all = "camelCase")]
1981pub struct PwmInstCreateInvestmentPlanParams {
1982    pub account_uid: String,
1983    pub plan_name: String,
1984    pub plan_type: String,
1985    pub investment_distribution: Vec<InvestmentDistributionItem>,
1986    pub req_link_id: String,
1987}
1988
1989#[derive(Debug, Clone, Serialize, Deserialize)]
1990#[serde(rename_all = "camelCase")]
1991pub struct InvestmentDistributionItem {
1992    #[serde(skip_serializing_if = "Option::is_none")]
1993    pub fund_id: Option<String>,
1994    #[serde(skip_serializing_if = "Option::is_none")]
1995    pub percentage: Option<String>,
1996}
1997
1998#[derive(Debug, Clone, Serialize, Deserialize)]
1999#[serde(rename_all = "camelCase")]
2000pub struct PwmInstManageInvestmentPlanParams {
2001    pub plan_id: String,
2002    #[serde(skip_serializing_if = "Option::is_none")]
2003    pub update_status: Option<String>,
2004    #[serde(skip_serializing_if = "Option::is_none")]
2005    pub update_funds: Option<Vec<InvestmentDistributionItem>>,
2006    pub req_link_id: String,
2007}
2008
2009#[derive(Debug, Clone, Serialize, Deserialize)]
2010#[serde(rename_all = "camelCase")]
2011pub struct PwmInstManageOrderParams {
2012    pub order_id: String,
2013    pub action: String,
2014    pub req_link_id: String,
2015}
2016
2017#[derive(Debug, Clone, Serialize, Deserialize)]
2018#[serde(rename_all = "camelCase")]
2019pub struct PwmInstCreateSubAccountParams {
2020    pub fund_id: String,
2021    pub req_link_id: String,
2022}
2023
2024#[derive(Debug, Clone, Serialize, Deserialize)]
2025#[serde(rename_all = "camelCase")]
2026pub struct PwmFundTransferParams {
2027    pub transfer_id: String,
2028    pub from_user_id: i64,
2029    pub to_user_id: i64,
2030    pub amount: String,
2031    pub coin: String,
2032}
2033
2034pub type GetLMLiquidationRecordsResponse = serde_json::Value;
2035
2036pub type PwmInstListFundsResponse = serde_json::Value;
2037
2038pub type PwmInstSettleProfitResponse = serde_json::Value;
2039
2040pub type PwmInstCreateFundResponse = serde_json::Value;
2041
2042pub type PwmInstCreateInvestmentPlanResponse = serde_json::Value;
2043
2044pub type PwmInstGetInvestmentPlansResponse = serde_json::Value;
2045
2046pub type PwmInstManageInvestmentPlanResponse = serde_json::Value;
2047
2048pub type PwmInstListOrdersResponse = serde_json::Value;
2049
2050pub type PwmInstManageOrderResponse = serde_json::Value;
2051
2052pub type PwmInstCreateSubAccountResponse = serde_json::Value;
2053
2054pub type PwmFundTransferResponse = serde_json::Value;
2055
2056pub type PwmQueryFundTransferResponse = serde_json::Value;
2057
2058pub type PwmListInvestmentPlansResponse = serde_json::Value;
2059
2060pub type PwmGetPlanDetailResponse = serde_json::Value;
2061
2062pub type PwmGetNewPlanDetailResponse = serde_json::Value;
2063
2064#[derive(Debug, Clone, Serialize, Deserialize)]
2065#[serde(rename_all = "camelCase")]
2066pub struct RedeemFixedTermRequest {
2067    pub product_id: String,
2068    pub category: String,
2069    pub position_id: String,
2070}
2071
2072#[derive(Debug, Clone, Serialize, Deserialize)]
2073#[serde(rename_all = "camelCase")]
2074pub struct SetAutoInvestRequest {
2075    pub product_id: String,
2076    pub category: String,
2077    pub position_id: String,
2078    pub status: String,
2079}
2080
2081pub type GetRwaProductListResponse = serde_json::Value;
2082
2083#[derive(Debug, Clone, Serialize, Deserialize)]
2084#[serde(rename_all = "camelCase")]
2085pub struct PlaceRwaOrderRequest {
2086    pub product_id: i64,
2087    pub order_type: String,
2088    pub coin: String,
2089    #[serde(skip_serializing_if = "Option::is_none")]
2090    pub stake_amount: Option<String>,
2091    #[serde(skip_serializing_if = "Option::is_none")]
2092    pub redeem_shares: Option<String>,
2093    #[serde(skip_serializing_if = "Option::is_none")]
2094    pub account_type: Option<String>,
2095    pub order_link_id: String,
2096}
2097
2098pub type GetRwaPositionListResponse = serde_json::Value;
2099
2100pub type GetRwaOrderListResponse = serde_json::Value;
2101
2102pub type GetRwaNavChartResponse = serde_json::Value;
2103
2104pub type GetEarnProductResponse = serde_json::Value;
2105
2106#[derive(Debug, Clone, Serialize, Deserialize)]
2107#[serde(rename_all = "camelCase")]
2108pub struct PlaceOrderRequest {
2109    pub category: String,
2110    pub order_type: String,
2111    pub account_type: String,
2112    pub amount: String,
2113    pub coin: String,
2114    pub product_id: String,
2115    pub order_link_id: String,
2116    #[serde(skip_serializing_if = "Option::is_none")]
2117    pub redeem_position_id: Option<String>,
2118    #[serde(skip_serializing_if = "Option::is_none")]
2119    pub to_account_type: Option<String>,
2120    #[serde(skip_serializing_if = "Option::is_none")]
2121    pub interest_card: Option<InterestCardRef>,
2122}
2123
2124#[derive(Debug, Clone, Serialize, Deserialize)]
2125#[serde(rename_all = "camelCase")]
2126pub struct InterestCardRef {
2127    pub award_id: i64,
2128    pub spec_code: String,
2129}
2130
2131#[derive(Debug, Clone, Serialize, Deserialize)]
2132#[serde(rename_all = "camelCase")]
2133pub struct PwmClaimParams {
2134    pub plan_id: String,
2135    #[serde(skip_serializing_if = "Option::is_none")]
2136    pub to_account_type: Option<String>,
2137    pub order_link_id: String,
2138}
2139
2140pub type PwmClaimResponse = serde_json::Value;
2141
2142pub type PwmAssetTrendResponse = serde_json::Value;
2143
2144pub type PwmFundNavResponse = serde_json::Value;
2145
2146#[derive(Debug, Clone, Serialize, Deserialize)]
2147#[serde(rename_all = "camelCase")]
2148pub struct PwmSubscribeParams {
2149    pub plan_id: String,
2150    #[serde(skip_serializing_if = "Option::is_none")]
2151    pub account_type: Option<String>,
2152    pub order_link_id: String,
2153}
2154
2155pub type PwmSubscribeResponse = serde_json::Value;
2156
2157#[derive(Debug, Clone, Serialize, Deserialize)]
2158#[serde(rename_all = "camelCase")]
2159pub struct PwmInvestMoreParams {
2160    pub plan_id: String,
2161    #[serde(skip_serializing_if = "Option::is_none")]
2162    pub account_type: Option<String>,
2163    pub category: String,
2164    pub product_id: String,
2165    pub amount: String,
2166    pub order_link_id: String,
2167}
2168
2169pub type PwmInvestMoreResponse = serde_json::Value;
2170
2171#[derive(Debug, Clone, Serialize, Deserialize)]
2172#[serde(rename_all = "camelCase")]
2173pub struct PwmRedeemParams {
2174    pub plan_id: String,
2175    pub category: String,
2176    pub product_id: String,
2177    #[serde(skip_serializing_if = "Option::is_none")]
2178    pub shares: Option<String>,
2179    #[serde(skip_serializing_if = "Option::is_none")]
2180    pub amount: Option<String>,
2181    pub order_link_id: String,
2182    #[serde(skip_serializing_if = "Option::is_none")]
2183    pub position_id: Option<i64>,
2184}
2185
2186pub type PwmRedeemResponse = serde_json::Value;
2187
2188pub type PwmListOrderResponse = serde_json::Value;
2189
2190pub type PwmListProductCardsResponse = serde_json::Value;
2191
2192#[derive(Debug, Clone, Serialize, Deserialize)]
2193#[serde(rename_all = "camelCase")]
2194pub struct PwmCreateCustomPlanParams {
2195    #[serde(skip_serializing_if = "Option::is_none")]
2196    pub account_type: Option<String>,
2197    pub products: Vec<serde_json::Value>,
2198    pub order_link_id: String,
2199}
2200
2201pub type PwmCreateCustomPlanResponse = serde_json::Value;
2202
2203pub type PlaceEarnOrderResponse = serde_json::Value;
2204
2205#[derive(Debug, Clone, Serialize, Deserialize)]
2206#[serde(rename_all = "camelCase")]
2207pub struct EarnOrder {
2208    #[serde(skip_serializing_if = "Option::is_none")]
2209    pub coin: Option<String>,
2210    #[serde(skip_serializing_if = "Option::is_none")]
2211    pub order_value: Option<String>,
2212    #[serde(skip_serializing_if = "Option::is_none")]
2213    pub order_type: Option<String>,
2214    #[serde(skip_serializing_if = "Option::is_none")]
2215    pub order_id: Option<String>,
2216    #[serde(skip_serializing_if = "Option::is_none")]
2217    pub order_link_id: Option<String>,
2218    #[serde(skip_serializing_if = "Option::is_none")]
2219    pub status: Option<String>,
2220    #[serde(skip_serializing_if = "Option::is_none")]
2221    pub created_at: Option<String>,
2222    #[serde(skip_serializing_if = "Option::is_none")]
2223    pub updated_at: Option<String>,
2224    #[serde(skip_serializing_if = "Option::is_none")]
2225    pub product_id: Option<String>,
2226    #[serde(skip_serializing_if = "Option::is_none")]
2227    pub swap_order_value: Option<String>,
2228    #[serde(skip_serializing_if = "Option::is_none")]
2229    pub estimate_redeem_time: Option<String>,
2230    #[serde(skip_serializing_if = "Option::is_none")]
2231    pub estimate_stake_time: Option<String>,
2232}
2233
2234pub type GetEarnOrderHistoryResponse = serde_json::Value;
2235
2236#[derive(Debug, Clone, Serialize, Deserialize)]
2237#[serde(rename_all = "camelCase")]
2238pub struct EarnPosition {
2239    #[serde(skip_serializing_if = "Option::is_none")]
2240    pub coin: Option<String>,
2241    #[serde(skip_serializing_if = "Option::is_none")]
2242    pub product_id: Option<String>,
2243    #[serde(skip_serializing_if = "Option::is_none")]
2244    pub amount: Option<String>,
2245    #[serde(skip_serializing_if = "Option::is_none")]
2246    pub total_pnl: Option<String>,
2247    #[serde(skip_serializing_if = "Option::is_none")]
2248    pub claimable_yield: Option<String>,
2249    #[serde(skip_serializing_if = "Option::is_none")]
2250    pub id: Option<String>,
2251    #[serde(skip_serializing_if = "Option::is_none")]
2252    pub status: Option<String>,
2253    #[serde(skip_serializing_if = "Option::is_none")]
2254    pub order_id: Option<String>,
2255    #[serde(skip_serializing_if = "Option::is_none")]
2256    pub estimate_redeem_time: Option<String>,
2257    #[serde(skip_serializing_if = "Option::is_none")]
2258    pub estimate_stake_time: Option<String>,
2259    #[serde(skip_serializing_if = "Option::is_none")]
2260    pub estimate_interest_calculation_time: Option<String>,
2261    #[serde(skip_serializing_if = "Option::is_none")]
2262    pub settlement_time: Option<String>,
2263    #[serde(skip_serializing_if = "Option::is_none")]
2264    pub auto_reinvest: Option<String>,
2265}
2266
2267pub type GetEarnPositionResponse = serde_json::Value;
2268
2269#[derive(Debug, Clone, Serialize, Deserialize)]
2270#[serde(rename_all = "camelCase")]
2271pub struct YieldRecord {
2272    #[serde(skip_serializing_if = "Option::is_none")]
2273    pub product_id: Option<String>,
2274    #[serde(skip_serializing_if = "Option::is_none")]
2275    pub coin: Option<String>,
2276    #[serde(skip_serializing_if = "Option::is_none")]
2277    pub id: Option<String>,
2278    #[serde(skip_serializing_if = "Option::is_none")]
2279    pub amount: Option<String>,
2280    #[serde(skip_serializing_if = "Option::is_none")]
2281    pub yield_type: Option<String>,
2282    #[serde(skip_serializing_if = "Option::is_none")]
2283    pub distribution_mode: Option<String>,
2284    #[serde(skip_serializing_if = "Option::is_none")]
2285    pub effective_staking_amount: Option<String>,
2286    #[serde(skip_serializing_if = "Option::is_none")]
2287    pub order_id: Option<String>,
2288    #[serde(skip_serializing_if = "Option::is_none")]
2289    pub status: Option<String>,
2290    #[serde(skip_serializing_if = "Option::is_none")]
2291    pub created_at: Option<String>,
2292}
2293
2294pub type GetEarnYieldHistoryResponse = serde_json::Value;
2295
2296pub type GetEarnHourlyYieldHistoryResponse = serde_json::Value;
2297
2298#[derive(Debug, Clone, Serialize, Deserialize)]
2299#[serde(rename_all = "camelCase")]
2300pub struct ModifyEarnPositionRequest {
2301    pub category: String,
2302    pub product_id: i64,
2303    pub position_id: i64,
2304    pub auto_reinvest: i32,
2305}
2306
2307pub type GetEarnAprHistoryResponse = serde_json::Value;
2308
2309#[derive(Debug, Clone, Serialize, Deserialize)]
2310#[serde(rename_all = "camelCase")]
2311pub struct AwardCard {
2312    #[serde(skip_serializing_if = "Option::is_none")]
2313    pub award_id: Option<i64>,
2314    #[serde(skip_serializing_if = "Option::is_none")]
2315    pub spec_code: Option<String>,
2316    #[serde(skip_serializing_if = "Option::is_none")]
2317    pub claimed_at: Option<i64>,
2318    #[serde(skip_serializing_if = "Option::is_none")]
2319    pub used_at: Option<i64>,
2320    #[serde(skip_serializing_if = "Option::is_none")]
2321    pub expire_at: Option<i64>,
2322    #[serde(skip_serializing_if = "Option::is_none")]
2323    pub status: Option<String>,
2324    #[serde(skip_serializing_if = "Option::is_none")]
2325    pub amount: Option<String>,
2326    #[serde(skip_serializing_if = "Option::is_none")]
2327    pub limit_pnl_percentage: Option<String>,
2328    #[serde(skip_serializing_if = "Option::is_none")]
2329    pub base_coin: Option<String>,
2330    #[serde(skip_serializing_if = "Option::is_none")]
2331    pub quote_coin: Option<String>,
2332    #[serde(skip_serializing_if = "Option::is_none")]
2333    pub direction: Option<i32>,
2334    #[serde(skip_serializing_if = "Option::is_none")]
2335    pub category: Option<String>,
2336}
2337
2338pub type ListEarnCouponsResponse = serde_json::Value;
2339
2340#[derive(Debug, Clone, Serialize, Deserialize)]
2341#[serde(rename_all = "camelCase")]
2342pub struct HoldToEarnYieldCoin {
2343    #[serde(skip_serializing_if = "Option::is_none")]
2344    pub coin_name: Option<String>,
2345    #[serde(skip_serializing_if = "Option::is_none")]
2346    pub apy: Option<String>,
2347}
2348
2349#[derive(Debug, Clone, Serialize, Deserialize)]
2350#[serde(rename_all = "camelCase")]
2351pub struct AirdropDailyPnl {
2352    #[serde(skip_serializing_if = "Option::is_none")]
2353    pub coin_name: Option<String>,
2354    #[serde(skip_serializing_if = "Option::is_none")]
2355    pub yield_coin_name: Option<String>,
2356    #[serde(skip_serializing_if = "Option::is_none")]
2357    pub effective_amount: Option<String>,
2358    #[serde(skip_serializing_if = "Option::is_none")]
2359    pub pnl: Option<String>,
2360    #[serde(skip_serializing_if = "Option::is_none")]
2361    pub apy: Option<String>,
2362    #[serde(skip_serializing_if = "Option::is_none")]
2363    pub created_at: Option<i64>,
2364}
2365
2366#[derive(Debug, Clone, Serialize, Deserialize)]
2367#[serde(rename_all = "camelCase")]
2368pub struct PaginatedResult {
2369    #[serde(skip_serializing_if = "Option::is_none")]
2370    pub next_page_cursor: Option<String>,
2371}
2372
2373#[derive(Debug, Clone, Serialize, Deserialize)]
2374#[serde(rename_all = "camelCase")]
2375pub struct CoinApy {
2376    #[serde(skip_serializing_if = "Option::is_none")]
2377    pub coin: Option<i64>,
2378    #[serde(rename = "apy_e8", skip_serializing_if = "Option::is_none")]
2379    pub apy_e8: Option<i64>,
2380    #[serde(skip_serializing_if = "Option::is_none")]
2381    pub reward: Option<bool>,
2382}
2383
2384pub type GetLiquidityMiningProductsResponse = serde_json::Value;
2385
2386#[derive(Debug, Clone, Serialize, Deserialize)]
2387#[serde(rename_all = "camelCase")]
2388pub struct AddLiquidityRequest {
2389    pub product_id: String,
2390    pub order_link_id: String,
2391    #[serde(skip_serializing_if = "Option::is_none")]
2392    pub quote_account_type: Option<String>,
2393    #[serde(skip_serializing_if = "Option::is_none")]
2394    pub base_account_type: Option<String>,
2395    #[serde(skip_serializing_if = "Option::is_none")]
2396    pub quote_amount: Option<String>,
2397    #[serde(skip_serializing_if = "Option::is_none")]
2398    pub base_amount: Option<String>,
2399    #[serde(skip_serializing_if = "Option::is_none")]
2400    pub leverage: Option<String>,
2401}
2402
2403#[derive(Debug, Clone, Serialize, Deserialize)]
2404#[serde(rename_all = "camelCase")]
2405pub struct RemoveLiquidityRequest {
2406    pub product_id: String,
2407    pub order_link_id: String,
2408    pub position_id: String,
2409    #[serde(skip_serializing_if = "Option::is_none")]
2410    pub remove_rate: Option<i32>,
2411    #[serde(skip_serializing_if = "Option::is_none")]
2412    pub remove_type: Option<String>,
2413}
2414
2415#[derive(Debug, Clone, Serialize, Deserialize)]
2416#[serde(rename_all = "camelCase")]
2417pub struct ReinvestRequest {
2418    pub product_id: String,
2419    pub order_link_id: String,
2420    pub position_id: String,
2421}
2422
2423#[derive(Debug, Clone, Serialize, Deserialize)]
2424#[serde(rename_all = "camelCase")]
2425pub struct AddMarginRequest {
2426    pub product_id: String,
2427    pub order_link_id: String,
2428    pub position_id: String,
2429    pub amount: String,
2430    pub quote_account_type: String,
2431}
2432
2433pub type AddLiquidityResponse = serde_json::Value;
2434
2435#[derive(Debug, Clone, Serialize, Deserialize)]
2436#[serde(rename_all = "camelCase")]
2437pub struct ClaimInterestRequest {
2438    pub product_id: String,
2439}
2440
2441pub type GetLiquidityMiningPositionsResponse = serde_json::Value;
2442
2443pub type GetLiquidityMiningOrdersResponse = serde_json::Value;
2444
2445pub type GetLiquidityMiningYieldRecordsResponse = serde_json::Value;
2446
2447#[derive(Debug, Clone, Serialize, Deserialize)]
2448#[serde(rename_all = "camelCase")]
2449pub struct LMLiquidationRecord {
2450    #[serde(skip_serializing_if = "Option::is_none")]
2451    pub base_coin: Option<String>,
2452    #[serde(skip_serializing_if = "Option::is_none")]
2453    pub quote_coin: Option<String>,
2454    #[serde(skip_serializing_if = "Option::is_none")]
2455    pub base_amount: Option<String>,
2456    #[serde(skip_serializing_if = "Option::is_none")]
2457    pub quote_amount: Option<String>,
2458    #[serde(skip_serializing_if = "Option::is_none")]
2459    pub liquidation_price: Option<String>,
2460    #[serde(skip_serializing_if = "Option::is_none")]
2461    pub liquidation_time: Option<String>,
2462}
2463
2464pub type GetLiquidityMiningLiquidationRecordsResponse = serde_json::Value;
2465
2466#[derive(Debug, Clone, Serialize, Deserialize)]
2467#[serde(rename_all = "camelCase")]
2468pub struct PwmInstFundInfo {
2469    #[serde(skip_serializing_if = "Option::is_none")]
2470    pub fund_id: Option<String>,
2471    #[serde(skip_serializing_if = "Option::is_none")]
2472    pub fund_name: Option<String>,
2473    #[serde(skip_serializing_if = "Option::is_none")]
2474    pub coin: Option<String>,
2475    #[serde(skip_serializing_if = "Option::is_none")]
2476    pub status: Option<String>,
2477    #[serde(skip_serializing_if = "Option::is_none")]
2478    pub total_equity: Option<String>,
2479    #[serde(skip_serializing_if = "Option::is_none")]
2480    pub total_shares: Option<String>,
2481    #[serde(skip_serializing_if = "Option::is_none")]
2482    pub current_nav: Option<String>,
2483    #[serde(skip_serializing_if = "Option::is_none", rename = "currentAPR")]
2484    pub current_apr: Option<String>,
2485    #[serde(skip_serializing_if = "Option::is_none")]
2486    pub account_uid: Option<String>,
2487    #[serde(skip_serializing_if = "Option::is_none")]
2488    pub sub_account_list: Option<Vec<String>>,
2489    #[serde(skip_serializing_if = "Option::is_none")]
2490    pub profit_share_rate: Option<String>,
2491    #[serde(skip_serializing_if = "Option::is_none")]
2492    pub management_fee_rate: Option<String>,
2493    #[serde(skip_serializing_if = "Option::is_none")]
2494    pub uncollected_profit: Option<String>,
2495    #[serde(skip_serializing_if = "Option::is_none")]
2496    pub collected_profit: Option<String>,
2497    #[serde(skip_serializing_if = "Option::is_none")]
2498    pub total_loan: Option<String>,
2499    #[serde(skip_serializing_if = "Option::is_none")]
2500    pub created_time: Option<String>,
2501}
2502
2503#[derive(Debug, Clone, Serialize, Deserialize)]
2504#[serde(rename_all = "camelCase")]
2505pub struct PwmInstInvestmentDistributionItem {
2506    pub product_id: String,
2507    pub amount: String,
2508}
2509
2510#[derive(Debug, Clone, Serialize, Deserialize)]
2511#[serde(rename_all = "camelCase")]
2512pub struct PwmInstInvestmentDistribution {
2513    #[serde(skip_serializing_if = "Option::is_none")]
2514    pub category: Option<String>,
2515    #[serde(skip_serializing_if = "Option::is_none")]
2516    pub product_id: Option<String>,
2517    #[serde(skip_serializing_if = "Option::is_none")]
2518    pub coin: Option<String>,
2519    #[serde(skip_serializing_if = "Option::is_none")]
2520    pub current_amount: Option<String>,
2521}
2522
2523#[derive(Debug, Clone, Serialize, Deserialize)]
2524#[serde(rename_all = "camelCase")]
2525pub struct PwmInstInvestmentPlanInfo {
2526    #[serde(skip_serializing_if = "Option::is_none")]
2527    pub plan_id: Option<String>,
2528    #[serde(skip_serializing_if = "Option::is_none")]
2529    pub plan_name: Option<String>,
2530    #[serde(skip_serializing_if = "Option::is_none")]
2531    pub plan_type: Option<String>,
2532    #[serde(skip_serializing_if = "Option::is_none")]
2533    pub subscription_uid: Option<String>,
2534    #[serde(skip_serializing_if = "Option::is_none")]
2535    pub status: Option<String>,
2536    #[serde(skip_serializing_if = "Option::is_none")]
2537    pub source: Option<String>,
2538    #[serde(skip_serializing_if = "Option::is_none")]
2539    pub current_asset_usd: Option<String>,
2540    #[serde(skip_serializing_if = "Option::is_none")]
2541    pub accumulate_yield_usd: Option<String>,
2542    #[serde(skip_serializing_if = "Option::is_none")]
2543    pub investment_distribution: Option<Vec<PwmInstInvestmentDistribution>>,
2544    #[serde(skip_serializing_if = "Option::is_none")]
2545    pub created_time: Option<String>,
2546}
2547
2548// `ClaimLiquidityInterestResponse` carries no typed result body — the endpoint
2549// returns only the envelope. After `client.rs::parse_response` unwraps the
2550// envelope, the inner `result` is whatever Bybit returns (often `{}`).
2551pub type ClaimLiquidityInterestResponse = serde_json::Value;
2552
2553#[derive(Debug, Clone, Serialize, Deserialize)]
2554#[serde(rename_all = "camelCase")]
2555pub struct PwmCoinAmount {
2556    #[serde(skip_serializing_if = "Option::is_none")]
2557    pub coin: Option<String>,
2558    #[serde(skip_serializing_if = "Option::is_none")]
2559    pub amount: Option<String>,
2560}
2561
2562#[derive(Debug, Clone, Serialize, Deserialize)]
2563#[serde(rename_all = "camelCase")]
2564pub struct PwmInvestmentDistribution {
2565    #[serde(skip_serializing_if = "Option::is_none")]
2566    pub category: Option<String>,
2567    #[serde(skip_serializing_if = "Option::is_none")]
2568    pub product_id: Option<String>,
2569    #[serde(skip_serializing_if = "Option::is_none")]
2570    pub coin: Option<String>,
2571    #[serde(skip_serializing_if = "Option::is_none")]
2572    pub current_amount: Option<String>,
2573}
2574
2575#[derive(Debug, Clone, Serialize, Deserialize)]
2576#[serde(rename_all = "camelCase")]
2577pub struct PwmPositionItem {
2578    #[serde(skip_serializing_if = "Option::is_none")]
2579    pub category: Option<String>,
2580    #[serde(skip_serializing_if = "Option::is_none")]
2581    pub product_id: Option<String>,
2582    #[serde(skip_serializing_if = "Option::is_none")]
2583    pub coin: Option<String>,
2584    #[serde(skip_serializing_if = "Option::is_none")]
2585    pub current_amount: Option<String>,
2586    #[serde(skip_serializing_if = "Option::is_none")]
2587    pub accumulate_yield: Option<String>,
2588    #[serde(skip_serializing_if = "Option::is_none")]
2589    pub apr: Option<String>,
2590    #[serde(skip_serializing_if = "Option::is_none")]
2591    pub duration: Option<i32>,
2592    #[serde(skip_serializing_if = "Option::is_none")]
2593    pub maturity_time: Option<String>,
2594    #[serde(skip_serializing_if = "Option::is_none")]
2595    pub auto_reinvest: Option<bool>,
2596    #[serde(skip_serializing_if = "Option::is_none")]
2597    pub stake_amount: Option<String>,
2598    #[serde(skip_serializing_if = "Option::is_none")]
2599    pub position_id: Option<i64>,
2600    #[serde(skip_serializing_if = "Option::is_none")]
2601    pub status: Option<String>,
2602}
2603
2604#[derive(Debug, Clone, Serialize, Deserialize)]
2605#[serde(rename_all = "camelCase")]
2606pub struct PwmCategoryPositionGroup {
2607    #[serde(skip_serializing_if = "Option::is_none")]
2608    pub total_investment_usd: Option<String>,
2609    #[serde(skip_serializing_if = "Option::is_none")]
2610    pub accumulate_yield_usd: Option<String>,
2611    #[serde(skip_serializing_if = "Option::is_none")]
2612    pub weighted_avg_apr: Option<String>,
2613    #[serde(skip_serializing_if = "Option::is_none")]
2614    pub items: Option<Vec<PwmPositionItem>>,
2615}
2616
2617#[derive(Debug, Clone, Serialize, Deserialize)]
2618#[serde(rename_all = "camelCase")]
2619pub struct PwmEquityFundPositionItem {
2620    #[serde(skip_serializing_if = "Option::is_none")]
2621    pub category: Option<String>,
2622    #[serde(skip_serializing_if = "Option::is_none")]
2623    pub product_id: Option<String>,
2624    #[serde(skip_serializing_if = "Option::is_none")]
2625    pub fund_name: Option<String>,
2626    #[serde(skip_serializing_if = "Option::is_none")]
2627    pub coin: Option<String>,
2628    #[serde(skip_serializing_if = "Option::is_none")]
2629    pub tags: Option<Vec<String>>,
2630    #[serde(skip_serializing_if = "Option::is_none")]
2631    pub nav: Option<String>,
2632    #[serde(skip_serializing_if = "Option::is_none")]
2633    pub user_shares: Option<String>,
2634    #[serde(skip_serializing_if = "Option::is_none")]
2635    pub share_value: Option<String>,
2636    #[serde(skip_serializing_if = "Option::is_none")]
2637    pub holding_value: Option<String>,
2638    #[serde(skip_serializing_if = "Option::is_none")]
2639    pub accumulate_yield: Option<String>,
2640    #[serde(skip_serializing_if = "Option::is_none")]
2641    pub apr30d: Option<String>,
2642    #[serde(skip_serializing_if = "Option::is_none")]
2643    pub apr_total: Option<String>,
2644    #[serde(skip_serializing_if = "Option::is_none")]
2645    pub sharp_ratio: Option<String>,
2646    #[serde(skip_serializing_if = "Option::is_none")]
2647    pub max_drawdown: Option<String>,
2648    #[serde(skip_serializing_if = "Option::is_none")]
2649    pub created_time: Option<String>,
2650    #[serde(skip_serializing_if = "Option::is_none")]
2651    pub running_days: Option<i32>,
2652    #[serde(skip_serializing_if = "Option::is_none")]
2653    pub position_id: Option<i64>,
2654    #[serde(skip_serializing_if = "Option::is_none")]
2655    pub status: Option<String>,
2656}
2657
2658#[derive(Debug, Clone, Serialize, Deserialize)]
2659#[serde(rename_all = "camelCase")]
2660pub struct PwmEquityFundPositionGroup {
2661    #[serde(skip_serializing_if = "Option::is_none")]
2662    pub total_investment_usd: Option<String>,
2663    #[serde(skip_serializing_if = "Option::is_none")]
2664    pub accumulate_yield_usd: Option<String>,
2665    #[serde(skip_serializing_if = "Option::is_none")]
2666    pub weighted_avg_apr: Option<String>,
2667    #[serde(skip_serializing_if = "Option::is_none")]
2668    pub items: Option<Vec<PwmEquityFundPositionItem>>,
2669}
2670
2671#[derive(Debug, Clone, Serialize, Deserialize)]
2672#[serde(rename_all = "camelCase")]
2673pub struct PwmPlanPositions {
2674    #[serde(skip_serializing_if = "Option::is_none")]
2675    pub multi_coins_earning: Option<PwmCategoryPositionGroup>,
2676    #[serde(skip_serializing_if = "Option::is_none")]
2677    pub fixed_yield: Option<PwmCategoryPositionGroup>,
2678    #[serde(skip_serializing_if = "Option::is_none")]
2679    pub equity_funds: Option<PwmEquityFundPositionGroup>,
2680    #[serde(skip_serializing_if = "Option::is_none")]
2681    pub onchain_earn: Option<PwmCategoryPositionGroup>,
2682    #[serde(skip_serializing_if = "Option::is_none")]
2683    pub funding_account: Option<Vec<PwmCoinAmount>>,
2684}
2685
2686#[derive(Debug, Clone, Serialize, Deserialize)]
2687#[serde(rename_all = "camelCase")]
2688pub struct PwmFundIntroduction {
2689    #[serde(skip_serializing_if = "Option::is_none")]
2690    pub description: Option<String>,
2691    #[serde(skip_serializing_if = "Option::is_none")]
2692    pub historical_yield_rate_max: Option<String>,
2693    #[serde(skip_serializing_if = "Option::is_none")]
2694    pub historical_yield_rate_min: Option<String>,
2695    #[serde(skip_serializing_if = "Option::is_none")]
2696    pub sharp_ratio: Option<String>,
2697    #[serde(skip_serializing_if = "Option::is_none")]
2698    pub max_drawback: Option<String>,
2699    #[serde(skip_serializing_if = "Option::is_none")]
2700    pub lockup_period: Option<String>,
2701}
2702
2703#[derive(Debug, Clone, Serialize, Deserialize)]
2704#[serde(rename_all = "camelCase")]
2705pub struct PwmConfiguredProductItem {
2706    #[serde(skip_serializing_if = "Option::is_none")]
2707    pub category: Option<String>,
2708    #[serde(skip_serializing_if = "Option::is_none")]
2709    pub product_id: Option<String>,
2710    #[serde(skip_serializing_if = "Option::is_none")]
2711    pub fund_name: Option<String>,
2712    #[serde(skip_serializing_if = "Option::is_none")]
2713    pub coin: Option<String>,
2714    #[serde(skip_serializing_if = "Option::is_none")]
2715    pub configured_amount: Option<String>,
2716    #[serde(skip_serializing_if = "Option::is_none")]
2717    pub apr: Option<String>,
2718    #[serde(skip_serializing_if = "Option::is_none")]
2719    pub duration: Option<i32>,
2720    #[serde(skip_serializing_if = "Option::is_none")]
2721    pub tags: Option<Vec<String>>,
2722    #[serde(skip_serializing_if = "Option::is_none")]
2723    pub introduction: Option<PwmFundIntroduction>,
2724}
2725
2726#[derive(Debug, Clone, Serialize, Deserialize)]
2727#[serde(rename_all = "camelCase")]
2728pub struct PwmConfiguredProductGroup {
2729    #[serde(skip_serializing_if = "Option::is_none")]
2730    pub configured_amount_usd: Option<String>,
2731    #[serde(skip_serializing_if = "Option::is_none")]
2732    pub items: Option<Vec<PwmConfiguredProductItem>>,
2733}
2734
2735#[derive(Debug, Clone, Serialize, Deserialize)]
2736#[serde(rename_all = "camelCase")]
2737pub struct PwmNewPlanProducts {
2738    #[serde(skip_serializing_if = "Option::is_none")]
2739    pub multi_coins_earning: Option<PwmConfiguredProductGroup>,
2740    #[serde(skip_serializing_if = "Option::is_none")]
2741    pub fixed_yield: Option<PwmConfiguredProductGroup>,
2742    #[serde(skip_serializing_if = "Option::is_none")]
2743    pub equity_funds: Option<PwmConfiguredProductGroup>,
2744    #[serde(skip_serializing_if = "Option::is_none")]
2745    pub onchain_earn: Option<PwmConfiguredProductGroup>,
2746}
2747
2748#[derive(Debug, Clone, Serialize, Deserialize)]
2749#[serde(rename_all = "camelCase")]
2750pub struct PwmInvestmentPlanSummary {
2751    #[serde(skip_serializing_if = "Option::is_none")]
2752    pub plan_id: Option<String>,
2753    #[serde(skip_serializing_if = "Option::is_none")]
2754    pub plan_name: Option<String>,
2755    #[serde(skip_serializing_if = "Option::is_none")]
2756    pub plan_type: Option<String>,
2757    #[serde(skip_serializing_if = "Option::is_none")]
2758    pub status: Option<String>,
2759    #[serde(skip_serializing_if = "Option::is_none")]
2760    pub source: Option<String>,
2761    #[serde(skip_serializing_if = "Option::is_none")]
2762    pub current_asset_usd: Option<String>,
2763    #[serde(skip_serializing_if = "Option::is_none")]
2764    pub accumulate_yield_usd: Option<String>,
2765    #[serde(skip_serializing_if = "Option::is_none")]
2766    pub investment_distribution: Option<Vec<PwmInvestmentDistribution>>,
2767    #[serde(skip_serializing_if = "Option::is_none")]
2768    pub created_time: Option<String>,
2769}
2770
2771#[derive(Debug, Clone, Serialize, Deserialize)]
2772#[serde(rename_all = "camelCase")]
2773pub struct PwmInstUpdateFundItem {
2774    pub fund_id: String,
2775    pub amount: String,
2776}
2777
2778#[derive(Debug, Clone, Serialize, Deserialize)]
2779#[serde(rename_all = "camelCase")]
2780pub struct PwmInstOrderInfo {
2781    #[serde(skip_serializing_if = "Option::is_none")]
2782    pub order_id: Option<String>,
2783    #[serde(skip_serializing_if = "Option::is_none")]
2784    pub fund_id: Option<String>,
2785    #[serde(skip_serializing_if = "Option::is_none")]
2786    pub fund_name: Option<String>,
2787    #[serde(skip_serializing_if = "Option::is_none")]
2788    pub account_uid: Option<String>,
2789    #[serde(skip_serializing_if = "Option::is_none")]
2790    pub order_type: Option<String>,
2791    #[serde(skip_serializing_if = "Option::is_none")]
2792    pub coin: Option<String>,
2793    #[serde(skip_serializing_if = "Option::is_none")]
2794    pub amount: Option<String>,
2795    #[serde(skip_serializing_if = "Option::is_none")]
2796    pub shares: Option<String>,
2797    #[serde(skip_serializing_if = "Option::is_none")]
2798    pub status: Option<String>,
2799    #[serde(skip_serializing_if = "Option::is_none")]
2800    pub created_time: Option<String>,
2801}
2802
2803#[derive(Debug, Clone, Serialize, Deserialize)]
2804#[serde(rename_all = "camelCase")]
2805pub struct PwmFundTransferRecord {
2806    #[serde(skip_serializing_if = "Option::is_none")]
2807    pub transfer_id: Option<String>,
2808    #[serde(skip_serializing_if = "Option::is_none")]
2809    pub status: Option<String>,
2810    #[serde(skip_serializing_if = "Option::is_none")]
2811    pub from_user_id: Option<i64>,
2812    #[serde(skip_serializing_if = "Option::is_none")]
2813    pub to_user_id: Option<i64>,
2814    #[serde(skip_serializing_if = "Option::is_none")]
2815    pub amount: Option<String>,
2816    #[serde(skip_serializing_if = "Option::is_none")]
2817    pub coin: Option<String>,
2818}
2819
2820pub type PwmQueryFundTransferResultResponse = serde_json::Value;
2821
2822#[derive(Debug, Clone, Serialize, Deserialize)]
2823#[serde(rename_all = "camelCase")]
2824pub struct PwmPlanDetailResult {
2825    #[serde(skip_serializing_if = "Option::is_none")]
2826    pub plan_id: Option<String>,
2827    #[serde(skip_serializing_if = "Option::is_none")]
2828    pub plan_name: Option<String>,
2829    #[serde(skip_serializing_if = "Option::is_none")]
2830    pub plan_type: Option<String>,
2831    #[serde(skip_serializing_if = "Option::is_none")]
2832    pub status: Option<String>,
2833    #[serde(skip_serializing_if = "Option::is_none")]
2834    pub current_asset_usd: Option<String>,
2835    #[serde(skip_serializing_if = "Option::is_none")]
2836    pub accumulate_yield_usd: Option<String>,
2837    #[serde(skip_serializing_if = "Option::is_none")]
2838    pub weighted_avg_apr: Option<String>,
2839    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
2840    // spec did not provide a matching inner type at generation time. Replace
2841    // with a typed struct in a follow-up PR after consulting the V5 docs.
2842    #[serde(skip_serializing_if = "Option::is_none")]
2843    pub current_assets: Option<serde_json::Value>,
2844    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
2845    // spec did not provide a matching inner type at generation time. Replace
2846    // with a typed struct in a follow-up PR after consulting the V5 docs.
2847    #[serde(skip_serializing_if = "Option::is_none")]
2848    pub positions: Option<serde_json::Value>,
2849    #[serde(skip_serializing_if = "Option::is_none")]
2850    pub created_time: Option<String>,
2851}
2852
2853#[derive(Debug, Clone, Serialize, Deserialize)]
2854#[serde(rename_all = "camelCase")]
2855pub struct PwmNewPlanDetailResult {
2856    #[serde(skip_serializing_if = "Option::is_none")]
2857    pub plan_id: Option<String>,
2858    #[serde(skip_serializing_if = "Option::is_none")]
2859    pub plan_name: Option<String>,
2860    #[serde(skip_serializing_if = "Option::is_none")]
2861    pub plan_type: Option<String>,
2862    #[serde(skip_serializing_if = "Option::is_none")]
2863    pub status: Option<String>,
2864    #[serde(skip_serializing_if = "Option::is_none")]
2865    pub source: Option<String>,
2866    #[serde(skip_serializing_if = "Option::is_none")]
2867    pub total_configured_amount_usd: Option<String>,
2868    // FIXME(typed-field): falls back to `serde_json::Value` because the Bybit
2869    // spec did not provide a matching inner type at generation time. Replace
2870    // with a typed struct in a follow-up PR after consulting the V5 docs.
2871    #[serde(skip_serializing_if = "Option::is_none")]
2872    pub products: Option<serde_json::Value>,
2873    #[serde(skip_serializing_if = "Option::is_none")]
2874    pub created_time: Option<String>,
2875}
2876
2877#[derive(Debug, Clone, Serialize, Deserialize)]
2878#[serde(rename_all = "camelCase")]
2879pub struct PwmClaimResult {
2880    #[serde(skip_serializing_if = "Option::is_none")]
2881    pub plan_id: Option<String>,
2882    #[serde(skip_serializing_if = "Option::is_none")]
2883    pub to_account_type: Option<String>,
2884    #[serde(skip_serializing_if = "Option::is_none")]
2885    pub status: Option<String>,
2886    #[serde(skip_serializing_if = "Option::is_none")]
2887    pub created_time: Option<String>,
2888}
2889
2890#[derive(Debug, Clone, Serialize, Deserialize)]
2891#[serde(rename_all = "camelCase")]
2892pub struct PwmAssetDataPoint {
2893    #[serde(skip_serializing_if = "Option::is_none")]
2894    pub date: Option<String>,
2895    #[serde(skip_serializing_if = "Option::is_none")]
2896    pub asset_value_usd: Option<String>,
2897}
2898
2899#[derive(Debug, Clone, Serialize, Deserialize)]
2900#[serde(rename_all = "camelCase")]
2901pub struct PwmAssetTrendResult {
2902    #[serde(skip_serializing_if = "Option::is_none")]
2903    pub plan_id: Option<String>,
2904    #[serde(skip_serializing_if = "Option::is_none")]
2905    pub data_points: Option<Vec<PwmAssetDataPoint>>,
2906}
2907
2908#[derive(Debug, Clone, Serialize, Deserialize)]
2909#[serde(rename_all = "camelCase")]
2910pub struct PwmNavDataPoint {
2911    #[serde(skip_serializing_if = "Option::is_none")]
2912    pub date: Option<String>,
2913    #[serde(skip_serializing_if = "Option::is_none")]
2914    pub nav: Option<String>,
2915}
2916
2917#[derive(Debug, Clone, Serialize, Deserialize)]
2918#[serde(rename_all = "camelCase")]
2919pub struct PwmFundNavResult {
2920    #[serde(skip_serializing_if = "Option::is_none")]
2921    pub fund_id: Option<String>,
2922    #[serde(skip_serializing_if = "Option::is_none")]
2923    pub fund_name: Option<String>,
2924    #[serde(skip_serializing_if = "Option::is_none")]
2925    pub coin: Option<String>,
2926    #[serde(skip_serializing_if = "Option::is_none")]
2927    pub current_nav: Option<String>,
2928    #[serde(skip_serializing_if = "Option::is_none")]
2929    pub data_points: Option<Vec<PwmNavDataPoint>>,
2930}
2931
2932#[derive(Debug, Clone, Serialize, Deserialize)]
2933#[serde(rename_all = "camelCase")]
2934pub struct PwmSubscribeRequest {
2935    pub plan_id: String,
2936    #[serde(skip_serializing_if = "Option::is_none")]
2937    pub account_type: Option<String>,
2938    pub order_link_id: String,
2939}
2940
2941#[derive(Debug, Clone, Serialize, Deserialize)]
2942#[serde(rename_all = "camelCase")]
2943pub struct PwmSubscribeResult {
2944    #[serde(skip_serializing_if = "Option::is_none")]
2945    pub plan_id: Option<String>,
2946    #[serde(skip_serializing_if = "Option::is_none")]
2947    pub status: Option<String>,
2948    #[serde(skip_serializing_if = "Option::is_none")]
2949    pub order_link_id: Option<String>,
2950}
2951
2952#[derive(Debug, Clone, Serialize, Deserialize)]
2953#[serde(rename_all = "camelCase")]
2954pub struct PwmInvestMoreRequest {
2955    pub plan_id: String,
2956    #[serde(skip_serializing_if = "Option::is_none")]
2957    pub account_type: Option<String>,
2958    pub category: String,
2959    pub product_id: String,
2960    pub amount: String,
2961    pub order_link_id: String,
2962}
2963
2964#[derive(Debug, Clone, Serialize, Deserialize)]
2965#[serde(rename_all = "camelCase")]
2966pub struct PwmInvestMoreResult {
2967    #[serde(skip_serializing_if = "Option::is_none")]
2968    pub plan_id: Option<String>,
2969    #[serde(skip_serializing_if = "Option::is_none")]
2970    pub category: Option<String>,
2971    #[serde(skip_serializing_if = "Option::is_none")]
2972    pub product_id: Option<String>,
2973    #[serde(skip_serializing_if = "Option::is_none")]
2974    pub coin: Option<String>,
2975    #[serde(skip_serializing_if = "Option::is_none")]
2976    pub amount: Option<String>,
2977    #[serde(skip_serializing_if = "Option::is_none")]
2978    pub status: Option<String>,
2979    #[serde(skip_serializing_if = "Option::is_none")]
2980    pub order_id: Option<String>,
2981    #[serde(skip_serializing_if = "Option::is_none")]
2982    pub order_link_id: Option<String>,
2983}
2984
2985#[derive(Debug, Clone, Serialize, Deserialize)]
2986#[serde(rename_all = "camelCase")]
2987pub struct PwmRedeemRequest {
2988    pub plan_id: String,
2989    pub category: String,
2990    pub product_id: String,
2991    #[serde(skip_serializing_if = "Option::is_none")]
2992    pub shares: Option<String>,
2993    #[serde(skip_serializing_if = "Option::is_none")]
2994    pub amount: Option<String>,
2995    pub order_link_id: String,
2996    #[serde(skip_serializing_if = "Option::is_none")]
2997    pub position_id: Option<i64>,
2998}
2999
3000#[derive(Debug, Clone, Serialize, Deserialize)]
3001#[serde(rename_all = "camelCase")]
3002pub struct PwmRedeemResult {
3003    #[serde(skip_serializing_if = "Option::is_none")]
3004    pub order_id: Option<String>,
3005    #[serde(skip_serializing_if = "Option::is_none")]
3006    pub plan_id: Option<String>,
3007    #[serde(skip_serializing_if = "Option::is_none")]
3008    pub category: Option<String>,
3009    #[serde(skip_serializing_if = "Option::is_none")]
3010    pub product_id: Option<String>,
3011    #[serde(skip_serializing_if = "Option::is_none")]
3012    pub shares: Option<String>,
3013    #[serde(skip_serializing_if = "Option::is_none")]
3014    pub amount: Option<String>,
3015    #[serde(skip_serializing_if = "Option::is_none")]
3016    pub estimated_amount: Option<String>,
3017    #[serde(skip_serializing_if = "Option::is_none")]
3018    pub coin: Option<String>,
3019    #[serde(skip_serializing_if = "Option::is_none")]
3020    pub status: Option<String>,
3021    #[serde(skip_serializing_if = "Option::is_none")]
3022    pub order_link_id: Option<String>,
3023}
3024
3025#[derive(Debug, Clone, Serialize, Deserialize)]
3026#[serde(rename_all = "camelCase")]
3027pub struct PwmOrderDetail {
3028    #[serde(skip_serializing_if = "Option::is_none")]
3029    pub order_id: Option<String>,
3030    #[serde(skip_serializing_if = "Option::is_none")]
3031    pub plan_id: Option<String>,
3032    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
3033    pub type_: Option<String>,
3034    #[serde(skip_serializing_if = "Option::is_none")]
3035    pub account_type: Option<String>,
3036    #[serde(skip_serializing_if = "Option::is_none")]
3037    pub coin: Option<String>,
3038    #[serde(skip_serializing_if = "Option::is_none")]
3039    pub amount: Option<String>,
3040    #[serde(skip_serializing_if = "Option::is_none")]
3041    pub category: Option<String>,
3042    #[serde(skip_serializing_if = "Option::is_none")]
3043    pub product_id: Option<String>,
3044    #[serde(skip_serializing_if = "Option::is_none")]
3045    pub status: Option<String>,
3046    #[serde(skip_serializing_if = "Option::is_none")]
3047    pub order_time: Option<String>,
3048}
3049
3050#[derive(Debug, Clone, Serialize, Deserialize)]
3051#[serde(rename_all = "camelCase")]
3052pub struct PwmListOrderResult {
3053    #[serde(skip_serializing_if = "Option::is_none")]
3054    pub next_page_cursor: Option<String>,
3055    #[serde(skip_serializing_if = "Option::is_none")]
3056    pub list: Option<Vec<PwmOrderDetail>>,
3057}
3058
3059#[derive(Debug, Clone, Serialize, Deserialize)]
3060#[serde(rename_all = "camelCase")]
3061pub struct PwmProductCard {
3062    #[serde(skip_serializing_if = "Option::is_none")]
3063    pub category: Option<String>,
3064    #[serde(skip_serializing_if = "Option::is_none")]
3065    pub product_id: Option<String>,
3066    #[serde(skip_serializing_if = "Option::is_none")]
3067    pub fund_name: Option<String>,
3068    #[serde(skip_serializing_if = "Option::is_none")]
3069    pub coin: Option<String>,
3070    #[serde(skip_serializing_if = "Option::is_none")]
3071    pub apr: Option<String>,
3072    #[serde(skip_serializing_if = "Option::is_none")]
3073    pub apr_range_low: Option<String>,
3074    #[serde(skip_serializing_if = "Option::is_none")]
3075    pub apr_range_high: Option<String>,
3076    #[serde(skip_serializing_if = "Option::is_none")]
3077    pub tags: Option<Vec<String>>,
3078    #[serde(skip_serializing_if = "Option::is_none")]
3079    pub introduction: Option<String>,
3080    #[serde(skip_serializing_if = "Option::is_none")]
3081    pub aum: Option<String>,
3082    #[serde(skip_serializing_if = "Option::is_none")]
3083    pub min_investment_amount: Option<String>,
3084    #[serde(skip_serializing_if = "Option::is_none")]
3085    pub max_investment_amount: Option<String>,
3086    #[serde(skip_serializing_if = "Option::is_none")]
3087    pub duration: Option<i32>,
3088    #[serde(skip_serializing_if = "Option::is_none")]
3089    pub max_drawdown: Option<String>,
3090    #[serde(skip_serializing_if = "Option::is_none")]
3091    pub sharp_ratio: Option<String>,
3092    #[serde(rename = "estAPR", skip_serializing_if = "Option::is_none")]
3093    pub est_apr: Option<String>,
3094}
3095
3096#[derive(Debug, Clone, Serialize, Deserialize)]
3097#[serde(rename_all = "camelCase")]
3098pub struct PwmProductTypeGroup {
3099    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
3100    pub type_: Option<String>,
3101    #[serde(skip_serializing_if = "Option::is_none")]
3102    pub cards: Option<Vec<PwmProductCard>>,
3103}
3104
3105#[derive(Debug, Clone, Serialize, Deserialize)]
3106#[serde(rename_all = "camelCase")]
3107pub struct PwmListProductCardsResult {
3108    #[serde(skip_serializing_if = "Option::is_none")]
3109    pub products: Option<Vec<PwmProductTypeGroup>>,
3110}
3111
3112#[derive(Debug, Clone, Serialize, Deserialize)]
3113#[serde(rename_all = "camelCase")]
3114pub struct PwmCreateCustomPlanProductItem {
3115    pub category: String,
3116    #[serde(skip_serializing_if = "Option::is_none")]
3117    pub product_id: Option<String>,
3118    #[serde(skip_serializing_if = "Option::is_none")]
3119    pub fund_name: Option<String>,
3120    pub amount: String,
3121}
3122
3123#[derive(Debug, Clone, Serialize, Deserialize)]
3124#[serde(rename_all = "camelCase")]
3125pub struct PwmCreateCustomPlanRequest {
3126    #[serde(skip_serializing_if = "Option::is_none")]
3127    pub account_type: Option<String>,
3128    pub products: Vec<PwmCreateCustomPlanProductItem>,
3129    pub order_link_id: String,
3130}
3131
3132#[derive(Debug, Clone, Serialize, Deserialize)]
3133#[serde(rename_all = "camelCase")]
3134pub struct PwmCreateCustomPlanResult {
3135    #[serde(skip_serializing_if = "Option::is_none")]
3136    pub plan_id: Option<String>,
3137    #[serde(skip_serializing_if = "Option::is_none")]
3138    pub plan_name: Option<String>,
3139    #[serde(skip_serializing_if = "Option::is_none")]
3140    pub status: Option<String>,
3141    #[serde(skip_serializing_if = "Option::is_none")]
3142    pub order_link_id: Option<String>,
3143}
3144
3145#[derive(Debug, Clone, Serialize, Deserialize)]
3146#[serde(rename_all = "camelCase")]
3147pub struct PwmClaimRequest {
3148    pub plan_id: String,
3149    #[serde(skip_serializing_if = "Option::is_none")]
3150    pub to_account_type: Option<String>,
3151    pub order_link_id: String,
3152}