import { ethers } from 'ethers'; import { AddLiquidityParam, TxOptionsWithSigner, RemoveLiquidityParam, PlaceLimitOrderParam, PlaceMarketOrderParam, BatchPlaceLimitOrderParam, PlaceCrossMarketOrderParam, TxOptions, } from '../../types'; import { reverseSide } from '../../utils'; import { InstrumentModule } from '../instrument.module'; export class InverseInstrumentModule extends InstrumentModule { addLiquidity( param: AddLiquidityParam, txOptions: TxOptionsWithSigner, ): Promise; addLiquidity(param: AddLiquidityParam, txOptions?: TxOptions): Promise; async addLiquidity( param: AddLiquidityParam, txOptions?: TxOptions, ): Promise { const isInverse = typeof param.instrumentAddr === 'string' ? await this.context.perp.configuration.isInverse(param.instrumentAddr) : await this.context.perp.configuration.isInverseByIdentifier(param.instrumentAddr); return isInverse ? await super.addLiquidity( { ...param, tickDeltaLower: param.tickDeltaUpper, tickDeltaUpper: param.tickDeltaLower, }, txOptions, ) : await super.addLiquidity(param, txOptions); } removeLiquidity( param: RemoveLiquidityParam, txOptions: TxOptionsWithSigner, ): Promise; removeLiquidity(param: RemoveLiquidityParam, txOptions?: TxOptions): Promise; async removeLiquidity( param: RemoveLiquidityParam, txOptions?: TxOptions, ): Promise { const isInverse = await this.context.perp.configuration.isInverse(param.instrumentAddr); return isInverse ? await super.removeLiquidity( { ...param, tickLower: param.tickUpper, tickUpper: param.tickLower, }, txOptions, ) : await super.removeLiquidity(param, txOptions); } placeLimitOrder( param: PlaceLimitOrderParam, txOptions: TxOptionsWithSigner, ): Promise; placeLimitOrder(param: PlaceLimitOrderParam, txOptions?: TxOptions): Promise; async placeLimitOrder( param: PlaceLimitOrderParam, txOptions?: TxOptions, ): Promise { const isInverse = await this.context.perp.configuration.isInverse(param.instrumentAddr); return isInverse ? await super.placeLimitOrder( { ...param, side: reverseSide(param.side), }, txOptions, ) : await super.placeLimitOrder(param, txOptions); } placeMarketOrder( param: PlaceMarketOrderParam, txOptions: TxOptionsWithSigner, ): Promise; placeMarketOrder(param: PlaceMarketOrderParam, txOptions?: TxOptions): Promise; async placeMarketOrder( param: PlaceMarketOrderParam, txOptions?: TxOptions, ): Promise { const isInverse = await this.context.perp.configuration.isInverse(param.instrumentAddr); return isInverse ? await super.placeMarketOrder( { ...param, side: reverseSide(param.side), }, txOptions, ) : await super.placeMarketOrder(param, txOptions); } batchPlaceLimitOrder( param: BatchPlaceLimitOrderParam, txOptions: TxOptionsWithSigner, ): Promise; batchPlaceLimitOrder(param: BatchPlaceLimitOrderParam, txOptions?: TxOptions): Promise; async batchPlaceLimitOrder( param: BatchPlaceLimitOrderParam, txOptions?: TxOptions, ): Promise { const isInverse = await this.context.perp.configuration.isInverse(param.instrumentAddr); return isInverse ? await super.batchPlaceLimitOrder( { ...param, side: reverseSide(param.side), }, txOptions, ) : await super.batchPlaceLimitOrder(param, txOptions); } placeCrossMarketOrder( param: PlaceCrossMarketOrderParam, txOptions: TxOptionsWithSigner, ): Promise; placeCrossMarketOrder( param: PlaceCrossMarketOrderParam, txOptions?: TxOptions, ): Promise; async placeCrossMarketOrder( param: PlaceCrossMarketOrderParam, txOptions?: TxOptions, ): Promise { const isInverse = await this.context.perp.configuration.isInverse(param.instrumentAddr); return isInverse ? await super.placeCrossMarketOrder( { ...param, side: reverseSide(param.side), }, txOptions, ) : await super.placeCrossMarketOrder(param, txOptions); } }