use crate::markets::dexes::dex::{DexAsset, DexMeta};
pub use crate::trade::{FLAT_TABLES_BELOW, LeverageError, MarginTable, MarginTier};
use crate::trade::{MarginMode, UpdateLeverage, checked_leverage};
use crate::utils::{Asset, Dec};
impl DexMeta {
#[must_use]
pub fn margin_table(&self, id: u32) -> Option<MarginTable> {
MarginTable::by_id(id, &self.margin_tables)
}
#[must_use]
pub fn table_of(&self, perp: &DexAsset) -> Option<MarginTable> {
match perp.margin_table_id {
Some(id) => self.margin_table(id),
None => Some(MarginTable::flat(perp.max_leverage)),
}
}
}
pub fn update_leverage(
asset: Asset,
perp: &DexAsset,
mode: MarginMode,
leverage: u32,
) -> Result<UpdateLeverage, LeverageError> {
checked_leverage(asset, &perp.name, perp.max_leverage, perp.allows_cross(), mode, leverage)
}
pub fn update_leverage_for(
asset: Asset,
perp: &DexAsset,
table: &MarginTable,
mode: MarginMode,
leverage: u32,
notional: Dec,
) -> Result<UpdateLeverage, LeverageError> {
let set = update_leverage(asset, perp, mode, leverage)?;
table.check(&perp.name, leverage, notional)?;
Ok(set)
}