use crate::model::withdrawal::WithdrawalPriority;
use pretty_simple_display::{DebugPretty, DisplaySimple};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum Currency {
Btc,
Eth,
Usdc,
Usdt,
Eurr,
}
impl std::fmt::Display for Currency {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Currency::Btc => write!(f, "BTC"),
Currency::Eth => write!(f, "ETH"),
Currency::Usdc => write!(f, "USDC"),
Currency::Usdt => write!(f, "USDT"),
Currency::Eurr => write!(f, "EURR"),
}
}
}
#[skip_serializing_none]
#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
pub struct CurrencyStruct {
pub currency: String,
pub currency_long: String,
pub decimals: Option<u32>,
pub fee_precision: Option<u32>,
pub min_confirmations: u32,
pub min_withdrawal_fee: f64,
pub withdrawal_fee: f64,
pub withdrawal_priorities: Vec<WithdrawalPriority>,
pub apr: Option<f64>,
pub coin_type: Option<String>,
pub network_fee: Option<f64>,
pub network_currency: Option<String>,
pub in_cross_collateral_pool: Option<bool>,
}
#[skip_serializing_none]
#[derive(DebugPretty, DisplaySimple, Clone, PartialEq, Serialize, Deserialize)]
pub struct CurrencyInfo {
pub coin_type: String,
pub currency: String,
pub currency_long: String,
pub fee_precision: i32,
pub min_confirmations: i32,
pub min_withdrawal_fee: f64,
pub withdrawal_fee: f64,
pub withdrawal_priorities: Vec<WithdrawalPriority>,
pub disabled: Option<bool>,
pub min_deposit_amount: Option<f64>,
pub max_withdrawal_amount: Option<f64>,
}
impl CurrencyInfo {
pub fn new(
coin_type: String,
currency: String,
currency_long: String,
fee_precision: i32,
min_confirmations: i32,
min_withdrawal_fee: f64,
withdrawal_fee: f64,
) -> Self {
Self {
coin_type,
currency,
currency_long,
fee_precision,
min_confirmations,
min_withdrawal_fee,
withdrawal_fee,
withdrawal_priorities: Vec::new(),
disabled: None,
min_deposit_amount: None,
max_withdrawal_amount: None,
}
}
pub fn add_priority(&mut self, priority: WithdrawalPriority) {
self.withdrawal_priorities.push(priority);
}
pub fn with_disabled(mut self, disabled: bool) -> Self {
self.disabled = Some(disabled);
self
}
pub fn with_deposit_limit(mut self, min_amount: f64) -> Self {
self.min_deposit_amount = Some(min_amount);
self
}
pub fn with_withdrawal_limit(mut self, max_amount: f64) -> Self {
self.max_withdrawal_amount = Some(max_amount);
self
}
pub fn is_enabled(&self) -> bool {
!self.disabled.unwrap_or(false)
}
pub fn get_priority(&self, name: &str) -> Option<&WithdrawalPriority> {
self.withdrawal_priorities.iter().find(|p| p.name == name)
}
pub fn highest_priority(&self) -> Option<&WithdrawalPriority> {
self.withdrawal_priorities
.iter()
.max_by(|a, b| a.value.partial_cmp(&b.value).unwrap())
}
pub fn lowest_priority(&self) -> Option<&WithdrawalPriority> {
self.withdrawal_priorities
.iter()
.min_by(|a, b| a.value.partial_cmp(&b.value).unwrap())
}
}
#[derive(DebugPretty, DisplaySimple, Clone, PartialEq, Serialize, Deserialize)]
pub struct CurrencyInfoCollection {
pub currencies: Vec<CurrencyInfo>,
}
impl CurrencyInfoCollection {
pub fn new() -> Self {
Self {
currencies: Vec::new(),
}
}
pub fn add(&mut self, info: CurrencyInfo) {
self.currencies.push(info);
}
pub fn get(&self, currency: String) -> Option<&CurrencyInfo> {
self.currencies.iter().find(|c| c.currency == currency)
}
pub fn enabled(&self) -> Vec<&CurrencyInfo> {
self.currencies.iter().filter(|c| c.is_enabled()).collect()
}
pub fn with_withdrawal(&self) -> Vec<&CurrencyInfo> {
self.currencies
.iter()
.filter(|c| !c.withdrawal_priorities.is_empty())
.collect()
}
}
impl Default for CurrencyInfoCollection {
fn default() -> Self {
Self::new()
}
}
#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
pub struct CurrencyExpirations {
pub future: Option<Vec<String>>,
pub option: Option<Vec<String>>,
}