take in perp and spot markets from env var

This commit is contained in:
wphan
2023-12-23 15:11:52 -08:00
parent 0046ece61f
commit 70d9227b6c

View File

@@ -14,6 +14,8 @@ import {
DriftClientSubscriptionConfig, DriftClientSubscriptionConfig,
SlotSubscriber, SlotSubscriber,
isVariant, isVariant,
OracleInfo,
PerpMarketConfig,
} from '@drift-labs/sdk'; } from '@drift-labs/sdk';
import { logger, setLogLevel } from '../utils/logger'; import { logger, setLogLevel } from '../utils/logger';
@@ -64,6 +66,16 @@ const ORDERBOOK_UPDATE_INTERVAL =
parseInt(process.env.ORDERBOOK_UPDATE_INTERVAL) || 1000; parseInt(process.env.ORDERBOOK_UPDATE_INTERVAL) || 1000;
const WS_FALLBACK_FETCH_INTERVAL = 10_000; const WS_FALLBACK_FETCH_INTERVAL = 10_000;
// comma separated list of perp market indexes to load: i.e. 0,1,2,3
const PERP_MARKETS_TO_LOAD = process.env.PERP_MARKETS_TO_LOAD
? process.env.PERP_MARKETS_TO_LOAD.split(',').map((m) => parseInt(m))
: undefined;
// comma separated list of spot market indexes to load: i.e. 0,1,2,3
const SPOT_MARKETS_TO_LOAD = process.env.SPOT_MARKETS_TO_LOAD
? process.env.SPOT_MARKETS_TO_LOAD.split(',').map((m) => parseInt(m))
: undefined;
logger.info(`RPC endpoint: ${endpoint}`); logger.info(`RPC endpoint: ${endpoint}`);
logger.info(`WS endpoint: ${wsEndpoint}`); logger.info(`WS endpoint: ${wsEndpoint}`);
logger.info(`DriftEnv: ${driftEnv}`); logger.info(`DriftEnv: ${driftEnv}`);
@@ -71,22 +83,89 @@ logger.info(`Commit: ${commitHash}`);
let MARKET_SUBSCRIBERS: SubscriberLookup = {}; let MARKET_SUBSCRIBERS: SubscriberLookup = {};
const getMarketsAndOraclesToLoad = (
sdkConfig: any
): {
perpMarketIndexes?: number[];
spotMarketIndexes?: number[];
oracleInfos?: OracleInfo[];
} => {
const oracleInfos: OracleInfo[] = [];
const oraclesTracked = new Set();
let perpMarketIndexes: number[] = [];
let spotMarketIndexes: number[] = [];
if (PERP_MARKETS_TO_LOAD!.length > 0) {
perpMarketIndexes = PERP_MARKETS_TO_LOAD;
logger.info(`DlobPublisher tracking perp markets: ${perpMarketIndexes}`);
for (const idx of perpMarketIndexes) {
const perpMarketConfig = sdkConfig.PERP_MARKETS[idx] as PerpMarketConfig;
if (!perpMarketConfig) {
throw new Error(`Perp market config for ${idx} not found`);
}
const oracleKey = perpMarketConfig.oracle.toBase58();
if (!oraclesTracked.has(oracleKey)) {
logger.info(`Tracking oracle ${oracleKey} for perp market ${idx}`);
oracleInfos.push({
publicKey: perpMarketConfig.oracle,
source: perpMarketConfig.oracleSource,
});
oraclesTracked.add(oracleKey);
}
}
}
if (SPOT_MARKETS_TO_LOAD!.length > 0) {
spotMarketIndexes = SPOT_MARKETS_TO_LOAD;
logger.info(`DlobPublisher tracking spot markets: ${spotMarketIndexes}`);
for (const idx of spotMarketIndexes) {
const spotMarketConfig = sdkConfig.PERP_MARKETS[idx] as PerpMarketConfig;
if (!spotMarketConfig) {
throw new Error(`Spot market config for ${idx} not found`);
}
const oracleKey = spotMarketConfig.oracle.toBase58();
if (!oraclesTracked.has(oracleKey)) {
logger.info(`Tracking oracle ${oracleKey} for spot market ${idx}`);
oracleInfos.push({
publicKey: spotMarketConfig.oracle,
source: spotMarketConfig.oracleSource,
});
oraclesTracked.add(oracleKey);
}
}
}
return {
perpMarketIndexes,
spotMarketIndexes,
oracleInfos,
};
};
const initializeAllMarketSubscribers = async (driftClient: DriftClient) => { const initializeAllMarketSubscribers = async (driftClient: DriftClient) => {
const markets: SubscriberLookup = {}; const markets: SubscriberLookup = {};
for (const market of sdkConfig.SPOT_MARKETS) { for (const market of driftClient.getSpotMarketAccounts()) {
markets[market.marketIndex] = { markets[market.marketIndex] = {
phoenix: undefined, phoenix: undefined,
serum: undefined, serum: undefined,
}; };
const marketConfig = sdkConfig.SPOT_MARKETS[market.marketIndex];
if (market.phoenixMarket) { if (marketConfig.phoenixMarket) {
const phoenixConfigAccount = const phoenixConfigAccount =
await driftClient.getPhoenixV1FulfillmentConfig(market.phoenixMarket); await driftClient.getPhoenixV1FulfillmentConfig(
marketConfig.phoenixMarket
);
if (isVariant(phoenixConfigAccount.status, 'enabled')) { if (isVariant(phoenixConfigAccount.status, 'enabled')) {
logger.info(
`Loading phoenix subscriber for spot market ${market.marketIndex}`
);
const phoenixSubscriber = getPhoenixSubscriber( const phoenixSubscriber = getPhoenixSubscriber(
driftClient, driftClient,
market, marketConfig,
sdkConfig sdkConfig
); );
await phoenixSubscriber.subscribe(); await phoenixSubscriber.subscribe();
@@ -103,14 +182,17 @@ const initializeAllMarketSubscribers = async (driftClient: DriftClient) => {
} }
} }
if (market.serumMarket) { if (marketConfig.serumMarket) {
const serumConfigAccount = await driftClient.getSerumV3FulfillmentConfig( const serumConfigAccount = await driftClient.getSerumV3FulfillmentConfig(
market.serumMarket marketConfig.serumMarket
); );
if (isVariant(serumConfigAccount.status, 'enabled')) { if (isVariant(serumConfigAccount.status, 'enabled')) {
logger.info(
`Loading serum subscriber for spot market ${market.marketIndex}`
);
const serumSubscriber = getSerumSubscriber( const serumSubscriber = getSerumSubscriber(
driftClient, driftClient,
market, marketConfig,
sdkConfig sdkConfig
); );
await serumSubscriber.subscribe(); await serumSubscriber.subscribe();
@@ -177,12 +259,17 @@ const main = async () => {
}; };
} }
const { perpMarketIndexes, spotMarketIndexes, oracleInfos } =
getMarketsAndOraclesToLoad(sdkConfig);
driftClient = new DriftClient({ driftClient = new DriftClient({
connection, connection,
wallet, wallet,
programID: clearingHousePublicKey, programID: clearingHousePublicKey,
accountSubscription, accountSubscription,
env: driftEnv, env: driftEnv,
perpMarketIndexes,
spotMarketIndexes,
oracleInfos,
}); });
const lamportsBalance = await connection.getBalance(wallet.publicKey); const lamportsBalance = await connection.getBalance(wallet.publicKey);