Skip to content

Commit 6b7e0c0

Browse files
committed
program: add-recenter-amm-crank-instruction
1 parent dabd826 commit 6b7e0c0

File tree

5 files changed

+184
-1
lines changed

5 files changed

+184
-1
lines changed

programs/drift/src/controller/amm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,7 @@ pub fn recenter_perp_market_amm(
839839
)?;
840840

841841
market.amm.sqrt_k = sqrt_k;
842-
// todo: could calcualte terminal state cost for altering sqrt_k
842+
// todo: ensure correct terminal state cost for altering sqrt_k
843843

844844
market.amm.peg_multiplier = peg_multiplier;
845845

programs/drift/src/instructions/admin.rs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::convert::identity;
22
use std::mem::size_of;
33

4+
use crate::math::amm::calculate_amm_available_liquidity;
45
use crate::msg;
56
use anchor_lang::prelude::*;
67
use anchor_spl::token::Token;
@@ -18,6 +19,7 @@ use crate::instructions::constraints::*;
1819
use crate::instructions::optional_accounts::{load_maps, AccountMaps};
1920
use crate::math::casting::Cast;
2021
use crate::math::constants::{
22+
AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO, AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO_I128,
2123
DEFAULT_LIQUIDATION_MARGIN_BUFFER_RATIO, FEE_POOL_TO_REVENUE_POOL_THRESHOLD,
2224
IF_FACTOR_PRECISION, INSURANCE_A_MAX, INSURANCE_B_MAX, INSURANCE_C_MAX,
2325
INSURANCE_SPECULATIVE_MAX, LIQUIDATION_FEE_PRECISION, MAX_CONCENTRATION_COEFFICIENT,
@@ -26,6 +28,7 @@ use crate::math::constants::{
2628
SPOT_WEIGHT_PRECISION, THIRTEEN_DAY, TWENTY_FOUR_HOUR,
2729
};
2830
use crate::math::cp_curve::get_update_k_result;
31+
use crate::math::helpers::get_proportion_u128;
2932
use crate::math::orders::is_multiple_of_step_size;
3033
use crate::math::repeg::get_total_fee_lower_bound;
3134
use crate::math::safe_math::SafeMath;
@@ -1574,6 +1577,102 @@ pub fn handle_recenter_perp_market_amm(
15741577
Ok(())
15751578
}
15761579

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+
15771676
#[derive(Debug, Clone, Copy, AnchorSerialize, AnchorDeserialize, PartialEq, Eq)]
15781677
pub struct UpdatePerpMarketSummaryStatsParams {
15791678
// new aggregate unsettled user stats

programs/drift/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,13 @@ pub mod drift {
10251025
handle_recenter_perp_market_amm(ctx, peg_multiplier, sqrt_k)
10261026
}
10271027

1028+
pub fn recenter_perp_market_amm_crank(
1029+
ctx: Context<AdminUpdatePerpMarketAmmSummaryStats>,
1030+
depth: Option<u128>,
1031+
) -> Result<()> {
1032+
handle_recenter_perp_market_amm_crank(ctx, depth)
1033+
}
1034+
10281035
pub fn update_perp_market_amm_summary_stats(
10291036
ctx: Context<AdminUpdatePerpMarketAmmSummaryStats>,
10301037
params: UpdatePerpMarketSummaryStatsParams,

sdk/src/adminClient.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,45 @@ export class AdminClient extends DriftClient {
789789
);
790790
}
791791

792+
public async recenterPerpMarketAmmCrank(
793+
perpMarketIndex: number,
794+
depth?: BN
795+
): Promise<TransactionSignature> {
796+
const recenterPerpMarketAmmIx = await this.getRecenterPerpMarketAmmCrankIx(
797+
perpMarketIndex,
798+
depth
799+
);
800+
801+
const tx = await this.buildTransaction(recenterPerpMarketAmmIx);
802+
803+
const { txSig } = await this.sendTransaction(tx, [], this.opts);
804+
805+
return txSig;
806+
}
807+
808+
public async getRecenterPerpMarketAmmCrankIx(
809+
perpMarketIndex: number,
810+
depth: BN
811+
): Promise<TransactionInstruction> {
812+
const marketPublicKey = await getPerpMarketPublicKey(
813+
this.program.programId,
814+
perpMarketIndex
815+
);
816+
817+
return await this.program.instruction.recenterPerpMarketAmmCrank(
818+
depth ?? null,
819+
{
820+
accounts: {
821+
state: await this.getStatePublicKey(),
822+
admin: this.useHotWalletAdmin
823+
? this.wallet.publicKey
824+
: this.getStateAccount().admin,
825+
perpMarket: marketPublicKey,
826+
},
827+
}
828+
);
829+
}
830+
792831
public async updatePerpMarketConcentrationScale(
793832
perpMarketIndex: number,
794833
concentrationScale: BN

sdk/src/idl/drift.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4646,6 +4646,44 @@
46464646
}
46474647
]
46484648
},
4649+
{
4650+
"name": "recenterPerpMarketAmmCrank",
4651+
"accounts": [
4652+
{
4653+
"name": "admin",
4654+
"isMut": false,
4655+
"isSigner": true
4656+
},
4657+
{
4658+
"name": "state",
4659+
"isMut": false,
4660+
"isSigner": false
4661+
},
4662+
{
4663+
"name": "perpMarket",
4664+
"isMut": true,
4665+
"isSigner": false
4666+
},
4667+
{
4668+
"name": "spotMarket",
4669+
"isMut": false,
4670+
"isSigner": false
4671+
},
4672+
{
4673+
"name": "oracle",
4674+
"isMut": false,
4675+
"isSigner": false
4676+
}
4677+
],
4678+
"args": [
4679+
{
4680+
"name": "depth",
4681+
"type": {
4682+
"option": "u128"
4683+
}
4684+
}
4685+
]
4686+
},
46494687
{
46504688
"name": "updatePerpMarketAmmSummaryStats",
46514689
"accounts": [

0 commit comments

Comments
 (0)