UNPKG

@d8x/perpetuals-sdk

Version:

Node TypeScript SDK for D8X Perpetual Futures

282 lines (281 loc) 15.1 kB
import { BigNumberish } from "ethers"; /** * @module d8xMath */ /** * Convert ABK64x64/2^35 bigint-format to float. * Divide by 2^64 to get a float, but it's already "divided" by 2^35, * so there's only 2^29 left * @param {BigNumber|number} x number in ABDK-format/2^35 * @returns {number} x/2^64 in number-format (float) */ export declare function ABDK29ToFloat(x: bigint | number): number; /** * Convert ABK64x64 bigint-format to float. * Result = x/2^64 if big number, x/2^29 if number * @param {BigNumberish|number} x number in ABDK-format or 2^29 * @returns {number} x/2^64 in number-format (float) */ export declare function ABK64x64ToFloat(x: bigint | number): number; /** * * @param {BigNumberish} x BigNumber in Dec-N format * @returns {number} x as a float (number) */ export declare function decNToFloat(x: BigNumberish, numDec: BigNumberish): number; /** * * @param {BigNumberish} x BigNumber in Dec18 format * @returns {number} x as a float (number) */ export declare function dec18ToFloat(x: BigNumberish): number; /** * Converts x into ABDK64x64 format * @param {number} x number (float) * @returns {bigint} x^64 in big number format */ export declare function floatToABK64x64(x: number): bigint; /** * * @param {number} x number (float) * @returns {BigNumber} x as a BigNumber in Dec18 format */ export declare function floatToDec18(x: number): bigint; /** * * @param {number} x number (float) * @param {number} decimals number of decimals * @returns {BigNumber} x as a BigNumber in Dec18 format */ export declare function floatToDecN(x: number, decimals: number): bigint; /** * 9 are rounded up regardless of precision, e.g, 0.1899000 at precision 6 results in 3 * @param {number} x * @param {number} precision * @returns number of decimals */ export declare function countDecimalsOf(x: number, precision: number): number; /** * Round a number to a given lot size and return a string formated * to for this lot-size * @param {number} x number to round * @param {number} lot lot size (could be 'uneven' such as 0.019999999 instead of 0.02) * @param {number} precision optional lot size precision (e.g. if 0.01999 should be 0.02 then precision could be 5) * @returns formated number string */ export declare function roundToLotString(x: number, lot: number, precision?: number): string; /** * * @param {bigint} x * @param {bigint} y * @returns {bigint} x * y */ export declare function mul64x64(x: bigint, y: bigint): bigint; /** * * @param {bigint} x * @param {bigint} y * @returns {bigint} x / y */ export declare function div64x64(x: bigint, y: bigint): bigint; /** * Determine the liquidation price * @param {number} LockedInValueQC - trader locked in value in quote currency * @param {number} position - trader position in base currency * @param {number} cash_cc - trader available margin cash in collateral currency * @param {number} maintenance_margin_rate - maintenance margin ratio * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quuote collateral, = index S3 if quanto) * @returns {number} Amount to be deposited to have the given leverage when trading into position pos */ export declare function calculateLiquidationPriceCollateralBase(LockedInValueQC: number, position: number, cash_cc: number, maintenance_margin_rate: number): number; /** * Determine the liquidation price * @param {number} LockedInValueQC - trader locked in value in quote currency * @param {number} position - trader position in base currency * @param {number} cash_cc - trader available margin cash in collateral currency * @param {number} maintenance_margin_rate - maintenance margin ratio * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quuote collateral, = index S3 if quanto) * @param {number} Sm - mark price * @returns {number} Amount to be deposited to have the given leverage when trading into position pos */ export declare function calculateLiquidationPriceCollateralQuantoConservative(LockedInValueQC: number, position: number, cash_cc: number, maintenance_margin_rate: number, S3: number, Sm: number): number; /** * Determine the liquidation price for quanto -- assuming quanto currency value remains constant * See calculateLiquidationPriceCollateralQuantoConservative for a more conservative version * @param {number} LockedInValueQC - trader locked in value in quote currency * @param {number} position - trader position in base currency * @param {number} cash_cc - trader available margin cash in collateral currency * @param {number} maintenance_margin_rate - maintenance margin ratio * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quuote collateral, = index S3 if quanto) * @param {number} Sm - mark price * @returns {number} Amount to be deposited to have the given leverage when trading into position pos */ export declare function calculateLiquidationPriceCollateralQuanto(LockedInValueQC: number, position: number, cash_cc: number, maintenance_margin_rate: number, S3: number, Sm: number): number; /** * Determine the liquidation price * @param {number} LockedInValueQC - trader locked in value in quote currency * @param {number} position - trader position in base currency * @param {number} cash_cc - trader available margin cash in collateral currency * @param {number} maintenance_margin_rate - maintenance margin ratio * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quuote collateral, = index S3 if quanto) * @returns {number} Amount to be deposited to have the given leverage when trading into position pos */ export declare function calculateLiquidationPriceCollateralQuote(LockedInValueQC: number, position: number, cash_cc: number, maintenance_margin_rate: number): number; /** * * @param targetLeverage Leverage of the resulting position. It must be positive unless the resulting position is closed. * @param currentPosition Current position size, in base currency, signed. * @param currentLockedInValue Current locked in value, average entry price times position size, in quote currency. * @param tradeAmount Trade amount, in base currency, signed. * @param markPrice Mark price, positive. * @param indexPriceS2 Index price, positive. * @param indexPriceS3 Collateral index price, positive. * @param tradePrice Expected price to trade tradeAmount. * @param feeRate * @returns {number} Total collateral amount needed for the new position to have he desired leverage. */ export declare function getMarginRequiredForLeveragedTrade(targetLeverage: number | undefined, currentPosition: number, currentLockedInValue: number, tradeAmount: number, markPrice: number, indexPriceS2: number, indexPriceS3: number, tradePrice: number, feeRate: number): number; export declare function getMaxSignedPositionSize(marginCollateral: number, currentPosition: number, currentLockedInValue: number, direction: number, limitPrice: number, initialMarginRate: number, feeRate: number, markPrice: number, indexPriceS2: number, indexPriceS3: number): number; /** * Compute the leverage resulting from a trade * @param tradeAmount Amount to trade, in base currency, signed * @param marginCollateral Amount of cash in the margin account, in collateral currency * @param currentPosition Position size before the trade * @param currentLockedInValue Locked-in value before the trade * @param price Price charged to trade tradeAmount * @param indexPriceS3 Spot price of the collateral currency when the trade happens * @param markPrice Mark price of the index when the trade happens * @returns Leverage of the resulting position */ export declare function getNewPositionLeverage(tradeAmount: number, marginCollateral: number, currentPosition: number, currentLockedInValue: number, price: number, indexPriceS3: number, markPrice: number): number; /** * Determine amount to be deposited into margin account so that the given leverage * is obtained when trading a position pos (trade amount = position) * Does NOT include fees * Smart contract equivalent: calcMarginForTargetLeverage(..., _ignorePosBalance = false & balance = b0) * @param {number} pos0 - current position * @param {number} b0 - current balance * @param {number} tradeAmnt - amount to trade * @param {number} targetLvg - target leverage * @param {number} price - price to trade amount 'tradeAmnt' * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto) * @param {number} S2Mark - mark price * @param {number} cmin - Absolute minimum margin per contract, only for pred markets * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees */ export declare function getDepositAmountForLvgTrade(pos0: number, b0: number, tradeAmnt: number, targetLvg: number, price: number, S3: number, S2Mark: number, cmin: number | undefined): number; /** * Determine amount to be deposited into margin account so that the given leverage * is obtained when opening a prediction market position * Does NOT include fees, but accounts for a possible non-zero current position * Smart contract equivalent: getDepositAmountForPredMktLvgPosition * @param {number} pos0 - current position * @param {number} b0 - current balance * @param {number} c0 - current available cash * @param {number} tradeAmnt - amount to trade * @param {number} targetLvg - target leverage * @param {number} prob - prob to trade amount 'tradeAmnt' * @param {number} S3 - collateral to quote conversion (=S2 if base-collateral, =1 if quote collateral, = index S3 if quanto) * @param {number} markProb - mark prob * @param {number} imr - minimum absolute margin per contract (fInitialMarginRate) * @returns {number} Amount to be deposited to have the given leverage when trading into position pos before fees */ export declare function getDepositAmountForPredMktLvgTrade(pos0: number, b0: number, c0: number, tradeAmnt: number, targetLvg: number, prob: number, S3: number, markProb: number, imr: number): number; /** * Convert a perpetual price to probability (predtictive markets) * @param px Perpetual price * @returns Probability in [0,1] */ export declare function priceToProb(px: number): number; /** * Convert a probability to a predictive market price * @param prob Probability in [0,1] * @returns Perpetual price */ export declare function probToPrice(prob: number): number; export declare function entropy(prob: number): number; export declare function pmMaintenanceMarginRate(position: number, lockedInQC: number, sm: number, m: number): number; /** * Initial margin rate for prediction markets. * @param posSign sign of position in base currency (can be signed position or -1, 1) * @param s0 trade price * @param sm mark-price (=1+p) * @param cmin Absolute min margin saved as `fInitialMarginRate` * @returns {number} The margin rate to be applied: `(Math.abs(pos) * p * tau) / s3` */ export declare function pmInitialMarginRate(posSign: number, s0: number, sm: number, cmin: number): number; /** * Exchange fee as a rate for prediction markets * For opening trades only * @param prob long probability * @param m max maintenance margin rate (0.18) * @param tradeAmt trade amount in base currency * @param tradeMgnRate margin rate for this trade * @returns dollar fee relative to tradeAmt */ export declare function pmExchangeFee(prob: number, m: number, tradeAmt: number, tradeMgnRate: number): number; export declare function pmExitFee(varphi: number, varphi_0: number, m_0Exit: number, mu_m: number, mu_i: number, sigt: number, jump: number): number; export declare function pmOpenFee(varphi_0: number, m_0: number, mu_m: number, sigt: number, jump: number): number; export declare function extractLvgFeeParams(conf: bigint): { jump: number; sigt: number; }; export declare function decodePriceImpact(amount: bigint, params: bigint): { a: number; m: number; l: number; dp: number; }; export declare function erfc(x: number): number; /** * Margin balance for prediction markets * @param pos signed position * @param s2 mark price * @param s3 collateral to quote conversion * @param ell locked in value * @param mc margin cash in collateral currency * @returns current margin balance */ export declare function pmMarginBalance(pos: number, s2: number, s3: number, ell: number, mc: number): number; export declare function pmExcessBalance(pos: number, s2: number, s3: number, ell: number, mc: number, m: number): number; /** * * @param pos Signed position size * @param s3 Collateral to quote conversion at spot * @param ell Locked-in value * @param mc Margin collateral * @param baseMarginRate Maintenance margin per contract (mu_m) * @param sm Mark price at entry * @returns {number} Liquidation price as a probability in the range [0, 1] */ export declare function pmFindLiquidationPrice(pos: number, s3: number, ell: number, mc: number, baseMarginRate: number): number; /** * Find maximal *affordable* trade size (short dir=-1 or long dir=1) for prediction * markets at provided leverage and incorporating the current position * and wallet balance. * Factors in lot size and global max short/long, factors in opening/closing position * @param dir direction of trade (-1 sell, 1 buy) * @param lvg leverage of the trade * @param walletBalCC wallet balance of the trader (collateral currency) * @param slippage slippage percent used to estimate a traded price * @param currentPosition position in base currency of the trader * @param currentCashCC this is the cash available net of unpaid funding (often called available cash) * @param currentLockedInValue average entry price * signed position size in base currency, in margin account * @param S2 current index price of the form 1+p (regardless whether short or long) * @param Sm current mark price (not just the mark price index but including the ema-premium from the contract) * @param S3 current collateral to quote index price * @param glblMaxTrade global max short or long order size that we retreive, e.g., from position risk (sign irrelevant) * based on long: (*ℓ+n) * (1-p) - m (1-p) s = F → n = (F+m*(1-p)*s)/(1-p)-ℓ* * short: (s+n)*p - m p *ℓ* = F →n = (F+m*p**ℓ*)/p-s * @returns max *signed* trade size */ export declare function pmFindMaxPersonalTradeSizeAtLeverage(dir: number, lvg: number, walletBalCC: number, slippage: number, currentPosition: number, currentCashCC: number, currentLockedInValue: number, S2: number, Sm: number, S3: number, glblMaxTrade: number): number; /** * See PerpetualTradeLogic::_getMaxSignedOpenPredMktTradeSize * @param long Long open OI * @param short Short open OI * @param sm Mark price (>1) * @param isBuy True if trade is long * @param mr Margin threshold per contract for liquidation (mu_m) */ export declare function pmMaxSignedOpenTradeSize(long: number, short: number, sm: number, isBuy: boolean, mr: number, ammFundsQC: number): number;