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