1use anchor_lang::prelude::*;
2
3use crate::{constants, states::Factor, CoreError};
4
5pub use gmsol_utils::market::{MarketConfigFlag, MarketConfigKey, MAX_MARKET_CONFIG_FLAGS};
6
7#[zero_copy]
9#[cfg_attr(feature = "debug", derive(Debug))]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct MarketConfig {
12 flag: MarketConfigFlagContainer,
14 pub(super) swap_impact_exponent: Factor,
16 pub(super) swap_impact_positive_factor: Factor,
17 pub(super) swap_impact_negative_factor: Factor,
18 pub(super) swap_fee_receiver_factor: Factor,
20 pub(super) swap_fee_factor_for_positive_impact: Factor,
21 pub(super) swap_fee_factor_for_negative_impact: Factor,
22 pub(super) min_position_size_usd: Factor,
24 pub(super) min_collateral_value: Factor,
25 pub(super) min_collateral_factor: Factor,
26 pub(super) min_collateral_factor_for_open_interest_multiplier_for_long: Factor,
27 pub(super) min_collateral_factor_for_open_interest_multiplier_for_short: Factor,
28 pub(super) max_positive_position_impact_factor: Factor,
29 pub(super) max_negative_position_impact_factor: Factor,
30 pub(super) max_position_impact_factor_for_liquidations: Factor,
31 pub(super) position_impact_exponent: Factor,
33 pub(super) position_impact_positive_factor: Factor,
34 pub(super) position_impact_negative_factor: Factor,
35 pub(super) order_fee_receiver_factor: Factor,
37 pub(super) order_fee_factor_for_positive_impact: Factor,
38 pub(super) order_fee_factor_for_negative_impact: Factor,
39 pub(super) liquidation_fee_receiver_factor: Factor,
41 pub(super) liquidation_fee_factor: Factor,
42 pub(super) position_impact_distribute_factor: Factor,
44 pub(super) min_position_impact_pool_amount: Factor,
45 pub(super) borrowing_fee_receiver_factor: Factor,
47 pub(super) borrowing_fee_factor_for_long: Factor,
48 pub(super) borrowing_fee_factor_for_short: Factor,
49 pub(super) borrowing_fee_exponent_for_long: Factor,
50 pub(super) borrowing_fee_exponent_for_short: Factor,
51 pub(super) borrowing_fee_optimal_usage_factor_for_long: Factor,
52 pub(super) borrowing_fee_optimal_usage_factor_for_short: Factor,
53 pub(super) borrowing_fee_base_factor_for_long: Factor,
54 pub(super) borrowing_fee_base_factor_for_short: Factor,
55 pub(super) borrowing_fee_above_optimal_usage_factor_for_long: Factor,
56 pub(super) borrowing_fee_above_optimal_usage_factor_for_short: Factor,
57 pub(super) funding_fee_exponent: Factor,
59 pub(super) funding_fee_factor: Factor,
60 pub(super) funding_fee_max_factor_per_second: Factor,
61 pub(super) funding_fee_min_factor_per_second: Factor,
62 pub(super) funding_fee_increase_factor_per_second: Factor,
63 pub(super) funding_fee_decrease_factor_per_second: Factor,
64 pub(super) funding_fee_threshold_for_stable_funding: Factor,
65 pub(super) funding_fee_threshold_for_decrease_funding: Factor,
66 pub(super) reserve_factor: Factor,
68 pub(super) open_interest_reserve_factor: Factor,
69 pub(super) max_pnl_factor_for_long_deposit: Factor,
71 pub(super) max_pnl_factor_for_short_deposit: Factor,
72 pub(super) max_pnl_factor_for_long_withdrawal: Factor,
73 pub(super) max_pnl_factor_for_short_withdrawal: Factor,
74 pub(super) max_pnl_factor_for_long_trader: Factor,
75 pub(super) max_pnl_factor_for_short_trader: Factor,
76 pub(super) max_pnl_factor_for_long_adl: Factor,
77 pub(super) max_pnl_factor_for_short_adl: Factor,
78 pub(super) min_pnl_factor_after_long_adl: Factor,
79 pub(super) min_pnl_factor_after_short_adl: Factor,
80 pub(super) max_pool_amount_for_long_token: Factor,
82 pub(super) max_pool_amount_for_short_token: Factor,
83 pub(super) max_pool_value_for_deposit_for_long_token: Factor,
84 pub(super) max_pool_value_for_deposit_for_short_token: Factor,
85 pub(super) max_open_interest_for_long: Factor,
86 pub(super) max_open_interest_for_short: Factor,
87 pub(super) min_tokens_for_first_deposit: Factor,
88 reserved: [Factor; 32],
89}
90
91impl MarketConfig {
92 pub(super) fn init(&mut self) {
93 self.swap_impact_exponent = constants::DEFAULT_SWAP_IMPACT_EXPONENT;
94 self.swap_impact_positive_factor = constants::DEFAULT_SWAP_IMPACT_POSITIVE_FACTOR;
95 self.swap_impact_positive_factor = constants::DEFAULT_SWAP_IMPACT_NEGATIVE_FACTOR;
96
97 self.swap_fee_receiver_factor = constants::DEFAULT_RECEIVER_FACTOR;
98 self.swap_fee_factor_for_positive_impact =
99 constants::DEFAULT_SWAP_FEE_FACTOR_FOR_POSITIVE_IMPACT;
100 self.swap_fee_factor_for_negative_impact =
101 constants::DEFAULT_SWAP_FEE_FACTOR_FOR_NEGATIVE_IMPACT;
102
103 self.min_position_size_usd = constants::DEFAULT_MIN_POSITION_SIZE_USD;
104 self.min_collateral_value = constants::DEFAULT_MIN_COLLATERAL_VALUE;
105 self.min_collateral_factor = constants::DEFAULT_MIN_COLLATERAL_FACTOR;
106 self.min_collateral_factor_for_open_interest_multiplier_for_long =
107 constants::DEFAULT_MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_FOR_LONG;
108 self.min_collateral_factor_for_open_interest_multiplier_for_short =
109 constants::DEFAULT_MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_FOR_SHORT;
110 self.max_positive_position_impact_factor =
111 constants::DEFAULT_MAX_POSITIVE_POSITION_IMPACT_FACTOR;
112 self.max_negative_position_impact_factor =
113 constants::DEFAULT_MAX_NEGATIVE_POSITION_IMPACT_FACTOR;
114 self.max_position_impact_factor_for_liquidations =
115 constants::DEFAULT_MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS;
116
117 self.position_impact_exponent = constants::DEFAULT_POSITION_IMPACT_EXPONENT;
118 self.position_impact_positive_factor = constants::DEFAULT_POSITION_IMPACT_POSITIVE_FACTOR;
119 self.position_impact_negative_factor = constants::DEFAULT_POSITION_IMPACT_NEGATIVE_FACTOR;
120
121 self.order_fee_receiver_factor = constants::DEFAULT_RECEIVER_FACTOR;
122 self.order_fee_factor_for_positive_impact =
123 constants::DEFAULT_ORDER_FEE_FACTOR_FOR_POSITIVE_IMPACT;
124 self.order_fee_factor_for_negative_impact =
125 constants::DEFAULT_ORDER_FEE_FACTOR_FOR_NEGATIVE_IMPACT;
126
127 self.liquidation_fee_receiver_factor = constants::DEFAULT_RECEIVER_FACTOR;
128 self.liquidation_fee_factor = constants::DEFAULT_LIQUIDATION_FEE_FACTOR;
129
130 self.position_impact_distribute_factor =
131 constants::DEFAULT_POSITION_IMPACT_DISTRIBUTE_FACTOR;
132 self.min_position_impact_pool_amount = constants::DEFAULT_MIN_POSITION_IMPACT_POOL_AMOUNT;
133
134 self.borrowing_fee_receiver_factor = constants::DEFAULT_RECEIVER_FACTOR;
135 self.borrowing_fee_factor_for_long = constants::DEFAULT_BORROWING_FEE_FACTOR_FOR_LONG;
136 self.borrowing_fee_factor_for_short = constants::DEFAULT_BORROWING_FEE_FACTOR_FOR_SHORT;
137 self.borrowing_fee_exponent_for_long = constants::DEFAULT_BORROWING_FEE_EXPONENT_FOR_LONG;
138 self.borrowing_fee_exponent_for_short = constants::DEFAULT_BORROWING_FEE_EXPONENT_FOR_SHORT;
139 self.borrowing_fee_optimal_usage_factor_for_long =
140 constants::DEFAULT_BORROWING_FEE_OPTIMAL_USAGE_FACTOR_FOR_LONG;
141 self.borrowing_fee_optimal_usage_factor_for_short =
142 constants::DEFAULT_BORROWING_FEE_OPTIMAL_USAGE_FACTOR_FOR_SHORT;
143 self.borrowing_fee_base_factor_for_long =
144 constants::DEFAULT_BORROWING_FEE_BASE_FACTOR_FOR_LONG;
145 self.borrowing_fee_base_factor_for_short =
146 constants::DEFAULT_BORROWING_FEE_BASE_FACTOR_FOR_SHORT;
147 self.borrowing_fee_above_optimal_usage_factor_for_long =
148 constants::DEFAULT_BORROWING_FEE_ABOVE_OPTIMAL_USAGE_FACTOR_FOR_LONG;
149 self.borrowing_fee_above_optimal_usage_factor_for_short =
150 constants::DEFAULT_BORROWING_FEE_ABOVE_OPTIMAL_USAGE_FACTOR_FOR_SHORT;
151
152 self.funding_fee_exponent = constants::DEFAULT_FUNDING_FEE_EXPONENT;
153 self.funding_fee_factor = constants::DEFAULT_FUNDING_FEE_FACTOR;
154 self.funding_fee_max_factor_per_second =
155 constants::DEFAULT_FUNDING_FEE_MAX_FACTOR_PER_SECOND;
156 self.funding_fee_min_factor_per_second =
157 constants::DEFAULT_FUNDING_FEE_MIN_FACTOR_PER_SECOND;
158 self.funding_fee_increase_factor_per_second =
159 constants::DEFAULT_FUNDING_FEE_INCREASE_FACTOR_PER_SECOND;
160 self.funding_fee_decrease_factor_per_second =
161 constants::DEFAULT_FUNDING_FEE_DECREASE_FACTOR_PER_SECOND;
162 self.funding_fee_threshold_for_stable_funding =
163 constants::DEFAULT_FUNDING_FEE_THRESHOLD_FOR_STABLE_FUNDING;
164 self.funding_fee_threshold_for_decrease_funding =
165 constants::DEFAULT_FUNDING_FEE_THRESHOLD_FOR_DECREASE_FUNDING;
166
167 self.reserve_factor = constants::DEFAULT_RECEIVER_FACTOR;
168 self.open_interest_reserve_factor = constants::DEFAULT_OPEN_INTEREST_RESERVE_FACTOR;
169
170 self.max_pnl_factor_for_long_deposit = constants::DEFAULT_MAX_PNL_FACTOR_FOR_LONG_DEPOSIT;
171 self.max_pnl_factor_for_short_deposit = constants::DEFAULT_MAX_PNL_FACTOR_FOR_SHORT_DEPOSIT;
172 self.max_pnl_factor_for_long_withdrawal =
173 constants::DEFAULT_MAX_PNL_FACTOR_FOR_LONG_WITHDRAWAL;
174 self.max_pnl_factor_for_short_withdrawal =
175 constants::DEFAULT_MAX_PNL_FACTOR_FOR_SHORT_WITHDRAWAL;
176 self.max_pnl_factor_for_long_trader = constants::DEFAULT_MAX_PNL_FACTOR_FOR_LONG_TRADER;
177 self.max_pnl_factor_for_short_trader = constants::DEFAULT_MAX_PNL_FACTOR_FOR_SHORT_TRADER;
178 self.max_pnl_factor_for_long_adl = constants::DEFAULT_MAX_PNL_FACTOR_FOR_LONG_ADL;
179 self.max_pnl_factor_for_short_adl = constants::DEFAULT_MAX_PNL_FACTOR_FOR_SHORT_ADL;
180 self.min_pnl_factor_after_long_adl = constants::DEFAULT_MIN_PNL_FACTOR_AFTER_LONG_ADL;
181 self.min_pnl_factor_after_short_adl = constants::DEFAULT_MIN_PNL_FACTOR_AFTER_SHORT_ADL;
182
183 self.max_pool_amount_for_long_token = constants::DEFAULT_MAX_POOL_AMOUNT_FOR_LONG_TOKEN;
184 self.max_pool_amount_for_short_token = constants::DEFAULT_MAX_POOL_AMOUNT_FOR_SHORT_TOKEN;
185
186 self.max_pool_value_for_deposit_for_long_token =
187 constants::DEFAULT_MAX_POOL_VALUE_FOR_DEPOSIT_LONG_TOKEN;
188 self.max_pool_value_for_deposit_for_short_token =
189 constants::DEFAULT_MAX_POOL_VALUE_FOR_DEPOSIT_SHORT_TOKEN;
190
191 self.max_open_interest_for_long = constants::DEFAULT_MAX_OPEN_INTEREST_FOR_LONG;
192 self.max_open_interest_for_short = constants::DEFAULT_MAX_OPEN_INTEREST_FOR_SHORT;
193
194 self.min_tokens_for_first_deposit = constants::DEFAULT_MIN_TOKENS_FOR_FIRST_DEPOSIT;
195
196 self.set_flag(
197 MarketConfigFlag::SkipBorrowingFeeForSmallerSide,
198 constants::DEFAULT_SKIP_BORROWING_FEE_FOR_SMALLER_SIDE,
199 );
200 self.set_flag(
201 MarketConfigFlag::IgnoreOpenInterestForUsageFactor,
202 constants::DEFAULT_IGNORE_OPEN_INTEREST_FOR_USAGE_FACTOR,
203 );
204 }
205
206 pub(super) fn get(&self, key: MarketConfigKey) -> Option<&Factor> {
207 let value = match key {
208 MarketConfigKey::SwapImpactExponent => &self.swap_impact_exponent,
209 MarketConfigKey::SwapImpactPositiveFactor => &self.swap_impact_positive_factor,
210 MarketConfigKey::SwapImpactNegativeFactor => &self.swap_impact_negative_factor,
211 MarketConfigKey::SwapFeeReceiverFactor => &self.swap_fee_receiver_factor,
212 MarketConfigKey::SwapFeeFactorForPositiveImpact => {
213 &self.swap_fee_factor_for_positive_impact
214 }
215 MarketConfigKey::SwapFeeFactorForNegativeImpact => {
216 &self.swap_fee_factor_for_negative_impact
217 }
218 MarketConfigKey::MinPositionSizeUsd => &self.min_position_size_usd,
219 MarketConfigKey::MinCollateralValue => &self.min_collateral_value,
220 MarketConfigKey::MinCollateralFactor => &self.min_collateral_factor,
221 MarketConfigKey::MinCollateralFactorForOpenInterestMultiplierForLong => {
222 &self.min_collateral_factor_for_open_interest_multiplier_for_long
223 }
224 MarketConfigKey::MinCollateralFactorForOpenInterestMultiplierForShort => {
225 &self.min_collateral_factor_for_open_interest_multiplier_for_short
226 }
227 MarketConfigKey::MaxPositivePositionImpactFactor => {
228 &self.max_positive_position_impact_factor
229 }
230 MarketConfigKey::MaxNegativePositionImpactFactor => {
231 &self.max_negative_position_impact_factor
232 }
233 MarketConfigKey::MaxPositionImpactFactorForLiquidations => {
234 &self.max_position_impact_factor_for_liquidations
235 }
236 MarketConfigKey::PositionImpactExponent => &self.position_impact_exponent,
237 MarketConfigKey::PositionImpactPositiveFactor => &self.position_impact_positive_factor,
238 MarketConfigKey::PositionImpactNegativeFactor => &self.position_impact_negative_factor,
239 MarketConfigKey::OrderFeeReceiverFactor => &self.order_fee_receiver_factor,
240 MarketConfigKey::OrderFeeFactorForPositiveImpact => {
241 &self.order_fee_factor_for_positive_impact
242 }
243 MarketConfigKey::OrderFeeFactorForNegativeImpact => {
244 &self.order_fee_factor_for_negative_impact
245 }
246 MarketConfigKey::LiquidationFeeReceiverFactor => &self.liquidation_fee_receiver_factor,
247 MarketConfigKey::LiquidationFeeFactor => &self.liquidation_fee_factor,
248 MarketConfigKey::PositionImpactDistributeFactor => {
249 &self.position_impact_distribute_factor
250 }
251 MarketConfigKey::MinPositionImpactPoolAmount => &self.min_position_impact_pool_amount,
252 MarketConfigKey::BorrowingFeeReceiverFactor => &self.borrowing_fee_receiver_factor,
253 MarketConfigKey::BorrowingFeeFactorForLong => &self.borrowing_fee_factor_for_long,
254 MarketConfigKey::BorrowingFeeFactorForShort => &self.borrowing_fee_factor_for_short,
255 MarketConfigKey::BorrowingFeeExponentForLong => &self.borrowing_fee_exponent_for_long,
256 MarketConfigKey::BorrowingFeeExponentForShort => &self.borrowing_fee_exponent_for_short,
257 MarketConfigKey::BorrowingFeeOptimalUsageFactorForLong => {
258 &self.borrowing_fee_optimal_usage_factor_for_long
259 }
260 MarketConfigKey::BorrowingFeeOptimalUsageFactorForShort => {
261 &self.borrowing_fee_optimal_usage_factor_for_short
262 }
263 MarketConfigKey::BorrowingFeeBaseFactorForLong => {
264 &self.borrowing_fee_base_factor_for_long
265 }
266 MarketConfigKey::BorrowingFeeBaseFactorForShort => {
267 &self.borrowing_fee_base_factor_for_short
268 }
269 MarketConfigKey::BorrowingFeeAboveOptimalUsageFactorForLong => {
270 &self.borrowing_fee_above_optimal_usage_factor_for_long
271 }
272 MarketConfigKey::BorrowingFeeAboveOptimalUsageFactorForShort => {
273 &self.borrowing_fee_above_optimal_usage_factor_for_short
274 }
275 MarketConfigKey::FundingFeeExponent => &self.funding_fee_exponent,
276 MarketConfigKey::FundingFeeFactor => &self.funding_fee_factor,
277 MarketConfigKey::FundingFeeMaxFactorPerSecond => {
278 &self.funding_fee_max_factor_per_second
279 }
280 MarketConfigKey::FundingFeeMinFactorPerSecond => {
281 &self.funding_fee_min_factor_per_second
282 }
283 MarketConfigKey::FundingFeeIncreaseFactorPerSecond => {
284 &self.funding_fee_increase_factor_per_second
285 }
286 MarketConfigKey::FundingFeeDecreaseFactorPerSecond => {
287 &self.funding_fee_decrease_factor_per_second
288 }
289 MarketConfigKey::FundingFeeThresholdForStableFunding => {
290 &self.funding_fee_threshold_for_stable_funding
291 }
292 MarketConfigKey::FundingFeeThresholdForDecreaseFunding => {
293 &self.funding_fee_threshold_for_decrease_funding
294 }
295 MarketConfigKey::ReserveFactor => &self.reserve_factor,
296 MarketConfigKey::OpenInterestReserveFactor => &self.open_interest_reserve_factor,
297 MarketConfigKey::MaxPnlFactorForLongDeposit => &self.max_pnl_factor_for_long_deposit,
298 MarketConfigKey::MaxPnlFactorForShortDeposit => &self.max_pnl_factor_for_short_deposit,
299 MarketConfigKey::MaxPnlFactorForLongWithdrawal => {
300 &self.max_pnl_factor_for_long_withdrawal
301 }
302 MarketConfigKey::MaxPnlFactorForShortWithdrawal => {
303 &self.max_pnl_factor_for_short_withdrawal
304 }
305 MarketConfigKey::MaxPnlFactorForLongTrader => &self.max_pnl_factor_for_long_trader,
306 MarketConfigKey::MaxPnlFactorForShortTrader => &self.max_pnl_factor_for_short_trader,
307 MarketConfigKey::MaxPnlFactorForLongAdl => &self.max_pnl_factor_for_long_adl,
308 MarketConfigKey::MaxPnlFactorForShortAdl => &self.max_pnl_factor_for_short_adl,
309 MarketConfigKey::MinPnlFactorAfterLongAdl => &self.min_pnl_factor_after_long_adl,
310 MarketConfigKey::MinPnlFactorAfterShortAdl => &self.min_pnl_factor_after_short_adl,
311 MarketConfigKey::MaxPoolAmountForLongToken => &self.max_pool_amount_for_long_token,
312 MarketConfigKey::MaxPoolAmountForShortToken => &self.max_pool_amount_for_short_token,
313 MarketConfigKey::MaxPoolValueForDepositForLongToken => {
314 &self.max_pool_value_for_deposit_for_long_token
315 }
316 MarketConfigKey::MaxPoolValueForDepositForShortToken => {
317 &self.max_pool_value_for_deposit_for_short_token
318 }
319 MarketConfigKey::MaxOpenInterestForLong => &self.max_open_interest_for_long,
320 MarketConfigKey::MaxOpenInterestForShort => &self.max_open_interest_for_short,
321 MarketConfigKey::MinTokensForFirstDeposit => &self.min_tokens_for_first_deposit,
322 _ => return None,
323 };
324 Some(value)
325 }
326
327 pub(super) fn get_mut(&mut self, key: MarketConfigKey) -> Option<&mut Factor> {
328 let value = match key {
329 MarketConfigKey::SwapImpactExponent => &mut self.swap_impact_exponent,
330 MarketConfigKey::SwapImpactPositiveFactor => &mut self.swap_impact_positive_factor,
331 MarketConfigKey::SwapImpactNegativeFactor => &mut self.swap_impact_negative_factor,
332 MarketConfigKey::SwapFeeReceiverFactor => &mut self.swap_fee_receiver_factor,
333 MarketConfigKey::SwapFeeFactorForPositiveImpact => {
334 &mut self.swap_fee_factor_for_positive_impact
335 }
336 MarketConfigKey::SwapFeeFactorForNegativeImpact => {
337 &mut self.swap_fee_factor_for_negative_impact
338 }
339 MarketConfigKey::MinPositionSizeUsd => &mut self.min_position_size_usd,
340 MarketConfigKey::MinCollateralValue => &mut self.min_collateral_value,
341 MarketConfigKey::MinCollateralFactor => &mut self.min_collateral_factor,
342 MarketConfigKey::MinCollateralFactorForOpenInterestMultiplierForLong => {
343 &mut self.min_collateral_factor_for_open_interest_multiplier_for_long
344 }
345 MarketConfigKey::MinCollateralFactorForOpenInterestMultiplierForShort => {
346 &mut self.min_collateral_factor_for_open_interest_multiplier_for_short
347 }
348 MarketConfigKey::MaxPositivePositionImpactFactor => {
349 &mut self.max_positive_position_impact_factor
350 }
351 MarketConfigKey::MaxNegativePositionImpactFactor => {
352 &mut self.max_negative_position_impact_factor
353 }
354 MarketConfigKey::MaxPositionImpactFactorForLiquidations => {
355 &mut self.max_position_impact_factor_for_liquidations
356 }
357 MarketConfigKey::PositionImpactExponent => &mut self.position_impact_exponent,
358 MarketConfigKey::PositionImpactPositiveFactor => {
359 &mut self.position_impact_positive_factor
360 }
361 MarketConfigKey::PositionImpactNegativeFactor => {
362 &mut self.position_impact_negative_factor
363 }
364 MarketConfigKey::OrderFeeReceiverFactor => &mut self.order_fee_receiver_factor,
365 MarketConfigKey::OrderFeeFactorForPositiveImpact => {
366 &mut self.order_fee_factor_for_positive_impact
367 }
368 MarketConfigKey::OrderFeeFactorForNegativeImpact => {
369 &mut self.order_fee_factor_for_negative_impact
370 }
371 MarketConfigKey::LiquidationFeeReceiverFactor => {
372 &mut self.liquidation_fee_receiver_factor
373 }
374 MarketConfigKey::LiquidationFeeFactor => &mut self.liquidation_fee_factor,
375 MarketConfigKey::PositionImpactDistributeFactor => {
376 &mut self.position_impact_distribute_factor
377 }
378 MarketConfigKey::MinPositionImpactPoolAmount => {
379 &mut self.min_position_impact_pool_amount
380 }
381 MarketConfigKey::BorrowingFeeReceiverFactor => &mut self.borrowing_fee_receiver_factor,
382 MarketConfigKey::BorrowingFeeFactorForLong => &mut self.borrowing_fee_factor_for_long,
383 MarketConfigKey::BorrowingFeeFactorForShort => &mut self.borrowing_fee_factor_for_short,
384 MarketConfigKey::BorrowingFeeExponentForLong => {
385 &mut self.borrowing_fee_exponent_for_long
386 }
387 MarketConfigKey::BorrowingFeeExponentForShort => {
388 &mut self.borrowing_fee_exponent_for_short
389 }
390 MarketConfigKey::BorrowingFeeOptimalUsageFactorForLong => {
391 &mut self.borrowing_fee_optimal_usage_factor_for_long
392 }
393 MarketConfigKey::BorrowingFeeOptimalUsageFactorForShort => {
394 &mut self.borrowing_fee_optimal_usage_factor_for_short
395 }
396 MarketConfigKey::BorrowingFeeBaseFactorForLong => {
397 &mut self.borrowing_fee_base_factor_for_long
398 }
399 MarketConfigKey::BorrowingFeeBaseFactorForShort => {
400 &mut self.borrowing_fee_base_factor_for_short
401 }
402 MarketConfigKey::BorrowingFeeAboveOptimalUsageFactorForLong => {
403 &mut self.borrowing_fee_above_optimal_usage_factor_for_long
404 }
405 MarketConfigKey::BorrowingFeeAboveOptimalUsageFactorForShort => {
406 &mut self.borrowing_fee_above_optimal_usage_factor_for_short
407 }
408 MarketConfigKey::FundingFeeExponent => &mut self.funding_fee_exponent,
409 MarketConfigKey::FundingFeeFactor => &mut self.funding_fee_factor,
410 MarketConfigKey::FundingFeeMaxFactorPerSecond => {
411 &mut self.funding_fee_max_factor_per_second
412 }
413 MarketConfigKey::FundingFeeMinFactorPerSecond => {
414 &mut self.funding_fee_min_factor_per_second
415 }
416 MarketConfigKey::FundingFeeIncreaseFactorPerSecond => {
417 &mut self.funding_fee_increase_factor_per_second
418 }
419 MarketConfigKey::FundingFeeDecreaseFactorPerSecond => {
420 &mut self.funding_fee_decrease_factor_per_second
421 }
422 MarketConfigKey::FundingFeeThresholdForStableFunding => {
423 &mut self.funding_fee_threshold_for_stable_funding
424 }
425 MarketConfigKey::FundingFeeThresholdForDecreaseFunding => {
426 &mut self.funding_fee_threshold_for_decrease_funding
427 }
428 MarketConfigKey::ReserveFactor => &mut self.reserve_factor,
429 MarketConfigKey::OpenInterestReserveFactor => &mut self.open_interest_reserve_factor,
430 MarketConfigKey::MaxPnlFactorForLongDeposit => {
431 &mut self.max_pnl_factor_for_long_deposit
432 }
433 MarketConfigKey::MaxPnlFactorForShortDeposit => {
434 &mut self.max_pnl_factor_for_short_deposit
435 }
436 MarketConfigKey::MaxPnlFactorForLongWithdrawal => {
437 &mut self.max_pnl_factor_for_long_withdrawal
438 }
439 MarketConfigKey::MaxPnlFactorForShortWithdrawal => {
440 &mut self.max_pnl_factor_for_short_withdrawal
441 }
442 MarketConfigKey::MaxPnlFactorForLongTrader => &mut self.max_pnl_factor_for_long_trader,
443 MarketConfigKey::MaxPnlFactorForShortTrader => {
444 &mut self.max_pnl_factor_for_short_trader
445 }
446 MarketConfigKey::MaxPnlFactorForLongAdl => &mut self.max_pnl_factor_for_long_adl,
447 MarketConfigKey::MaxPnlFactorForShortAdl => &mut self.max_pnl_factor_for_short_adl,
448 MarketConfigKey::MinPnlFactorAfterLongAdl => &mut self.min_pnl_factor_after_long_adl,
449 MarketConfigKey::MinPnlFactorAfterShortAdl => &mut self.min_pnl_factor_after_short_adl,
450 MarketConfigKey::MaxPoolAmountForLongToken => &mut self.max_pool_amount_for_long_token,
451 MarketConfigKey::MaxPoolAmountForShortToken => {
452 &mut self.max_pool_amount_for_short_token
453 }
454 MarketConfigKey::MaxPoolValueForDepositForLongToken => {
455 &mut self.max_pool_value_for_deposit_for_long_token
456 }
457 MarketConfigKey::MaxPoolValueForDepositForShortToken => {
458 &mut self.max_pool_value_for_deposit_for_short_token
459 }
460 MarketConfigKey::MaxOpenInterestForLong => &mut self.max_open_interest_for_long,
461 MarketConfigKey::MaxOpenInterestForShort => &mut self.max_open_interest_for_short,
462 MarketConfigKey::MinTokensForFirstDeposit => &mut self.min_tokens_for_first_deposit,
463 _ => return None,
464 };
465 Some(value)
466 }
467
468 pub(crate) fn flag(&self, flag: MarketConfigFlag) -> bool {
470 self.flag.get_flag(flag)
471 }
472
473 pub(crate) fn set_flag(&mut self, flag: MarketConfigFlag, value: bool) -> bool {
477 self.flag.set_flag(flag, value)
478 }
479}
480
481gmsol_utils::flags!(MarketConfigFlag, MAX_MARKET_CONFIG_FLAGS, u128);
482
483#[derive(AnchorSerialize, AnchorDeserialize, Clone, InitSpace)]
485#[cfg_attr(feature = "debug", derive(Debug))]
486pub struct Entry {
487 key: u16,
489 value: u128,
491}
492
493impl Entry {
494 pub(crate) fn new(key: MarketConfigKey, value: Factor) -> Self {
495 Self {
496 key: key.into(),
497 value,
498 }
499 }
500
501 pub fn key(&self) -> Result<MarketConfigKey> {
503 self.key
504 .try_into()
505 .map_err(|_| error!(CoreError::InvalidMarketConfigKey))
506 }
507
508 pub fn value(&self) -> Factor {
510 self.value
511 }
512}
513
514#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
516#[cfg_attr(feature = "debug", derive(Debug))]
517pub struct EntryArgs {
518 pub key: String,
520 pub value: u128,
522}
523
524impl TryFrom<EntryArgs> for Entry {
525 type Error = Error;
526
527 fn try_from(EntryArgs { key, value }: EntryArgs) -> Result<Self> {
528 Ok(Self::new(
529 key.parse()
530 .map_err(|_| error!(CoreError::InvalidMarketConfigKey))?,
531 value,
532 ))
533 }
534}
535
536#[account]
538#[cfg_attr(feature = "debug", derive(Debug))]
539pub struct MarketConfigBuffer {
540 pub store: Pubkey,
542 pub authority: Pubkey,
544 pub expiry: i64,
546 entries: Vec<Entry>,
547}
548
549impl MarketConfigBuffer {
550 pub(crate) fn init_space(len: usize) -> usize {
551 32 + 32 + 8 + 4 + Entry::INIT_SPACE * len
552 }
553
554 pub(crate) fn space_after_push(&self, pushed: usize) -> usize {
555 let total = self.entries.len() + pushed;
556 Self::init_space(total)
557 }
558
559 pub(crate) fn push(&mut self, entry: Entry) {
560 self.entries.push(entry);
561 }
562
563 pub fn iter(&self) -> impl Iterator<Item = &Entry> {
565 self.entries.iter()
566 }
567
568 pub fn is_empty(&self) -> bool {
570 self.entries.is_empty()
571 }
572
573 pub fn len(&self) -> usize {
575 self.entries.len()
576 }
577}