UNPKG

@drift-labs/sdk-browser

Version:
263 lines (220 loc) 6.74 kB
import { SpotMarketAccount, PerpMarketAccount, OracleSource, StateAccount, UserAccount, UserStatsAccount, InsuranceFundStake, HighLeverageModeConfig, } from '../types'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { Context, PublicKey } from '@solana/web3.js'; import { Account } from '@solana/spl-token'; import { OracleInfo, OraclePriceData } from '../oracles/types'; import { User } from '../user'; import { ChannelOptions, CommitmentLevel } from '../isomorphic/grpc'; export interface AccountSubscriber<T> { dataAndSlot?: DataAndSlot<T>; subscribe(onChange: (data: T) => void): Promise<void>; fetch(): Promise<void>; unsubscribe(): Promise<void>; setData(userAccount: T, slot?: number): void; } export interface ProgramAccountSubscriber<T> { subscribe( onChange: ( accountId: PublicKey, data: T, context: Context, buffer: Buffer ) => void ): Promise<void>; unsubscribe(): Promise<void>; } export class NotSubscribedError extends Error { name = 'NotSubscribedError'; } export interface DriftClientAccountEvents { stateAccountUpdate: (payload: StateAccount) => void; perpMarketAccountUpdate: (payload: PerpMarketAccount) => void; spotMarketAccountUpdate: (payload: SpotMarketAccount) => void; oraclePriceUpdate: ( publicKey: PublicKey, oracleSource: OracleSource, data: OraclePriceData ) => void; userAccountUpdate: (payload: UserAccount) => void; update: void; error: (e: Error) => void; } export interface DriftClientAccountSubscriber { eventEmitter: StrictEventEmitter<EventEmitter, DriftClientAccountEvents>; isSubscribed: boolean; subscribe(): Promise<boolean>; fetch(): Promise<void>; unsubscribe(): Promise<void>; addPerpMarket(marketIndex: number): Promise<boolean>; addSpotMarket(marketIndex: number): Promise<boolean>; addOracle(oracleInfo: OracleInfo): Promise<boolean>; setPerpOracleMap(): Promise<void>; setSpotOracleMap(): Promise<void>; getStateAccountAndSlot(): DataAndSlot<StateAccount>; getMarketAccountAndSlot( marketIndex: number ): DataAndSlot<PerpMarketAccount> | undefined; getMarketAccountsAndSlots(): DataAndSlot<PerpMarketAccount>[]; getSpotMarketAccountAndSlot( marketIndex: number ): DataAndSlot<SpotMarketAccount> | undefined; getSpotMarketAccountsAndSlots(): DataAndSlot<SpotMarketAccount>[]; getOraclePriceDataAndSlot( oracleId: string ): DataAndSlot<OraclePriceData> | undefined; getOraclePriceDataAndSlotForPerpMarket( marketIndex: number ): DataAndSlot<OraclePriceData> | undefined; getOraclePriceDataAndSlotForSpotMarket( marketIndex: number ): DataAndSlot<OraclePriceData> | undefined; updateAccountLoaderPollingFrequency?: (pollingFrequency: number) => void; } export enum DelistedMarketSetting { Unsubscribe, Subscribe, Discard, } export interface UserAccountEvents { userAccountUpdate: (payload: UserAccount) => void; update: void; error: (e: Error) => void; } export interface UserEvents { userUpdate: (payload: User) => void; update: void; error: (e: Error) => void; } export interface UserAccountSubscriber { eventEmitter: StrictEventEmitter<EventEmitter, UserAccountEvents>; isSubscribed: boolean; subscribe(userAccount?: UserAccount): Promise<boolean>; fetch(): Promise<void>; updateData(userAccount: UserAccount, slot: number): void; unsubscribe(): Promise<void>; getUserAccountAndSlot(): DataAndSlot<UserAccount>; } export interface TokenAccountEvents { tokenAccountUpdate: (payload: Account) => void; update: void; error: (e: Error) => void; } export interface TokenAccountSubscriber { eventEmitter: StrictEventEmitter<EventEmitter, TokenAccountEvents>; isSubscribed: boolean; subscribe(): Promise<boolean>; fetch(): Promise<void>; unsubscribe(): Promise<void>; getTokenAccountAndSlot(): DataAndSlot<Account>; } export interface InsuranceFundStakeAccountSubscriber { eventEmitter: StrictEventEmitter< EventEmitter, InsuranceFundStakeAccountEvents >; isSubscribed: boolean; subscribe(): Promise<boolean>; fetch(): Promise<void>; unsubscribe(): Promise<void>; getInsuranceFundStakeAccountAndSlot(): DataAndSlot<InsuranceFundStake>; } export interface InsuranceFundStakeAccountEvents { insuranceFundStakeAccountUpdate: (payload: InsuranceFundStake) => void; update: void; error: (e: Error) => void; } export interface OracleEvents { oracleUpdate: (payload: OraclePriceData) => void; update: void; error: (e: Error) => void; } export interface OracleAccountSubscriber { eventEmitter: StrictEventEmitter<EventEmitter, OracleEvents>; isSubscribed: boolean; subscribe(): Promise<boolean>; fetch(): Promise<void>; unsubscribe(): Promise<void>; getOraclePriceData(): DataAndSlot<OraclePriceData>; } export type AccountToPoll = { key: string; publicKey: PublicKey; eventType: string; callbackId?: string; mapKey?: number; }; export type OraclesToPoll = { publicKey: PublicKey; source: OracleSource; callbackId?: string; }; export type BufferAndSlot = { slot: number; buffer: Buffer | undefined; }; export type DataAndSlot<T> = { data: T; slot: number; }; export type ResubOpts = { resubTimeoutMs?: number; logResubMessages?: boolean; // New options for polling-based resubscription usePollingInsteadOfResub?: boolean; pollingIntervalMs?: number; }; export interface UserStatsAccountEvents { userStatsAccountUpdate: (payload: UserStatsAccount) => void; update: void; error: (e: Error) => void; } export interface UserStatsAccountSubscriber { eventEmitter: StrictEventEmitter<EventEmitter, UserStatsAccountEvents>; isSubscribed: boolean; subscribe(userStatsAccount?: UserStatsAccount): Promise<boolean>; fetch(): Promise<void>; unsubscribe(): Promise<void>; getUserStatsAccountAndSlot(): DataAndSlot<UserStatsAccount>; } export type GrpcConfigs = { endpoint: string; token: string; commitmentLevel?: CommitmentLevel; channelOptions?: ChannelOptions; /** * Whether to enable automatic reconnection on connection loss . * Defaults to false, will throw on connection loss. */ enableReconnect?: boolean; client?: 'yellowstone' | 'laser'; }; export interface HighLeverageModeConfigAccountSubscriber { eventEmitter: StrictEventEmitter< EventEmitter, HighLeverageModeConfigAccountEvents >; isSubscribed: boolean; subscribe( highLeverageModeConfigAccount?: HighLeverageModeConfig ): Promise<boolean>; fetch(): Promise<void>; unsubscribe(): Promise<void>; getHighLeverageModeConfigAccountAndSlot(): DataAndSlot<HighLeverageModeConfig>; } export interface HighLeverageModeConfigAccountEvents { highLeverageModeConfigAccountUpdate: ( payload: HighLeverageModeConfig ) => void; update: void; error: (e: Error) => void; }