gmsol_store/states/market/
config.rs

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/// Market Config.
8#[zero_copy]
9#[cfg_attr(feature = "debug", derive(Debug))]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct MarketConfig {
12    /// Flags.
13    flag: MarketConfigFlagContainer,
14    // Swap impact.
15    pub(super) swap_impact_exponent: Factor,
16    pub(super) swap_impact_positive_factor: Factor,
17    pub(super) swap_impact_negative_factor: Factor,
18    // Swap fee.
19    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    // Position general.
23    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    // Position impact.
32    pub(super) position_impact_exponent: Factor,
33    pub(super) position_impact_positive_factor: Factor,
34    pub(super) position_impact_negative_factor: Factor,
35    // Order fee.
36    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    // Liquidation fee.
40    pub(super) liquidation_fee_receiver_factor: Factor,
41    pub(super) liquidation_fee_factor: Factor,
42    // Position impact distribution.
43    pub(super) position_impact_distribute_factor: Factor,
44    pub(super) min_position_impact_pool_amount: Factor,
45    // Borrowing fee.
46    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    // Funding fee.
58    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    // Reserve factor.
67    pub(super) reserve_factor: Factor,
68    pub(super) open_interest_reserve_factor: Factor,
69    // Max pnl factors.
70    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    // Other boundary.
81    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    /// Get config flag.
469    pub(crate) fn flag(&self, flag: MarketConfigFlag) -> bool {
470        self.flag.get_flag(flag)
471    }
472
473    /// Set config flag.
474    ///
475    /// Return the previous value.
476    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/// An entry of the config buffer.
484#[derive(AnchorSerialize, AnchorDeserialize, Clone, InitSpace)]
485#[cfg_attr(feature = "debug", derive(Debug))]
486pub struct Entry {
487    /// Key.
488    key: u16,
489    /// Value.
490    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    /// Get key.
502    pub fn key(&self) -> Result<MarketConfigKey> {
503        self.key
504            .try_into()
505            .map_err(|_| error!(CoreError::InvalidMarketConfigKey))
506    }
507
508    /// Get value.
509    pub fn value(&self) -> Factor {
510        self.value
511    }
512}
513
514/// An entry of the config buffer.
515#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
516#[cfg_attr(feature = "debug", derive(Debug))]
517pub struct EntryArgs {
518    /// Key.
519    pub key: String,
520    /// Value.
521    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/// Market Config Buffer.
537#[account]
538#[cfg_attr(feature = "debug", derive(Debug))]
539pub struct MarketConfigBuffer {
540    /// Store.
541    pub store: Pubkey,
542    /// Authority.
543    pub authority: Pubkey,
544    /// Expiration time.
545    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    /// Create an iterator of entries.
564    pub fn iter(&self) -> impl Iterator<Item = &Entry> {
565        self.entries.iter()
566    }
567
568    /// Return whether the buffer is empty.
569    pub fn is_empty(&self) -> bool {
570        self.entries.is_empty()
571    }
572
573    /// Return the number of entries.
574    pub fn len(&self) -> usize {
575        self.entries.len()
576    }
577}