Skip to content

Commit 571c731

Browse files
committed
add constituent map memcmp and lp status on cache
1 parent ead4f44 commit 571c731

File tree

8 files changed

+79
-20
lines changed

8 files changed

+79
-20
lines changed

programs/drift/src/instructions/admin.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4233,16 +4233,6 @@ pub fn handle_update_perp_market_protected_maker_params(
42334233
Ok(())
42344234
}
42354235

4236-
pub fn handle_update_perp_market_lp_pool_status(
4237-
ctx: Context<AdminUpdatePerpMarket>,
4238-
lp_status: u8,
4239-
) -> Result<()> {
4240-
let perp_market = &mut load_mut!(ctx.accounts.perp_market)?;
4241-
msg!("perp market {}", perp_market.market_index);
4242-
perp_market.lp_status = lp_status;
4243-
Ok(())
4244-
}
4245-
42464236
pub fn handle_update_perp_market_lp_pool_paused_operations(
42474237
ctx: Context<AdminUpdatePerpMarket>,
42484238
lp_paused_operations: u8,

programs/drift/src/instructions/lp_admin.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
use crate::controller;
1+
use crate::{controller, load_mut};
22
use crate::controller::token::{receive, send_from_program_vault_with_signature_seeds};
33
use crate::error::ErrorCode;
44
use crate::ids::{admin_hot_wallet, lp_pool_swap_wallet};
55
use crate::instructions::optional_accounts::get_token_mint;
66
use crate::math::constants::{PRICE_PRECISION_U64, QUOTE_SPOT_MARKET_INDEX};
77
use crate::math::safe_math::SafeMath;
8+
use crate::state::amm_cache::AmmCache;
89
use crate::state::lp_pool::{
910
AmmConstituentDatum, AmmConstituentMapping, Constituent, ConstituentCorrelations,
1011
ConstituentTargetBase, LPPool, TargetsDatum, AMM_MAP_PDA_SEED,
1112
CONSTITUENT_CORRELATIONS_PDA_SEED, CONSTITUENT_PDA_SEED, CONSTITUENT_TARGET_BASE_PDA_SEED,
1213
CONSTITUENT_VAULT_PDA_SEED,
1314
};
15+
use crate::state::perp_market::PerpMarket;
1416
use crate::state::spot_market::SpotMarket;
1517
use crate::state::state::State;
1618
use crate::validate;
@@ -880,6 +882,20 @@ pub fn handle_end_lp_swap<'c: 'info, 'info>(
880882
Ok(())
881883
}
882884

885+
pub fn handle_update_perp_market_lp_pool_status(
886+
ctx: Context<UpdatePerpMarketLpPoolStatus>,
887+
lp_status: u8,
888+
) -> Result<()> {
889+
let perp_market = &mut load_mut!(ctx.accounts.perp_market)?;
890+
let amm_cache = &mut ctx.accounts.amm_cache;
891+
892+
msg!("perp market {}", perp_market.market_index);
893+
perp_market.lp_status = lp_status;
894+
amm_cache.update_perp_market_fields(&perp_market)?;
895+
896+
Ok(())
897+
}
898+
883899
#[derive(Accounts)]
884900
#[instruction(
885901
name: [u8; 32],
@@ -1226,3 +1242,16 @@ pub struct LPTakerSwap<'info> {
12261242
pub instructions: UncheckedAccount<'info>,
12271243
pub token_program: Interface<'info, TokenInterface>,
12281244
}
1245+
1246+
#[derive(Accounts)]
1247+
pub struct UpdatePerpMarketLpPoolStatus<'info> {
1248+
pub admin: Signer<'info>,
1249+
#[account(
1250+
has_one = admin
1251+
)]
1252+
pub state: Box<Account<'info, State>>,
1253+
#[account(mut)]
1254+
pub perp_market: AccountLoader<'info, PerpMarket>,
1255+
#[account(mut)]
1256+
pub amm_cache: Box<Account<'info, AmmCache>>,
1257+
}

programs/drift/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ pub mod drift {
10771077
}
10781078

10791079
pub fn update_perp_market_lp_pool_status(
1080-
ctx: Context<AdminUpdatePerpMarket>,
1080+
ctx: Context<UpdatePerpMarketLpPoolStatus>,
10811081
lp_status: u8,
10821082
) -> Result<()> {
10831083
handle_update_perp_market_lp_pool_status(ctx, lp_status)

programs/drift/src/state/amm_cache.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ pub struct CacheInfo {
5454
pub oracle_slot: u64,
5555
pub oracle_source: u8,
5656
pub oracle_validity: u8,
57-
pub _padding: [u8; 14],
57+
pub lp_status_for_perp_market: u8,
58+
pub _padding: [u8; 13],
5859
}
5960

6061
impl Size for CacheInfo {
@@ -80,7 +81,8 @@ impl Default for CacheInfo {
8081
last_settle_amm_ex_fees: 0u128,
8182
oracle_source: 0u8,
8283
quote_owed_from_lp_pool: 0i64,
83-
_padding: [0u8; 14],
84+
lp_status_for_perp_market: 0u8,
85+
_padding: [0u8; 13],
8486
}
8587
}
8688
}
@@ -110,6 +112,7 @@ impl CacheInfo {
110112
.amm
111113
.get_protocol_owned_position()?
112114
.safe_mul(-1)?;
115+
self.lp_status_for_perp_market = perp_market.lp_status;
113116
Ok(())
114117
}
115118

