use candid::{CandidType, Deserialize, Nat};
use num_bigint::BigUint;
use serde::Serialize;
use crate::{
AssetAmount, AssetId, CandidAssetAmount, CandidAssetId, CandidMarketId, CandidWalletRegisterId,
MarketId, WalletRegisterId,
};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct SpotMarket {
pub id: MarketId,
pub base_asset_id: AssetId,
pub quote_asset_id: AssetId,
pub trading_settings: SpotMarketTradingSettings,
pub fee: Option<SpotMarketTradingFee>,
pub fee_to: Option<WalletRegisterId>,
}
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct SpotMarketTradingFee {
pub taker_fee: BigUint,
pub maker_fee: BigUint,
pub amm_v2_fee_taking_ratio: BigUint,
pub fee_decimal: u8,
}
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct SpotOrderPriceLimitation {
pub bid_price_rate_cap: BigUint,
pub ask_price_rate_floor: BigUint,
pub rate_decimal: u8,
}
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct SpotMarketTradingSettings {
pub price_max_decimal: u8,
pub volume_max_decimal: u8,
pub min_order_amount: AssetAmount,
pub min_order_volume: AssetAmount,
pub price_limitation: SpotOrderPriceLimitation,
}
#[derive(CandidType, Clone, Debug, Eq, PartialEq, Deserialize)]
pub struct CandidSpotMarketTradingFee {
pub taker_fee: Nat,
pub maker_fee: Nat,
pub amm_v2_fee_taking_ratio: Nat,
pub fee_decimal: u8,
}
#[derive(CandidType, Clone, Debug, Eq, PartialEq, Deserialize)]
pub struct CandidSpotOrderPriceLimitation {
pub bid_price_rate_cap: Nat,
pub ask_price_rate_floor: Nat,
pub rate_decimal: u8,
}
#[derive(CandidType, Clone, Debug, Eq, PartialEq, Deserialize)]
pub struct CandidSpotMarketTradingSettings {
pub price_max_decimal: u8,
pub volume_max_decimal: u8,
pub min_order_amount: CandidAssetAmount,
pub min_order_volume: CandidAssetAmount,
pub price_limitation: CandidSpotOrderPriceLimitation,
}
#[derive(CandidType, Clone, Debug, Eq, PartialEq, Deserialize)]
pub struct CandidSpotMarket {
pub id: CandidMarketId,
pub base_asset_id: CandidAssetId,
pub quote_asset_id: CandidAssetId,
pub trading_settings: CandidSpotMarketTradingSettings,
pub fee: Option<CandidSpotMarketTradingFee>,
pub fee_to: Option<CandidWalletRegisterId>,
}
impl From<CandidSpotMarketTradingFee> for SpotMarketTradingFee {
fn from(candid_market_trading_fee: CandidSpotMarketTradingFee) -> Self {
SpotMarketTradingFee {
taker_fee: candid_market_trading_fee.taker_fee.0,
maker_fee: candid_market_trading_fee.maker_fee.0,
amm_v2_fee_taking_ratio: candid_market_trading_fee.amm_v2_fee_taking_ratio.0,
fee_decimal: candid_market_trading_fee.fee_decimal,
}
}
}
impl From<SpotMarketTradingFee> for CandidSpotMarketTradingFee {
fn from(market_trading_fee: SpotMarketTradingFee) -> Self {
CandidSpotMarketTradingFee {
taker_fee: Nat(market_trading_fee.taker_fee),
maker_fee: Nat(market_trading_fee.maker_fee),
amm_v2_fee_taking_ratio: Nat(market_trading_fee.amm_v2_fee_taking_ratio),
fee_decimal: market_trading_fee.fee_decimal,
}
}
}
impl From<CandidSpotOrderPriceLimitation> for SpotOrderPriceLimitation {
fn from(candid_order_price_limitation: CandidSpotOrderPriceLimitation) -> Self {
SpotOrderPriceLimitation {
bid_price_rate_cap: candid_order_price_limitation.bid_price_rate_cap.0,
ask_price_rate_floor: candid_order_price_limitation.ask_price_rate_floor.0,
rate_decimal: candid_order_price_limitation.rate_decimal,
}
}
}
impl From<SpotOrderPriceLimitation> for CandidSpotOrderPriceLimitation {
fn from(order_price_limitation: SpotOrderPriceLimitation) -> Self {
CandidSpotOrderPriceLimitation {
bid_price_rate_cap: Nat(order_price_limitation.bid_price_rate_cap),
ask_price_rate_floor: Nat(order_price_limitation.ask_price_rate_floor),
rate_decimal: order_price_limitation.rate_decimal,
}
}
}
impl From<CandidSpotMarketTradingSettings> for SpotMarketTradingSettings {
fn from(candid_market_trading_settings: CandidSpotMarketTradingSettings) -> Self {
SpotMarketTradingSettings {
price_max_decimal: candid_market_trading_settings.price_max_decimal,
volume_max_decimal: candid_market_trading_settings.volume_max_decimal,
min_order_amount: candid_market_trading_settings.min_order_amount.0,
min_order_volume: candid_market_trading_settings.min_order_volume.0,
price_limitation: candid_market_trading_settings.price_limitation.into(),
}
}
}
impl From<SpotMarketTradingSettings> for CandidSpotMarketTradingSettings {
fn from(market_trading_settings: SpotMarketTradingSettings) -> Self {
CandidSpotMarketTradingSettings {
price_max_decimal: market_trading_settings.price_max_decimal,
volume_max_decimal: market_trading_settings.volume_max_decimal,
min_order_amount: market_trading_settings.min_order_amount.into(),
min_order_volume: market_trading_settings.min_order_volume.into(),
price_limitation: market_trading_settings.price_limitation.into(),
}
}
}
impl From<CandidSpotMarket> for SpotMarket {
fn from(candid_market: CandidSpotMarket) -> Self {
SpotMarket {
id: candid_market.id.0,
base_asset_id: candid_market.base_asset_id.0,
quote_asset_id: candid_market.quote_asset_id.0,
trading_settings: candid_market.trading_settings.into(),
fee: candid_market.fee.map(|fee| fee.into()),
fee_to: candid_market.fee_to.map(|fee_to| fee_to.0),
}
}
}
impl From<SpotMarket> for CandidSpotMarket {
fn from(market: SpotMarket) -> Self {
CandidSpotMarket {
id: market.id.into(),
base_asset_id: market.base_asset_id.into(),
quote_asset_id: market.quote_asset_id.into(),
trading_settings: market.trading_settings.into(),
fee: market.fee.map(|fee| fee.into()),
fee_to: market.fee_to.map(|fee_to| fee_to.into()),
}
}
}