Skip to content

Commit ffe5ba7

Browse files
committed
isolated hlm func
1 parent db38486 commit ffe5ba7

File tree

2 files changed

+52
-32
lines changed

2 files changed

+52
-32
lines changed

programs/drift/src/state/perp_market.rs

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
244276
impl 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)

programs/drift/src/state/perp_market/tests.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,19 @@ mod get_margin_ratio {
117117

118118
for i in 1..1_000 {
119119
let hlm_margin_ratio_initial = perp_market
120-
.get_margin_ratio(BASE_PRECISION * i * 1000, MarginRequirementType::Initial, true)
120+
.get_margin_ratio(
121+
BASE_PRECISION * i * 1000,
122+
MarginRequirementType::Initial,
123+
true,
124+
)
121125
.unwrap();
122126

123127
let margin_ratio_initial = perp_market
124-
.get_margin_ratio(BASE_PRECISION * i * 1000, MarginRequirementType::Initial, false)
128+
.get_margin_ratio(
129+
BASE_PRECISION * i * 1000,
130+
MarginRequirementType::Initial,
131+
false,
132+
)
125133
.unwrap();
126134

127135
if margin_ratio_initial != perp_market.margin_ratio_initial {
@@ -146,7 +154,11 @@ mod get_margin_ratio {
146154
};
147155

148156
let normal_margin_ratio_initial = perp_market
149-
.get_margin_ratio(BASE_PRECISION * 1000000, MarginRequirementType::Initial, false)
157+
.get_margin_ratio(
158+
BASE_PRECISION * 1000000,
159+
MarginRequirementType::Initial,
160+
false,
161+
)
150162
.unwrap();
151163

152164
assert_eq!(normal_margin_ratio_initial, 1300);

0 commit comments

Comments
 (0)