1
1
use std:: convert:: identity;
2
2
use std:: mem:: size_of;
3
3
4
+ use crate :: math:: amm:: calculate_amm_available_liquidity;
4
5
use crate :: msg;
5
6
use anchor_lang:: prelude:: * ;
6
7
use anchor_spl:: token:: Token ;
@@ -18,6 +19,7 @@ use crate::instructions::constraints::*;
18
19
use crate :: instructions:: optional_accounts:: { load_maps, AccountMaps } ;
19
20
use crate :: math:: casting:: Cast ;
20
21
use crate :: math:: constants:: {
22
+ AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO , AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO_I128 ,
21
23
DEFAULT_LIQUIDATION_MARGIN_BUFFER_RATIO , FEE_POOL_TO_REVENUE_POOL_THRESHOLD ,
22
24
IF_FACTOR_PRECISION , INSURANCE_A_MAX , INSURANCE_B_MAX , INSURANCE_C_MAX ,
23
25
INSURANCE_SPECULATIVE_MAX , LIQUIDATION_FEE_PRECISION , MAX_CONCENTRATION_COEFFICIENT ,
@@ -26,6 +28,7 @@ use crate::math::constants::{
26
28
SPOT_WEIGHT_PRECISION , THIRTEEN_DAY , TWENTY_FOUR_HOUR ,
27
29
} ;
28
30
use crate :: math:: cp_curve:: get_update_k_result;
31
+ use crate :: math:: helpers:: get_proportion_u128;
29
32
use crate :: math:: orders:: is_multiple_of_step_size;
30
33
use crate :: math:: repeg:: get_total_fee_lower_bound;
31
34
use crate :: math:: safe_math:: SafeMath ;
@@ -1574,6 +1577,102 @@ pub fn handle_recenter_perp_market_amm(
1574
1577
Ok ( ( ) )
1575
1578
}
1576
1579
1580
+ #[ access_control(
1581
+ perp_market_valid( & ctx. accounts. perp_market)
1582
+ ) ]
1583
+ pub fn handle_recenter_perp_market_amm_crank (
1584
+ ctx : Context < AdminUpdatePerpMarketAmmSummaryStats > ,
1585
+ depth : Option < u128 > ,
1586
+ ) -> Result < ( ) > {
1587
+ let perp_market = & mut load_mut ! ( ctx. accounts. perp_market) ?;
1588
+ let spot_market = & mut load ! ( ctx. accounts. spot_market) ?;
1589
+
1590
+ let clock = Clock :: get ( ) ?;
1591
+ let price_oracle = & ctx. accounts . oracle ;
1592
+
1593
+ let OraclePriceData {
1594
+ price : oracle_price,
1595
+ ..
1596
+ } = get_oracle_price ( & perp_market. amm . oracle_source , price_oracle, clock. slot ) ?;
1597
+
1598
+ msg ! (
1599
+ "recentering amm crank for perp market {}" ,
1600
+ perp_market. market_index
1601
+ ) ;
1602
+
1603
+ let base_asset_reserve_before = perp_market. amm . base_asset_reserve ;
1604
+ let quote_asset_reserve_before = perp_market. amm . quote_asset_reserve ;
1605
+ let sqrt_k_before = perp_market. amm . sqrt_k ;
1606
+ let peg_multiplier_before = perp_market. amm . peg_multiplier ;
1607
+ let max_base_asset_reserve_before = perp_market. amm . max_base_asset_reserve ;
1608
+ let min_base_asset_reserve_before = perp_market. amm . min_base_asset_reserve ;
1609
+
1610
+ let mut sqrt_k = sqrt_k_before;
1611
+ let peg_multiplier: u128 = oracle_price. cast ( ) ?;
1612
+ let ( max_bids_before, max_asks_before) =
1613
+ amm:: calculate_market_open_bids_asks ( & perp_market. amm ) ?;
1614
+
1615
+ if let Some ( depth) = depth {
1616
+ let base_depth = max_bids_before
1617
+ . safe_add ( max_asks_before. abs ( ) ) ?
1618
+ . safe_div ( 2 ) ?
1619
+ . unsigned_abs ( ) ;
1620
+ let quote_depth = base_depth
1621
+ . safe_mul ( peg_multiplier) ?
1622
+ . safe_div ( AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO ) ?;
1623
+ sqrt_k = get_proportion_u128 ( sqrt_k, depth, quote_depth) ?;
1624
+ }
1625
+
1626
+ controller:: amm:: recenter_perp_market_amm ( perp_market, peg_multiplier, sqrt_k) ?;
1627
+ validate_perp_market ( perp_market) ?;
1628
+
1629
+ let base_asset_reserve_after = perp_market. amm . base_asset_reserve ;
1630
+ let quote_asset_reserve_after = perp_market. amm . quote_asset_reserve ;
1631
+ let sqrt_k_after = perp_market. amm . sqrt_k ;
1632
+ let peg_multiplier_after = perp_market. amm . peg_multiplier ;
1633
+ let max_base_asset_reserve_after = perp_market. amm . max_base_asset_reserve ;
1634
+ let min_base_asset_reserve_after = perp_market. amm . min_base_asset_reserve ;
1635
+
1636
+ msg ! (
1637
+ "base_asset_reserve {} -> {}" ,
1638
+ base_asset_reserve_before,
1639
+ base_asset_reserve_after
1640
+ ) ;
1641
+
1642
+ msg ! (
1643
+ "quote_asset_reserve {} -> {}" ,
1644
+ quote_asset_reserve_before,
1645
+ quote_asset_reserve_after
1646
+ ) ;
1647
+
1648
+ msg ! ( "sqrt_k {} -> {}" , sqrt_k_before, sqrt_k_after) ;
1649
+
1650
+ msg ! (
1651
+ "peg_multiplier {} -> {}" ,
1652
+ peg_multiplier_before,
1653
+ peg_multiplier_after
1654
+ ) ;
1655
+
1656
+ msg ! (
1657
+ "max_base_asset_reserve {} -> {}" ,
1658
+ max_base_asset_reserve_before,
1659
+ max_base_asset_reserve_after
1660
+ ) ;
1661
+
1662
+ msg ! (
1663
+ "min_base_asset_reserve {} -> {}" ,
1664
+ min_base_asset_reserve_before,
1665
+ min_base_asset_reserve_after
1666
+ ) ;
1667
+
1668
+ let ( max_bids_after, max_asks_after) = amm:: calculate_market_open_bids_asks ( & perp_market. amm ) ?;
1669
+
1670
+ msg ! ( "max_bids {} -> {}" , max_bids_before, max_bids_after) ;
1671
+
1672
+ msg ! ( "max_asks {} -> {}" , max_asks_before, max_asks_after) ;
1673
+ Ok ( ( ) )
1674
+ }
1675
+
1577
1676
#[ derive( Debug , Clone , Copy , AnchorSerialize , AnchorDeserialize , PartialEq , Eq ) ]
1578
1677
pub struct UpdatePerpMarketSummaryStatsParams {
1579
1678
// new aggregate unsettled user stats
0 commit comments