@d8x/perpetuals-sdk
Version:
Node TypeScript SDK for D8X Perpetual Futures
505 lines (504 loc) • 14.4 kB
TypeScript
import { BigNumberish, BytesLike, ContractTransactionResponse, Interface } from "ethers";
import { CollaterlCCY } from "./constants";
export interface NodeSDKConfig {
name: string | undefined;
chainId: number;
version: number;
nodeURL: string;
configSource: string;
proxyAddr: string;
proxyABILocation: string;
shareTokenABILocation: string;
limitOrderBookABILocation: string;
limitOrderBookFactoryABILocation: string;
symbolListLocation: string;
priceFeedConfigNetwork: string;
gasLimit?: number | undefined;
proxyABI?: Interface | undefined;
lobFactoryABI?: Interface | undefined;
lobABI?: Interface | undefined;
shareTokenABI?: Interface | undefined;
priceFeedEndpoints?: PriceFeedEndpointsOptionalWrite;
multicall?: string;
}
export type SettlementConfig = SettlementCcyItem[];
export interface SettlementCcyItem {
perpFlags: bigint;
description: string;
settleTokenDecimals: number;
settleCCY: string;
settleCCYAddr: string;
collateralCCY: string;
collateralCCYAddr: string;
triangulation: string[];
}
export interface MarginAccount {
symbol: string;
positionNotionalBaseCCY: number;
side: string;
entryPrice: number;
leverage: number;
markPrice: number;
unrealizedPnlQuoteCCY: number;
unrealizedFundingCollateralCCY: number;
collateralCC: number;
liquidationPrice: [number, number | undefined];
liquidationLvg: number;
collToQuoteConversion: number;
}
export interface PoolStaticInfo {
poolId: number;
poolMarginSymbol: string;
poolMarginTokenAddr: string;
poolMarginTokenDecimals: number;
poolSettleSymbol: string;
poolSettleTokenAddr: string;
poolSettleTokenDecimals: number;
MgnToSettleTriangulation: string[];
shareTokenAddr: string;
oracleFactoryAddr: string;
isRunning: boolean;
}
export interface PerpetualStaticInfo {
id: number;
poolId: number;
state: string;
limitOrderBookAddr: string;
initialMarginRate: number;
maintenanceMarginRate: number;
collateralCurrencyType: CollaterlCCY;
S2Symbol: string;
S3Symbol: string;
lotSizeBC: number;
referralRebate: number;
priceIds: string[];
isPyth: boolean[];
perpFlags: bigint;
fAMMTargetDD: bigint;
}
/**
* @global
* @typedef {Object} ExchangeInfo
* @property {PoolState[]} pools Array of state objects for all pools in the exchange.
* @property {string} oracleFactoryAddr Address of the oracle factory used by the pools in the exchange.
*/
export interface ExchangeInfo {
pools: PoolState[];
oracleFactoryAddr: string;
proxyAddr: string;
}
/**
* @global
* @typedef {Object} PoolState
* @property {boolean} isRunning True if the pool is running.
* @property {string} marginTokenAddr Address of the token used by the pool.
* This is the token used for margin deposits, liquidity provision, and trading fees.
* @property {string} poolShareTokenAddr Address of the pool share token.
* This is the token issued to external liquidity providers.
* @property {number} defaultFundCashCC Amount of cash in the default fund of this pool, denominated in margin tokens.
* @property {number} pnlParticipantCashCC Amount of cash in the PnL participation pool, i.e. cash deposited by external liquidity providers.
* @property {number} totalTargetAMMFundSizeCC Target AMM funds aggregated across all perpetuals in this pool.
* @property {number} brokerCollateralLotSize Price of one lot for brokers who wish to participate in this pool. Denominated in margin tokens.
* @property {PerpetualState[]} perpetuals Array of all perpetuals in this pool.
*/
export interface PoolState {
isRunning: boolean;
poolSymbol: string;
settleSymbol: string;
marginTokenAddr: string;
settleTokenAddr: string;
poolShareTokenAddr: string;
defaultFundCashCC: number;
pnlParticipantCashCC: number;
totalTargetAMMFundSizeCC: number;
brokerCollateralLotSize: number;
perpetuals: PerpetualState[];
}
export interface PerpetualState {
id: number;
state: string;
baseCurrency: string;
quoteCurrency: string;
indexPrice: number;
collToQuoteIndexPrice: number;
markPremium: number;
markPrice: number;
midPrice: number;
currentFundingRateBps: number;
openInterestBC: number;
longBC: number;
shortBC: number;
isMarketClosed: boolean;
}
export interface OrderResponse {
tx: ContractTransactionResponse;
orderId: string;
}
export interface OrderStruct {
orders: Order[];
orderIds: string[];
}
export interface Order {
symbol: string;
side: string;
type: string;
quantity: number;
reduceOnly?: boolean | undefined;
limitPrice?: number | undefined;
keepPositionLvg?: boolean | undefined;
brokerFeeTbps?: number | undefined;
brokerAddr?: string | undefined;
brokerSignature?: BytesLike | undefined;
stopPrice?: number | undefined;
leverage?: number | undefined;
deadline?: number | undefined;
executionTimestamp: number;
submittedTimestamp?: number;
parentChildOrderIds?: [string, string];
}
export interface TradeEvent {
perpetualId: number;
positionId: string;
orderId: string;
newPositionSizeBC: number;
executionPrice: number;
}
/**
* @global
* @typedef {Object} SmartContractOrder
* @property {bigint} flags
* @property {number} iPerpetualId
* @property {number} brokerFeeTbps
* @property {string} traderAddr
* @property {string} brokerAddr
* @property {string} executorAddr
* @property {BytesLike} brokerSignature
* @property {bigint} fAmount
* @property {bigint} fLimitPrice
* @property {bigint} fTriggerPrice
* @property {number} leverageTDR
* @property {number} iDeadline
* @property {number} executionTimestamp
* @property {number} submittedTimestamp
*/
export interface SmartContractOrder {
flags: BigNumberish;
iPerpetualId: BigNumberish;
brokerFeeTbps: BigNumberish;
traderAddr: string;
brokerAddr: string;
executorAddr: string;
brokerSignature: BytesLike;
fAmount: bigint;
fLimitPrice: bigint;
fTriggerPrice: bigint;
leverageTDR: BigNumberish;
iDeadline: BigNumberish;
executionTimestamp: BigNumberish;
submittedTimestamp: BigNumberish;
}
/**
* @global
* @typedef {Object} ClientOrder
* @property {bigint} flags
* @property {bigint} iPerpetualId
* @property {bigint} brokerFeeTbps
* @property {string} traderAddr
* @property {string} brokerAddr
* @property {string} executorAddr
* @property {BytesLike} brokerSignature
* @property {bigint} fAmount
* @property {bigint} fLimitPrice
* @property {bigint} fTriggerPrice
* @property {bigint} leverageTDR
* @property {bigint} iDeadline
* @property {bigint} executionTimestamp
* @property {string} parentChildDigest1
* @property {string} parentChildDigest2
* @property {string} callbackTarget
*/
export interface ClientOrder {
flags: BigNumberish;
iPerpetualId: BigNumberish;
brokerFeeTbps: BigNumberish;
traderAddr: string;
brokerAddr: string;
executorAddr: string;
brokerSignature: BytesLike;
fAmount: bigint;
fLimitPrice: bigint;
fTriggerPrice: bigint;
leverageTDR: BigNumberish;
iDeadline: BigNumberish;
executionTimestamp: BigNumberish;
parentChildDigest1: string;
parentChildDigest2: string;
callbackTarget: string;
}
export interface TypeSafeOrder {
flags: bigint;
iPerpetualId: number;
brokerFeeTbps: number;
traderAddr: string;
brokerAddr: string;
brokerSignature: string;
fAmount: bigint;
fLimitPrice: bigint;
fTriggerPrice: bigint;
leverageTDR: number;
iDeadline: number;
executionTimestamp: number;
parentChildDigest1: string;
parentChildDigest2: string;
callbackTarget: string;
}
export interface PriceFeedConfig {
network: string;
ids: Array<{
symbol: string;
id: string;
type: string;
origin: string;
}>;
endpoints: PriceFeedEndpoints;
}
export interface PriceFeedEndpointsItem {
type: string | "odin" | "pyth" | "onchain" | "v2" | "v3" | "low-liq" | "polymarket";
endpoints: string[];
writeEndpoints?: string[];
}
export type PriceFeedEndpoints = Array<Required<PriceFeedEndpointsItem>>;
export type PriceFeedEndpointsOptionalWrite = Array<PriceFeedEndpointsItem>;
export interface PriceFeedSubmission {
symbols: Map<string, string[]>;
ids: string[];
priceFeedVaas: string[];
prices: number[];
isMarketClosed: boolean[];
timestamps: number[];
}
export interface PriceFeedFormat {
conf: bigint;
expo: number;
price: bigint;
publish_time: number;
}
export interface PriceFeedJson {
conf: string;
expo: number;
price: string;
publish_time: number;
}
export interface PythV2MetaData {
slot: number;
proof_available_time: number;
prev_publish_time: number;
}
export interface PythV2LatestPriceFeed {
binary: {
encoding: string;
data: string[];
};
parsed: [
{
ema_price: PriceFeedFormat;
id: string;
price: PriceFeedFormat;
metadata: PythV2MetaData;
}
];
}
export interface APIReferralCodePayload {
code: string;
referrerAddr: string;
createdOn: number;
passOnPercTDF: number;
signature: string;
}
export interface APIReferPayload {
parentAddr: string;
referToAddr: string;
passOnPercTDF: number;
createdOn: number;
signature: string;
}
export interface APIReferralCodeSelectionPayload {
code: string;
traderAddr: string;
createdOn: number;
signature: string;
}
export interface GasPriceV2 {
maxPriorityFee: number;
maxfee: number;
}
export interface GasInfo {
safeLow: number | GasPriceV2;
standard: number | GasPriceV2;
fast: number | GasPriceV2;
fastest?: number;
estimatedBaseFee?: number;
blockTime: number;
blockNumber: number;
}
export interface TokenOverride {
tokenAddress: string;
newSymbol: string;
}
/**
* Perpetualdata corresponding to the data in the smart contract
*/
export interface PerpetualData {
poolId: number;
id: number;
fInitialMarginRate: number;
fSigma2: number;
iLastFundingTime: number;
fDFCoverNRate: number;
fMaintenanceMarginRate: number;
perpetualState: string;
eCollateralCurrency: number;
S2BaseCCY: string;
S2QuoteCCY: string;
incentiveSpreadBps: number;
minimalSpreadBps: number;
S3BaseCCY: string;
S3QuoteCCY: string;
fSigma3: number;
fRho23: number;
liquidationPenaltyRateBps: number;
currentMarkPremiumRatePrice: number;
currentMarkPremiumRateTime: number;
premiumRatesEMA: number;
fUnitAccumulatedFunding: number;
fOpenInterest: number;
fTargetAMMFundSize: number;
fCurrentTraderExposureEMA: number;
fCurrentFundingRate: number;
fLotSizeBC: number;
fReferralRebateCC: number;
fTargetDFSize: number;
fkStar: number;
fAMMTargetDD: number;
perpFlags: bigint;
fMinimalTraderExposureEMA: number;
fMinimalAMMExposureEMA: number;
fSettlementS3PriceData: number;
fSettlementS2PriceData: number;
fTotalMarginBalance: number;
fMarkPriceEMALambda: number;
fFundingRateClamp: number;
fMaximalTradeSizeBumpUp: number;
iLastTargetPoolSizeTime: number;
fStressReturnS3: [number, number];
fDFLambda: [number, number];
fCurrentAMMExposureEMA: [number, number];
fStressReturnS2: [number, number];
}
/**
* LiquidityPoolData corresponding to the data in the smart contract
*/
export interface LiquidityPoolData {
isRunning: boolean;
iPerpetualCount: number;
id: number;
fCeilPnLShare: number;
marginTokenDecimals: number;
iTargetPoolSizeUpdateTime: number;
marginTokenAddress: string;
prevAnchor: number;
fRedemptionRate: number;
shareTokenAddress: string;
fPnLparticipantsCashCC: number;
fTargetAMMFundSize: number;
fDefaultFundCashCC: number;
fTargetDFSize: number;
fBrokerCollateralLotSize: number;
prevTokenAmount: number;
nextTokenAmount: number;
totalSupplyShareToken: number;
fBrokerFundCashCC: number;
}
export declare const referralDomain: {
readonly name: "Referral System";
};
export declare const referralTypes: {
readonly NewCode: readonly [{
readonly name: "Code";
readonly type: "string";
}, {
readonly name: "ReferrerAddr";
readonly type: "address";
}, {
readonly name: "PassOnPercTDF";
readonly type: "uint32";
}, {
readonly name: "CreatedOn";
readonly type: "uint256";
}];
readonly NewReferral: readonly [{
readonly name: "ParentAddr";
readonly type: "address";
}, {
readonly name: "ReferToAddr";
readonly type: "address";
}, {
readonly name: "PassOnPercTDF";
readonly type: "uint32";
}, {
readonly name: "CreatedOn";
readonly type: "uint256";
}];
readonly CodeSelection: readonly [{
readonly name: "Code";
readonly type: "string";
}, {
readonly name: "TraderAddr";
readonly type: "address";
}, {
readonly name: "CreatedOn";
readonly type: "uint256";
}];
readonly EIP712Domain: readonly [{
readonly name: "name";
readonly type: "string";
}];
};
export interface IdxPriceInfo {
s2: number;
s3?: number;
ema: number;
s2MktClosed: boolean;
s3MktClosed?: boolean;
conf: bigint;
predMktCLOBParams: bigint;
}
export interface PredMktPriceInfo {
s2: number;
ema: number;
s2MktClosed: boolean;
conf: bigint;
predMktCLOBParams: bigint;
}
export interface PythMetadata {
id: string;
market_hours: {
is_open: boolean;
next_open?: number;
next_close?: number;
};
attributes: {
symbol?: string;
asset_type?: string;
base?: string;
cms_symbol?: string;
country?: string;
cqs_symbol?: string;
description?: string;
display_symbol?: string;
nasdaq_symbol?: string;
publish_interval?: string;
quote_currency?: string;
schedule?: string;
};
}