sdk/src/adminClient.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,7 @@ export class AdminClient extends DriftClient {
10571057
this.program.programId,
10581058
perpMarketIndex
10591059
),
1060+
ammCache: getAmmCachePublicKey(this.program.programId),
10601061
},
10611062
}
10621063
);

sdk/src/constituentMap/constituentMap.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ import { ConstituentAccount } from '../types';
1010
import { PollingConstituentAccountSubscriber } from './pollingConstituentAccountSubscriber';
1111
import { WebSocketConstituentAccountSubscriber } from './webSocketConstituentAccountSubscriber';
1212
import { DriftClient } from '../driftClient';
13-
import { getConstituentFilter } from '../memcmp';
13+
import { getConstituentFilter, getConstituentLpPoolFilter } from '../memcmp';
1414
import { ZSTDDecoder } from 'zstddec';
15+
import { encodeName } from '../userName';
16+
import { getLpPoolPublicKey } from '../addresses/pda';
1517

1618
const MAX_CONSTITUENT_SIZE_BYTES = 304; // TODO: update this when account is finalized
1719

20+
const LP_POOL_NAME = 'test lp pool 2';
21+
1822
export type ConstituentMapConfig = {
1923
driftClient: DriftClient;
2024
connection?: Connection;
@@ -30,6 +34,7 @@ export type ConstituentMapConfig = {
3034
logResubMessages?: boolean;
3135
commitment?: Commitment;
3236
};
37+
lpPoolName?: string;
3338
// potentially use these to filter Constituent accounts
3439
additionalFilters?: MemcmpFilter[];
3540
};
@@ -62,11 +67,14 @@ export class ConstituentMap implements ConstituentMapInterface {
6267
private constituentIndexToKeyMap = new Map<number, string>();
6368
private spotMarketIndexToKeyMap = new Map<number, string>();
6469

70+
private lpPoolName: string;
71+
6572
constructor(config: ConstituentMapConfig) {
6673
this.driftClient = config.driftClient;
6774
this.additionalFilters = config.additionalFilters;
6875
this.commitment = config.subscriptionConfig.commitment;
6976
this.connection = config.connection || this.driftClient.connection;
77+
this.lpPoolName = config.lpPoolName ?? LP_POOL_NAME;
7078

7179
if (config.subscriptionConfig.type === 'polling') {
7280
this.constituentAccountSubscriber =
@@ -75,7 +83,7 @@ export class ConstituentMap implements ConstituentMapInterface {
7583
this.driftClient.program,
7684
config.subscriptionConfig.frequency,
7785
config.subscriptionConfig.commitment,
78-
config.additionalFilters
86+
this.getFilters()
7987
);
8088
} else if (config.subscriptionConfig.type === 'websocket') {
8189
this.constituentAccountSubscriber =
@@ -84,7 +92,7 @@ export class ConstituentMap implements ConstituentMapInterface {
8492
this.driftClient.program,
8593
config.subscriptionConfig.resubTimeoutMs,
8694
config.subscriptionConfig.commitment,
87-
config.additionalFilters
95+
this.getFilters()
8896
);
8997
}
9098

@@ -98,7 +106,15 @@ export class ConstituentMap implements ConstituentMapInterface {
98106
}
99107

100108
private getFilters(): MemcmpFilter[] {
101-
const filters = [getConstituentFilter()];
109+
const filters = [
110+
getConstituentFilter(),
111+
getConstituentLpPoolFilter(
112+
getLpPoolPublicKey(
113+
this.driftClient.program.programId,
114+
encodeName(this.lpPoolName)
115+
)
116+
),
117+
];
102118
if (this.additionalFilters) {
103119
filters.push(...this.additionalFilters);
104120
}

sdk/src/idl/drift.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4773,6 +4773,11 @@
47734773
"name": "perpMarket",
47744774
"isMut": true,
47754775
"isSigner": false
4776+
},
4777+
{
4778+
"name": "ammCache",
4779+
"isMut": true,
4780+
"isSigner": false
47764781
}
47774782
],
47784783
"args": [
@@ -12000,12 +12005,16 @@
1200012005
"name": "oracleValidity",
1200112006
"type": "u8"
1200212007
},
12008+
{
12009+
"name": "lpStatusForPerpMarket",
12010+
"type": "u8"
12011+
},
1200312012
{
1200412013
"name": "padding",
1200512014
"type": {
1200612015
"array": [
1200712016
"u8",
12008-
14
12017+
13
1200912018
]
1201012019
}
1201112020
}

sdk/src/memcmp.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MemcmpFilter } from '@solana/web3.js';
1+
import { MemcmpFilter, PublicKey } from '@solana/web3.js';
22
import bs58 from 'bs58';
33
import { BorshAccountsCoder } from '@coral-xyz/anchor';
44
import { encodeName } from './userName';
@@ -140,3 +140,14 @@ export function getConstituentFilter(): MemcmpFilter {
140140
},
141141
};
142142
}
143+
144+
export function getConstituentLpPoolFilter(
145+
lpPoolPublicKey: PublicKey
146+
): MemcmpFilter {
147+
return {
148+
memcmp: {
149+
offset: 72,
150+
bytes: lpPoolPublicKey.toBase58(),
151+
},
152+
};
153+
}

0 commit comments

Comments
 (0)