Skip to content

Commit dd8d72c

Browse files
committed
apply comments/feedback
1 parent 031f999 commit dd8d72c

File tree

4 files changed

+76
-79
lines changed

4 files changed

+76
-79
lines changed

programs/drift/src/math/margin.rs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::error::DriftResult;
22
use crate::error::ErrorCode;
33
use crate::math::constants::{
4-
MARGIN_PRECISION_U128, MAX_POSITIVE_UPNL_FOR_INITIAL_MARGIN, PRICE_PRECISION,
5-
SPOT_IMF_PRECISION_U128, SPOT_WEIGHT_PRECISION, SPOT_WEIGHT_PRECISION_U128,
4+
MARGIN_PRECISION_U128, MAX_POSITIVE_UPNL_FOR_INITIAL_MARGIN, PERCENTAGE_PRECISION,
5+
PRICE_PRECISION, SPOT_IMF_PRECISION_U128, SPOT_WEIGHT_PRECISION, SPOT_WEIGHT_PRECISION_U128,
66
};
77
use crate::math::position::calculate_base_asset_value_and_pnl_with_oracle_price;
88

@@ -15,7 +15,7 @@ use crate::math::funding::calculate_funding_payment;
1515
use crate::math::oracle::{is_oracle_valid_for_action, DriftAction};
1616

1717
use crate::math::spot_balance::{get_strict_token_value, get_token_value};
18-
18+
use crate::math::helpers::get_proportion_u128;
1919
use crate::math::safe_math::SafeMath;
2020
use crate::msg;
2121
use crate::state::margin_calculation::{MarginCalculation, MarginContext, MarketIdentifier};
@@ -75,6 +75,39 @@ pub fn calculate_size_premium_liability_weight(
7575
Ok(size_premium_liability_weight)
7676
}
7777

78+
pub fn calc_high_leverage_mode_initial_margin_ratio_from_size(
79+
pre_size_adj_margin_ratio: u32,
80+
size_adj_margin_ratio: u32,
81+
default_margin_ratio: u32,
82+
) -> DriftResult<u32> {
83+
let result = if size_adj_margin_ratio < pre_size_adj_margin_ratio {
84+
let size_pct_discount_factor = PERCENTAGE_PRECISION.saturating_sub(
85+
((pre_size_adj_margin_ratio.cast::<u128>()?)
86+
.safe_sub(size_adj_margin_ratio.cast::<u128>()?)?
87+
.safe_mul(PERCENTAGE_PRECISION)?
88+
.safe_div((pre_size_adj_margin_ratio.safe_div(5)?).cast::<u128>()?)?),
89+
);
90+
91+
let hlm_margin_delta = pre_size_adj_margin_ratio
92+
.saturating_sub(default_margin_ratio)
93+
.max(1);
94+
95+
let hlm_margin_delta_proportion = get_proportion_u128(
96+
hlm_margin_delta.cast()?,
97+
size_pct_discount_factor,
98+
PERCENTAGE_PRECISION,
99+
)?
100+
.cast::<u32>()?;
101+
hlm_margin_delta_proportion.safe_add(default_margin_ratio)?
102+
} else if size_adj_margin_ratio == pre_size_adj_margin_ratio {
103+
default_margin_ratio
104+
} else {
105+
size_adj_margin_ratio
106+
};
107+
108+
Ok(result)
109+
}
110+
78111
pub fn calculate_size_discount_asset_weight(
79112
size: u128, // AMM_RESERVE_PRECISION
80113
imf_factor: u32,

programs/drift/src/math/orders/tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3296,7 +3296,6 @@ mod calculate_max_perp_order_size {
32963296
.unwrap();
32973297
assert_eq!(max_order_size, 84737288000); // 84
32983298

3299-
33003299
let mut spot_positions = [SpotPosition::default(); 8];
33013300
spot_positions[0] = SpotPosition {
33023301
market_index: 0,

programs/drift/src/state/perp_market.rs

Lines changed: 38 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ use crate::math::constants::{
2424
};
2525
use crate::math::helpers::get_proportion_u128;
2626
use 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
};
3030
use crate::math::safe_math::SafeMath;
3131
use 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-
276243
impl 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

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ mod get_margin_ratio {
103103
}
104104

105105
#[test]
106-
fn smart_hlm_size_loop() {
106+
fn new_hlm_imf_size_loop() {
107107
let perp_market = PerpMarket {
108108
margin_ratio_initial: MARGIN_PRECISION / 20,
109109
margin_ratio_maintenance: MARGIN_PRECISION / 33,
@@ -143,7 +143,7 @@ mod get_margin_ratio {
143143
}
144144

145145
#[test]
146-
fn smart_hlm_size() {
146+
fn new_hlm_imf_size() {
147147
let perp_market = PerpMarket {
148148
margin_ratio_initial: MARGIN_PRECISION / 10,
149149
margin_ratio_maintenance: MARGIN_PRECISION / 20,
@@ -172,7 +172,6 @@ mod get_margin_ratio {
172172
perp_market.high_leverage_margin_ratio_initial as u32
173173
);
174174

175-
176175
let hlm_margin_ratio_initial = perp_market
177176
.get_margin_ratio(BASE_PRECISION, MarginRequirementType::Initial, true)
178177
.unwrap();

0 commit comments

Comments
 (0)