@strobelabs/perpcity-sdk 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/utils/approve.ts","../src/abis/perp-manager.ts","../src/utils/liquidity.ts","../src/utils/errors.ts","../src/abis/beacon.ts","../src/functions/open-position.ts","../src/functions/perp.ts","../src/functions/perp-manager.ts","../src/functions/user.ts","../src/functions/position.ts"],"sourcesContent":["import { GraphQLClient } from 'graphql-request'\nimport { publicActions, formatUnits } from \"viem\";\nimport { PerpCityContextConfig, PerpCityDeployments } from \"./types\";\nimport { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport { parse } from \"graphql\";\nimport { Address, Hex } from \"viem\";\nimport { PerpData, UserData, OpenPositionData, LiveDetails, ClosedPosition, OpenInterest, TimeSeries, Bounds, Fees } from \"./types/entity-data\";\nimport { scaleFrom6Decimals, sqrtPriceX96ToPrice, marginRatioToLeverage } from \"./utils\";\nimport { withErrorHandling, GraphQLError, RPCError } from \"./utils/errors\";\nimport { PERP_MANAGER_ABI } from \"./abis/perp-manager\";\nimport { erc20Abi } from \"viem\";\n\nexport class PerpCityContext {\n public readonly walletClient;\n public readonly goldskyClient: GraphQLClient;\n private readonly _deployments: PerpCityDeployments;\n\n constructor(config: PerpCityContextConfig) {\n this.walletClient = config.walletClient.extend(publicActions);\n this._deployments = config.deployments;\n\n const headers: Record<string, string> = {};\n \n if (config.goldskyBearerToken) {\n headers.authorization = `Bearer ${config.goldskyBearerToken}`;\n }\n \n this.goldskyClient = new GraphQLClient(config.goldskyEndpoint, {\n headers,\n });\n }\n\n deployments(): PerpCityDeployments {\n return this._deployments;\n }\n\n // Optimized batch data fetching methods\n\n private async fetchPerpData(perpId: Hex): Promise<PerpData> {\n return withErrorHandling(async () => {\n // Batch all perp-related queries into a single GraphQL request\n const perpQuery: TypedDocumentNode<{\n perp: {\n beacon: { id: Hex };\n };\n perpSnapshots: {\n timestamp: BigInt;\n markPrice: string;\n takerLongNotional: string;\n takerShortNotional: string;\n fundingRate: string;\n }[];\n }, { perpId: Hex }> = parse(`\n query ($perpId: Bytes!) {\n perp(id: $perpId) {\n beacon { id }\n }\n perpSnapshots(\n orderBy: timestamp\n orderDirection: asc\n where: { perp: $perpId }\n ) {\n timestamp\n markPrice\n takerLongNotional\n takerShortNotional\n fundingRate\n }\n }\n `);\n\n const beaconQuery: TypedDocumentNode<{\n beaconSnapshots: {\n timestamp: BigInt;\n indexPrice: string;\n }[];\n }, { beaconAddr: Address }> = parse(`\n query ($beaconAddr: Bytes!) {\n beaconSnapshots(\n orderBy: timestamp\n orderDirection: asc\n where: { beacon: $beaconAddr }\n ) {\n timestamp\n indexPrice\n }\n }\n `);\n\n let perpResponse: any;\n try {\n // Execute first query to get beacon address\n perpResponse = await this.goldskyClient.request(perpQuery, { perpId });\n } catch (error) {\n throw new GraphQLError(`Failed to fetch perp data for ${perpId}: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);\n }\n\n if (!perpResponse.perp || !perpResponse.perp.beacon) {\n throw new GraphQLError(`Perp ${perpId} not found or has no beacon`);\n }\n\n let beaconResponse: any;\n let contractData: Awaited<ReturnType<typeof this.fetchPerpContractData>>;\n\n try {\n // Execute remaining queries in parallel\n [beaconResponse, contractData] = await Promise.all([\n this.goldskyClient.request(beaconQuery, { beaconAddr: perpResponse.perp.beacon.id }),\n this.fetchPerpContractData(perpId),\n ]);\n } catch (error) {\n if (error instanceof GraphQLError || error instanceof RPCError) {\n throw error;\n }\n throw new GraphQLError(`Failed to fetch beacon or contract data: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);\n }\n\n // Guard against empty snapshots for new perps\n if (perpResponse.perpSnapshots.length === 0) {\n throw new GraphQLError(`No perpSnapshots found for perp ${perpId}. This perp may be newly created with no trading activity yet.`);\n }\n if ((beaconResponse as any).beaconSnapshots.length === 0) {\n throw new GraphQLError(`No beaconSnapshots found for perp ${perpId} beacon ${perpResponse.perp.beacon.id}. The beacon may not have any price updates yet.`);\n }\n\n // Process time series data\n const markTimeSeries: TimeSeries<number>[] = perpResponse.perpSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(formatUnits(BigInt(snapshot.markPrice), 6)),\n }));\n\n const indexTimeSeries: TimeSeries<number>[] = (beaconResponse as any).beaconSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(formatUnits(BigInt(snapshot.indexPrice), 6)),\n }));\n\n const openInterestTimeSeries: TimeSeries<OpenInterest>[] = perpResponse.perpSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: {\n takerLongNotional: Number(formatUnits(BigInt(snapshot.takerLongNotional), 6)),\n takerShortNotional: Number(formatUnits(BigInt(snapshot.takerShortNotional), 6)),\n },\n }));\n\n const fundingRateTimeSeries: TimeSeries<number>[] = perpResponse.perpSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(formatUnits(BigInt(snapshot.fundingRate), 6)),\n }));\n\n // Get latest values (safe after guard check)\n const latestSnapshot = perpResponse.perpSnapshots[perpResponse.perpSnapshots.length - 1];\n const latestBeaconSnapshot = (beaconResponse as any).beaconSnapshots[(beaconResponse as any).beaconSnapshots.length - 1];\n\n const perpData: PerpData = {\n id: perpId,\n tickSpacing: contractData.tickSpacing,\n mark: sqrtPriceX96ToPrice(contractData.sqrtPriceX96),\n index: Number(formatUnits(BigInt(latestBeaconSnapshot.indexPrice), 6)),\n beacon: perpResponse.perp.beacon.id as Address,\n lastIndexUpdate: Number(latestBeaconSnapshot.timestamp),\n openInterest: {\n takerLongNotional: Number(formatUnits(BigInt(latestSnapshot.takerLongNotional), 6)),\n takerShortNotional: Number(formatUnits(BigInt(latestSnapshot.takerShortNotional), 6)),\n },\n markTimeSeries,\n indexTimeSeries,\n fundingRate: Number(formatUnits(BigInt(latestSnapshot.fundingRate), 6)),\n bounds: contractData.bounds,\n fees: contractData.fees,\n openInterestTimeSeries,\n fundingRateTimeSeries,\n totalOpenMakerPnl: 0, // These will be calculated by functions\n totalOpenTakerPnl: 0, // These will be calculated by functions\n };\n\n return perpData;\n }, `fetchPerpData for perp ${perpId}`);\n }\n\n private async fetchPerpContractData(perpId: Hex): Promise<{\n tickSpacing: number;\n sqrtPriceX96: bigint;\n bounds: Bounds;\n fees: Fees;\n }> {\n return withErrorHandling(async () => {\n const [tickSpacing, sqrtPriceX96, boundsRaw, feesRaw] = await Promise.all([\n this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'tickSpacing',\n args: [perpId]\n }),\n this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'sqrtPriceX96',\n args: [perpId]\n }),\n this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'tradingBounds',\n args: [perpId]\n }),\n this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'fees',\n args: [perpId]\n }),\n ]);\n\n const bounds = boundsRaw as unknown as readonly [bigint, bigint, bigint, bigint, bigint, bigint, bigint];\n const fees = feesRaw as unknown as readonly [bigint, bigint, bigint, bigint];\n\n return {\n tickSpacing: Number(tickSpacing),\n sqrtPriceX96: sqrtPriceX96 as bigint,\n bounds: {\n minMargin: Number(formatUnits(bounds[0], 6)),\n minTakerLeverage: marginRatioToLeverage(Number(formatUnits(bounds[4], 6))),\n maxTakerLeverage: marginRatioToLeverage(Number(formatUnits(bounds[5], 6))),\n },\n fees: {\n creatorFee: Number(formatUnits(fees[0], 6)),\n insuranceFee: Number(formatUnits(fees[1], 6)),\n lpFee: Number(formatUnits(fees[2], 6)),\n liquidationFee: Number(formatUnits(fees[3], 6)),\n },\n };\n }, `fetchPerpContractData for perp ${perpId}`);\n }\n\n /**\n * Fetch comprehensive perp data with all related information in a single batched request\n */\n async getPerpData(perpId: Hex): Promise<PerpData> {\n return this.fetchPerpData(perpId);\n }\n\n /**\n * Fetch data for multiple perps efficiently with true batching\n * This fetches all perps in just 2 Goldsky requests total (not 2N!)\n */\n async getMultiplePerpData(perpIds: Hex[]): Promise<Map<Hex, PerpData>> {\n if (perpIds.length === 0) {\n return new Map();\n }\n\n // If only one perp, use the single fetch method\n if (perpIds.length === 1) {\n const data = await this.fetchPerpData(perpIds[0]);\n return new Map([[perpIds[0], data]]);\n }\n\n // Batch query for all perps and their snapshots\n const batchPerpQuery: TypedDocumentNode<{\n perps: {\n id: Hex;\n beacon: { id: Hex };\n }[];\n perpSnapshots: {\n perp: { id: Hex };\n timestamp: BigInt;\n markPrice: string;\n takerLongNotional: string;\n takerShortNotional: string;\n fundingRate: string;\n }[];\n }, { perpIds: Hex[] }> = parse(`\n query ($perpIds: [Bytes!]!) {\n perps(where: { id_in: $perpIds }) {\n id\n beacon { id }\n }\n perpSnapshots(\n orderBy: timestamp\n orderDirection: asc\n where: { perp_in: $perpIds }\n ) {\n perp { id }\n timestamp\n markPrice\n takerLongNotional\n takerShortNotional\n fundingRate\n }\n }\n `);\n\n // Execute first query to get all perps and snapshots\n const perpResponse: any = await this.goldskyClient.request(batchPerpQuery, { perpIds });\n\n // Extract unique beacon IDs\n const beaconIds = [...new Set(perpResponse.perps.map((p: any) => p.beacon.id as Address))];\n\n // Batch query for all unique beacons\n const batchBeaconQuery: TypedDocumentNode<{\n beaconSnapshots: {\n beacon: { id: Hex };\n timestamp: BigInt;\n indexPrice: string;\n }[];\n }, { beaconIds: Address[] }> = parse(`\n query ($beaconIds: [Bytes!]!) {\n beaconSnapshots(\n orderBy: timestamp\n orderDirection: asc\n where: { beacon_in: $beaconIds }\n ) {\n beacon { id }\n timestamp\n indexPrice\n }\n }\n `);\n\n // Fetch beacon data and contract data in parallel\n const [beaconResponse, contractDataMap] = await Promise.all([\n this.goldskyClient.request(batchBeaconQuery, { beaconIds: beaconIds as any }),\n this.fetchMultiplePerpContractData(perpIds),\n ]);\n\n // Group snapshots by perp ID\n const snapshotsByPerp = new Map<Hex, any[]>();\n perpResponse.perpSnapshots.forEach((snapshot: any) => {\n const perpId = snapshot.perp.id as Hex;\n if (!snapshotsByPerp.has(perpId)) {\n snapshotsByPerp.set(perpId, []);\n }\n snapshotsByPerp.get(perpId)!.push(snapshot);\n });\n\n // Group beacon snapshots by beacon ID\n const snapshotsByBeacon = new Map<Address, any[]>();\n (beaconResponse as any).beaconSnapshots.forEach((snapshot: any) => {\n const beaconId = snapshot.beacon.id as Address;\n if (!snapshotsByBeacon.has(beaconId)) {\n snapshotsByBeacon.set(beaconId, []);\n }\n snapshotsByBeacon.get(beaconId)!.push(snapshot);\n });\n\n // Create perp lookup map with proper typing\n const perpLookup = new Map<Hex, { id: Hex; beacon: { id: Address } }>(\n perpResponse.perps.map((p: any) => [\n p.id as Hex,\n p as { id: Hex; beacon: { id: Address } }\n ])\n );\n\n // Build PerpData for each perp\n const resultMap = new Map<Hex, PerpData>();\n\n for (const perpId of perpIds) {\n const perp = perpLookup.get(perpId);\n if (!perp) {\n throw new Error(`Perp ${perpId} not found`);\n }\n\n // Type-safe beacon access\n const beaconId = perp.beacon.id;\n const snapshots = snapshotsByPerp.get(perpId) || [];\n const beaconSnapshots = snapshotsByBeacon.get(beaconId) || [];\n const contractData = contractDataMap.get(perpId);\n\n if (!contractData) {\n throw new Error(`Contract data for perp ${perpId} not found`);\n }\n\n if (snapshots.length === 0) {\n throw new Error(`No snapshots found for perp ${perpId}`);\n }\n\n if (beaconSnapshots.length === 0) {\n throw new Error(`No beacon snapshots found for perp ${perpId}`);\n }\n\n // Process time series data\n const markTimeSeries: TimeSeries<number>[] = snapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(formatUnits(BigInt(snapshot.markPrice), 6)),\n }));\n\n const indexTimeSeries: TimeSeries<number>[] = beaconSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(formatUnits(BigInt(snapshot.indexPrice), 6)),\n }));\n\n const openInterestTimeSeries: TimeSeries<OpenInterest>[] = snapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: {\n takerLongNotional: Number(formatUnits(BigInt(snapshot.takerLongNotional), 6)),\n takerShortNotional: Number(formatUnits(BigInt(snapshot.takerShortNotional), 6)),\n },\n }));\n\n const fundingRateTimeSeries: TimeSeries<number>[] = snapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(formatUnits(BigInt(snapshot.fundingRate), 6)),\n }));\n\n // Get latest values\n const latestSnapshot = snapshots[snapshots.length - 1];\n const latestBeaconSnapshot = beaconSnapshots[beaconSnapshots.length - 1];\n\n const perpData: PerpData = {\n id: perpId,\n tickSpacing: contractData.tickSpacing,\n mark: sqrtPriceX96ToPrice(contractData.sqrtPriceX96),\n index: Number(formatUnits(BigInt(latestBeaconSnapshot.indexPrice), 6)),\n beacon: beaconId,\n lastIndexUpdate: Number(latestBeaconSnapshot.timestamp),\n openInterest: {\n takerLongNotional: Number(formatUnits(BigInt(latestSnapshot.takerLongNotional), 6)),\n takerShortNotional: Number(formatUnits(BigInt(latestSnapshot.takerShortNotional), 6)),\n },\n markTimeSeries,\n indexTimeSeries,\n fundingRate: Number(formatUnits(BigInt(latestSnapshot.fundingRate), 6)),\n bounds: contractData.bounds,\n fees: contractData.fees,\n openInterestTimeSeries,\n fundingRateTimeSeries,\n totalOpenMakerPnl: 0,\n totalOpenTakerPnl: 0,\n };\n\n resultMap.set(perpId, perpData);\n }\n\n return resultMap;\n }\n\n private async fetchMultiplePerpContractData(perpIds: Hex[]): Promise<Map<Hex, {\n tickSpacing: number;\n sqrtPriceX96: bigint;\n bounds: Bounds;\n fees: Fees;\n }>> {\n // Fetch all contract data in parallel\n const results = await Promise.all(\n perpIds.map(async (perpId) => ({\n perpId,\n data: await this.fetchPerpContractData(perpId),\n }))\n );\n\n return new Map(results.map(({ perpId, data }) => [perpId, data]));\n }\n\n private async fetchUserData(userAddress: Hex): Promise<UserData> {\n const [usdcBalance, openPositionsData, closedPositionsData] = await Promise.all([\n this.walletClient.readContract({\n address: this.deployments().usdc,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [userAddress],\n }),\n this.fetchUserOpenPositions(userAddress),\n this.fetchUserClosedPositions(userAddress),\n ]);\n\n const realizedPnl = closedPositionsData.reduce((acc, position) => acc + position.pnlAtClose, 0);\n const unrealizedPnl = openPositionsData.reduce(\n (acc, position) => acc + position.liveDetails.pnl - position.liveDetails.fundingPayment,\n 0\n );\n\n return {\n walletAddress: userAddress,\n usdcBalance: Number(formatUnits(usdcBalance, 6)),\n openPositions: openPositionsData,\n closedPositions: closedPositionsData,\n realizedPnl,\n unrealizedPnl,\n };\n }\n\n private async fetchUserOpenPositions(userAddress: Hex): Promise<OpenPositionData[]> {\n const query: TypedDocumentNode<{\n openPositions: {\n perp: { id: Hex };\n inContractPosId: bigint;\n isLong: boolean;\n isMaker: boolean;\n }[];\n }, { holder: Address }> = parse(`\n query ($holder: Bytes!) {\n openPositions(\n where: { holder: $holder }\n ) {\n perp { id }\n inContractPosId\n isLong\n isMaker\n }\n }\n `);\n\n const response: any = await this.goldskyClient.request(query, { holder: userAddress });\n\n const positionsWithDetails = await Promise.all(\n response.openPositions.map(async (position: any) => {\n // Normalize inContractPosId to bigint (GraphQL returns it as a string)\n const positionId = typeof position.inContractPosId === 'bigint' \n ? position.inContractPosId \n : BigInt(position.inContractPosId);\n \n const liveDetails = await this.fetchPositionLiveDetailsFromContract(\n position.perp.id,\n positionId\n );\n\n return {\n perpId: position.perp.id as Hex,\n positionId,\n isLong: position.isLong as boolean,\n isMaker: position.isMaker as boolean,\n liveDetails,\n };\n })\n );\n\n return positionsWithDetails;\n }\n\n private async fetchUserClosedPositions(userAddress: Hex): Promise<ClosedPosition[]> {\n const query: TypedDocumentNode<{\n closedPositions: {\n perp: { id: Hex };\n wasMaker: boolean;\n wasLong: boolean;\n pnlAtClose: string;\n }[];\n }, { holder: Address }> = parse(`\n query ($holder: Bytes!) {\n closedPositions(\n where: { holder: $holder }\n ) {\n perp { id }\n wasMaker\n wasLong\n pnlAtClose\n }\n }\n `);\n\n const response: any = await this.goldskyClient.request(query, { holder: userAddress });\n\n return response.closedPositions.map((position: any) => ({\n perpId: position.perp.id as Hex,\n wasMaker: position.wasMaker as boolean,\n wasLong: position.wasLong as boolean,\n pnlAtClose: Number(formatUnits(BigInt(position.pnlAtClose), 6)),\n }));\n }\n\n private async fetchPositionLiveDetailsFromContract(perpId: Hex, positionId: bigint): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // livePositionDetails is marked nonpayable in ABI but can be called read-only\n const result = (await this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'livePositionDetails' as any,\n args: [perpId, positionId],\n }) as unknown) as readonly [bigint, bigint, bigint, boolean, bigint];\n\n // Use formatUnits to safely convert bigint to decimal, then parse to number\n // The result is a tuple: [pnl, fundingPayment, effectiveMargin, isLiquidatable, newPriceX96]\n return {\n pnl: Number(formatUnits(result[0], 6)),\n fundingPayment: Number(formatUnits(result[1], 6)),\n effectiveMargin: Number(formatUnits(result[2], 6)),\n isLiquidatable: result[3],\n };\n }, `fetchPositionLiveDetailsFromContract for position ${positionId}`);\n }\n\n /**\n * Fetch comprehensive user data with all positions in a single batched request\n */\n async getUserData(userAddress: Hex): Promise<UserData> {\n return this.fetchUserData(userAddress);\n }\n\n /**\n * Fetch open position data with live details\n */\n async getOpenPositionData(perpId: Hex, positionId: bigint): Promise<OpenPositionData> {\n // First fetch the position metadata from GraphQL\n const query: TypedDocumentNode<{\n openPositions: {\n isLong: boolean;\n isMaker: boolean;\n }[];\n }, { perpId: Hex; posId: string }> = parse(`\n query ($perpId: Bytes!, $posId: BigInt!) {\n openPositions(\n where: { perp: $perpId, inContractPosId: $posId }\n first: 1\n ) {\n isLong\n isMaker\n }\n }\n `);\n\n const [positionResponse, liveDetails] = await Promise.all([\n this.goldskyClient.request(query, { perpId, posId: positionId.toString() }),\n this.fetchPositionLiveDetailsFromContract(perpId, positionId),\n ]);\n\n const position = (positionResponse as any).openPositions[0];\n\n // Handle missing position data - GraphQL may return empty array if position doesn't exist\n if (!position) {\n throw new Error(\n `Position not found in GraphQL: perpId=${perpId}, positionId=${positionId}. ` +\n `The position may not exist or may have been closed.`\n );\n }\n\n return {\n perpId,\n positionId,\n isLong: position.isLong,\n isMaker: position.isMaker,\n liveDetails,\n };\n }\n}","export const NUMBER_1E6: number = 1000000; // 1e6\nexport const BIGINT_1E6: bigint = 1000000n; // 1e6\n\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n","import { NUMBER_1E6, BIGINT_1E6, Q96 } from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error('Price too large');\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * NUMBER_1E6;\n return BigInt(Math.floor(scaledSqrtPrice)) * Q96 / BigInt(NUMBER_1E6);\n}\n\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / NUMBER_1E6) {\n throw new Error('Amount too large');\n }\n\n return BigInt(Math.floor(amount * NUMBER_1E6));\n}\n\nexport function scaleToX96(amount: number): bigint {\n return BigInt(scale6Decimals(amount)) * Q96 / BigInt(NUMBER_1E6);\n}\n\nexport function scaleFromX96(valueX96: bigint): number {\n const valueScaled6Decimals = valueX96 * BIGINT_1E6 / Q96;\n\n if (valueScaled6Decimals > Number.MAX_SAFE_INTEGER) {\n throw new Error('Value too large');\n }\n\n return Number(valueScaled6Decimals) / NUMBER_1E6;\n}\n\nexport function priceToTick(price: number, roundDown: boolean): number {\n const logPrice = Math.log(price) / Math.log(1.0001);\n return roundDown ? Math.floor(logPrice) : Math.ceil(logPrice);\n}\n\nexport function sqrtPriceX96ToPrice(sqrtPriceX96: bigint): number {\n const priceX96 = sqrtPriceX96 * sqrtPriceX96 / Q96;\n return scaleFromX96(priceX96);\n}\n\nexport function marginRatioToLeverage(marginRatio: number): number {\n return NUMBER_1E6 / marginRatio;\n}\n\nexport function scaleFrom6Decimals(value: number): number {\n return value / NUMBER_1E6;\n}","import { PerpCityContext } from \"../context\";\nimport { erc20Abi } from \"viem\";\n\nconst DEFAULT_CONFIRMATIONS = 2;\n\nexport async function approveUsdc(context: PerpCityContext, amount: bigint, confirmations: number = DEFAULT_CONFIRMATIONS) {\n const deployments = context.deployments();\n\n const { request } = await context.walletClient.simulateContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: 'approve',\n args: [deployments.perpManager, amount],\n account: context.walletClient.account,\n });\n\n const hash = await context.walletClient.writeContract(request);\n\n await context.walletClient.waitForTransactionReceipt({ \n confirmations: confirmations, \n hash \n });\n}","export const PERP_MANAGER_ABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IPoolManager\",\n \"name\": \"poolManager\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"usdc\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"action\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"InvalidAction\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"expectedCaller\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"InvalidCaller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isLiquidated\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"InvalidClose\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n }\n ],\n \"name\": \"InvalidLiquidity\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"InvalidMargin\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"currentTimestamp\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lockupPeriodEnd\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MakerPositionLocked\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"maximumAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountRequested\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MaximumAmountExceeded\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"minimumAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountReceived\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MinimumAmountInsufficient\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotPoolManager\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"reason\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"UnexpectedRevertBytes\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"usdDelta\",\n \"type\": \"int256\"\n }\n ],\n \"name\": \"ZeroSizePosition\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newMargin\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MarginAdded\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"beacon\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"startingSqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"indexPriceX96\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PerpCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"wasMaker\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"pnl\",\n \"type\": \"int256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"wasLiquidated\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"fundingPremiumPerSecX96\",\n \"type\": \"int256\"\n }\n ],\n \"name\": \"PositionClosed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"isMaker\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"fundingPremiumPerSecX96\",\n \"type\": \"int256\"\n }\n ],\n \"name\": \"PositionOpened\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"POOL_MANAGER\",\n \"outputs\": [\n {\n \"internalType\": \"contract IPoolManager\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"USDC\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"posId\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct IPerpManager.AddMarginParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"addMargin\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"posId\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"minAmt0Out\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"minAmt1Out\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt1In\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.ClosePositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"closePosition\",\n \"outputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"posId\",\n \"type\": \"uint128\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint160\",\n \"name\": \"startingSqrtPriceX96\",\n \"type\": \"uint160\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"beacon\",\n \"type\": \"address\"\n }\n ],\n \"internalType\": \"struct IPerpManager.CreatePerpParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"createPerp\",\n \"outputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"int24\",\n \"name\": \"tickA\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickB\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"estimateLiquidityForAmount1\",\n \"outputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"fees\",\n \"outputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"creatorFee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"insurnaceFee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"lpFee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"liquidationFee\",\n \"type\": \"uint24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"posId\",\n \"type\": \"uint128\"\n }\n ],\n \"name\": \"getPosition\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"usdDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryTwPremiumX96\",\n \"type\": \"int256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"entryTimestamp\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickLower\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickUpper\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryTwPremiumGrowthInsideX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryTwPremiumDivBySqrtPriceGrowthInsideX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryTwPremiumGrowthBelowX96\",\n \"type\": \"int256\"\n }\n ],\n \"internalType\": \"struct IPerpManager.MakerDetails\",\n \"name\": \"makerDetails\",\n \"type\": \"tuple\"\n }\n ],\n \"internalType\": \"struct IPerpManager.Position\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"secondsAgo\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"getTimeWeightedAvg\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"increaseCardinalityNext\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"posId\",\n \"type\": \"uint128\"\n }\n ],\n \"name\": \"livePositionDetails\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"pnl\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"fundingPayment\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"effectiveMargin\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isLiquidatable\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPriceX96\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickLower\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickUpper\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt0In\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt1In\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenMakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"openMakerPosition\",\n \"outputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"makerPosId\",\n \"type\": \"uint128\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"isLong\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"levX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"unspecifiedAmountLimit\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenTakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"openTakerPosition\",\n \"outputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"takerPosId\",\n \"type\": \"uint128\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"perps\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"vault\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"beacon\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"creationTimestamp\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"makerLockupPeriod\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"twapWindow\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"lastTwPremiumsUpdate\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"creatorFee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"insuranceFee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"liquidationFee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"liquidatorFeeSplit\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"nextPosId\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceLowerMultiX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceUpperMultiX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"minOpeningMargin\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"minMakerOpeningMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"maxMakerOpeningMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"makerLiquidationMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"minTakerOpeningMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"maxTakerOpeningMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"takerLiquidationMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"twPremiumX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"twPremiumDivBySqrtPriceX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"premiumPerSecondX96\",\n \"type\": \"int256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"Currency\",\n \"name\": \"currency0\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"Currency\",\n \"name\": \"currency1\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"fee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickSpacing\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"contract IHooks\",\n \"name\": \"hooks\",\n \"type\": \"address\"\n }\n ],\n \"internalType\": \"struct PoolKey\",\n \"name\": \"key\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"baseFeeX96\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"startFeeX96\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"targetFeeX96\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"decay\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"volatilityScalerX96\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxFeeMultiplierX96\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct TradingFee.Config\",\n \"name\": \"tradingFeeConfig\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"index\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinality\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNext\",\n \"type\": \"uint32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"blockTimestamp\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint216\",\n \"name\": \"cumulativeValue\",\n \"type\": \"uint216\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"initialized\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct TimeWeightedAvg.Observation[65535]\",\n \"name\": \"observations\",\n \"type\": \"tuple[65535]\"\n }\n ],\n \"internalType\": \"struct TimeWeightedAvg.State\",\n \"name\": \"twapState\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickLower\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickUpper\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt0In\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt1In\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenMakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"quoteMakerPosition\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"usdDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"creatorFeeAmt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"insuranceFeeAmt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lpFeeAmt\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"isLong\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"levX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"unspecifiedAmountLimit\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenTakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"quoteTakerPosition\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"usdDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"creatorFeeAmt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"insuranceFeeAmt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"lpFeeAmt\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"sqrtPriceX96\",\n \"outputs\": [\n {\n \"internalType\": \"uint160\",\n \"name\": \"sqrtPrice\",\n \"type\": \"uint160\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"tickSpacing\",\n \"outputs\": [\n {\n \"internalType\": \"int24\",\n \"name\": \"\",\n \"type\": \"int24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"tradingBounds\",\n \"outputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"minOpeningMargin\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"minMakerMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"maxMakerMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"makerLiquidationMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"minTakerMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"maxTakerMarginRatio\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"takerLiquidationMarginRatio\",\n \"type\": \"uint24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"unlockCallback\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"encodedDelta\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n] as const;","import { PerpCityContext } from \"../context\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\n\nexport async function estimateLiquidity(context: PerpCityContext, tickLower: number, tickUpper: number, usdScaled: bigint): Promise<bigint> {\n return await context.walletClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'estimateLiquidityForAmount1',\n args: [tickLower, tickUpper, usdScaled],\n }) as bigint;\n}","import { BaseError, ContractFunctionRevertedError, decodeErrorResult } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\n\n/**\n * Base class for all PerpCity SDK errors\n */\nexport class PerpCityError extends Error {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"PerpCityError\";\n }\n}\n\n/**\n * Error thrown when a contract call reverts\n */\nexport class ContractError extends PerpCityError {\n constructor(\n message: string,\n public readonly errorName?: string,\n public readonly args?: readonly unknown[],\n cause?: Error\n ) {\n super(message, cause);\n this.name = \"ContractError\";\n }\n}\n\n/**\n * Error thrown when a transaction is rejected by the user\n */\nexport class TransactionRejectedError extends PerpCityError {\n constructor(message = \"Transaction rejected by user\", cause?: Error) {\n super(message, cause);\n this.name = \"TransactionRejectedError\";\n }\n}\n\n/**\n * Error thrown when there are insufficient funds\n */\nexport class InsufficientFundsError extends PerpCityError {\n constructor(message = \"Insufficient funds for transaction\", cause?: Error) {\n super(message, cause);\n this.name = \"InsufficientFundsError\";\n }\n}\n\n/**\n * Error thrown when a GraphQL query fails\n */\nexport class GraphQLError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"GraphQLError\";\n }\n}\n\n/**\n * Error thrown when an RPC call fails\n */\nexport class RPCError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"RPCError\";\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Parse and format a contract error into a user-friendly message\n */\nexport function parseContractError(error: unknown): PerpCityError {\n if (error instanceof PerpCityError) {\n return error;\n }\n\n // Handle viem BaseError\n if (error instanceof BaseError) {\n const revertError = error.walk((err) => err instanceof ContractFunctionRevertedError);\n\n if (revertError instanceof ContractFunctionRevertedError) {\n const errorName = revertError.data?.errorName ?? \"Unknown\";\n const args = revertError.data?.args ?? [];\n\n // Map known contract errors to user-friendly messages\n const message = formatContractError(errorName, args);\n return new ContractError(message, errorName, args, error as Error);\n }\n\n // Check for user rejection\n if (error.message?.includes(\"User rejected\") || (error as any).code === 4001) {\n return new TransactionRejectedError(error.message, error as Error);\n }\n\n // Check for insufficient funds\n if (error.message?.includes(\"insufficient funds\")) {\n return new InsufficientFundsError(error.message, error as Error);\n }\n\n return new PerpCityError(error.shortMessage || error.message, error as Error);\n }\n\n // Handle generic errors\n if (error instanceof Error) {\n return new PerpCityError(error.message, error);\n }\n\n return new PerpCityError(String(error));\n}\n\n/**\n * Format a contract error name and args into a user-friendly message\n */\nfunction formatContractError(errorName: string, args: readonly unknown[]): string {\n switch (errorName) {\n case \"InvalidBeaconAddress\":\n return `Invalid beacon address: ${args[0]}`;\n\n case \"InvalidTradingFeeSplits\":\n return `Invalid trading fee splits. Insurance split: ${args[0]}, Creator split: ${args[1]}`;\n\n case \"InvalidMaxOpeningLev\":\n return `Invalid maximum opening leverage: ${args[0]}`;\n\n case \"InvalidLiquidationLev\":\n return `Invalid liquidation leverage: ${args[0]}. Must be less than max opening leverage: ${args[1]}`;\n\n case \"InvalidLiquidationFee\":\n return `Invalid liquidation fee: ${args[0]}`;\n\n case \"InvalidLiquidatorFeeSplit\":\n return `Invalid liquidator fee split: ${args[0]}`;\n\n case \"InvalidClose\":\n return `Cannot close position. Caller: ${args[0]}, Holder: ${args[1]}, Is Liquidated: ${args[2]}`;\n\n case \"InvalidCaller\":\n return `Invalid caller. Expected: ${args[1]}, Got: ${args[0]}`;\n\n case \"InvalidLiquidity\":\n return `Invalid liquidity amount: ${args[0]}`;\n\n case \"InvalidMargin\":\n return `Invalid margin amount: ${args[0]}`;\n\n case \"InvalidLevX96\":\n return `Invalid leverage: ${args[0]}. Maximum allowed: ${args[1]}`;\n\n case \"MakerPositionLocked\":\n return `Maker position is locked until ${new Date(Number(args[1]) * 1000).toISOString()}. Current time: ${new Date(Number(args[0]) * 1000).toISOString()}`;\n\n case \"MaximumAmountExceeded\":\n return `Maximum amount exceeded. Maximum: ${args[0]}, Requested: ${args[1]}`;\n\n case \"MinimumAmountInsufficient\":\n return `Minimum amount not met. Required: ${args[0]}, Received: ${args[1]}`;\n\n case \"PriceImpactTooHigh\":\n return `Price impact too high. Current price: ${args[0]}, Min acceptable: ${args[1]}, Max acceptable: ${args[2]}`;\n\n case \"SwapReverted\":\n return \"Swap failed. This may be due to insufficient liquidity or slippage tolerance.\";\n\n case \"ZeroSizePosition\":\n return `Cannot create zero-size position. Perp delta: ${args[0]}, USD delta: ${args[1]}`;\n\n case \"InvalidFundingInterval\":\n return `Invalid funding interval: ${args[0]}`;\n\n case \"InvalidPriceImpactBand\":\n return `Invalid price impact band: ${args[0]}`;\n\n case \"InvalidMarketDeathThreshold\":\n return `Invalid market death threshold: ${args[0]}`;\n\n case \"InvalidTickRange\":\n return `Invalid tick range. Lower: ${args[0]}, Upper: ${args[1]}`;\n\n case \"MarketNotKillable\":\n return `Market health (${args[0]}) is above death threshold (${args[1]}). Market cannot be killed yet.`;\n\n case \"InvalidStartingSqrtPriceX96\":\n return `Invalid starting sqrt price: ${args[0]}`;\n\n default:\n return `Contract error: ${errorName}${args.length > 0 ? ` (${args.join(\", \")})` : \"\"}`;\n }\n}\n\n/**\n * Wrap an async function with error handling\n */\nexport async function withErrorHandling<T>(\n fn: () => Promise<T>,\n context: string\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const parsedError = parseContractError(error);\n parsedError.message = `${context}: ${parsedError.message}`;\n throw parsedError;\n }\n}\n","export const BEACON_ABI = [\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IVerifierWrapper\",\n \"name\": \"verifierWrapper\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"initialData\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"initialCardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"proof\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"publicSignals\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidProof\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"proof\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"publicSignals\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"ProofAlreadyUsed\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"data\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"DataUpdated\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_DATA\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MIN_DATA\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VERIFIER_WRAPPER\",\n \"outputs\": [\n {\n \"internalType\": \"contract IVerifierWrapper\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"data\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getData\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"twapSecondsAgo\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"getTwap\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"twapPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"increaseCardinalityNext\",\n \"outputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNextOld\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNextNew\",\n \"type\": \"uint32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"timestamp\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"twapState\",\n \"outputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"index\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinality\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"proof\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"publicSignals\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"updateData\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"usedProofs\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n] as const;","import type { Hex } from \"viem\";\nimport { publicActions, formatUnits, decodeEventLog } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals, scaleFrom6Decimals } from \"../utils\";\nimport { withErrorHandling, parseContractError } from \"../utils/errors\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport { ClosePositionParams, LiveDetails } from \"../types/entity-data\";\n\nexport class OpenPosition {\n public readonly context: PerpCityContext;\n public readonly perpId: Hex;\n public readonly positionId: bigint;\n public readonly isLong?: boolean;\n public readonly isMaker?: boolean;\n\n constructor(context: PerpCityContext, perpId: Hex, positionId: bigint, isLong?: boolean, isMaker?: boolean) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n this.isLong = isLong;\n this.isMaker = isMaker;\n }\n\n async closePosition(params: ClosePositionParams): Promise<OpenPosition | null> {\n return withErrorHandling(async () => {\n const contractParams = {\n posId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n // Simulate the transaction first - this will catch contract errors early\n // and get the return value (new position ID for partial closes, or null for full closes)\n const { result, request } = await this.context.walletClient.extend(publicActions).simulateContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'closePosition',\n args: [this.perpId, contractParams],\n account: this.context.walletClient.account,\n });\n\n // Execute the transaction\n const txHash = await this.context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const publicClient = this.context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Initialize newPositionId from simulation result\n // The contract returns the new position ID for partial closes, or 0 for full closes\n let newPositionId: bigint | null = result && result !== 0n ? result : null;\n\n // Scan transaction events to confirm if this was a full close\n // If PositionClosed event is found for this perpId/posId, it's a full close\n for (const log of receipt.logs) {\n try {\n const closedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionClosed',\n });\n\n // If this position was fully closed, set newPositionId to null\n if (closedDecoded.args.perpId === this.perpId && closedDecoded.args.posId === this.positionId) {\n newPositionId = null;\n break;\n }\n } catch (e) {\n // Not a PositionClosed event, skip\n continue;\n }\n }\n\n // If no new position ID, this was a full close\n if (!newPositionId) {\n return null;\n }\n\n // Return new OpenPosition with the new position from partial close\n return new OpenPosition(this.context, this.perpId, newPositionId, this.isLong, this.isMaker);\n }, `closePosition for ${this.isMaker ? 'maker' : 'taker'} position ${this.positionId}`);\n }\n\n async liveDetails(): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // livePositionDetails is marked nonpayable in ABI but can be called read-only\n const result = (await this.context.walletClient.readContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'livePositionDetails' as any,\n args: [this.perpId, this.positionId],\n }) as unknown) as readonly [bigint, bigint, bigint, boolean, bigint];\n\n // Use formatUnits to safely convert bigint to decimal, then parse to number\n // The result is a tuple: [pnl, fundingPayment, effectiveMargin, isLiquidatable, newPriceX96]\n return {\n pnl: Number(formatUnits(result[0], 6)),\n fundingPayment: Number(formatUnits(result[1], 6)),\n effectiveMargin: Number(formatUnits(result[2], 6)),\n isLiquidatable: result[3],\n };\n }, `liveDetails for position ${this.positionId}`);\n }\n}\n","import { Hex } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { PerpData } from \"../types/entity-data\";\nimport { OpenPosition } from \"./open-position\";\n\n// Pure functions that operate on PerpData\nexport function getPerpMark(perpData: PerpData): number {\n return perpData.mark;\n}\n\nexport function getPerpIndex(perpData: PerpData): number {\n return perpData.index;\n}\n\nexport function getPerpBeacon(perpData: PerpData): string {\n return perpData.beacon;\n}\n\nexport function getPerpLastIndexUpdate(perpData: PerpData): number {\n return perpData.lastIndexUpdate;\n}\n\nexport function getPerpOpenInterest(perpData: PerpData) {\n return perpData.openInterest;\n}\n\nexport function getPerpMarkTimeSeries(perpData: PerpData) {\n return perpData.markTimeSeries;\n}\n\nexport function getPerpIndexTimeSeries(perpData: PerpData) {\n return perpData.indexTimeSeries;\n}\n\nexport function getPerpFundingRate(perpData: PerpData): number {\n return perpData.fundingRate;\n}\n\nexport function getPerpBounds(perpData: PerpData) {\n return perpData.bounds;\n}\n\nexport function getPerpFees(perpData: PerpData) {\n return perpData.fees;\n}\n\nexport function getPerpOpenInterestTimeSeries(perpData: PerpData) {\n return perpData.openInterestTimeSeries;\n}\n\nexport function getPerpFundingRateTimeSeries(perpData: PerpData) {\n return perpData.fundingRateTimeSeries;\n}\n\nexport function getPerpTickSpacing(perpData: PerpData): number {\n return perpData.tickSpacing;\n}\n\n// Functions that require context for read operations\n\nexport async function getAllMakerPositions(\n context: PerpCityContext,\n perpId: Hex\n): Promise<OpenPosition[]> {\n const query = `\n query ($perpId: Bytes!) {\n openPositions(\n where: { perp: $perpId, isMaker: true }\n ) {\n perp { id }\n inContractPosId\n isLong\n isMaker\n }\n }\n `;\n\n const response: any = await context.goldskyClient.request(query, { perpId });\n \n return response.openPositions.map((position: any) => \n new OpenPosition(\n context, \n position.perp.id, \n BigInt(position.inContractPosId),\n position.isLong,\n position.isMaker\n )\n );\n}\n\nexport async function getAllTakerPositions(\n context: PerpCityContext,\n perpId: Hex\n): Promise<OpenPosition[]> {\n const query = `\n query ($perpId: Bytes!) {\n openPositions(\n where: { perp: $perpId, isMaker: false }\n ) {\n perp { id }\n inContractPosId\n isLong\n isMaker\n }\n }\n `;\n\n const response: any = await context.goldskyClient.request(query, { perpId });\n \n return response.openPositions.map((position: any) => \n new OpenPosition(\n context, \n position.perp.id, \n BigInt(position.inContractPosId),\n position.isLong,\n position.isMaker\n )\n );\n}\n\nexport async function getTotalOpenMakerPnl(\n context: PerpCityContext,\n perpId: Hex\n): Promise<number> {\n const positions = await getAllMakerPositions(context, perpId);\n const liveDetails = await Promise.all(positions.map((position) => position.liveDetails()));\n return liveDetails.reduce((acc, detail) => acc + detail.pnl - detail.fundingPayment, 0);\n}\n\nexport async function getTotalOpenTakerPnl(\n context: PerpCityContext,\n perpId: Hex\n): Promise<number> {\n const positions = await getAllTakerPositions(context, perpId);\n const liveDetails = await Promise.all(positions.map((position) => position.liveDetails()));\n return liveDetails.reduce((acc, detail) => acc + detail.pnl - detail.fundingPayment, 0);\n}\n\n","import { PerpCityContext } from \"../context\";\nimport { priceToSqrtPriceX96, scale6Decimals, scaleToX96, priceToTick } from \"../utils\";\nimport { withErrorHandling, GraphQLError } from \"../utils/errors\";\nimport { approveUsdc } from \"../utils/approve\";\nimport type { Address, Hex } from \"viem\";\nimport { publicActions, decodeEventLog } from \"viem\";\nimport { gql } from \"graphql-request\";\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { parse } from 'graphql';\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport { CreatePerpParams, OpenTakerPositionParams, OpenMakerPositionParams } from \"../types/entity-data\";\nimport { OpenPosition } from \"./open-position\";\n\n// Functional alternatives for PerpManager methods\nexport async function getPerps(context: PerpCityContext): Promise<Hex[]> {\n return withErrorHandling(async () => {\n const query: TypedDocumentNode<{ perps: { id: Hex }[] }, {}> = parse(gql`\n {\n perps {\n id\n }\n }\n `)\n\n const response = await context.goldskyClient.request(query);\n return response.perps.map((perpData: { id: Hex }) => perpData.id as Hex);\n }, \"getPerps\");\n}\n\nexport async function createPerp(context: PerpCityContext, params: CreatePerpParams): Promise<Hex> {\n return withErrorHandling(async () => {\n const sqrtPriceX96 = priceToSqrtPriceX96(params.startingPrice);\n\n const contractParams = {\n startingSqrtPriceX96: sqrtPriceX96,\n beacon: params.beacon,\n };\n\n const { request } = await context.walletClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'createPerp',\n args: [contractParams],\n account: context.walletClient.account,\n });\n\n // Execute the transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract perpId from PerpCreated event\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PerpCreated',\n });\n\n // Return the perpId from the event\n return decoded.args.perpId as Hex;\n } catch (e) {\n // Skip logs that aren't PerpCreated event\n continue;\n }\n }\n\n throw new Error('PerpCreated event not found in transaction receipt');\n }, \"createPerp\");\n}\n\nexport async function openTakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenTakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n // Convert margin to 6-decimal scaled bigint\n const marginScaled = scale6Decimals(params.margin);\n\n // Approve USDC spending\n await approveUsdc(context, marginScaled);\n\n // Convert leverage to X96 format: leverage * 2^96\n const levX96 = scaleToX96(params.leverage);\n\n // Prepare contract parameters\n const contractParams = {\n isLong: params.isLong,\n margin: marginScaled,\n levX96,\n unspecifiedAmountLimit: scale6Decimals(params.unspecifiedAmountLimit),\n };\n\n // Simulate transaction\n const { request } = await context.walletClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'openTakerPosition',\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n // Execute transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Verify success\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract takerPosId from PositionOpened event\n let takerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match perpId and ensure it's a taker position\n if (decoded.args.perpId === perpId && !decoded.args.isMaker) {\n takerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Skip logs that aren't PositionOpened events\n continue;\n }\n }\n\n if (!takerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n // Return OpenPosition instance\n return new OpenPosition(context, perpId, takerPosId, params.isLong, false);\n }, 'openTakerPosition');\n}\n\nexport async function openMakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenMakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n // Convert margin to 6-decimal scaled bigint\n const marginScaled = scale6Decimals(params.margin);\n\n // Approve USDC spending\n await approveUsdc(context, marginScaled);\n\n // Get perp data to determine tick spacing\n const perpData = await context.getPerpData(perpId);\n\n // Convert prices to ticks\n const tickLower = priceToTick(params.priceLower, true); // round down\n const tickUpper = priceToTick(params.priceUpper, false); // round up\n\n // Ensure ticks are valid for tick spacing\n const tickSpacing = perpData.tickSpacing;\n const alignedTickLower = Math.floor(tickLower / tickSpacing) * tickSpacing;\n const alignedTickUpper = Math.ceil(tickUpper / tickSpacing) * tickSpacing;\n\n // Prepare contract parameters\n const contractParams = {\n margin: marginScaled,\n liquidity: params.liquidity,\n tickLower: alignedTickLower,\n tickUpper: alignedTickUpper,\n maxAmt0In: scale6Decimals(params.maxAmt0In),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n // Simulate transaction\n const { request } = await context.walletClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'openMakerPosition',\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n // Execute transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Verify success\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract makerPosId from PositionOpened event\n let makerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match perpId and ensure it's a maker position\n if (decoded.args.perpId === perpId && decoded.args.isMaker) {\n makerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Skip logs that aren't PositionOpened events\n continue;\n }\n }\n\n if (!makerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n // Return OpenPosition instance (isLong will be determined by position data)\n return new OpenPosition(context, perpId, makerPosId, undefined, true);\n }, 'openMakerPosition');\n}\n","import { Hex } from \"viem\";\nimport { UserData, OpenPositionData, ClosedPosition } from \"../types/entity-data\";\n\n// Pure functions that operate on UserData\nexport function getUserUsdcBalance(userData: UserData): number {\n return userData.usdcBalance;\n}\n\nexport function getUserOpenPositions(userData: UserData): OpenPositionData[] {\n return userData.openPositions;\n}\n\nexport function getUserClosedPositions(userData: UserData): ClosedPosition[] {\n return userData.closedPositions;\n}\n\nexport function getUserRealizedPnl(userData: UserData): number {\n return userData.realizedPnl;\n}\n\nexport function getUserUnrealizedPnl(userData: UserData): number {\n return userData.unrealizedPnl;\n}\n\nexport function getUserWalletAddress(userData: UserData): Hex {\n return userData.walletAddress;\n}\n","import { Hex, formatUnits, decodeEventLog } from \"viem\";\nimport { publicActions } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals, scaleFrom6Decimals } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport { OpenPositionData, LiveDetails, ClosePositionParams } from \"../types/entity-data\";\n\n// Pure functions that operate on OpenPositionData\nexport function getPositionPerpId(positionData: OpenPositionData): Hex {\n return positionData.perpId;\n}\n\nexport function getPositionId(positionData: OpenPositionData): bigint {\n return positionData.positionId;\n}\n\nexport function getPositionIsLong(positionData: OpenPositionData): boolean | undefined {\n return positionData.isLong;\n}\n\nexport function getPositionIsMaker(positionData: OpenPositionData): boolean | undefined {\n return positionData.isMaker;\n}\n\nexport function getPositionLiveDetails(positionData: OpenPositionData): LiveDetails {\n return positionData.liveDetails;\n}\n\nexport function getPositionPnl(positionData: OpenPositionData): number {\n return positionData.liveDetails.pnl;\n}\n\nexport function getPositionFundingPayment(positionData: OpenPositionData): number {\n return positionData.liveDetails.fundingPayment;\n}\n\nexport function getPositionEffectiveMargin(positionData: OpenPositionData): number {\n return positionData.liveDetails.effectiveMargin;\n}\n\nexport function getPositionIsLiquidatable(positionData: OpenPositionData): boolean {\n return positionData.liveDetails.isLiquidatable;\n}\n\n// Functions that require context for operations\nexport async function closePosition(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint,\n params: ClosePositionParams\n): Promise<OpenPositionData | null> {\n return withErrorHandling(async () => {\n const contractParams = {\n posId: positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { result, request } = await context.walletClient.extend(publicActions).simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'closePosition',\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract actual positionId from transaction receipt logs\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, no PositionOpened event will be present\n let newPositionId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match the perpId and extract the new position ID\n if (decoded.args.perpId === perpId) {\n newPositionId = decoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Skip logs that aren't PositionOpened events\n continue;\n }\n }\n\n // If no PositionOpened event found, this was a full close - return null\n if (!newPositionId) {\n return null;\n }\n\n // Return the updated position data with actual on-chain position ID\n return {\n perpId,\n positionId: newPositionId,\n liveDetails: await getPositionLiveDetailsFromContract(context, perpId, newPositionId),\n };\n }, `closePosition for position ${positionId}`);\n}\n\nexport async function getPositionLiveDetailsFromContract(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint\n): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // livePositionDetails is marked nonpayable in ABI but can be called read-only\n const result = (await context.walletClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'livePositionDetails' as any,\n args: [perpId, positionId],\n }) as unknown) as readonly [bigint, bigint, bigint, boolean, bigint];\n\n // Use formatUnits to safely convert bigint to decimal string, then parse to number\n // The result is a tuple: [pnl, fundingPayment, effectiveMargin, isLiquidatable, newPriceX96]\n return {\n pnl: Number(formatUnits(result[0], 6)),\n fundingPayment: Number(formatUnits(result[1], 6)),\n effectiveMargin: Number(formatUnits(result[2], 6)),\n isLiquidatable: result[3],\n };\n }, `getPositionLiveDetailsFromContract for position ${positionId}`);\n}\n"],"mappings":"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","names":["erc20Abi","publicActions","formatUnits","publicActions","formatUnits","publicActions","decodeEventLog","parse","parse","publicActions","decodeEventLog","formatUnits","decodeEventLog","publicActions","publicActions","decodeEventLog","formatUnits"]}
1
+ {"version":3,"sources":["../src/context.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/utils/approve.ts","../src/utils/liquidity.ts","../src/utils/errors.ts","../src/utils/rpc.ts","../src/abis/perp-manager.ts","../src/abis/beacon.ts","../src/functions/perp.ts","../src/functions/perp-manager.ts","../src/functions/open-position.ts","../src/functions/user.ts","../src/functions/position.ts"],"sourcesContent":["import { publicActions, formatUnits } from \"viem\";\nimport { PerpCityContextConfig, PerpCityDeployments } from \"./types\";\nimport { Address, Hex } from \"viem\";\nimport { PerpData, UserData, OpenPositionData, LiveDetails, Bounds, Fees, PerpConfig } from \"./types/entity-data\";\nimport { scaleFrom6Decimals, sqrtPriceX96ToPrice, marginRatioToLeverage } from \"./utils\";\nimport { withErrorHandling } from \"./utils/errors\";\nimport { PERP_MANAGER_ABI } from \"./abis/perp-manager\";\nimport { erc20Abi } from \"viem\";\n\nexport class PerpCityContext {\n public readonly walletClient;\n private readonly _deployments: PerpCityDeployments;\n private readonly configCache: Map<Hex, PerpConfig>;\n\n constructor(config: PerpCityContextConfig) {\n this.configCache = new Map();\n this.walletClient = config.walletClient.extend(publicActions);\n this._deployments = config.deployments;\n }\n\n deployments(): PerpCityDeployments {\n return this._deployments;\n }\n\n // Optimized batch data fetching methods\n\n private async fetchPerpData(perpId: Hex): Promise<PerpData> {\n return withErrorHandling(async () => {\n // Fetch contract data only - no historical time series\n const contractData = await this.fetchPerpContractData(perpId);\n const config = await this.getPerpConfig(perpId);\n\n const perpData: PerpData = {\n id: perpId,\n tickSpacing: contractData.tickSpacing,\n mark: sqrtPriceX96ToPrice(contractData.sqrtPriceX96),\n beacon: config.beacon,\n bounds: contractData.bounds,\n fees: contractData.fees,\n };\n\n return perpData;\n }, `fetchPerpData for perp ${perpId}`);\n }\n\n /**\n * Fetches and caches the config for a perpId\n * The config includes module addresses (fees, marginRatios, etc.) and pool settings\n */\n async getPerpConfig(perpId: Hex): Promise<PerpConfig> {\n // Check cache first\n const cached = this.configCache.get(perpId);\n if (cached) {\n return cached;\n }\n\n // Fetch from contract\n const cfg = await this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'cfgs',\n args: [perpId]\n }) as any;\n\n // Store in cache\n this.configCache.set(perpId, cfg);\n\n return cfg;\n }\n\n private async fetchPerpContractData(perpId: Hex, markPrice?: number): Promise<{\n tickSpacing: number;\n sqrtPriceX96: bigint;\n bounds: Bounds;\n fees: Fees;\n }> {\n return withErrorHandling(async () => {\n // Get config from cache or fetch if not cached\n const cfg = await this.getPerpConfig(perpId);\n\n // Extract tickSpacing from PoolKey\n const tickSpacing = Number(cfg.key.tickSpacing);\n\n // Calculate sqrtPriceX96 from mark price if available, otherwise use TWAP\n let sqrtPriceX96: bigint;\n if (markPrice) {\n // Convert mark price to sqrtPriceX96 format\n const sqrtPrice = Math.sqrt(markPrice);\n sqrtPriceX96 = BigInt(Math.floor(sqrtPrice * (2 ** 96)));\n } else {\n // Fallback to TWAP with 1 second lookback\n sqrtPriceX96 = await this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'timeWeightedAvgSqrtPriceX96',\n args: [perpId, 1]\n }) as bigint;\n }\n\n // NOTE: Deployed contracts use modular architecture where fees and margin ratios\n // are in separate contracts (cfg.fees, cfg.marginRatios addresses).\n // We don't have ABIs for those modules, so using placeholder values.\n // These will be removed in PR 2 when Goldsky is removed.\n return {\n tickSpacing,\n sqrtPriceX96,\n bounds: {\n minMargin: 10, // Placeholder - would need to call cfg.marginRatios contract\n minTakerLeverage: 1.1,\n maxTakerLeverage: 20,\n },\n fees: {\n creatorFee: 0.0001, // Placeholder - would need to call cfg.fees contract\n insuranceFee: 0.0001,\n lpFee: 0.0003,\n liquidationFee: 0.01,\n },\n };\n }, `fetchPerpContractData for perp ${perpId}`);\n }\n\n /**\n * Fetch comprehensive perp data with all related information in a single batched request\n */\n async getPerpData(perpId: Hex): Promise<PerpData> {\n return this.fetchPerpData(perpId);\n }\n\n\n private async fetchUserData(\n userAddress: Hex,\n positions: Array<{ perpId: Hex; positionId: bigint; isLong: boolean; isMaker: boolean }>\n ): Promise<UserData> {\n const usdcBalance = await this.walletClient.readContract({\n address: this.deployments().usdc,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [userAddress],\n });\n\n // Fetch live details for all positions in parallel\n const openPositionsData = await Promise.all(\n positions.map(async ({ perpId, positionId, isLong, isMaker }) => {\n const liveDetails = await this.fetchPositionLiveDetailsFromContract(perpId, positionId);\n return {\n perpId,\n positionId,\n isLong,\n isMaker,\n liveDetails,\n };\n })\n );\n\n return {\n walletAddress: userAddress,\n usdcBalance: Number(formatUnits(usdcBalance, 6)),\n openPositions: openPositionsData,\n };\n }\n\n\n private async fetchPositionLiveDetailsFromContract(perpId: Hex, positionId: bigint): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await this.walletClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'quoteClosePosition' as any,\n args: [positionId],\n }) as unknown) as readonly [boolean, bigint, bigint, bigint, boolean];\n\n // The result is a tuple: [success, pnl, funding, netMargin, wasLiquidated]\n const [success, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (!success) {\n throw new Error(`Failed to quote position ${positionId} - position may be invalid or already closed`);\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n fundingPayment: Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(netMargin, 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `fetchPositionLiveDetailsFromContract for position ${positionId}`);\n }\n\n /**\n * Fetch comprehensive user data with live details for all positions\n * @param userAddress - The user's wallet address\n * @param positions - Array of position metadata (perpId, positionId, isLong, isMaker) tracked from transaction receipts\n */\n async getUserData(\n userAddress: Hex,\n positions: Array<{ perpId: Hex; positionId: bigint; isLong: boolean; isMaker: boolean }>\n ): Promise<UserData> {\n return this.fetchUserData(userAddress, positions);\n }\n\n /**\n * Fetch open position data with live details\n * @param perpId - The perpetual market ID\n * @param positionId - The position ID\n * @param isLong - Whether the position is long (true) or short (false)\n * @param isMaker - Whether the position is a maker (LP) position\n */\n async getOpenPositionData(\n perpId: Hex,\n positionId: bigint,\n isLong: boolean,\n isMaker: boolean\n ): Promise<OpenPositionData> {\n const liveDetails = await this.fetchPositionLiveDetailsFromContract(perpId, positionId);\n\n return {\n perpId,\n positionId,\n isLong,\n isMaker,\n liveDetails,\n };\n }\n}","export const NUMBER_1E6: number = 1000000; // 1e6\nexport const BIGINT_1E6: bigint = 1000000n; // 1e6\n\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n","import { NUMBER_1E6, BIGINT_1E6, Q96 } from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error('Price too large');\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * NUMBER_1E6;\n return BigInt(Math.floor(scaledSqrtPrice)) * Q96 / BigInt(NUMBER_1E6);\n}\n\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / NUMBER_1E6) {\n throw new Error('Amount too large');\n }\n\n return BigInt(Math.floor(amount * NUMBER_1E6));\n}\n\nexport function scaleToX96(amount: number): bigint {\n return BigInt(scale6Decimals(amount)) * Q96 / BigInt(NUMBER_1E6);\n}\n\nexport function scaleFromX96(valueX96: bigint): number {\n const valueScaled6Decimals = valueX96 * BIGINT_1E6 / Q96;\n\n if (valueScaled6Decimals > Number.MAX_SAFE_INTEGER) {\n throw new Error('Value too large');\n }\n\n return Number(valueScaled6Decimals) / NUMBER_1E6;\n}\n\nexport function priceToTick(price: number, roundDown: boolean): number {\n const logPrice = Math.log(price) / Math.log(1.0001);\n return roundDown ? Math.floor(logPrice) : Math.ceil(logPrice);\n}\n\nexport function sqrtPriceX96ToPrice(sqrtPriceX96: bigint): number {\n const priceX96 = sqrtPriceX96 * sqrtPriceX96 / Q96;\n return scaleFromX96(priceX96);\n}\n\nexport function marginRatioToLeverage(marginRatio: number): number {\n return NUMBER_1E6 / marginRatio;\n}\n\nexport function scaleFrom6Decimals(value: number): number {\n return value / NUMBER_1E6;\n}","import { PerpCityContext } from \"../context\";\nimport { erc20Abi } from \"viem\";\n\nconst DEFAULT_CONFIRMATIONS = 2;\n\nexport async function approveUsdc(context: PerpCityContext, amount: bigint, confirmations: number = DEFAULT_CONFIRMATIONS) {\n const deployments = context.deployments();\n\n const { request } = await context.walletClient.simulateContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: 'approve',\n args: [deployments.perpManager, amount],\n account: context.walletClient.account,\n });\n\n const hash = await context.walletClient.writeContract(request);\n\n await context.walletClient.waitForTransactionReceipt({ \n confirmations: confirmations, \n hash \n });\n}","import { PerpCityContext } from \"../context\";\n\n/**\n * Calculate liquidity from USDC amount (amount1) using Uniswap v3 formula\n * liquidity = amount1 / (sqrt(priceUpper) - sqrt(priceLower))\n *\n * This replicates the estimateLiquidityForAmount1 function that existed in older contracts\n * but is not present in the deployed contracts.\n */\nexport async function estimateLiquidity(context: PerpCityContext, tickLower: number, tickUpper: number, usdScaled: bigint): Promise<bigint> {\n // Calculate sqrt prices from ticks using Uniswap v3 formula\n // sqrtPriceX96 = sqrt(1.0001^tick) * 2^96\n const Q96 = 1n << 96n;\n\n const sqrtPriceLowerX96 = getSqrtRatioAtTick(tickLower);\n const sqrtPriceUpperX96 = getSqrtRatioAtTick(tickUpper);\n\n // Calculate liquidity using the formula:\n // L = amount1 / (sqrtPriceUpper - sqrtPriceLower) * Q96\n const sqrtPriceDiff = sqrtPriceUpperX96 - sqrtPriceLowerX96;\n const liquidity = (usdScaled * Q96) / sqrtPriceDiff;\n\n return liquidity;\n}\n\n/**\n * Get sqrt price at tick using Uniswap v3 formula\n * sqrtPriceX96 = sqrt(1.0001^tick) * 2^96\n */\nfunction getSqrtRatioAtTick(tick: number): bigint {\n const absTick = Math.abs(tick);\n\n let ratio = 0xfffcb933bd6fad37aa2d162d1a594001n;\n if (absTick & 0x1) ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;\n if (absTick & 0x2) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;\n if (absTick & 0x4) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;\n if (absTick & 0x8) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;\n if (absTick & 0x10) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;\n if (absTick & 0x20) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;\n if (absTick & 0x40) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;\n if (absTick & 0x80) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;\n if (absTick & 0x100) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;\n if (absTick & 0x200) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;\n if (absTick & 0x400) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;\n if (absTick & 0x800) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;\n if (absTick & 0x1000) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;\n if (absTick & 0x2000) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;\n if (absTick & 0x4000) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;\n if (absTick & 0x8000) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;\n if (absTick & 0x10000) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;\n if (absTick & 0x20000) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;\n if (absTick & 0x40000) ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;\n\n if (tick > 0) ratio = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn / ratio;\n\n return (ratio % (1n << 32n)) > 0n\n ? (ratio >> 32n) + 1n\n : (ratio >> 32n);\n}","import { BaseError, ContractFunctionRevertedError, decodeErrorResult } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\n\n/**\n * Base class for all PerpCity SDK errors\n */\nexport class PerpCityError extends Error {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"PerpCityError\";\n }\n}\n\n/**\n * Error thrown when a contract call reverts\n */\nexport class ContractError extends PerpCityError {\n constructor(\n message: string,\n public readonly errorName?: string,\n public readonly args?: readonly unknown[],\n cause?: Error\n ) {\n super(message, cause);\n this.name = \"ContractError\";\n }\n}\n\n/**\n * Error thrown when a transaction is rejected by the user\n */\nexport class TransactionRejectedError extends PerpCityError {\n constructor(message = \"Transaction rejected by user\", cause?: Error) {\n super(message, cause);\n this.name = \"TransactionRejectedError\";\n }\n}\n\n/**\n * Error thrown when there are insufficient funds\n */\nexport class InsufficientFundsError extends PerpCityError {\n constructor(message = \"Insufficient funds for transaction\", cause?: Error) {\n super(message, cause);\n this.name = \"InsufficientFundsError\";\n }\n}\n\n/**\n * Error thrown when an RPC call fails\n */\nexport class RPCError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"RPCError\";\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Parse and format a contract error into a user-friendly message\n */\nexport function parseContractError(error: unknown): PerpCityError {\n if (error instanceof PerpCityError) {\n return error;\n }\n\n // Handle viem BaseError\n if (error instanceof BaseError) {\n const revertError = error.walk((err) => err instanceof ContractFunctionRevertedError);\n\n if (revertError instanceof ContractFunctionRevertedError) {\n const errorName = revertError.data?.errorName ?? \"Unknown\";\n const args = revertError.data?.args ?? [];\n\n // Map known contract errors to user-friendly messages\n const message = formatContractError(errorName, args);\n return new ContractError(message, errorName, args, error as Error);\n }\n\n // Check for user rejection\n if (error.message?.includes(\"User rejected\") || (error as any).code === 4001) {\n return new TransactionRejectedError(error.message, error as Error);\n }\n\n // Check for insufficient funds\n if (error.message?.includes(\"insufficient funds\")) {\n return new InsufficientFundsError(error.message, error as Error);\n }\n\n return new PerpCityError(error.shortMessage || error.message, error as Error);\n }\n\n // Handle generic errors\n if (error instanceof Error) {\n return new PerpCityError(error.message, error);\n }\n\n return new PerpCityError(String(error));\n}\n\n/**\n * Format a contract error name and args into a user-friendly message\n */\nfunction formatContractError(errorName: string, args: readonly unknown[]): string {\n switch (errorName) {\n case \"InvalidBeaconAddress\":\n return `Invalid beacon address: ${args[0]}`;\n\n case \"InvalidTradingFeeSplits\":\n return `Invalid trading fee splits. Insurance split: ${args[0]}, Creator split: ${args[1]}`;\n\n case \"InvalidMaxOpeningLev\":\n return `Invalid maximum opening leverage: ${args[0]}`;\n\n case \"InvalidLiquidationLev\":\n return `Invalid liquidation leverage: ${args[0]}. Must be less than max opening leverage: ${args[1]}`;\n\n case \"InvalidLiquidationFee\":\n return `Invalid liquidation fee: ${args[0]}`;\n\n case \"InvalidLiquidatorFeeSplit\":\n return `Invalid liquidator fee split: ${args[0]}`;\n\n case \"InvalidClose\":\n return `Cannot close position. Caller: ${args[0]}, Holder: ${args[1]}, Is Liquidated: ${args[2]}`;\n\n case \"InvalidCaller\":\n return `Invalid caller. Expected: ${args[1]}, Got: ${args[0]}`;\n\n case \"InvalidLiquidity\":\n return `Invalid liquidity amount: ${args[0]}`;\n\n case \"InvalidMargin\":\n return `Invalid margin amount: ${args[0]}`;\n\n case \"InvalidLevX96\":\n return `Invalid leverage: ${args[0]}. Maximum allowed: ${args[1]}`;\n\n case \"MakerPositionLocked\":\n return `Maker position is locked until ${new Date(Number(args[1]) * 1000).toISOString()}. Current time: ${new Date(Number(args[0]) * 1000).toISOString()}`;\n\n case \"MaximumAmountExceeded\":\n return `Maximum amount exceeded. Maximum: ${args[0]}, Requested: ${args[1]}`;\n\n case \"MinimumAmountInsufficient\":\n return `Minimum amount not met. Required: ${args[0]}, Received: ${args[1]}`;\n\n case \"PriceImpactTooHigh\":\n return `Price impact too high. Current price: ${args[0]}, Min acceptable: ${args[1]}, Max acceptable: ${args[2]}`;\n\n case \"SwapReverted\":\n return \"Swap failed. This may be due to insufficient liquidity or slippage tolerance.\";\n\n case \"ZeroSizePosition\":\n return `Cannot create zero-size position. Perp delta: ${args[0]}, USD delta: ${args[1]}`;\n\n case \"InvalidFundingInterval\":\n return `Invalid funding interval: ${args[0]}`;\n\n case \"InvalidPriceImpactBand\":\n return `Invalid price impact band: ${args[0]}`;\n\n case \"InvalidMarketDeathThreshold\":\n return `Invalid market death threshold: ${args[0]}`;\n\n case \"InvalidTickRange\":\n return `Invalid tick range. Lower: ${args[0]}, Upper: ${args[1]}`;\n\n case \"MarketNotKillable\":\n return `Market health (${args[0]}) is above death threshold (${args[1]}). Market cannot be killed yet.`;\n\n case \"InvalidStartingSqrtPriceX96\":\n return `Invalid starting sqrt price: ${args[0]}`;\n\n default:\n return `Contract error: ${errorName}${args.length > 0 ? ` (${args.join(\", \")})` : \"\"}`;\n }\n}\n\n/**\n * Wrap an async function with error handling\n */\nexport async function withErrorHandling<T>(\n fn: () => Promise<T>,\n context: string\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const parsedError = parseContractError(error);\n parsedError.message = `${context}: ${parsedError.message}`;\n throw parsedError;\n }\n}\n","/**\n * RPC URL utilities for connecting to blockchain networks\n */\n\nexport interface RpcConfig {\n url?: string;\n}\n\n/**\n * Get the RPC URL from environment or configuration\n *\n * This is a simple helper that retrieves the RPC URL from the RPC_URL\n * environment variable or accepts a direct override. The function does\n * not construct URLs - it expects the full endpoint URL to be provided.\n *\n * @param config - Optional configuration with URL override\n * @returns The RPC URL to use for connections\n * @throws Error if no RPC URL is configured\n *\n * @example\n * // Get URL from RPC_URL environment variable\n * // RPC_URL=https://your-rpc-endpoint.example\n * const url = getRpcUrl();\n * // Returns: https://your-rpc-endpoint.example\n *\n * @example\n * // Override with custom URL\n * const url = getRpcUrl({\n * url: 'https://custom-rpc.example'\n * });\n * // Returns: https://custom-rpc.example\n */\nexport function getRpcUrl(config: RpcConfig = {}): string {\n const rpcUrl = config.url ?? process.env.RPC_URL;\n\n if (!rpcUrl) {\n throw new Error(\n 'RPC_URL is required. Please set the RPC_URL environment variable with your full RPC endpoint URL.\\n' +\n 'Example URLs (use your own provider and API key):\\n' +\n ' https://base-sepolia.g.alchemy.com/v2/YOUR_API_KEY\\n' +\n ' https://base-sepolia.infura.io/v3/YOUR_API_KEY\\n' +\n ' https://sepolia.base.org'\n );\n }\n\n return rpcUrl;\n}\n","export const PERP_MANAGER_ABI = \n[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"AccountBalanceOverflow\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"AlreadyInitialized\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"BalanceQueryForZeroAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"FeeTooLarge\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"FeesNotRegistered\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"action\",\n \"type\": \"uint8\"\n }\n ],\n \"name\": \"InvalidAction\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidCaller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n }\n ],\n \"name\": \"InvalidLiquidity\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidMargin\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"marginRatio\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"InvalidMarginRatio\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"LockupPeriodNotRegistered\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"MakerNotAllowed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"MarginRatiosNotRegistered\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"maximumAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountRequested\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MaximumAmountExceeded\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"minimumAmount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amountReceived\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MinimumAmountInsufficient\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ModuleAlreadyRegistered\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NewOwnerIsZeroAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NoHandoverRequest\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotOwnerNorApproved\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotPoolManager\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PositionLocked\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"SqrtPriceImpactLimitNotRegistered\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TokenAlreadyExists\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TokenDoesNotExist\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFromIncorrectOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferToNonERC721ReceiverImplementer\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferToZeroAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"Unauthorized\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ZeroDelta\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"operator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"isApproved\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"ApprovalForAll\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"contract IFees\",\n \"name\": \"feesModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"FeesModuleRegistered\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"contract ILockupPeriod\",\n \"name\": \"lockupPeriodModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"LockupPeriodModuleRegistered\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newMargin\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"MarginAdjusted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"contract IMarginRatios\",\n \"name\": \"marginRatiosModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"MarginRatiosModuleRegistered\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"longOI\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"shortOI\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"newPerpDelta\",\n \"type\": \"int256\"\n }\n ],\n \"name\": \"NotionalAdjusted\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"pendingOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipHandoverCanceled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"pendingOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipHandoverRequested\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"oldOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"beacon\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"indexPriceX96\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PerpCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"longOI\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"shortOI\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"wasLiquidated\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"wasPartialClose\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"PositionClosed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"sqrtPriceX96\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"longOI\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"shortOI\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"isMaker\",\n \"type\": \"bool\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"int256\",\n \"name\": \"entryPerpDelta\",\n \"type\": \"int256\"\n }\n ],\n \"name\": \"PositionOpened\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"contract ISqrtPriceImpactLimit\",\n \"name\": \"sqrtPriceImpactLimitModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SqrtPriceImpactLimitModuleRegistered\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC721_NAME\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC721_SYMBOL\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"ERC721_URI\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_PROTOCOL_FEE\",\n \"outputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"\",\n \"type\": \"uint24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"marginDelta\",\n \"type\": \"int256\"\n }\n ],\n \"internalType\": \"struct IPerpManager.AdjustMarginParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"adjustMargin\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"usdLimit\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.AdjustNotionalParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"adjustNotional\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"result\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"cancelOwnershipHandover\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"cfgs\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"Currency\",\n \"name\": \"currency0\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"Currency\",\n \"name\": \"currency1\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"fee\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickSpacing\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"contract IHooks\",\n \"name\": \"hooks\",\n \"type\": \"address\"\n }\n ],\n \"internalType\": \"struct PoolKey\",\n \"name\": \"key\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"vault\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"beacon\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract IFees\",\n \"name\": \"fees\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract IMarginRatios\",\n \"name\": \"marginRatios\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract ILockupPeriod\",\n \"name\": \"lockupPeriod\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract ISqrtPriceImpactLimit\",\n \"name\": \"sqrtPriceImpactLimit\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"minAmt0Out\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"minAmt1Out\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt1In\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.ClosePositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"closePosition\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"collectProtocolFees\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"pendingOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"completeOwnershipHandover\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"beacon\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract IFees\",\n \"name\": \"fees\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract IMarginRatios\",\n \"name\": \"marginRatios\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract ILockupPeriod\",\n \"name\": \"lockupPeriod\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"contract ISqrtPriceImpactLimit\",\n \"name\": \"sqrtPriceImpactLimit\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint160\",\n \"name\": \"startingSqrtPriceX96\",\n \"type\": \"uint160\"\n }\n ],\n \"internalType\": \"struct IPerpManager.CreatePerpParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"createPerp\",\n \"outputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getApproved\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"result\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint16\",\n \"name\": \"cardinalityCap\",\n \"type\": \"uint16\"\n }\n ],\n \"name\": \"increaseCardinalityCap\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"operator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isApprovedForAll\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"result\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IFees\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isFeesRegistered\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract ILockupPeriod\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isLockupPeriodRegistered\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IMarginRatios\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isMarginRatiosRegistered\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract ISqrtPriceImpactLimit\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isSqrtPriceImpactLimitRegistered\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"nextPosId\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickLower\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickUpper\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt0In\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt1In\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenMakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"openMakerPos\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isLong\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"levX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"unspecifiedAmountLimit\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenTakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"openTakerPos\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"result\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ownerOf\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"result\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"pendingOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"ownershipHandoverExpiresAt\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"result\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"positions\",\n \"outputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryPerpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryUsdDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryCumlFundingX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"entryCumlBadDebtX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"entryCumlUtilizationX96\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"min\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"max\",\n \"type\": \"uint24\"\n },\n {\n \"internalType\": \"uint24\",\n \"name\": \"liq\",\n \"type\": \"uint24\"\n }\n ],\n \"internalType\": \"struct IMarginRatios.MarginRatios\",\n \"name\": \"marginRatios\",\n \"type\": \"tuple\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"unlockTimestamp\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickLower\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickUpper\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryCumlFundingBelowX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryCumlFundingWithinX96\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"entryCumlFundingDivSqrtPWithinX96\",\n \"type\": \"int256\"\n }\n ],\n \"internalType\": \"struct IPerpManager.MakerDetails\",\n \"name\": \"makerDetails\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"protocolFee\",\n \"outputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"\",\n \"type\": \"uint24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"quoteClosePosition\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"pnl\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"funding\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"netMargin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"wasLiquidated\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"liquidity\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickLower\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"int24\",\n \"name\": \"tickUpper\",\n \"type\": \"int24\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt0In\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"maxAmt1In\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenMakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"quoteOpenMakerPosition\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"usdDelta\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"holder\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isLong\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"margin\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"levX96\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"unspecifiedAmountLimit\",\n \"type\": \"uint128\"\n }\n ],\n \"internalType\": \"struct IPerpManager.OpenTakerPositionParams\",\n \"name\": \"params\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"quoteOpenTakerPosition\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"perpDelta\",\n \"type\": \"int256\"\n },\n {\n \"internalType\": \"int256\",\n \"name\": \"usdDelta\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IFees\",\n \"name\": \"feesModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"registerFeesModule\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract ILockupPeriod\",\n \"name\": \"lockupPeriodModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"registerLockupPeriodModule\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IMarginRatios\",\n \"name\": \"marginRatiosModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"registerMarginRatiosModule\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"contract ISqrtPriceImpactLimit\",\n \"name\": \"sqrtPriceImpactLimitModule\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"registerSqrtPriceImpactLimitModule\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"requestOwnershipHandover\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"safeTransferFrom\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"safeTransferFrom\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"operator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isApproved\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setApprovalForAll\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint24\",\n \"name\": \"newProtocolFee\",\n \"type\": \"uint24\"\n }\n ],\n \"name\": \"setProtocolFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes4\",\n \"name\": \"interfaceId\",\n \"type\": \"bytes4\"\n }\n ],\n \"name\": \"supportsInterface\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"result\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"takerOpenInterest\",\n \"outputs\": [\n {\n \"internalType\": \"uint128\",\n \"name\": \"longOI\",\n \"type\": \"uint128\"\n },\n {\n \"internalType\": \"uint128\",\n \"name\": \"shortOI\",\n \"type\": \"uint128\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"PoolId\",\n \"name\": \"perpId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"lookbackWindow\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"timeWeightedAvgSqrtPriceX96\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"twAvg\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"posId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tokenURI\",\n \"outputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"id\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"unlockCallback\",\n \"outputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"encodedDelta\",\n \"type\": \"bytes\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n] as const;\n","export const BEACON_ABI = \n[\n {\n \"inputs\": [\n {\n \"internalType\": \"contract IVerifierWrapper\",\n \"name\": \"verifierWrapper\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"initialData\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"initialCardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"proof\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"publicSignals\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"InvalidProof\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"proof\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"publicSignals\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"ProofAlreadyUsed\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"data\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"DataUpdated\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [],\n \"name\": \"MAX_DATA\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"MIN_DATA\",\n \"outputs\": [\n {\n \"internalType\": \"int256\",\n \"name\": \"\",\n \"type\": \"int256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"VERIFIER_WRAPPER\",\n \"outputs\": [\n {\n \"internalType\": \"contract IVerifierWrapper\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"data\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"getData\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"twapSecondsAgo\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"getTwap\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"twapPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"name\": \"increaseCardinalityNext\",\n \"outputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNextOld\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNextNew\",\n \"type\": \"uint32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"timestamp\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"twapState\",\n \"outputs\": [\n {\n \"internalType\": \"uint32\",\n \"name\": \"index\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinality\",\n \"type\": \"uint32\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"cardinalityNext\",\n \"type\": \"uint32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"proof\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"publicSignals\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"updateData\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n \"name\": \"usedProofs\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n] as const;\n","import { PerpData } from \"../types/entity-data\";\n\n// Pure functions that operate on PerpData\nexport function getPerpMark(perpData: PerpData): number {\n return perpData.mark;\n}\n\nexport function getPerpBeacon(perpData: PerpData): string {\n return perpData.beacon;\n}\n\nexport function getPerpBounds(perpData: PerpData) {\n return perpData.bounds;\n}\n\nexport function getPerpFees(perpData: PerpData) {\n return perpData.fees;\n}\n\nexport function getPerpTickSpacing(perpData: PerpData): number {\n return perpData.tickSpacing;\n}\n\n","import { PerpCityContext } from \"../context\";\nimport { priceToSqrtPriceX96, scale6Decimals, scaleToX96, priceToTick } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { approveUsdc } from \"../utils/approve\";\nimport type { Address, Hex } from \"viem\";\nimport { publicActions, decodeEventLog } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport { CreatePerpParams, OpenTakerPositionParams, OpenMakerPositionParams } from \"../types/entity-data\";\nimport { OpenPosition } from \"./open-position\";\n\nexport async function createPerp(context: PerpCityContext, params: CreatePerpParams): Promise<Hex> {\n return withErrorHandling(async () => {\n const sqrtPriceX96 = priceToSqrtPriceX96(params.startingPrice);\n const deployments = context.deployments();\n\n // Use params if provided, otherwise fall back to deployment config\n const fees = params.fees ?? deployments.feesModule;\n const marginRatios = params.marginRatios ?? deployments.marginRatiosModule;\n const lockupPeriod = params.lockupPeriod ?? deployments.lockupPeriodModule;\n const sqrtPriceImpactLimit = params.sqrtPriceImpactLimit ?? deployments.sqrtPriceImpactLimitModule;\n\n if (!fees || !marginRatios || !lockupPeriod || !sqrtPriceImpactLimit) {\n throw new Error('Module addresses must be provided either in params or deployment config');\n }\n\n const contractParams = {\n beacon: params.beacon,\n fees,\n marginRatios,\n lockupPeriod,\n sqrtPriceImpactLimit,\n startingSqrtPriceX96: sqrtPriceX96,\n };\n\n const { request } = await context.walletClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'createPerp',\n args: [contractParams],\n account: context.walletClient.account,\n });\n\n // Execute the transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract perpId from PerpCreated event\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PerpCreated',\n });\n\n // Return the perpId from the event\n return decoded.args.perpId as Hex;\n } catch (e) {\n // Skip logs that aren't PerpCreated event\n continue;\n }\n }\n\n throw new Error('PerpCreated event not found in transaction receipt');\n }, \"createPerp\");\n}\n\nexport async function openTakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenTakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n // Convert margin to 6-decimal scaled bigint\n const marginScaled = scale6Decimals(params.margin);\n\n // Approve USDC spending\n await approveUsdc(context, marginScaled);\n\n // Convert leverage to X96 format: leverage * 2^96\n const levX96 = scaleToX96(params.leverage);\n\n // Prepare contract parameters - deployed contract requires holder address\n const contractParams = {\n holder: context.walletClient.account!.address,\n isLong: params.isLong,\n margin: marginScaled,\n levX96,\n unspecifiedAmountLimit: scale6Decimals(params.unspecifiedAmountLimit),\n };\n\n // Simulate transaction - deployed contract uses openTakerPos\n const { request } = await context.walletClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'openTakerPos' as any,\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n // Execute transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Verify success\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract takerPosId from PositionOpened event\n let takerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match perpId and ensure it's a taker position\n if (decoded.args.perpId === perpId && !decoded.args.isMaker) {\n takerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Skip logs that aren't PositionOpened events\n continue;\n }\n }\n\n if (!takerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n // Return OpenPosition instance\n return new OpenPosition(context, perpId, takerPosId, params.isLong, false);\n }, 'openTakerPosition');\n}\n\nexport async function openMakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenMakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n // Convert margin to 6-decimal scaled bigint\n const marginScaled = scale6Decimals(params.margin);\n\n // Approve USDC spending\n await approveUsdc(context, marginScaled);\n\n // Get perp data to determine tick spacing\n const perpData = await context.getPerpData(perpId);\n\n // Convert prices to ticks\n const tickLower = priceToTick(params.priceLower, true); // round down\n const tickUpper = priceToTick(params.priceUpper, false); // round up\n\n // Ensure ticks are valid for tick spacing\n const tickSpacing = perpData.tickSpacing;\n const alignedTickLower = Math.floor(tickLower / tickSpacing) * tickSpacing;\n const alignedTickUpper = Math.ceil(tickUpper / tickSpacing) * tickSpacing;\n\n // Prepare contract parameters - deployed contract requires holder address\n const contractParams = {\n holder: context.walletClient.account!.address,\n margin: marginScaled,\n liquidity: params.liquidity,\n tickLower: alignedTickLower,\n tickUpper: alignedTickUpper,\n maxAmt0In: scale6Decimals(params.maxAmt0In),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n // Simulate transaction - deployed contract uses openMakerPos\n const { request } = await context.walletClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'openMakerPos' as any,\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n // Execute transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Verify success\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract makerPosId from PositionOpened event\n let makerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match perpId and ensure it's a maker position\n if (decoded.args.perpId === perpId && decoded.args.isMaker) {\n makerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Skip logs that aren't PositionOpened events\n continue;\n }\n }\n\n if (!makerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n // Return OpenPosition instance (isLong will be determined by position data)\n return new OpenPosition(context, perpId, makerPosId, undefined, true);\n }, 'openMakerPosition');\n}\n","import type { Hex } from \"viem\";\nimport { publicActions, formatUnits, decodeEventLog } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals, scaleFrom6Decimals } from \"../utils\";\nimport { withErrorHandling, parseContractError } from \"../utils/errors\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport { ClosePositionParams, LiveDetails } from \"../types/entity-data\";\n\nexport class OpenPosition {\n public readonly context: PerpCityContext;\n public readonly perpId: Hex;\n public readonly positionId: bigint;\n public readonly isLong?: boolean;\n public readonly isMaker?: boolean;\n\n constructor(context: PerpCityContext, perpId: Hex, positionId: bigint, isLong?: boolean, isMaker?: boolean) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n this.isLong = isLong;\n this.isMaker = isMaker;\n }\n\n async closePosition(params: ClosePositionParams): Promise<OpenPosition | null> {\n return withErrorHandling(async () => {\n const contractParams = {\n posId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n // Simulate the transaction first - this will catch contract errors early\n const { request } = await this.context.walletClient.extend(publicActions).simulateContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'closePosition',\n args: [contractParams],\n account: this.context.walletClient.account,\n });\n\n // Execute the transaction\n const txHash = await this.context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const publicClient = this.context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Scan transaction events to determine if this was a partial or full close\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, a PositionClosed event is emitted\n let newPositionId: bigint | null = null;\n let wasFullyClosed = false;\n\n for (const log of receipt.logs) {\n try {\n // Check for PositionOpened event (partial close)\n const openedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match the perpId and extract the new position ID\n if (openedDecoded.args.perpId === this.perpId) {\n newPositionId = openedDecoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Not a PositionOpened event, try PositionClosed\n try {\n const closedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionClosed',\n });\n\n // If this position was fully closed, mark it\n if (closedDecoded.args.perpId === this.perpId && closedDecoded.args.posId === this.positionId) {\n wasFullyClosed = true;\n break;\n }\n } catch (e2) {\n // Neither event, skip\n continue;\n }\n }\n }\n\n // If no new position ID, this was a full close\n if (!newPositionId) {\n return null;\n }\n\n // Return new OpenPosition with the new position from partial close\n return new OpenPosition(this.context, this.perpId, newPositionId, this.isLong, this.isMaker);\n }, `closePosition for ${this.isMaker ? 'maker' : 'taker'} position ${this.positionId}`);\n }\n\n async liveDetails(): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await this.context.walletClient.readContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'quoteClosePosition' as any,\n args: [this.positionId],\n }) as unknown) as readonly [boolean, bigint, bigint, bigint, boolean];\n\n // The result is a tuple: [success, pnl, funding, netMargin, wasLiquidated]\n const [success, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (!success) {\n throw new Error(`Failed to quote position ${this.positionId} - position may be invalid or already closed`);\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n fundingPayment: Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(netMargin, 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `liveDetails for position ${this.positionId}`);\n }\n}\n","import { Hex } from \"viem\";\nimport { UserData, OpenPositionData } from \"../types/entity-data\";\n\n// Pure functions that operate on UserData\nexport function getUserUsdcBalance(userData: UserData): number {\n return userData.usdcBalance;\n}\n\nexport function getUserOpenPositions(userData: UserData): OpenPositionData[] {\n return userData.openPositions;\n}\n\nexport function getUserWalletAddress(userData: UserData): Hex {\n return userData.walletAddress;\n}\n","import { Hex, formatUnits, decodeEventLog } from \"viem\";\nimport { publicActions } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals, scaleFrom6Decimals } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport { OpenPositionData, LiveDetails, ClosePositionParams } from \"../types/entity-data\";\n\n// Pure functions that operate on OpenPositionData\nexport function getPositionPerpId(positionData: OpenPositionData): Hex {\n return positionData.perpId;\n}\n\nexport function getPositionId(positionData: OpenPositionData): bigint {\n return positionData.positionId;\n}\n\nexport function getPositionIsLong(positionData: OpenPositionData): boolean | undefined {\n return positionData.isLong;\n}\n\nexport function getPositionIsMaker(positionData: OpenPositionData): boolean | undefined {\n return positionData.isMaker;\n}\n\nexport function getPositionLiveDetails(positionData: OpenPositionData): LiveDetails {\n return positionData.liveDetails;\n}\n\nexport function getPositionPnl(positionData: OpenPositionData): number {\n return positionData.liveDetails.pnl;\n}\n\nexport function getPositionFundingPayment(positionData: OpenPositionData): number {\n return positionData.liveDetails.fundingPayment;\n}\n\nexport function getPositionEffectiveMargin(positionData: OpenPositionData): number {\n return positionData.liveDetails.effectiveMargin;\n}\n\nexport function getPositionIsLiquidatable(positionData: OpenPositionData): boolean {\n return positionData.liveDetails.isLiquidatable;\n}\n\n// Functions that require context for operations\nexport async function closePosition(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint,\n params: ClosePositionParams\n): Promise<OpenPositionData | null> {\n return withErrorHandling(async () => {\n const contractParams = {\n posId: positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { result, request } = await context.walletClient.extend(publicActions).simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'closePosition',\n args: [contractParams],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const publicClient = context.walletClient.extend(publicActions);\n const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === 'reverted') {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract actual positionId from transaction receipt logs\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, no PositionOpened event will be present\n let newPositionId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: 'PositionOpened',\n });\n\n // Match the perpId and extract the new position ID\n if (decoded.args.perpId === perpId) {\n newPositionId = decoded.args.posId as bigint;\n break;\n }\n } catch (e) {\n // Skip logs that aren't PositionOpened events\n continue;\n }\n }\n\n // If no PositionOpened event found, this was a full close - return null\n if (!newPositionId) {\n return null;\n }\n\n // Return the updated position data with actual on-chain position ID\n return {\n perpId,\n positionId: newPositionId,\n liveDetails: await getPositionLiveDetailsFromContract(context, perpId, newPositionId),\n };\n }, `closePosition for position ${positionId}`);\n}\n\nexport async function getPositionLiveDetailsFromContract(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint\n): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await context.walletClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: 'quoteClosePosition' as any,\n args: [positionId],\n }) as unknown) as readonly [boolean, bigint, bigint, bigint, boolean];\n\n // The result is a tuple: [success, pnl, funding, netMargin, wasLiquidated]\n const [success, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (!success) {\n throw new Error(`Failed to quote position ${positionId} - position may be invalid or already closed`);\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n fundingPayment: Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(netMargin, 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `getPositionLiveDetailsFromContract for position ${positionId}`);\n}\n"],"mappings":"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","names":["Q96","erc20Abi","publicActions","decodeEventLog","publicActions","formatUnits","publicActions","formatUnits","publicActions","decodeEventLog","formatUnits","decodeEventLog","publicActions","publicActions","decodeEventLog","formatUnits"]}