@strobelabs/perpcity-sdk 0.2.0 → 0.2.1
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.
- package/LICENSE.md +21 -674
- package/dist/index.js +19 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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":["export * from './context';\nexport * from './types';\nexport * from './utils';\nexport * from './abis';\nexport * from './types/entity-data';\nexport * from './functions';","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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MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,Q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","names":["import_viem","import_viem","import_viem","import_viem","import_viem","import_graphql_request","import_graphql","import_viem"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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":["export * from './context';\nexport * from './types';\nexport * from './utils';\nexport * from './abis';\nexport * from './types/entity-data';\nexport * from './functions';","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(snapshot.markPrice),\n }));\n\n const indexTimeSeries: TimeSeries<number>[] = (beaconResponse as any).beaconSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(snapshot.indexPrice),\n }));\n\n const openInterestTimeSeries: TimeSeries<OpenInterest>[] = perpResponse.perpSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: {\n takerLongNotional: Number(snapshot.takerLongNotional),\n takerShortNotional: Number(snapshot.takerShortNotional),\n },\n }));\n\n const fundingRateTimeSeries: TimeSeries<number>[] = perpResponse.perpSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(snapshot.fundingRate),\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(latestBeaconSnapshot.indexPrice),\n beacon: perpResponse.perp.beacon.id as Address,\n lastIndexUpdate: Number(latestBeaconSnapshot.timestamp),\n openInterest: {\n takerLongNotional: Number(latestSnapshot.takerLongNotional),\n takerShortNotional: Number(latestSnapshot.takerShortNotional),\n },\n markTimeSeries,\n indexTimeSeries,\n fundingRate: Number(latestSnapshot.fundingRate),\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(snapshot.markPrice),\n }));\n\n const indexTimeSeries: TimeSeries<number>[] = beaconSnapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(snapshot.indexPrice),\n }));\n\n const openInterestTimeSeries: TimeSeries<OpenInterest>[] = snapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: {\n takerLongNotional: Number(snapshot.takerLongNotional),\n takerShortNotional: Number(snapshot.takerShortNotional),\n },\n }));\n\n const fundingRateTimeSeries: TimeSeries<number>[] = snapshots.map((snapshot: any) => ({\n timestamp: Number(snapshot.timestamp),\n value: Number(snapshot.fundingRate),\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(latestBeaconSnapshot.indexPrice),\n beacon: beaconId,\n lastIndexUpdate: Number(latestBeaconSnapshot.timestamp),\n openInterest: {\n takerLongNotional: Number(latestSnapshot.takerLongNotional),\n takerShortNotional: Number(latestSnapshot.takerShortNotional),\n },\n markTimeSeries,\n indexTimeSeries,\n fundingRate: Number(latestSnapshot.fundingRate),\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(position.pnlAtClose),\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,6BAA8B;AAC9B,IAAAA,eAA2C;AAG3C,qBAAsB;;;ACJf,IAAM,aAAqB;AAC3B,IAAM,aAAqB;AAG3B,IAAM,MAAc;;;ACFpB,SAAS,oBAAoB,OAAuB;AACzD,MAAI,QAAQ,OAAO,kBAAkB;AACnC,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAEA,QAAM,kBAA0B,KAAK,KAAK,KAAK,IAAI;AACnD,SAAO,OAAO,KAAK,MAAM,eAAe,CAAC,IAAI,MAAM,OAAO,UAAU;AACtE;AAEO,SAAS,eAAe,QAAwB;AACrD,MAAI,SAAS,OAAO,mBAAmB,YAAY;AACjD,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,SAAO,OAAO,KAAK,MAAM,SAAS,UAAU,CAAC;AAC/C;AAEO,SAAS,WAAW,QAAwB;AACjD,SAAO,OAAO,eAAe,MAAM,CAAC,IAAI,MAAM,OAAO,UAAU;AACjE;AAEO,SAAS,aAAa,UAA0B;AACrD,QAAM,uBAAuB,WAAW,aAAa;AAErD,MAAI,uBAAuB,OAAO,kBAAkB;AAClD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAEA,SAAO,OAAO,oBAAoB,IAAI;AACxC;AAEO,SAAS,YAAY,OAAe,WAA4B;AACrE,QAAM,WAAW,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM;AAClD,SAAO,YAAY,KAAK,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AAC9D;AAEO,SAAS,oBAAoB,cAA8B;AAChE,QAAM,WAAW,eAAe,eAAe;AAC/C,SAAO,aAAa,QAAQ;AAC9B;AAEO,SAAS,sBAAsB,aAA6B;AACjE,SAAO,aAAa;AACtB;AAEO,SAAS,mBAAmB,OAAuB;AACxD,SAAO,QAAQ;AACjB;;;AChDA,kBAAyB;AAEzB,IAAM,wBAAwB;AAE9B,eAAsB,YAAY,SAA0B,QAAgB,gBAAwB,uBAAuB;AACzH,QAAM,cAAc,QAAQ,YAAY;AAExC,QAAM,EAAE,QAAQ,IAAI,MAAM,QAAQ,aAAa,iBAAiB;AAAA,IAC9D,SAAS,YAAY;AAAA,IACrB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,YAAY,aAAa,MAAM;AAAA,IACtC,SAAS,QAAQ,aAAa;AAAA,EAChC,CAAC;AAED,QAAM,OAAO,MAAM,QAAQ,aAAa,cAAc,OAAO;AAE7D,QAAM,QAAQ,aAAa,0BAA0B;AAAA,IACnD;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACtBO,IAAM,mBAAmB;AAAA,EAC5B;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,aAAa;AAAA,IACb,UAAU;AAAA,MACN;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,aAAa;AAAA,IACb,UAAU;AAAA,MACN;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,aAAa;AAAA,IACb,UAAU;AAAA,MACN;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,aAAa;AAAA,IACb,UAAU;AAAA,MACN;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,cAAc;AAAA,UACV;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,cAAc;AAAA,UACV;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,cAAc;AAAA,UACV;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,cAAc;AAAA,UACV;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,cAAc;AAAA,cACV;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,cACA;AAAA,gBACI,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACZ;AAAA,YACJ;AAAA,YACA,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,cAAc;AAAA,UACV;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,cAAc;AAAA,UACV;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,YACI,gBAAgB;AAAA,YAChB,QAAQ;AAAA,YACR,QAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,QACA,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,IACI,UAAU;AAAA,MACN;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,QACI,gBAAgB;AAAA,QAChB,QAAQ;AAAA,Q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","names":["import_viem","import_viem","import_viem","import_viem","import_viem","import_graphql_request","import_graphql","import_viem"]}
|