diff --git a/sdk/src/dlob/DLOB.ts b/sdk/src/dlob/DLOB.ts index 0993304494..9481c92250 100644 --- a/sdk/src/dlob/DLOB.ts +++ b/sdk/src/dlob/DLOB.ts @@ -10,7 +10,7 @@ import { } from '../constants/numericConstants'; import { decodeName } from '../userName'; import { DLOBNode, DLOBNodeType } from './DLOBNode'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { getLimitPrice, isOrderExpired, @@ -1561,7 +1561,7 @@ export class DLOB implements IDLOB { } public printTop( - driftClient: DriftClient, + driftClient: IDriftClient, slotSubscriber: SlotSubscriber, marketIndex: number, marketType: MarketType diff --git a/sdk/src/driftClient/index.ts b/sdk/src/driftClient/index.ts index a8dec642d3..6f0ae7e10b 100644 --- a/sdk/src/driftClient/index.ts +++ b/sdk/src/driftClient/index.ts @@ -137,7 +137,7 @@ import { PollingDriftClientAccountSubscriber } from '../accounts/driftClientAcco import { WebSocketDriftClientAccountSubscriber } from '../accounts/driftClientAccount/webSocketDriftClientAccountSubscriber'; import { RetryTxSender } from '../tx/retryTxSender'; import { User } from '../user'; -import { UserSubscriptionConfig } from '../userConfig'; +import { UserSubscriptionConfig } from '../user/types'; import { configs, DRIFT_ORACLE_RECEIVER_ID, diff --git a/sdk/src/driftClient/types.ts b/sdk/src/driftClient/types.ts index c78c6b19fb..08ae38611e 100644 --- a/sdk/src/driftClient/types.ts +++ b/sdk/src/driftClient/types.ts @@ -59,8 +59,7 @@ import { } from '../accounts/types'; import { TxSender, TxSigAndSlot } from '../tx/types'; import { OraclePriceData } from '../oracles/types'; -import { User } from '../user'; -import { UserSubscriptionConfig } from '../userConfig'; +import { UserSubscriptionConfig } from '../user/types'; import { DriftEnv } from '../config/types'; import { IUserStats } from '../userStats/types'; import { UserStatsSubscriptionConfig } from '../userStatsConfig'; @@ -74,6 +73,7 @@ import { SwapMode, } from '../jupiter/jupiterClient'; import { TxHandler } from '../tx/txHandler'; +import { IUser } from '../user/types'; type RemainingAccountParams = { userAccounts: UserAccount[]; @@ -93,7 +93,7 @@ export interface IDriftClient { env: DriftEnv; opts?: ConfirmOptions; useHotWalletAdmin?: boolean; - users: Map; + users: Map; userStats?: IUserStats; activeSubAccountId: number; userAccountSubscriptionConfig: UserSubscriptionConfig; @@ -139,7 +139,7 @@ export interface IDriftClient { subAccountId: number, accountSubscriptionConfig: UserSubscriptionConfig, authority?: PublicKey - ): User; + ): IUser; subscribe(): Promise; subscribeUsers(): Promise[]; @@ -427,9 +427,9 @@ export interface IDriftClient { getReclaimRentIx( userAccountPublicKey: PublicKey ): Promise; - getUser(subAccountId?: number, authority?: PublicKey): User; + getUser(subAccountId?: number, authority?: PublicKey): IUser; hasUser(subAccountId?: number, authority?: PublicKey): boolean; - getUsers(): User[]; + getUsers(): IUser[]; getUserStats(): IUserStats; fetchReferrerNameAccount( name: string @@ -2018,7 +2018,7 @@ export interface IDriftClient { getMarketFees( marketType: MarketType, marketIndex?: number, - user?: User, + user?: IUser, enteringHighLeverageMode?: boolean ): { takerFee: number; makerFee: number }; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index fdf9157024..122f1436b5 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -31,7 +31,7 @@ export * from './adminClient'; export * from './assert/assert'; export * from './testClient'; export * from './user'; -export * from './userConfig'; +export * from './user/types'; export * from './userStats'; export * from './userName'; export * from './userStatsConfig'; diff --git a/sdk/src/math/margin.ts b/sdk/src/math/margin.ts index 63832805e4..26fa69e3df 100644 --- a/sdk/src/math/margin.ts +++ b/sdk/src/math/margin.ts @@ -15,7 +15,6 @@ import { BN } from '@coral-xyz/anchor'; import { OraclePriceData } from '../oracles/types'; import { calculateMarketMarginRatio } from './market'; import { calculateScaledInitialAssetWeight } from './spotBalance'; -import { DriftClient } from '../driftClient'; import { OneShotUserAccountSubscriber } from '../accounts/userAccount/oneShotUserAccountSubscriber'; import { PerpMarketAccount, @@ -27,6 +26,7 @@ import { PublicKey } from '@solana/web3.js'; import { User } from '../user'; import { isVariant } from '../types'; import { assert } from '../assert/assert'; +import { IDriftClient } from '../driftClient/types'; export function calculateSizePremiumLiabilityWeight( size: BN, // AMM_RESERVE_PRECISION @@ -216,7 +216,7 @@ export function calculatePerpLiabilityValue( * @returns */ export function calculateMarginUSDCRequiredForTrade( - driftClient: DriftClient, + driftClient: IDriftClient, targetMarketIndex: number, baseSize: BN, userMaxMarginRatio?: number, @@ -256,7 +256,7 @@ export function calculateMarginUSDCRequiredForTrade( * Returns collateral required in the precision of the target collateral market. */ export function calculateCollateralDepositRequiredForTrade( - driftClient: DriftClient, + driftClient: IDriftClient, targetMarketIndex: number, baseSize: BN, collateralIndex: number, @@ -298,7 +298,7 @@ export function calculateCollateralDepositRequiredForTrade( } export function calculateCollateralValueOfDeposit( - driftClient: DriftClient, + driftClient: IDriftClient, collateralIndex: number, baseSize: BN ): BN { @@ -345,7 +345,7 @@ export function calculateLiquidationPrice( } export function calculateUserMaxPerpOrderSize( - driftClient: DriftClient, + driftClient: IDriftClient, userAccountKey: PublicKey, userAccount: UserAccount, targetMarketIndex: number, diff --git a/sdk/src/math/orders.ts b/sdk/src/math/orders.ts index 7c06f7b51f..898728ebb1 100644 --- a/sdk/src/math/orders.ts +++ b/sdk/src/math/orders.ts @@ -1,4 +1,3 @@ -import { User } from '../user'; import { isOneOfVariant, isVariant, @@ -22,8 +21,9 @@ import { calculateUpdatedAMM, } from './amm'; import { standardizeBaseAssetAmount } from './utils'; +import { IUser } from '../user/types'; -export function isOrderRiskIncreasing(user: User, order: Order): boolean { +export function isOrderRiskIncreasing(user: IUser, order: Order): boolean { if (!isVariant(order.status, 'open')) { return false; } @@ -62,7 +62,7 @@ export function isOrderRiskIncreasing(user: User, order: Order): boolean { } export function isOrderRiskIncreasingInSameDirection( - user: User, + user: IUser, order: Order ): boolean { if (!isVariant(order.status, 'open')) { @@ -94,7 +94,7 @@ export function isOrderRiskIncreasingInSameDirection( return false; } -export function isOrderReduceOnly(user: User, order: Order): boolean { +export function isOrderReduceOnly(user: IUser, order: Order): boolean { if (!isVariant(order.status, 'open')) { return false; } diff --git a/sdk/src/user/index.ts b/sdk/src/user/index.ts index 0b8b6323db..5bf7d26a29 100644 --- a/sdk/src/user/index.ts +++ b/sdk/src/user/index.ts @@ -1,7 +1,6 @@ import { PublicKey } from '@solana/web3.js'; import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; -import { DriftClient } from '../driftClient'; import { HealthComponent, HealthComponents, @@ -93,7 +92,7 @@ import { calculateWorstCaseBaseAssetAmount, } from '../math/margin'; import { OraclePriceData } from '../oracles/types'; -import { UserConfig } from '../userConfig'; +import { UserSubscriptionConfig } from './types'; import { PollingUserAccountSubscriber } from '../accounts/userAccount/pollingUserAccountSubscriber'; import { WebSocketUserAccountSubscriber } from '../accounts/userAccount/webSocketUserAccountSubscriber'; import { @@ -115,9 +114,16 @@ import { calculateSpotFuelBonus, calculatePerpFuelBonus } from '../math/fuel'; import { grpcUserAccountSubscriber } from '../accounts/userAccount/grpcUserAccountSubscriber'; import { IUserStats } from '../userStats/types'; import { IUser } from './types'; +import { IDriftClient } from '../driftClient/types'; + +export type UserConfig = { + accountSubscription?: UserSubscriptionConfig; + driftClient: IDriftClient; + userAccountPublicKey: PublicKey; +}; export class User implements IUser { - driftClient: DriftClient; + driftClient: IDriftClient; userAccountPublicKey: PublicKey; accountSubscriber: UserAccountSubscriber; _isSubscribed = false; diff --git a/sdk/src/user/types.ts b/sdk/src/user/types.ts index 5cd7411f1a..dfba936f50 100644 --- a/sdk/src/user/types.ts +++ b/sdk/src/user/types.ts @@ -1,4 +1,4 @@ -import { PublicKey } from '@solana/web3.js'; +import { Commitment, PublicKey } from '@solana/web3.js'; import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; import { @@ -18,6 +18,7 @@ import { } from '../types'; import { DataAndSlot, + GrpcConfigs, UserAccountEvents, UserAccountSubscriber, } from '../accounts/types'; @@ -25,6 +26,29 @@ import { BN } from '@coral-xyz/anchor'; import { OraclePriceData } from '../oracles/types'; import { StrictOraclePrice } from '../oracles/strictOraclePrice'; import { IUserStats } from '../userStats/types'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; + +export type UserSubscriptionConfig = + | { + type: 'grpc'; + resubTimeoutMs?: number; + logResubMessages?: boolean; + grpcConfigs: GrpcConfigs; + } + | { + type: 'websocket'; + resubTimeoutMs?: number; + logResubMessages?: boolean; + commitment?: Commitment; + } + | { + type: 'polling'; + accountLoader: BulkAccountLoader; + } + | { + type: 'custom'; + userAccountSubscriber: UserAccountSubscriber; + }; export interface IUser { userAccountPublicKey: PublicKey; diff --git a/sdk/src/userConfig.ts b/sdk/src/userConfig.ts deleted file mode 100644 index 004d90c659..0000000000 --- a/sdk/src/userConfig.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { DriftClient } from './driftClient'; -import { Commitment, PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './accounts/bulkAccountLoader/bulkAccountLoader'; -import { GrpcConfigs, UserAccountSubscriber } from './accounts/types'; - -export type UserConfig = { - accountSubscription?: UserSubscriptionConfig; - driftClient: DriftClient; - userAccountPublicKey: PublicKey; -}; - -export type UserSubscriptionConfig = - | { - type: 'grpc'; - resubTimeoutMs?: number; - logResubMessages?: boolean; - grpcConfigs: GrpcConfigs; - } - | { - type: 'websocket'; - resubTimeoutMs?: number; - logResubMessages?: boolean; - commitment?: Commitment; - } - | { - type: 'polling'; - accountLoader: BulkAccountLoader; - } - | { - type: 'custom'; - userAccountSubscriber: UserAccountSubscriber; - }; diff --git a/sdk/src/userMap/events.ts b/sdk/src/userMap/events.ts index e3e60e3d26..522e693a4a 100644 --- a/sdk/src/userMap/events.ts +++ b/sdk/src/userMap/events.ts @@ -1,7 +1,7 @@ -import { User } from '../user'; +import { IUser } from '../user/types'; export interface UserEvents { - userUpdate: (payload: User) => void; + userUpdate: (payload: IUser) => void; update: void; error: (e: Error) => void; } diff --git a/sdk/src/userMap/types.ts b/sdk/src/userMap/types.ts index 476d5c86ef..44b2b797f5 100644 --- a/sdk/src/userMap/types.ts +++ b/sdk/src/userMap/types.ts @@ -1,8 +1,6 @@ -import { User } from '../user'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { UserAccount, OrderRecord } from '../types'; import { WrappedEvent } from '../events/types'; -import { UserSubscriptionConfig } from '../userConfig'; import { DataAndSlot } from '../accounts/types'; import { IDLOB, ProtectMakerParamsMap } from '../dlob/types'; import { PublicKey } from '@solana/web3.js'; @@ -10,9 +8,10 @@ import { UserAccountFilterCriteria as UserFilterCriteria } from './userMapConfig import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { UserEvents } from './events'; +import { IUser, UserSubscriptionConfig } from '../user/types'; export interface IUserMap { - driftClient: DriftClient; + driftClient: IDriftClient; eventEmitter: StrictEventEmitter; subscribe(): Promise; @@ -31,9 +30,9 @@ export interface IUserMap { * @param key userAccountPublicKey to get User for * @returns user User | undefined */ - get(key: string): User | undefined; + get(key: string): IUser | undefined; - getWithSlot(key: string): DataAndSlot | undefined; + getWithSlot(key: string): DataAndSlot | undefined; /** * gets the User for a particular userAccountPublicKey, if no User exists, new one is created @@ -43,12 +42,12 @@ export interface IUserMap { mustGet( key: string, accountSubscription?: UserSubscriptionConfig - ): Promise; + ): Promise; mustGetWithSlot( key: string, accountSubscription?: UserSubscriptionConfig - ): Promise>; + ): Promise>; mustGetUserAccount(key: string): Promise; @@ -73,13 +72,13 @@ export interface IUserMap { updateWithEventRecord(record: WrappedEvent): Promise; - values(): IterableIterator; + values(): IterableIterator; - valuesWithSlot(): IterableIterator>; + valuesWithSlot(): IterableIterator>; - entries(): IterableIterator<[string, User]>; + entries(): IterableIterator<[string, IUser]>; - entriesWithSlot(): IterableIterator<[string, DataAndSlot]>; + entriesWithSlot(): IterableIterator<[string, DataAndSlot]>; size(): number; diff --git a/sdk/src/userMap/userMap.ts b/sdk/src/userMap/userMap.ts index 98e2bfdaa4..bdbb79cf3f 100644 --- a/sdk/src/userMap/userMap.ts +++ b/sdk/src/userMap/userMap.ts @@ -1,6 +1,5 @@ import { BN } from '@coral-xyz/anchor'; import { User } from '../user'; -import { DriftClient } from '../driftClient'; import { UserAccount, OrderRecord, @@ -15,7 +14,7 @@ import { } from '../types'; import { WrappedEvent } from '../events/types'; import { DLOB } from '../dlob/DLOB'; -import { UserSubscriptionConfig } from '../userConfig'; +import { UserSubscriptionConfig } from '../user/types'; import { DataAndSlot } from '../accounts/types'; import { OneShotUserAccountSubscriber } from '../accounts/userAccount/oneShotUserAccountSubscriber'; import { ProtectMakerParamsMap } from '../dlob/types'; @@ -47,12 +46,13 @@ import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { UserEvents } from './events'; import { IUserMap } from './types'; +import { IDriftClient } from '../driftClient/types'; const MAX_USER_ACCOUNT_SIZE_BYTES = 4376; export class UserMap implements IUserMap { private userMap = new Map>(); - driftClient: DriftClient; + driftClient: IDriftClient; eventEmitter: StrictEventEmitter; private connection: Connection; private commitment: Commitment; diff --git a/sdk/src/userMap/userMapConfig.ts b/sdk/src/userMap/userMapConfig.ts index afb980c3e7..31bd29fc9c 100644 --- a/sdk/src/userMap/userMapConfig.ts +++ b/sdk/src/userMap/userMapConfig.ts @@ -1,5 +1,5 @@ import { Commitment, Connection, MemcmpFilter } from '@solana/web3.js'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { GrpcConfigs } from '../accounts/types'; // passed into UserMap.getUniqueAuthorities to filter users @@ -19,7 +19,7 @@ export type SyncConfig = }; export type UserMapConfig = { - driftClient: DriftClient; + driftClient: IDriftClient; // connection object to use specifically for the UserMap. If undefined, will use the driftClient's connection connection?: Connection; subscriptionConfig: diff --git a/sdk/src/userStats/index.ts b/sdk/src/userStats/index.ts index 264d86d79c..e1b2fdc7c4 100644 --- a/sdk/src/userStats/index.ts +++ b/sdk/src/userStats/index.ts @@ -1,6 +1,6 @@ import { PublicKey } from '@solana/web3.js'; import { DataAndSlot, UserStatsAccountSubscriber } from '../accounts/types'; -import { UserStatsConfig } from '../userStatsConfig'; +import { UserStatsSubscriptionConfig } from '../userStatsConfig'; import { PollingUserStatsAccountSubscriber } from '../accounts/userStatsAccount/pollingUserStatsAccountSubscriber'; import { WebSocketUserStatsAccountSubscriber } from '../accounts/userStatsAccount/webSocketUserStatsAccountSubsriber'; import { ReferrerInfo, SpotMarketAccount, UserStatsAccount } from '../types'; @@ -20,6 +20,12 @@ import { calculateInsuranceFuelBonus } from '../math/fuel'; import { IDriftClient } from '../driftClient/types'; import { IUserStats } from './types'; +export type UserStatsConfig = { + accountSubscription?: UserStatsSubscriptionConfig; + driftClient: IDriftClient; + userStatsAccountPublicKey: PublicKey; +}; + export class UserStats implements IUserStats { driftClient: IDriftClient; userStatsAccountPublicKey: PublicKey; diff --git a/sdk/src/userStatsConfig.ts b/sdk/src/userStatsConfig.ts index b3bfbc87b4..a1866a1182 100644 --- a/sdk/src/userStatsConfig.ts +++ b/sdk/src/userStatsConfig.ts @@ -1,14 +1,7 @@ -import { DriftClient } from './driftClient'; -import { Commitment, PublicKey } from '@solana/web3.js'; +import { Commitment } from '@solana/web3.js'; import { BulkAccountLoader } from './accounts/bulkAccountLoader/bulkAccountLoader'; import { GrpcConfigs } from './accounts/types'; -export type UserStatsConfig = { - accountSubscription?: UserStatsSubscriptionConfig; - driftClient: DriftClient; - userStatsAccountPublicKey: PublicKey; -}; - export type UserStatsSubscriptionConfig = | { type: 'websocket';