import { DocumentNode, gql } from '@apollo/client/core' import { getAddress } from 'ethers' import { LiquidityPositionExtendedFragment, LiquidityPositionFragment, } from '../fragments' import { addFields } from '../../../../utils/voidnode' import PremiaVoidnode from '../../index' import { OrderType } from '../../../../entities' export class LiquidityPositionQuery { static liquidityPositionId( owner: string, poolAddress: string, tokenId: string ): string { return ( getAddress(owner) + ':' + getAddress(poolAddress) + '/' + tokenId.toString() ) } @addFields static GetLiquidityPosition( voidnode: PremiaVoidnode, owner: string, poolAddress: string, tokenId: string ): DocumentNode { return gql` ${LiquidityPositionFragment} { liquidityPosition(id: "${this.liquidityPositionId( owner, poolAddress, tokenId )}") { ...LiquidityPosition } } ` } @addFields static GetLiquidityPositionExtended( voidnode: PremiaVoidnode, owner: string, poolAddress: string, tokenId: string ): DocumentNode { return gql` ${LiquidityPositionExtendedFragment} { liquidityPosition(id: "${this.liquidityPositionId( owner, poolAddress, tokenId )}") { ...LiquidityPositionExtended } } ` } @addFields static GetLiquidityPositionsExtendedForUser( voidnode: PremiaVoidnode, owner: string, orderType?: OrderType, isOpen?: boolean ): DocumentNode { let filter if (orderType === undefined) { filter = '' } else { if (orderType === OrderType.LONG_COLLATERAL) { filter = ', orderType: LONG_COLLATERAL' } else if (orderType == OrderType.COLLATERAL_SHORT) { filter = ', orderType: COLLATERAL_SHORT' } else if (orderType == OrderType.COLLATERAL_SHORT_USE_PREMIUMS) { filter = ', orderType: COLLATERAL_SHORT_USE_PREMIUMS' } } if (isOpen) { filter += ', closedAt: null' } else if (!isOpen && isOpen !== undefined) { filter += ', closedAt_ne: null' } return gql` ${LiquidityPositionExtendedFragment} { liquidityPositions( where: { owner: "${getAddress(owner)}" ${filter} }, limit: 1000, orderBy: [{ field: createdAt, direction: DESC }] ) { ...LiquidityPositionExtended } } ` } }