@@ -241,6 +241,38 @@ pub struct PerpMarket {
241241 pub padding : [ u8 ; 24 ] ,
242242}
243243
244+ pub fn _get_high_leverage_mode_margin_ratio (
245+ pre_size_adj_margin_ratio : u32 ,
246+ size_adj_margin_ratio : u32 ,
247+ default_margin_ratio : u32 ,
248+ ) -> DriftResult < u32 > {
249+ let result = if size_adj_margin_ratio < pre_size_adj_margin_ratio {
250+ let size_pct_discount_factor = PERCENTAGE_PRECISION . safe_sub (
251+ ( ( pre_size_adj_margin_ratio as u128 )
252+ . safe_sub ( size_adj_margin_ratio as u128 ) ?
253+ . safe_mul ( PERCENTAGE_PRECISION ) ?
254+ . safe_div ( ( pre_size_adj_margin_ratio / 5 ) as u128 ) ?) ,
255+ ) ?;
256+
257+ let hlm_margin_delta = pre_size_adj_margin_ratio
258+ . saturating_sub ( default_margin_ratio)
259+ . max ( 1 ) ;
260+
261+ let hlm_margin_delta_proportion = get_proportion_u128 (
262+ hlm_margin_delta as u128 ,
263+ size_pct_discount_factor,
264+ PERCENTAGE_PRECISION ,
265+ ) ? as 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+
244276impl Default for PerpMarket {
245277 fn default ( ) -> Self {
246278 PerpMarket {
@@ -489,35 +521,11 @@ impl PerpMarket {
489521 let margin_ratio = if cap_size_premium {
490522 default_margin_ratio. max ( size_adj_margin_ratio)
491523 } else {
492- if size_adj_margin_ratio < pre_size_adj_margin_ratio {
493- let size_pct_discount_factor = PERCENTAGE_PRECISION . safe_sub (
494- ( ( pre_size_adj_margin_ratio as u128 )
495- . safe_sub ( size_adj_margin_ratio as u128 ) ?
496- . safe_mul ( PERCENTAGE_PRECISION ) ?
497- . safe_div ( ( pre_size_adj_margin_ratio / 5 ) as u128 ) ?) ,
498- ) ?;
499-
500- let hlm_margin_delta = pre_size_adj_margin_ratio
501- . safe_sub ( default_margin_ratio) ?
502- . max ( 1 ) ;
503-
504- let hlm_margin_delta_proportion = get_proportion_u128 (
505- hlm_margin_delta as u128 ,
506- size_pct_discount_factor,
507- PERCENTAGE_PRECISION ,
508- ) ? as u32 ;
509-
510- crate :: dlog!(
511- hlm_margin_delta_proportion,
512- hlm_margin_delta,
513- size_pct_discount_factor
514- ) ;
515- hlm_margin_delta_proportion + default_margin_ratio
516- } else if size_adj_margin_ratio == pre_size_adj_margin_ratio {
517- default_margin_ratio
518- } else {
519- size_adj_margin_ratio
520- }
524+ _get_high_leverage_mode_margin_ratio (
525+ pre_size_adj_margin_ratio,
526+ size_adj_margin_ratio,
527+ default_margin_ratio,
528+ ) ?
521529 } ;
522530
523531 Ok ( margin_ratio)
0 commit comments