@ox-fun/drift-sdk
Version:
SDK for Drift Protocol
1,142 lines (1,027 loc) • 26.7 kB
text/typescript
import { PublicKey, Transaction, VersionedTransaction } from '@solana/web3.js';
import { BN, ZERO } from '.';
// # Utility Types / Enums / Constants
export enum ExchangeStatus {
ACTIVE = 0,
DEPOSIT_PAUSED = 1,
WITHDRAW_PAUSED = 2,
AMM_PAUSED = 4,
FILL_PAUSED = 8,
LIQ_PAUSED = 16,
FUNDING_PAUSED = 32,
SETTLE_PNL_PAUSED = 64,
PAUSED = 127,
}
export class MarketStatus {
static readonly INITIALIZED = { initialized: {} };
static readonly ACTIVE = { active: {} };
static readonly FUNDING_PAUSED = { fundingPaused: {} };
static readonly AMM_PAUSED = { ammPaused: {} };
static readonly FILL_PAUSED = { fillPaused: {} };
static readonly WITHDRAW_PAUSED = { withdrawPaused: {} };
static readonly REDUCE_ONLY = { reduceOnly: {} };
static readonly SETTLEMENT = { settlement: {} };
static readonly DELISTED = { delisted: {} };
}
export enum PerpOperation {
UPDATE_FUNDING = 1,
AMM_FILL = 2,
FILL = 4,
SETTLE_PNL = 8,
SETTLE_PNL_WITH_POSITION = 16,
}
export enum SpotOperation {
UPDATE_CUMULATIVE_INTEREST = 1,
FILL = 2,
WITHDRAW = 4,
}
export enum UserStatus {
BEING_LIQUIDATED = 1,
BANKRUPT = 2,
REDUCE_ONLY = 4,
}
export class ContractType {
static readonly PERPETUAL = { perpetual: {} };
static readonly FUTURE = { future: {} };
}
export class ContractTier {
static readonly A = { a: {} };
static readonly B = { b: {} };
static readonly C = { c: {} };
static readonly SPECULATIVE = { speculative: {} };
static readonly ISOLATED = { isolated: {} };
}
export class AssetTier {
static readonly COLLATERAL = { collateral: {} };
static readonly PROTECTED = { protected: {} };
static readonly CROSS = { cross: {} };
static readonly ISOLATED = { isolated: {} };
static readonly UNLISTED = { unlisted: {} };
}
export class SwapDirection {
static readonly ADD = { add: {} };
static readonly REMOVE = { remove: {} };
}
export class SpotBalanceType {
static readonly DEPOSIT = { deposit: {} };
static readonly BORROW = { borrow: {} };
}
export class PositionDirection {
static readonly LONG = { long: {} };
static readonly SHORT = { short: {} };
}
export class DepositDirection {
static readonly DEPOSIT = { deposit: {} };
static readonly WITHDRAW = { withdraw: {} };
}
export class OracleSource {
static readonly PYTH = { pyth: {} };
static readonly PYTH_1K = { pyth1K: {} };
static readonly PYTH_1M = { pyth1M: {} };
// static readonly SWITCHBOARD = { switchboard: {} };
static readonly QUOTE_ASSET = { quoteAsset: {} };
static readonly PYTH_STABLE_COIN = { pythStableCoin: {} };
}
export class OrderType {
static readonly LIMIT = { limit: {} };
static readonly TRIGGER_MARKET = { triggerMarket: {} };
static readonly TRIGGER_LIMIT = { triggerLimit: {} };
static readonly MARKET = { market: {} };
static readonly ORACLE = { oracle: {} };
}
export declare type MarketTypeStr = 'perp' | 'spot';
export class MarketType {
static readonly SPOT = { spot: {} };
static readonly PERP = { perp: {} };
}
export class OrderStatus {
static readonly INIT = { init: {} };
static readonly OPEN = { open: {} };
}
export class OrderAction {
static readonly PLACE = { place: {} };
static readonly CANCEL = { cancel: {} };
static readonly EXPIRE = { expire: {} };
static readonly FILL = { fill: {} };
static readonly TRIGGER = { trigger: {} };
}
export class OrderActionExplanation {
static readonly NONE = { none: {} };
static readonly INSUFFICIENT_FREE_COLLATERAL = {
insufficientFreeCollateral: {},
};
static readonly ORACLE_PRICE_BREACHED_LIMIT_PRICE = {
oraclePriceBreachedLimitPrice: {},
};
static readonly MARKET_ORDER_FILLED_TO_LIMIT_PRICE = {
marketOrderFilledToLimitPrice: {},
};
static readonly ORDER_EXPIRED = {
orderExpired: {},
};
static readonly LIQUIDATION = {
liquidation: {},
};
static readonly ORDER_FILLED_WITH_AMM = {
orderFilledWithAmm: {},
};
static readonly ORDER_FILLED_WITH_AMM_JIT = {
orderFilledWithAmmJit: {},
};
static readonly ORDER_FILLED_WITH_AMM_JIT_LP_SPLIT = {
orderFilledWithAmmJitLpSplit: {},
};
static readonly ORDER_FILLED_WITH_LP_JIT = {
orderFilledWithLpJit: {},
};
static readonly ORDER_FILLED_WITH_MATCH = {
orderFilledWithMatch: {},
};
static readonly ORDER_FILLED_WITH_MATCH_JIT = {
orderFilledWithMatchJit: {},
};
static readonly MARKET_EXPIRED = {
marketExpired: {},
};
static readonly RISK_INCREASING_ORDER = {
riskingIncreasingOrder: {},
};
static readonly ORDER_FILLED_WITH_SERUM = {
orderFillWithSerum: {},
};
static readonly ORDER_FILLED_WITH_PHOENIX = {
orderFillWithPhoenix: {},
};
static readonly REDUCE_ONLY_ORDER_INCREASED_POSITION = {
reduceOnlyOrderIncreasedPosition: {},
};
}
export class OrderTriggerCondition {
static readonly ABOVE = { above: {} };
static readonly BELOW = { below: {} };
static readonly TRIGGERED_ABOVE = { triggeredAbove: {} }; // above condition has been triggered
static readonly TRIGGERED_BELOW = { triggeredBelow: {} }; // below condition has been triggered
}
export class SpotFulfillmentType {
static readonly EXTERNAL = { external: {} };
static readonly MATCH = { match: {} };
}
export class SpotFulfillmentStatus {
static readonly ENABLED = { enabled: {} };
static readonly DISABLED = { disabled: {} };
}
export class DepositExplanation {
static readonly NONE = { none: {} };
static readonly TRANSFER = { transfer: {} };
static readonly BORROW = { borrow: {} };
}
export class SettlePnlExplanation {
static readonly NONE = { none: {} };
static readonly EXPIRED_POSITION = { expiredPosition: {} };
}
export class SpotFulfillmentConfigStatus {
static readonly ENABLED = { enabled: {} };
static readonly DISABLED = { disabled: {} };
}
export class StakeAction {
static readonly STAKE = { stake: {} };
static readonly UNSTAKE_REQUEST = { unstakeRequest: {} };
static readonly UNSTAKE_CANCEL_REQUEST = { unstakeCancelRequest: {} };
static readonly UNSTAKE = { unstake: {} };
static readonly UNSTAKE_TRANSFER = { unstakeTransfer: {} };
static readonly STAKE_TRANSFER = { stakeTransfer: {} };
}
export function isVariant(object: unknown, type: string) {
return object.hasOwnProperty(type);
}
export function isOneOfVariant(object: unknown, types: string[]) {
return types.reduce((result, type) => {
return result || object.hasOwnProperty(type);
}, false);
}
export function getVariant(object: unknown): string {
return Object.keys(object)[0];
}
export enum TradeSide {
None = 0,
Buy = 1,
Sell = 2,
}
export type CandleResolution =
| '1'
| '5'
| '15'
| '60'
| '240'
| 'D'
| 'W'
| 'M';
export type NewUserRecord = {
ts: BN;
userAuthority: PublicKey;
user: PublicKey;
subAccountId: number;
name: number[];
referrer: PublicKey;
};
export type DepositRecord = {
ts: BN;
userAuthority: PublicKey;
user: PublicKey;
direction: {
deposit?: any;
withdraw?: any;
};
marketIndex: number;
amount: BN;
oraclePrice: BN;
marketDepositBalance: BN;
marketWithdrawBalance: BN;
marketCumulativeDepositInterest: BN;
marketCumulativeBorrowInterest: BN;
totalDepositsAfter: BN;
totalWithdrawsAfter: BN;
depositRecordId: BN;
explanation: DepositExplanation;
transferUser?: PublicKey;
};
export type SpotInterestRecord = {
ts: BN;
marketIndex: number;
depositBalance: BN;
cumulativeDepositInterest: BN;
borrowBalance: BN;
cumulativeBorrowInterest: BN;
optimalUtilization: number;
optimalBorrowRate: number;
maxBorrowRate: number;
};
export type CurveRecord = {
ts: BN;
recordId: BN;
marketIndex: number;
pegMultiplierBefore: BN;
baseAssetReserveBefore: BN;
quoteAssetReserveBefore: BN;
sqrtKBefore: BN;
pegMultiplierAfter: BN;
baseAssetReserveAfter: BN;
quoteAssetReserveAfter: BN;
sqrtKAfter: BN;
baseAssetAmountLong: BN;
baseAssetAmountShort: BN;
baseAssetAmountWithAmm: BN;
totalFee: BN;
totalFeeMinusDistributions: BN;
adjustmentCost: BN;
numberOfUsers: BN;
oraclePrice: BN;
fillRecord: BN;
};
export declare type InsuranceFundRecord = {
ts: BN;
spotMarketIndex: number;
perpMarketIndex: number;
userIfFactor: number;
totalIfFactor: number;
vaultAmountBefore: BN;
insuranceVaultAmountBefore: BN;
totalIfSharesBefore: BN;
totalIfSharesAfter: BN;
amount: BN;
};
export declare type InsuranceFundStakeRecord = {
ts: BN;
userAuthority: PublicKey;
action: StakeAction;
amount: BN;
marketIndex: number;
insuranceVaultAmountBefore: BN;
ifSharesBefore: BN;
userIfSharesBefore: BN;
totalIfSharesBefore: BN;
ifSharesAfter: BN;
userIfSharesAfter: BN;
totalIfSharesAfter: BN;
};
export type LPRecord = {
ts: BN;
user: PublicKey;
action: LPAction;
nShares: BN;
marketIndex: number;
deltaBaseAssetAmount: BN;
deltaQuoteAssetAmount: BN;
pnl: BN;
};
export class LPAction {
static readonly ADD_LIQUIDITY = { addLiquidity: {} };
static readonly REMOVE_LIQUIDITY = { removeLiquidity: {} };
static readonly SETTLE_LIQUIDITY = { settleLiquidity: {} };
}
export type FundingRateRecord = {
ts: BN;
recordId: BN;
marketIndex: number;
fundingRate: BN;
fundingRateLong: BN;
fundingRateShort: BN;
cumulativeFundingRateLong: BN;
cumulativeFundingRateShort: BN;
oraclePriceTwap: BN;
markPriceTwap: BN;
periodRevenue: BN;
baseAssetAmountWithAmm: BN;
baseAssetAmountWithUnsettledLp: BN;
};
export type FundingPaymentRecord = {
ts: BN;
userAuthority: PublicKey;
user: PublicKey;
marketIndex: number;
fundingPayment: BN;
baseAssetAmount: BN;
userLastCumulativeFunding: BN;
ammCumulativeFundingLong: BN;
ammCumulativeFundingShort: BN;
};
export type LiquidationRecord = {
ts: BN;
user: PublicKey;
liquidator: PublicKey;
liquidationType: LiquidationType;
marginRequirement: BN;
totalCollateral: BN;
marginFreed: BN;
liquidationId: number;
bankrupt: boolean;
canceledOrderIds: BN[];
liquidatePerp: LiquidatePerpRecord;
liquidateSpot: LiquidateSpotRecord;
liquidateBorrowForPerpPnl: LiquidateBorrowForPerpPnlRecord;
liquidatePerpPnlForDeposit: LiquidatePerpPnlForDepositRecord;
perpBankruptcy: PerpBankruptcyRecord;
spotBankruptcy: SpotBankruptcyRecord;
};
export class LiquidationType {
static readonly LIQUIDATE_PERP = { liquidatePerp: {} };
static readonly LIQUIDATE_BORROW_FOR_PERP_PNL = {
liquidateBorrowForPerpPnl: {},
};
static readonly LIQUIDATE_PERP_PNL_FOR_DEPOSIT = {
liquidatePerpPnlForDeposit: {},
};
static readonly PERP_BANKRUPTCY = {
perpBankruptcy: {},
};
static readonly SPOT_BANKRUPTCY = {
spotBankruptcy: {},
};
static readonly LIQUIDATE_SPOT = {
liquidateSpot: {},
};
}
export type LiquidatePerpRecord = {
marketIndex: number;
oraclePrice: BN;
baseAssetAmount: BN;
quoteAssetAmount: BN;
lpShares: BN;
userOrderId: BN;
liquidatorOrderId: BN;
fillRecordId: BN;
liquidatorFee: BN;
ifFee: BN;
};
export type LiquidateSpotRecord = {
assetMarketIndex: number;
assetPrice: BN;
assetTransfer: BN;
liabilityMarketIndex: number;
liabilityPrice: BN;
liabilityTransfer: BN;
ifFee: BN;
};
export type LiquidateBorrowForPerpPnlRecord = {
perpMarketIndex: number;
marketOraclePrice: BN;
pnlTransfer: BN;
liabilityMarketIndex: number;
liabilityPrice: BN;
liabilityTransfer: BN;
};
export type LiquidatePerpPnlForDepositRecord = {
perpMarketIndex: number;
marketOraclePrice: BN;
pnlTransfer: BN;
assetMarketIndex: number;
assetPrice: BN;
assetTransfer: BN;
};
export type PerpBankruptcyRecord = {
marketIndex: number;
pnl: BN;
ifPayment: BN;
clawbackUser: PublicKey | null;
clawbackUserPayment: BN | null;
cumulativeFundingRateDelta: BN;
};
export type SpotBankruptcyRecord = {
marketIndex: number;
borrowAmount: BN;
cumulativeDepositInterestDelta: BN;
ifPayment: BN;
};
export type SettlePnlRecord = {
ts: BN;
user: PublicKey;
marketIndex: number;
pnl: BN;
baseAssetAmount: BN;
quoteAssetAmountAfter: BN;
quoteEntryAmount: BN;
settlePrice: BN;
explanation: SettlePnlExplanation;
};
export type OrderRecord = {
ts: BN;
user: PublicKey;
order: Order;
};
export type OrderActionRecord = {
ts: BN;
action: OrderAction;
actionExplanation: OrderActionExplanation;
marketIndex: number;
marketType: MarketType;
filler: PublicKey | null;
fillerReward: BN | null;
fillRecordId: BN | null;
baseAssetAmountFilled: BN | null;
quoteAssetAmountFilled: BN | null;
takerFee: BN | null;
makerFee: BN | null;
referrerReward: number | null;
quoteAssetAmountSurplus: BN | null;
spotFulfillmentMethodFee: BN | null;
taker: PublicKey | null;
takerOrderId: number | null;
takerOrderDirection: PositionDirection | null;
takerOrderBaseAssetAmount: BN | null;
takerOrderCumulativeBaseAssetAmountFilled: BN | null;
takerOrderCumulativeQuoteAssetAmountFilled: BN | null;
maker: PublicKey | null;
makerOrderId: number | null;
makerOrderDirection: PositionDirection | null;
makerOrderBaseAssetAmount: BN | null;
makerOrderCumulativeBaseAssetAmountFilled: BN | null;
makerOrderCumulativeQuoteAssetAmountFilled: BN | null;
oraclePrice: BN;
};
export type SwapRecord = {
ts: BN;
user: PublicKey;
amountOut: BN;
amountIn: BN;
outMarketIndex: number;
inMarketIndex: number;
outOraclePrice: BN;
inOraclePrice: BN;
fee: BN;
};
export type StateAccount = {
admin: PublicKey;
exchangeStatus: number;
whitelistMint: PublicKey;
discountMint: PublicKey;
oracleGuardRails: OracleGuardRails;
numberOfAuthorities: BN;
numberOfSubAccounts: BN;
numberOfMarkets: number;
numberOfSpotMarkets: number;
minPerpAuctionDuration: number;
defaultMarketOrderTimeInForce: number;
defaultSpotAuctionDuration: number;
liquidationMarginBufferRatio: number;
settlementDuration: number;
maxNumberOfSubAccounts: number;
signer: PublicKey;
signerNonce: number;
srmVault: PublicKey;
perpFeeStructure: FeeStructure;
spotFeeStructure: FeeStructure;
lpCooldownTime: BN;
initialPctToLiquidate: number;
liquidationDuration: number;
maxInitializeUserFee: number;
};
export type PerpMarketAccount = {
status: MarketStatus;
contractType: ContractType;
contractTier: ContractTier;
expiryTs: BN;
expiryPrice: BN;
marketIndex: number;
pubkey: PublicKey;
name: number[];
amm: AMM;
numberOfUsersWithBase: number;
numberOfUsers: number;
marginRatioInitial: number;
marginRatioMaintenance: number;
nextFillRecordId: BN;
nextFundingRateRecordId: BN;
nextCurveRecordId: BN;
pnlPool: PoolBalance;
liquidatorFee: number;
ifLiquidationFee: number;
imfFactor: number;
unrealizedPnlImfFactor: number;
unrealizedPnlMaxImbalance: BN;
unrealizedPnlInitialAssetWeight: number;
unrealizedPnlMaintenanceAssetWeight: number;
insuranceClaim: {
revenueWithdrawSinceLastSettle: BN;
maxRevenueWithdrawPerPeriod: BN;
lastRevenueWithdrawTs: BN;
quoteSettledInsurance: BN;
quoteMaxInsurance: BN;
};
quoteSpotMarketIndex: number;
feeAdjustment: number;
};
export type HistoricalOracleData = {
lastOraclePrice: BN;
lastOracleDelay: BN;
lastOracleConf: BN;
lastOraclePriceTwap: BN;
lastOraclePriceTwap5Min: BN;
lastOraclePriceTwapTs: BN;
};
export type HistoricalIndexData = {
lastIndexBidPrice: BN;
lastIndexAskPrice: BN;
lastIndexPriceTwap: BN;
lastIndexPriceTwap5Min: BN;
lastIndexPriceTwapTs: BN;
};
export type SpotMarketAccount = {
status: MarketStatus;
assetTier: AssetTier;
name: number[];
marketIndex: number;
pubkey: PublicKey;
mint: PublicKey;
vault: PublicKey;
oracle: PublicKey;
oracleSource: OracleSource;
historicalOracleData: HistoricalOracleData;
historicalIndexData: HistoricalIndexData;
insuranceFund: {
vault: PublicKey;
totalShares: BN;
userShares: BN;
sharesBase: BN;
unstakingPeriod: BN;
lastRevenueSettleTs: BN;
revenueSettlePeriod: BN;
totalFactor: number;
userFactor: number;
};
revenuePool: PoolBalance;
ifLiquidationFee: number;
decimals: number;
optimalUtilization: number;
optimalBorrowRate: number;
maxBorrowRate: number;
cumulativeDepositInterest: BN;
cumulativeBorrowInterest: BN;
totalSocialLoss: BN;
totalQuoteSocialLoss: BN;
depositBalance: BN;
borrowBalance: BN;
maxTokenDeposits: BN;
lastInterestTs: BN;
lastTwapTs: BN;
initialAssetWeight: number;
maintenanceAssetWeight: number;
initialLiabilityWeight: number;
maintenanceLiabilityWeight: number;
liquidatorFee: number;
imfFactor: number;
scaleInitialAssetWeightStart: BN;
withdrawGuardThreshold: BN;
depositTokenTwap: BN;
borrowTokenTwap: BN;
utilizationTwap: BN;
nextDepositRecordId: BN;
orderStepSize: BN;
orderTickSize: BN;
minOrderSize: BN;
maxPositionSize: BN;
nextFillRecordId: BN;
spotFeePool: PoolBalance;
totalSpotFee: BN;
totalSwapFee: BN;
flashLoanAmount: BN;
flashLoanInitialTokenAmount: BN;
ordersEnabled: boolean;
};
export type PoolBalance = {
scaledBalance: BN;
marketIndex: number;
};
export type AMM = {
baseAssetReserve: BN;
sqrtK: BN;
cumulativeFundingRate: BN;
lastFundingRate: BN;
lastFundingRateTs: BN;
lastMarkPriceTwap: BN;
lastMarkPriceTwap5Min: BN;
lastMarkPriceTwapTs: BN;
lastTradeTs: BN;
oracle: PublicKey;
oracleSource: OracleSource;
historicalOracleData: HistoricalOracleData;
lastOracleReservePriceSpreadPct: BN;
lastOracleConfPct: BN;
fundingPeriod: BN;
quoteAssetReserve: BN;
pegMultiplier: BN;
cumulativeFundingRateLong: BN;
cumulativeFundingRateShort: BN;
last24HAvgFundingRate: BN;
lastFundingRateShort: BN;
lastFundingRateLong: BN;
totalLiquidationFee: BN;
totalFeeMinusDistributions: BN;
totalFeeWithdrawn: BN;
totalFee: BN;
totalFeeEarnedPerLp: BN;
userLpShares: BN;
baseAssetAmountWithUnsettledLp: BN;
orderStepSize: BN;
orderTickSize: BN;
maxFillReserveFraction: number;
maxSlippageRatio: number;
baseSpread: number;
curveUpdateIntensity: number;
baseAssetAmountWithAmm: BN;
baseAssetAmountLong: BN;
baseAssetAmountShort: BN;
quoteAssetAmount: BN;
terminalQuoteAssetReserve: BN;
concentrationCoef: BN;
feePool: PoolBalance;
totalExchangeFee: BN;
totalMmFee: BN;
netRevenueSinceLastFunding: BN;
lastUpdateSlot: BN;
lastOracleNormalisedPrice: BN;
lastOracleValid: boolean;
lastBidPriceTwap: BN;
lastAskPriceTwap: BN;
longSpread: number;
shortSpread: number;
maxSpread: number;
baseAssetAmountPerLp: BN;
quoteAssetAmountPerLp: BN;
targetBaseAssetAmountPerLp: number;
ammJitIntensity: number;
maxOpenInterest: BN;
maxBaseAssetReserve: BN;
minBaseAssetReserve: BN;
totalSocialLoss: BN;
quoteBreakEvenAmountLong: BN;
quoteBreakEvenAmountShort: BN;
quoteEntryAmountLong: BN;
quoteEntryAmountShort: BN;
markStd: BN;
oracleStd: BN;
longIntensityCount: number;
longIntensityVolume: BN;
shortIntensityCount: number;
shortIntensityVolume: BN;
volume24H: BN;
minOrderSize: BN;
maxPositionSize: BN;
bidBaseAssetReserve: BN;
bidQuoteAssetReserve: BN;
askBaseAssetReserve: BN;
askQuoteAssetReserve: BN;
perLpBase: number; // i8
};
// # User Account Types
export type PerpPosition = {
baseAssetAmount: BN;
lastCumulativeFundingRate: BN;
marketIndex: number;
quoteAssetAmount: BN;
quoteEntryAmount: BN;
quoteBreakEvenAmount: BN;
openOrders: number;
openBids: BN;
openAsks: BN;
settledPnl: BN;
lpShares: BN;
remainderBaseAssetAmount: number;
lastBaseAssetAmountPerLp: BN;
lastQuoteAssetAmountPerLp: BN;
perLpBase: number;
};
export type UserStatsAccount = {
numberOfSubAccounts: number;
numberOfSubAccountsCreated: number;
makerVolume30D: BN;
takerVolume30D: BN;
fillerVolume30D: BN;
lastMakerVolume30DTs: BN;
lastTakerVolume30DTs: BN;
lastFillerVolume30DTs: BN;
fees: {
totalFeePaid: BN;
totalFeeRebate: BN;
totalTokenDiscount: BN;
totalRefereeDiscount: BN;
totalReferrerReward: BN;
current_epoch_referrer_reward: BN;
};
referrer: PublicKey;
isReferrer: boolean;
authority: PublicKey;
ifStakedQuoteAssetAmount: BN;
};
export type UserAccount = {
authority: PublicKey;
delegate: PublicKey;
name: number[];
subAccountId: number;
spotPositions: SpotPosition[];
perpPositions: PerpPosition[];
orders: Order[];
status: number;
nextLiquidationId: number;
nextOrderId: number;
maxMarginRatio: number;
lastAddPerpLpSharesTs: BN;
settledPerpPnl: BN;
totalDeposits: BN;
totalWithdraws: BN;
totalSocialLoss: BN;
cumulativePerpFunding: BN;
cumulativeSpotFees: BN;
liquidationMarginFreed: BN;
lastActiveSlot: BN;
isMarginTradingEnabled: boolean;
idle: boolean;
openOrders: number;
hasOpenOrder: boolean;
openAuctions: number;
hasOpenAuction: boolean;
};
export type SpotPosition = {
marketIndex: number;
balanceType: SpotBalanceType;
scaledBalance: BN;
openOrders: number;
openBids: BN;
openAsks: BN;
cumulativeDeposits: BN;
};
export type Order = {
status: OrderStatus;
orderType: OrderType;
marketType: MarketType;
slot: BN;
orderId: number;
userOrderId: number;
marketIndex: number;
price: BN;
baseAssetAmount: BN;
quoteAssetAmount: BN;
baseAssetAmountFilled: BN;
quoteAssetAmountFilled: BN;
direction: PositionDirection;
reduceOnly: boolean;
triggerPrice: BN;
triggerCondition: OrderTriggerCondition;
existingPositionDirection: PositionDirection;
postOnly: boolean;
immediateOrCancel: boolean;
oraclePriceOffset: number;
auctionDuration: number;
auctionStartPrice: BN;
auctionEndPrice: BN;
maxTs: BN;
};
export type OrderParams = {
orderType: OrderType;
marketType: MarketType;
userOrderId: number;
direction: PositionDirection;
baseAssetAmount: BN;
price: BN;
marketIndex: number;
reduceOnly: boolean;
postOnly: PostOnlyParams;
immediateOrCancel: boolean;
triggerPrice: BN | null;
triggerCondition: OrderTriggerCondition;
oraclePriceOffset: number | null;
auctionDuration: number | null;
maxTs: BN | null;
auctionStartPrice: BN | null;
auctionEndPrice: BN | null;
};
export class PostOnlyParams {
static readonly NONE = { none: {} };
static readonly MUST_POST_ONLY = { mustPostOnly: {} }; // Tx fails if order can't be post only
static readonly TRY_POST_ONLY = { tryPostOnly: {} }; // Tx succeeds and order not placed if can't be post only
static readonly SLIDE = { slide: {} }; // Modify price to be post only if can't be post only
}
export type NecessaryOrderParams = {
orderType: OrderType;
marketIndex: number;
baseAssetAmount: BN;
direction: PositionDirection;
};
export type OptionalOrderParams = {
[Property in keyof OrderParams]?: OrderParams[Property];
} & NecessaryOrderParams;
export type ModifyOrderParams = {
[Property in keyof OrderParams]?: OrderParams[Property] | null;
} & { policy?: ModifyOrderPolicy };
export class ModifyOrderPolicy {
static readonly MUST_MODIFY = { mustModify: {} };
static readonly TRY_MODIFY = { tryModify: {} };
}
export const DefaultOrderParams: OrderParams = {
orderType: OrderType.MARKET,
marketType: MarketType.PERP,
userOrderId: 0,
direction: PositionDirection.LONG,
baseAssetAmount: ZERO,
price: ZERO,
marketIndex: 0,
reduceOnly: false,
postOnly: PostOnlyParams.NONE,
immediateOrCancel: false,
triggerPrice: null,
triggerCondition: OrderTriggerCondition.ABOVE,
oraclePriceOffset: null,
auctionDuration: null,
maxTs: null,
auctionStartPrice: null,
auctionEndPrice: null,
};
export type MakerInfo = {
maker: PublicKey;
makerStats: PublicKey;
makerUserAccount: UserAccount;
order?: Order;
};
export type TakerInfo = {
taker: PublicKey;
takerStats: PublicKey;
takerUserAccount: UserAccount;
order: Order;
};
export type ReferrerInfo = {
referrer: PublicKey;
referrerStats: PublicKey;
};
export type TxParams = {
computeUnits?: number;
computeUnitsPrice?: number;
};
export class SwapReduceOnly {
static readonly In = { in: {} };
static readonly Out = { out: {} };
}
// # Misc Types
export interface IWallet {
signTransaction(tx: Transaction): Promise<Transaction>;
signAllTransactions(txs: Transaction[]): Promise<Transaction[]>;
publicKey: PublicKey;
}
export interface IVersionedWallet {
signVersionedTransaction(
tx: VersionedTransaction
): Promise<VersionedTransaction>;
signAllVersionedTransactions(
txs: VersionedTransaction[]
): Promise<VersionedTransaction[]>;
publicKey: PublicKey;
}
export type FeeStructure = {
feeTiers: FeeTier[];
fillerRewardStructure: OrderFillerRewardStructure;
flatFillerFee: BN;
referrerRewardEpochUpperBound: BN;
};
export type FeeTier = {
feeNumerator: number;
feeDenominator: number;
makerRebateNumerator: number;
makerRebateDenominator: number;
referrerRewardNumerator: number;
referrerRewardDenominator: number;
refereeFeeNumerator: number;
refereeFeeDenominator: number;
};
export type OrderFillerRewardStructure = {
rewardNumerator: BN;
rewardDenominator: BN;
timeBasedRewardLowerBound: BN;
};
export type OracleGuardRails = {
priceDivergence: {
markOraclePercentDivergence: BN;
oracleTwap5MinPercentDivergence: BN;
};
validity: {
slotsBeforeStaleForAmm: BN;
slotsBeforeStaleForMargin: BN;
confidenceIntervalMaxSize: BN;
tooVolatileRatio: BN;
};
};
export type MarginCategory = 'Initial' | 'Maintenance';
export type InsuranceFundStake = {
costBasis: BN;
marketIndex: number;
authority: PublicKey;
ifShares: BN;
ifBase: BN;
lastWithdrawRequestShares: BN;
lastWithdrawRequestValue: BN;
lastWithdrawRequestTs: BN;
};
export type SerumV3FulfillmentConfigAccount = {
fulfillmentType: SpotFulfillmentType;
status: SpotFulfillmentStatus;
pubkey: PublicKey;
marketIndex: number;
serumProgramId: PublicKey;
serumMarket: PublicKey;
serumRequestQueue: PublicKey;
serumEventQueue: PublicKey;
serumBids: PublicKey;
serumAsks: PublicKey;
serumBaseVault: PublicKey;
serumQuoteVault: PublicKey;
serumOpenOrders: PublicKey;
serumSignerNonce: BN;
};
export type PhoenixV1FulfillmentConfigAccount = {
pubkey: PublicKey;
phoenixProgramId: PublicKey;
phoenixLogAuthority: PublicKey;
phoenixMarket: PublicKey;
phoenixBaseVault: PublicKey;
phoenixQuoteVault: PublicKey;
marketIndex: number;
fulfillmentType: SpotFulfillmentType;
status: SpotFulfillmentStatus;
};
export type ReferrerNameAccount = {
name: number[];
user: PublicKey;
authority: PublicKey;
userStats: PublicKey;
};
export type PerpMarketExtendedInfo = {
marketIndex: number;
/**
* Min order size measured in base asset, using base precision
*/
minOrderSize: BN;
/**
* Margin maintenance percentage, using margin precision (1e4)
*/
marginMaintenance: number;
/**
* Max insurance available, measured in quote asset, using quote preicision
*/
availableInsurance: BN;
/**
* Pnl pool available, this is measured in quote asset, using quote precision.
* Should be generated by using getTokenAmount and passing in the scaled balance of the base asset + quote spot account
*/
pnlPoolValue: BN;
contractTier: ContractTier;
};
export type HealthComponents = {
deposits: HealthComponent[];
borrows: HealthComponent[];
perpPositions: HealthComponent[];
perpPnl: HealthComponent[];
};
export type HealthComponent = {
marketIndex: number;
size: BN;
value: BN;
weight: BN;
weightedValue: BN;
};