/// import { NodeList } from './NodeList'; import { BN, DLOBNode, DLOBNodeType, DriftClient, MarketType, MarketTypeStr, OraclePriceData, Order, OrderActionRecord, OrderRecord, PerpMarketAccount, PositionDirection, SlotSubscriber, SpotMarketAccount, StateAccount, TriggerOrderNode, UserMap } from '..'; import { PublicKey } from '@solana/web3.js'; import { DLOBOrders } from './DLOBOrders'; import { L2OrderBook, L2OrderBookGenerator, L3OrderBook } from './orderBookLevels'; export type MarketNodeLists = { restingLimit: { ask: NodeList<'restingLimit'>; bid: NodeList<'restingLimit'>; }; floatingLimit: { ask: NodeList<'floatingLimit'>; bid: NodeList<'floatingLimit'>; }; takingLimit: { ask: NodeList<'takingLimit'>; bid: NodeList<'takingLimit'>; }; market: { ask: NodeList<'market'>; bid: NodeList<'market'>; }; trigger: { above: NodeList<'trigger'>; below: NodeList<'trigger'>; }; }; type OrderBookCallback = () => void; /** * Receives a DLOBNode and is expected to return true if the node should * be taken into account when generating, or false otherwise. * * Currently used in getRestingLimitBids and getRestingLimitAsks. */ export type DLOBFilterFcn = (node: DLOBNode) => boolean; export type NodeToFill = { node: DLOBNode; makerNodes: DLOBNode[]; }; export type NodeToTrigger = { node: TriggerOrderNode; }; export declare class DLOB { openOrders: Map>; orderLists: Map>; maxSlotForRestingLimitOrders: number; initialized: boolean; constructor(); private init; clear(): void; /** * initializes a new DLOB instance * * @returns a promise that resolves when the DLOB is initialized */ initFromUserMap(userMap: UserMap, slot: number): Promise; initFromOrders(dlobOrders: DLOBOrders, slot: number): boolean; handleOrderRecord(record: OrderRecord, slot: number): void; handleOrderActionRecord(record: OrderActionRecord, slot: number): void; insertOrder(order: Order, userAccount: string, slot: number, onInsert?: OrderBookCallback): void; addOrderList(marketType: MarketTypeStr, marketIndex: number): void; updateOrder(order: Order, userAccount: PublicKey, slot: number, cumulativeBaseAssetAmountFilled: BN, onUpdate?: OrderBookCallback): void; trigger(order: Order, userAccount: PublicKey, slot: number, onTrigger?: OrderBookCallback): void; delete(order: Order, userAccount: PublicKey, slot: number, onDelete?: OrderBookCallback): void; getListForOrder(order: Order, slot: number): NodeList | undefined; updateRestingLimitOrders(slot: number): void; updateRestingLimitOrdersForMarketType(slot: number, marketTypeStr: MarketTypeStr): void; getOrder(orderId: number, userAccount: PublicKey): Order | undefined; findNodesToFill(marketIndex: number, fallbackBid: BN | undefined, fallbackAsk: BN | undefined, slot: number, ts: number, marketType: MarketType, oraclePriceData: OraclePriceData, stateAccount: StateAccount, marketAccount: PerpMarketAccount | SpotMarketAccount): NodeToFill[]; getMakerRebate(marketType: MarketType, stateAccount: StateAccount, marketAccount: PerpMarketAccount | SpotMarketAccount): { makerRebateNumerator: number; makerRebateDenominator: number; }; mergeNodesToFill(restingLimitOrderNodesToFill: NodeToFill[], takingOrderNodesToFill: NodeToFill[]): NodeToFill[]; findRestingLimitOrderNodesToFill(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, isAmmPaused: boolean, minAuctionDuration: number, makerRebateNumerator: number, makerRebateDenominator: number, fallbackAsk: BN | undefined, fallbackBid: BN | undefined): NodeToFill[]; findTakingNodesToFill(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, isAmmPaused: boolean, minAuctionDuration: number, fallbackAsk: BN | undefined, fallbackBid?: BN | undefined): NodeToFill[]; findTakingNodesCrossingMakerNodes(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, takerNodeGenerator: Generator, makerNodeGeneratorFn: (marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData) => Generator, doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean): NodeToFill[]; findNodesCrossingFallbackLiquidity(marketType: MarketType, slot: number, oraclePriceData: OraclePriceData, nodeGenerator: Generator, doesCross: (nodePrice: BN | undefined) => boolean, minAuctionDuration: number): NodeToFill[]; findExpiredNodesToFill(marketIndex: number, ts: number, marketType: MarketType): NodeToFill[]; findJitAuctionNodesToFill(marketIndex: number, slot: number, oraclePriceData: OraclePriceData, marketType: MarketType): NodeToFill[]; getTakingBids(marketIndex: number, marketType: MarketType, slot: number, oraclePriceData: OraclePriceData): Generator; getTakingAsks(marketIndex: number, marketType: MarketType, slot: number, oraclePriceData: OraclePriceData): Generator; private getBestNode; getRestingLimitAsks(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, filterFcn?: DLOBFilterFcn): Generator; getRestingLimitBids(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, filterFcn?: DLOBFilterFcn): Generator; getAsks(marketIndex: number, fallbackAsk: BN | undefined, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData): Generator; getBids(marketIndex: number, fallbackBid: BN | undefined, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData): Generator; findCrossingRestingLimitOrders(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData): NodeToFill[]; determineMakerAndTaker(askNode: DLOBNode, bidNode: DLOBNode): { takerNode: DLOBNode; makerNode: DLOBNode; } | undefined; getBestAsk(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData): BN | undefined; getBestBid(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData): BN | undefined; getStopLosses(marketIndex: number, marketType: MarketType, direction: PositionDirection): Generator; getStopLossMarkets(marketIndex: number, marketType: MarketType, direction: PositionDirection): Generator; getStopLossLimits(marketIndex: number, marketType: MarketType, direction: PositionDirection): Generator; getTakeProfits(marketIndex: number, marketType: MarketType, direction: PositionDirection): Generator; getTakeProfitMarkets(marketIndex: number, marketType: MarketType, direction: PositionDirection): Generator; getTakeProfitLimits(marketIndex: number, marketType: MarketType, direction: PositionDirection): Generator; findNodesToTrigger(marketIndex: number, slot: number, oraclePrice: BN, marketType: MarketType, stateAccount: StateAccount): NodeToTrigger[]; printTop(driftClient: DriftClient, slotSubscriber: SlotSubscriber, marketIndex: number, marketType: MarketType): void; getDLOBOrders(): DLOBOrders; getNodeLists(): Generator>; /** * Get an L2 view of the order book for a given market. * * @param marketIndex * @param marketType * @param slot * @param oraclePriceData * @param depth how many levels of the order book to return * @param fallbackL2Generators L2 generators for fallback liquidity e.g. vAMM {@link getVammL2Generator}, openbook {@link SerumSubscriber} */ getL2({ marketIndex, marketType, slot, oraclePriceData, depth, fallbackL2Generators, }: { marketIndex: number; marketType: MarketType; slot: number; oraclePriceData: OraclePriceData; depth: number; fallbackL2Generators?: L2OrderBookGenerator[]; }): L2OrderBook; /** * Get an L3 view of the order book for a given market. Does not include fallback liquidity sources * * @param marketIndex * @param marketType * @param slot * @param oraclePriceData */ getL3({ marketIndex, marketType, slot, oraclePriceData, }: { marketIndex: number; marketType: MarketType; slot: number; oraclePriceData: OraclePriceData; }): L3OrderBook; private estimateFillExactBaseAmountInForSide; /** * * @param param.marketIndex the index of the market * @param param.marketType the type of the market * @param param.baseAmount the base amount in to estimate * @param param.orderDirection the direction of the trade * @param param.slot current slot for estimating dlob node price * @param param.oraclePriceData the oracle price data * @returns the estimated quote amount filled: QUOTE_PRECISION */ estimateFillWithExactBaseAmount({ marketIndex, marketType, baseAmount, orderDirection, slot, oraclePriceData, }: { marketIndex: number; marketType: MarketType; baseAmount: BN; orderDirection: PositionDirection; slot: number; oraclePriceData: OraclePriceData; }): BN; getBestMakers({ marketIndex, marketType, direction, slot, oraclePriceData, numMakers, }: { marketIndex: number; marketType: MarketType; direction: PositionDirection; slot: number; oraclePriceData: OraclePriceData; numMakers: number; }): PublicKey[]; } export {};