UNPKG

@drift-labs/sdk-browser

Version:
118 lines (117 loc) 5.22 kB
/// <reference types="bn.js" /> import { PerpMarketAccount, PositionDirection, SpotMarketAccount, UserStatsAccount } from '../types'; import { BN } from '@coral-xyz/anchor'; import { AssetType } from './amm'; import { MMOraclePriceData, OraclePriceData } from '../oracles/types'; import { DLOB } from '../dlob/DLOB'; import { PublicKey } from '@solana/web3.js'; import { Orderbook } from '@project-serum/serum'; import { L2OrderBook } from '../dlob/orderBookLevels'; export type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceDeltaAsNumber' | 'pctAvg' | 'pctMax' | 'quoteAssetAmount' | 'quoteAssetAmountPeg' | 'acquiredBaseAssetAmount' | 'acquiredQuoteAssetAmount' | 'all'; /** * Calculates avg/max slippage (price impact) for candidate trade * * @deprecated use calculateEstimatedPerpEntryPrice instead * * @param direction * @param amount * @param market * @param inputAssetType which asset is being traded * @param useSpread whether to consider spread with calculating slippage * @return [pctAvgSlippage, pctMaxSlippage, entryPrice, newPrice] * * 'pctAvgSlippage' => the percentage change to entryPrice (average est slippage in execution) : Precision PRICE_PRECISION * * 'pctMaxSlippage' => the percentage change to maxPrice (highest est slippage in execution) : Precision PRICE_PRECISION * * 'entryPrice' => the average price of the trade : Precision PRICE_PRECISION * * 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION */ export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN, BN]; /** * Calculates acquired amounts for trade executed * @param direction * @param amount * @param market * @param inputAssetType * @param useSpread * @return * | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION */ export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN]; /** * calculateTargetPriceTrade * simple function for finding arbitraging trades * * @deprecated * * @param market * @param targetPrice * @param pct optional default is 100% gap filling, can set smaller. * @param outputAssetType which asset to trade. * @param useSpread whether or not to consider the spread when calculating the trade size * @returns trade direction/size in order to push price to a targetPrice, * * [ * direction => direction of trade required, PositionDirection * tradeSize => size of trade required, TODO-PRECISION * entryPrice => the entry price for the trade, PRICE_PRECISION * targetPrice => the target price PRICE_PRECISION * ] */ export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [PositionDirection, BN, BN, BN]; /** * Calculates the estimated entry price and price impact of order, in base or quote * Price impact is based on the difference between the entry price and the best bid/ask price (whether it's dlob or vamm) * * @param assetType * @param amount * @param direction * @param market * @param oraclePriceData * @param dlob * @param slot * @param usersToSkip */ export declare function calculateEstimatedPerpEntryPrice(assetType: AssetType, amount: BN, direction: PositionDirection, market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, dlob: DLOB, slot: number, usersToSkip?: Map<PublicKey, boolean>): { entryPrice: BN; priceImpact: BN; bestPrice: BN; worstPrice: BN; baseFilled: BN; quoteFilled: BN; }; /** * Calculates the estimated entry price and price impact of order, in base or quote * Price impact is based on the difference between the entry price and the best bid/ask price (whether it's dlob or serum) * * @param assetType * @param amount * @param direction * @param market * @param oraclePriceData * @param dlob * @param serumBids * @param serumAsks * @param slot * @param usersToSkip */ export declare function calculateEstimatedSpotEntryPrice(assetType: AssetType, amount: BN, direction: PositionDirection, market: SpotMarketAccount, oraclePriceData: OraclePriceData, dlob: DLOB, serumBids: Orderbook, serumAsks: Orderbook, slot: number, usersToSkip?: Map<PublicKey, boolean>): { entryPrice: BN; priceImpact: BN; bestPrice: BN; worstPrice: BN; baseFilled: BN; quoteFilled: BN; }; export declare function calculateEstimatedEntryPriceWithL2(assetType: AssetType, amount: BN, direction: PositionDirection, basePrecision: BN, l2: L2OrderBook): { entryPrice: BN; priceImpact: BN; bestPrice: BN; worstPrice: BN; baseFilled: BN; quoteFilled: BN; }; export declare function getUser30dRollingVolumeEstimate(userStatsAccount: UserStatsAccount, now?: BN): BN;