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.

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 (market fills example)

import { isVariant } from "@drift-labs/sdk";
Function isVariantReference ↗
Parameters:
NameTypeDefault
objectunknown
typestring
Returns:
boolean
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(event); });

TODO:

  • Add a “filter by marketIndex / event type” snippet for common bot patterns.
Last updated on