@panoptic-eng/sdk 1.0.4 → 1.0.5
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/README.md +75 -20
- package/dist/index.d.ts +1765 -131
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1136 -244
- package/dist/index.js.map +1 -1
- package/dist/panoptic/v2/index.d.ts +9402 -0
- package/dist/panoptic/v2/index.d.ts.map +1 -0
- package/dist/panoptic/v2/index.js +12903 -0
- package/dist/panoptic/v2/index.js.map +1 -0
- package/dist/rates-BQ91Bbn6.d.ts +38 -0
- package/dist/rates-BQ91Bbn6.d.ts.map +1 -0
- package/dist/rates-D-7EWaPS.js +8659 -0
- package/dist/rates-D-7EWaPS.js.map +1 -0
- package/package.json +10 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rates-D-7EWaPS.js","names":["panopticQueryAbi","params: GetBlockMetaParams","balanceData: bigint","value: bigint","logs: Log[]","events: PanopticEvent[]","client: PublicClient","hash: Hash","confirmations?: bigint","params: SubmitWriteParams","hash","gasOverrides: Record<string, unknown>","params: IsLiquidatableParams","effectiveTick: bigint","Q192","exponent: bigint","value: bigint","value: string","numerator: bigint","denominator: bigint","precision: bigint","leftNumerator: bigint","leftDenominator: bigint","rightNumerator: bigint","rightDenominator: bigint","tick: bigint","sqrtPriceX96: bigint","decimals0: bigint","decimals1: bigint","price: string","tickLower: bigint","tickUpper: bigint","feeBps: bigint","tickSpacing: bigint","currentTick: bigint","toleranceBps: bigint","erc20Abi","params: GetPoolMetadataParams","params: GetPoolParams","SECONDS_PER_YEAR","collateralTracker0: CollateralTracker","collateralTracker1: CollateralTracker","riskEngine: RiskEngine","params: GetUtilizationParams","collateralToken0: Address","collateralToken1: Address","params: GetOracleStateParams","params: GetRiskParametersParams","poolKeyBytes: `0x${string}`","params: FetchPoolIdParams","tick: bigint","isAssetToken0: boolean","numerator: bigint","denominator: bigint","leg: Pick<TokenIdLeg, 'asset'>","assetIndex?: bigint","leg: TokenIdLeg","m: bigint","qCurrentTick: bigint","qStrikeTick: bigint","qMintTick: bigint","definedRisk: boolean","v: bigint","itm: bigint","tokenType: bigint","legs: Pick<TokenIdLeg, 'tokenType' | 'isLong'>[]","currentTick: bigint","mintTick: bigint","positionSize: bigint","poolTickSpacing: bigint","mintTick: bigint | undefined","vDelta","isPut","debtDelta","itmDelta","vDelta: bigint","input: PositionGreeksInput","swapAtMint: boolean","input: PositionGreeksInput & { swapAtMint: boolean }","encodedStrike: bigint","index: bigint","leg: bigint","tokenId: bigint","encodedPosition: bigint","legs: LegParams[]","hex: string","length: number","params: GetPositionParams","legs: TokenIdLeg[]","params: GetPositionsParams","_meta","positions: Position[]","params: GetPositionGreeksParams","pool: {\n collateralTracker0: { address: Address }\n collateralTracker1: { address: Address }\n}","params: GetAccountCollateralParams","collateralToken0: Address","collateralToken1: Address","token0: TokenCollateral","token1: TokenCollateral","params: GetAccountSummaryBasicParams","params: GetAccountSummaryRiskParams","params: GetNetLiquidationValueParams","params: GetLiquidationPricesParams","MIN_TICK","MAX_TICK","SECONDS_PER_YEAR","erc20Abi","params: GetCollateralDataParams","_meta","poolData","totalShares","interestRate","depositedAssets","insideAMM","creditedShares","utilization","borrowRate","supplyRate","params: GetCurrentRatesParams","collateralToken0: Address","collateralToken1: Address","amount: bigint","decimals: bigint","precision: bigint","amount: string","flow: TokenFlow","decimals0: bigint","decimals1: bigint","precision0: bigint","precision1: bigint","wad: bigint","precision: bigint","rateWad: bigint","value: string","ratePerSecondWad: bigint","precision: bigint"],"sources":["../src/generated.ts","../src/panoptic/v2/abis/panopticQuery.ts","../src/panoptic/v2/clients/blockMeta.ts","../src/panoptic/v2/writes/utils.ts","../src/panoptic/v2/reads/checks.ts","../src/panoptic/v2/utils/constants.ts","../src/panoptic/v2/formatters/tick.ts","../src/panoptic/v2/reads/pool.ts","../src/panoptic/v2/greeks/index.ts","../src/panoptic/v2/utils/option-encoding-v2.ts","../src/panoptic/v2/reads/position.ts","../src/panoptic/v2/reads/account.ts","../src/panoptic/v2/reads/collateral.ts","../src/panoptic/v2/formatters/amount.ts","../src/panoptic/v2/formatters/wad.ts","../src/panoptic/v2/formatters/rates.ts"],"sourcesContent":["//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// CollateralTracker\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const collateralTrackerAbi = [\n { type: 'constructor', inputs: [], stateMutability: 'nonpayable' },\n {\n type: 'function',\n inputs: [],\n name: 'accrueInterest',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'owner', internalType: 'address', type: 'address' },\n { name: 'spender', internalType: 'address', type: 'address' },\n ],\n name: 'allowance',\n outputs: [{ name: 'allowance', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'spender', internalType: 'address', type: 'address' },\n { name: 'amount', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'asset',\n outputs: [{ name: 'assetTokenAddress', internalType: 'address', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'assetsAndInterest',\n outputs: [\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'assetsOf',\n outputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'account', internalType: 'address', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: 'balance', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'borrowIndex',\n outputs: [{ name: '', internalType: 'uint80', type: 'uint80' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n name: 'convertToShares',\n outputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'delegatee', internalType: 'address', type: 'address' }],\n name: 'delegate',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'assets', internalType: 'uint256', type: 'uint256' },\n { name: 'receiver', internalType: 'address', type: 'address' },\n ],\n name: 'deposit',\n outputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'getPoolData',\n outputs: [\n { name: 'depositedAssets', internalType: 'uint256', type: 'uint256' },\n { name: 'insideAMM', internalType: 'uint256', type: 'uint256' },\n { name: 'creditedShares', internalType: 'uint256', type: 'uint256' },\n {\n name: 'currentPoolUtilization',\n internalType: 'uint256',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'interestRate',\n outputs: [{ name: '', internalType: 'uint128', type: 'uint128' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'user', internalType: 'address', type: 'address' }],\n name: 'interestState',\n outputs: [\n { name: 'userBorrowIndex', internalType: 'int128', type: 'int128' },\n { name: 'netBorrows', internalType: 'int128', type: 'int128' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'lastInteractionTimestamp',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: '', internalType: 'address', type: 'address' }],\n name: 'maxDeposit',\n outputs: [{ name: 'maxAssets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [{ name: '', internalType: 'address', type: 'address' }],\n name: 'maxMint',\n outputs: [{ name: 'maxShares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'maxRedeem',\n outputs: [{ name: 'maxShares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'maxWithdraw',\n outputs: [{ name: 'maxAssets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'shares', internalType: 'uint256', type: 'uint256' },\n { name: 'receiver', internalType: 'address', type: 'address' },\n ],\n name: 'mint',\n outputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [{ name: 'data', internalType: 'bytes[]', type: 'bytes[]' }],\n name: 'multicall',\n outputs: [{ name: 'results', internalType: 'bytes[]', type: 'bytes[]' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'name',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'owedInterest',\n outputs: [{ name: '', internalType: 'uint128', type: 'uint128' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'panopticPool',\n outputs: [{ name: '', internalType: 'contract PanopticPool', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'poolFee',\n outputs: [{ name: '_poolFee', internalType: 'uint24', type: 'uint24' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'poolManager',\n outputs: [{ name: '', internalType: 'contract IPoolManager', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n name: 'previewDeposit',\n outputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n name: 'previewMint',\n outputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'previewOwedInterest',\n outputs: [{ name: '', internalType: 'uint128', type: 'uint128' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n name: 'previewRedeem',\n outputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n name: 'previewWithdraw',\n outputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'rateAtTarget',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'shares', internalType: 'uint256', type: 'uint256' },\n { name: 'receiver', internalType: 'address', type: 'address' },\n { name: 'owner', internalType: 'address', type: 'address' },\n ],\n name: 'redeem',\n outputs: [{ name: 'assets', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'reentrancyGuardEntered',\n outputs: [{ name: 'entered', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'refunder', internalType: 'address', type: 'address' },\n { name: 'refundee', internalType: 'address', type: 'address' },\n { name: 'assets', internalType: 'int256', type: 'int256' },\n ],\n name: 'refund',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'delegatee', internalType: 'address', type: 'address' }],\n name: 'revoke',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'riskEngine',\n outputs: [{ name: '', internalType: 'contract IRiskEngine', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: 'optionOwner', internalType: 'address', type: 'address' },\n { name: 'longAmount', internalType: 'int128', type: 'int128' },\n { name: 'shortAmount', internalType: 'int128', type: 'int128' },\n { name: 'ammDeltaAmount', internalType: 'int128', type: 'int128' },\n { name: 'realizedPremium', internalType: 'int128', type: 'int128' },\n {\n name: 'riskParameters',\n internalType: 'RiskParameters',\n type: 'uint256',\n },\n ],\n name: 'settleBurn',\n outputs: [{ name: '', internalType: 'int128', type: 'int128' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'liquidator', internalType: 'address', type: 'address' },\n { name: 'liquidatee', internalType: 'address', type: 'address' },\n { name: 'bonus', internalType: 'int256', type: 'int256' },\n ],\n name: 'settleLiquidation',\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'optionOwner', internalType: 'address', type: 'address' },\n { name: 'longAmount', internalType: 'int128', type: 'int128' },\n { name: 'shortAmount', internalType: 'int128', type: 'int128' },\n { name: 'ammDeltaAmount', internalType: 'int128', type: 'int128' },\n {\n name: 'riskParameters',\n internalType: 'RiskParameters',\n type: 'uint256',\n },\n ],\n name: 'settleMint',\n outputs: [\n { name: '', internalType: 'uint32', type: 'uint32' },\n { name: '', internalType: 'int128', type: 'int128' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'token0',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'token1',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'totalAssets',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'totalSupply',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'recipient', internalType: 'address', type: 'address' },\n { name: 'amount', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'transfer',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'from', internalType: 'address', type: 'address' },\n { name: 'to', internalType: 'address', type: 'address' },\n { name: 'amount', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'transferFrom',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'underlyingIsToken0',\n outputs: [{ name: '_underlyingIsToken0', internalType: 'bool', type: 'bool' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'underlyingToken',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [{ name: 'data', internalType: 'bytes', type: 'bytes' }],\n name: 'unlockCallback',\n outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'unrealizedGlobalInterest',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'assets', internalType: 'uint256', type: 'uint256' },\n { name: 'receiver', internalType: 'address', type: 'address' },\n { name: 'owner', internalType: 'address', type: 'address' },\n ],\n name: 'withdraw',\n outputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'assets', internalType: 'uint256', type: 'uint256' },\n { name: 'receiver', internalType: 'address', type: 'address' },\n { name: 'owner', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n { name: 'usePremiaAsCollateral', internalType: 'bool', type: 'bool' },\n ],\n name: 'withdraw',\n outputs: [{ name: 'shares', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'spender',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'amount',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'Approval',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'builder',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'commissionPaidProtocol',\n internalType: 'uint128',\n type: 'uint128',\n indexed: false,\n },\n {\n name: 'commissionPaidBuilder',\n internalType: 'uint128',\n type: 'uint128',\n indexed: false,\n },\n ],\n name: 'CommissionPaid',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'sender',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'assets',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'shares',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'Deposit',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'interestOwed',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'interestPaid',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'sharesBurned',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'InsolvencyPenaltyApplied',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'liquidatee',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'liquidator',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'protocolLossAssets',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'protocolLossShares',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'ProtocolLossRealized',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n { name: 'from', internalType: 'address', type: 'address', indexed: true },\n { name: 'to', internalType: 'address', type: 'address', indexed: true },\n {\n name: 'amount',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'Transfer',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'sender',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'receiver',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'assets',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'shares',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'Withdraw',\n },\n { type: 'error', inputs: [], name: 'AlreadyInitialized' },\n { type: 'error', inputs: [], name: 'BelowMinimumRedemption' },\n { type: 'error', inputs: [], name: 'CastingError' },\n { type: 'error', inputs: [], name: 'DepositTooLarge' },\n { type: 'error', inputs: [], name: 'ExceedsMaximumRedemption' },\n {\n type: 'error',\n inputs: [\n { name: 'tokenAddress', internalType: 'address', type: 'address' },\n { name: 'assetsRequested', internalType: 'uint256', type: 'uint256' },\n { name: 'assetBalance', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'NotEnoughTokens',\n },\n { type: 'error', inputs: [], name: 'NotPanopticPool' },\n { type: 'error', inputs: [], name: 'PositionCountNotZero' },\n { type: 'error', inputs: [], name: 'Reentrancy' },\n {\n type: 'error',\n inputs: [\n { name: 'token', internalType: 'address', type: 'address' },\n { name: 'from', internalType: 'address', type: 'address' },\n { name: 'amount', internalType: 'uint256', type: 'uint256' },\n { name: 'balance', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'TransferFailed',\n },\n { type: 'error', inputs: [], name: 'UnauthorizedUniswapCallback' },\n] as const\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// PanopticFactory\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const panopticFactoryAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: '_SFPM',\n internalType: 'contract SemiFungiblePositionManager',\n type: 'address',\n },\n {\n name: '_manager',\n internalType: 'contract IPoolManager',\n type: 'address',\n },\n { name: '_poolReference', internalType: 'address', type: 'address' },\n {\n name: '_collateralReference',\n internalType: 'address',\n type: 'address',\n },\n { name: 'properties', internalType: 'bytes32[]', type: 'bytes32[]' },\n { name: 'indices', internalType: 'uint256[][]', type: 'uint256[][]' },\n { name: 'pointers', internalType: 'Pointer[][]', type: 'uint256[][]' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'spender', internalType: 'address', type: 'address' },\n { name: 'id', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'panopticPool', internalType: 'address', type: 'address' },\n { name: 'symbol0', internalType: 'string', type: 'string' },\n { name: 'symbol1', internalType: 'string', type: 'string' },\n { name: 'fee', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'constructMetadata',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'key',\n internalType: 'struct PoolKey',\n type: 'tuple',\n components: [\n { name: 'currency0', internalType: 'Currency', type: 'address' },\n { name: 'currency1', internalType: 'Currency', type: 'address' },\n { name: 'fee', internalType: 'uint24', type: 'uint24' },\n { name: 'tickSpacing', internalType: 'int24', type: 'int24' },\n { name: 'hooks', internalType: 'contract IHooks', type: 'address' },\n ],\n },\n {\n name: 'riskEngine',\n internalType: 'contract IRiskEngine',\n type: 'address',\n },\n { name: 'salt', internalType: 'uint96', type: 'uint96' },\n ],\n name: 'deployNewPool',\n outputs: [\n {\n name: 'newPoolContract',\n internalType: 'contract PanopticPool',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n name: 'getApproved',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'keyV4',\n internalType: 'struct PoolKey',\n type: 'tuple',\n components: [\n { name: 'currency0', internalType: 'Currency', type: 'address' },\n { name: 'currency1', internalType: 'Currency', type: 'address' },\n { name: 'fee', internalType: 'uint24', type: 'uint24' },\n { name: 'tickSpacing', internalType: 'int24', type: 'int24' },\n { name: 'hooks', internalType: 'contract IHooks', type: 'address' },\n ],\n },\n {\n name: 'riskEngine',\n internalType: 'contract IRiskEngine',\n type: 'address',\n },\n ],\n name: 'getPanopticPool',\n outputs: [{ name: '', internalType: 'contract PanopticPool', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'address', type: 'address' },\n ],\n name: 'isApprovedForAll',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'deployerAddress', internalType: 'address', type: 'address' },\n {\n name: 'key',\n internalType: 'struct PoolKey',\n type: 'tuple',\n components: [\n { name: 'currency0', internalType: 'Currency', type: 'address' },\n { name: 'currency1', internalType: 'Currency', type: 'address' },\n { name: 'fee', internalType: 'uint24', type: 'uint24' },\n { name: 'tickSpacing', internalType: 'int24', type: 'int24' },\n { name: 'hooks', internalType: 'contract IHooks', type: 'address' },\n ],\n },\n { name: 'riskEngine', internalType: 'address', type: 'address' },\n { name: 'salt', internalType: 'uint96', type: 'uint96' },\n { name: 'loops', internalType: 'uint256', type: 'uint256' },\n { name: 'minTargetRarity', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'minePoolAddress',\n outputs: [\n { name: 'bestSalt', internalType: 'uint96', type: 'uint96' },\n { name: 'highestRarity', internalType: 'uint256', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'data', internalType: 'bytes[]', type: 'bytes[]' }],\n name: 'multicall',\n outputs: [{ name: 'results', internalType: 'bytes[]', type: 'bytes[]' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'name',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'id', internalType: 'uint256', type: 'uint256' }],\n name: 'ownerOf',\n outputs: [{ name: 'owner', internalType: 'address', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'from', internalType: 'address', type: 'address' },\n { name: 'to', internalType: 'address', type: 'address' },\n { name: 'id', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'safeTransferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'from', internalType: 'address', type: 'address' },\n { name: 'to', internalType: 'address', type: 'address' },\n { name: 'id', internalType: 'uint256', type: 'uint256' },\n { name: 'data', internalType: 'bytes', type: 'bytes' },\n ],\n name: 'safeTransferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'operator', internalType: 'address', type: 'address' },\n { name: 'approved', internalType: 'bool', type: 'bool' },\n ],\n name: 'setApprovalForAll',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'tokenId', internalType: 'uint256', type: 'uint256' }],\n name: 'tokenURI',\n outputs: [{ name: '', internalType: 'string', type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'from', internalType: 'address', type: 'address' },\n { name: 'to', internalType: 'address', type: 'address' },\n { name: 'id', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'transferFrom',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'spender',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n { name: 'id', internalType: 'uint256', type: 'uint256', indexed: true },\n ],\n name: 'Approval',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'operator',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n { name: 'approved', internalType: 'bool', type: 'bool', indexed: false },\n ],\n name: 'ApprovalForAll',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'poolAddress',\n internalType: 'contract PanopticPool',\n type: 'address',\n indexed: true,\n },\n { name: 'idV4', internalType: 'PoolId', type: 'bytes32', indexed: true },\n {\n name: 'collateralTracker0',\n internalType: 'contract CollateralTracker',\n type: 'address',\n indexed: false,\n },\n {\n name: 'collateralTracker1',\n internalType: 'contract CollateralTracker',\n type: 'address',\n indexed: false,\n },\n {\n name: 'riskEngine',\n internalType: 'contract IRiskEngine',\n type: 'address',\n indexed: false,\n },\n ],\n name: 'PoolDeployed',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n { name: 'from', internalType: 'address', type: 'address', indexed: true },\n { name: 'to', internalType: 'address', type: 'address', indexed: true },\n { name: 'id', internalType: 'uint256', type: 'uint256', indexed: true },\n ],\n name: 'Transfer',\n },\n { type: 'error', inputs: [], name: 'AlreadyInitialized' },\n { type: 'error', inputs: [], name: 'CreateFail' },\n { type: 'error', inputs: [], name: 'PoolNotInitialized' },\n { type: 'error', inputs: [], name: 'ZeroAddress' },\n] as const\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// PanopticPool\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const panopticPoolAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: '_sfpm',\n internalType: 'contract ISemiFungiblePositionManager',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'SFPM',\n outputs: [\n {\n name: '',\n internalType: 'contract ISemiFungiblePositionManager',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'minValue0', internalType: 'uint256', type: 'uint256' },\n { name: 'minValue1', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'assertMinCollateralValues',\n outputs: [],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'collateralToken0',\n outputs: [{ name: '', internalType: 'contract CollateralTracker', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'collateralToken1',\n outputs: [{ name: '', internalType: 'contract CollateralTracker', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n {\n name: 'finalPositionIdList',\n internalType: 'TokenId[]',\n type: 'uint256[]',\n },\n { name: 'positionSizes', internalType: 'uint128[]', type: 'uint128[]' },\n {\n name: 'tickAndSpreadLimits',\n internalType: 'int24[3][]',\n type: 'int24[3][]',\n },\n { name: 'usePremiaAsCollateral', internalType: 'bool', type: 'bool' },\n { name: 'builderCode', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'dispatch',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'positionIdListFrom',\n internalType: 'TokenId[]',\n type: 'uint256[]',\n },\n { name: 'account', internalType: 'address', type: 'address' },\n {\n name: 'positionIdListTo',\n internalType: 'TokenId[]',\n type: 'uint256[]',\n },\n {\n name: 'positionIdListToFinal',\n internalType: 'TokenId[]',\n type: 'uint256[]',\n },\n {\n name: 'usePremiaAsCollateral',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n ],\n name: 'dispatchFrom',\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'user', internalType: 'address', type: 'address' },\n { name: 'includePendingPremium', internalType: 'bool', type: 'bool' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'getAccumulatedFeesAndPositionsData',\n outputs: [\n { name: '', internalType: 'LeftRightUnsigned', type: 'uint256' },\n { name: '', internalType: 'LeftRightUnsigned', type: 'uint256' },\n { name: '', internalType: 'PositionBalance[]', type: 'uint256[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'account', internalType: 'address', type: 'address' }],\n name: 'getAssetsOf',\n outputs: [\n { name: 'assets0', internalType: 'uint256', type: 'uint256' },\n { name: 'assets1', internalType: 'uint256', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'tickLower', internalType: 'int24', type: 'int24' },\n { name: 'tickUpper', internalType: 'int24', type: 'int24' },\n ],\n name: 'getChunkData',\n outputs: [\n {\n name: 'liquidities0',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'liquidities1',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n { name: 'settled0', internalType: 'LeftRightUnsigned', type: 'uint256' },\n { name: 'settled1', internalType: 'LeftRightUnsigned', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'getCurrentTick',\n outputs: [{ name: 'currentTick', internalType: 'int24', type: 'int24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'getOracleTicks',\n outputs: [\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n { name: 'spotTick', internalType: 'int24', type: 'int24' },\n { name: 'medianTick', internalType: 'int24', type: 'int24' },\n { name: 'latestTick', internalType: 'int24', type: 'int24' },\n { name: 'oraclePack', internalType: 'OraclePack', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'builderCode', internalType: 'uint256', type: 'uint256' }],\n name: 'getRiskParameters',\n outputs: [\n {\n name: 'riskParameters',\n internalType: 'RiskParameters',\n type: 'uint256',\n },\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'getTWAP',\n outputs: [{ name: 'twapTick', internalType: 'int24', type: 'int24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'isSafeMode',\n outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'lockSafeMode',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'data', internalType: 'bytes[]', type: 'bytes[]' }],\n name: 'multicall',\n outputs: [{ name: 'results', internalType: 'bytes[]', type: 'bytes[]' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [{ name: 'user', internalType: 'address', type: 'address' }],\n name: 'numberOfLegs',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'bytes', type: 'bytes' },\n ],\n name: 'onERC1155Received',\n outputs: [{ name: '', internalType: 'bytes4', type: 'bytes4' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'pokeOracle',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'poolId',\n outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'poolKey',\n outputs: [{ name: 'key', internalType: 'bytes', type: 'bytes' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'poolManager',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: 'user', internalType: 'address', type: 'address' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n ],\n name: 'positionData',\n outputs: [\n { name: '', internalType: 'bool', type: 'bool' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'int24', type: 'int24' },\n { name: '', internalType: 'int256', type: 'int256' },\n { name: '', internalType: 'int256', type: 'int256' },\n { name: '', internalType: 'uint128', type: 'uint128' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'reentrancyGuardEntered',\n outputs: [{ name: 'entered', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'riskEngine',\n outputs: [{ name: '', internalType: 'contract IRiskEngine', type: 'address' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'tickSpacing',\n outputs: [{ name: '', internalType: 'int24', type: 'int24' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [],\n name: 'unlockSafeMode',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'user', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n { name: 'usePremiaAsCollateral', internalType: 'bool', type: 'bool' },\n ],\n name: 'validateCollateralWithdrawable',\n outputs: [],\n stateMutability: 'view',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'liquidator',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'liquidatee',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'bonusAmounts',\n internalType: 'LeftRightSigned',\n type: 'int256',\n indexed: false,\n },\n ],\n name: 'AccountLiquidated',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'exercisor',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n { name: 'user', internalType: 'address', type: 'address', indexed: true },\n {\n name: 'tokenId',\n internalType: 'TokenId',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'exerciseFee',\n internalType: 'LeftRightSigned',\n type: 'int256',\n indexed: false,\n },\n ],\n name: 'ForcedExercised',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'recipient',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'positionSize',\n internalType: 'uint128',\n type: 'uint128',\n indexed: false,\n },\n {\n name: 'tokenId',\n internalType: 'TokenId',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'premiaByLeg',\n internalType: 'LeftRightSigned[4]',\n type: 'int256[4]',\n indexed: false,\n },\n ],\n name: 'OptionBurnt',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'recipient',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'tokenId',\n internalType: 'TokenId',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'balanceData',\n internalType: 'PositionBalance',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'OptionMinted',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n { name: 'user', internalType: 'address', type: 'address', indexed: true },\n {\n name: 'tokenId',\n internalType: 'TokenId',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'legIndex',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'settledAmounts',\n internalType: 'LeftRightSigned',\n type: 'int256',\n indexed: false,\n },\n ],\n name: 'PremiumSettled',\n },\n {\n type: 'error',\n inputs: [\n { name: 'solvent', internalType: 'uint256', type: 'uint256' },\n { name: 'numberOfTicks', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'AccountInsolvent',\n },\n { type: 'error', inputs: [], name: 'AlreadyInitialized' },\n { type: 'error', inputs: [], name: 'CastingError' },\n { type: 'error', inputs: [], name: 'DuplicateTokenId' },\n { type: 'error', inputs: [], name: 'EffectiveLiquidityAboveThreshold' },\n { type: 'error', inputs: [], name: 'InputListFail' },\n { type: 'error', inputs: [], name: 'InvalidTick' },\n { type: 'error', inputs: [], name: 'InvalidTickBound' },\n { type: 'error', inputs: [], name: 'LiquidityTooHigh' },\n { type: 'error', inputs: [], name: 'NetLiquidityZero' },\n { type: 'error', inputs: [], name: 'NoLegsExercisable' },\n { type: 'error', inputs: [], name: 'NotGuardian' },\n { type: 'error', inputs: [], name: 'NotMarginCalled' },\n { type: 'error', inputs: [], name: 'PositionNotOwned' },\n { type: 'error', inputs: [], name: 'PriceImpactTooLarge' },\n { type: 'error', inputs: [], name: 'Reentrancy' },\n { type: 'error', inputs: [], name: 'StaleOracle' },\n { type: 'error', inputs: [], name: 'TokenIdHasZeroLegs' },\n { type: 'error', inputs: [], name: 'TooManyLegsOpen' },\n { type: 'error', inputs: [], name: 'UnderOverFlow' },\n { type: 'error', inputs: [], name: 'WrongPoolId' },\n] as const\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// PanopticQuery\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const panopticQueryAbi = [\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'checkCollateral',\n outputs: [\n {\n name: 'collateralBalances0',\n internalType: 'uint256[4]',\n type: 'uint256[4]',\n },\n {\n name: 'requiredCollaterals0',\n internalType: 'uint256[4]',\n type: 'uint256[4]',\n },\n {\n name: 'collateralBalances1',\n internalType: 'uint256[4]',\n type: 'uint256[4]',\n },\n {\n name: 'requiredCollaterals1',\n internalType: 'uint256[4]',\n type: 'uint256[4]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n ],\n name: 'checkCollateral',\n outputs: [\n {\n name: 'balancesAndRequired',\n internalType: 'uint256[4]',\n type: 'uint256[4]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'checkCollateralListOutput',\n outputs: [\n { name: '', internalType: 'uint256[4][]', type: 'uint256[4][]' },\n { name: '', internalType: 'int256[]', type: 'int256[]' },\n { name: '', internalType: 'int24[]', type: 'int24[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'getChunkData',\n outputs: [{ name: '', internalType: 'uint256[2][4][]', type: 'uint256[2][4][]' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'getLiquidationPrices',\n outputs: [\n { name: 'liquidationPriceDown', internalType: 'int24', type: 'int24' },\n { name: 'liquidationPriceUp', internalType: 'int24', type: 'int24' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n {\n name: 'existingPositionIds',\n internalType: 'TokenId[]',\n type: 'uint256[]',\n },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n ],\n name: 'getMaxPositionSizeBounds',\n outputs: [\n { name: 'maxSizeAtMinUtil', internalType: 'uint128', type: 'uint128' },\n { name: 'maxSizeAtMaxUtil', internalType: 'uint128', type: 'uint128' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'includePendingPremium', internalType: 'bool', type: 'bool' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n ],\n name: 'getNetLiquidationValue',\n outputs: [\n { name: 'value0', internalType: 'int256', type: 'int256' },\n { name: 'value1', internalType: 'int256', type: 'int256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'getPortfolioValue',\n outputs: [\n { name: 'value0', internalType: 'int256', type: 'int256' },\n { name: 'value1', internalType: 'int256', type: 'int256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'atTicks', internalType: 'int24[]', type: 'int24[]' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n ],\n name: 'getPortfolioValueAtTicks',\n outputs: [\n { name: 'value0', internalType: 'int256[]', type: 'int256[]' },\n { name: 'value1', internalType: 'int256[]', type: 'int256[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n ],\n name: 'getRequiredBase',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'startTick', internalType: 'int24', type: 'int24' },\n { name: 'nTicks', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'getTickNets',\n outputs: [\n { name: 'tickData', internalType: 'int256[]', type: 'int256[]' },\n { name: 'liquidityNets', internalType: 'int256[]', type: 'int256[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'univ3pool',\n internalType: 'contract IUniswapV3Pool',\n type: 'address',\n },\n { name: 'startTick', internalType: 'int24', type: 'int24' },\n { name: 'nTicks', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'getTickNetsFromUniswapV3',\n outputs: [\n { name: 'tickData', internalType: 'int256[]', type: 'int256[]' },\n { name: 'liquidityNets', internalType: 'int256[]', type: 'int256[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'manager',\n internalType: 'contract IPoolManager',\n type: 'address',\n },\n { name: 'poolId', internalType: 'PoolId', type: 'bytes32' },\n { name: 'tickSpacing', internalType: 'int24', type: 'int24' },\n { name: 'startTick', internalType: 'int24', type: 'int24' },\n { name: 'nTicks', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'getTickNetsFromUniswapV4PoolId',\n outputs: [\n { name: 'tickData', internalType: 'int256[]', type: 'int256[]' },\n { name: 'liquidityNets', internalType: 'int256[]', type: 'int256[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n ],\n name: 'isAccountSolvent',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n ],\n name: 'optimizeRiskPartners',\n outputs: [{ name: '', internalType: 'TokenId', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'pool', internalType: 'contract PanopticPool', type: 'address' },\n { name: 'tickLower', internalType: 'int24', type: 'int24' },\n { name: 'tickUpper', internalType: 'int24', type: 'int24' },\n { name: 'width', internalType: 'int24', type: 'int24' },\n ],\n name: 'scanChunks',\n outputs: [\n { name: '', internalType: 'int24[]', type: 'int24[]' },\n { name: '', internalType: 'uint128[2][]', type: 'uint128[2][]' },\n { name: '', internalType: 'uint128[2][]', type: 'uint128[2][]' },\n {\n name: '',\n internalType: 'LeftRightUnsigned[2][]',\n type: 'uint256[2][]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'self', internalType: 'TokenId', type: 'uint256' }],\n name: 'validateTokenId',\n outputs: [],\n stateMutability: 'pure',\n },\n { type: 'error', inputs: [], name: 'CastingError' },\n { type: 'error', inputs: [], name: 'InvalidTick' },\n {\n type: 'error',\n inputs: [{ name: 'parameterType', internalType: 'uint256', type: 'uint256' }],\n name: 'InvalidTokenIdParameter',\n },\n { type: 'error', inputs: [], name: 'LiquidityTooHigh' },\n { type: 'error', inputs: [], name: 'UnderOverFlow' },\n] as const\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// RiskEngine\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const riskEngineAbi = [\n {\n type: 'constructor',\n inputs: [\n { name: '_crossBuffer0', internalType: 'uint256', type: 'uint256' },\n { name: '_crossBuffer1', internalType: 'uint256', type: 'uint256' },\n { name: '_guardian', internalType: 'address', type: 'address' },\n { name: '_builderFactory', internalType: 'address', type: 'address' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'ADJUSTMENT_SPEED',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'BP_DECREASE_BUFFER',\n outputs: [{ name: '', internalType: 'uint32', type: 'uint32' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'BUILDER_SPLIT',\n outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'BUYER_COLLATERAL_RATIO',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'CROSS_BUFFER_0',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'CROSS_BUFFER_1',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'CURVE_STEEPNESS',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'DECIMALS',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'EMA_PERIODS',\n outputs: [{ name: '', internalType: 'uint96', type: 'uint96' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'FORCE_EXERCISE_COST',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'GUARDIAN',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'INITIAL_RATE_AT_TARGET',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'IRM_MAX_ELAPSED_TIME',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAINT_MARGIN_RATE',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAX_CLAMP_DELTA',\n outputs: [{ name: '', internalType: 'int24', type: 'int24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAX_OPEN_LEGS',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAX_RATE_AT_TARGET',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAX_SPREAD',\n outputs: [{ name: '', internalType: 'uint24', type: 'uint24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAX_TICKS_DELTA',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MAX_TWAP_DELTA_DISPATCH',\n outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'MIN_RATE_AT_TARGET',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'NOTIONAL_FEE',\n outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'PREMIUM_FEE',\n outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'PROTOCOL_SPLIT',\n outputs: [{ name: '', internalType: 'uint16', type: 'uint16' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'SATURATED_POOL_UTIL',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'SELLER_COLLATERAL_RATIO',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'TARGET_POOL_UTIL',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'TARGET_UTILIZATION',\n outputs: [{ name: '', internalType: 'int256', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'VEGOID',\n outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'token', internalType: 'address', type: 'address' },\n { name: 'recipient', internalType: 'address', type: 'address' },\n ],\n name: 'collect',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'token', internalType: 'address', type: 'address' },\n { name: 'recipient', internalType: 'address', type: 'address' },\n { name: 'amount', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'collect',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'oraclePack', internalType: 'OraclePack', type: 'uint256' },\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n ],\n name: 'computeInternalMedian',\n outputs: [\n { name: 'medianTick', internalType: 'int24', type: 'int24' },\n {\n name: 'updatedOraclePack',\n internalType: 'OraclePack',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'utilization', internalType: 'int256', type: 'int256' },\n { name: 'crossBuffer', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'crossBufferRatio',\n outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n { name: 'oracleTick', internalType: 'int24', type: 'int24' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n {\n name: 'positionBalance',\n internalType: 'PositionBalance',\n type: 'uint256',\n },\n ],\n name: 'exerciseCost',\n outputs: [{ name: 'exerciseFees', internalType: 'LeftRightSigned', type: 'int256' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [{ name: 'builderCode', internalType: 'uint256', type: 'uint256' }],\n name: 'getFeeRecipient',\n outputs: [{ name: 'feeRecipient', internalType: 'address', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'tokenData0',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'tokenData1',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n { name: 'atSqrtPriceX96', internalType: 'uint160', type: 'uint160' },\n { name: 'netPaid', internalType: 'LeftRightSigned', type: 'int256' },\n {\n name: 'shortPremium',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n ],\n name: 'getLiquidationBonus',\n outputs: [\n { name: '', internalType: 'LeftRightSigned', type: 'int256' },\n { name: '', internalType: 'LeftRightSigned', type: 'int256' },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'positionBalanceArray',\n internalType: 'PositionBalance[]',\n type: 'uint256[]',\n },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n { name: 'user', internalType: 'address', type: 'address' },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n {\n name: 'shortPremia',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'longPremia',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'ct0',\n internalType: 'contract CollateralTrackerV2',\n type: 'address',\n },\n {\n name: 'ct1',\n internalType: 'contract CollateralTrackerV2',\n type: 'address',\n },\n ],\n name: 'getMargin',\n outputs: [\n {\n name: 'tokenData0',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'tokenData1',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'globalUtilizations',\n internalType: 'PositionBalance',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n { name: '_oraclePack', internalType: 'OraclePack', type: 'uint256' },\n ],\n name: 'getOracleTicks',\n outputs: [\n { name: 'spotTick', internalType: 'int24', type: 'int24' },\n { name: 'medianTick', internalType: 'int24', type: 'int24' },\n { name: 'latestTick', internalType: 'int24', type: 'int24' },\n { name: 'oraclePack', internalType: 'OraclePack', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'payor', internalType: 'address', type: 'address' },\n { name: 'fees', internalType: 'LeftRightSigned', type: 'int256' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n {\n name: 'ct0',\n internalType: 'contract CollateralTrackerV2',\n type: 'address',\n },\n {\n name: 'ct1',\n internalType: 'contract CollateralTrackerV2',\n type: 'address',\n },\n ],\n name: 'getRefundAmounts',\n outputs: [{ name: '', internalType: 'LeftRightSigned', type: 'int256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n { name: 'oraclePack', internalType: 'OraclePack', type: 'uint256' },\n { name: 'builderCode', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'getRiskParameters',\n outputs: [{ name: '', internalType: 'RiskParameters', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n { name: '_oraclePack', internalType: 'OraclePack', type: 'uint256' },\n { name: 'safeMode', internalType: 'uint8', type: 'uint8' },\n ],\n name: 'getSolvencyTicks',\n outputs: [\n { name: '', internalType: 'int24[]', type: 'int24[]' },\n { name: '', internalType: 'OraclePack', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'guardian',\n outputs: [{ name: '', internalType: 'address', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n {\n name: 'premiasByLeg',\n internalType: 'LeftRightSigned[4][]',\n type: 'int256[4][]',\n },\n {\n name: 'collateralRemaining',\n internalType: 'LeftRightSigned',\n type: 'int256',\n },\n { name: 'atSqrtPriceX96', internalType: 'uint160', type: 'uint160' },\n ],\n name: 'haircutPremia',\n outputs: [\n { name: 'bonusDeltas', internalType: 'LeftRightSigned', type: 'int256' },\n {\n name: 'haircutTotal',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'haircutPerLeg',\n internalType: 'LeftRightSigned[4][]',\n type: 'int256[4][]',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: 'utilization', internalType: 'uint256', type: 'uint256' },\n {\n name: 'interestRateAccumulator',\n internalType: 'MarketState',\n type: 'uint256',\n },\n ],\n name: 'interestRate',\n outputs: [{ name: '', internalType: 'uint128', type: 'uint128' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'positionBalanceArray',\n internalType: 'PositionBalance[]',\n type: 'uint256[]',\n },\n { name: 'positionIdList', internalType: 'TokenId[]', type: 'uint256[]' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n { name: 'user', internalType: 'address', type: 'address' },\n {\n name: 'shortPremia',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'longPremia',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n {\n name: 'ct0',\n internalType: 'contract CollateralTrackerV2',\n type: 'address',\n },\n {\n name: 'ct1',\n internalType: 'contract CollateralTrackerV2',\n type: 'address',\n },\n { name: 'buffer', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'isAccountSolvent',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'currentTick', internalType: 'int24', type: 'int24' },\n { name: 'oraclePack', internalType: 'OraclePack', type: 'uint256' },\n ],\n name: 'isSafeMode',\n outputs: [{ name: 'safeMode', internalType: 'uint8', type: 'uint8' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'pool',\n internalType: 'contract PanopticPoolV2',\n type: 'address',\n },\n ],\n name: 'lockPool',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'oraclePack', internalType: 'OraclePack', type: 'uint256' }],\n name: 'twapEMA',\n outputs: [{ name: '', internalType: 'int24', type: 'int24' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'pool',\n internalType: 'contract PanopticPoolV2',\n type: 'address',\n },\n ],\n name: 'unlockPool',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'utilization', internalType: 'uint256', type: 'uint256' },\n {\n name: 'interestRateAccumulator',\n internalType: 'MarketState',\n type: 'uint256',\n },\n ],\n name: 'updateInterestRate',\n outputs: [\n { name: '', internalType: 'uint128', type: 'uint128' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [],\n name: 'vegoid',\n outputs: [{ name: '', internalType: 'uint8', type: 'uint8' }],\n stateMutability: 'pure',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'collateralToken',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'avgBorrowRate',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n {\n name: 'rateAtTarget',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'BorrowRateUpdated',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [{ name: 'lockMode', internalType: 'bool', type: 'bool', indexed: false }],\n name: 'GuardianSafeModeUpdated',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'token',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'recipient',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'amount',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'TokensCollected',\n },\n { type: 'error', inputs: [], name: 'BelowMinimumRedemption' },\n { type: 'error', inputs: [], name: 'CastingError' },\n { type: 'error', inputs: [], name: 'InvalidBuilderCode' },\n { type: 'error', inputs: [], name: 'InvalidTick' },\n { type: 'error', inputs: [], name: 'LengthMismatch' },\n { type: 'error', inputs: [], name: 'LiquidityTooHigh' },\n { type: 'error', inputs: [], name: 'NotGuardian' },\n {\n type: 'error',\n inputs: [\n { name: 'token', internalType: 'address', type: 'address' },\n { name: 'from', internalType: 'address', type: 'address' },\n { name: 'amount', internalType: 'uint256', type: 'uint256' },\n { name: 'balance', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'TransferFailed',\n },\n { type: 'error', inputs: [], name: 'UnderOverFlow' },\n] as const\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// SemiFungiblePositionManager\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport const semiFungiblePositionManagerAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: 'poolManager',\n internalType: 'contract IPoolManager',\n type: 'address',\n },\n {\n name: '_minEnforcedTickFillCost',\n internalType: 'uint256',\n type: 'uint256',\n },\n {\n name: '_nativeEnforcedTickFillCost',\n internalType: 'uint256',\n type: 'uint256',\n },\n {\n name: '_supplyMultiplierTickFill',\n internalType: 'uint256',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'account', internalType: 'address', type: 'address' },\n { name: 'tokenId', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'balanceOf',\n outputs: [{ name: 'balance', internalType: 'uint256', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'owners', internalType: 'address[]', type: 'address[]' },\n { name: 'ids', internalType: 'uint256[]', type: 'uint256[]' },\n ],\n name: 'balanceOfBatch',\n outputs: [{ name: 'balances', internalType: 'uint256[]', type: 'uint256[]' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'poolKey', internalType: 'bytes', type: 'bytes' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n { name: 'positionSize', internalType: 'uint128', type: 'uint128' },\n { name: 'tickLimitLow', internalType: 'int24', type: 'int24' },\n { name: 'tickLimitHigh', internalType: 'int24', type: 'int24' },\n ],\n name: 'burnTokenizedPosition',\n outputs: [\n { name: '', internalType: 'LeftRightUnsigned[4]', type: 'uint256[4]' },\n { name: '', internalType: 'LeftRightSigned', type: 'int256' },\n { name: '', internalType: 'int24', type: 'int24' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'poolId', internalType: 'uint64', type: 'uint64' }],\n name: 'expandEnforcedTickRange',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'poolKey', internalType: 'bytes', type: 'bytes' },\n { name: 'owner', internalType: 'address', type: 'address' },\n { name: 'tokenType', internalType: 'uint256', type: 'uint256' },\n { name: 'tickLower', internalType: 'int24', type: 'int24' },\n { name: 'tickUpper', internalType: 'int24', type: 'int24' },\n ],\n name: 'getAccountLiquidity',\n outputs: [\n {\n name: 'accountLiquidities',\n internalType: 'LeftRightUnsigned',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'poolKey', internalType: 'bytes', type: 'bytes' },\n { name: 'owner', internalType: 'address', type: 'address' },\n { name: 'tokenType', internalType: 'uint256', type: 'uint256' },\n { name: 'tickLower', internalType: 'int24', type: 'int24' },\n { name: 'tickUpper', internalType: 'int24', type: 'int24' },\n { name: 'atTick', internalType: 'int24', type: 'int24' },\n { name: 'isLong', internalType: 'uint256', type: 'uint256' },\n { name: 'vegoid', internalType: 'uint256', type: 'uint256' },\n ],\n name: 'getAccountPremium',\n outputs: [\n { name: '', internalType: 'uint128', type: 'uint128' },\n { name: '', internalType: 'uint128', type: 'uint128' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'poolKey', internalType: 'bytes', type: 'bytes' }],\n name: 'getCurrentTick',\n outputs: [{ name: 'currentTick', internalType: 'int24', type: 'int24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'poolId', internalType: 'uint64', type: 'uint64' }],\n name: 'getEnforcedTickLimits',\n outputs: [\n { name: '', internalType: 'int24', type: 'int24' },\n { name: '', internalType: 'int24', type: 'int24' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'id', internalType: 'bytes', type: 'bytes' },\n { name: 'vegoid', internalType: 'uint8', type: 'uint8' },\n ],\n name: 'getPoolId',\n outputs: [{ name: '', internalType: 'uint64', type: 'uint64' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [{ name: 'poolId', internalType: 'uint64', type: 'uint64' }],\n name: 'getUniswapV4PoolKeyFromId',\n outputs: [\n {\n name: '',\n internalType: 'struct PoolKey',\n type: 'tuple',\n components: [\n { name: 'currency0', internalType: 'Currency', type: 'address' },\n { name: 'currency1', internalType: 'Currency', type: 'address' },\n { name: 'fee', internalType: 'uint24', type: 'uint24' },\n { name: 'tickSpacing', internalType: 'int24', type: 'int24' },\n { name: 'hooks', internalType: 'contract IHooks', type: 'address' },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n {\n name: 'key',\n internalType: 'struct PoolKey',\n type: 'tuple',\n components: [\n { name: 'currency0', internalType: 'Currency', type: 'address' },\n { name: 'currency1', internalType: 'Currency', type: 'address' },\n { name: 'fee', internalType: 'uint24', type: 'uint24' },\n { name: 'tickSpacing', internalType: 'int24', type: 'int24' },\n { name: 'hooks', internalType: 'contract IHooks', type: 'address' },\n ],\n },\n { name: 'vegoid', internalType: 'uint8', type: 'uint8' },\n ],\n name: 'initializeAMMPool',\n outputs: [{ name: 'poolId', internalType: 'uint64', type: 'uint64' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [\n { name: 'owner', internalType: 'address', type: 'address' },\n { name: 'operator', internalType: 'address', type: 'address' },\n ],\n name: 'isApprovedForAll',\n outputs: [{ name: 'approvedForAll', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: 'poolKey', internalType: 'bytes', type: 'bytes' },\n { name: 'tokenId', internalType: 'TokenId', type: 'uint256' },\n { name: 'positionSize', internalType: 'uint128', type: 'uint128' },\n { name: 'tickLimitLow', internalType: 'int24', type: 'int24' },\n { name: 'tickLimitHigh', internalType: 'int24', type: 'int24' },\n ],\n name: 'mintTokenizedPosition',\n outputs: [\n { name: '', internalType: 'LeftRightUnsigned[4]', type: 'uint256[4]' },\n { name: '', internalType: 'LeftRightSigned', type: 'int256' },\n { name: '', internalType: 'int24', type: 'int24' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'data', internalType: 'bytes[]', type: 'bytes[]' }],\n name: 'multicall',\n outputs: [{ name: 'results', internalType: 'bytes[]', type: 'bytes[]' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n inputs: [],\n name: 'reentrancyGuardEntered',\n outputs: [{ name: 'entered', internalType: 'bool', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n inputs: [\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'uint256[]', type: 'uint256[]' },\n { name: '', internalType: 'uint256[]', type: 'uint256[]' },\n { name: '', internalType: 'bytes', type: 'bytes' },\n ],\n name: 'safeBatchTransferFrom',\n outputs: [],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'address', type: 'address' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'uint256', type: 'uint256' },\n { name: '', internalType: 'bytes', type: 'bytes' },\n ],\n name: 'safeTransferFrom',\n outputs: [],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [\n { name: 'operator', internalType: 'address', type: 'address' },\n { name: 'approved', internalType: 'bool', type: 'bool' },\n ],\n name: 'setApprovalForAll',\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ name: '', internalType: 'bool', type: 'bool' }],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n inputs: [{ name: 'data', internalType: 'bytes', type: 'bytes' }],\n name: 'unlockCallback',\n outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'operator',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n { name: 'approved', internalType: 'bool', type: 'bool', indexed: false },\n ],\n name: 'ApprovalForAll',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n { name: 'idV4', internalType: 'PoolId', type: 'bytes32', indexed: true },\n {\n name: 'minEnforcedTick',\n internalType: 'int24',\n type: 'int24',\n indexed: false,\n },\n {\n name: 'maxEnforcedTick',\n internalType: 'int24',\n type: 'int24',\n indexed: false,\n },\n ],\n name: 'EnforcedTicksUpdated',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'poolId',\n internalType: 'PoolId',\n type: 'bytes32',\n indexed: true,\n },\n {\n name: 'owner',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'tokenType',\n internalType: 'uint256',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'tickLower',\n internalType: 'int24',\n type: 'int24',\n indexed: false,\n },\n {\n name: 'tickUpper',\n internalType: 'int24',\n type: 'int24',\n indexed: false,\n },\n {\n name: 'liquidityDelta',\n internalType: 'int128',\n type: 'int128',\n indexed: false,\n },\n ],\n name: 'LiquidityChunkUpdated',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n { name: 'idV4', internalType: 'PoolId', type: 'bytes32', indexed: true },\n {\n name: 'poolId',\n internalType: 'uint64',\n type: 'uint64',\n indexed: false,\n },\n {\n name: 'minEnforcedTick',\n internalType: 'int24',\n type: 'int24',\n indexed: false,\n },\n {\n name: 'maxEnforcedTick',\n internalType: 'int24',\n type: 'int24',\n indexed: false,\n },\n ],\n name: 'PoolInitialized',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'recipient',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'tokenId',\n internalType: 'TokenId',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'positionSize',\n internalType: 'uint128',\n type: 'uint128',\n indexed: false,\n },\n ],\n name: 'TokenizedPositionBurnt',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'caller',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n {\n name: 'tokenId',\n internalType: 'TokenId',\n type: 'uint256',\n indexed: true,\n },\n {\n name: 'positionSize',\n internalType: 'uint128',\n type: 'uint128',\n indexed: false,\n },\n ],\n name: 'TokenizedPositionMinted',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'operator',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n { name: 'from', internalType: 'address', type: 'address', indexed: true },\n { name: 'to', internalType: 'address', type: 'address', indexed: true },\n {\n name: 'ids',\n internalType: 'uint256[]',\n type: 'uint256[]',\n indexed: false,\n },\n {\n name: 'amounts',\n internalType: 'uint256[]',\n type: 'uint256[]',\n indexed: false,\n },\n ],\n name: 'TransferBatch',\n },\n {\n type: 'event',\n anonymous: false,\n inputs: [\n {\n name: 'operator',\n internalType: 'address',\n type: 'address',\n indexed: true,\n },\n { name: 'from', internalType: 'address', type: 'address', indexed: true },\n { name: 'to', internalType: 'address', type: 'address', indexed: true },\n { name: 'id', internalType: 'uint256', type: 'uint256', indexed: false },\n {\n name: 'amount',\n internalType: 'uint256',\n type: 'uint256',\n indexed: false,\n },\n ],\n name: 'TransferSingle',\n },\n { type: 'error', inputs: [], name: 'ChunkHasZeroLiquidity' },\n { type: 'error', inputs: [], name: 'InvalidTick' },\n { type: 'error', inputs: [], name: 'InvalidTickBound' },\n {\n type: 'error',\n inputs: [{ name: 'parameterType', internalType: 'uint256', type: 'uint256' }],\n name: 'InvalidTokenIdParameter',\n },\n { type: 'error', inputs: [], name: 'LiquidityTooHigh' },\n { type: 'error', inputs: [], name: 'NotAuthorized' },\n { type: 'error', inputs: [], name: 'NotEnoughLiquidityInChunk' },\n { type: 'error', inputs: [], name: 'PoolNotInitialized' },\n { type: 'error', inputs: [], name: 'PositionTooLarge' },\n {\n type: 'error',\n inputs: [{ name: 'currentTick', internalType: 'int24', type: 'int24' }],\n name: 'PriceBoundFail',\n },\n { type: 'error', inputs: [], name: 'Reentrancy' },\n { type: 'error', inputs: [], name: 'UnauthorizedUniswapCallback' },\n { type: 'error', inputs: [], name: 'UnderOverFlow' },\n { type: 'error', inputs: [], name: 'UnsafeRecipient' },\n { type: 'error', inputs: [], name: 'WrongUniswapPool' },\n] as const\n","/**\n * PanopticQuery contract ABI\n * Auto-generated from PanopticQuery.json\n * @module abis/panopticQuery\n */\n\nexport const panopticQueryAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: 'SFPM_',\n type: 'address',\n internalType: 'contract ISemiFungiblePositionManager',\n },\n ],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'checkCollateral',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n ],\n outputs: [\n { name: 'collateralBalances0', type: 'uint256[4]', internalType: 'uint256[4]' },\n { name: 'requiredCollaterals0', type: 'uint256[4]', internalType: 'uint256[4]' },\n { name: 'collateralBalances1', type: 'uint256[4]', internalType: 'uint256[4]' },\n { name: 'requiredCollaterals1', type: 'uint256[4]', internalType: 'uint256[4]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'checkCollateral',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n { name: 'atTick', type: 'int24', internalType: 'int24' },\n ],\n outputs: [{ name: 'balancesAndRequired', type: 'uint256[4]', internalType: 'uint256[4]' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'checkCollateralListOutput',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n ],\n outputs: [\n { name: '', type: 'uint256[2][]', internalType: 'uint256[2][]' },\n { name: '', type: 'int256[]', internalType: 'int256[]' },\n { name: '', type: 'int24[]', internalType: 'int24[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'computeMedianObservedPrice',\n inputs: [\n { name: 'univ3pool', type: 'address', internalType: 'contract IUniswapV3Pool' },\n { name: 'cardinality', type: 'uint256', internalType: 'uint256' },\n { name: 'period', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [{ name: 'medianTick', type: 'int24', internalType: 'int24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getChunkData',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n ],\n outputs: [{ name: '', type: 'uint256[2][4][]', internalType: 'uint256[2][4][]' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'scanChunks',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'tickLower', type: 'int24', internalType: 'int24' },\n { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n { name: 'width', type: 'int24', internalType: 'int24' },\n ],\n outputs: [\n { name: 'strikes', type: 'int24[]', internalType: 'int24[]' },\n { name: 'netLiquidities', type: 'uint128[2][]', internalType: 'uint128[2][]' },\n { name: 'removedLiquidities', type: 'uint128[2][]', internalType: 'uint128[2][]' },\n { name: 'settledTokens', type: 'uint256[2][]', internalType: 'LeftRightUnsigned[2][]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getLiquidationPrices',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n ],\n outputs: [\n { name: 'liquidationPriceDown', type: 'int24', internalType: 'int24' },\n { name: 'liquidationPriceUp', type: 'int24', internalType: 'int24' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getMaxPositionSizeBounds',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'existingPositionIds', type: 'uint256[]', internalType: 'TokenId[]' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'tokenId', type: 'uint256', internalType: 'TokenId' },\n ],\n outputs: [\n { name: 'maxSizeAtMinUtil', type: 'uint128', internalType: 'uint128' },\n { name: 'maxSizeAtMaxUtil', type: 'uint128', internalType: 'uint128' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getNetLiquidationValue',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'includePendingPremium', type: 'bool', internalType: 'bool' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n { name: 'atTick', type: 'int24', internalType: 'int24' },\n ],\n outputs: [\n { name: 'value0', type: 'int256', internalType: 'int256' },\n { name: 'value1', type: 'int256', internalType: 'int256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getPortfolioValue',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'atTick', type: 'int24', internalType: 'int24' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n ],\n outputs: [\n { name: 'value0', type: 'int256', internalType: 'int256' },\n { name: 'value1', type: 'int256', internalType: 'int256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getRequiredBase',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'tokenId', type: 'uint256', internalType: 'TokenId' },\n { name: 'atTick', type: 'int24', internalType: 'int24' },\n ],\n outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getTickNets',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'startTick', type: 'int24', internalType: 'int24' },\n { name: 'nTicks', type: 'uint256', internalType: 'uint256' },\n ],\n outputs: [\n { name: 'tickData', type: 'int256[]', internalType: 'int256[]' },\n { name: 'liquidityNets', type: 'int256[]', internalType: 'int256[]' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'isAccountSolvent',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'account', type: 'address', internalType: 'address' },\n { name: 'positionIdList', type: 'uint256[]', internalType: 'TokenId[]' },\n { name: 'atTick', type: 'int24', internalType: 'int24' },\n ],\n outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'optimizeRiskPartners',\n inputs: [\n { name: 'pool', type: 'address', internalType: 'contract PanopticPool' },\n { name: 'atTick', type: 'int24', internalType: 'int24' },\n { name: 'tokenId', type: 'uint256', internalType: 'TokenId' },\n ],\n outputs: [{ name: '', type: 'uint256', internalType: 'TokenId' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'twapFilter',\n inputs: [\n { name: 'univ3pool', type: 'address', internalType: 'contract IUniswapV3Pool' },\n { name: 'twapWindow', type: 'uint32', internalType: 'uint32' },\n ],\n outputs: [{ name: '', type: 'int24', internalType: 'int24' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'validateTokenId',\n inputs: [{ name: 'self', type: 'uint256', internalType: 'TokenId' }],\n outputs: [],\n stateMutability: 'pure',\n },\n {\n type: 'error',\n name: 'CastingError',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidTick',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidTokenIdParameter',\n inputs: [{ name: 'parameterType', type: 'uint256', internalType: 'uint256' }],\n },\n {\n type: 'error',\n name: 'LiquidityTooHigh',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UnderOverFlow',\n inputs: [],\n },\n] as const\n","/**\n * Block metadata utilities for the Panoptic v2 SDK.\n * @module v2/clients/blockMeta\n */\n\nimport type { PublicClient } from 'viem'\n\nimport type { BlockMeta } from '../types'\n\n/**\n * Parameters for getBlockMeta.\n */\nexport interface GetBlockMetaParams {\n /** viem PublicClient */\n client: PublicClient\n /** Optional block number (defaults to latest) */\n blockNumber?: bigint\n}\n\n/**\n * Get block metadata for a given block.\n * Used to tag all read results with same-block consistency proof.\n *\n * @param params - The parameters\n * @returns Block metadata\n */\nexport async function getBlockMeta(params: GetBlockMetaParams): Promise<BlockMeta> {\n const { client, blockNumber } = params\n\n const block = await client.getBlock({\n blockNumber,\n includeTransactions: false,\n })\n\n return {\n blockNumber: block.number,\n blockHash: block.hash,\n blockTimestamp: block.timestamp,\n }\n}\n","/**\n * Write utilities for the Panoptic v2 SDK.\n * @module v2/writes/utils\n */\n\nimport type { Abi, Address, Hash, Log, PublicClient, WalletClient } from 'viem'\nimport { decodeEventLog, encodeFunctionData } from 'viem'\n\nimport { collateralTrackerAbi, panopticPoolAbi } from '../../../generated'\nimport type { PanopticEvent, TxOverrides, TxReceipt, TxResult } from '../types'\n\n/**\n * Decode PositionBalance packed data.\n *\n * Layout (from LSB to MSB):\n * - positionSize: bits 0-127 (uint128)\n * - poolUtilization0: bits 128-143 (uint16)\n * - poolUtilization1: bits 144-159 (uint16)\n * - tickAtMint: bits 160-183 (int24)\n * - timestampAtMint: bits 184-215 (uint32)\n * - blockAtMint: bits 216-254 (uint39)\n * - swapAtMint: bit 255 (bool)\n */\nexport function decodePositionBalance(balanceData: bigint): {\n positionSize: bigint\n poolUtilization0: bigint\n poolUtilization1: bigint\n tickAtMint: bigint\n timestampAtMint: bigint\n blockAtMint: bigint\n swapAtMint: boolean\n} {\n const positionSize = balanceData & ((1n << 128n) - 1n)\n const poolUtilization0 = (balanceData >> 128n) & 0xffffn\n const poolUtilization1 = (balanceData >> 144n) & 0xffffn\n\n // tickAtMint is int24 at bits 160-183\n let tickAtMint = (balanceData >> 160n) & 0xffffffn\n // Sign extend if negative (int24)\n if (tickAtMint > 0x7fffffn) {\n tickAtMint = tickAtMint - 0x1000000n\n }\n\n // timestampAtMint is uint32 at bits 184-215\n const timestampAtMint = (balanceData >> 184n) & 0xffffffffn\n\n // blockAtMint is uint39 at bits 216-254\n const blockAtMint = (balanceData >> 216n) & ((1n << 39n) - 1n)\n\n // swapAtMint is bool at bit 255\n const swapAtMint = balanceData >> 255n === 1n\n\n return {\n positionSize,\n poolUtilization0,\n poolUtilization1,\n tickAtMint,\n timestampAtMint,\n blockAtMint,\n swapAtMint,\n }\n}\n\n/**\n * Decode LeftRightSigned packed value.\n */\nexport function decodeLeftRightSigned(value: bigint): { right: bigint; left: bigint } {\n // Right is bits 0-127 (token0), Left is bits 128-255 (token1)\n // Both are signed int128\n let right = value & ((1n << 128n) - 1n)\n let left = value >> 128n\n\n // Sign extend right if needed\n if (right >= 1n << 127n) {\n right = right - (1n << 128n)\n }\n // Sign extend left if needed\n if (left >= 1n << 127n) {\n left = left - (1n << 128n)\n }\n\n return { right, left }\n}\n\n/**\n * Decode LeftRightUnsigned packed value.\n */\nexport function decodeLeftRightUnsigned(value: bigint): { right: bigint; left: bigint } {\n // Right is bits 0-127 (token0), Left is bits 128-255 (token1)\n // Both are unsigned uint128\n const right = value & ((1n << 128n) - 1n)\n const left = value >> 128n\n\n return { right, left }\n}\n\n/**\n * Parse Panoptic events from transaction logs.\n *\n * @param logs - The transaction logs\n * @returns Parsed Panoptic events\n */\nexport function parsePanopticEvents(logs: Log[]): PanopticEvent[] {\n const events: PanopticEvent[] = []\n\n // Try to decode each log with known ABIs\n for (const log of logs) {\n const baseEvent = {\n blockNumber: log.blockNumber ?? 0n,\n blockHash: (log.blockHash ??\n '0x0000000000000000000000000000000000000000000000000000000000000000') as Hash,\n transactionHash: log.transactionHash ?? ('0x' as Hash),\n logIndex: BigInt(log.logIndex ?? 0),\n }\n\n try {\n // Try PanopticPool events\n const poolEvent = decodeEventLog({\n abi: panopticPoolAbi,\n data: log.data,\n topics: log.topics,\n })\n\n if (poolEvent.eventName === 'OptionMinted') {\n const args = poolEvent.args as {\n recipient: `0x${string}`\n tokenId: bigint\n balanceData: bigint\n }\n const balance = decodePositionBalance(args.balanceData)\n events.push({\n type: 'OptionMinted',\n ...baseEvent,\n recipient: args.recipient,\n tokenId: args.tokenId,\n positionSize: balance.positionSize,\n poolUtilization0: balance.poolUtilization0,\n poolUtilization1: balance.poolUtilization1,\n tickAtMint: balance.tickAtMint,\n timestampAtMint: balance.timestampAtMint,\n blockAtMint: balance.blockAtMint,\n swapAtMint: balance.swapAtMint,\n })\n } else if (poolEvent.eventName === 'OptionBurnt') {\n const args = poolEvent.args as {\n recipient: `0x${string}`\n tokenId: bigint\n positionSize: bigint\n premiaByLeg: readonly bigint[]\n }\n events.push({\n type: 'OptionBurnt',\n ...baseEvent,\n recipient: args.recipient,\n tokenId: args.tokenId,\n positionSize: args.positionSize,\n premiaByLeg: [\n args.premiaByLeg[0] ?? 0n,\n args.premiaByLeg[1] ?? 0n,\n args.premiaByLeg[2] ?? 0n,\n args.premiaByLeg[3] ?? 0n,\n ] as const,\n })\n } else if (poolEvent.eventName === 'AccountLiquidated') {\n const args = poolEvent.args as {\n liquidator: `0x${string}`\n liquidatee: `0x${string}`\n bonusAmounts: bigint\n }\n const { right, left } = decodeLeftRightSigned(args.bonusAmounts)\n events.push({\n type: 'AccountLiquidated',\n ...baseEvent,\n liquidator: args.liquidator,\n liquidatee: args.liquidatee,\n bonusAmount0: right,\n bonusAmount1: left,\n })\n } else if (poolEvent.eventName === 'ForcedExercised') {\n const args = poolEvent.args as {\n exercisor: `0x${string}`\n user: `0x${string}`\n tokenId: bigint\n exerciseFee: bigint\n }\n const { right, left } = decodeLeftRightSigned(args.exerciseFee)\n events.push({\n type: 'ForcedExercised',\n ...baseEvent,\n exercisor: args.exercisor,\n user: args.user,\n tokenId: args.tokenId,\n exerciseFee0: right,\n exerciseFee1: left,\n })\n } else if (poolEvent.eventName === 'PremiumSettled') {\n const args = poolEvent.args as {\n user: `0x${string}`\n tokenId: bigint\n legIndex: bigint\n settledAmounts: bigint\n }\n const { right, left } = decodeLeftRightSigned(args.settledAmounts)\n events.push({\n type: 'PremiumSettled',\n ...baseEvent,\n user: args.user,\n tokenId: args.tokenId,\n legIndex: args.legIndex,\n settledAmount0: right,\n settledAmount1: left,\n })\n }\n } catch {\n // Not a PanopticPool event, try CollateralTracker\n try {\n const collateralEvent = decodeEventLog({\n abi: collateralTrackerAbi,\n data: log.data,\n topics: log.topics,\n })\n\n if (collateralEvent.eventName === 'Deposit') {\n const args = collateralEvent.args as {\n sender: `0x${string}`\n owner: `0x${string}`\n assets: bigint\n shares: bigint\n }\n events.push({\n type: 'Deposit',\n ...baseEvent,\n sender: args.sender,\n owner: args.owner,\n assets: args.assets,\n shares: args.shares,\n })\n } else if (collateralEvent.eventName === 'Withdraw') {\n const args = collateralEvent.args as {\n sender: `0x${string}`\n receiver: `0x${string}`\n owner: `0x${string}`\n assets: bigint\n shares: bigint\n }\n events.push({\n type: 'Withdraw',\n ...baseEvent,\n sender: args.sender,\n receiver: args.receiver,\n owner: args.owner,\n assets: args.assets,\n shares: args.shares,\n })\n }\n } catch {\n // Unknown event, skip\n }\n }\n }\n\n return events\n}\n\n/**\n * Create a TxResult from a transaction hash.\n *\n * @param client - The public client\n * @param hash - The transaction hash\n * @returns TxResult with wait function\n */\nexport function createTxResult(client: PublicClient, hash: Hash): TxResult {\n return {\n hash,\n wait: async (confirmations?: bigint): Promise<TxReceipt> => {\n const receipt = await client.waitForTransactionReceipt({\n hash,\n confirmations: confirmations !== undefined ? Number(confirmations) : undefined,\n })\n\n const events = parsePanopticEvents(receipt.logs)\n\n return {\n hash: receipt.transactionHash,\n blockNumber: receipt.blockNumber,\n blockHash: receipt.blockHash,\n gasUsed: receipt.gasUsed,\n status: receipt.status === 'success' ? 'success' : 'reverted',\n events,\n }\n },\n }\n}\n\n/**\n * Execute a write operation and return TxResult.\n *\n * @param client - The public client\n * @param hashPromise - Promise that resolves to transaction hash\n * @returns TxResult\n */\nexport async function executeWrite(\n client: PublicClient,\n hashPromise: Promise<Hash>,\n): Promise<TxResult> {\n const hash = await hashPromise\n return createTxResult(client, hash)\n}\n\n/**\n * Execute a write operation and wait for receipt.\n *\n * @param client - The public client\n * @param hashPromise - Promise that resolves to transaction hash\n * @param confirmations - Number of confirmations to wait for\n * @returns TxReceipt\n */\nexport async function executeWriteAndWait(\n client: PublicClient,\n hashPromise: Promise<Hash>,\n confirmations?: bigint,\n): Promise<TxReceipt> {\n const result = await executeWrite(client, hashPromise)\n return result.wait(confirmations)\n}\n\n/**\n * Parameters for the submitWrite helper.\n */\nexport interface SubmitWriteParams {\n /** Public client */\n client: PublicClient\n /** Wallet client */\n walletClient: WalletClient\n /** Account address */\n account: Address\n /** Contract address */\n address: Address\n /** Contract ABI */\n abi: Abi\n /** Function name to call */\n functionName: string\n /** Function arguments */\n args: readonly unknown[]\n /** ETH value to send with the transaction (for native ETH deposits) */\n value?: bigint\n /** Optional gas and transaction overrides */\n txOverrides?: TxOverrides\n}\n\n/**\n * Submit a write operation, supporting both direct wallet submission\n * and custom broadcaster paths with gas overrides.\n *\n * Normal path (no broadcaster): calls walletClient.writeContract() with gas overrides.\n * Broadcaster path: prepareTransactionRequest → apply overrides → signTransaction → broadcast.\n *\n * @param params - Submit write parameters\n * @returns TxResult\n */\nexport async function submitWrite(params: SubmitWriteParams): Promise<TxResult> {\n const { client, walletClient, account, address, abi, functionName, args, value, txOverrides } =\n params\n\n const broadcaster = txOverrides?.broadcaster\n\n if (broadcaster) {\n // Encode contract calldata before request preparation so gas/tx params\n // are derived from the exact call being signed and broadcast.\n const data = encodeFunctionData({ abi, functionName, args })\n\n // Broadcaster path: prepare → sign → broadcast\n const broadcastAccount = walletClient.account ?? account\n const request = await walletClient.prepareTransactionRequest({\n account: broadcastAccount,\n to: address,\n chain: walletClient.chain,\n data,\n ...(value !== undefined && { value }),\n ...(txOverrides?.maxFeePerGas !== undefined && { maxFeePerGas: txOverrides.maxFeePerGas }),\n ...(txOverrides?.maxPriorityFeePerGas !== undefined && {\n maxPriorityFeePerGas: txOverrides.maxPriorityFeePerGas,\n }),\n ...(txOverrides?.gas !== undefined && { gas: txOverrides.gas }),\n ...(txOverrides?.nonce !== undefined && { nonce: Number(txOverrides.nonce) }),\n })\n\n const signedTx = await walletClient.signTransaction({\n ...request,\n account: broadcastAccount,\n } as unknown as Parameters<WalletClient['signTransaction']>[0])\n\n const hash = await broadcaster.broadcast(signedTx)\n return createTxResult(client, hash)\n }\n\n // Normal path: direct writeContract with gas overrides\n const gasOverrides: Record<string, unknown> = {}\n if (txOverrides?.maxFeePerGas !== undefined) {\n gasOverrides.maxFeePerGas = txOverrides.maxFeePerGas\n }\n if (txOverrides?.maxPriorityFeePerGas !== undefined) {\n gasOverrides.maxPriorityFeePerGas = txOverrides.maxPriorityFeePerGas\n }\n if (txOverrides?.nonce !== undefined) {\n gasOverrides.nonce = Number(txOverrides.nonce)\n }\n\n // Use the walletClient's local account (if available) for local signing.\n // Passing a string address triggers eth_sendTransaction (remote signing),\n // which fails with hosted RPC providers like Alchemy/Infura.\n const resolvedAccount = walletClient.account ?? account\n\n // If no explicit gas override, estimate with a 20% buffer.\n // Panoptic dispatch calls are gas-heavy and viem's default estimate can be tight.\n if (txOverrides?.gas !== undefined) {\n gasOverrides.gas = txOverrides.gas\n } else {\n const estimated = await client.estimateContractGas({\n address,\n abi,\n functionName,\n args,\n account: resolvedAccount,\n ...(value !== undefined && { value }),\n } as Parameters<typeof client.estimateContractGas>[0])\n gasOverrides.gas = (estimated * 120n) / 100n\n }\n\n const hash = await walletClient.writeContract({\n address,\n abi,\n functionName,\n args,\n account: resolvedAccount,\n chain: walletClient.chain,\n ...(value !== undefined && { value }),\n ...gasOverrides,\n })\n\n return createTxResult(client, hash)\n}\n\n/**\n * Parameters required for all write operations.\n */\nexport interface BaseWriteParams {\n /** Public client for reading state */\n client: PublicClient\n}\n","/**\n * Position and account check functions for the Panoptic v2 SDK.\n *\n * These functions check account liquidatability.\n *\n * @module v2/reads/checks\n */\n\nimport type { Address, PublicClient } from 'viem'\n\nimport { panopticPoolAbi } from '../../../generated'\nimport { panopticQueryAbi } from '../abis/panopticQuery'\nimport { getBlockMeta } from '../clients/blockMeta'\nimport type { BlockMeta } from '../types'\nimport { decodeLeftRightUnsigned } from '../writes/utils'\n\n/**\n * Liquidation check result with detailed margin breakdown.\n *\n * **Denomination**: all margin values are cross-converted into a single\n * token by `checkCollateral`. See {@link MarginBuffer.denominatedInToken}.\n */\nexport interface LiquidationCheck {\n /** Whether the account is liquidatable */\n isLiquidatable: boolean\n /** Margin shortfall for slot 0 (positive = shortfall, negative = excess) */\n marginShortfall0: bigint\n /** Margin shortfall for slot 1 (positive = shortfall, negative = excess) */\n marginShortfall1: bigint\n /** Current margin (collateral balance) for slot 0 */\n currentMargin0: bigint\n /** Current margin (collateral balance) for slot 1 */\n currentMargin1: bigint\n /** Required margin for slot 0 */\n requiredMargin0: bigint\n /** Required margin for slot 1 */\n requiredMargin1: bigint\n /**\n * Which token all margin values are denominated in.\n * 0n = token0 (when atTick < 0), 1n = token1 (when atTick >= 0).\n */\n denominatedInToken: bigint\n /** Tick at which liquidation was checked */\n atTick: bigint\n /** Block metadata */\n _meta: BlockMeta\n}\n\n/**\n * Parameters for isLiquidatable.\n */\nexport interface IsLiquidatableParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Account to check */\n account: Address\n /** TokenIds of open positions */\n tokenIds: bigint[]\n /** Optional: Tick to check liquidation at (defaults to current tick) */\n atTick?: bigint\n /** PanopticQuery address (required for margin calculations) */\n queryAddress: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Check if an account is liquidatable with detailed margin breakdown.\n *\n * An account is liquidatable when its collateral falls below the\n * maintenance margin requirement for its open positions.\n *\n * Note: This function requires PanopticQuery for accurate margin calculations.\n * Without queryAddress, throws PanopticHelperNotDeployedError.\n *\n * @param params - The parameters\n * @returns Liquidation check result with detailed margin breakdown\n * @throws PanopticHelperNotDeployedError - PanopticQuery contract is required\n *\n * @example\n * ```typescript\n * const result = await isLiquidatable({\n * client,\n * poolAddress,\n * account,\n * tokenIds: [position1, position2],\n * queryAddress,\n * })\n *\n * if (result.isLiquidatable) {\n * console.log('Account is liquidatable!')\n * console.log('Shortfall token0:', result.marginShortfall0)\n * console.log('Shortfall token1:', result.marginShortfall1)\n * } else {\n * console.log('Margin buffer token0:', -result.marginShortfall0)\n * console.log('Margin buffer token1:', -result.marginShortfall1)\n * }\n * ```\n */\nexport async function isLiquidatable(params: IsLiquidatableParams): Promise<LiquidationCheck> {\n const { client, poolAddress, account, tokenIds, atTick, queryAddress, blockNumber } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get current tick if not provided\n let effectiveTick: bigint\n if (atTick !== undefined) {\n effectiveTick = atTick\n } else {\n const currentTickResult = await client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'getCurrentTick',\n blockNumber: targetBlockNumber,\n })\n effectiveTick = BigInt(currentTickResult)\n }\n\n // Use checkCollateral for detailed margin info\n // Returns: [collateralBalance, requiredCollateral] as LeftRightUnsigned packed values\n const [[collateralBalance, requiredCollateral], _meta] = await Promise.all([\n client.readContract({\n address: queryAddress,\n abi: panopticQueryAbi,\n functionName: 'checkCollateral',\n args: [poolAddress, account, tokenIds, Number(effectiveTick)],\n blockNumber: targetBlockNumber,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n // Decode LeftRightUnsigned packed values (right=token0, left=token1)\n const balances = decodeLeftRightUnsigned(collateralBalance)\n const required = decodeLeftRightUnsigned(requiredCollateral)\n\n const currentMargin0 = balances.right\n const currentMargin1 = balances.left\n const requiredMargin0 = required.right\n const requiredMargin1 = required.left\n\n // Calculate shortfall (positive = shortfall, negative = excess margin)\n const marginShortfall0 = requiredMargin0 - currentMargin0\n const marginShortfall1 = requiredMargin1 - currentMargin1\n\n // Account is liquidatable if either token has positive shortfall\n const isLiquidatableResult = marginShortfall0 > 0n || marginShortfall1 > 0n\n\n return {\n isLiquidatable: isLiquidatableResult,\n marginShortfall0,\n marginShortfall1,\n currentMargin0,\n currentMargin1,\n requiredMargin0,\n requiredMargin1,\n denominatedInToken: effectiveTick < 0n ? 0n : 1n,\n atTick: effectiveTick,\n _meta,\n }\n}\n","/**\n * Constants for the Panoptic v2 SDK.\n * @module v2/utils/constants\n */\n\n/**\n * WAD constant (10^18) used for fixed-point arithmetic.\n * Commonly used for spread calculations and other WAD-scaled values.\n */\nexport const WAD = 10n ** 18n\n\n/**\n * Zero collateral object for guest mode.\n * Returns safe defaults when no wallet is connected.\n */\nexport const ZERO_COLLATERAL = {\n token0: {\n assets: 0n,\n shares: 0n,\n availableAssets: 0n,\n lockedAssets: 0n,\n },\n token1: {\n assets: 0n,\n shares: 0n,\n availableAssets: 0n,\n lockedAssets: 0n,\n },\n} as const\n\n/**\n * Zero valuation object for guest mode.\n * Returns safe defaults when no wallet is connected.\n */\nexport const ZERO_VALUATION = {\n netLiquidationValue0: 0n,\n netLiquidationValue1: 0n,\n maintenanceMargin0: 0n,\n maintenanceMargin1: 0n,\n marginExcess0: 0n,\n marginExcess1: 0n,\n} as const\n\n/**\n * Storage schema version for the SDK.\n * Increment when storage format changes (triggers migration or clear).\n */\nexport const SCHEMA_VERSION = 1\n\n/**\n * Storage key prefix for all SDK data.\n */\nexport const STORAGE_PREFIX = 'panoptic-v2-sdk'\n\n/**\n * Maximum number of chunks that can be tracked per pool.\n * Exceeding this limit throws ChunkLimitError.\n */\nexport const MAX_TRACKED_CHUNKS = 1000\n\n/**\n * Default reorg depth for chain reorganization handling.\n * On reorg detection, rollback this many blocks and re-sync.\n */\nexport const REORG_DEPTH = 128n\n\n/**\n * Oracle epoch duration in seconds (64 seconds per epoch).\n */\nexport const ORACLE_EPOCH_SECONDS = 64n\n\n/**\n * Minimum tick value for Uniswap v3/v4 pools.\n */\nexport const MIN_TICK = -887272n\n\n/**\n * Maximum tick value for Uniswap v3/v4 pools.\n */\nexport const MAX_TICK = 887272n\n\n/**\n * Basis points denominator (100% = 10000 bps).\n */\nexport const BPS_DENOMINATOR = 10000n\n\n/**\n * Utilization denominator (100% = 10000).\n */\nexport const UTILIZATION_DENOMINATOR = 10000n\n","/**\n * Tick and price formatters for Uniswap V3/V4 pools.\n *\n * Ticks represent logarithmic prices where: price = 1.0001^tick\n *\n * @module v2/formatters/tick\n */\n\nimport { MAX_TICK, MIN_TICK } from '../utils/constants'\n\nconst Q192 = 1n << 192n\nconst RAW_PRICE_PRECISION = 40n\n\nfunction pow10(exponent: bigint): bigint {\n if (exponent < 0n) {\n throw new RangeError('Exponent must be non-negative')\n }\n return 10n ** exponent\n}\n\nfunction absBigint(value: bigint): bigint {\n return value < 0n ? -value : value\n}\n\nfunction trimTrailingZeros(value: string): string {\n const dotIndex = value.indexOf('.')\n if (dotIndex === -1) return value\n\n let end = value.length\n while (end > dotIndex && value[end - 1] === '0') {\n end -= 1\n }\n\n if (end === dotIndex + 1) {\n end = dotIndex\n }\n\n return value.slice(0, end)\n}\n\nfunction formatRatio(numerator: bigint, denominator: bigint, precision: bigint): string {\n if (precision < 0n) {\n throw new RangeError('Precision must be non-negative')\n }\n\n const sign = numerator < 0n ? '-' : ''\n const absNumerator = numerator < 0n ? -numerator : numerator\n\n const scale = pow10(precision)\n const scaled = (absNumerator * scale + denominator / 2n) / denominator\n const integerPart = scaled / scale\n const fractionalPart = scaled % scale\n\n if (precision === 0n) {\n return `${sign}${integerPart}`\n }\n\n return `${sign}${integerPart}.${fractionalPart.toString().padStart(Number(precision), '0')}`\n}\n\nfunction parseDecimalToFraction(value: string): { numerator: bigint; denominator: bigint } {\n const trimmed = value.trim()\n if (trimmed.length === 0) {\n throw new Error('Price must be a number')\n }\n\n const isNegative = trimmed.startsWith('-')\n const unsigned = isNegative || trimmed.startsWith('+') ? trimmed.slice(1) : trimmed\n\n const [basePart, exponentPart] = unsigned.toLowerCase().split('e')\n const [integerStr, fractionalStr = ''] = basePart.split('.')\n\n if (integerStr === '' && fractionalStr === '') {\n throw new Error('Price must be a number')\n }\n\n const integerDigits = integerStr === '' ? '0' : integerStr\n const digits = `${integerDigits}${fractionalStr}`\n\n let numerator = BigInt(digits === '' ? '0' : digits)\n let denominator = pow10(BigInt(fractionalStr.length))\n\n if (exponentPart !== undefined && exponentPart !== '') {\n const exponent = BigInt(exponentPart)\n if (exponent > 0n) {\n numerator *= pow10(exponent)\n } else if (exponent < 0n) {\n denominator *= pow10(-exponent)\n }\n }\n\n if (isNegative) {\n numerator = -numerator\n }\n\n return { numerator, denominator }\n}\n\nfunction compareRatios(\n leftNumerator: bigint,\n leftDenominator: bigint,\n rightNumerator: bigint,\n rightDenominator: bigint,\n): -1 | 0 | 1 {\n const left = leftNumerator * rightDenominator\n const right = rightNumerator * leftDenominator\n\n if (left === right) return 0\n return left < right ? -1 : 1\n}\n\nexport function tickToSqrtPriceX96(tick: bigint): bigint {\n if (tick < MIN_TICK || tick > MAX_TICK) {\n throw new RangeError('Tick out of bounds')\n }\n\n const absTick = tick < 0n ? -tick : tick\n\n let ratio =\n (absTick & 0x1n) !== 0n\n ? 0xfffcb933bd6fad37aa2d162d1a594001n\n : 0x100000000000000000000000000000000n\n if ((absTick & 0x2n) !== 0n) ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n\n if ((absTick & 0x4n) !== 0n) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n\n if ((absTick & 0x8n) !== 0n) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n\n if ((absTick & 0x10n) !== 0n) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n\n if ((absTick & 0x20n) !== 0n) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n\n if ((absTick & 0x40n) !== 0n) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n\n if ((absTick & 0x80n) !== 0n) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n\n if ((absTick & 0x100n) !== 0n) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n\n if ((absTick & 0x200n) !== 0n) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n\n if ((absTick & 0x400n) !== 0n) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n\n if ((absTick & 0x800n) !== 0n) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n\n if ((absTick & 0x1000n) !== 0n) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n\n if ((absTick & 0x2000n) !== 0n) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n\n if ((absTick & 0x4000n) !== 0n) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n\n if ((absTick & 0x8000n) !== 0n) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n\n if ((absTick & 0x10000n) !== 0n) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n\n if ((absTick & 0x20000n) !== 0n) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n\n if ((absTick & 0x40000n) !== 0n) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n\n if ((absTick & 0x80000n) !== 0n) ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n\n\n if (tick > 0n) {\n ratio = ((1n << 256n) - 1n) / ratio\n }\n\n const remainderMask = (1n << 32n) - 1n\n const sqrtPriceX96 = (ratio >> 32n) + ((ratio & remainderMask) === 0n ? 0n : 1n)\n\n return sqrtPriceX96\n}\n\nconst MIN_SQRT_PRICE_X96 = tickToSqrtPriceX96(MIN_TICK)\nconst MAX_SQRT_PRICE_X96 = tickToSqrtPriceX96(MAX_TICK)\n\nfunction getPriceRatioFromSqrtPriceX96(sqrtPriceX96: bigint): {\n numerator: bigint\n denominator: bigint\n} {\n return {\n numerator: sqrtPriceX96 * sqrtPriceX96,\n denominator: Q192,\n }\n}\n\nfunction getRawPriceRatio(tick: bigint): { numerator: bigint; denominator: bigint } {\n return getPriceRatioFromSqrtPriceX96(tickToSqrtPriceX96(tick))\n}\n\nfunction adjustRatioForDecimals(\n numerator: bigint,\n denominator: bigint,\n decimals0: bigint,\n decimals1: bigint,\n): { numerator: bigint; denominator: bigint } {\n const diff = decimals0 - decimals1\n if (diff === 0n) {\n return { numerator, denominator }\n }\n\n if (diff > 0n) {\n return { numerator: numerator * pow10(diff), denominator }\n }\n\n return { numerator, denominator: denominator * pow10(-diff) }\n}\n\n/**\n * Convert a tick to a raw price string (no decimal adjustment).\n * Uses the formula: price = 1.0001^tick\n *\n * This returns the raw price ratio, not adjusted for token decimals.\n * A fixed internal precision is used and trailing zeros are trimmed.\n *\n * @param tick - The tick value\n * @returns Price string\n *\n * @example\n * ```typescript\n * tickToPrice(0n) // \"1\"\n * tickToPrice(1000n) // \"1.105...\" (approximately)\n * tickToPrice(-1000n) // \"0.904...\" (approximately)\n * tickToPrice(200000n) // Very large number\n * ```\n */\nexport function tickToPrice(tick: bigint): string {\n const { numerator, denominator } = getRawPriceRatio(tick)\n const price = formatRatio(numerator, denominator, RAW_PRICE_PRECISION)\n return trimTrailingZeros(price)\n}\n\n/**\n * Convert a tick to a human-readable price with decimal scaling.\n * Uses the formula: price = 1.0001^tick * 10^(decimals0-decimals1)\n *\n * This adjusts for the different decimals of the two tokens in the pair.\n *\n * @param tick - The tick value\n * @param decimals0 - Decimals of token0\n * @param decimals1 - Decimals of token1\n * @param precision - Number of decimal places to display\n * @returns Formatted price string\n *\n * @example\n * ```typescript\n * // WETH/USDC pool (18 decimals / 6 decimals)\n * // At tick ~200000, price is roughly $2000 per ETH\n * tickToPriceDecimalScaled(200000n, 18n, 6n, 2n) // \"2000.00\" (approximately)\n *\n * // For token1/token0 price, swap the decimals\n * tickToPriceDecimalScaled(200000n, 6n, 18n, 6n) // \"0.000500\" (approximately)\n * ```\n */\nexport function tickToPriceDecimalScaled(\n tick: bigint,\n decimals0: bigint,\n decimals1: bigint,\n precision: bigint,\n): string {\n const rawRatio = getRawPriceRatio(tick)\n const { numerator, denominator } = adjustRatioForDecimals(\n rawRatio.numerator,\n rawRatio.denominator,\n decimals0,\n decimals1,\n )\n\n return formatRatio(numerator, denominator, precision)\n}\n\n/**\n * Convert a sqrtPriceX96 to a human-readable price with decimal scaling.\n *\n * Uses the formula: price = (sqrtPriceX96^2 / 2^192) * 10^(decimals0-decimals1)\n *\n * @param sqrtPriceX96 - The sqrt price in Q64.96 format\n * @param decimals0 - Decimals of token0\n * @param decimals1 - Decimals of token1\n * @param precision - Number of decimal places to display\n * @returns Formatted price string\n *\n * @example\n * ```typescript\n * sqrtPriceX96ToPriceDecimalScaled(2n ** 96n, 18n, 18n, 2n) // \"1.00\"\n * ```\n */\nexport function sqrtPriceX96ToPriceDecimalScaled(\n sqrtPriceX96: bigint,\n decimals0: bigint,\n decimals1: bigint,\n precision: bigint,\n): string {\n const rawRatio = getPriceRatioFromSqrtPriceX96(sqrtPriceX96)\n const { numerator, denominator } = adjustRatioForDecimals(\n rawRatio.numerator,\n rawRatio.denominator,\n decimals0,\n decimals1,\n )\n\n return formatRatio(numerator, denominator, precision)\n}\n\n/**\n * Convert a price to a tick value.\n *\n * @param price - The price string\n * @param decimals0 - Decimals of token0\n * @param decimals1 - Decimals of token1\n * @returns The tick value (rounded to nearest integer)\n *\n * @example\n * ```typescript\n * // WETH/USDC: What tick for $2000 per ETH?\n * priceToTick(\"2000\", 18n, 6n) // ~200000n\n *\n * // Inverse: What tick for 0.0005 ETH per USDC?\n * priceToTick(\"0.0005\", 6n, 18n) // ~200000n\n * ```\n */\nexport function priceToTick(price: string, decimals0: bigint, decimals1: bigint): bigint {\n const parsed = parseDecimalToFraction(price)\n if (parsed.numerator <= 0n) {\n throw new Error('Price must be positive')\n }\n\n let targetNumerator = parsed.numerator\n let targetDenominator = parsed.denominator\n\n const diff = decimals0 - decimals1\n if (diff > 0n) {\n targetDenominator *= pow10(diff)\n } else if (diff < 0n) {\n targetNumerator *= pow10(-diff)\n }\n\n let low = MIN_TICK\n let high = MAX_TICK\n\n while (low <= high) {\n const mid = (low + high) / 2n\n const { numerator, denominator } = getRawPriceRatio(mid)\n const cmp = compareRatios(numerator, denominator, targetNumerator, targetDenominator)\n\n if (cmp === 0) {\n return mid\n }\n\n if (cmp < 0) {\n low = mid + 1n\n } else {\n high = mid - 1n\n }\n }\n\n const floorTick = high\n const ceilTick = low\n\n if (floorTick < MIN_TICK) return MIN_TICK\n if (ceilTick > MAX_TICK) return MAX_TICK\n\n const floorRatio = getRawPriceRatio(floorTick)\n const ceilRatio = getRawPriceRatio(ceilTick)\n\n const floorDiffNumerator = absBigint(\n targetNumerator * floorRatio.denominator - floorRatio.numerator * targetDenominator,\n )\n const ceilDiffNumerator = absBigint(\n targetNumerator * ceilRatio.denominator - ceilRatio.numerator * targetDenominator,\n )\n const floorDiffDenominator = targetDenominator * floorRatio.denominator\n const ceilDiffDenominator = targetDenominator * ceilRatio.denominator\n\n return floorDiffNumerator * ceilDiffDenominator <= ceilDiffNumerator * floorDiffDenominator\n ? floorTick\n : ceilTick\n}\n\n/**\n * Convert a sqrtPriceX96 value to the nearest tick.\n *\n * @param sqrtPriceX96 - The sqrt price in Q64.96 format\n * @returns The tick value (rounded to nearest integer)\n *\n * @example\n * ```typescript\n * const tick = sqrtPriceX96ToTick(2n ** 96n) // 0n\n * ```\n */\nexport function sqrtPriceX96ToTick(sqrtPriceX96: bigint): bigint {\n if (sqrtPriceX96 <= 0n) {\n throw new Error('Sqrt price must be positive')\n }\n\n if (sqrtPriceX96 < MIN_SQRT_PRICE_X96 || sqrtPriceX96 > MAX_SQRT_PRICE_X96) {\n throw new RangeError('Sqrt price out of bounds')\n }\n\n let low = MIN_TICK\n let high = MAX_TICK\n\n while (low <= high) {\n const mid = (low + high) / 2n\n const midSqrt = tickToSqrtPriceX96(mid)\n\n if (midSqrt === sqrtPriceX96) {\n return mid\n }\n\n if (midSqrt < sqrtPriceX96) {\n low = mid + 1n\n } else {\n high = mid - 1n\n }\n }\n\n const floorTick = high\n const ceilTick = low\n\n if (floorTick < MIN_TICK) return MIN_TICK\n if (ceilTick > MAX_TICK) return MAX_TICK\n\n const floorSqrt = tickToSqrtPriceX96(floorTick)\n const ceilSqrt = tickToSqrtPriceX96(ceilTick)\n\n const floorDiff = absBigint(sqrtPriceX96 - floorSqrt)\n const ceilDiff = absBigint(ceilSqrt - sqrtPriceX96)\n\n return floorDiff <= ceilDiff ? floorTick : ceilTick\n}\n\n/**\n * Format a tick value for display.\n *\n * @param tick - The tick value\n * @returns Formatted tick string\n *\n * @example\n * ```typescript\n * formatTick(200000n) // \"200000\"\n * formatTick(-50000n) // \"-50000\"\n * ```\n */\nexport function formatTick(tick: bigint): string {\n return tick.toString()\n}\n\n/**\n * Get the price at a specific tick, returning both token0/token1 and token1/token0 prices.\n *\n * @param tick - The tick value\n * @param decimals0 - Decimals of token0\n * @param decimals1 - Decimals of token1\n * @param precision - Number of decimal places to display\n * @returns Object with both price directions\n *\n * @example\n * ```typescript\n * const prices = getPricesAtTick(200000n, 18n, 6n, 2n)\n * // prices.token0PerToken1 = \"0.00\" (very small)\n * // prices.token1PerToken0 = \"2000.00\" (USDC per ETH)\n * ```\n */\nexport function getPricesAtTick(\n tick: bigint,\n decimals0: bigint,\n decimals1: bigint,\n precision: bigint,\n): { token0PerToken1: string; token1PerToken0: string } {\n const rawRatio = getRawPriceRatio(tick)\n const adjustedRatio = adjustRatioForDecimals(\n rawRatio.numerator,\n rawRatio.denominator,\n decimals0,\n decimals1,\n )\n\n return {\n token0PerToken1: formatRatio(adjustedRatio.denominator, adjustedRatio.numerator, precision),\n token1PerToken0: formatRatio(adjustedRatio.numerator, adjustedRatio.denominator, precision),\n }\n}\n\n/**\n * Format a tick range for display.\n *\n * @param tickLower - Lower tick\n * @param tickUpper - Upper tick\n * @returns Formatted tick range string\n *\n * @example\n * ```typescript\n * formatTickRange(-50000n, 200000n) // \"-50000 - 200000\"\n * ```\n */\nexport function formatTickRange(tickLower: bigint, tickUpper: bigint): string {\n return `${tickLower} - ${tickUpper}`\n}\n\n/**\n * Format a price range for display.\n *\n * @param tickLower - Lower tick\n * @param tickUpper - Upper tick\n * @param decimals0 - Decimals of token0\n * @param decimals1 - Decimals of token1\n * @param precision - Number of decimal places to display\n * @returns Formatted price range string\n *\n * @example\n * ```typescript\n * formatPriceRange(0n, 0n, 18n, 18n, 2n) // \"1.00 - 1.00\"\n * ```\n */\nexport function formatPriceRange(\n tickLower: bigint,\n tickUpper: bigint,\n decimals0: bigint,\n decimals1: bigint,\n precision: bigint,\n): string {\n const lower = tickToPriceDecimalScaled(tickLower, decimals0, decimals1, precision)\n const upper = tickToPriceDecimalScaled(tickUpper, decimals0, decimals1, precision)\n return `${lower} - ${upper}`\n}\n\n/**\n * Calculate the tick spacing for a given fee tier.\n *\n * @param feeBps - Fee in basis points (e.g., 500n for 0.05%)\n * @returns Tick spacing\n *\n * @example\n * ```typescript\n * getTickSpacing(100n) // 1n (0.01% fee tier)\n * getTickSpacing(500n) // 10n (0.05% fee tier)\n * getTickSpacing(3000n) // 60n (0.30% fee tier)\n * getTickSpacing(10000n) // 200n (1.00% fee tier)\n * ```\n */\nexport function getTickSpacing(feeBps: bigint): bigint {\n // Standard Uniswap V3 tick spacings\n switch (feeBps) {\n case 100n:\n return 1n\n case 500n:\n return 10n\n case 3000n:\n return 60n\n case 10000n:\n return 200n\n default: {\n const spacing = feeBps / 50n\n return spacing > 1n ? spacing : 1n\n }\n }\n}\n\n/**\n * Round a tick to the nearest valid tick for a given tick spacing.\n *\n * @param tick - The tick to round\n * @param tickSpacing - The tick spacing\n * @returns Rounded tick\n *\n * @example\n * ```typescript\n * roundToTickSpacing(12345n, 10n) // 12340n\n * roundToTickSpacing(12345n, 60n) // 12360n\n * roundToTickSpacing(-12345n, 10n) // -12350n\n * ```\n */\nexport function roundToTickSpacing(tick: bigint, tickSpacing: bigint): bigint {\n const remainder = tick % tickSpacing\n if (remainder === 0n) {\n return tick\n }\n // Round to nearest\n if (tick >= 0n) {\n return remainder >= tickSpacing / 2n ? tick + (tickSpacing - remainder) : tick - remainder\n }\n\n const absRemainder = -remainder\n return absRemainder >= tickSpacing / 2n\n ? tick - (tickSpacing - absRemainder)\n : tick + absRemainder\n}\n\n/**\n * Result of {@link tickLimits}.\n */\nexport interface TickLimitsResult {\n /** Lower tick limit (clamped to MIN_TICK). */\n low: bigint\n /** Upper tick limit (clamped to MAX_TICK). */\n high: bigint\n}\n\n/**\n * Compute slippage-bounded tick limits around the current tick.\n *\n * 1 tick ≈ 1 basis point (0.01 %) of price change, so a `toleranceBps`\n * of 500 allows roughly 5 % price movement. The result is clamped to\n * the protocol's `[MIN_TICK, MAX_TICK]` range.\n *\n * Useful for setting `tickLimitLow` / `tickLimitHigh` on `openPosition`\n * and `closePosition` to protect against MEV sandwiches and volatile\n * tick moves.\n *\n * @param currentTick - The current pool tick (must be within [MIN_TICK, MAX_TICK]).\n * @param toleranceBps - Slippage tolerance in basis points (≈ ticks). Must be non-negative.\n * @returns Clamped `{ low, high }` tick limits.\n * @throws {RangeError} If `toleranceBps` is negative or `currentTick` is out of bounds.\n *\n * @example\n * ```typescript\n * const { low, high } = tickLimits(200_000n, 500n)\n * // low = 199_500n\n * // high = 200_500n\n *\n * await openPosition({ ..., tickLimitLow: low, tickLimitHigh: high })\n * ```\n */\nexport function tickLimits(currentTick: bigint, toleranceBps: bigint): TickLimitsResult {\n if (toleranceBps < 0n) {\n throw new RangeError(`toleranceBps must be non-negative, got ${toleranceBps}`)\n }\n if (currentTick < MIN_TICK || currentTick > MAX_TICK) {\n throw new RangeError(`currentTick ${currentTick} is out of bounds [${MIN_TICK}, ${MAX_TICK}]`)\n }\n\n const rawLow = currentTick - toleranceBps\n const rawHigh = currentTick + toleranceBps\n const low = rawLow < MIN_TICK ? MIN_TICK : rawLow\n const high = rawHigh > MAX_TICK ? MAX_TICK : rawHigh\n\n if (low > high) {\n throw new RangeError(\n `Computed tick limits are inverted: low ${low} > high ${high} (currentTick=${currentTick}, toleranceBps=${toleranceBps})`,\n )\n }\n\n return { low, high }\n}\n","/**\n * Pool read functions for the Panoptic v2 SDK.\n *\n * ## Same-Block Guarantee\n *\n * All dynamic data is fetched in a SINGLE multicall to ensure block consistency.\n * Per PLAN.md §6, immutable \"static prefetch\" data (addresses, decimals, symbols)\n * can be fetched separately and cached - it's not subject to same-block consistency.\n *\n * Functions accept an optional `poolMetadata` parameter containing pre-fetched\n * immutable addresses. If not provided, it will be fetched first (static prefetch).\n * Then ONE multicall fetches all dynamic data at the target block.\n *\n * @module v2/reads/pool\n */\n\nimport type { Address, PublicClient } from 'viem'\nimport { decodeAbiParameters, keccak256, zeroAddress } from 'viem'\n\nimport { collateralTrackerAbi, panopticPoolAbi, riskEngineAbi } from '../../../generated'\nimport { getBlockMeta } from '../clients/blockMeta'\nimport { tickToSqrtPriceX96 } from '../formatters/tick'\nimport type {\n BlockMeta,\n CollateralTracker,\n OracleState,\n Pool,\n PoolKey,\n RiskEngine,\n RiskParameters,\n Utilization,\n} from '../types'\n\n// ERC20 minimal ABI for token metadata\nconst erc20Abi = [\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [{ type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [{ type: 'uint8' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [{ type: 'string' }],\n stateMutability: 'view',\n },\n] as const\n\n/**\n * Immutable pool metadata that can be cached.\n * These values never change for a given pool, so they're exempt from\n * same-block consistency requirements (per PLAN.md \"Static Prefetches\" exception).\n */\nexport interface PoolMetadata {\n /** Pool key bytes */\n poolKeyBytes: `0x${string}`\n /** Pool ID */\n poolId: bigint\n /** Collateral tracker 0 address */\n collateralToken0Address: Address\n /** Collateral tracker 1 address */\n collateralToken1Address: Address\n /** Risk engine address */\n riskEngineAddress: Address\n /** Token 0 underlying asset address */\n token0Asset: Address\n /** Token 1 underlying asset address */\n token1Asset: Address\n /** Token 0 symbol */\n token0Symbol: string\n /** Token 1 symbol */\n token1Symbol: string\n /** Token 0 decimals */\n token0Decimals: bigint\n /** Token 1 decimals */\n token1Decimals: bigint\n /** Token 0 name */\n token0Name: string\n /** Token 1 name */\n token1Name: string\n /** Underlying pool ID (V3: pool address, V4: keccak256(poolKeyBytes)) */\n underlyingPoolId: string\n /** Whether this is a V4 pool (poolManager is non-zero) */\n isV4: boolean\n /** Tick spacing */\n tickSpacing: bigint\n}\n\n/**\n * Parameters for getPoolMetadata.\n */\nexport interface GetPoolMetadataParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n}\n\n/**\n * Fetch immutable pool metadata (addresses, symbols, decimals).\n * This data never changes for a given pool and can be cached indefinitely.\n *\n * This is the \"static prefetch\" per PLAN.md §6 - exempt from same-block consistency.\n *\n * @param params - The parameters\n * @returns Immutable pool metadata\n */\nexport async function getPoolMetadata(params: GetPoolMetadataParams): Promise<PoolMetadata> {\n const { client, poolAddress } = params\n\n // First call: get basic immutable pool data\n const basicResults = await client.multicall({\n contracts: [\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'poolKey',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'poolId',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken0',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken1',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'riskEngine',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'poolManager',\n },\n ],\n allowFailure: false,\n })\n\n const [\n poolKeyBytes,\n poolId,\n collateralToken0Address,\n collateralToken1Address,\n riskEngineAddress,\n poolManager,\n ] = basicResults\n\n // Second call: get underlying asset addresses from collateral trackers\n const assetResults = await client.multicall({\n contracts: [\n {\n address: collateralToken0Address,\n abi: collateralTrackerAbi,\n functionName: 'asset',\n },\n {\n address: collateralToken1Address,\n abi: collateralTrackerAbi,\n functionName: 'asset',\n },\n ],\n allowFailure: false,\n })\n\n const [token0Asset, token1Asset] = assetResults\n\n // Native ETH (address zero) has no ERC20 contract — use hardcoded metadata\n const NATIVE_ETH_ADDRESS = '0x0000000000000000000000000000000000000000'\n const isToken0Native = token0Asset.toLowerCase() === NATIVE_ETH_ADDRESS\n const isToken1Native = token1Asset.toLowerCase() === NATIVE_ETH_ADDRESS\n\n // Third call: get token metadata (symbols, decimals, names) — skip native ETH tokens\n const erc20Contracts = [\n ...(isToken0Native\n ? []\n : [\n { address: token0Asset, abi: erc20Abi, functionName: 'symbol' as const },\n { address: token0Asset, abi: erc20Abi, functionName: 'decimals' as const },\n { address: token0Asset, abi: erc20Abi, functionName: 'name' as const },\n ]),\n ...(isToken1Native\n ? []\n : [\n { address: token1Asset, abi: erc20Abi, functionName: 'symbol' as const },\n { address: token1Asset, abi: erc20Abi, functionName: 'decimals' as const },\n { address: token1Asset, abi: erc20Abi, functionName: 'name' as const },\n ]),\n ]\n\n const erc20Results =\n erc20Contracts.length > 0\n ? await client.multicall({ contracts: erc20Contracts, allowFailure: false })\n : []\n\n // Reconstruct metadata, inserting native ETH defaults where needed\n let resultIdx = 0\n const token0Symbol = isToken0Native ? 'ETH' : (erc20Results[resultIdx++] as string)\n const token0Decimals = isToken0Native ? 18 : (erc20Results[resultIdx++] as number)\n const token0Name = isToken0Native ? 'Ether' : (erc20Results[resultIdx++] as string)\n const token1Symbol = isToken1Native ? 'ETH' : (erc20Results[resultIdx++] as string)\n const token1Decimals = isToken1Native ? 18 : (erc20Results[resultIdx++] as number)\n const token1Name = isToken1Native ? 'Ether' : (erc20Results[resultIdx++] as string)\n\n // Derive underlyingPoolId and tickSpacing\n const isV4 = poolManager !== zeroAddress\n const parsedPoolKey = parsePoolKey(poolKeyBytes)\n const underlyingPoolId = isV4\n ? keccak256(poolKeyBytes)\n : decodeAbiParameters([{ type: 'address' }], poolKeyBytes)[0]\n\n return {\n poolKeyBytes,\n poolId,\n collateralToken0Address,\n collateralToken1Address,\n isV4,\n riskEngineAddress,\n token0Asset,\n token1Asset,\n token0Symbol,\n token1Symbol,\n token0Decimals: BigInt(token0Decimals),\n token1Decimals: BigInt(token1Decimals),\n token0Name,\n token1Name,\n underlyingPoolId,\n tickSpacing: parsedPoolKey.tickSpacing,\n }\n}\n\n/**\n * Parameters for getPool.\n */\nexport interface GetPoolParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Chain ID */\n chainId: bigint\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched pool metadata (for caching/optimization) */\n poolMetadata?: PoolMetadata\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get full pool data including both collateral trackers and oracle state.\n *\n * ## Same-Block Guarantee\n * All dynamic data is fetched in ONE multicall at the target block.\n * Static metadata (addresses, symbols, decimals) is either provided via\n * poolMetadata or fetched separately (static prefetch exception).\n *\n * @param params - The parameters\n * @returns Pool data with block metadata\n */\nexport async function getPool(params: GetPoolParams): Promise<Pool> {\n const { client, poolAddress, chainId, blockNumber, poolMetadata } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get static metadata (either from cache or fetch it)\n const metadata = poolMetadata ?? (await getPoolMetadata({ client, poolAddress }))\n\n // SINGLE multicall for ALL dynamic data - ensures same-block consistency\n const [dynamicResults, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n // Pool dynamic state\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'getCurrentTick',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'isSafeMode',\n },\n // Token 0 collateral tracker dynamic data\n {\n address: metadata.collateralToken0Address,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n {\n address: metadata.collateralToken0Address,\n abi: collateralTrackerAbi,\n functionName: 'totalSupply',\n },\n {\n address: metadata.collateralToken0Address,\n abi: collateralTrackerAbi,\n functionName: 'interestRate',\n },\n // Token 1 collateral tracker dynamic data\n {\n address: metadata.collateralToken1Address,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n {\n address: metadata.collateralToken1Address,\n abi: collateralTrackerAbi,\n functionName: 'totalSupply',\n },\n {\n address: metadata.collateralToken1Address,\n abi: collateralTrackerAbi,\n functionName: 'interestRate',\n },\n // Risk engine parameters (technically immutable but included for completeness)\n {\n address: metadata.riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'SELLER_COLLATERAL_RATIO',\n },\n {\n address: metadata.riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'MAINT_MARGIN_RATE',\n },\n {\n address: metadata.riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'NOTIONAL_FEE',\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [\n currentTick,\n safeModeRaw,\n token0PoolData,\n token0TotalSupply,\n token0InterestRate,\n token1PoolData,\n token1TotalSupply,\n token1InterestRate,\n sellerCollateralRatio,\n maintMarginRate,\n notionalFee,\n ] = dynamicResults\n\n // Parse pool key\n const poolKey = parsePoolKey(metadata.poolKeyBytes)\n\n // Annualize rates: interestRate() returns WAD/s, multiply by seconds/year\n const SECONDS_PER_YEAR = 31_536_000n\n const borrowRate0 = BigInt(token0InterestRate) * SECONDS_PER_YEAR\n const borrowRate1 = BigInt(token1InterestRate) * SECONDS_PER_YEAR\n const utilization0 = token0PoolData[3]\n const utilization1 = token1PoolData[3]\n // Supply rate = borrow rate * utilization (utilization is in bps, so /10000)\n const supplyRate0 = (borrowRate0 * utilization0) / 10000n\n const supplyRate1 = (borrowRate1 * utilization1) / 10000n\n\n // Build collateral trackers\n const collateralTracker0: CollateralTracker = {\n address: metadata.collateralToken0Address,\n token: metadata.token0Asset,\n symbol: metadata.token0Symbol,\n decimals: metadata.token0Decimals,\n totalAssets: token0PoolData[0], // depositedAssets\n insideAMM: token0PoolData[1],\n creditedShares: token0PoolData[2],\n totalShares: token0TotalSupply,\n utilization: utilization0,\n borrowRate: borrowRate0,\n supplyRate: supplyRate0,\n }\n\n const collateralTracker1: CollateralTracker = {\n address: metadata.collateralToken1Address,\n token: metadata.token1Asset,\n symbol: metadata.token1Symbol,\n decimals: metadata.token1Decimals,\n totalAssets: token1PoolData[0], // depositedAssets\n insideAMM: token1PoolData[1],\n creditedShares: token1PoolData[2],\n totalShares: token1TotalSupply,\n utilization: utilization1,\n borrowRate: borrowRate1,\n supplyRate: supplyRate1,\n }\n\n // Build risk engine\n const riskEngine: RiskEngine = {\n address: metadata.riskEngineAddress,\n collateralRequirement: sellerCollateralRatio,\n maintenanceMargin: maintMarginRate,\n commissionRate: BigInt(notionalFee),\n }\n\n // Determine health status based on safe mode\n const healthStatus = safeModeRaw === 0 ? 'active' : safeModeRaw === 1 ? 'low_liquidity' : 'paused'\n\n // sqrtPriceX96 from tick\n const sqrtPriceX96 = tickToSqrtPriceX96(BigInt(currentTick))\n\n return {\n address: poolAddress,\n chainId,\n poolId: metadata.poolId,\n poolKey,\n collateralTracker0,\n collateralTracker1,\n riskEngine,\n currentTick: BigInt(currentTick),\n sqrtPriceX96,\n healthStatus,\n metadata,\n _meta,\n }\n}\n\n/**\n * Parameters for getUtilization.\n */\nexport interface GetUtilizationParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched collateral tracker addresses (for caching/optimization) */\n collateralAddresses?: {\n collateralToken0: Address\n collateralToken1: Address\n }\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get current pool utilization for both tokens.\n *\n * ## Same-Block Guarantee\n * All dynamic data is fetched in ONE multicall at the target block.\n * Collateral tracker addresses are either provided or fetched separately (static prefetch).\n *\n * @param params - The parameters\n * @returns Utilization data with block metadata\n */\nexport async function getUtilization(params: GetUtilizationParams): Promise<Utilization> {\n const { client, poolAddress, blockNumber, collateralAddresses } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get collateral tracker addresses (static prefetch if not provided)\n let collateralToken0: Address\n let collateralToken1: Address\n\n if (collateralAddresses) {\n collateralToken0 = collateralAddresses.collateralToken0\n collateralToken1 = collateralAddresses.collateralToken1\n } else {\n // Static prefetch - addresses are immutable\n const addressResults = await client.multicall({\n contracts: [\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken0',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken1',\n },\n ],\n allowFailure: false,\n })\n collateralToken0 = addressResults[0]\n collateralToken1 = addressResults[1]\n }\n\n // SINGLE multicall for ALL dynamic data - ensures same-block consistency\n const [poolDataResults, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n {\n address: collateralToken0,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n {\n address: collateralToken1,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [poolData0, poolData1] = poolDataResults\n\n return {\n utilization0: poolData0[3], // currentPoolUtilization\n utilization1: poolData1[3],\n _meta,\n }\n}\n\n/**\n * Parameters for getOracleState.\n */\nexport interface GetOracleStateParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get current oracle state from the pool.\n *\n * ## Same-Block Guarantee\n * Single contract call + block meta fetch at the same block.\n *\n * @param params - The parameters\n * @returns Oracle state with block metadata\n */\nexport async function getOracleState(params: GetOracleStateParams): Promise<OracleState> {\n const { client, poolAddress, blockNumber } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Single call for oracle data - already same-block consistent\n const [oracleTicks, _meta] = await Promise.all([\n client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'getOracleTicks',\n blockNumber: targetBlockNumber,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n // oracleTicks returns: currentTick, spotTick, medianTick, latestTick, oraclePack\n const [currentTick, spotTick, medianTick, latestTick, oraclePack] = oracleTicks\n\n // Parse oracle pack to extract EMA values and other data\n // OraclePack structure is protocol-specific, extracting what we can\n const epoch = (oraclePack >> 208n) & ((1n << 32n) - 1n)\n const lastUpdateTimestamp = (oraclePack >> 176n) & ((1n << 32n) - 1n)\n const lockMode = (oraclePack >> 240n) & ((1n << 8n) - 1n)\n\n return {\n epoch,\n lastUpdateTimestamp,\n referenceTick: BigInt(currentTick),\n spotEMA: BigInt(spotTick),\n fastEMA: BigInt(latestTick), // Using latestTick as fast EMA approximation\n slowEMA: BigInt(medianTick), // Using medianTick as slow EMA approximation\n eonsEMA: 0n, // Not directly available from getOracleTicks\n lockMode,\n medianTick: BigInt(medianTick),\n _meta,\n }\n}\n\n/**\n * Parameters for getRiskParameters.\n */\nexport interface GetRiskParametersParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Builder code (default: 0) */\n builderCode?: bigint\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched risk engine address (for caching/optimization) */\n riskEngineAddress?: Address\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get risk parameters from the pool.\n *\n * ## Same-Block Guarantee\n * All dynamic data is fetched in ONE multicall at the target block.\n * Risk engine address is either provided or fetched separately (static prefetch).\n *\n * @param params - The parameters\n * @returns Risk parameters with block metadata\n */\nexport async function getRiskParameters(params: GetRiskParametersParams): Promise<RiskParameters> {\n const {\n client,\n poolAddress,\n builderCode = 0n,\n blockNumber,\n riskEngineAddress: providedAddress,\n } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get risk engine address (static prefetch if not provided)\n const riskEngineAddress =\n providedAddress ??\n (await client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'riskEngine',\n }))\n\n // SINGLE multicall for ALL risk parameters - ensures same-block consistency\n const [riskEngineResults, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n {\n address: riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'SELLER_COLLATERAL_RATIO',\n },\n {\n address: riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'BUYER_COLLATERAL_RATIO',\n },\n {\n address: riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'MAINT_MARGIN_RATE',\n },\n {\n address: riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'NOTIONAL_FEE',\n },\n {\n address: riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'TARGET_POOL_UTIL',\n },\n {\n address: riskEngineAddress,\n abi: riskEngineAbi,\n functionName: 'SATURATED_POOL_UTIL',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'getRiskParameters',\n args: [builderCode],\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [\n sellerCollateralRatio,\n buyerCollateralRatio,\n maintMarginRate,\n notionalFee,\n targetPoolUtil,\n saturatedPoolUtil,\n ,\n ] = riskEngineResults\n\n return {\n collateralRequirement: sellerCollateralRatio,\n maintenanceMargin: maintMarginRate,\n commissionRate: BigInt(notionalFee),\n targetUtilization: targetPoolUtil,\n saturatedUtilization: saturatedPoolUtil,\n itmSpreadMultiplier: buyerCollateralRatio, // Using buyer ratio as ITM multiplier\n _meta,\n }\n}\n\n/**\n * Parse pool key from ABI-encoded bytes.\n * PoolKey struct is ABI-encoded as 5 consecutive 32-byte slots:\n * Slot 0: currency0 (address, right-padded)\n * Slot 1: currency1 (address, right-padded)\n * Slot 2: fee (uint24, right-padded)\n * Slot 3: tickSpacing (int24, right-padded)\n * Slot 4: hooks (address, right-padded)\n */\nfunction parsePoolKey(poolKeyBytes: `0x${string}`): PoolKey {\n // Remove 0x prefix and decode\n const hex = poolKeyBytes.slice(2)\n\n // Each slot is 64 hex chars (32 bytes)\n // Addresses are in the last 40 hex chars (20 bytes) of their slot\n // Numeric values can be parsed from the full 64 hex chars of their slot\n const currency0 = `0x${hex.slice(24, 64)}` as Address // Slot 0: chars 0-64, address at 24-64\n const currency1 = `0x${hex.slice(88, 128)}` as Address // Slot 1: chars 64-128, address at 88-128\n const fee = BigInt(`0x${hex.slice(128, 192)}`) // Slot 2: chars 128-192 (full slot)\n const tickSpacing = BigInt(`0x${hex.slice(192, 256)}`) // Slot 3: chars 192-256 (full slot)\n const hooks = `0x${hex.slice(280, 320)}` as Address // Slot 4: chars 256-320, address at 280-320\n\n return {\n currency0,\n currency1,\n fee,\n tickSpacing,\n hooks,\n }\n}\n\n/**\n * Parameters for fetchPoolId.\n */\nexport interface FetchPoolIdParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n}\n\n/**\n * Result of fetchPoolId, including block metadata for same-block consistency.\n */\nexport interface FetchPoolIdResult {\n /** The encoded 64-bit pool ID */\n poolId: bigint\n /** Block metadata from the pinned read */\n _meta: BlockMeta\n}\n\n/**\n * Fetch the encoded 64-bit pool ID from a PanopticPool contract.\n *\n * Use this when you need the poolId without fetching the full pool state.\n * The returned poolId can be passed directly to `createTokenIdBuilder()`.\n * The read is pinned to the latest block at call time.\n *\n * @param params - The parameters\n * @returns The pool ID and block metadata\n */\nexport async function fetchPoolId(params: FetchPoolIdParams): Promise<FetchPoolIdResult> {\n const { client, poolAddress } = params\n\n const block = await client.getBlock({ blockTag: 'latest' })\n\n const poolId = await client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'poolId',\n blockNumber: block.number,\n })\n\n return {\n poolId,\n _meta: {\n blockNumber: block.number,\n blockTimestamp: block.timestamp,\n blockHash: block.hash,\n },\n }\n}\n\nexport { tickToSqrtPriceX96 }\n","/**\n * Client-side greeks for the Panoptic v2 SDK.\n *\n * All functions accept bigint inputs (ticks, sizes) and return bigint values\n * in the natural token units — no artificial WAD scaling. The tick-based price\n * (1.0001^tick) naturally encodes the decimal conversion between tokens.\n *\n * Uses pure sqrtPriceX96 arithmetic for exact on-chain fidelity with PanopticQuery.\n * All intermediate calculations keep X96/X192 precision until final scaling.\n *\n * - Value: in numeraire token smallest units (e.g., USDC wei if numeraire is USDC)\n * - Delta: in asset token smallest units (e.g., WETH wei if asset is WETH)\n * - Gamma (dollar-gamma): in numeraire token smallest units\n *\n * @module v2/greeks\n */\n\nimport { tickToSqrtPriceX96 } from '../formatters/tick'\nimport type { TokenIdLeg } from '../types'\n\n// --- Internal Helpers ---\n\n/** Fixed-point scale constants for sqrtPriceX96 arithmetic */\nconst Q96 = 1n << 96n\nconst Q192 = 1n << 192n\n\n/**\n * Convert tick to quote-denominated tick based on asset direction.\n *\n * When isAssetToken0 = true (asset is token0, numeraire is token1):\n * - Tick already encodes price as token1/token0 (numeraire per asset)\n * - Return tick unchanged\n *\n * When isAssetToken0 = false (asset is token1, numeraire is token0):\n * - Tick encodes price as token1/token0, but we need token0/token1 (numeraire per asset)\n * - Invert by negating: 1/price = 1.0001^(-tick)\n */\nfunction quoteTick(tick: bigint, isAssetToken0: boolean): bigint {\n return isAssetToken0 ? tick : -tick\n}\n\n/**\n * Divide with truncation toward zero (matches Solidity division behavior).\n *\n * JavaScript bigint division uses floor (toward negative infinity), but Solidity\n * truncates toward zero. For on-chain fidelity, we must match Solidity.\n *\n * Example:\n * - Solidity: -7 / 2 = -3 (truncate toward zero)\n * - JS bigint: -7n / 2n = -4n (floor toward -∞)\n * - This function: divTrunc(-7n, 2n) = -3n ✓\n */\nfunction divTrunc(numerator: bigint, denominator: bigint): bigint {\n if (denominator === 0n) return 0n\n\n const quotient = numerator / denominator\n const remainder = numerator % denominator\n\n // If signs differ and there's a remainder, JS floored when we need to truncate\n // Add 1 to move toward zero\n if (numerator < 0n !== denominator < 0n && remainder !== 0n) {\n return quotient + 1n\n }\n\n return quotient\n}\n\n/** Resolve isAssetToken0: optional assetIndex overrides leg.asset */\nfunction resolveAssetDirection(leg: Pick<TokenIdLeg, 'asset'>, assetIndex?: bigint): boolean {\n return assetIndex !== undefined ? assetIndex === 0n : leg.asset === 0n\n}\n\n/**\n * Calculate value for a width=0 (loan/credit) leg.\n * Width=0 means the range is a single tick (the strike), so there's no meaningful\n * \"in range\" — we use the below/above formulas which avoid division by (r-1)=0.\n */\nfunction getLegValueWidth0(\n leg: TokenIdLeg,\n m: bigint,\n qCurrentTick: bigint,\n qStrikeTick: bigint,\n qMintTick: bigint,\n isAssetToken0: boolean,\n definedRisk: boolean,\n): bigint {\n // Base value: below or above strike\n let v: bigint\n if (qCurrentTick <= qStrikeTick) {\n // At or below strike: v = m * P\n const sqrtP = tickToSqrtPriceX96(qCurrentTick)\n const PX192 = sqrtP * sqrtP\n v = divTrunc(m * PX192, Q192)\n } else {\n // Above strike: v = m * K\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const KX192 = sqrtK * sqrtK\n v = divTrunc(m * KX192, Q192)\n }\n\n const debt = -m\n const isPut = !isCall(leg.tokenType, isAssetToken0)\n\n // ITM adjustment: width=0 means range is a point, so mint tick is either below or above\n let itm: bigint\n if (isPut) {\n if (qMintTick <= qStrikeTick) {\n // Below or at strike: itm = (K - Pm) * m\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const KX192 = sqrtK * sqrtK\n const PmX192 = sqrtPm * sqrtPm\n itm = divTrunc(m * (KX192 - PmX192), Q192)\n } else {\n itm = 0n\n }\n } else {\n if (qMintTick <= qStrikeTick) {\n itm = 0n\n } else {\n // Above strike: itm = (1 - K/Pm) * m\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const KX192 = sqrtK * sqrtK\n const PmX192 = sqrtPm * sqrtPm\n itm = divTrunc(m * (PmX192 - KX192), PmX192)\n }\n }\n\n // Final result\n if (isPut) {\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const KX192 = sqrtK * sqrtK\n const debtK = divTrunc(debt * KX192, Q192)\n return debtK + v + itm\n } else {\n const sqrtP = tickToSqrtPriceX96(qCurrentTick)\n const PX192 = sqrtP * sqrtP\n const debtP = divTrunc(debt * PX192, Q192)\n\n if (definedRisk) {\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const PmX192 = sqrtPm * sqrtPm\n const itmPm = divTrunc(itm * PmX192, Q192)\n return debtP + v + itmPm\n } else {\n const itmP = divTrunc(itm * PX192, Q192)\n return debtP + v + itmP\n }\n }\n}\n\n// --- Public Helpers ---\n\n/**\n * Check if leg is a call option (vs put).\n *\n * A call is when the leg moves the asset token:\n * - If asset is token0: call when tokenType=0\n * - If asset is token1: call when tokenType=1\n */\nexport function isCall(tokenType: bigint, isAssetToken0: boolean): boolean {\n return isAssetToken0 ? tokenType === 0n : tokenType === 1n\n}\n\n/**\n * Check if position has defined risk (is a spread).\n *\n * A position is defined risk if it has 2+ legs of the same tokenType\n * with both long and short exposure.\n */\nexport function isDefinedRisk(legs: Pick<TokenIdLeg, 'tokenType' | 'isLong'>[]): boolean {\n if (legs.length < 2) return false\n\n for (const tt of [0n, 1n]) {\n const group = legs.filter((l) => l.tokenType === tt)\n if (group.length >= 2 && group.some((l) => l.isLong) && group.some((l) => !l.isLong)) {\n return true\n }\n }\n return false\n}\n\n// --- Per-Leg Greeks ---\n\n/**\n * Calculate the value of a single leg.\n *\n * Value represents the current P&L of the position in numeraire token units.\n * Combines base value (from Panoptic's piecewise formula), debt, and ITM adjustment.\n *\n * Uses sqrtPriceX96 for all calculations to maintain precision and on-chain fidelity.\n *\n * @param leg - The leg to calculate\n * @param currentTick - Current pool tick\n * @param mintTick - Tick at position mint\n * @param positionSize - Position size in asset token smallest units\n * @param poolTickSpacing - Pool tick spacing\n * @param definedRisk - Whether position is defined risk\n * @param assetIndex - Optional override for leg.asset (0n = token0 is asset, 1n = token1)\n * @returns Leg value in numeraire token smallest units\n */\nexport function getLegValue(\n leg: TokenIdLeg,\n currentTick: bigint,\n mintTick: bigint,\n positionSize: bigint,\n poolTickSpacing: bigint,\n definedRisk: boolean,\n assetIndex?: bigint,\n): bigint {\n const isAssetToken0 = resolveAssetDirection(leg, assetIndex)\n const qCurrentTick = quoteTick(currentTick, isAssetToken0)\n const qMintTick = quoteTick(mintTick, isAssetToken0)\n const qStrikeTick = quoteTick(leg.strike, isAssetToken0)\n const halfWidthTick = (leg.width * poolTickSpacing) / 2n\n\n const m = leg.isLong ? -(positionSize * leg.optionRatio) : positionSize * leg.optionRatio\n\n // Width=0 (loans/credits): single-tick position, no range to integrate over.\n // Use below/above-range formulas directly to avoid divide-by-zero in the in-range branch.\n if (halfWidthTick === 0n) {\n return getLegValueWidth0(\n leg,\n m,\n qCurrentTick,\n qStrikeTick,\n qMintTick,\n isAssetToken0,\n definedRisk,\n )\n }\n\n // Compute base value: v = f(P, K, r) from Panoptic's piecewise formula\n let v: bigint\n\n if (qCurrentTick < qStrikeTick - halfWidthTick) {\n // Below range: v = m * P\n const sqrtP = tickToSqrtPriceX96(qCurrentTick)\n const PX192 = sqrtP * sqrtP\n v = divTrunc(m * PX192, Q192)\n } else if (qCurrentTick > qStrikeTick + halfWidthTick) {\n // Above range: v = m * K\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const KX192 = sqrtK * sqrtK\n v = divTrunc(m * KX192, Q192)\n } else {\n // In range: v = m * (2*sqrt(P*K*r) - P - K) / (r - 1)\n const sqrtP = tickToSqrtPriceX96(qCurrentTick)\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const sqrtPKR = tickToSqrtPriceX96(qCurrentTick + qStrikeTick + halfWidthTick)\n const sqrtR = tickToSqrtPriceX96(halfWidthTick)\n\n const PX192 = sqrtP * sqrtP\n const KX192 = sqrtK * sqrtK\n const rX192 = sqrtR * sqrtR\n\n // v = m * (2*sqrtPKR/2^96 - PX192/2^192 - KX192/2^192) / ((rX192 - 2^192)/2^192)\n // = m * (2*sqrtPKR*2^96 - PX192 - KX192) / (rX192 - 2^192)\n const numerator = m * (2n * sqrtPKR * Q96 - PX192 - KX192)\n const denominator = rX192 - Q192\n v = divTrunc(numerator, denominator)\n }\n\n const debt = -m\n const isPut = !isCall(leg.tokenType, isAssetToken0)\n\n // Compute ITM adjustment (differs for puts vs calls)\n let itm: bigint\n\n if (isPut) {\n // Put ITM adjustment\n if (qMintTick < qStrikeTick - halfWidthTick) {\n // Below range: itm = (K - Pm) * m\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const KX192 = sqrtK * sqrtK\n const PmX192 = sqrtPm * sqrtPm\n itm = divTrunc(m * (KX192 - PmX192), Q192)\n } else if (qMintTick > qStrikeTick + halfWidthTick) {\n // Above range: itm = 0\n itm = 0n\n } else {\n // In range: itm = m * (sqrt(K*r) - sqrt(Pm))^2 / (r - 1)\n const sqrtKR = tickToSqrtPriceX96(qStrikeTick + halfWidthTick)\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const sqrtR = tickToSqrtPriceX96(halfWidthTick)\n const rX192 = sqrtR * sqrtR\n\n const diff = sqrtKR - sqrtPm // X96\n const diffSqX192 = diff * diff // X192\n itm = divTrunc(m * diffSqX192, rX192 - Q192)\n }\n } else {\n // Call ITM adjustment\n if (qMintTick < qStrikeTick - halfWidthTick) {\n // Below range: itm = 0\n itm = 0n\n } else if (qMintTick > qStrikeTick + halfWidthTick) {\n // Above range: itm = (1 - K/Pm) * m\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const KX192 = sqrtK * sqrtK\n const PmX192 = sqrtPm * sqrtPm\n itm = divTrunc(m * (PmX192 - KX192), PmX192)\n } else {\n // In range: itm = m * (sqrt(r) - sqrt(K/Pm))^2 / (r - 1)\n const sqrtR = tickToSqrtPriceX96(halfWidthTick)\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const rX192 = sqrtR * sqrtR\n\n // sqrt(K/Pm) in X96 = sqrtK * 2^96 / sqrtPm\n const sqrtKPmX96 = divTrunc(sqrtK * Q96, sqrtPm)\n const diff = sqrtR - sqrtKPmX96 // X96\n const diffSqX192 = diff * diff // X192\n itm = divTrunc(m * diffSqX192, rX192 - Q192)\n }\n }\n\n // Compute final result based on option type\n if (isPut) {\n // Put: result = debt * K + v + itm\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const KX192 = sqrtK * sqrtK\n const debtK = divTrunc(debt * KX192, Q192)\n return debtK + v + itm\n } else {\n // Call: result = debt*P + v + itm*Pm (if defined risk) or debt*P + v + itm*P (if not)\n const sqrtP = tickToSqrtPriceX96(qCurrentTick)\n const PX192 = sqrtP * sqrtP\n const debtP = divTrunc(debt * PX192, Q192)\n\n if (definedRisk) {\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const PmX192 = sqrtPm * sqrtPm\n const itmPm = divTrunc(itm * PmX192, Q192)\n return debtP + v + itmPm\n } else {\n const itmP = divTrunc(itm * PX192, Q192)\n return debtP + v + itmP\n }\n }\n}\n\n/**\n * Calculate the delta of a single leg.\n *\n * Delta is the rate of change of position value with respect to price.\n * For puts: delta = vDelta\n * For calls: delta = debtDelta + vDelta + itmDelta (if not defined risk)\n *\n * Uses sqrtPriceX96 for all price calculations to maintain precision.\n *\n * @param leg - The leg to calculate\n * @param currentTick - Current pool tick\n * @param positionSize - Position size in asset token smallest units\n * @param poolTickSpacing - Pool tick spacing\n * @param mintTick - Tick at mint (optional, for ITM adjustment)\n * @param definedRisk - Whether position is defined risk\n * @param assetIndex - Optional override for leg.asset (0n = token0 is asset, 1n = token1)\n * @returns Leg delta in asset token smallest units\n */\nexport function getLegDelta(\n leg: TokenIdLeg,\n currentTick: bigint,\n positionSize: bigint,\n poolTickSpacing: bigint,\n mintTick: bigint | undefined,\n definedRisk: boolean,\n assetIndex?: bigint,\n): bigint {\n const isAssetToken0 = resolveAssetDirection(leg, assetIndex)\n const qCurrentTick = quoteTick(currentTick, isAssetToken0)\n const qStrikeTick = quoteTick(leg.strike, isAssetToken0)\n const halfWidthTick = (leg.width * poolTickSpacing) / 2n\n\n const m = leg.isLong ? -(positionSize * leg.optionRatio) : positionSize * leg.optionRatio\n\n // True loan/credit: leg.width === 0n (not just halfWidth rounding to 0).\n // Debt-side exposure only — no option-like piecewise formula.\n if (leg.width === 0n) {\n const borrowsAsset = isAssetToken0 ? leg.tokenType === 0n : leg.tokenType === 1n\n return borrowsAsset ? -m : 0n\n }\n\n // Narrow option whose halfWidth rounds to 0: use option-like width=0 branch\n if (halfWidthTick === 0n) {\n const vDelta = qCurrentTick <= qStrikeTick ? m : 0n\n const isPut = !isCall(leg.tokenType, isAssetToken0)\n if (isPut) return vDelta\n\n // Call: add debt delta and ITM delta (same as normal path but no in-range branch)\n const debtDelta = -m\n let itmDelta = 0n\n if (mintTick !== undefined && !definedRisk) {\n const qMintTick = quoteTick(mintTick, isAssetToken0)\n if (qMintTick > qStrikeTick) {\n const sqrtPm = tickToSqrtPriceX96(qMintTick)\n const sqrtK = tickToSqrtPriceX96(qStrikeTick)\n const PmX192 = sqrtPm * sqrtPm\n const KX192 = sqrtK * sqrtK\n itmDelta = divTrunc((PmX192 - KX192) * m, PmX192)\n }\n }\n return definedRisk ? debtDelta + vDelta : debtDelta + vDelta + itmDelta\n }\n\n // Compute vDelta: derivative of value with respect to price\n // vDelta = P < lo ? m : P > hi ? 0 : (m * (sqrt(K*r)/sqrt(P) - 1)) / (r - 1)\n let vDelta: bigint\n\n if (qCurrentTick < qStrikeTick - halfWidthTick) {\n // Below range: vDelta = m\n vDelta = m\n } else if (qCurrentTick > qStrikeTick + halfWidthTick) {\n // Above range: vDelta = 0\n vDelta = 0n\n } else {\n // In range: vDelta = m * (sqrt(K*r) - sqrt(P)) / (sqrt(P) * (r - 1))\n const sqrtP = tickToSqrtPriceX96(qCurrentTick) // X96\n const sqrtKR = tickToSqrtPriceX96(qStrikeTick + halfWidthTick) // sqrt(K*r) in X96\n const sqrtR = tickToSqrtPriceX96(halfWidthTick) // X96\n const rX192 = sqrtR * sqrtR // X192\n\n // vDelta = m * (sqrtKR - sqrtP)/2^96 / (sqrtP/2^96 * (rX192 - 2^192)/2^192)\n // = m * (sqrtKR - sqrtP) * 2^192 / (sqrtP * (rX192 - 2^192))\n const numerator = m * (sqrtKR - sqrtP) * Q192\n const denominator = sqrtP * (rX192 - Q192)\n vDelta = divTrunc(numerator, denominator)\n }\n\n const isPut = !isCall(leg.tokenType, isAssetToken0)\n\n if (isPut) {\n return vDelta\n }\n\n // Call: add debt delta and ITM delta\n const debtDelta = -m\n\n const itmDelta =\n mintTick === undefined\n ? 0n\n : (() => {\n const qMintTick = quoteTick(mintTick, isAssetToken0)\n\n if (qMintTick < qStrikeTick - halfWidthTick) {\n // Below range: itmDelta = 0\n return 0n\n } else if (qMintTick > qStrikeTick + halfWidthTick) {\n // Above range: itmDelta = (1 - K/Pm) * m = (Pm - K) * m / Pm\n const sqrtPm = tickToSqrtPriceX96(qMintTick) // X96\n const sqrtK = tickToSqrtPriceX96(qStrikeTick) // X96\n const PmX192 = sqrtPm * sqrtPm // X192\n const KX192 = sqrtK * sqrtK // X192\n\n // itmDelta = (1 - K/Pm) * m = (PmX192 - KX192) * m / PmX192\n return divTrunc((PmX192 - KX192) * m, PmX192)\n } else {\n // In range: itmDelta = m * (sqrt(r) - sqrt(K/Pm))^2 / (r - 1)\n const sqrtR = tickToSqrtPriceX96(halfWidthTick) // X96\n const sqrtK = tickToSqrtPriceX96(qStrikeTick) // X96\n const sqrtPm = tickToSqrtPriceX96(qMintTick) // X96\n const rX192 = sqrtR * sqrtR // X192\n\n // sqrt(K/Pm) = sqrtK / sqrtPm (both X96, so scale cancels)\n // But we need (sqrt(r) - sqrt(K/Pm))^2, so work in X96:\n // sqrtKPm = sqrt(K/Pm) in X96 = sqrtK * 2^96 / sqrtPm\n const sqrtKPmX96 = (sqrtK * Q96) / sqrtPm // X96\n\n // (sqrt(r) - sqrt(K/Pm))^2 = (sqrtR - sqrtKPmX96)^2 / 2^192\n const diff = sqrtR - sqrtKPmX96 // X96\n const diffSqX192 = diff * diff // X192\n\n // itmDelta = m * diffSqX192 / 2^192 / (rX192 / 2^192 - 1)\n // = m * diffSqX192 / (rX192 - 2^192)\n return divTrunc(m * diffSqX192, rX192 - Q192)\n }\n })()\n\n return definedRisk ? debtDelta + vDelta : debtDelta + vDelta + itmDelta\n}\n\n/**\n * Calculate the gamma (dollar gamma) of a single leg.\n *\n * Formula: gamma = (m * sqrt(K * P * r)) / (2 * (r - 1))\n * where:\n * - m = positionSize * optionRatio (with sign based on long/short)\n * - K = strike price (numeraire/asset)\n * - P = current price (numeraire/asset)\n * - r = 1.0001^(width*tickSpacing/2) ≈ 1 (dimensionless ratio)\n *\n * Uses sqrtPriceX96 arithmetic:\n * - sqrt(K*P*r) = tickToSqrtPriceX96(strikeₜ + currentₜ + widthₜ/2)\n * - Keeps X96/X192 precision until final division\n *\n * @param leg - The leg to calculate\n * @param currentTick - Current pool tick\n * @param positionSize - Position size in asset token smallest units\n * @param poolTickSpacing - Pool tick spacing\n * @param assetIndex - Optional override for leg.asset (0n = token0 is asset, 1n = token1)\n * @returns Leg gamma in numeraire token smallest units\n */\nexport function getLegGamma(\n leg: TokenIdLeg,\n currentTick: bigint,\n positionSize: bigint,\n poolTickSpacing: bigint,\n assetIndex?: bigint,\n): bigint {\n const isAssetToken0 = resolveAssetDirection(leg, assetIndex)\n\n // Convert to quote-denominated ticks (negate if asset is token0)\n const qCurrentTick = quoteTick(currentTick, isAssetToken0)\n const qStrikeTick = quoteTick(leg.strike, isAssetToken0)\n const halfWidthTick = (leg.width * poolTickSpacing) / 2n\n\n // True loan: no gamma\n if (leg.width === 0n) return 0n\n\n // Narrow option whose halfWidth rounds to 0: no curvature (denominator 2*(r-1)=0)\n if (halfWidthTick === 0n) return 0n\n\n // Range check: gamma is zero outside [strike - halfWidth, strike + halfWidth]\n // This works in both normal and inverted tick space\n if (qCurrentTick < qStrikeTick - halfWidthTick || qCurrentTick > qStrikeTick + halfWidthTick) {\n return 0n\n }\n\n // Position size with sign: gamma uses inverted multiplier (long = positive, short = negative)\n const m = leg.isLong ? positionSize * leg.optionRatio : -(positionSize * leg.optionRatio)\n\n // sqrt(K * P * r) using tick addition: sqrt(K*P*r) = sqrt(1.0001^(K_tick + P_tick + r_tick))\n const sqrtKPR = tickToSqrtPriceX96(qStrikeTick + qCurrentTick + halfWidthTick) // X96 scale\n\n // r = 1.0001^(halfWidthTick), compute as (sqrtR)^2 to maintain precision\n const sqrtR = tickToSqrtPriceX96(halfWidthTick) // X96 scale\n const rX192 = sqrtR * sqrtR // X192 scale: r * 2^192\n\n // gamma = m * sqrt(K*P*r) / (2 * (r - 1))\n // = m * (sqrtKPR / 2^96) / (2 * (rX192/2^192 - 1))\n // = m * sqrtKPR * 2^192 / (2^96 * 2 * (rX192 - 2^192))\n // = m * sqrtKPR * 2^96 / (2 * (rX192 - 2^192))\n const numerator = m * sqrtKPR * Q96 // [asset] * [numeraire/asset * 2^96] * 2^96 = [numeraire * 2^192]\n const denominator = 2n * (rX192 - Q192) // 2 * (r - 1) in X192 scale\n\n return divTrunc(numerator, denominator) // [numeraire]\n}\n\n// --- Position-Level Aggregates ---\n\n/**\n * Parameters for position-level greek calculations.\n */\nexport interface PositionGreeksInput {\n /** Position legs */\n legs: TokenIdLeg[]\n /** Current pool tick */\n currentTick: bigint\n /** Tick at position mint */\n mintTick: bigint\n /** Position size in asset token smallest units */\n positionSize: bigint\n /** Pool tick spacing */\n poolTickSpacing: bigint\n /** Optional override for leg.asset on all legs (0n = token0 is asset, 1n = token1) */\n assetIndex?: bigint\n}\n\n/**\n * Calculate total value across all legs.\n */\nexport function calculatePositionValue(input: PositionGreeksInput): bigint {\n const { legs, currentTick, mintTick, positionSize, poolTickSpacing, assetIndex } = input\n const definedRisk = isDefinedRisk(legs)\n\n return legs.reduce(\n (sum, leg) =>\n sum +\n getLegValue(\n leg,\n currentTick,\n mintTick,\n positionSize,\n poolTickSpacing,\n definedRisk,\n assetIndex,\n ),\n 0n,\n )\n}\n\n/**\n * Calculate total delta across all legs.\n */\nexport function calculatePositionDelta(input: PositionGreeksInput): bigint {\n const { legs, currentTick, mintTick, positionSize, poolTickSpacing, assetIndex } = input\n const definedRisk = isDefinedRisk(legs)\n\n return legs.reduce(\n (sum, leg) =>\n sum +\n getLegDelta(\n leg,\n currentTick,\n positionSize,\n poolTickSpacing,\n mintTick,\n definedRisk,\n assetIndex,\n ),\n 0n,\n )\n}\n\n/**\n * Calculate total gamma across all legs.\n */\nexport function calculatePositionGamma(input: PositionGreeksInput): bigint {\n const { legs, currentTick, positionSize, poolTickSpacing, assetIndex } = input\n\n return legs.reduce(\n (sum, leg) => sum + getLegGamma(leg, currentTick, positionSize, poolTickSpacing, assetIndex),\n 0n,\n )\n}\n\n/**\n * Position greeks result.\n */\nexport interface PositionGreeksResult {\n /** Position value in numeraire token smallest units */\n value: bigint\n /** Position delta in asset token smallest units */\n delta: bigint\n /** Position gamma in numeraire token smallest units */\n gamma: bigint\n}\n\n/**\n * Calculate all greeks for a position.\n */\nexport function calculatePositionGreeks(input: PositionGreeksInput): PositionGreeksResult {\n return {\n value: calculatePositionValue(input),\n delta: calculatePositionDelta(input),\n gamma: calculatePositionGamma(input),\n }\n}\n\n// --- Loan/Credit Swap-Aware Delta ---\n\n/**\n * Calculate the effective delta of a loan leg accounting for swapAtMint.\n *\n * A loan borrows one token and (optionally) swaps it for the other at mint.\n * The net delta depends on whether the swap occurred:\n *\n * | Scenario | Result |\n * |-----------------------|-------------------------------------------------|\n * | No swap | 0n (hold what you owe, net zero) |\n * | Swap + borrows asset | -m (hold numeraire, owe asset → short exposure) |\n * | Swap + borrows numer. | +m (hold asset, owe numeraire → long exposure) |\n *\n * Only meaningful for legs with `width === 0n`. For options, use `getLegDelta`.\n *\n * @param leg - The loan leg\n * @param positionSize - Position size in asset token smallest units\n * @param swapAtMint - Whether the borrowed tokens were swapped at mint\n * @param assetIndex - Optional override for leg.asset (0n = token0 is asset)\n * @returns Effective delta in asset token smallest units\n */\nexport function getLoanEffectiveDelta(\n leg: TokenIdLeg,\n positionSize: bigint,\n swapAtMint: boolean,\n assetIndex?: bigint,\n): bigint {\n if (!swapAtMint) return 0n\n\n const isAssetToken0 = resolveAssetDirection(leg, assetIndex)\n const m = leg.isLong ? -(positionSize * leg.optionRatio) : positionSize * leg.optionRatio\n const borrowsAsset = isAssetToken0 ? leg.tokenType === 0n : leg.tokenType === 1n\n\n return borrowsAsset ? -m : m\n}\n\n/**\n * Calculate total delta for a position, using swap-aware delta for loan legs.\n *\n * For legs with `width === 0n` (loans/credits), uses `getLoanEffectiveDelta`\n * which accounts for the swapAtMint flag. For option legs (`width > 0n`),\n * uses the standard `getLegDelta`.\n *\n * @param input - Position greeks input plus swapAtMint flag\n * @returns Total delta in asset token smallest units\n */\nexport function calculatePositionDeltaWithSwap(\n input: PositionGreeksInput & { swapAtMint: boolean },\n): bigint {\n const { legs, currentTick, mintTick, positionSize, poolTickSpacing, assetIndex, swapAtMint } =\n input\n const optionLegs = legs.filter((l) => l.width !== 0n)\n const definedRisk = isDefinedRisk(optionLegs)\n\n return legs.reduce((sum, leg) => {\n if (leg.width === 0n) {\n return sum + getLoanEffectiveDelta(leg, positionSize, swapAtMint, assetIndex)\n }\n return (\n sum +\n getLegDelta(\n leg,\n currentTick,\n positionSize,\n poolTickSpacing,\n mintTick,\n definedRisk,\n assetIndex,\n )\n )\n }, 0n)\n}\n","import type { Address, Hex } from 'viem'\n\nexport const vegoid = 4\n\nexport interface LegParams {\n index: number\n width: bigint\n optionRatio: bigint\n asset: bigint\n strike: bigint\n isLong: bigint // 0 if short, 1 if long\n tokenType: bigint // Which token (0|1 in underlying pool) is being moved\n riskPartner: bigint\n}\n\nexport const areLegsEqual = (leg1: LegParams, leg2: LegParams): boolean => {\n return (\n leg1.width === leg2.width &&\n leg1.optionRatio === leg2.optionRatio &&\n leg1.asset === leg2.asset &&\n leg1.strike === leg2.strike &&\n leg1.isLong === leg2.isLong &&\n leg1.tokenType === leg2.tokenType &&\n leg1.riskPartner === leg2.riskPartner\n )\n}\n\nexport const stringifyLeg = (leg: LegParams): string => {\n return `Index: ${leg.index} | Width: ${leg.width.toString()} | OptionRatio: ${leg.optionRatio.toString()} | Asset: ${leg.asset.toString()} | Strike: ${leg.strike.toString()} | IsLong?: ${leg.isLong.toString()} | Token Type: ${leg.tokenType.toString()} | Risk Partner: ${leg.riskPartner.toString()}`\n}\n\n// Synthetic TokenIds padding constant\nexport const SYNTH_TOKENID_PADDING = BigInt(\n '115792089237316195423570985007226406215939081747436879206741300988257197096960',\n)\n\nconst POOL_ID_SIZE = 64n\nconst VEGOID_STARTING_BIT = 40n\nconst VEGOID_SIZE = 8n\nconst TICK_SPACING_STARTING_BIT = 48n\nconst ASSET_STARTING_BIT = 0n\nconst ASSET_SIZE = 1n\nconst RATIO_STARTING_BIT = ASSET_STARTING_BIT + ASSET_SIZE // 0 + 1\nconst RATIO_SIZE = 7n\nconst IS_LONG_STARTING_BIT = RATIO_STARTING_BIT + RATIO_SIZE // 1 + 7\nconst IS_LONG_SIZE = 1n\nconst TOKEN_TYPE_STARTING_BIT = IS_LONG_STARTING_BIT + IS_LONG_SIZE // 8 + 1\nconst TOKEN_TYPE_SIZE = 1n\nconst RISK_PARTNER_STARTING_BIT = TOKEN_TYPE_STARTING_BIT + TOKEN_TYPE_SIZE // 9 + 1\nconst RISK_PARTNER_SIZE = 2n\nconst STRIKE_STARTING_BIT = RISK_PARTNER_STARTING_BIT + RISK_PARTNER_SIZE // 10 + 2\nconst STRIKE_SIZE = 24n\nconst WIDTH_STARTING_BIT = STRIKE_STARTING_BIT + STRIKE_SIZE // 12 + 24\nconst WIDTH_SIZE = 12n\nconst LEG_SIZE = WIDTH_STARTING_BIT + WIDTH_SIZE // 36 + 12 = 48\n\n// converts unsigned strike to signed for encoding\nexport const convertStrike = (n: bigint): bigint => {\n if (n < 0n) {\n // 3 bytes because strike is int24\n return 16777216n + n\n } else {\n return n\n }\n}\n\n// converts encoded (unsigned) strike back to signed\nexport const signStrike = (encodedStrike: bigint): bigint => {\n if (encodedStrike > 2n ** 23n) {\n return encodedStrike - 16777216n\n }\n return encodedStrike\n}\n\nconst getLegOffsetByIndex = (index: bigint): bigint => index * LEG_SIZE\n\nconst encodeAsset = (asset: bigint, legIndex: bigint): bigint =>\n asset << (getLegOffsetByIndex(legIndex) + ASSET_STARTING_BIT + POOL_ID_SIZE)\n\nconst encodeRatio = (optionRatio: bigint, legIndex: bigint): bigint =>\n optionRatio << (getLegOffsetByIndex(legIndex) + RATIO_STARTING_BIT + POOL_ID_SIZE)\n\nconst encodeIsLong = (isLong: bigint, legIndex: bigint): bigint =>\n isLong << (getLegOffsetByIndex(legIndex) + IS_LONG_STARTING_BIT + POOL_ID_SIZE)\n\nconst encodeTokenType = (tokenType: bigint, legIndex: bigint): bigint =>\n tokenType << (getLegOffsetByIndex(legIndex) + TOKEN_TYPE_STARTING_BIT + POOL_ID_SIZE)\n\nconst encodeRiskPartner = (riskPartner: bigint, legIndex: bigint): bigint =>\n riskPartner << (getLegOffsetByIndex(legIndex) + RISK_PARTNER_STARTING_BIT + POOL_ID_SIZE)\n\nconst encodeStrike = (strike: bigint, legIndex: bigint): bigint =>\n convertStrike(strike) << (getLegOffsetByIndex(legIndex) + STRIKE_STARTING_BIT + POOL_ID_SIZE)\n\nconst encodeWidth = (width: bigint, legIndex: bigint): bigint =>\n width << (getLegOffsetByIndex(legIndex) + WIDTH_STARTING_BIT + POOL_ID_SIZE)\n\nconst decodeAsset = (leg: bigint): bigint => leg % (1n << ASSET_SIZE)\n\nconst decodeRatio = (leg: bigint): bigint => (leg >> RATIO_STARTING_BIT) % (1n << RATIO_SIZE)\n\nconst decodeIsLong = (leg: bigint): bigint => (leg >> IS_LONG_STARTING_BIT) % (1n << IS_LONG_SIZE)\n\nconst decodeTokenType = (leg: bigint): bigint =>\n (leg >> TOKEN_TYPE_STARTING_BIT) % (1n << TOKEN_TYPE_SIZE)\n\nconst decodeRiskPartner = (leg: bigint): bigint =>\n (leg >> RISK_PARTNER_STARTING_BIT) % (1n << RISK_PARTNER_SIZE)\n\nconst decodeStrike = (leg: bigint): bigint =>\n signStrike((leg >> STRIKE_STARTING_BIT) % (1n << STRIKE_SIZE))\n\nconst decodeWidth = (leg: bigint): bigint => (leg >> WIDTH_STARTING_BIT) % (1n << WIDTH_SIZE)\n\n/**\n * Extract vegoid from a TokenId\n * Vegoid is stored in bits 40-47 (8 bits) of the poolId\n */\nexport const decodeVegoid = (tokenId: bigint): bigint => {\n return ((tokenId % (1n << POOL_ID_SIZE)) >> VEGOID_STARTING_BIT) % (1n << VEGOID_SIZE)\n}\n\n/**\n * Extract vegoid from a poolId\n * Vegoid is stored in bits 40-47 (8 bits) of the poolId\n */\nexport const decodeVegoidFromPoolId = (poolId: bigint): bigint => {\n return (poolId >> VEGOID_STARTING_BIT) % (1n << VEGOID_SIZE)\n}\n\n/**\n * Extract tickSpacing from a TokenId\n * TickSpacing is stored in bits 48-63 (16 bits) of the poolId\n */\nexport const decodeTickSpacing = (tokenId: bigint): bigint => {\n return (tokenId % (1n << POOL_ID_SIZE)) >> TICK_SPACING_STARTING_BIT\n}\n\n/**\n * Encode poolId with vegoid support\n * The encoded PoolId structure: [16-bit tickSpacing][8-bit vegoid][40-bit pool address]\n * @param address The Uniswap V3 pool address (hex string)\n * @param tickSpacing The tick spacing of the pool\n * @param vegoidValue The vegoid value (defaults to 4 if not provided)\n * @return The encoded poolId as bigint\n */\nexport const encodePoolId = (\n address: Address,\n tickSpacing: bigint,\n vegoidValue: bigint = BigInt(vegoid),\n): bigint => {\n // Remove 0x prefix and get first 10 hex chars (5 bytes = 40 bits)\n const addressHex = address.slice(2, 12).toLowerCase()\n\n // Convert to bytes array (big-endian), then reverse to little-endian\n const bytes: number[] = []\n for (let i = 0; i < 10; i += 2) {\n bytes.push(parseInt(addressHex.slice(i, i + 2), 16))\n }\n bytes.reverse()\n\n // Build poolId: pool address (5 bytes) + vegoid (1 byte) + tickSpacing (2 bytes) = 8 bytes\n // All in little-endian format\n let poolId = 0n\n for (let i = 0; i < bytes.length; i++) {\n poolId |= BigInt(bytes[i]) << BigInt(i * 8)\n }\n\n // Add vegoid at bit 40\n poolId |= (vegoidValue % 256n) << 40n\n\n // Add tickSpacing at bit 48\n poolId |= (tickSpacing % 65536n) << 48n\n\n return poolId\n}\n\n/**\n * Encode V4 poolId with vegoid support\n * The encoded PoolId structure: [16-bit tickSpacing][8-bit vegoid][40-bit pool pattern]\n * @param poolId The V4 pool ID (bytes32 hex string)\n * @param tickSpacing The tick spacing of the pool\n * @param vegoidValue The vegoid value (defaults to 4 if not provided)\n * @return The encoded poolId as bigint\n */\nexport const encodeV4PoolId = (\n poolId: Hex,\n tickSpacing: bigint,\n vegoidValue: bigint = BigInt(vegoid),\n): bigint => {\n // Remove 0x prefix and get last 10 hex chars (5 bytes = 40 bits)\n const poolIdHex = poolId.slice(2)\n const last5BytesHex = poolIdHex.slice(-10).toLowerCase()\n\n // Convert to bytes array (big-endian), then reverse to little-endian\n const bytes: number[] = []\n for (let i = 0; i < 10; i += 2) {\n bytes.push(parseInt(last5BytesHex.slice(i, i + 2), 16))\n }\n bytes.reverse()\n\n // Build encoded poolId: pool pattern (5 bytes) + vegoid (1 byte) + tickSpacing (2 bytes) = 8 bytes\n let encodedPoolId = 0n\n for (let i = 0; i < bytes.length; i++) {\n encodedPoolId |= BigInt(bytes[i]) << BigInt(i * 8)\n }\n\n // Add vegoid at bit 40\n encodedPoolId |= (vegoidValue % 256n) << 40n\n\n // Add tickSpacing at bit 48\n encodedPoolId |= (tickSpacing % 65536n) << 48n\n\n return encodedPoolId\n}\n\n// Can be (ab)used to create a leg id by passing in a tokenId of 0\nexport const addLeg = (tokenId: bigint, leg: LegParams): bigint => {\n const legIndex = BigInt(leg.index)\n const width = leg.width\n const strike = leg.strike\n const riskPartner = leg.riskPartner\n const tokenType = leg.tokenType\n const isLong = leg.isLong\n const optionRatio = leg.optionRatio\n const asset = leg.asset\n\n return (\n tokenId +\n encodeWidth(width, legIndex) +\n encodeStrike(strike, legIndex) +\n (encodeRiskPartner(riskPartner, legIndex) |\n encodeTokenType(tokenType, legIndex) |\n encodeIsLong(isLong, legIndex) |\n encodeRatio(optionRatio, legIndex) |\n encodeAsset(asset, legIndex))\n )\n}\n\nexport const encodePosition = (poolId: bigint, legs: LegParams[]): bigint => {\n return legs.reduce((acc, leg) => addLeg(acc, leg), poolId)\n}\n\nexport interface Position {\n poolId: string\n legs: LegParams[]\n}\n\nexport const decodePosition = (encodedPosition: bigint): Position => {\n const leg4 = (encodedPosition >> (POOL_ID_SIZE + getLegOffsetByIndex(3n))) % (1n << LEG_SIZE)\n\n const leg3 = (encodedPosition >> (POOL_ID_SIZE + getLegOffsetByIndex(2n))) % (1n << LEG_SIZE)\n\n const leg2 = (encodedPosition >> (POOL_ID_SIZE + getLegOffsetByIndex(1n))) % (1n << LEG_SIZE)\n\n const leg1 = (encodedPosition >> (POOL_ID_SIZE + getLegOffsetByIndex(0n))) % (1n << LEG_SIZE)\n\n let poolId = (encodedPosition % (1n << POOL_ID_SIZE)).toString(16)\n\n const poolIdLength = 16 // poolId is 64 bits => 16 hex characters\n if (poolId.length < poolIdLength) {\n poolId = padHexWithZeros('0x' + poolId, poolIdLength + 2) // +2 for 0x prefix\n } else {\n poolId = '0x' + poolId\n }\n\n const encodedLegs = [leg1, leg2, leg3, leg4].filter((leg) => decodeRatio(leg) > 0n)\n\n const legs: LegParams[] = encodedLegs.map((leg, index) => ({\n index: index,\n width: decodeWidth(leg),\n strike: decodeStrike(leg),\n riskPartner: decodeRiskPartner(leg),\n tokenType: decodeTokenType(leg),\n isLong: decodeIsLong(leg),\n optionRatio: decodeRatio(leg),\n asset: decodeAsset(leg),\n }))\n\n return {\n poolId,\n legs,\n }\n}\n\nexport function padHexWithZeros(hex: string, length: number): string {\n // Check if the hex starts with \"0x\"\n if (hex.startsWith('0x')) {\n // Remove the \"0x\" prefix\n hex = hex.substring(2)\n } else {\n throw new Error('do not use padHexWithZeros on non-hex strings')\n }\n\n // Subtract 2 from length to account for the substring(2) call to remove the leading 0x\n while (hex.length < length - 2) {\n hex = '0' + hex\n }\n\n // Add back the \"0x\" prefix\n return '0x' + hex\n}\n","/**\n * Position read functions for the Panoptic v2 SDK.\n * @module v2/reads/position\n */\n\nimport type { Address, PublicClient } from 'viem'\n\nimport { panopticPoolAbi } from '../../../generated'\nimport { getBlockMeta } from '../clients/blockMeta'\nimport { calculatePositionGreeks } from '../greeks'\nimport type { BlockMeta, Position, PositionGreeks, TokenIdLeg } from '../types'\nimport { decodePosition, decodeTickSpacing } from '../utils/option-encoding-v2'\n\n/**\n * Parameters for getPosition.\n */\nexport interface GetPositionParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Owner address */\n owner: Address\n /** TokenId to query */\n tokenId: bigint\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get a single position by tokenId.\n *\n * @param params - The parameters\n * @returns Position data with block metadata\n */\nexport async function getPosition(params: GetPositionParams): Promise<Position> {\n const { client, poolAddress, owner, tokenId, blockNumber } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n const [positionData, _meta] = await Promise.all([\n client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'positionData',\n args: [owner, tokenId],\n blockNumber: targetBlockNumber,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n // positionData returns: (bool, uint256, uint256, int24, int256, int256, uint128)\n // These are: swapAtMint, blockAtMint, timestampAtMint, tickAtMint, utilization0AtMint, utilization1AtMint, positionSize\n const [\n swapAtMint,\n blockAtMint,\n timestampAtMint,\n tickAtMint,\n utilization0AtMint,\n utilization1AtMint,\n positionSize,\n ] = positionData\n\n // Decode the tokenId to get legs\n const decoded = decodePosition(tokenId)\n const tickSpacing = decodeTickSpacing(tokenId)\n\n // Convert decoded legs to TokenIdLeg format\n const legs: TokenIdLeg[] = decoded.legs.map((leg) => {\n const width = leg.width\n const strike = leg.strike\n // Calculate tick bounds based on strike and width\n const tickLower = strike - (width * tickSpacing) / 2n\n const tickUpper = strike + (width * tickSpacing) / 2n\n\n return {\n index: BigInt(leg.index),\n asset: leg.asset,\n optionRatio: leg.optionRatio,\n isLong: leg.isLong === 1n,\n tokenType: leg.tokenType,\n riskPartner: leg.riskPartner,\n strike,\n width,\n tickLower,\n tickUpper,\n }\n })\n\n return {\n tokenId,\n positionSize,\n owner,\n poolAddress,\n legs,\n poolUtilization0AtMint: utilization0AtMint,\n poolUtilization1AtMint: utilization1AtMint,\n tickAtMint: BigInt(tickAtMint),\n timestampAtMint,\n blockNumberAtMint: blockAtMint,\n swapAtMint,\n premiaOwed0: 0n, // Premia now tracked separately, not returned from positionData\n premiaOwed1: 0n,\n assetIndex: legs.length > 0 ? legs[0].asset : 0n,\n _meta,\n }\n}\n\n/**\n * Parameters for getPositions.\n */\nexport interface GetPositionsParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Owner address */\n owner: Address\n /** TokenIds to query */\n tokenIds: bigint[]\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get multiple positions for an account.\n *\n * @param params - The parameters\n * @returns Array of positions with block metadata\n */\nexport async function getPositions(\n params: GetPositionsParams,\n): Promise<{ positions: Position[]; _meta: BlockMeta }> {\n const { client, poolAddress, owner, tokenIds, blockNumber } = params\n\n if (tokenIds.length === 0) {\n const _meta =\n params._meta ??\n (await getBlockMeta({\n client,\n blockNumber: blockNumber ?? (await client.getBlockNumber()),\n }))\n return { positions: [], _meta }\n }\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Use multicall to get all position data in a single RPC call\n const [multicallResults, _meta] = await Promise.all([\n client.multicall({\n contracts: tokenIds.map((tokenId) => ({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'positionData' as const,\n args: [owner, tokenId] as const,\n })),\n blockNumber: targetBlockNumber,\n allowFailure: true,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const positions: Position[] = []\n\n for (let i = 0; i < tokenIds.length; i++) {\n const result = multicallResults[i]\n if (result.status !== 'success') {\n continue // Skip failed calls\n }\n\n const tokenId = tokenIds[i]\n const [\n swapAtMint,\n blockAtMint,\n timestampAtMint,\n tickAtMint,\n utilization0AtMint,\n utilization1AtMint,\n positionSize,\n ] = result.result\n\n // Skip positions with zero size\n if (positionSize === 0n) {\n continue\n }\n\n // Decode the tokenId to get legs\n const decoded = decodePosition(tokenId)\n const tickSpacing = decodeTickSpacing(tokenId)\n\n // Convert decoded legs to TokenIdLeg format\n const legs: TokenIdLeg[] = decoded.legs.map((leg) => {\n const width = leg.width\n const strike = leg.strike\n const tickLower = strike - (width * tickSpacing) / 2n\n const tickUpper = strike + (width * tickSpacing) / 2n\n\n return {\n index: BigInt(leg.index),\n asset: leg.asset,\n optionRatio: leg.optionRatio,\n isLong: leg.isLong === 1n,\n tokenType: leg.tokenType,\n riskPartner: leg.riskPartner,\n strike,\n width,\n tickLower,\n tickUpper,\n }\n })\n\n positions.push({\n tokenId,\n positionSize,\n owner,\n poolAddress,\n legs,\n poolUtilization0AtMint: utilization0AtMint,\n poolUtilization1AtMint: utilization1AtMint,\n tickAtMint: BigInt(tickAtMint),\n timestampAtMint,\n blockNumberAtMint: blockAtMint,\n swapAtMint,\n premiaOwed0: 0n, // Premia now tracked separately\n premiaOwed1: 0n,\n assetIndex: legs.length > 0 ? legs[0].asset : 0n,\n _meta,\n })\n }\n\n return { positions, _meta }\n}\n\n/**\n * Parameters for getPositionGreeks.\n */\nexport interface GetPositionGreeksParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Owner address */\n owner: Address\n /** TokenId to calculate greeks for */\n tokenId: bigint\n /** Optional: Current tick override (defaults to pool's current tick) */\n atTick?: bigint\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get Greeks for a position.\n *\n * Uses client-side calculation based on the position's legs, current tick,\n * and mint tick. Returns WAD-scaled (1e18) bigint values.\n *\n * @param params - The parameters\n * @returns Position greeks with block metadata\n */\nexport async function getPositionGreeks(\n params: GetPositionGreeksParams,\n): Promise<PositionGreeks & { _meta: BlockMeta }> {\n const { client, poolAddress, owner, tokenId, atTick, blockNumber } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get position data and current tick in parallel\n const [positionData, currentTickResult, _meta] = await Promise.all([\n client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'positionData',\n args: [owner, tokenId],\n blockNumber: targetBlockNumber,\n }),\n atTick === undefined\n ? client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'getCurrentTick',\n blockNumber: targetBlockNumber,\n })\n : Promise.resolve(atTick),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [, , , tickAtMint, , , positionSize] = positionData\n\n // Decode the tokenId to get legs\n const decoded = decodePosition(tokenId)\n const tickSpacing = decodeTickSpacing(tokenId)\n\n // Convert decoded legs to TokenIdLeg format\n const legs: TokenIdLeg[] = decoded.legs.map((leg) => {\n const width = leg.width\n const strike = leg.strike\n const tickLower = strike - (width * tickSpacing) / 2n\n const tickUpper = strike + (width * tickSpacing) / 2n\n\n return {\n index: BigInt(leg.index),\n asset: leg.asset,\n optionRatio: leg.optionRatio,\n isLong: leg.isLong === 1n,\n tokenType: leg.tokenType,\n riskPartner: leg.riskPartner,\n strike,\n width,\n tickLower,\n tickUpper,\n }\n })\n\n const currentTick =\n typeof currentTickResult === 'bigint' ? currentTickResult : BigInt(currentTickResult)\n\n // Calculate greeks using client-side implementation\n const greeks = calculatePositionGreeks({\n legs,\n currentTick,\n mintTick: BigInt(tickAtMint),\n positionSize,\n poolTickSpacing: tickSpacing,\n })\n\n return {\n ...greeks,\n _meta,\n }\n}\n","/**\n * Account read functions for the Panoptic v2 SDK.\n *\n * ## Same-Block Guarantee\n *\n * All dynamic data is fetched in a SINGLE multicall to ensure block consistency.\n * Per PLAN.md §6, immutable \"static prefetch\" data (addresses) can be fetched\n * separately and cached - it's not subject to same-block consistency.\n *\n * @module v2/reads/account\n */\n\nimport type { Address, PublicClient } from 'viem'\n\nimport { collateralTrackerAbi, panopticPoolAbi } from '../../../generated'\nimport { panopticQueryAbi } from '../abis/panopticQuery'\nimport { getBlockMeta } from '../clients/blockMeta'\nimport type {\n AccountCollateral,\n AccountSummaryBasic,\n AccountSummaryRisk,\n BlockMeta,\n LiquidationPrices,\n NetLiquidationValue,\n TokenCollateral,\n} from '../types'\nimport { isLiquidatable } from './checks'\nimport { type PoolMetadata, getPool } from './pool'\nimport { getPositions } from './position'\n\n/**\n * Collateral tracker addresses (immutable, can be cached).\n */\nexport interface CollateralAddresses {\n /** Collateral tracker 0 address */\n collateralToken0: Address\n /** Collateral tracker 1 address */\n collateralToken1: Address\n}\n\n/**\n * Extract collateral tracker addresses from a Pool object.\n *\n * Convenience helper that avoids re-fetching immutable addresses\n * when you already have a Pool from a prior `getPool()` call.\n *\n * @param pool - Pool object from getPool()\n * @returns Collateral tracker addresses\n */\nexport function getCollateralAddresses(pool: {\n collateralTracker0: { address: Address }\n collateralTracker1: { address: Address }\n}): CollateralAddresses {\n return {\n collateralToken0: pool.collateralTracker0.address,\n collateralToken1: pool.collateralTracker1.address,\n }\n}\n\n/**\n * Parameters for getAccountCollateral.\n */\nexport interface GetAccountCollateralParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Account address */\n account: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched collateral addresses (for caching/optimization) */\n collateralAddresses?: CollateralAddresses\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get collateral data for an account.\n *\n * ## Same-Block Guarantee\n * All dynamic data is fetched in ONE multicall at the target block.\n * Collateral tracker addresses are either provided or fetched separately (static prefetch).\n *\n * @param params - The parameters\n * @returns Account collateral data with block metadata\n */\nexport async function getAccountCollateral(\n params: GetAccountCollateralParams,\n): Promise<AccountCollateral> {\n const { client, poolAddress, account, blockNumber, collateralAddresses } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get collateral tracker addresses (static prefetch if not provided)\n let collateralToken0: Address\n let collateralToken1: Address\n\n if (collateralAddresses) {\n collateralToken0 = collateralAddresses.collateralToken0\n collateralToken1 = collateralAddresses.collateralToken1\n } else {\n // Static prefetch - addresses are immutable\n const addressResults = await client.multicall({\n contracts: [\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken0',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken1',\n },\n ],\n allowFailure: false,\n })\n collateralToken0 = addressResults[0]\n collateralToken1 = addressResults[1]\n }\n\n // SINGLE multicall for ALL dynamic data - ensures same-block consistency\n const [dynamicResults, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n // Token 0 collateral data\n {\n address: collateralToken0,\n abi: collateralTrackerAbi,\n functionName: 'balanceOf',\n args: [account],\n },\n {\n address: collateralToken0,\n abi: collateralTrackerAbi,\n functionName: 'assetsOf',\n args: [account],\n },\n {\n address: collateralToken0,\n abi: collateralTrackerAbi,\n functionName: 'maxWithdraw',\n args: [account],\n },\n // Token 1 collateral data\n {\n address: collateralToken1,\n abi: collateralTrackerAbi,\n functionName: 'balanceOf',\n args: [account],\n },\n {\n address: collateralToken1,\n abi: collateralTrackerAbi,\n functionName: 'assetsOf',\n args: [account],\n },\n {\n address: collateralToken1,\n abi: collateralTrackerAbi,\n functionName: 'maxWithdraw',\n args: [account],\n },\n // Leg count from pool\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'numberOfLegs',\n args: [account],\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [shares0, assets0, maxWithdraw0, shares1, assets1, maxWithdraw1, legCount] = dynamicResults\n\n // Calculate locked assets as total - available (maxWithdraw)\n const locked0 = assets0 > maxWithdraw0 ? assets0 - maxWithdraw0 : 0n\n const locked1 = assets1 > maxWithdraw1 ? assets1 - maxWithdraw1 : 0n\n\n const token0: TokenCollateral = {\n assets: assets0,\n shares: shares0,\n availableAssets: maxWithdraw0,\n lockedAssets: locked0,\n }\n\n const token1: TokenCollateral = {\n assets: assets1,\n shares: shares1,\n availableAssets: maxWithdraw1,\n lockedAssets: locked1,\n }\n\n return {\n account,\n poolAddress,\n token0,\n token1,\n legCount,\n _meta,\n }\n}\n\n/**\n * Parameters for getAccountSummaryBasic.\n */\nexport interface GetAccountSummaryBasicParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Account address */\n account: Address\n /** Chain ID */\n chainId: bigint\n /** TokenIds of open positions */\n tokenIds: bigint[]\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched pool metadata (for caching/optimization) */\n poolMetadata?: PoolMetadata\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Parameters for getAccountSummaryRisk.\n */\nexport interface GetAccountSummaryRiskParams extends GetAccountSummaryBasicParams {\n /** PanopticQuery address (required for risk fields) */\n queryAddress: Address\n /** Optional: Tick to calculate risk metrics at (defaults to current tick) */\n atTick?: bigint\n /** Optional: Whether to include pending premium in NLV */\n includePendingPremium?: boolean\n}\n\ninterface AccountSummaryCoreData {\n pool: Awaited<ReturnType<typeof getPool>>\n collateral: AccountCollateral\n positions: Awaited<ReturnType<typeof getPositions>>['positions']\n _meta: BlockMeta\n}\n\nasync function getAccountSummaryCore(\n params: GetAccountSummaryBasicParams,\n): Promise<AccountSummaryCoreData> {\n const { client, poolAddress, account, chainId, tokenIds, blockNumber, poolMetadata } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n const sharedMeta =\n params._meta ?? (await getBlockMeta({ client, blockNumber: targetBlockNumber }))\n\n const collateralAddresses = poolMetadata\n ? {\n collateralToken0: poolMetadata.collateralToken0Address,\n collateralToken1: poolMetadata.collateralToken1Address,\n }\n : undefined\n\n const [pool, collateral, { positions }] = await Promise.all([\n getPool({\n client,\n poolAddress,\n chainId,\n blockNumber: targetBlockNumber,\n poolMetadata,\n _meta: sharedMeta,\n }),\n getAccountCollateral({\n client,\n poolAddress,\n account,\n blockNumber: targetBlockNumber,\n collateralAddresses,\n _meta: sharedMeta,\n }),\n getPositions({\n client,\n poolAddress,\n owner: account,\n tokenIds,\n blockNumber: targetBlockNumber,\n _meta: sharedMeta,\n }),\n ])\n\n return {\n pool,\n collateral,\n positions,\n _meta: sharedMeta,\n }\n}\n\n/**\n * Get base account summary data for UI dashboards.\n *\n * ## Same-Block Guarantee\n * Uses the same blockNumber for pool, collateral, and position reads.\n *\n * @param params - The parameters\n * @returns Base account summary with block metadata\n */\nexport async function getAccountSummaryBasic(\n params: GetAccountSummaryBasicParams,\n): Promise<AccountSummaryBasic> {\n const { account } = params\n const { pool, collateral, positions, _meta } = await getAccountSummaryCore(params)\n\n return {\n account,\n pool,\n collateral,\n positions,\n healthStatus: pool.healthStatus,\n networkMismatch: false, // Requires wallet context, not available in read functions\n _meta,\n }\n}\n\n/**\n * Get risk-focused account summary including helper-dependent fields.\n *\n * ## Same-Block Guarantee\n * Uses one block target for all pool/collateral/position/risk reads.\n *\n * @param params - The parameters\n * @returns Risk-focused account summary with block metadata\n */\nexport async function getAccountSummaryRisk(\n params: GetAccountSummaryRiskParams,\n): Promise<AccountSummaryRisk> {\n const {\n client,\n poolAddress,\n account,\n tokenIds,\n queryAddress,\n atTick,\n includePendingPremium = true,\n blockNumber,\n } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n const sharedMeta =\n params._meta ?? (await getBlockMeta({ client, blockNumber: targetBlockNumber }))\n\n const [{ pool, collateral, positions }, nlv, liquidationCheck, liquidationPrices] =\n await Promise.all([\n getAccountSummaryCore({\n ...params,\n blockNumber: targetBlockNumber,\n _meta: sharedMeta,\n }),\n getNetLiquidationValue({\n client,\n poolAddress,\n account,\n tokenIds,\n atTick,\n includePendingPremium,\n queryAddress,\n blockNumber: targetBlockNumber,\n _meta: sharedMeta,\n }),\n isLiquidatable({\n client,\n poolAddress,\n account,\n tokenIds,\n atTick,\n queryAddress,\n blockNumber: targetBlockNumber,\n _meta: sharedMeta,\n }),\n getLiquidationPrices({\n client,\n poolAddress,\n account,\n tokenIds,\n queryAddress,\n blockNumber: targetBlockNumber,\n _meta: sharedMeta,\n }),\n ])\n\n const totalGreeks = {\n value: 0n,\n delta: 0n,\n gamma: 0n,\n }\n\n const maintenanceMargin0 = liquidationCheck.requiredMargin0\n const maintenanceMargin1 = liquidationCheck.requiredMargin1\n const marginExcess0 = liquidationCheck.currentMargin0 - liquidationCheck.requiredMargin0\n const marginExcess1 = liquidationCheck.currentMargin1 - liquidationCheck.requiredMargin1\n\n return {\n account,\n pool,\n collateral,\n positions,\n totalGreeks,\n netLiquidationValue0: nlv.value0,\n netLiquidationValue1: nlv.value1,\n maintenanceMargin0,\n maintenanceMargin1,\n marginExcess0,\n marginExcess1,\n marginShortfall0: liquidationCheck.marginShortfall0,\n marginShortfall1: liquidationCheck.marginShortfall1,\n currentMargin0: liquidationCheck.currentMargin0,\n currentMargin1: liquidationCheck.currentMargin1,\n isLiquidatable: liquidationCheck.isLiquidatable,\n liquidationPrices,\n healthStatus: pool.healthStatus,\n networkMismatch: false, // Requires wallet context, not available in read functions\n _meta: sharedMeta,\n }\n}\n\n/**\n * Parameters for getNetLiquidationValue.\n */\nexport interface GetNetLiquidationValueParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Account address */\n account: Address\n /** TokenIds of open positions */\n tokenIds: bigint[]\n /** Optional: Tick to calculate NLV at (defaults to current tick) */\n atTick?: bigint\n /** Optional: Whether to include pending premium */\n includePendingPremium?: boolean\n /** PanopticQuery address (required) */\n queryAddress: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get net liquidation value for an account.\n *\n * ## Same-Block Guarantee\n * Tick and NLV are queried at the same target block.\n *\n * Requires PanopticQuery for accurate value and premium accounting.\n *\n * @param params - The parameters\n * @returns Net liquidation value with block metadata\n */\nexport async function getNetLiquidationValue(\n params: GetNetLiquidationValueParams,\n): Promise<NetLiquidationValue> {\n const {\n client,\n poolAddress,\n account,\n tokenIds,\n atTick,\n includePendingPremium = true,\n queryAddress,\n blockNumber,\n } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Skip getCurrentTick RPC call when atTick is provided\n const [currentTickResult, _meta] = await Promise.all([\n atTick != null\n ? Promise.resolve(atTick)\n : client\n .readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'getCurrentTick',\n blockNumber: targetBlockNumber,\n })\n .then((r) => BigInt(r)),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const effectiveTick = currentTickResult\n\n const result = await client.readContract({\n address: queryAddress,\n abi: panopticQueryAbi,\n functionName: 'getNetLiquidationValue',\n args: [poolAddress, account, includePendingPremium, tokenIds, Number(effectiveTick)],\n blockNumber: targetBlockNumber,\n })\n\n const [value0, value1] = result\n\n return {\n value0,\n value1,\n atTick: effectiveTick,\n includedPendingPremium: includePendingPremium,\n _meta,\n }\n}\n\n/**\n * Parameters for getLiquidationPrices.\n */\nexport interface GetLiquidationPricesParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Account address */\n account: Address\n /** TokenIds of open positions */\n tokenIds: bigint[]\n /** PanopticQuery address (required) */\n queryAddress: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get liquidation prices for an account.\n *\n * ## Same-Block Guarantee\n * Liquidation price query is made at a single block.\n *\n * @param params - The parameters\n * @returns Liquidation prices with block metadata\n */\nexport async function getLiquidationPrices(\n params: GetLiquidationPricesParams,\n): Promise<LiquidationPrices> {\n const { client, poolAddress, account, tokenIds, queryAddress, blockNumber } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // MIN_TICK and MAX_TICK indicate no liquidation at that boundary\n const MIN_TICK = -887272n\n const MAX_TICK = 887272n\n\n const [result, _meta] = await Promise.all([\n client.readContract({\n address: queryAddress,\n abi: panopticQueryAbi,\n functionName: 'getLiquidationPrices',\n args: [poolAddress, account, tokenIds],\n blockNumber: targetBlockNumber,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n // Convert from number (abitype default for int24) to bigint (viem runtime type)\n const liqPriceDown = BigInt(result[0])\n const liqPriceUp = BigInt(result[1])\n\n return {\n lowerTick: liqPriceDown === MIN_TICK ? null : liqPriceDown,\n upperTick: liqPriceUp === MAX_TICK ? null : liqPriceUp,\n isLiquidatable: liqPriceDown !== MIN_TICK || liqPriceUp !== MAX_TICK,\n _meta,\n }\n}\n","/**\n * Collateral read functions for the Panoptic v2 SDK.\n *\n * ## Same-Block Guarantee\n *\n * All dynamic data is fetched in a SINGLE multicall to ensure block consistency.\n * Per PLAN.md §6, immutable \"static prefetch\" data (addresses, symbols, decimals)\n * can be fetched separately and cached - it's not subject to same-block consistency.\n *\n * @module v2/reads/collateral\n */\n\nimport type { Address, PublicClient } from 'viem'\n\nimport { collateralTrackerAbi, panopticPoolAbi } from '../../../generated'\nimport { getBlockMeta } from '../clients/blockMeta'\nimport type { BlockMeta, CollateralTracker, CurrentRates } from '../types'\n\nconst SECONDS_PER_YEAR = 31_536_000n\n\n// ERC20 minimal ABI for token metadata\nconst erc20Abi = [\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [{ type: 'string' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [{ type: 'uint8' }],\n stateMutability: 'view',\n },\n] as const\n\n/**\n * Pre-fetched collateral tracker metadata (immutable, can be cached).\n */\nexport interface CollateralTrackerMetadata {\n /** Collateral tracker address */\n address: Address\n /** Underlying asset address */\n assetAddress: Address\n /** Token symbol */\n symbol: string\n /** Token decimals */\n decimals: bigint\n}\n\n/**\n * Parameters for getCollateralData.\n */\nexport interface GetCollateralDataParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Which token's collateral tracker to query (0 or 1) */\n tokenIndex: 0 | 1\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched collateral tracker metadata (for caching/optimization) */\n trackerMetadata?: CollateralTrackerMetadata\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get collateral tracker data for a specific token.\n *\n * ## Same-Block Guarantee\n * All dynamic data is fetched in ONE multicall at the target block.\n * Static metadata (address, symbol, decimals) is either provided or fetched separately.\n *\n * @param params - The parameters\n * @returns Collateral tracker data with block metadata\n */\nexport async function getCollateralData(\n params: GetCollateralDataParams,\n): Promise<CollateralTracker & { _meta: BlockMeta }> {\n const { client, poolAddress, tokenIndex, blockNumber, trackerMetadata } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // If metadata is provided, we only need ONE multicall for dynamic data\n if (trackerMetadata) {\n const [dynamicResults, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n {\n address: trackerMetadata.address,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n {\n address: trackerMetadata.address,\n abi: collateralTrackerAbi,\n functionName: 'totalSupply',\n },\n {\n address: trackerMetadata.address,\n abi: collateralTrackerAbi,\n functionName: 'interestRate',\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [poolData, totalShares, interestRate] = dynamicResults\n const [depositedAssets, insideAMM, creditedShares, utilization] = poolData\n\n const borrowRate = BigInt(interestRate) * SECONDS_PER_YEAR\n const supplyRate = (borrowRate * utilization) / 10000n\n\n return {\n address: trackerMetadata.address,\n token: trackerMetadata.assetAddress,\n symbol: trackerMetadata.symbol,\n decimals: trackerMetadata.decimals,\n totalAssets: depositedAssets,\n insideAMM,\n creditedShares,\n totalShares,\n utilization,\n borrowRate,\n supplyRate,\n _meta,\n }\n }\n\n // Without metadata, fetch everything (original structure for backwards compatibility)\n // 1. Get tracker address (static)\n const collateralTrackerAddress = await client.readContract({\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: tokenIndex === 0 ? 'collateralToken0' : 'collateralToken1',\n })\n\n // 2. Get asset + dynamic data in one multicall (same-block guarantee for dynamic data)\n const [trackerData, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n {\n address: collateralTrackerAddress,\n abi: collateralTrackerAbi,\n functionName: 'asset',\n },\n {\n address: collateralTrackerAddress,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n {\n address: collateralTrackerAddress,\n abi: collateralTrackerAbi,\n functionName: 'totalSupply',\n },\n {\n address: collateralTrackerAddress,\n abi: collateralTrackerAbi,\n functionName: 'interestRate',\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [assetAddress, poolData, totalShares, interestRate] = trackerData\n\n // 3. Get token metadata (static - can be cached)\n const [symbol, decimals] = await client.multicall({\n contracts: [\n {\n address: assetAddress,\n abi: erc20Abi,\n functionName: 'symbol',\n },\n {\n address: assetAddress,\n abi: erc20Abi,\n functionName: 'decimals',\n },\n ],\n allowFailure: false,\n })\n\n // poolData returns: (depositedAssets, insideAMM, creditedShares, currentPoolUtilization)\n const [depositedAssets, insideAMM, creditedShares, utilization] = poolData\n\n // Annualize rates: interestRate() returns WAD/s\n const borrowRate = BigInt(interestRate) * SECONDS_PER_YEAR\n const supplyRate = (borrowRate * utilization) / 10000n\n\n return {\n address: collateralTrackerAddress,\n token: assetAddress,\n symbol,\n decimals: BigInt(decimals),\n totalAssets: depositedAssets,\n insideAMM,\n creditedShares,\n totalShares,\n utilization,\n borrowRate,\n supplyRate,\n _meta,\n }\n}\n\n/**\n * Collateral tracker addresses (immutable, can be cached).\n */\nexport interface CollateralAddresses {\n /** Collateral tracker 0 address */\n collateralToken0: Address\n /** Collateral tracker 1 address */\n collateralToken1: Address\n}\n\n/**\n * Parameters for getCurrentRates.\n */\nexport interface GetCurrentRatesParams {\n /** viem PublicClient */\n client: PublicClient\n /** PanopticPool address */\n poolAddress: Address\n /** Optional block number for historical queries */\n blockNumber?: bigint\n /** Optional pre-fetched collateral tracker addresses (for caching/optimization) */\n collateralAddresses?: CollateralAddresses\n /** Optional pre-fetched block metadata (skips getBlockMeta RPC call) */\n _meta?: BlockMeta\n}\n\n/**\n * Get current interest rates for both tokens.\n *\n * ## Same-Block Guarantee\n * All dynamic data is fetched in ONE multicall at the target block.\n * Collateral tracker addresses are either provided or fetched separately (static prefetch).\n *\n * @param params - The parameters\n * @returns Current rates with block metadata\n */\nexport async function getCurrentRates(params: GetCurrentRatesParams): Promise<CurrentRates> {\n const { client, poolAddress, blockNumber, collateralAddresses } = params\n\n const targetBlockNumber =\n blockNumber ?? params._meta?.blockNumber ?? (await client.getBlockNumber())\n\n // Get collateral tracker addresses (static prefetch if not provided)\n let collateralToken0: Address\n let collateralToken1: Address\n\n if (collateralAddresses) {\n collateralToken0 = collateralAddresses.collateralToken0\n collateralToken1 = collateralAddresses.collateralToken1\n } else {\n // Static prefetch - addresses are immutable\n const addressResults = await client.multicall({\n contracts: [\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken0',\n },\n {\n address: poolAddress,\n abi: panopticPoolAbi,\n functionName: 'collateralToken1',\n },\n ],\n allowFailure: false,\n })\n collateralToken0 = addressResults[0]\n collateralToken1 = addressResults[1]\n }\n\n // SINGLE multicall for ALL dynamic data - ensures same-block consistency\n const [rateData, _meta] = await Promise.all([\n client.multicall({\n contracts: [\n {\n address: collateralToken0,\n abi: collateralTrackerAbi,\n functionName: 'interestRate',\n },\n {\n address: collateralToken0,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n {\n address: collateralToken1,\n abi: collateralTrackerAbi,\n functionName: 'interestRate',\n },\n {\n address: collateralToken1,\n abi: collateralTrackerAbi,\n functionName: 'getPoolData',\n },\n ],\n blockNumber: targetBlockNumber,\n allowFailure: false,\n }),\n params._meta ?? getBlockMeta({ client, blockNumber: targetBlockNumber }),\n ])\n\n const [interestRate0, poolData0, interestRate1, poolData1] = rateData\n\n // Extract utilization from pool data\n const utilization0 = poolData0[3]\n const utilization1 = poolData1[3]\n\n // Annualize rates: interestRate() returns WAD/s\n const borrowRate0 = BigInt(interestRate0) * SECONDS_PER_YEAR\n const borrowRate1 = BigInt(interestRate1) * SECONDS_PER_YEAR\n\n // Supply rate = borrow rate * utilization (utilization is in bps, so /10000)\n const supplyRate0 = (borrowRate0 * utilization0) / 10000n\n const supplyRate1 = (borrowRate1 * utilization1) / 10000n\n\n return {\n borrowRate0,\n supplyRate0,\n borrowRate1,\n supplyRate1,\n _meta,\n }\n}\n","/**\n * Token amount formatters and parsers.\n *\n * All formatters require explicit precision - no hidden defaults.\n *\n * @module v2/formatters/amount\n */\n\nimport type { TokenFlow } from '../types'\n\n/**\n * Format a raw token amount to a human-readable string.\n *\n * @param amount - The amount in smallest units (e.g., wei)\n * @param decimals - Token decimals (e.g., 18n for WETH, 6n for USDC)\n * @param precision - Number of decimal places to display\n * @returns Formatted string\n *\n * @example\n * ```typescript\n * formatTokenAmount(1500000000000000000n, 18n, 4n) // \"1.5000\"\n * formatTokenAmount(1500000000000000000n, 18n, 2n) // \"1.50\"\n * formatTokenAmount(1500000n, 6n, 2n) // \"1.50\" (USDC)\n * formatTokenAmount(-500000000000000000n, 18n, 4n) // \"-0.5000\"\n * ```\n */\nexport function formatTokenAmount(amount: bigint, decimals: bigint, precision: bigint): string {\n const isNegative = amount < 0n\n const absAmount = isNegative ? -amount : amount\n const divisor = 10n ** decimals\n const integerPart = absAmount / divisor\n const fractionalPart = absAmount % divisor\n\n // Build fractional string with proper padding\n const fullFractionalStr = fractionalPart.toString().padStart(Number(decimals), '0')\n const truncatedFractionalStr = fullFractionalStr.slice(0, Number(precision))\n const paddedFractionalStr = truncatedFractionalStr.padEnd(Number(precision), '0')\n\n const sign = isNegative ? '-' : ''\n return precision > 0n ? `${sign}${integerPart}.${paddedFractionalStr}` : `${sign}${integerPart}`\n}\n\n/**\n * Format a token amount with a sign prefix (+/-) for non-zero values.\n * Useful for displaying PnL, deltas, or changes.\n *\n * @param amount - The amount in smallest units\n * @param decimals - Token decimals\n * @param precision - Number of decimal places to display\n * @returns Formatted string with sign prefix\n *\n * @example\n * ```typescript\n * formatTokenAmountSigned(1500000000000000000n, 18n, 4n) // \"+1.5000\"\n * formatTokenAmountSigned(-500000000000000000n, 18n, 4n) // \"-0.5000\"\n * formatTokenAmountSigned(0n, 18n, 4n) // \"0.0000\"\n * ```\n */\nexport function formatTokenAmountSigned(\n amount: bigint,\n decimals: bigint,\n precision: bigint,\n): string {\n const formatted = formatTokenAmount(amount, decimals, precision)\n if (amount > 0n) {\n return `+${formatted}`\n }\n return formatted\n}\n\n/**\n * Parse a human-readable token amount string to raw units.\n *\n * @param amount - Human-readable amount string (e.g., \"1.5\")\n * @param decimals - Token decimals\n * @returns Amount in smallest units\n *\n * @example\n * ```typescript\n * parseTokenAmount(\"1.5\", 18n) // 1500000000000000000n\n * parseTokenAmount(\"1.5\", 6n) // 1500000n (USDC)\n * parseTokenAmount(\"100\", 18n) // 100000000000000000000n\n * parseTokenAmount(\"-0.5\", 18n) // -500000000000000000n\n * ```\n */\nexport function parseTokenAmount(amount: string, decimals: bigint): bigint {\n const trimmed = amount.trim()\n const isNegative = trimmed.startsWith('-')\n const cleanAmount = isNegative ? trimmed.slice(1) : trimmed\n\n const [integerStr, fractionalStr = ''] = cleanAmount.split('.')\n const paddedFractional = fractionalStr.padEnd(Number(decimals), '0').slice(0, Number(decimals))\n\n const integerPart = BigInt(integerStr || '0') * 10n ** decimals\n const fractionalPart = BigInt(paddedFractional || '0')\n\n const result = integerPart + fractionalPart\n return isNegative ? -result : result\n}\n\n/**\n * Format a token delta amount with a sign prefix (+/-) for non-zero values.\n * Alias for formatTokenAmountSigned, useful for clarity at call sites.\n *\n * @param amount - The delta amount in smallest units\n * @param decimals - Token decimals\n * @param precision - Number of decimal places to display\n * @returns Formatted string with sign prefix\n */\nexport function formatTokenDelta(amount: bigint, decimals: bigint, precision: bigint): string {\n return formatTokenAmountSigned(amount, decimals, precision)\n}\n\n/**\n * Format token flow deltas and balances from simulation results.\n *\n * @param flow - Token flow data\n * @param decimals0 - Token0 decimals\n * @param decimals1 - Token1 decimals\n * @param precision0 - Precision for token0 formatting\n * @param precision1 - Precision for token1 formatting\n * @returns Formatted token flow strings\n */\nexport function formatTokenFlow(\n flow: TokenFlow,\n decimals0: bigint,\n decimals1: bigint,\n precision0: bigint,\n precision1: bigint,\n): {\n delta0: string\n delta1: string\n balanceBefore0: string\n balanceBefore1: string\n balanceAfter0: string\n balanceAfter1: string\n} {\n return {\n delta0: formatTokenAmountSigned(flow.delta0, decimals0, precision0),\n delta1: formatTokenAmountSigned(flow.delta1, decimals1, precision1),\n balanceBefore0: formatTokenAmount(flow.balanceBefore0, decimals0, precision0),\n balanceBefore1: formatTokenAmount(flow.balanceBefore1, decimals1, precision1),\n balanceAfter0: formatTokenAmount(flow.balanceAfter0, decimals0, precision0),\n balanceAfter1: formatTokenAmount(flow.balanceAfter1, decimals1, precision1),\n }\n}\n","/**\n * WAD-scaled value formatters.\n *\n * WAD is a fixed-point representation where 1e18 = 1.0.\n * Used extensively in DeFi for representing ratios, prices, and multipliers.\n *\n * @module v2/formatters/wad\n */\n\nimport { formatTokenAmount } from './amount'\n\n/**\n * Format a WAD-scaled value (1e18 = 1.0).\n *\n * @param wad - WAD-scaled value\n * @param precision - Number of decimal places to display\n * @returns Formatted string\n *\n * @example\n * ```typescript\n * formatWad(1220000000000000000n, 2n) // \"1.22\"\n * formatWad(1220000000000000000n, 4n) // \"1.2200\"\n * formatWad(1000000000000000000n, 2n) // \"1.00\"\n * formatWad(500000000000000000n, 2n) // \"0.50\"\n * ```\n */\nexport function formatWad(wad: bigint, precision: bigint): string {\n return formatTokenAmount(wad, 18n, precision)\n}\n\n/**\n * Format a WAD-scaled value with sign prefix (+/-) for non-zero values.\n *\n * @param wad - WAD-scaled value\n * @param precision - Number of decimal places to display\n * @returns Formatted string with sign prefix\n *\n * @example\n * ```typescript\n * formatWadSigned(1220000000000000000n, 2n) // \"+1.22\"\n * formatWadSigned(-500000000000000000n, 2n) // \"-0.50\"\n * formatWadSigned(0n, 2n) // \"0.00\"\n * ```\n */\nexport function formatWadSigned(wad: bigint, precision: bigint): string {\n const formatted = formatWad(wad, precision)\n if (wad > 0n) {\n return `+${formatted}`\n }\n return formatted\n}\n\n/**\n * Format a WAD-scaled value as a percentage string.\n *\n * @param wad - WAD-scaled value\n * @param precision - Number of decimal places to display\n * @returns Formatted percentage string\n *\n * @example\n * ```typescript\n * formatWadPercent(50000000000000000n, 2n) // \"5.00%\"\n * formatWadPercent(1000000000000000000n, 1n) // \"100.0%\"\n * ```\n */\nexport function formatWadPercent(wad: bigint, precision: bigint): string {\n return `${formatTokenAmount(wad * 100n, 18n, precision)}%`\n}\n\n/**\n * Format an annualized rate stored as a WAD-scaled value.\n * Alias for formatWadPercent.\n *\n * @param rateWad - Rate in WAD (1e18 = 1.0)\n * @param precision - Number of decimal places to display\n * @returns Formatted percentage string\n */\nexport function formatRateWad(rateWad: bigint, precision: bigint): string {\n return formatWadPercent(rateWad, precision)\n}\n\n/**\n * Parse a decimal string to a WAD-scaled value.\n *\n * @param value - Decimal string (e.g., \"1.5\")\n * @returns WAD-scaled bigint\n *\n * @example\n * ```typescript\n * parseWad(\"1.5\") // 1500000000000000000n\n * parseWad(\"0.5\") // 500000000000000000n\n * parseWad(\"100\") // 100000000000000000000n\n * parseWad(\"-1.22\") // -1220000000000000000n\n * ```\n */\nexport function parseWad(value: string): bigint {\n const trimmed = value.trim()\n const isNegative = trimmed.startsWith('-')\n const cleanValue = isNegative ? trimmed.slice(1) : trimmed\n\n const [integerStr, fractionalStr = ''] = cleanValue.split('.')\n const paddedFractional = fractionalStr.padEnd(18, '0').slice(0, 18)\n\n const integerPart = BigInt(integerStr || '0') * 10n ** 18n\n const fractionalPart = BigInt(paddedFractional || '0')\n\n const result = integerPart + fractionalPart\n return isNegative ? -result : result\n}\n","/**\n * Per-second rate helpers.\n *\n * Collateral tracker rates are returned as WAD-scaled per-second rates.\n * These helpers annualize them for display.\n *\n * @module v2/formatters/rates\n */\n\nimport { formatWadPercent } from './wad'\n\nconst SECONDS_PER_DAY = 86_400n\nconst DAYS_PER_YEAR = 365n\nconst SECONDS_PER_YEAR = SECONDS_PER_DAY * DAYS_PER_YEAR\n\n/**\n * Annualize a per-second WAD-scaled rate to annual WAD.\n *\n * @param ratePerSecondWad - Rate in WAD per second\n * @returns Annualized rate in WAD\n */\nexport function annualizePerSecondRateWad(ratePerSecondWad: bigint): bigint {\n return ratePerSecondWad * SECONDS_PER_YEAR\n}\n\n/**\n * Format a per-second WAD rate as APY percentage text.\n * Uses linear annualization, then formats as WAD percent.\n *\n * @param ratePerSecondWad - Rate in WAD per second\n * @param precision - Decimal places\n * @returns Percentage string, e.g. \"2.41%\"\n */\nexport function formatPerSecondRateWadAsApyPct(\n ratePerSecondWad: bigint,\n precision: bigint,\n): string {\n return formatWadPercent(annualizePerSecondRateWad(ratePerSecondWad), precision)\n}\n\n/**\n * Format a per-second WAD rate as APR percentage text.\n * For this rate model, APR presentation uses the same annualized output.\n *\n * @param ratePerSecondWad - Rate in WAD per second\n * @param precision - Decimal places\n * @returns Percentage string, e.g. \"2.41%\"\n */\nexport function formatPerSecondRateWadAsAprPct(\n ratePerSecondWad: bigint,\n precision: bigint,\n): string {\n return formatWadPercent(annualizePerSecondRateWad(ratePerSecondWad), precision)\n}\n"],"mappings":"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AAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;EACF;EACD,MAAM;CACP;CACD;EACE,MAAM;EACN,WAAW;EACX,QAAQ;GACN;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;EACF;EACD,MAAM;CACP;CACD;EACE,MAAM;EACN,WAAW;EACX,QAAQ;GACN;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;EACF;EACD,MAAM;CACP;CACD;EACE,MAAM;EACN,WAAW;EACX,QAAQ;GACN;IAAE,MAAM;IAAQ,cAAc;IAAW,MAAM;IAAW,SAAS;GAAM;GACzE;IAAE,MAAM;IAAM,cAAc;IAAW,MAAM;IAAW,SAAS;GAAM;GACvE;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;EACF;EACD,MAAM;CACP;CACD;EACE,MAAM;EACN,WAAW;EACX,QAAQ;GACN;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;GACD;IACE,MAAM;IACN,cAAc;IACd,MAAM;IACN,SAAS;GACV;EACF;EACD,MAAM;CACP;CACD;EAAE,MAAM;EAAS,QAAQ,CAAE;EAAE,MAAM;CAAsB;CACzD;EAAE,MAAM;EAAS,QAAQ,CAAE;EAAE,MAAM;CAA0B;CAC7D;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"}
|