@@ -24,8 +24,8 @@ use crate::math::constants::{
2424} ;
2525use crate :: math:: helpers:: get_proportion_u128;
2626use crate :: math:: margin:: {
27- calculate_size_discount_asset_weight , calculate_size_premium_liability_weight ,
28- MarginRequirementType ,
27+ calc_high_leverage_mode_initial_margin_ratio_from_size , calculate_size_discount_asset_weight ,
28+ calculate_size_premium_liability_weight , MarginRequirementType ,
2929} ;
3030use crate :: math:: safe_math:: SafeMath ;
3131use crate :: math:: stats;
@@ -240,39 +240,6 @@ pub struct PerpMarket {
240240 pub padding : [ u8 ; 24 ] ,
241241}
242242
243- pub fn _calc_high_leverage_mode_initial_margin_ratio_from_size (
244- pre_size_adj_margin_ratio : u32 ,
245- size_adj_margin_ratio : u32 ,
246- default_margin_ratio : u32 ,
247- ) -> DriftResult < u32 > {
248- let result = if size_adj_margin_ratio < pre_size_adj_margin_ratio {
249- let size_pct_discount_factor = PERCENTAGE_PRECISION . safe_sub (
250- ( ( pre_size_adj_margin_ratio. cast :: < u128 > ( ) ?)
251- . safe_sub ( size_adj_margin_ratio. cast :: < u128 > ( ) ?) ?
252- . safe_mul ( PERCENTAGE_PRECISION ) ?
253- . safe_div ( ( pre_size_adj_margin_ratio. safe_div ( 5 ) ?) . cast :: < u128 > ( ) ?) ?) ,
254- ) ?;
255-
256- let hlm_margin_delta = pre_size_adj_margin_ratio
257- . saturating_sub ( default_margin_ratio)
258- . max ( 1 ) ;
259-
260- let hlm_margin_delta_proportion = get_proportion_u128 (
261- hlm_margin_delta. cast ( ) ?,
262- size_pct_discount_factor,
263- PERCENTAGE_PRECISION ,
264- ) ?
265- . cast :: < u32 > ( ) ?;
266- hlm_margin_delta_proportion + default_margin_ratio
267- } else if size_adj_margin_ratio == pre_size_adj_margin_ratio {
268- default_margin_ratio
269- } else {
270- size_adj_margin_ratio
271- } ;
272-
273- Ok ( result)
274- }
275-
276243impl Default for PerpMarket {
277244 fn default ( ) -> Self {
278245 PerpMarket {
@@ -494,45 +461,44 @@ impl PerpMarket {
494461 MarginRequirementType :: Maintenance => margin_ratio_maintenance,
495462 } ;
496463
497- let margin_ratio = if is_high_leverage_user {
498- // use HLM maintenance margin but ordinary mode initial/fill margin for size adj calculation
499- let pre_size_adj_margin_ratio = match margin_type {
500- MarginRequirementType :: Initial => self . margin_ratio_initial ,
501- MarginRequirementType :: Fill => {
502- self . margin_ratio_initial
503- . safe_add ( self . margin_ratio_maintenance ) ?
504- / 2
505- }
506- MarginRequirementType :: Maintenance => margin_ratio_maintenance,
464+ let margin_ratio =
465+ if is_high_leverage_user && margin_type != MarginRequirementType :: Maintenance {
466+ // use HLM maintenance margin but ordinary mode initial/fill margin for size adj calculation
467+ let pre_size_adj_margin_ratio = match margin_type {
468+ MarginRequirementType :: Initial => self . margin_ratio_initial ,
469+ MarginRequirementType :: Fill => {
470+ self . margin_ratio_initial
471+ . safe_add ( self . margin_ratio_maintenance ) ?
472+ / 2
473+ }
474+ MarginRequirementType :: Maintenance => margin_ratio_maintenance,
475+ } ;
476+
477+ let size_adj_margin_ratio = calculate_size_premium_liability_weight (
478+ size,
479+ self . imf_factor ,
480+ pre_size_adj_margin_ratio,
481+ MARGIN_PRECISION_U128 ,
482+ false ,
483+ ) ?;
484+
485+ calc_high_leverage_mode_initial_margin_ratio_from_size (
486+ pre_size_adj_margin_ratio,
487+ size_adj_margin_ratio,
488+ default_margin_ratio,
489+ ) ?
490+ } else {
491+ let size_adj_margin_ratio = calculate_size_premium_liability_weight (
492+ size,
493+ self . imf_factor ,
494+ default_margin_ratio,
495+ MARGIN_PRECISION_U128 ,
496+ true ,
497+ ) ?;
498+
499+ default_margin_ratio. max ( size_adj_margin_ratio)
507500 } ;
508501
509- let bound_liability_weight = margin_type == MarginRequirementType :: Maintenance ;
510-
511- let size_adj_margin_ratio = calculate_size_premium_liability_weight (
512- size,
513- self . imf_factor ,
514- pre_size_adj_margin_ratio,
515- MARGIN_PRECISION_U128 ,
516- bound_liability_weight,
517- ) ?;
518-
519- _calc_high_leverage_mode_initial_margin_ratio_from_size (
520- pre_size_adj_margin_ratio,
521- size_adj_margin_ratio,
522- default_margin_ratio,
523- ) ?
524- } else {
525- let size_adj_margin_ratio = calculate_size_premium_liability_weight (
526- size,
527- self . imf_factor ,
528- default_margin_ratio,
529- MARGIN_PRECISION_U128 ,
530- true ,
531- ) ?;
532-
533- default_margin_ratio. max ( size_adj_margin_ratio)
534- } ;
535-
536502 Ok ( margin_ratio)
537503 }
538504
0 commit comments