Merge pull request #224 from drift-labs/master

openbook + vamm threshold
This commit is contained in:
moosecat
2024-08-07 09:50:30 -07:00
committed by GitHub
5 changed files with 95 additions and 4 deletions

View File

@@ -33,7 +33,7 @@ require('dotenv').config();
const PERP_MAKRET_STALENESS_THRESHOLD = 30 * 60 * 1000; const PERP_MAKRET_STALENESS_THRESHOLD = 30 * 60 * 1000;
const SPOT_MAKRET_STALENESS_THRESHOLD = 60 * 60 * 1000; const SPOT_MAKRET_STALENESS_THRESHOLD = 60 * 60 * 1000;
const STALE_ORACLE_REMOVE_VAMM_THRESHOLD = 100; const STALE_ORACLE_REMOVE_VAMM_THRESHOLD = 10;
const PERP_MARKETS_TO_SKIP_SLOT_CHECK = const PERP_MARKETS_TO_SKIP_SLOT_CHECK =
process.env.PERP_MARKETS_TO_SKIP_SLOT_CHECK !== undefined process.env.PERP_MARKETS_TO_SKIP_SLOT_CHECK !== undefined
@@ -109,6 +109,7 @@ export class DLOBSubscriberIO extends DLOBSubscriber {
updateOnChange: false, updateOnChange: false,
fallbackL2Generators: [ fallbackL2Generators: [
config.spotMarketSubscribers[market.marketIndex].phoenix, config.spotMarketSubscribers[market.marketIndex].phoenix,
config.spotMarketSubscribers[market.marketIndex].openbook,
].filter((a) => !!a), ].filter((a) => !!a),
}); });
} }

View File

@@ -45,6 +45,7 @@ import {
validateDlobQuery, validateDlobQuery,
getAccountFromId, getAccountFromId,
getRawAccountFromId, getRawAccountFromId,
getOpenbookSubscriber,
} from './utils/utils'; } from './utils/utils';
import FEATURE_FLAGS from './utils/featureFlags'; import FEATURE_FLAGS from './utils/featureFlags';
import { getDLOBProviderFromOrderSubscriber } from './dlobProvider'; import { getDLOBProviderFromOrderSubscriber } from './dlobProvider';
@@ -144,6 +145,7 @@ const initializeAllMarketSubscribers = async (driftClient: DriftClient) => {
for (const market of sdkConfig.SPOT_MARKETS) { for (const market of sdkConfig.SPOT_MARKETS) {
markets[market.marketIndex] = { markets[market.marketIndex] = {
phoenix: undefined, phoenix: undefined,
openbook: undefined,
}; };
if (market.phoenixMarket) { if (market.phoenixMarket) {
@@ -177,6 +179,28 @@ const initializeAllMarketSubscribers = async (driftClient: DriftClient) => {
} }
} }
} }
if (market.openbookMarket) {
const openbookConfigAccount =
await driftClient.getOpenbookV2FulfillmentConfig(market.openbookMarket);
if (isVariant(openbookConfigAccount.status, 'enabled')) {
const openbookSubscriber = getOpenbookSubscriber(
driftClient,
market,
sdkConfig
);
await openbookSubscriber.subscribe();
try {
openbookSubscriber.getL2Asks();
openbookSubscriber.getL2Bids();
markets[market.marketIndex].openbook = openbookSubscriber;
} catch (e) {
logger.info(
`Excluding openbook for ${market.marketIndex}, error: ${e}`
);
}
}
}
} }
return markets; return markets;
@@ -633,6 +657,7 @@ const main = async (): Promise<void> => {
numVammOrders, numVammOrders,
includeVamm, includeVamm,
includePhoenix, includePhoenix,
includeOpenbook,
includeOracle, includeOracle,
} = req.query; } = req.query;
@@ -676,7 +701,11 @@ const main = async (): Promise<void> => {
} }
} }
} }
} else if (isSpot && `${includePhoenix}`?.toLowerCase() === 'true') { } else if (
isSpot &&
`${includePhoenix}`?.toLowerCase() === 'true' &&
`${includeOpenbook}`?.toLowerCase() === 'true'
) {
const redisClient = spotMarketRedisMap.get(normedMarketIndex).client; const redisClient = spotMarketRedisMap.get(normedMarketIndex).client;
const redisL2 = await redisClient.get( const redisL2 = await redisClient.get(
`last_update_orderbook_spot_${normedMarketIndex}` `last_update_orderbook_spot_${normedMarketIndex}`
@@ -720,6 +749,8 @@ const main = async (): Promise<void> => {
? [ ? [
`${includePhoenix}`.toLowerCase() === 'true' && `${includePhoenix}`.toLowerCase() === 'true' &&
MARKET_SUBSCRIBERS[normedMarketIndex].phoenix, MARKET_SUBSCRIBERS[normedMarketIndex].phoenix,
`${includeOpenbook}`.toLowerCase() === 'true' &&
MARKET_SUBSCRIBERS[normedMarketIndex].openbook,
].filter((a) => !!a) ].filter((a) => !!a)
: [], : [],
}); });
@@ -755,6 +786,7 @@ const main = async (): Promise<void> => {
depth, depth,
includeVamm, includeVamm,
includePhoenix, includePhoenix,
includeOpenbook,
includeOracle, includeOracle,
} = req.query; } = req.query;
@@ -765,6 +797,7 @@ const main = async (): Promise<void> => {
depth: depth as string | undefined, depth: depth as string | undefined,
includeVamm: includeVamm as string | undefined, includeVamm: includeVamm as string | undefined,
includePhoenix: includePhoenix as string | undefined, includePhoenix: includePhoenix as string | undefined,
includeOpenbook: includeOpenbook as string | undefined,
includeOracle: includeOracle as string | undefined, includeOracle: includeOracle as string | undefined,
}); });
@@ -831,7 +864,8 @@ const main = async (): Promise<void> => {
} }
} else if ( } else if (
isSpot && isSpot &&
normedParam['includePhoenix']?.toLowerCase() === 'true' normedParam['includePhoenix']?.toLowerCase() === 'true' &&
normedParam['includeOpenbook']?.toLowerCase() === 'true'
) { ) {
const redisClient = const redisClient =
spotMarketRedisMap.get(normedMarketIndex).client; spotMarketRedisMap.get(normedMarketIndex).client;
@@ -880,6 +914,8 @@ const main = async (): Promise<void> => {
? [ ? [
`${normedParam['includePhoenix']}`.toLowerCase() === 'true' && `${normedParam['includePhoenix']}`.toLowerCase() === 'true' &&
MARKET_SUBSCRIBERS[normedMarketIndex].phoenix, MARKET_SUBSCRIBERS[normedMarketIndex].phoenix,
`${normedParam['includeOpenbook']}`.toLowerCase() ===
'true' && MARKET_SUBSCRIBERS[normedMarketIndex].openbook,
].filter((a) => !!a) ].filter((a) => !!a)
: [], : [],
}); });

