Skip to content

Commit 7efab3e

Browse files
committed
merge
2 parents b41cd6e + 82feade commit 7efab3e

File tree

11 files changed

+501
-6
lines changed

11 files changed

+501
-6
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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use anchor_spl::associated_token::AssociatedToken;
33
use std::convert::identity;
44
use std::mem::size_of;
55

6-
use crate::math::amm::calculate_net_user_pnl;
6+
use crate::math::amm::{calculate_amm_available_liquidity, calculate_net_user_pnl};
77
use crate::msg;
88
use crate::state::lp_pool::{
99
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentCorrelations,
@@ -31,6 +31,7 @@ use crate::instructions::constraints::*;
3131
use crate::instructions::optional_accounts::{load_maps, AccountMaps};
3232
use crate::math::casting::Cast;
3333
use crate::math::constants::{
34+
AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO, AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO_I128,
3435
DEFAULT_LIQUIDATION_MARGIN_BUFFER_RATIO, FEE_POOL_TO_REVENUE_POOL_THRESHOLD,
3536
IF_FACTOR_PRECISION, INSURANCE_A_MAX, INSURANCE_B_MAX, INSURANCE_C_MAX,
3637
INSURANCE_SPECULATIVE_MAX, LIQUIDATION_FEE_PRECISION, MAX_CONCENTRATION_COEFFICIENT,
@@ -39,6 +40,7 @@ use crate::math::constants::{
3940
SPOT_IMF_PRECISION, SPOT_WEIGHT_PRECISION, THIRTEEN_DAY, TWENTY_FOUR_HOUR,
4041
};
4142
use crate::math::cp_curve::get_update_k_result;
43+
use crate::math::helpers::get_proportion_u128;
4244
use crate::math::orders::is_multiple_of_step_size;
4345
use crate::math::repeg::get_total_fee_lower_bound;
4446
use crate::math::safe_math::SafeMath;
@@ -1666,6 +1668,102 @@ pub fn handle_recenter_perp_market_amm(
16661668
Ok(())
16671669
}
16681670

1671+
#[access_control(
1672+
perp_market_valid(&ctx.accounts.perp_market)
1673+
)]
1674+
pub fn handle_recenter_perp_market_amm_crank(
1675+
ctx: Context<AdminUpdatePerpMarketAmmSummaryStats>,
1676+
depth: Option<u128>,
1677+
) -> Result<()> {
1678+
let perp_market = &mut load_mut!(ctx.accounts.perp_market)?;
1679+
let spot_market = &mut load!(ctx.accounts.spot_market)?;
1680+
1681+
let clock = Clock::get()?;
1682+
let price_oracle = &ctx.accounts.oracle;
1683+
1684+
let OraclePriceData {
1685+
price: oracle_price,
1686+
..
1687+
} = get_oracle_price(&perp_market.amm.oracle_source, price_oracle, clock.slot)?;
1688+
1689+
msg!(
1690+
"recentering amm crank for perp market {}",
1691+
perp_market.market_index
1692+
);
1693+
1694+
let base_asset_reserve_before = perp_market.amm.base_asset_reserve;
1695+
let quote_asset_reserve_before = perp_market.amm.quote_asset_reserve;
1696+
let sqrt_k_before = perp_market.amm.sqrt_k;
1697+
let peg_multiplier_before = perp_market.amm.peg_multiplier;
1698+
let max_base_asset_reserve_before = perp_market.amm.max_base_asset_reserve;
1699+
let min_base_asset_reserve_before = perp_market.amm.min_base_asset_reserve;
1700+
1701+
let mut sqrt_k = sqrt_k_before;
1702+
let peg_multiplier: u128 = oracle_price.cast()?;
1703+
let (max_bids_before, max_asks_before) =
1704+
amm::calculate_market_open_bids_asks(&perp_market.amm)?;
1705+
1706+
if let Some(depth) = depth {
1707+
let base_depth = max_bids_before
1708+
.safe_add(max_asks_before.abs())?
1709+
.safe_div(2)?
1710+
.unsigned_abs();
1711+
let quote_depth = base_depth
1712+
.safe_mul(peg_multiplier)?
1713+
.safe_div(AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO)?;
1714+
sqrt_k = get_proportion_u128(sqrt_k, depth, quote_depth)?;
1715+
}
1716+
1717+
controller::amm::recenter_perp_market_amm(perp_market, peg_multiplier, sqrt_k)?;
1718+
validate_perp_market(perp_market)?;
1719+
1720+
let base_asset_reserve_after = perp_market.amm.base_asset_reserve;
1721+
let quote_asset_reserve_after = perp_market.amm.quote_asset_reserve;
1722+
let sqrt_k_after = perp_market.amm.sqrt_k;
1723+
let peg_multiplier_after = perp_market.amm.peg_multiplier;
1724+
let max_base_asset_reserve_after = perp_market.amm.max_base_asset_reserve;
1725+
let min_base_asset_reserve_after = perp_market.amm.min_base_asset_reserve;
1726+
1727+
msg!(
1728+
"base_asset_reserve {} -> {}",
1729+
base_asset_reserve_before,
1730+
base_asset_reserve_after
1731+
);
1732+
1733+
msg!(
1734+
"quote_asset_reserve {} -> {}",
1735+
quote_asset_reserve_before,
1736+
quote_asset_reserve_after
1737+
);
1738+
1739+
msg!("sqrt_k {} -> {}", sqrt_k_before, sqrt_k_after);
1740+
1741+
msg!(
1742+
"peg_multiplier {} -> {}",
1743+
peg_multiplier_before,
1744+
peg_multiplier_after
1745+
);
1746+
1747+
msg!(
1748+
"max_base_asset_reserve {} -> {}",
1749+
max_base_asset_reserve_before,
1750+
max_base_asset_reserve_after
1751+
);
1752+
1753+
msg!(
1754+
"min_base_asset_reserve {} -> {}",
1755+
min_base_asset_reserve_before,
1756+
min_base_asset_reserve_after
1757+
);
1758+
1759+
let (max_bids_after, max_asks_after) = amm::calculate_market_open_bids_asks(&perp_market.amm)?;
1760+
1761+
msg!("max_bids {} -> {}", max_bids_before, max_bids_after);
1762+
1763+
msg!("max_asks {} -> {}", max_asks_before, max_asks_after);
1764+
Ok(())
1765+
}
1766+
16691767
#[derive(Debug, Clone, Copy, AnchorSerialize, AnchorDeserialize, PartialEq, Eq)]
16701768
pub struct UpdatePerpMarketSummaryStatsParams {
16711769
// new aggregate unsettled user stats

programs/drift/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,13 @@ pub mod drift {
10371037
handle_recenter_perp_market_amm(ctx, peg_multiplier, sqrt_k)
10381038
}
10391039

1040+
pub fn recenter_perp_market_amm_crank(
1041+
ctx: Context<AdminUpdatePerpMarketAmmSummaryStats>,
1042+
depth: Option<u128>,
1043+
) -> Result<()> {
1044+
handle_recenter_perp_market_amm_crank(ctx, depth)
1045+
}
1046+
10401047
pub fn update_perp_market_amm_summary_stats(
10411048
ctx: Context<AdminUpdatePerpMarketAmmSummaryStats>,
10421049
params: UpdatePerpMarketSummaryStatsParams,

sdk/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.126.0-beta.6
1+
2.126.0-beta.8

sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@drift-labs/sdk",
3-
"version": "2.126.0-beta.6",
3+
"version": "2.126.0-beta.8",
44
"main": "lib/node/index.js",
55
"types": "lib/node/index.d.ts",
66
"browser": "./lib/browser/index.js",

sdk/src/adminClient.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,45 @@ export class AdminClient extends DriftClient {
891891
);
892892
}
893893

894+
public async recenterPerpMarketAmmCrank(
895+
perpMarketIndex: number,
896+
depth?: BN
897+
): Promise<TransactionSignature> {
898+
const recenterPerpMarketAmmIx = await this.getRecenterPerpMarketAmmCrankIx(
899+
perpMarketIndex,
900+
depth
901+
);
902+
903+
const tx = await this.buildTransaction(recenterPerpMarketAmmIx);
904+
905+
const { txSig } = await this.sendTransaction(tx, [], this.opts);
906+
907+
return txSig;
908+
}
909+
910+
public async getRecenterPerpMarketAmmCrankIx(
911+
perpMarketIndex: number,
912+
depth: BN
913+
): Promise<TransactionInstruction> {
914+
const marketPublicKey = await getPerpMarketPublicKey(
915+
this.program.programId,
916+
perpMarketIndex
917+
);
918+
919+
return await this.program.instruction.recenterPerpMarketAmmCrank(
920+
depth ?? null,
921+
{
922+
accounts: {
923+
state: await this.getStatePublicKey(),
924+
admin: this.useHotWalletAdmin
925+
? this.wallet.publicKey
926+
: this.getStateAccount().admin,
927+
perpMarket: marketPublicKey,
928+
},
929+
}
930+
);
931+
}
932+
894933
public async updatePerpMarketConcentrationScale(
895934
perpMarketIndex: number,
896935
concentrationScale: BN

sdk/src/dlob/DLOB.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,10 @@ export class DLOB {
989989
const generatorList = [
990990
orderLists.market.bid.getGenerator(),
991991
orderLists.takingLimit.bid.getGenerator(),
992-
orderLists.signedMsg.bid.getGenerator(),
992+
this.signedMsgGenerator(
993+
orderLists.signedMsg.bid,
994+
(x: DLOBNode) => !isRestingLimitOrder(x.order, slot)
995+
),
993996
];
994997

995998
yield* this.getBestNode(
@@ -1021,7 +1024,10 @@ export class DLOB {
10211024
const generatorList = [
10221025
orderLists.market.ask.getGenerator(),
10231026
orderLists.takingLimit.ask.getGenerator(),
1024-
orderLists.signedMsg.ask.getGenerator(),
1027+
this.signedMsgGenerator(
1028+
orderLists.signedMsg.ask,
1029+
(x: DLOBNode) => !isRestingLimitOrder(x.order, slot)
1030+
),
10251031
];
10261032

10271033
yield* this.getBestNode(
@@ -1035,6 +1041,17 @@ export class DLOB {
10351041
);
10361042
}
10371043

1044+
protected *signedMsgGenerator(
1045+
signedMsgOrderList: NodeList<'signedMsg'>,
1046+
filter: (x: DLOBNode) => boolean
1047+
): Generator<DLOBNode> {
1048+
for (const signedMsgOrder of signedMsgOrderList.getGenerator()) {
1049+
if (filter(signedMsgOrder)) {
1050+
yield signedMsgOrder;
1051+
}
1052+
}
1053+
}
1054+
10381055
protected *getBestNode(
10391056
generatorList: Array<Generator<DLOBNode>>,
10401057
oraclePriceData: OraclePriceData,
@@ -1119,6 +1136,9 @@ export class DLOB {
11191136
nodeLists.restingLimit.ask.getGenerator(),
11201137
nodeLists.floatingLimit.ask.getGenerator(),
11211138
nodeLists.protectedFloatingLimit.ask.getGenerator(),
1139+
this.signedMsgGenerator(nodeLists.signedMsg.ask, (x: DLOBNode) =>
1140+
isRestingLimitOrder(x.order, slot)
1141+
),
11221142
];
11231143

11241144
yield* this.getBestNode(
@@ -1158,6 +1178,9 @@ export class DLOB {
11581178
nodeLists.restingLimit.bid.getGenerator(),
11591179
nodeLists.floatingLimit.bid.getGenerator(),
11601180
nodeLists.protectedFloatingLimit.bid.getGenerator(),
1181+
this.signedMsgGenerator(nodeLists.signedMsg.bid, (x: DLOBNode) =>
1182+
isRestingLimitOrder(x.order, slot)
1183+
),
11611184
];
11621185

11631186
yield* this.getBestNode(

sdk/src/idl/drift.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4703,6 +4703,44 @@
47034703
}
47044704
]
47054705
},
4706+
{
4707+
"name": "recenterPerpMarketAmmCrank",
4708+
"accounts": [
4709+
{
4710+
"name": "admin",
4711+
"isMut": false,
4712+
"isSigner": true
4713+
},
4714+
{
4715+
"name": "state",
4716+
"isMut": false,
4717+
"isSigner": false
4718+
},
4719+
{
4720+
"name": "perpMarket",
4721+
"isMut": true,
4722+
"isSigner": false
4723+
},
4724+
{
4725+
"name": "spotMarket",
4726+
"isMut": false,
4727+
"isSigner": false
4728+
},
4729+
{
4730+
"name": "oracle",
4731+
"isMut": false,
4732+
"isSigner": false
4733+
}
4734+
],
4735+
"args": [
4736+
{
4737+
"name": "depth",
4738+
"type": {
4739+
"option": "u128"
4740+
}
4741+
}
4742+
]
4743+
},
47064744
{
47074745
"name": "updatePerpMarketAmmSummaryStats",
47084746
"accounts": [

sdk/tests/dlob/helpers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ export const mockAMM: AMM = {
149149

150150
takerSpeedBumpOverride: 0,
151151
ammSpreadAdjustment: 0,
152+
ammInventorySpreadAdjustment: 0,
152153
};
153154

154155
export const mockPerpMarkets: Array<PerpMarketAccount> = [

0 commit comments

Comments
 (0)