use crate::markets::perps::meta::PerpAsset;
use crate::markets::perps::table::MarginTable;
pub use crate::trade::LeverageError;
use crate::trade::{MarginMode, Side, TradeError, UpdateIsolatedMargin, UpdateLeverage, checked_leverage};
use crate::utils::{Asset, BadUnits, Dec};
pub fn update_leverage_for(
asset: Asset,
perp: &PerpAsset,
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)
}
pub fn update_leverage(
asset: Asset,
perp: &PerpAsset,
mode: MarginMode,
leverage: u32,
) -> Result<UpdateLeverage, LeverageError> {
checked_leverage(asset, &perp.name, perp.max_leverage, perp.allows_cross(), mode, leverage)
}
pub fn add_margin(asset: Asset, position: Side, usdc: Dec) -> Result<UpdateIsolatedMargin, TradeError> {
match usdc.is_positive() {
true => UpdateIsolatedMargin::new(asset, position, usdc),
false => Err(TradeError::Margin(BadUnits::NotPositive(usdc))),
}
}
pub fn remove_margin(asset: Asset, position: Side, usdc: Dec) -> Result<UpdateIsolatedMargin, TradeError> {
match usdc.is_positive() {
true => UpdateIsolatedMargin::new(asset, position, usdc.negate()),
false => Err(TradeError::Margin(BadUnits::NotPositive(usdc))),
}
}