1use rust_decimal::Decimal;
2use serde::{Deserialize, Serialize};
3use strum::{Display, EnumString};
4
5use crate::Blockchain;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct Balance {
10 pub available: Decimal,
11 pub locked: Decimal,
12 pub staked: Decimal,
13}
14
15impl Balance {
16 pub fn total(&self) -> Decimal {
17 self.available + self.locked + self.staked
18 }
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22#[serde(rename_all = "camelCase")]
23pub struct Deposit {
24 pub id: i32,
25 pub to_address: Option<String>,
26 pub from_address: Option<String>,
27 pub confirmation_block_number: Option<i32>,
28 pub identifier: Option<String>,
29 pub source: DepositSource,
30 pub status: DepositStatus,
31 pub subaccount_id: Option<u64>,
32 pub symbol: String,
33 pub quantity: Decimal,
34 pub created_at: chrono::NaiveDateTime,
35}
36
37#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, EnumString, PartialEq, Eq, Hash)]
38#[strum(serialize_all = "camelCase")]
39#[serde(rename_all = "camelCase")]
40pub enum DepositSource {
41 Administrator,
42 Solana,
43 Ethereum,
44 Bitcoin,
45 Nuvei,
46}
47
48#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, EnumString, PartialEq, Eq, Hash)]
49#[strum(serialize_all = "camelCase")]
50#[serde(rename_all = "camelCase")]
51pub enum DepositStatus {
52 Pending,
53 Confirmed,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(rename_all = "camelCase")]
58pub struct DepositAddress {
59 pub address: String,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize, Default)]
63#[serde(rename_all = "camelCase")]
64pub struct RequestWithdrawalPayload {
65 pub address: String,
66 pub blockchain: Blockchain,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub client_id: Option<String>,
69 pub quantity: Decimal,
70 pub symbol: String,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub two_factor_token: Option<String>,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub auto_lend_redeem: Option<bool>,
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub auto_borrow: Option<bool>,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize)]
80#[serde(rename_all = "camelCase")]
81pub struct Withdrawal {
82 pub id: i32,
83 pub blockchain: Blockchain,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub client_id: Option<String>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub identifier: Option<String>,
88 pub quantity: Decimal,
89 pub fee: Decimal,
90 pub symbol: String,
91 pub status: WithdrawalStatus,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub subaccount_id: Option<u64>,
94 pub to_address: String,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub transaction_hash: Option<String>,
97 pub created_at: chrono::NaiveDateTime,
98}
99
100#[derive(Debug, Display, Clone, Copy, Serialize, Deserialize, EnumString, PartialEq, Eq, Hash)]
101#[strum(serialize_all = "camelCase")]
102#[serde(rename_all = "camelCase")]
103pub enum WithdrawalStatus {
104 Pending,
105 Confirmed,
106 Verifying,
107 Void,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
111#[serde(rename_all = "camelCase")]
112pub struct Collateral {
113 pub assets_value: Decimal,
114 pub borrow_liability: Decimal,
115 pub collateral: Vec<CollateralItem>,
116 pub imf: Decimal,
117 pub unsettled_equity: Decimal,
118 pub liabilities_value: Decimal,
119 pub margin_fraction: Option<Decimal>,
120 pub mmf: Decimal,
121 pub net_equity: Decimal,
122 pub net_equity_available: Decimal,
123 pub net_equity_locked: Decimal,
124 pub net_exposure_futures: Decimal,
125 pub pnl_unrealized: Decimal,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
129#[serde(rename_all = "camelCase")]
130pub struct CollateralItem {
131 pub symbol: String,
132 pub asset_mark_price: Decimal,
133 pub total_quantity: Decimal,
134 pub balance_notional: Decimal,
135 pub collateral_weight: Decimal,
136 pub collateral_value: Decimal,
137 pub open_order_quantity: Decimal,
138 pub lend_quantity: Decimal,
139 pub available_quantity: Decimal,
140}