Skip to content

Commit db38486

Browse files
committed
working loop multiple base amounts test
1 parent b81b6ca commit db38486

File tree

2 files changed

+46
-19
lines changed

2 files changed

+46
-19
lines changed

programs/drift/src/state/perp_market.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ impl PerpMarket {
477477
};
478478

479479
let cap_size_premium =
480-
!is_high_leverage_user || margin_type != MarginRequirementType::Initial;
480+
!is_high_leverage_user || margin_type == MarginRequirementType::Maintenance;
481481
let size_adj_margin_ratio = calculate_size_premium_liability_weight(
482482
size,
483483
self.imf_factor,
@@ -486,20 +486,8 @@ impl PerpMarket {
486486
cap_size_premium,
487487
)?;
488488

489-
crate::dlog!(
490-
is_high_leverage_user,
491-
cap_size_premium,
492-
size_adj_margin_ratio,
493-
pre_size_adj_margin_ratio,
494-
default_margin_ratio
495-
);
496-
497489
let margin_ratio = if cap_size_premium {
498-
if size_adj_margin_ratio >= pre_size_adj_margin_ratio {
499-
default_margin_ratio.max(size_adj_margin_ratio)
500-
} else {
501-
default_margin_ratio
502-
}
490+
default_margin_ratio.max(size_adj_margin_ratio)
503491
} else {
504492
if size_adj_margin_ratio < pre_size_adj_margin_ratio {
505493
let size_pct_discount_factor = PERCENTAGE_PRECISION.safe_sub(
@@ -525,8 +513,10 @@ impl PerpMarket {
525513
size_pct_discount_factor
526514
);
527515
hlm_margin_delta_proportion + default_margin_ratio
528-
} else {
516+
} else if size_adj_margin_ratio == pre_size_adj_margin_ratio {
529517
default_margin_ratio
518+
} else {
519+
size_adj_margin_ratio
530520
}
531521
};
532522

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

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,54 @@ mod get_margin_ratio {
8484
let margin_ratio_initial = perp_market
8585
.get_margin_ratio(BASE_PRECISION, MarginRequirementType::Initial, true)
8686
.unwrap();
87+
assert_eq!(margin_ratio_initial, MARGIN_PRECISION / 50);
8788

8889
let margin_ratio_maintenance = perp_market
8990
.get_margin_ratio(BASE_PRECISION, MarginRequirementType::Maintenance, true)
9091
.unwrap();
9192

93+
assert_eq!(margin_ratio_maintenance, MARGIN_PRECISION / 100);
94+
9295
let margin_ratio_fill = perp_market
9396
.get_margin_ratio(BASE_PRECISION, MarginRequirementType::Fill, true)
9497
.unwrap();
9598

96-
assert_eq!(margin_ratio_initial, MARGIN_PRECISION / 50);
9799
assert_eq!(
98100
margin_ratio_fill,
99101
(MARGIN_PRECISION / 50 + MARGIN_PRECISION / 100) / 2
100102
);
101-
assert_eq!(margin_ratio_maintenance, MARGIN_PRECISION / 100);
103+
}
104+
105+
#[test]
106+
fn smart_hlm_size_loop() {
107+
let perp_market = PerpMarket {
108+
margin_ratio_initial: MARGIN_PRECISION / 20,
109+
margin_ratio_maintenance: MARGIN_PRECISION / 33,
110+
high_leverage_margin_ratio_initial: (MARGIN_PRECISION / 100) as u16,
111+
high_leverage_margin_ratio_maintenance: (MARGIN_PRECISION / 151) as u16,
112+
imf_factor: 50,
113+
..PerpMarket::default()
114+
};
115+
116+
let mut cnt = 0;
117+
118+
for i in 1..1_000 {
119+
let hlm_margin_ratio_initial = perp_market
120+
.get_margin_ratio(BASE_PRECISION * i * 1000, MarginRequirementType::Initial, true)
121+
.unwrap();
122+
123+
let margin_ratio_initial = perp_market
124+
.get_margin_ratio(BASE_PRECISION * i * 1000, MarginRequirementType::Initial, false)
125+
.unwrap();
126+
127+
if margin_ratio_initial != perp_market.margin_ratio_initial {
128+
// crate::msg!("{}", BASE_PRECISION * i);
129+
assert_eq!(hlm_margin_ratio_initial, margin_ratio_initial);
130+
cnt += 1;
131+
}
132+
}
133+
134+
assert_eq!(cnt, 959_196 / 1_000);
102135
}
103136

104137
#[test]
@@ -112,6 +145,12 @@ mod get_margin_ratio {
112145
..PerpMarket::default()
113146
};
114147

148+
let normal_margin_ratio_initial = perp_market
149+
.get_margin_ratio(BASE_PRECISION * 1000000, MarginRequirementType::Initial, false)
150+
.unwrap();
151+
152+
assert_eq!(normal_margin_ratio_initial, 1300);
153+
115154
let hlm_margin_ratio_initial = perp_market
116155
.get_margin_ratio(BASE_PRECISION / 10, MarginRequirementType::Initial, true)
117156
.unwrap();
@@ -138,8 +177,6 @@ mod get_margin_ratio {
138177
.unwrap();
139178
assert_eq!(hlm_margin_ratio_maint, 67); // hardly changed
140179

141-
142-
143180
let hlm_margin_ratio_maint = perp_market
144181
.get_margin_ratio(
145182
BASE_PRECISION * 300000,

0 commit comments

Comments
 (0)