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