diff --git a/programs/drift/src/controller/liquidation.rs b/programs/drift/src/controller/liquidation.rs index d470c4757..2408341b2 100644 --- a/programs/drift/src/controller/liquidation.rs +++ b/programs/drift/src/controller/liquidation.rs @@ -798,7 +798,7 @@ pub fn liquidate_perp_with_fill( perp_market_map, spot_market_map, oracle_map, - MarginContext::liquidation(liquidation_margin_buffer_ratio) + MarginContext::fill_liquidation(liquidation_margin_buffer_ratio) .track_market_margin_requirement(MarketIdentifier::perp(market_index))?, )?; diff --git a/programs/drift/src/math/margin.rs b/programs/drift/src/math/margin.rs index 73415cb58..fb13309b0 100644 --- a/programs/drift/src/math/margin.rs +++ b/programs/drift/src/math/margin.rs @@ -36,6 +36,7 @@ pub enum MarginRequirementType { Initial, Fill, Maintenance, + LiqMaintenance } pub fn calculate_size_premium_liability_weight( diff --git a/programs/drift/src/state/margin_calculation.rs b/programs/drift/src/state/margin_calculation.rs index 4a0c299e4..df556f812 100644 --- a/programs/drift/src/state/margin_calculation.rs +++ b/programs/drift/src/state/margin_calculation.rs @@ -138,7 +138,7 @@ impl MarginContext { self } - pub fn liquidation(margin_buffer: u32) -> Self { + pub fn fill_liquidation(margin_buffer: u32) -> Self { Self { margin_type: MarginRequirementType::Maintenance, mode: MarginCalculationMode::Liquidation { @@ -155,6 +155,23 @@ impl MarginContext { } } + pub fn liquidation(margin_buffer: u32) -> Self { + Self { + margin_type: MarginRequirementType::LiqMaintenance, + mode: MarginCalculationMode::Liquidation { + market_to_track_margin_requirement: None, + }, + margin_buffer: margin_buffer as u128, + strict: false, + ignore_invalid_deposit_oracles: false, + fuel_bonus_numerator: 0, + fuel_bonus: 0, + fuel_perp_delta: None, + fuel_spot_deltas: [(0, 0); 2], + margin_ratio_override: None, + } + } + pub fn track_market_margin_requirement( mut self, market_identifier: MarketIdentifier, diff --git a/programs/drift/src/state/perp_market.rs b/programs/drift/src/state/perp_market.rs index 2135183f2..3166650ad 100644 --- a/programs/drift/src/state/perp_market.rs +++ b/programs/drift/src/state/perp_market.rs @@ -470,6 +470,7 @@ impl PerpMarket { margin_ratio_initial.safe_add(margin_ratio_maintenance)? / 2 } MarginRequirementType::Maintenance => margin_ratio_maintenance, + MarginRequirementType::LiqMaintenance => margin_ratio_maintenance.saturating_sub(margin_ratio_maintenance / 3), }; let size_adj_margin_ratio = calculate_size_premium_liability_weight( @@ -490,7 +491,7 @@ impl PerpMarket { let margin_ratio = (self.high_leverage_margin_ratio_maintenance as u32) .saturating_mul(LIQUIDATION_FEE_TO_MARGIN_PRECISION_RATIO); self.liquidator_fee - .min(margin_ratio.saturating_sub(margin_ratio / 5)) + .min(margin_ratio.saturating_sub(margin_ratio / 3)) } else { self.liquidator_fee } @@ -514,7 +515,7 @@ impl PerpMarket { MarginRequirementType::Initial | MarginRequirementType::Fill => { self.unrealized_pnl_initial_asset_weight } - MarginRequirementType::Maintenance => self.unrealized_pnl_maintenance_asset_weight, + MarginRequirementType::Maintenance | MarginRequirementType::LiqMaintenance => self.unrealized_pnl_maintenance_asset_weight, }; if margin_asset_weight > 0 @@ -559,7 +560,7 @@ impl PerpMarket { 0 } } - MarginRequirementType::Maintenance => self.unrealized_pnl_maintenance_asset_weight, + MarginRequirementType::Maintenance | MarginRequirementType::LiqMaintenance => self.unrealized_pnl_maintenance_asset_weight, } } else { SPOT_WEIGHT_PRECISION diff --git a/programs/drift/src/state/spot_market.rs b/programs/drift/src/state/spot_market.rs index 0f238e96a..bcc9102dd 100644 --- a/programs/drift/src/state/spot_market.rs +++ b/programs/drift/src/state/spot_market.rs @@ -361,6 +361,7 @@ impl SpotMarket { / 2 } MarginRequirementType::Maintenance => self.maintenance_asset_weight, + MarginRequirementType::LiqMaintenance => self.maintenance_asset_weight, }; let size_based_asset_weight = calculate_size_discount_asset_weight( @@ -419,6 +420,8 @@ impl SpotMarket { / 2 } MarginRequirementType::Maintenance => self.maintenance_liability_weight, + MarginRequirementType::LiqMaintenance => self.maintenance_liability_weight, + }; let size_based_liability_weight = calculate_size_premium_liability_weight( @@ -442,6 +445,7 @@ impl SpotMarket { MarginRequirementType::Initial => self.initial_liability_weight, MarginRequirementType::Fill => return Err(ErrorCode::DefaultError), MarginRequirementType::Maintenance => self.maintenance_liability_weight, + MarginRequirementType::LiqMaintenance => self.maintenance_liability_weight, }; liability_weight.safe_sub(MARGIN_PRECISION) }