@drift-labs/sdk-browser
Version:
SDK for Drift Protocol
118 lines (117 loc) • 5.22 kB
TypeScript
/// <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;