1use serde::{Deserialize, Serialize};
6use serde_repr::{Deserialize_repr, Serialize_repr};
7
8use super::string_or_float;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct SystemStatus {
13 pub status: u32,
15 pub msg: String,
17}
18
19impl SystemStatus {
20 pub fn is_normal(&self) -> bool {
22 self.status == 0
23 }
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase")]
29pub struct CoinNetwork {
30 #[serde(default)]
32 pub address_regex: Option<String>,
33 pub coin: String,
35 #[serde(default)]
37 pub deposit_desc: Option<String>,
38 pub deposit_enable: bool,
40 pub is_default: bool,
42 #[serde(default)]
44 pub memo_regex: Option<String>,
45 pub min_confirm: u32,
47 pub name: String,
49 pub network: String,
51 #[serde(default)]
53 pub special_tips: Option<String>,
54 #[serde(default)]
56 pub un_lock_confirm: Option<u32>,
57 #[serde(default)]
59 pub withdraw_desc: Option<String>,
60 pub withdraw_enable: bool,
62 #[serde(with = "string_or_float")]
64 pub withdraw_fee: f64,
65 #[serde(default, with = "string_or_float_option")]
67 pub withdraw_integer_multiple: Option<f64>,
68 #[serde(with = "string_or_float")]
70 pub withdraw_max: f64,
71 #[serde(with = "string_or_float")]
73 pub withdraw_min: f64,
74 #[serde(default)]
76 pub same_address: Option<bool>,
77 #[serde(default)]
79 pub estimated_arrival_time: Option<u64>,
80 #[serde(default)]
82 pub busy: Option<bool>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct CoinInfo {
89 pub coin: String,
91 pub deposit_all_enable: bool,
93 #[serde(with = "string_or_float")]
95 pub free: f64,
96 #[serde(with = "string_or_float")]
98 pub freeze: f64,
99 #[serde(with = "string_or_float")]
101 pub ipoable: f64,
102 #[serde(with = "string_or_float")]
104 pub ipoing: f64,
105 pub is_legal_money: bool,
107 #[serde(with = "string_or_float")]
109 pub locked: f64,
110 pub name: String,
112 pub network_list: Vec<CoinNetwork>,
114 #[serde(with = "string_or_float")]
116 pub storage: f64,
117 pub trading: bool,
119 pub withdraw_all_enable: bool,
121 #[serde(with = "string_or_float")]
123 pub withdrawing: f64,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128#[serde(rename_all = "camelCase")]
129pub struct DepositAddress {
130 pub address: String,
132 pub coin: String,
134 pub tag: String,
136 #[serde(default)]
138 pub url: Option<String>,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
143#[serde(rename_all = "camelCase")]
144pub struct DepositRecord {
145 #[serde(with = "string_or_float")]
147 pub amount: f64,
148 pub coin: String,
150 pub network: String,
152 pub status: DepositStatus,
154 pub address: String,
156 #[serde(default)]
158 pub address_tag: Option<String>,
159 pub tx_id: String,
161 pub insert_time: u64,
163 #[serde(default)]
165 pub transfer_type: Option<u32>,
166 #[serde(default)]
168 pub confirm_times: Option<String>,
169 #[serde(default)]
171 pub unlock_confirm: Option<u32>,
172 #[serde(default)]
174 pub id: Option<String>,
175}
176
177#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
179#[repr(u8)]
180pub enum DepositStatus {
181 Pending = 0,
183 Success = 1,
185 CreditedCannotWithdraw = 6,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
191#[serde(rename_all = "camelCase")]
192pub struct WithdrawRecord {
193 pub address: String,
195 #[serde(with = "string_or_float")]
197 pub amount: f64,
198 pub apply_time: String,
200 pub coin: String,
202 pub id: String,
204 #[serde(default)]
206 pub withdraw_order_id: Option<String>,
207 pub network: String,
209 #[serde(default)]
211 pub transfer_type: Option<u32>,
212 pub status: WithdrawStatus,
214 #[serde(with = "string_or_float")]
216 pub transaction_fee: f64,
217 #[serde(default)]
219 pub confirm_no: Option<u32>,
220 #[serde(default)]
222 pub info: Option<String>,
223 #[serde(default)]
225 pub tx_id: Option<String>,
226}
227
228#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
230#[repr(u8)]
231pub enum WithdrawStatus {
232 EmailSent = 0,
234 Cancelled = 1,
236 AwaitingApproval = 2,
238 Rejected = 3,
240 Processing = 4,
242 Failure = 5,
244 Completed = 6,
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize)]
250pub struct WithdrawResponse {
251 pub id: String,
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize)]
257#[serde(rename_all = "camelCase")]
258pub struct AssetDetail {
259 #[serde(with = "string_or_float")]
261 pub min_withdraw_amount: f64,
262 pub deposit_status: bool,
264 #[serde(with = "string_or_float")]
266 pub withdraw_fee: f64,
267 pub withdraw_status: bool,
269 #[serde(default)]
271 pub deposit_tip: Option<String>,
272}
273
274#[derive(Debug, Clone, Serialize, Deserialize)]
276#[serde(rename_all = "camelCase")]
277pub struct TradeFee {
278 pub symbol: String,
280 #[serde(with = "string_or_float")]
282 pub maker_commission: f64,
283 #[serde(with = "string_or_float")]
285 pub taker_commission: f64,
286}
287
288#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
290#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
291pub enum UniversalTransferType {
292 MainUmfuture,
294 MainCmfuture,
296 MainMargin,
298 UmfutureMain,
300 UmfutureMargin,
302 CmfutureMain,
304 CmfutureMargin,
306 MarginMain,
308 MarginUmfuture,
310 MarginCmfuture,
312 MainIsolatedMargin,
314 IsolatedMarginMain,
316 IsolatedMarginIsolatedMargin,
318 MainFunding,
320 FundingMain,
322 FundingUmfuture,
324 UmfutureFunding,
326 MarginFunding,
328 FundingMargin,
330 FundingCmfuture,
332 CmfutureFunding,
334}
335
336impl UniversalTransferType {
337 pub fn as_str(self) -> &'static str {
339 match self {
340 Self::MainUmfuture => "MAIN_UMFUTURE",
341 Self::MainCmfuture => "MAIN_CMFUTURE",
342 Self::MainMargin => "MAIN_MARGIN",
343 Self::UmfutureMain => "UMFUTURE_MAIN",
344 Self::UmfutureMargin => "UMFUTURE_MARGIN",
345 Self::CmfutureMain => "CMFUTURE_MAIN",
346 Self::CmfutureMargin => "CMFUTURE_MARGIN",
347 Self::MarginMain => "MARGIN_MAIN",
348 Self::MarginUmfuture => "MARGIN_UMFUTURE",
349 Self::MarginCmfuture => "MARGIN_CMFUTURE",
350 Self::MainIsolatedMargin => "MAIN_ISOLATED_MARGIN",
351 Self::IsolatedMarginMain => "ISOLATED_MARGIN_MAIN",
352 Self::IsolatedMarginIsolatedMargin => "ISOLATED_MARGIN_ISOLATED_MARGIN",
353 Self::MainFunding => "MAIN_FUNDING",
354 Self::FundingMain => "FUNDING_MAIN",
355 Self::FundingUmfuture => "FUNDING_UMFUTURE",
356 Self::UmfutureFunding => "UMFUTURE_FUNDING",
357 Self::MarginFunding => "MARGIN_FUNDING",
358 Self::FundingMargin => "FUNDING_MARGIN",
359 Self::FundingCmfuture => "FUNDING_CMFUTURE",
360 Self::CmfutureFunding => "CMFUTURE_FUNDING",
361 }
362 }
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize)]
367#[serde(rename_all = "camelCase")]
368pub struct TransferResponse {
369 pub tran_id: u64,
371}
372
373#[derive(Debug, Clone, Serialize, Deserialize)]
375#[serde(rename_all = "camelCase")]
376pub struct TransferRecord {
377 pub asset: String,
379 #[serde(with = "string_or_float")]
381 pub amount: f64,
382 #[serde(rename = "type")]
384 pub transfer_type: UniversalTransferType,
385 pub status: String,
387 pub tran_id: u64,
389 pub timestamp: u64,
391}
392
393#[derive(Debug, Clone, Serialize, Deserialize)]
395#[serde(rename_all = "camelCase")]
396pub struct TransferHistory {
397 pub total: u64,
399 pub rows: Vec<TransferRecord>,
401}
402
403#[derive(Debug, Clone, Serialize, Deserialize)]
405#[serde(rename_all = "camelCase")]
406pub struct WalletBalance {
407 pub activate: bool,
409 #[serde(with = "string_or_float")]
411 pub balance: f64,
412 pub wallet_name: String,
414}
415
416#[derive(Debug, Clone, Serialize, Deserialize)]
418#[serde(rename_all = "camelCase")]
419pub struct FundingAsset {
420 pub asset: String,
422 #[serde(with = "string_or_float")]
424 pub free: f64,
425 #[serde(with = "string_or_float")]
427 pub locked: f64,
428 #[serde(with = "string_or_float")]
430 pub freeze: f64,
431 #[serde(with = "string_or_float")]
433 pub withdrawing: f64,
434 #[serde(default, with = "string_or_float_option")]
436 pub btc_valuation: Option<f64>,
437}
438
439#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
441#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
442pub enum AccountSnapshotType {
443 Spot,
445 Margin,
447 Futures,
449}
450
451#[derive(Debug, Clone, Serialize, Deserialize)]
453#[serde(rename_all = "camelCase")]
454pub struct AccountSnapshot {
455 pub code: i32,
457 pub msg: String,
459 pub snapshot_vos: Vec<SnapshotData>,
461}
462
463#[derive(Debug, Clone, Serialize, Deserialize)]
465#[serde(rename_all = "camelCase")]
466pub struct SnapshotData {
467 #[serde(rename = "type")]
469 pub snapshot_type: String,
470 pub update_time: u64,
472 pub data: serde_json::Value,
474}
475
476#[derive(Debug, Clone, Serialize, Deserialize)]
478#[serde(rename_all = "camelCase")]
479pub struct ApiKeyPermissions {
480 pub ip_restrict: bool,
482 pub create_time: u64,
484 pub enable_spot_and_margin_trading: bool,
486 pub enable_withdrawals: bool,
488 pub enable_internal_transfer: bool,
490 pub permits_universal_transfer: bool,
492 pub enable_vanilla_options: bool,
494 pub enable_reading: bool,
496 pub enable_futures: bool,
498 pub enable_margin: bool,
500 #[serde(default)]
502 pub trading_authority_expiration_time: Option<u64>,
503}
504
505#[derive(Debug, Clone, Serialize, Deserialize)]
507#[serde(rename_all = "camelCase")]
508pub struct AccountStatus {
509 pub data: String,
511}
512
513#[derive(Debug, Clone, Serialize, Deserialize)]
515#[serde(rename_all = "camelCase")]
516pub struct ApiTradingStatus {
517 pub data: ApiTradingStatusData,
519}
520
521#[derive(Debug, Clone, Serialize, Deserialize)]
523#[serde(rename_all = "camelCase")]
524pub struct ApiTradingStatusData {
525 pub is_locked: bool,
527 #[serde(default)]
529 pub planned_recover_time: Option<u64>,
530 pub trigger_condition: serde_json::Value,
532 pub update_time: u64,
534}
535
536mod string_or_float_option {
538 use serde::{self, Deserialize, Deserializer, Serializer};
539
540 pub fn serialize<S>(value: &Option<f64>, serializer: S) -> Result<S::Ok, S::Error>
541 where
542 S: Serializer,
543 {
544 match value {
545 Some(v) => serializer.serialize_str(&v.to_string()),
546 None => serializer.serialize_none(),
547 }
548 }
549
550 pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<f64>, D::Error>
551 where
552 D: Deserializer<'de>,
553 {
554 #[derive(Deserialize)]
555 #[serde(untagged)]
556 enum StringOrFloat {
557 String(String),
558 Float(f64),
559 }
560
561 let opt: Option<StringOrFloat> = Option::deserialize(deserializer)?;
562 match opt {
563 Some(StringOrFloat::Float(f)) => Ok(Some(f)),
564 Some(StringOrFloat::String(s)) => {
565 s.parse::<f64>().map(Some).map_err(serde::de::Error::custom)
566 }
567 None => Ok(None),
568 }
569 }
570}