Skip to Content

Events

Protocol events are emitted in transaction logs. The SDK provides an EventSubscriber that can listen, deserialize, and emit events to your app.

View EventSubscriber import

import { EventSubscriber } from "@drift-labs/sdk"; const options = { // eventTypes: ["DepositRecord", "OrderRecord", ...], commitment: "confirmed", logProviderConfig: { type: "websocket" }, }; const eventSubscriber = new EventSubscriber(connection, driftClient.program, options); await eventSubscriber.subscribe(); eventSubscriber.eventEmitter.on("newEvent", (event) => { console.log(event); });
Class EventSubscriberReference ↗
NameTypeDefault
connectionany
programany
optionsany
addressany
eventListMapany
txEventCacheany
awaitTxPromisesany
awaitTxResolverany
logProviderany
_currentProviderTypeany
eventEmitterStrictEventEmitter<EventEmitter, EventSubscriberEvents>
lastSeenSlotany
lastSeenBlockTimeany
lastSeenTxSigstring
currentProviderTypeLogProviderType
initializeLogProviderany
populateInitialEventListMapany
updateFallbackProviderTypeany

Implements fallback logic for reconnecting to LogProvider. Currently terminates at polling, could be improved to try the original type again after some cooldown.

subscribe() => Promise<boolean>
handleTxLogsany
fetchPreviousTx(fetchMax?: boolean | undefined) => Promise<void>
unsubscribe() => Promise<boolean>
parseEventsFromLogsany
awaitTx(txSig: string) => Promise<void>
getEventList<Type extends keyof EventMap>(eventType: Type) => EventList<Type>
getEventsArray<Type extends EventType>(eventType: Type) => EventMap[Type][]

This requires the EventList be cast to an array, which requires reallocation of memory. Would bias to using getEventList over getEvents

getEventsByTx(txSig: string) => WrappedEvents | undefined

Filtering Events

You can filter events by market index, event type, or action using the isVariant helper function. This is useful for focusing on specific markets or event types in your bot.

import { isVariant } from "@drift-labs/sdk"; // Example: Filter for perp fills on a specific market const marketIndex = 0; const isPerpFill = (event) => { if (event.eventType !== "OrderActionRecord") return false; if (event.marketIndex !== marketIndex) return false; if (!isVariant(event.marketType, "perp")) return false; if (!isVariant(event.action, "fill")) return false; return true; }; eventSubscriber.eventEmitter.on("newEvent", (event) => { if (isPerpFill(event)) console.log("Perp fill on market", marketIndex, event); });
Function isVariantReference ↗
Parameters:
NameTypeDefault
objectunknown
typestring
Returns:
boolean

Common filter patterns for bots:

// Filter by market index only eventSubscriber.eventEmitter.on("newEvent", (event) => { if (event.marketIndex === 0) { console.log("Event on market 0:", event); } }); // Filter by event type eventSubscriber.eventEmitter.on("newEvent", (event) => { if (event.eventType === "DepositRecord") { console.log("Deposit event:", event); } }); // Filter for liquidations eventSubscriber.eventEmitter.on("newEvent", (event) => { if (event.eventType === "LiquidationRecord") { console.log("Liquidation:", event); } });
Last updated on