take in perp and spot markets from env var
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user