import { SpotMarketAccount, PerpMarketAccount, OracleSource, StateAccount, UserAccount, UserStatsAccount, InsuranceFundStake, } 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 { HighLeverageModeConfig, OracleInfo, OraclePriceData } from '..'; import { ChannelOptions, CommitmentLevel } from '../isomorphic/grpc'; export interface AccountSubscriber { dataAndSlot?: DataAndSlot; subscribe(onChange: (data: T) => void): Promise; fetch(): Promise; unsubscribe(): Promise; setData(userAccount: T, slot?: number): void; } export interface ProgramAccountSubscriber { subscribe( onChange: ( accountId: PublicKey, data: T, context: Context, buffer: Buffer ) => void ): Promise; unsubscribe(): Promise; } 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, data: OraclePriceData) => void; userAccountUpdate: (payload: UserAccount) => void; update: void; error: (e: Error) => void; } export interface DriftClientAccountSubscriber { eventEmitter: StrictEventEmitter; isSubscribed: boolean; subscribe(): Promise; fetch(): Promise; unsubscribe(): Promise; addPerpMarket(marketIndex: number): Promise; addSpotMarket(marketIndex: number): Promise; addOracle(oracleInfo: OracleInfo): Promise; setPerpOracleMap(): Promise; setSpotOracleMap(): Promise; getStateAccountAndSlot(): DataAndSlot; getMarketAccountAndSlot( marketIndex: number ): DataAndSlot | undefined; getMarketAccountsAndSlots(): DataAndSlot[]; getSpotMarketAccountAndSlot( marketIndex: number ): DataAndSlot | undefined; getSpotMarketAccountsAndSlots(): DataAndSlot[]; getOraclePriceDataAndSlot( oraclePublicKey: PublicKey | string ): DataAndSlot | undefined; getOraclePriceDataAndSlotForPerpMarket( marketIndex: number ): DataAndSlot | undefined; getOraclePriceDataAndSlotForSpotMarket( marketIndex: number ): DataAndSlot | 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 UserAccountSubscriber { eventEmitter: StrictEventEmitter; isSubscribed: boolean; subscribe(userAccount?: UserAccount): Promise; fetch(): Promise; updateData(userAccount: UserAccount, slot: number): void; unsubscribe(): Promise; getUserAccountAndSlot(): DataAndSlot; } export interface TokenAccountEvents { tokenAccountUpdate: (payload: Account) => void; update: void; error: (e: Error) => void; } export interface TokenAccountSubscriber { eventEmitter: StrictEventEmitter; isSubscribed: boolean; subscribe(): Promise; fetch(): Promise; unsubscribe(): Promise; getTokenAccountAndSlot(): DataAndSlot; } export interface InsuranceFundStakeAccountSubscriber { eventEmitter: StrictEventEmitter< EventEmitter, InsuranceFundStakeAccountEvents >; isSubscribed: boolean; subscribe(): Promise; fetch(): Promise; unsubscribe(): Promise; getInsuranceFundStakeAccountAndSlot(): DataAndSlot; } 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; isSubscribed: boolean; subscribe(): Promise; fetch(): Promise; unsubscribe(): Promise; getOraclePriceData(): DataAndSlot; } 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 = { data: T; slot: number; }; export type ResubOpts = { resubTimeoutMs?: number; logResubMessages?: boolean; }; export interface UserStatsAccountEvents { userStatsAccountUpdate: (payload: UserStatsAccount) => void; update: void; error: (e: Error) => void; } export interface UserStatsAccountSubscriber { eventEmitter: StrictEventEmitter; isSubscribed: boolean; subscribe(userStatsAccount?: UserStatsAccount): Promise; fetch(): Promise; unsubscribe(): Promise; getUserStatsAccountAndSlot(): DataAndSlot; } export type GrpcConfigs = { endpoint: string; token: string; commitmentLevel?: CommitmentLevel; channelOptions?: ChannelOptions; }; export interface HighLeverageModeConfigAccountSubscriber { eventEmitter: StrictEventEmitter< EventEmitter, HighLeverageModeConfigAccountEvents >; isSubscribed: boolean; subscribe( highLeverageModeConfigAccount?: HighLeverageModeConfig ): Promise; fetch(): Promise; unsubscribe(): Promise; getHighLeverageModeConfigAccountAndSlot(): DataAndSlot; } export interface HighLeverageModeConfigAccountEvents { highLeverageModeConfigAccountUpdate: ( payload: HighLeverageModeConfig ) => void; update: void; error: (e: Error) => void; }