View File

@@ -22,7 +22,12 @@ import {
import { RedisClient, RedisClientPrefix } from '@drift/common'; import { RedisClient, RedisClientPrefix } from '@drift/common';
import { logger, setLogLevel } from '../utils/logger'; import { logger, setLogLevel } from '../utils/logger';
import { SubscriberLookup, parsePositiveIntArray, sleep } from '../utils/utils'; import {
SubscriberLookup,
getOpenbookSubscriber,
parsePositiveIntArray,
sleep,
} from '../utils/utils';
import { import {
DLOBSubscriberIO, DLOBSubscriberIO,
wsMarketInfo, wsMarketInfo,
@@ -233,6 +238,34 @@ const initializeAllMarketSubscribers = async (driftClient: DriftClient) => {
} }
} }
} }
if (marketConfig.openbookMarket) {
const openbookMarketAccount =
await driftClient.getOpenbookV2FulfillmentConfig(
marketConfig.openbookMarket
);
if (isVariant(openbookMarketAccount.status, 'enabled')) {
logger.info(
`Loading openbook subscriber for spot market ${market.marketIndex}`
);
const openbookSubscriber = getOpenbookSubscriber(
driftClient,
marketConfig,
sdkConfig
);
await openbookSubscriber.subscribe();
try {
openbookSubscriber.getL2Asks();
openbookSubscriber.getL2Bids();
markets[market.marketIndex].openbook = openbookSubscriber;
} catch (e) {
logger.info(
`Excluding openbook for ${market.marketIndex}, error: ${e}`
);
}
}
}
} }
return markets; return markets;

View File

@@ -212,6 +212,10 @@ const main = async () => {
pubkeysForMarket.push(market.phoenixMarket.toString()); pubkeysForMarket.push(market.phoenixMarket.toString());
} }
if (market.openbookMarket) {
pubkeysForMarket.push(market.openbookMarket.toString());
}
spotMarketPubkeys.push({ spotMarketPubkeys.push({
marketIndex: market.marketIndex, marketIndex: market.marketIndex,
pubkeys: pubkeysForMarket, pubkeys: pubkeysForMarket,

View File

@@ -4,6 +4,7 @@ import {
L2OrderBook, L2OrderBook,
L3OrderBook, L3OrderBook,
MarketType, MarketType,
OpenbookV2Subscriber,
OraclePriceData, OraclePriceData,
PerpMarkets, PerpMarkets,
PhoenixSubscriber, PhoenixSubscriber,
@@ -436,9 +437,25 @@ export const getSerumSubscriber = (
}); });
}; };
export const getOpenbookSubscriber = (
driftClient: DriftClient,
marketConfig: SpotMarketConfig,
sdkConfig
): OpenbookV2Subscriber => {
return new OpenbookV2Subscriber({
connection: driftClient.connection,
programId: new PublicKey(sdkConfig.OPENBOOK),
marketAddress: marketConfig.openbookMarket,
accountSubscription: {
type: 'websocket',
},
});
};
export type SubscriberLookup = { export type SubscriberLookup = {
[marketIndex: number]: { [marketIndex: number]: {
phoenix?: PhoenixSubscriber; phoenix?: PhoenixSubscriber;
serum?: SerumSubscriber; serum?: SerumSubscriber;
openbook?: OpenbookV2Subscriber;
}; };
}; };