///
import { BN } from '@coral-xyz/anchor';
import { PublicKey } from '@solana/web3.js';
import { MangoClient } from '../client';
import { I80F48, I80F48Dto } from '../numbers/I80F48';
import { Modify } from '../types';
import { As } from '../utils';
import { OracleConfig, OracleConfigDto, StablePriceModel, TokenIndex } from './bank';
import { Group } from './group';
import { MangoAccount } from './mangoAccount';
import { OracleProvider } from './oracle';
export type PerpMarketIndex = number & As<'perp-market-index'>;
export type ParsedFillEvent = Modify;
export declare class PerpMarket {
publicKey: PublicKey;
group: PublicKey;
settleTokenIndex: TokenIndex;
perpMarketIndex: PerpMarketIndex;
groupInsuranceFund: boolean;
baseDecimals: number;
bids: PublicKey;
asks: PublicKey;
eventQueue: PublicKey;
oracle: PublicKey;
stablePriceModel: StablePriceModel;
quoteLotSize: BN;
baseLotSize: BN;
openInterest: BN;
seqNum: BN;
registrationTime: BN;
impactQuantity: BN;
fundingLastUpdated: BN;
feePenalty: number;
settleFeeFlat: number;
settleFeeAmountThreshold: number;
settleFeeFractionLowHealth: number;
settlePnlLimitFactor: number;
settlePnlLimitWindowSizeTs: BN;
reduceOnly: boolean;
forceClose: boolean;
name: string;
oracleConfig: OracleConfig;
maintBaseAssetWeight: I80F48;
initBaseAssetWeight: I80F48;
maintBaseLiabWeight: I80F48;
initBaseLiabWeight: I80F48;
baseLiquidationFee: I80F48;
makerFee: I80F48;
takerFee: I80F48;
minFunding: I80F48;
maxFunding: I80F48;
longFunding: I80F48;
shortFunding: I80F48;
feesAccrued: I80F48;
feesSettled: I80F48;
maintOverallAssetWeight: I80F48;
initOverallAssetWeight: I80F48;
positivePnlLiquidationFee: I80F48;
_price: I80F48;
_uiPrice: number;
_oracleLastUpdatedSlot: number;
_oracleLastKnownDeviation: I80F48 | undefined;
_oracleProvider: OracleProvider;
_bids: BookSide;
_asks: BookSide;
private priceLotsToUiConverter;
private baseLotsToUiConverter;
private quoteLotsToUiConverter;
static from(publicKey: PublicKey, obj: {
group: PublicKey;
settleTokenIndex: number;
perpMarketIndex: number;
groupInsuranceFund: number;
baseDecimals: number;
name: number[];
bids: PublicKey;
asks: PublicKey;
eventQueue: PublicKey;
oracle: PublicKey;
oracleConfig: OracleConfigDto;
stablePriceModel: StablePriceModel;
quoteLotSize: BN;
baseLotSize: BN;
maintBaseAssetWeight: I80F48Dto;
initBaseAssetWeight: I80F48Dto;
maintBaseLiabWeight: I80F48Dto;
initBaseLiabWeight: I80F48Dto;
openInterest: BN;
seqNum: BN;
registrationTime: BN;
minFunding: I80F48Dto;
maxFunding: I80F48Dto;
impactQuantity: BN;
longFunding: I80F48Dto;
shortFunding: I80F48Dto;
fundingLastUpdated: BN;
baseLiquidationFee: I80F48Dto;
makerFee: I80F48Dto;
takerFee: I80F48Dto;
feesAccrued: I80F48Dto;
feesSettled: I80F48Dto;
feePenalty: number;
settleFeeFlat: number;
settleFeeAmountThreshold: number;
settleFeeFractionLowHealth: number;
settlePnlLimitFactor: number;
settlePnlLimitWindowSizeTs: BN;
reduceOnly: number;
forceClose: number;
maintOverallAssetWeight: I80F48Dto;
initOverallAssetWeight: I80F48Dto;
positivePnlLiquidationFee: I80F48Dto;
}): PerpMarket;
constructor(publicKey: PublicKey, group: PublicKey, settleTokenIndex: TokenIndex, perpMarketIndex: PerpMarketIndex, // TODO rename to marketIndex?
groupInsuranceFund: boolean, baseDecimals: number, name: number[], bids: PublicKey, asks: PublicKey, eventQueue: PublicKey, oracle: PublicKey, oracleConfig: OracleConfigDto, stablePriceModel: StablePriceModel, quoteLotSize: BN, baseLotSize: BN, maintBaseAssetWeight: I80F48Dto, initBaseAssetWeight: I80F48Dto, maintBaseLiabWeight: I80F48Dto, initBaseLiabWeight: I80F48Dto, openInterest: BN, seqNum: BN, registrationTime: BN, minFunding: I80F48Dto, maxFunding: I80F48Dto, impactQuantity: BN, longFunding: I80F48Dto, shortFunding: I80F48Dto, fundingLastUpdated: BN, baseLiquidationFee: I80F48Dto, makerFee: I80F48Dto, takerFee: I80F48Dto, feesAccrued: I80F48Dto, feesSettled: I80F48Dto, feePenalty: number, settleFeeFlat: number, settleFeeAmountThreshold: number, settleFeeFractionLowHealth: number, settlePnlLimitFactor: number, settlePnlLimitWindowSizeTs: BN, reduceOnly: boolean, forceClose: boolean, maintOverallAssetWeight: I80F48Dto, initOverallAssetWeight: I80F48Dto, positivePnlLiquidationFee: I80F48Dto);
isOracleStaleOrUnconfident(nowSlot: number): boolean;
get price(): I80F48;
get uiPrice(): number;
get oracleLastUpdatedSlot(): number;
get oracleProvider(): OracleProvider;
get minOrderSize(): number;
get tickSize(): number;
insidePriceLimit(side: PerpOrderSide, orderPrice: number): boolean;
loadAsks(client: MangoClient, forceReload?: boolean): Promise;
loadBids(client: MangoClient, forceReload?: boolean): Promise;
loadEventQueue(client: MangoClient): Promise;
loadFills(client: MangoClient, lastSeqNum?: BN): Promise;
parseFillEvent(event: any): ParsedFillEvent;
logOb(client: MangoClient): Promise;
/**
*
* @param bids
* @param asks
* @returns returns instantaneous funding rate
*/
getInstantaneousFundingRate(bids: BookSide, asks: BookSide): number;
getInstantaneousFundingRatePerSecond(bids: BookSide, asks: BookSide): number;
/**
*
* Returns instantaneous funding rate for the day. How is it actually applied - funding is
* continously applied on every interaction to a perp position. The rate is further multiplied
* by the time elapsed since it was last applied (capped to max. 1hr).
*
* @param bids
* @param asks
* @returns returns instantaneous funding rate in % form
*/
getInstantaneousFundingRateUi(bids: BookSide, asks: BookSide): number;
uiPriceToLots(price: number): BN;
uiBaseToLots(quantity: number): BN;
uiQuoteToLots(uiQuote: number): BN;
priceLotsToNative(price: BN): I80F48;
priceLotsToUi(price: BN): number;
priceNativeToUi(price: number): number;
baseLotsToUi(quantity: BN): number;
quoteLotsToUi(quantity: BN): number;
/**
* Returns a list of (upto count) accounts, and the pnl that is settle'able on this perp market,
* the list is sorted ascending for 'negative' direction and descending for 'positive' direction.
*
* NOTE: keep in sync with perp_pnl.rs:fetch_top
*
* TODO: replace with a more performant offchain service call
* @param client
* @param group
* @param direction
* @returns
*/
getSettlePnlCandidates(client: MangoClient, group: Group, accounts?: MangoAccount[], direction?: 'negative' | 'positive', count?: number): Promise<{
account: MangoAccount;
settleablePnl: I80F48;
}[]>;
toString(): string;
}
interface OrderTreeNodes {
bumpIndex: number;
freeListLen: number;
freeListHead: number;
nodes: [any];
}
interface OrderTreeRoot {
maybeNode: number;
leafCount: number;
}
export declare class BookSide {
client: MangoClient;
perpMarket: PerpMarket;
type: BookSideType;
rootFixed: OrderTreeRoot;
rootOraclePegged: OrderTreeRoot;
orderTreeNodes: OrderTreeNodes;
private static INNER_NODE_TAG;
private static LEAF_NODE_TAG;
now: BN;
static from(client: MangoClient, perpMarket: PerpMarket, bookSideType: BookSideType, obj: {
roots: OrderTreeRoot[];
nodes: OrderTreeNodes;
}): BookSide;
constructor(client: MangoClient, perpMarket: PerpMarket, type: BookSideType, rootFixed: OrderTreeRoot, rootOraclePegged: OrderTreeRoot, orderTreeNodes: OrderTreeNodes, maxBookDelay?: number);
static getPriceFromKey(key: BN): BN;
/**
* iterates over all orders
*/
items(): Generator;
/**
* iterates over all orders,
* skips oracle pegged orders which are invalid due to oracle price crossing the peg limit,
* skips tif orders which are invalid due to tif having elapsed,
*/
itemsValid(): Generator;
fixedItems(): Generator;
oraclePeggedItems(): Generator;
best(): PerpOrder | undefined;
getImpactPriceUi(baseLots: BN): number | undefined;
getL2(depth: number): [number, number, BN, BN][];
getL2Ui(depth: number): [number, number][];
static toInnerNode(client: MangoClient, data: [number]): InnerNode;
static toLeafNode(client: MangoClient, data: [number]): LeafNode;
}
export type BookSideType = {
bids: Record;
} | {
asks: Record;
};
export declare namespace BookSideType {
const bids: {
bids: {};
};
const asks: {
asks: {};
};
}
export declare class LeafNode {
ownerSlot: number;
orderType: PerpOrderType;
timeInForce: number;
key: BN;
owner: PublicKey;
quantity: BN;
timestamp: BN;
pegLimit: BN;
static from(obj: {
ownerSlot: number;
orderType: PerpOrderType;
timeInForce: number;
key: BN;
owner: PublicKey;
quantity: BN;
timestamp: BN;
pegLimit: BN;
}): LeafNode;
constructor(ownerSlot: number, orderType: PerpOrderType, timeInForce: number, key: BN, owner: PublicKey, quantity: BN, timestamp: BN, pegLimit: BN);
}
export declare class InnerNode {
children: [number];
static from(obj: {
children: [number];
}): InnerNode;
constructor(children: [number]);
}
export type PerpSelfTradeBehavior = {
decrementTake: Record;
} | {
cancelProvide: Record;
} | {
abortTransaction: Record;
};
export declare namespace PerpSelfTradeBehavior {
const decrementTake: {
decrementTake: {};
};
const cancelProvide: {
cancelProvide: {};
};
const abortTransaction: {
abortTransaction: {};
};
}
export type PerpOrderSide = {
bid: Record;
} | {
ask: Record;
};
export declare namespace PerpOrderSide {
const bid: {
bid: {};
};
const ask: {
ask: {};
};
}
export type PerpOrderType = {
limit: Record;
} | {
immediateOrCancel: Record;
} | {
postOnly: Record;
} | {
market: Record;
} | {
postOnlySlide: Record;
};
export declare namespace PerpOrderType {
const limit: {
limit: {};
};
const immediateOrCancel: {
immediateOrCancel: {};
};
const postOnly: {
postOnly: {};
};
const market: {
market: {};
};
const postOnlySlide: {
postOnlySlide: {};
};
}
export declare class PerpOrder {
seqNum: BN;
orderId: BN;
owner: PublicKey;
openOrdersSlot: number;
feeTier: 0;
uiPrice: number;
priceLots: BN;
uiSize: number;
sizeLots: BN;
side: PerpOrderSide;
timestamp: BN;
expiryTimestamp: BN;
perpMarketIndex: number;
isExpired: boolean;
isOraclePegged: boolean;
orderType: PerpOrderType;
oraclePeggedProperties?: OraclePeggedProperties | undefined;
static from(perpMarket: PerpMarket, leafNode: LeafNode, type: BookSideType, isExpired?: boolean, isOraclePegged?: boolean): PerpOrder;
constructor(seqNum: BN, orderId: BN, owner: PublicKey, openOrdersSlot: number, feeTier: 0, uiPrice: number, priceLots: BN, uiSize: number, sizeLots: BN, side: PerpOrderSide, timestamp: BN, expiryTimestamp: BN, perpMarketIndex: number, isExpired: boolean, isOraclePegged: boolean, orderType: PerpOrderType, oraclePeggedProperties?: OraclePeggedProperties | undefined);
get price(): number;
get size(): number;
}
interface OraclePeggedProperties {
isInvalid: boolean;
priceOffset: BN;
uiPriceOffset: number;
pegLimit: BN;
uiPegLimit: number;
}
export declare class PerpEventQueue {
static FILL_EVENT_TYPE: number;
static OUT_EVENT_TYPE: number;
static LIQUIDATE_EVENT_TYPE: number;
head: number;
count: number;
seqNum: BN;
rawEvents: (OutEvent | FillEvent | LiquidateEvent)[];
constructor(client: MangoClient, header: {
head: number;
count: number;
seqNum: BN;
}, buf: any);
getUnconsumedEvents(): (OutEvent | FillEvent | LiquidateEvent)[];
eventsSince(lastSeqNum?: BN): (OutEvent | FillEvent | LiquidateEvent)[];
}
export interface Event {
eventType: number;
}
export interface OutEvent extends Event {
side: PerpOrderType;
ownerSlot: number;
timestamp: BN;
seqNum: BN;
owner: PublicKey;
quantity: BN;
}
export interface FillEvent extends Event {
takerSide: 0 | 1;
makerOut: boolean;
makerSlot: number;
timestamp: BN;
seqNum: BN;
maker: PublicKey;
makerOrderId: BN;
makerFee: number;
makerTimestamp: BN;
taker: PublicKey;
takerOrderId: BN;
takerClientOrderId: BN;
takerFee: number;
price: number;
quantity: number;
}
export interface LiquidateEvent extends Event {
seqNum: BN;
}
export {};
//# sourceMappingURL=perp.d.ts.map