@strobelabs/perpcity-sdk 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/abis/beacon.ts","../src/abis/perp-manager.ts","../src/context.ts","../src/abis/fees.ts","../src/abis/margin-ratios.ts","../src/utils/approve.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/utils/errors.ts","../src/utils/funding.ts","../src/utils/liquidity.ts","../src/utils/rpc.ts","../src/functions/open-position.ts","../src/functions/perp.ts","../src/functions/perp-manager.ts","../src/functions/position.ts","../src/functions/user.ts"],"sourcesContent":["export * from \"./abis\";\nexport * from \"./context\";\nexport * from \"./functions\";\nexport * from \"./types\";\nexport * from \"./types/entity-data\";\nexport * from \"./utils\";\n","export const BEACON_ABI = [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"contract IVerifierAdapter\",\n name: \"adapter\",\n type: \"address\",\n },\n {\n internalType: \"contract IIndexEngine\",\n name: \"engine\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"initialIndex\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [],\n name: \"AlreadyInitialized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NewOwnerIsZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NoHandoverRequest\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"Unauthorized\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"IndexUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverCanceled\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverRequested\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"oldOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"cancelOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"completeOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint16\",\n name: \"newCap\",\n type: \"uint16\",\n },\n ],\n name: \"increaseCardinalityCap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"index\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"indexEngine\",\n outputs: [\n {\n internalType: \"contract IIndexEngine\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"ownershipHandoverExpiresAt\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"result\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"requestOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IIndexEngine\",\n name: \"newIndexEngine\",\n type: \"address\",\n },\n ],\n name: \"setIndexEngine\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IVerifierAdapter\",\n name: \"newVerifierAdapter\",\n type: \"address\",\n },\n ],\n name: \"setVerifierAdapter\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint32\",\n name: \"secondsAgo\",\n type: \"uint32\",\n },\n ],\n name: \"twAvg\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"twAvgState\",\n outputs: [\n {\n internalType: \"uint16\",\n name: \"index\",\n type: \"uint16\",\n },\n {\n internalType: \"uint16\",\n name: \"cardinality\",\n type: \"uint16\",\n },\n {\n internalType: \"uint16\",\n name: \"cardinalityCap\",\n type: \"uint16\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"proof\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"inputs\",\n type: \"bytes\",\n },\n ],\n name: \"updateIndex\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"verifierAdapter\",\n outputs: [\n {\n internalType: \"contract IVerifierAdapter\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","export const PERP_MANAGER_ABI = [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"contract IBeaconRegistry\",\n name: \"beaconRegistry\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [],\n name: \"AccountBalanceOverflow\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"AlreadyInitialized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BalanceQueryForZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BeaconNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"CouldNotFullyFill\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"FeeTooLarge\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"FeesNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint8\",\n name: \"action\",\n type: \"uint8\",\n },\n ],\n name: \"InvalidAction\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidCaller\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidMargin\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidMarginRatio\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"LockupPeriodNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MakerNotAllowed\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MarginRatiosNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MaximumAmountExceeded\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MinimumAmountInsufficient\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NewOwnerIsZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NoHandoverRequest\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NotOwnerNorApproved\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NotPoolManager\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"PerpDoesNotExist\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"PositionLocked\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"SqrtPriceImpactLimitNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"StartingSqrtPriceTooHigh\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"StartingSqrtPriceTooLow\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TicksOutOfBounds\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TokenAlreadyExists\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TokenDoesNotExist\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TransferFromIncorrectOwner\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TransferToNonERC721ReceiverImplementer\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TransferToZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"Unauthorized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroDelta\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroLiquidity\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroNotional\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"isApproved\",\n type: \"bool\",\n },\n ],\n name: \"ApprovalForAll\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint8\",\n name: \"moduleType\",\n type: \"uint8\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"module\",\n type: \"address\",\n },\n ],\n name: \"ModuleRegistered\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"newMargin\",\n type: \"uint256\",\n },\n ],\n name: \"MarginAdjusted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"longOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"shortOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"newPerpDelta\",\n type: \"int256\",\n },\n ],\n name: \"NotionalAdjusted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverCanceled\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverRequested\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"oldOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"beacon\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"indexPriceX96\",\n type: \"uint256\",\n },\n ],\n name: \"PerpCreated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"longOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"shortOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"wasMaker\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"wasLiquidated\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"wasPartialClose\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"exitPerpDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"exitUsdDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"netUsdDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"funding\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"utilizationFee\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"adl\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"liquidationFee\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"netMargin\",\n type: \"int256\",\n },\n ],\n name: \"PositionClosed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"longOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"shortOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"isMaker\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n ],\n name: \"PositionOpened\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"BEACON_REGISTRY\",\n outputs: [\n {\n internalType: \"contract IBeaconRegistry\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ERC721_NAME\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ERC721_SYMBOL\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ERC721_URI\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MAX_PROTOCOL_FEE\",\n outputs: [\n {\n internalType: \"uint24\",\n name: \"\",\n type: \"uint24\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n internalType: \"int256\",\n name: \"marginDelta\",\n type: \"int256\",\n },\n ],\n internalType: \"struct IPerpManager.AdjustMarginParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"adjustMargin\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n {\n internalType: \"uint128\",\n name: \"perpLimit\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.AdjustNotionalParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"adjustNotional\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"result\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"cancelOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"cardinalityCap\",\n outputs: [\n {\n internalType: \"uint16\",\n name: \"\",\n type: \"uint16\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n name: \"cfgs\",\n outputs: [\n {\n components: [\n {\n internalType: \"Currency\",\n name: \"currency0\",\n type: \"address\",\n },\n {\n internalType: \"Currency\",\n name: \"currency1\",\n type: \"address\",\n },\n {\n internalType: \"uint24\",\n name: \"fee\",\n type: \"uint24\",\n },\n {\n internalType: \"int24\",\n name: \"tickSpacing\",\n type: \"int24\",\n },\n {\n internalType: \"contract IHooks\",\n name: \"hooks\",\n type: \"address\",\n },\n ],\n internalType: \"struct PoolKey\",\n name: \"key\",\n type: \"tuple\",\n },\n {\n internalType: \"address\",\n name: \"creator\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"vault\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"beacon\",\n type: \"address\",\n },\n {\n internalType: \"contract IFees\",\n name: \"fees\",\n type: \"address\",\n },\n {\n internalType: \"contract IMarginRatios\",\n name: \"marginRatios\",\n type: \"address\",\n },\n {\n internalType: \"contract ILockupPeriod\",\n name: \"lockupPeriod\",\n type: \"address\",\n },\n {\n internalType: \"contract ISqrtPriceImpactLimit\",\n name: \"sqrtPriceImpactLimit\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint128\",\n name: \"minAmt0Out\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"minAmt1Out\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt1In\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.ClosePositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"closePosition\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n ],\n name: \"collectProtocolFees\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"completeOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"address\",\n name: \"beacon\",\n type: \"address\",\n },\n {\n internalType: \"contract IFees\",\n name: \"fees\",\n type: \"address\",\n },\n {\n internalType: \"contract IMarginRatios\",\n name: \"marginRatios\",\n type: \"address\",\n },\n {\n internalType: \"contract ILockupPeriod\",\n name: \"lockupPeriod\",\n type: \"address\",\n },\n {\n internalType: \"contract ISqrtPriceImpactLimit\",\n name: \"sqrtPriceImpactLimit\",\n type: \"address\",\n },\n ],\n internalType: \"struct IPerpManager.CreatePerpParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"createPerp\",\n outputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"fundingPerSecondX96\",\n outputs: [\n {\n internalType: \"int256\",\n name: \"\",\n type: \"int256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"getApproved\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint16\",\n name: \"cardinalityCap\",\n type: \"uint16\",\n },\n ],\n name: \"increaseCardinalityCap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"insurance\",\n outputs: [\n {\n internalType: \"uint128\",\n name: \"\",\n type: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n ],\n name: \"isApprovedForAll\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"result\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint8\",\n name: \"moduleType\",\n type: \"uint8\",\n },\n {\n internalType: \"address\",\n name: \"module\",\n type: \"address\",\n },\n ],\n name: \"isModuleRegistered\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextPosId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint120\",\n name: \"liquidity\",\n type: \"uint120\",\n },\n {\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt0In\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt1In\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenMakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"openMakerPos\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"bool\",\n name: \"isLong\",\n type: \"bool\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint24\",\n name: \"marginRatio\",\n type: \"uint24\",\n },\n {\n internalType: \"uint128\",\n name: \"unspecifiedAmountLimit\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenTakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"openTakerPos\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"ownerOf\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"ownershipHandoverExpiresAt\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"result\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n name: \"positions\",\n outputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"margin\",\n type: \"uint256\",\n },\n {\n internalType: \"int256\",\n name: \"entryPerpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryUsdDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingX96\",\n type: \"int256\",\n },\n {\n internalType: \"uint256\",\n name: \"entryCumlBadDebtX96\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"entryCumlUtilizationX96\",\n type: \"uint256\",\n },\n {\n components: [\n {\n internalType: \"uint24\",\n name: \"min\",\n type: \"uint24\",\n },\n {\n internalType: \"uint24\",\n name: \"max\",\n type: \"uint24\",\n },\n {\n internalType: \"uint24\",\n name: \"liq\",\n type: \"uint24\",\n },\n ],\n internalType: \"struct IMarginRatios.MarginRatios\",\n name: \"marginRatios\",\n type: \"tuple\",\n },\n {\n components: [\n {\n internalType: \"uint32\",\n name: \"unlockTimestamp\",\n type: \"uint32\",\n },\n {\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n internalType: \"uint128\",\n name: \"liquidity\",\n type: \"uint128\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingBelowX96\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingWithinX96\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingDivSqrtPWithinX96\",\n type: \"int256\",\n },\n ],\n internalType: \"struct IPerpManager.MakerDetails\",\n name: \"makerDetails\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"protocolFee\",\n outputs: [\n {\n internalType: \"uint24\",\n name: \"\",\n type: \"uint24\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n name: \"quoteClosePosition\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"pnl\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"funding\",\n type: \"int256\",\n },\n {\n internalType: \"uint256\",\n name: \"netMargin\",\n type: \"uint256\",\n },\n {\n internalType: \"bool\",\n name: \"wasLiquidated\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint120\",\n name: \"liquidity\",\n type: \"uint120\",\n },\n {\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt0In\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt1In\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenMakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"quoteOpenMakerPosition\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"bool\",\n name: \"isLong\",\n type: \"bool\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint24\",\n name: \"marginRatio\",\n type: \"uint24\",\n },\n {\n internalType: \"uint128\",\n name: \"unspecifiedAmountLimit\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenTakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"quoteOpenTakerPosition\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"bool\",\n name: \"zeroForOne\",\n type: \"bool\",\n },\n {\n internalType: \"bool\",\n name: \"isExactIn\",\n type: \"bool\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint160\",\n name: \"sqrtPriceLimitX96\",\n type: \"uint160\",\n },\n ],\n name: \"quoteSwap\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint8\",\n name: \"moduleType\",\n type: \"uint8\",\n },\n {\n internalType: \"address\",\n name: \"module\",\n type: \"address\",\n },\n ],\n name: \"registerModule\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"requestOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"safeTransferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"safeTransferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n {\n internalType: \"bool\",\n name: \"isApproved\",\n type: \"bool\",\n },\n ],\n name: \"setApprovalForAll\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint24\",\n name: \"newProtocolFee\",\n type: \"uint24\",\n },\n ],\n name: \"setProtocolFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes4\",\n name: \"interfaceId\",\n type: \"bytes4\",\n },\n ],\n name: \"supportsInterface\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"result\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"takerOpenInterest\",\n outputs: [\n {\n internalType: \"uint128\",\n name: \"longOI\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"shortOI\",\n type: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint32\",\n name: \"lookbackWindow\",\n type: \"uint32\",\n },\n ],\n name: \"timeWeightedAvgSqrtPriceX96\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"twAvg\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n name: \"tokenURI\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"unlockCallback\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"encodedDelta\",\n type: \"bytes\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"utilFeePerSecX96\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import TTLCache from \"@isaacs/ttlcache\";\nimport {\n type Address,\n createPublicClient,\n erc20Abi,\n formatUnits,\n type Hex,\n http,\n type PublicClient,\n} from \"viem\";\nimport { FEES_ABI } from \"./abis/fees\";\nimport { MARGIN_RATIOS_ABI } from \"./abis/margin-ratios\";\nimport { PERP_MANAGER_ABI } from \"./abis/perp-manager\";\nimport type { PerpCityContextConfig, PerpCityDeployments } from \"./types\";\nimport type {\n Bounds,\n Fees,\n LiveDetails,\n OpenPositionData,\n PerpConfig,\n PerpData,\n PositionRawData,\n UserData,\n} from \"./types/entity-data\";\nimport {\n marginRatioToLeverage,\n priceToSqrtPriceX96,\n sqrtPriceX96ToPrice,\n uint256ToInt256,\n} from \"./utils\";\nimport { withErrorHandling } from \"./utils/errors\";\n\nexport class PerpCityContext {\n public readonly walletClient;\n public readonly publicClient: PublicClient;\n private readonly _deployments: PerpCityDeployments;\n private readonly configCache: TTLCache<Hex, PerpConfig>;\n\n constructor(config: PerpCityContextConfig) {\n this.configCache = new TTLCache({ ttl: 5 * 60 * 1000 });\n this.walletClient = config.walletClient;\n\n // Validate walletClient.chain exists\n if (!config.walletClient.chain?.id) {\n throw new Error(\n \"PerpCityContext: walletClient.chain must be defined with a numeric id. \" +\n \"Ensure your walletClient was created with a chain parameter.\"\n );\n }\n\n // Create publicClient with HTTP transport and batching enabled\n this.publicClient = createPublicClient({\n chain: config.walletClient.chain,\n transport: http(config.rpcUrl, { batch: true }),\n });\n\n this._deployments = config.deployments;\n }\n\n /**\n * Validates that the RPC endpoint matches the expected chain.\n * Call this after construction to verify configuration.\n * @throws Error if RPC chain ID doesn't match walletClient chain ID\n */\n async validateChainId(): Promise<void> {\n const rpcChainId = await this.publicClient.getChainId();\n const expectedChainId = this.walletClient.chain!.id;\n\n if (rpcChainId !== expectedChainId) {\n throw new Error(\n `PerpCityContext: RPC chain mismatch. ` +\n `RPC returned chain ID ${rpcChainId}, but walletClient expects chain ID ${expectedChainId}. ` +\n `Ensure rpcUrl corresponds to the correct network.`\n );\n }\n }\n\n deployments(): PerpCityDeployments {\n return this._deployments;\n }\n\n // Optimized batch data fetching methods\n\n private async fetchPerpData(perpId: Hex): Promise<PerpData> {\n return withErrorHandling(async () => {\n // Fetch contract data only - no historical time series\n const contractData = await this.fetchPerpContractData(perpId);\n const config = await this.getPerpConfig(perpId);\n\n const perpData: PerpData = {\n id: perpId,\n tickSpacing: contractData.tickSpacing,\n mark: sqrtPriceX96ToPrice(contractData.sqrtPriceX96),\n beacon: config.beacon,\n bounds: contractData.bounds,\n fees: contractData.fees,\n };\n\n return perpData;\n }, `fetchPerpData for perp ${perpId}`);\n }\n\n /**\n * Fetches and caches the config for a perpId\n * The config includes module addresses (fees, marginRatios, etc.) and pool settings\n */\n async getPerpConfig(perpId: Hex): Promise<PerpConfig> {\n // Check cache first\n const cached = this.configCache.get(perpId);\n if (cached) {\n return cached;\n }\n\n // Fetch from contract\n const result = await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"cfgs\",\n args: [perpId],\n });\n\n // Viem returns outer tuple as array, inner tuples as objects with named properties\n const resultArray = result as unknown as any[];\n const keyData = resultArray[0];\n\n // Validate that perpId exists - contract returns empty values for non-existent perps\n if (\n !keyData ||\n keyData.tickSpacing === 0 ||\n keyData.currency0 === \"0x0000000000000000000000000000000000000000\"\n ) {\n throw new Error(`Perp ID ${perpId} not found or invalid`);\n }\n\n const cfg: PerpConfig = {\n key: {\n currency0: keyData.currency0 as Address,\n currency1: keyData.currency1 as Address,\n fee: Number(keyData.fee),\n tickSpacing: Number(keyData.tickSpacing),\n hooks: keyData.hooks as Address,\n },\n creator: resultArray[1] as Address,\n vault: resultArray[2] as Address,\n beacon: resultArray[3] as Address,\n fees: resultArray[4] as Address,\n marginRatios: resultArray[5] as Address,\n lockupPeriod: resultArray[6] as Address,\n sqrtPriceImpactLimit: resultArray[7] as Address,\n };\n\n // Store in cache\n this.configCache.set(perpId, cfg);\n\n return cfg;\n }\n\n private async fetchPerpContractData(\n perpId: Hex,\n markPrice?: number\n ): Promise<{\n tickSpacing: number;\n sqrtPriceX96: bigint;\n bounds: Bounds;\n fees: Fees;\n }> {\n return withErrorHandling(async () => {\n // Get config from cache or fetch if not cached\n const cfg = await this.getPerpConfig(perpId);\n\n // Extract tickSpacing from PoolKey\n const tickSpacing = Number(cfg.key.tickSpacing);\n\n // Calculate sqrtPriceX96 from mark price if available, otherwise use TWAP\n let sqrtPriceX96: bigint;\n if (markPrice) {\n sqrtPriceX96 = priceToSqrtPriceX96(markPrice);\n } else {\n // Fallback to TWAP with 1 second lookback\n sqrtPriceX96 = (await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"timeWeightedAvgSqrtPriceX96\",\n args: [perpId, 1],\n })) as bigint;\n }\n\n // Fetch bounds and fees from module contracts in parallel\n const [\n minTakerRatio,\n maxTakerRatio,\n liquidationTakerRatio,\n creatorFee,\n insuranceFee,\n lpFee,\n liquidationFee,\n ] = await Promise.all([\n this.publicClient.readContract({\n address: cfg.marginRatios,\n abi: MARGIN_RATIOS_ABI,\n functionName: \"MIN_TAKER_RATIO\",\n }),\n this.publicClient.readContract({\n address: cfg.marginRatios,\n abi: MARGIN_RATIOS_ABI,\n functionName: \"MAX_TAKER_RATIO\",\n }),\n this.publicClient.readContract({\n address: cfg.marginRatios,\n abi: MARGIN_RATIOS_ABI,\n functionName: \"LIQUIDATION_TAKER_RATIO\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"CREATOR_FEE\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"INSURANCE_FEE\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"LP_FEE\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"LIQUIDATION_FEE\",\n }),\n ]);\n\n // Convert margin ratios to leverage bounds\n // Margin ratio is scaled by 1e6, where ratio = margin / notional\n // Leverage = notional / margin = 1 / ratio\n const minTakerLeverage = marginRatioToLeverage(Number(maxTakerRatio)); // Note: max ratio -> min leverage\n const maxTakerLeverage = marginRatioToLeverage(Number(minTakerRatio)); // Note: min ratio -> max leverage\n\n // Convert fees from scaled uint24 (1e6) to decimal percentages\n const scaleFee = (fee: number) => fee / 1e6;\n\n return {\n tickSpacing,\n sqrtPriceX96,\n bounds: {\n minMargin: 10, // Still hardcoded - not available from margin ratios module\n minTakerLeverage,\n maxTakerLeverage,\n liquidationTakerRatio: Number(liquidationTakerRatio) / 1e6,\n },\n fees: {\n creatorFee: scaleFee(Number(creatorFee)),\n insuranceFee: scaleFee(Number(insuranceFee)),\n lpFee: scaleFee(Number(lpFee)),\n liquidationFee: scaleFee(Number(liquidationFee)),\n },\n };\n }, `fetchPerpContractData for perp ${perpId}`);\n }\n\n /**\n * Fetch comprehensive perp data with all related information in a single batched request\n */\n async getPerpData(perpId: Hex): Promise<PerpData> {\n return this.fetchPerpData(perpId);\n }\n\n private async fetchUserData(\n userAddress: Hex,\n positions: Array<{ perpId: Hex; positionId: bigint; isLong: boolean; isMaker: boolean }>\n ): Promise<UserData> {\n const usdcBalance = await this.publicClient.readContract({\n address: this.deployments().usdc,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [userAddress],\n });\n\n // Fetch live details for all positions in parallel\n const openPositionsData = await Promise.all(\n positions.map(async ({ perpId, positionId, isLong, isMaker }) => {\n const liveDetails = await this.fetchPositionLiveDetailsFromContract(perpId, positionId);\n return {\n perpId,\n positionId,\n isLong,\n isMaker,\n liveDetails,\n };\n })\n );\n\n return {\n walletAddress: userAddress,\n usdcBalance: Number(formatUnits(usdcBalance, 6)),\n openPositions: openPositionsData,\n };\n }\n\n private async fetchPositionLiveDetailsFromContract(\n _perpId: Hex,\n positionId: bigint\n ): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n })) as unknown as readonly [Hex, bigint, bigint, bigint, boolean, bigint];\n\n // The result is a tuple: [unexpectedReason, pnl, funding, netMargin, wasLiquidated, notional]\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(\n `Failed to quote position ${positionId} - position may be invalid or already closed`\n );\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n // Negate so positive = user receives funding\n fundingPayment: -Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `fetchPositionLiveDetailsFromContract for position ${positionId}`);\n }\n\n /**\n * Fetch comprehensive user data with live details for all positions\n * @param userAddress - The user's wallet address\n * @param positions - Array of position metadata (perpId, positionId, isLong, isMaker) tracked from transaction receipts\n */\n async getUserData(\n userAddress: Hex,\n positions: Array<{ perpId: Hex; positionId: bigint; isLong: boolean; isMaker: boolean }>\n ): Promise<UserData> {\n return this.fetchUserData(userAddress, positions);\n }\n\n /**\n * Fetch open position data with live details\n * @param perpId - The perpetual market ID\n * @param positionId - The position ID\n * @param isLong - Whether the position is long (true) or short (false)\n * @param isMaker - Whether the position is a maker (LP) position\n */\n async getOpenPositionData(\n perpId: Hex,\n positionId: bigint,\n isLong: boolean,\n isMaker: boolean\n ): Promise<OpenPositionData> {\n const liveDetails = await this.fetchPositionLiveDetailsFromContract(perpId, positionId);\n\n return {\n perpId,\n positionId,\n isLong,\n isMaker,\n liveDetails,\n };\n }\n\n /**\n * Fetch raw position data from the contract\n * This includes entry price data, margin, and position size needed for calculations\n * @param positionId - The position ID\n */\n async getPositionRawData(positionId: bigint): Promise<PositionRawData> {\n return withErrorHandling(async () => {\n const result = await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"positions\",\n args: [positionId],\n });\n\n // The result is a tuple matching the Position struct:\n // [perpId, margin, entryPerpDelta, entryUsdDelta, entryCumlFundingX96,\n // entryCumlBadDebtX96, entryCumlUtilizationX96, marginRatios, makerDetails]\n const resultArray = result as unknown as readonly [\n Hex, // perpId\n bigint, // margin\n bigint, // entryPerpDelta\n bigint, // entryUsdDelta\n bigint, // entryCumlFundingX96\n bigint, // entryCumlBadDebtX96\n bigint, // entryCumlUtilizationX96\n { min: number; max: number; liq: number }, // marginRatios\n { unlockTimestamp: bigint; tickLower: number; tickUpper: number } | null, // makerDetails\n ];\n\n const [perpId, margin, entryPerpDelta, entryUsdDelta, , , , marginRatios, makerDetailsRaw] =\n resultArray;\n\n // Check if position exists (non-existent positions have zero perpId)\n const zeroPerpId = `0x${\"0\".repeat(64)}` as Hex;\n if (perpId === zeroPerpId) {\n throw new Error(`Position ${positionId} does not exist`);\n }\n\n const isMaker =\n makerDetailsRaw != null &&\n (makerDetailsRaw.tickLower !== 0 || makerDetailsRaw.tickUpper !== 0);\n\n return {\n perpId,\n positionId,\n margin: Number(formatUnits(margin, 6)),\n entryPerpDelta,\n entryUsdDelta,\n marginRatios: {\n min: Number(marginRatios.min),\n max: Number(marginRatios.max),\n liq: Number(marginRatios.liq),\n },\n makerDetails: isMaker\n ? {\n unlockTimestamp: Number(makerDetailsRaw.unlockTimestamp),\n tickLower: makerDetailsRaw.tickLower,\n tickUpper: makerDetailsRaw.tickUpper,\n }\n : null,\n };\n }, `getPositionRawData for position ${positionId}`);\n }\n}\n","export const FEES_ABI = [\n {\n inputs: [],\n name: \"CREATOR_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"INSURANCE_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LP_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LIQUIDATION_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","export const MARGIN_RATIOS_ABI = [\n {\n inputs: [],\n name: \"MIN_MAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MAX_MAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LIQUIDATION_MAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MIN_TAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MAX_TAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LIQUIDATION_TAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { type Address, erc20Abi } from \"viem\";\nimport type { PerpCityContext } from \"../context\";\n\nconst DEFAULT_CONFIRMATIONS = 2;\n\nexport async function getUsdcAllowance(context: PerpCityContext, owner: Address): Promise<bigint> {\n const deployments = context.deployments();\n return context.publicClient.readContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [owner, deployments.perpManager],\n }) as Promise<bigint>;\n}\n\nexport async function approveUsdc(\n context: PerpCityContext,\n amount: bigint,\n confirmations: number = DEFAULT_CONFIRMATIONS\n) {\n const deployments = context.deployments();\n\n const { request } = await context.publicClient.simulateContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [deployments.perpManager, amount],\n account: context.walletClient.account,\n });\n\n const hash = await context.walletClient.writeContract(request);\n\n await context.publicClient.waitForTransactionReceipt({\n confirmations: confirmations,\n hash,\n });\n}\n","export const NUMBER_1E6: number = 1000000; // 1e6\nexport const BIGINT_1E6: bigint = 1000000n; // 1e6\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n\nexport const MIN_TICK = -887272;\nexport const MAX_TICK = 887272;\nexport const MIN_PRICE = 1e-6;\nexport const MAX_PRICE = 1e6;\n\nexport const UINT256_MAX = (1n << 256n) - 1n;\nexport const INT256_THRESHOLD = 1n << 255n;\n","import {\n BIGINT_1E6,\n INT256_THRESHOLD,\n MAX_PRICE,\n MIN_PRICE,\n NUMBER_1E6,\n Q96,\n UINT256_MAX,\n} from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price <= 0) {\n throw new Error(\"Price must be positive\");\n }\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error(\"Price too large\");\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * NUMBER_1E6;\n return (BigInt(Math.floor(scaledSqrtPrice)) * Q96) / BigInt(NUMBER_1E6);\n}\n\n/**\n * Scales a number to 6 decimal precision as a bigint\n * @param amount - The amount to scale (can be negative for signed values)\n * @returns The scaled amount as a bigint\n */\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / NUMBER_1E6) {\n throw new Error(\"Amount too large\");\n }\n\n return BigInt(Math.floor(amount * NUMBER_1E6));\n}\n\nexport function scaleToX96(amount: number): bigint {\n return (BigInt(scale6Decimals(amount)) * Q96) / BigInt(NUMBER_1E6);\n}\n\nexport function scaleFromX96(valueX96: bigint): number {\n const valueScaled6Decimals = (valueX96 * BIGINT_1E6) / Q96;\n\n if (valueScaled6Decimals > Number.MAX_SAFE_INTEGER) {\n throw new Error(\"Value too large\");\n }\n\n return Number(valueScaled6Decimals) / NUMBER_1E6;\n}\n\nexport function priceToTick(price: number, roundDown: boolean): number {\n if (price <= 0) {\n throw new Error(\"Price must be positive\");\n }\n if (price < MIN_PRICE || price > MAX_PRICE) {\n throw new Error(\n `Price ${price} is outside the representable range [${MIN_PRICE}, ${MAX_PRICE}]`\n );\n }\n const logPrice = Math.log(price) / Math.log(1.0001);\n return roundDown ? Math.floor(logPrice) : Math.ceil(logPrice);\n}\n\nexport function tickToPrice(tick: number): number {\n return 1.0001 ** tick;\n}\n\n/**\n * Interprets a uint256 as int256 if it exceeds 2^255 (unsigned underflow).\n * The contract returns netMargin as uint256, but it can underflow when\n * the effective margin is negative (position is underwater).\n */\nexport function uint256ToInt256(value: bigint): bigint {\n if (value >= INT256_THRESHOLD) {\n return value - UINT256_MAX - 1n;\n }\n return value;\n}\n\nexport function sqrtPriceX96ToPrice(sqrtPriceX96: bigint): number {\n const priceX96 = (sqrtPriceX96 * sqrtPriceX96) / Q96;\n return scaleFromX96(priceX96);\n}\n\nexport function marginRatioToLeverage(marginRatio: number): number {\n if (marginRatio <= 0) {\n throw new Error(\"Margin ratio must be greater than 0\");\n }\n return NUMBER_1E6 / marginRatio;\n}\n\nexport function scaleFrom6Decimals(value: number): number {\n return value / NUMBER_1E6;\n}\n","import { BaseError, ContractFunctionRevertedError } from \"viem\";\n\n/**\n * Error category classification\n */\nexport enum ErrorCategory {\n USER_ERROR = \"USER_ERROR\",\n STATE_ERROR = \"STATE_ERROR\",\n SYSTEM_ERROR = \"SYSTEM_ERROR\",\n CONFIG_ERROR = \"CONFIG_ERROR\",\n}\n\n/**\n * Contract source classification\n */\nexport enum ErrorSource {\n PERP_MANAGER = \"PERP_MANAGER\",\n POOL_MANAGER = \"POOL_MANAGER\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Debug information for contract errors\n */\nexport interface ErrorDebugInfo {\n errorSelector?: string;\n source: ErrorSource;\n category: ErrorCategory;\n rawData?: string;\n canRetry?: boolean;\n retryGuidance?: string;\n}\n\n/**\n * Base class for all PerpCity SDK errors\n */\nexport class PerpCityError extends Error {\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"PerpCityError\";\n }\n}\n\n/**\n * Error thrown when a contract call reverts\n */\nexport class ContractError extends PerpCityError {\n constructor(\n message: string,\n public readonly errorName?: string,\n public readonly args?: readonly unknown[],\n public readonly debug?: ErrorDebugInfo,\n cause?: Error\n ) {\n super(message, cause);\n this.name = \"ContractError\";\n }\n}\n\n/**\n * Error thrown when a transaction is rejected by the user\n */\nexport class TransactionRejectedError extends PerpCityError {\n constructor(message = \"Transaction rejected by user\", cause?: Error) {\n super(message, cause);\n this.name = \"TransactionRejectedError\";\n }\n}\n\n/**\n * Error thrown when there are insufficient funds\n */\nexport class InsufficientFundsError extends PerpCityError {\n constructor(message = \"Insufficient funds for transaction\", cause?: Error) {\n super(message, cause);\n this.name = \"InsufficientFundsError\";\n }\n}\n\n/**\n * Error thrown when an RPC call fails\n */\nexport class RPCError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"RPCError\";\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Parse and format a contract error into a user-friendly message\n */\nexport function parseContractError(error: unknown): PerpCityError {\n if (error instanceof PerpCityError) {\n return error;\n }\n\n // Handle viem BaseError\n if (error instanceof BaseError) {\n const revertError = error.walk((err) => err instanceof ContractFunctionRevertedError);\n\n if (revertError instanceof ContractFunctionRevertedError) {\n const errorName = revertError.data?.errorName ?? \"Unknown\";\n const args = revertError.data?.args ?? [];\n\n // Map known contract errors to user-friendly messages\n const { message, debug } = formatContractError(errorName, args);\n return new ContractError(message, errorName, args, debug, error as Error);\n }\n\n // Check for user rejection\n if (error.message?.includes(\"User rejected\") || (error as any).code === 4001) {\n return new TransactionRejectedError(error.message, error as Error);\n }\n\n // Check for insufficient funds\n if (error.message?.includes(\"insufficient funds\")) {\n return new InsufficientFundsError(error.message, error as Error);\n }\n\n return new PerpCityError(error.shortMessage || error.message, error as Error);\n }\n\n // Handle generic errors\n if (error instanceof Error) {\n return new PerpCityError(error.message, error);\n }\n\n return new PerpCityError(String(error));\n}\n\n/**\n * Detect the source of an error based on its name\n */\nfunction detectErrorSource(errorName: string): ErrorSource {\n // Uniswap V4 PoolManager errors\n const poolManagerErrors = [\n \"CurrencyNotSettled\",\n \"PoolNotInitialized\",\n \"AlreadyUnlocked\",\n \"ManagerLocked\",\n \"TickSpacingTooLarge\",\n \"TickSpacingTooSmall\",\n \"CurrenciesOutOfOrderOrEqual\",\n \"UnauthorizedDynamicLPFeeUpdate\",\n \"SwapAmountCannotBeZero\",\n \"NonzeroNativeValue\",\n \"MustClearExactPositiveDelta\",\n ];\n\n // Known PerpManager errors\n const perpManagerErrors = [\n \"InvalidBeaconAddress\",\n \"InvalidTradingFeeSplits\",\n \"InvalidMaxOpeningLev\",\n \"InvalidLiquidationLev\",\n \"InvalidLiquidationFee\",\n \"InvalidLiquidatorFeeSplit\",\n \"InvalidClose\",\n \"InvalidCaller\",\n \"InvalidLiquidity\",\n \"InvalidMargin\",\n \"InvalidLevX96\",\n \"MakerPositionLocked\",\n \"MaximumAmountExceeded\",\n \"MinimumAmountInsufficient\",\n \"PriceImpactTooHigh\",\n \"SwapReverted\",\n \"ZeroSizePosition\",\n \"InvalidFundingInterval\",\n \"InvalidPriceImpactBand\",\n \"InvalidMarketDeathThreshold\",\n \"InvalidTickRange\",\n \"MarketNotKillable\",\n \"InvalidStartingSqrtPriceX96\",\n \"AccountBalanceOverflow\",\n \"BalanceQueryForZeroAddress\",\n \"NotOwnerNorApproved\",\n \"TokenAlreadyExists\",\n \"TokenDoesNotExist\",\n \"TransferFromIncorrectOwner\",\n \"TransferToNonERC721ReceiverImplementer\",\n \"TransferToZeroAddress\",\n \"NewOwnerIsZeroAddress\",\n \"NoHandoverRequest\",\n \"Unauthorized\",\n \"TransferFromFailed\",\n \"TransferFailed\",\n \"ApproveFailed\",\n \"AlreadyInitialized\",\n \"FeesNotRegistered\",\n \"FeeTooLarge\",\n \"MarginRatiosNotRegistered\",\n \"LockupPeriodNotRegistered\",\n \"SqrtPriceImpactLimitNotRegistered\",\n \"ModuleAlreadyRegistered\",\n \"InvalidAction\",\n \"InvalidMarginRatio\",\n \"MakerNotAllowed\",\n \"PositionLocked\",\n \"ZeroDelta\",\n \"NotPoolManager\",\n \"NoLiquidityToReceiveFees\",\n ];\n\n if (poolManagerErrors.includes(errorName)) {\n return ErrorSource.POOL_MANAGER;\n }\n\n if (perpManagerErrors.includes(errorName)) {\n return ErrorSource.PERP_MANAGER;\n }\n\n return ErrorSource.UNKNOWN;\n}\n\n/**\n * Format a contract error name and args into a user-friendly message with debug info\n */\nfunction formatContractError(\n errorName: string,\n args: readonly unknown[]\n): { message: string; debug: ErrorDebugInfo } {\n const source = detectErrorSource(errorName);\n\n switch (errorName) {\n // Existing PerpManager errors\n case \"InvalidBeaconAddress\":\n return {\n message: `Invalid beacon address: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidTradingFeeSplits\":\n return {\n message: `Invalid trading fee splits. Insurance split: ${args[0]}, Creator split: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidMaxOpeningLev\":\n return {\n message: `Invalid maximum opening leverage: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidLiquidationLev\":\n return {\n message: `Invalid liquidation leverage: ${args[0]}. Must be less than max opening leverage: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidLiquidationFee\":\n return {\n message: `Invalid liquidation fee: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidLiquidatorFeeSplit\":\n return {\n message: `Invalid liquidator fee split: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidClose\":\n return {\n message: `Cannot close position. Caller: ${args[0]}, Holder: ${args[1]}, Is Liquidated: ${args[2]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidCaller\":\n return {\n message: `Invalid caller. Expected: ${args[1]}, Got: ${args[0]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidLiquidity\":\n return {\n message: `Invalid liquidity amount: ${args[0]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidMargin\":\n return {\n message: `Invalid margin amount: ${args[0]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidLevX96\":\n return {\n message: `Invalid leverage: ${args[0]}. Maximum allowed: ${args[1]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MakerPositionLocked\":\n return {\n message: `Maker position is locked until ${new Date(Number(args[1]) * 1000).toISOString()}. Current time: ${new Date(Number(args[0]) * 1000).toISOString()}`,\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"MaximumAmountExceeded\":\n return {\n message: `Maximum amount exceeded. Maximum: ${args[0]}, Requested: ${args[1]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MinimumAmountInsufficient\":\n return {\n message:\n \"Slippage tolerance exceeded. The position's value moved unfavorably during execution. Try increasing your slippage tolerance.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"PriceImpactTooHigh\":\n return {\n message: `Price impact too high. Current price: ${args[0]}, Min acceptable: ${args[1]}, Max acceptable: ${args[2]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"SwapReverted\":\n return {\n message: \"Swap failed. This may be due to insufficient liquidity or slippage tolerance.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"ZeroSizePosition\":\n return {\n message: `Cannot create zero-size position. Perp delta: ${args[0]}, USD delta: ${args[1]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidFundingInterval\":\n return {\n message: `Invalid funding interval: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidPriceImpactBand\":\n return {\n message: `Invalid price impact band: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidMarketDeathThreshold\":\n return {\n message: `Invalid market death threshold: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidTickRange\":\n return {\n message: `Invalid tick range. Lower: ${args[0]}, Upper: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"MarketNotKillable\":\n return {\n message: `Market health (${args[0]}) is above death threshold (${args[1]}). Market cannot be killed yet.`,\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"InvalidStartingSqrtPriceX96\":\n return {\n message: `Invalid starting sqrt price: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n // Uniswap V4 PoolManager errors\n case \"CurrencyNotSettled\":\n return {\n message:\n \"Currency balance not settled after operation. The pool manager requires all currency deltas to be settled before unlocking.\",\n debug: {\n source,\n category: ErrorCategory.SYSTEM_ERROR,\n retryGuidance: \"This indicates an issue with the transaction flow. Please try again.\",\n },\n };\n\n case \"PoolNotInitialized\":\n return {\n message:\n \"Pool does not exist or has not been initialized. Ensure the pool has been created before attempting to interact with it.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"AlreadyUnlocked\":\n return {\n message: \"Pool manager is already unlocked. This indicates a potential reentrancy issue.\",\n debug: {\n source,\n category: ErrorCategory.SYSTEM_ERROR,\n canRetry: true,\n retryGuidance: \"This is a temporary state. Please retry your transaction.\",\n },\n };\n\n case \"ManagerLocked\":\n return {\n message:\n \"Uniswap V4 Pool Manager is currently locked. This is a temporary state during transaction processing.\",\n debug: {\n source,\n category: ErrorCategory.STATE_ERROR,\n canRetry: true,\n retryGuidance: \"Please retry your transaction in a moment.\",\n },\n };\n\n case \"TickSpacingTooLarge\":\n return {\n message: `Tick spacing (${args[0]}) exceeds the maximum allowed value. Please use a smaller tick spacing.`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"TickSpacingTooSmall\":\n return {\n message: `Tick spacing (${args[0]}) is below the minimum allowed value. Please use a larger tick spacing.`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"CurrenciesOutOfOrderOrEqual\":\n return {\n message: `Currencies must be ordered (currency0 < currency1) and not equal. Got currency0: ${args[0]}, currency1: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"UnauthorizedDynamicLPFeeUpdate\":\n return {\n message:\n \"Unauthorized attempt to update dynamic LP fee. Only authorized addresses can modify fees.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"SwapAmountCannotBeZero\":\n return {\n message: \"Swap amount cannot be zero. Please specify a valid swap amount.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NonzeroNativeValue\":\n return {\n message:\n \"Native ETH was sent with the transaction when none was expected. Do not send ETH with this operation.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MustClearExactPositiveDelta\":\n return {\n message:\n \"Must clear exact positive delta. The transaction must settle the exact amount owed to the pool.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n // Missing PerpManager errors - ERC721/Ownership\n case \"AccountBalanceOverflow\":\n return {\n message:\n \"Account balance overflow detected. This is a critical error that should not occur under normal conditions.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n case \"BalanceQueryForZeroAddress\":\n return {\n message: \"Cannot query balance for the zero address.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NotOwnerNorApproved\":\n return {\n message: \"Caller is not the owner or an approved operator for this position.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TokenAlreadyExists\":\n return {\n message: \"A position with this ID already exists.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"TokenDoesNotExist\":\n return {\n message: \"The specified position does not exist.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferFromIncorrectOwner\":\n return {\n message: \"Attempting to transfer position from incorrect owner.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferToNonERC721ReceiverImplementer\":\n return {\n message:\n \"Cannot transfer position to a contract that does not implement ERC721 receiver interface.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferToZeroAddress\":\n return {\n message: \"Cannot transfer position to the zero address.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NewOwnerIsZeroAddress\":\n return {\n message: \"New owner cannot be the zero address.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NoHandoverRequest\":\n return {\n message: \"No pending ownership handover request exists.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"Unauthorized\":\n return {\n message: \"Unauthorized access. Caller does not have permission to perform this operation.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n // Missing PerpManager errors - Transfer/Approval\n case \"TransferFromFailed\":\n return {\n message:\n \"ERC20 transferFrom operation failed. Ensure you have approved sufficient tokens and have enough balance.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferFailed\":\n return {\n message:\n \"ERC20 transfer operation failed. This may indicate insufficient balance or a token contract issue.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n case \"ApproveFailed\":\n return {\n message: \"ERC20 approve operation failed. Please check the token contract.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n // Missing PerpManager errors - Module Config\n case \"AlreadyInitialized\":\n return {\n message: \"Contract has already been initialized. Initialization can only occur once.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"FeesNotRegistered\":\n return {\n message:\n \"Fees module has not been registered for this pool. Please register the fees module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"FeeTooLarge\":\n return {\n message: \"The specified fee exceeds the maximum allowed value.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"MarginRatiosNotRegistered\":\n return {\n message:\n \"Margin ratios module has not been registered for this pool. Please register the module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"LockupPeriodNotRegistered\":\n return {\n message:\n \"Lockup period module has not been registered for this pool. Please register the module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"SqrtPriceImpactLimitNotRegistered\":\n return {\n message:\n \"Sqrt price impact limit module has not been registered for this pool. Please register the module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"ModuleAlreadyRegistered\":\n return {\n message: \"This module has already been registered and cannot be registered again.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n // Missing PerpManager errors - Position/Trading\n case \"InvalidAction\":\n return {\n message: `Invalid action type: ${args[0]}. Please specify a valid action.`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidMarginRatio\":\n return {\n message: `Invalid margin ratio: ${args[0]}. The margin ratio must be within acceptable bounds.`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MakerNotAllowed\":\n return {\n message: \"Maker positions are not allowed for this operation.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"PositionLocked\":\n return {\n message:\n \"This position is currently locked. Maker positions have a time-based lockup period to ensure liquidity stability.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"ZeroDelta\":\n return {\n message:\n \"Position has zero size. Cannot perform operation on a position with no open size.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"NotPoolManager\":\n return {\n message:\n \"Only the Uniswap V4 Pool Manager can call this function. This indicates an architectural issue.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n case \"NoLiquidityToReceiveFees\":\n return {\n message:\n \"No liquidity available to receive fees. Ensure there is sufficient liquidity in the pool.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n default:\n return {\n message: `Contract error: ${errorName}${args.length > 0 ? ` (${args.join(\", \")})` : \"\"}`,\n debug: { source: ErrorSource.UNKNOWN, category: ErrorCategory.SYSTEM_ERROR },\n };\n }\n}\n\n/**\n * Wrap an async function with error handling\n */\nexport async function withErrorHandling<T>(fn: () => Promise<T>, context: string): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const parsedError = parseContractError(error);\n parsedError.message = `${context}: ${parsedError.message}`;\n throw parsedError;\n }\n}\n","import { Q96 } from \"./constants\";\n\nconst PRECISION = 10n ** 18n;\n\n/**\n * Convert a funding diff (over `interval` seconds) to a percentage for `period` seconds.\n * Defers the interval division until after scaling to avoid truncating small differentials.\n */\nexport function convertFundingDiffX96ToPercentPerPeriod(\n fundingDiffX96: bigint,\n interval: bigint,\n periodSeconds: bigint\n): number {\n // rate = (diff / interval) * period = (diff * period) / interval\n // Scale by PRECISION before dividing by Q96 and interval to preserve precision.\n const scaledRate = (fundingDiffX96 * periodSeconds * PRECISION) / (Q96 * interval);\n return Number(scaledRate) / Number(PRECISION);\n}\n\nexport function convertFundingPerSecondX96ToPercentPerMinute(fundingPerSecondX96: bigint): number {\n const SECONDS_PER_MINUTE = 60n;\n const scaledRate = (fundingPerSecondX96 * SECONDS_PER_MINUTE * PRECISION) / Q96;\n return Number(scaledRate) / Number(PRECISION);\n}\n\nexport function convertFundingPerSecondX96ToPercentPerDay(fundingPerSecondX96: bigint): number {\n const SECONDS_PER_DAY = 86400n;\n const scaledRate = (fundingPerSecondX96 * SECONDS_PER_DAY * PRECISION) / Q96;\n return Number(scaledRate) / Number(PRECISION);\n}\n","import type { PerpCityContext } from \"../context\";\nimport { sqrtPriceX96ToPrice, tickToPrice } from \"./conversions\";\n\n/**\n * Calculate liquidity from USDC amount (amount1) using Uniswap v3 formula\n * liquidity = amount1 / (sqrt(priceUpper) - sqrt(priceLower))\n *\n * This replicates the estimateLiquidityForAmount1 function that existed in older contracts\n * but is not present in the deployed contracts.\n */\nexport async function estimateLiquidity(\n _context: PerpCityContext,\n tickLower: number,\n tickUpper: number,\n usdScaled: bigint\n): Promise<bigint> {\n // Validate inputs\n if (tickLower >= tickUpper) {\n throw new Error(\n `Invalid tick range: tickLower (${tickLower}) must be less than tickUpper (${tickUpper})`\n );\n }\n\n if (usdScaled === 0n) {\n return 0n;\n }\n\n // Calculate sqrt prices from ticks using Uniswap v3 formula\n // sqrtPriceX96 = sqrt(1.0001^tick) * 2^96\n const Q96 = 1n << 96n;\n\n const sqrtPriceLowerX96 = getSqrtRatioAtTick(tickLower);\n const sqrtPriceUpperX96 = getSqrtRatioAtTick(tickUpper);\n\n // Calculate liquidity using the formula:\n // L = amount1 / (sqrtPriceUpper - sqrtPriceLower) * Q96\n const sqrtPriceDiff = sqrtPriceUpperX96 - sqrtPriceLowerX96;\n\n if (sqrtPriceDiff === 0n) {\n throw new Error(\n `Division by zero: sqrtPriceDiff is 0 for ticks ${tickLower} to ${tickUpper}. sqrtLower=${sqrtPriceLowerX96}, sqrtUpper=${sqrtPriceUpperX96}`\n );\n }\n\n const liquidity = (usdScaled * Q96) / sqrtPriceDiff;\n\n return liquidity;\n}\n\n/**\n * Get sqrt price at tick using Uniswap v4 formula\n * sqrtPriceX96 = sqrt(1.0001^tick) * 2^96\n */\nfunction getSqrtRatioAtTick(tick: number): bigint {\n const absTick = Math.abs(tick);\n\n let ratio =\n absTick & 0x1 ? 0xfffcb933bd6fad37aa2d162d1a594001n : 0x100000000000000000000000000000000n;\n if (absTick & 0x2) ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;\n if (absTick & 0x4) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;\n if (absTick & 0x8) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;\n if (absTick & 0x10) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;\n if (absTick & 0x20) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;\n if (absTick & 0x40) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;\n if (absTick & 0x80) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;\n if (absTick & 0x100) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;\n if (absTick & 0x200) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;\n if (absTick & 0x400) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;\n if (absTick & 0x800) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;\n if (absTick & 0x1000) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;\n if (absTick & 0x2000) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;\n if (absTick & 0x4000) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;\n if (absTick & 0x8000) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;\n if (absTick & 0x10000) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;\n if (absTick & 0x20000) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;\n if (absTick & 0x40000) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;\n if (absTick & 0x80000) ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;\n\n if (tick > 0) ratio = (1n << 256n) / ratio;\n return ratio >> 32n;\n}\n\n/**\n * Calculate liquidity amount to achieve a target margin ratio for a maker position.\n *\n * For a Uniswap v3 style maker position:\n * - Margin ratio = margin / total_debt\n * - Total debt = USD value of LP exposure at current price\n *\n * When price P is within range [pL, pU]:\n * - amount0 = liquidity * (1/sqrt(P) - 1/sqrt(pU))\n * - amount1 = liquidity * (sqrt(P) - sqrt(pL))\n * - total_debt = amount0 * P + amount1 (in USD terms)\n *\n * @param marginScaled - Margin in scaled units (6 decimals)\n * @param tickLower - Lower tick of the range\n * @param tickUpper - Upper tick of the range\n * @param currentSqrtPriceX96 - Current sqrt price in Q96 format\n * @param targetMarginRatio - Target margin ratio (e.g., 1.2 for 120%)\n * @returns Liquidity amount as bigint\n */\nexport function calculateLiquidityForTargetRatio(\n marginScaled: bigint,\n tickLower: number,\n tickUpper: number,\n currentSqrtPriceX96: bigint,\n targetMarginRatio: number\n): bigint {\n // Validate inputs\n if (tickLower >= tickUpper) {\n throw new Error(\n `Invalid tick range: tickLower (${tickLower}) must be less than tickUpper (${tickUpper})`\n );\n }\n\n if (marginScaled === 0n) {\n return 0n;\n }\n\n if (targetMarginRatio <= 0) {\n throw new Error(`Invalid target margin ratio: ${targetMarginRatio} must be positive`);\n }\n\n // Get prices from ticks\n const priceLower = tickToPrice(tickLower);\n const priceUpper = tickToPrice(tickUpper);\n\n // Current price from sqrtPriceX96\n const currentPrice = sqrtPriceX96ToPrice(currentSqrtPriceX96);\n\n // Calculate sqrt prices\n const sqrtCurrentPrice = Math.sqrt(currentPrice);\n const sqrtPriceLower = Math.sqrt(priceLower);\n const sqrtPriceUpper = Math.sqrt(priceUpper);\n\n // Debt per unit liquidity (in USD terms)\n // When price is within range:\n // amount0_per_L = (1/sqrtP - 1/sqrtPU) [perp tokens per unit liquidity]\n // amount1_per_L = (sqrtP - sqrtPL) [USD per unit liquidity]\n // debt_per_L = amount0_per_L * P + amount1_per_L [total USD value per unit liquidity]\n let debtPerL: number;\n\n if (currentPrice <= priceLower) {\n // Price below range: only token0 exposure\n // amount0_per_L = (1/sqrtPL - 1/sqrtPU)\n const amount0PerL = 1 / sqrtPriceLower - 1 / sqrtPriceUpper;\n debtPerL = amount0PerL * currentPrice;\n } else if (currentPrice >= priceUpper) {\n // Price above range: only token1 exposure\n // amount1_per_L = (sqrtPU - sqrtPL)\n debtPerL = sqrtPriceUpper - sqrtPriceLower;\n } else {\n // Price within range: both token0 and token1 exposure\n const amount0PerL = 1 / sqrtCurrentPrice - 1 / sqrtPriceUpper;\n const amount1PerL = sqrtCurrentPrice - sqrtPriceLower;\n debtPerL = amount0PerL * currentPrice + amount1PerL;\n }\n\n if (debtPerL <= 0) {\n throw new Error(\"Calculated debt per unit liquidity is zero or negative\");\n }\n\n // Target debt = margin / targetRatio\n const margin = Number(marginScaled) / 1e6;\n const targetDebt = margin / targetMarginRatio;\n\n // Liquidity = targetDebt / debtPerL\n const liquidity = targetDebt / debtPerL;\n\n if (liquidity <= 0) {\n throw new Error(\"Calculated liquidity is zero or negative\");\n }\n\n return BigInt(Math.floor(liquidity));\n}\n","/**\n * RPC URL utilities for connecting to blockchain networks\n */\n\nexport interface RpcConfig {\n url?: string;\n}\n\n/**\n * Get the RPC URL from environment or configuration\n *\n * This is a simple helper that retrieves the RPC URL from the RPC_URL\n * environment variable or accepts a direct override. The function does\n * not construct URLs - it expects the full endpoint URL to be provided.\n *\n * @param config - Optional configuration with URL override\n * @returns The RPC URL to use for connections\n * @throws Error if no RPC URL is configured\n *\n * @example\n * // Get URL from RPC_URL environment variable\n * // RPC_URL=https://your-rpc-endpoint.example\n * const url = getRpcUrl();\n * // Returns: https://your-rpc-endpoint.example\n *\n * @example\n * // Override with custom URL\n * const url = getRpcUrl({\n * url: 'https://custom-rpc.example'\n * });\n * // Returns: https://custom-rpc.example\n */\nexport function getRpcUrl(config: RpcConfig = {}): string {\n const rpcUrl = config.url ?? process.env.RPC_URL;\n\n if (!rpcUrl) {\n throw new Error(\n \"RPC_URL is required. Please set the RPC_URL environment variable with your full RPC endpoint URL.\\n\" +\n \"Example URLs (use your own provider and API key):\\n\" +\n \" https://base-sepolia.g.alchemy.com/v2/YOUR_API_KEY\\n\" +\n \" https://base-sepolia.infura.io/v3/YOUR_API_KEY\\n\" +\n \" https://sepolia.base.org\"\n );\n }\n\n return rpcUrl;\n}\n","import type { Hex } from \"viem\";\nimport { decodeEventLog, formatUnits } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type { ClosePositionParams, ClosePositionResult, LiveDetails } from \"../types/entity-data\";\nimport { scale6Decimals, uint256ToInt256 } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\n\nexport class OpenPosition {\n public readonly context: PerpCityContext;\n public readonly perpId: Hex;\n public readonly positionId: bigint;\n public readonly isLong?: boolean;\n public readonly isMaker?: boolean;\n public readonly txHash?: Hex;\n\n constructor(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint,\n isLong?: boolean,\n isMaker?: boolean,\n txHash?: Hex\n ) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n this.isLong = isLong;\n this.isMaker = isMaker;\n this.txHash = txHash;\n }\n\n async closePosition(params: ClosePositionParams): Promise<ClosePositionResult> {\n return withErrorHandling(\n async () => {\n const contractParams = {\n posId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n // Simulate the transaction first - this will catch contract errors early\n const { request } = await this.context.publicClient.simulateContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"closePosition\",\n args: [contractParams],\n account: this.context.walletClient.account,\n gas: 500000n, // Provide explicit gas limit to avoid estimation issues\n });\n\n // Execute the transaction\n const txHash = await this.context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const receipt = await this.context.publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Scan transaction events to determine if this was a partial or full close\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, a PositionClosed event is emitted\n let newPositionId: bigint | null = null;\n let _wasFullyClosed = false;\n\n for (const log of receipt.logs) {\n try {\n // Check for PositionOpened event (partial close)\n const openedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionOpened\",\n });\n\n // Match the perpId (case-insensitive) and extract the new position ID\n // For partial closes, a NEW position is created with a DIFFERENT posId\n const eventPerpId = (openedDecoded.args.perpId as string).toLowerCase();\n const eventPosId = openedDecoded.args.posId as bigint;\n\n if (eventPerpId === this.perpId.toLowerCase() && eventPosId !== this.positionId) {\n newPositionId = eventPosId;\n break;\n }\n } catch (_e) {\n // Not a PositionOpened event, try PositionClosed\n try {\n const closedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionClosed\",\n });\n\n // If this position was fully closed, mark it (case-insensitive perpId comparison)\n const closedPerpId = (closedDecoded.args.perpId as string).toLowerCase();\n if (\n closedPerpId === this.perpId.toLowerCase() &&\n closedDecoded.args.posId === this.positionId\n ) {\n _wasFullyClosed = true;\n break;\n }\n } catch (_e2) {}\n }\n }\n\n // If no new position ID, this was a full close\n if (!newPositionId) {\n return { position: null, txHash };\n }\n\n // Return new OpenPosition with the new position from partial close\n return {\n position: new OpenPosition(\n this.context,\n this.perpId,\n newPositionId,\n this.isLong,\n this.isMaker,\n txHash\n ),\n txHash,\n };\n },\n `closePosition for ${this.isMaker ? \"maker\" : \"taker\"} position ${this.positionId}`\n );\n }\n\n async liveDetails(): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await this.context.publicClient.readContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [this.positionId],\n })) as unknown as readonly [Hex, bigint, bigint, bigint, boolean, bigint];\n\n // The result is a tuple: [unexpectedReason, pnl, funding, netMargin, wasLiquidated, notional]\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(\n `Failed to quote position ${this.positionId} - position may be invalid or already closed`\n );\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n fundingPayment: Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `liveDetails for position ${this.positionId}`);\n }\n}\n","import type { Hex } from \"viem\";\nimport { BEACON_ABI } from \"../abis/beacon\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type { PerpData } from \"../types/entity-data\";\nimport { Q96 } from \"../utils/constants\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { convertFundingDiffX96ToPercentPerPeriod } from \"../utils/funding\";\n\nconst TWAVG_WINDOW = 3600; // 1 hour, matches Constants.sol TWAVG_WINDOW\nconst INTERVAL = 86400n; // 1 day in seconds, matches Constants.sol INTERVAL\n\n// Pure functions that operate on PerpData\nexport function getPerpMark(perpData: PerpData): number {\n return perpData.mark;\n}\n\nexport function getPerpBeacon(perpData: PerpData): string {\n return perpData.beacon;\n}\n\nexport function getPerpBounds(perpData: PerpData) {\n return perpData.bounds;\n}\n\nexport function getPerpFees(perpData: PerpData) {\n return perpData.fees;\n}\n\nexport function getPerpTickSpacing(perpData: PerpData): number {\n return perpData.tickSpacing;\n}\n\nexport async function getFundingRate(\n context: PerpCityContext,\n perpId: Hex\n): Promise<{ ratePerDay: number; ratePerMinute: number; rawX96: bigint }> {\n return withErrorHandling(async () => {\n const perpManagerAddr = context.deployments().perpManager;\n const cfg = await context.getPerpConfig(perpId);\n\n const [twAvgSqrtMarkX96, twAvgIndexX96] = await Promise.all([\n context.publicClient.readContract({\n address: perpManagerAddr,\n abi: PERP_MANAGER_ABI,\n functionName: \"timeWeightedAvgSqrtPriceX96\",\n args: [perpId, TWAVG_WINDOW],\n }) as Promise<bigint>,\n context.publicClient.readContract({\n address: cfg.beacon,\n abi: BEACON_ABI,\n functionName: \"twAvg\",\n args: [TWAVG_WINDOW],\n }) as Promise<bigint>,\n ]);\n\n const twAvgMarkX96 = (twAvgSqrtMarkX96 * twAvgSqrtMarkX96) / Q96;\n // Defer INTERVAL division to avoid truncating small funding differentials.\n // fundingDiffX96 = (mark - index) per INTERVAL period.\n const fundingDiffX96 = twAvgMarkX96 - twAvgIndexX96;\n // For rawX96 (per-second rate), divide here — callers expect per-second.\n const fundingPerSecondX96 = fundingDiffX96 / INTERVAL;\n\n return {\n ratePerDay: convertFundingDiffX96ToPercentPerPeriod(fundingDiffX96, INTERVAL, 86400n),\n ratePerMinute: convertFundingDiffX96ToPercentPerPeriod(fundingDiffX96, INTERVAL, 60n),\n rawX96: fundingPerSecondX96,\n };\n }, `getFundingRate for perp ${perpId}`);\n}\n\nexport async function getIndexValue(context: PerpCityContext, perpId: Hex): Promise<bigint> {\n return withErrorHandling(async () => {\n const perpData = await context.getPerpData(perpId);\n return (await context.publicClient.readContract({\n address: perpData.beacon,\n abi: BEACON_ABI,\n functionName: \"index\",\n })) as bigint;\n }, `getIndexValue for perp ${perpId}`);\n}\n\nexport async function getIndexTWAP(\n context: PerpCityContext,\n perpId: Hex,\n secondsAgo: number\n): Promise<bigint> {\n return withErrorHandling(async () => {\n const perpData = await context.getPerpData(perpId);\n return (await context.publicClient.readContract({\n address: perpData.beacon,\n abi: BEACON_ABI,\n functionName: \"twAvg\",\n args: [secondsAgo],\n })) as bigint;\n }, `getIndexTWAP for perp ${perpId}`);\n}\n","import type { Address, Hex } from \"viem\";\nimport { decodeErrorResult, decodeEventLog, erc20Abi } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type {\n CreatePerpParams,\n OpenMakerPositionParams,\n OpenTakerPositionParams,\n QuoteOpenMakerPositionResult,\n QuoteTakerPositionResult,\n} from \"../types/entity-data\";\nimport { MAX_TICK, MIN_TICK, NUMBER_1E6, priceToTick, scale6Decimals } from \"../utils\";\nimport { approveUsdc } from \"../utils/approve\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { OpenPosition } from \"./open-position\";\n\nexport async function createPerp(context: PerpCityContext, params: CreatePerpParams): Promise<Hex> {\n return withErrorHandling(async () => {\n const deployments = context.deployments();\n\n // Use params if provided, otherwise fall back to deployment config\n const fees = params.fees ?? deployments.feesModule;\n const marginRatios = params.marginRatios ?? deployments.marginRatiosModule;\n const lockupPeriod = params.lockupPeriod ?? deployments.lockupPeriodModule;\n const sqrtPriceImpactLimit =\n params.sqrtPriceImpactLimit ?? deployments.sqrtPriceImpactLimitModule;\n\n if (!fees || !marginRatios || !lockupPeriod || !sqrtPriceImpactLimit) {\n throw new Error(\"Module addresses must be provided either in params or deployment config\");\n }\n\n const contractParams = {\n beacon: params.beacon,\n fees,\n marginRatios,\n lockupPeriod,\n sqrtPriceImpactLimit,\n };\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"createPerp\",\n args: [contractParams],\n account: context.walletClient.account,\n });\n\n // Execute the transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Check if transaction was successful\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract perpId from PerpCreated event\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PerpCreated\",\n });\n\n // Return the perpId from the event\n return decoded.args.perpId as Hex;\n } catch (_e) {}\n }\n\n throw new Error(\"PerpCreated event not found in transaction receipt\");\n }, \"createPerp\");\n}\n\nexport async function openTakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenTakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n // Validate inputs\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.leverage <= 0) {\n throw new Error(\"Leverage must be greater than 0\");\n }\n\n // Convert margin to 6-decimal scaled bigint\n const marginScaled = scale6Decimals(params.margin);\n\n // Calculate margin ratio by inverting leverage\n const marginRatio = Math.floor(NUMBER_1E6 / params.leverage);\n\n // Calculate total approval amount: margin + fees\n // Fees are percentages of notional (= margin * leverage)\n const perpData = await context.getPerpData(perpId);\n const { creatorFee, insuranceFee, lpFee } = perpData.fees;\n\n const protocolFeeRaw = await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"protocolFee\",\n });\n const protocolFeeRate = Number(protocolFeeRaw) / NUMBER_1E6;\n\n const notional = (marginScaled * BigInt(NUMBER_1E6)) / BigInt(marginRatio);\n const totalFeeRate = creatorFee + insuranceFee + lpFee + protocolFeeRate;\n const totalFees = BigInt(Math.ceil(Number(notional) * totalFeeRate));\n\n const requiredAmount = marginScaled + totalFees;\n const currentAllowance = await context.publicClient.readContract({\n address: context.deployments().usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, context.deployments().perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < requiredAmount) {\n await approveUsdc(context, requiredAmount);\n }\n\n // Handle unspecifiedAmountLimit - can be number (human units) or bigint (raw value)\n const unspecifiedAmountLimit =\n typeof params.unspecifiedAmountLimit === \"bigint\"\n ? params.unspecifiedAmountLimit\n : scale6Decimals(params.unspecifiedAmountLimit);\n\n // Prepare contract parameters - deployed contract requires holder address\n const contractParams = {\n holder: context.walletClient.account!.address,\n isLong: params.isLong,\n margin: marginScaled,\n marginRatio: marginRatio,\n unspecifiedAmountLimit,\n };\n\n // Simulate transaction - deployed contract uses openTakerPos\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"openTakerPos\" as any,\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n // Execute transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for confirmation\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Verify success\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract takerPosId from PositionOpened event\n let takerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n // Don't specify eventName - let viem auto-detect from ABI\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n });\n\n // Check if this is a PositionOpened event for our perpId and it's a taker\n // Note: perpId from events is lowercased, so normalize both for comparison\n if (\n decoded.eventName === \"PositionOpened\" &&\n (decoded.args.perpId as string).toLowerCase() === perpId.toLowerCase() &&\n !decoded.args.isMaker\n ) {\n takerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (_e) {}\n }\n\n if (!takerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n // Return OpenPosition instance with transaction hash\n return new OpenPosition(context, perpId, takerPosId, params.isLong, false, txHash);\n }, \"openTakerPosition\");\n}\n\nfunction buildMakerContractParams(\n context: PerpCityContext,\n marginScaled: bigint,\n params: OpenMakerPositionParams,\n alignedTickLower: number,\n alignedTickUpper: number,\n maxAmt0In: bigint,\n maxAmt1In: bigint\n) {\n return {\n holder: context.walletClient.account!.address,\n margin: marginScaled,\n liquidity: params.liquidity,\n tickLower: alignedTickLower,\n tickUpper: alignedTickUpper,\n maxAmt0In,\n maxAmt1In,\n };\n}\n\nexport function calculateAlignedTicks(\n priceLower: number,\n priceUpper: number,\n tickSpacing: number\n): { alignedTickLower: number; alignedTickUpper: number } {\n const tickLower = priceToTick(priceLower, true);\n const tickUpper = priceToTick(priceUpper, false);\n\n const alignedTickLower = Math.floor(tickLower / tickSpacing) * tickSpacing;\n const alignedTickUpper = Math.ceil(tickUpper / tickSpacing) * tickSpacing;\n\n if (alignedTickLower < MIN_TICK) {\n throw new Error(\n `Lower tick ${alignedTickLower} is below MIN_TICK (${MIN_TICK}). Increase priceLower.`\n );\n }\n if (alignedTickUpper > MAX_TICK) {\n throw new Error(\n `Upper tick ${alignedTickUpper} exceeds MAX_TICK (${MAX_TICK}). Decrease priceUpper.`\n );\n }\n if (alignedTickLower === alignedTickUpper) {\n throw new Error(\n \"Price range too narrow: lower and upper ticks are equal after alignment. Widen the range.\"\n );\n }\n\n return { alignedTickLower, alignedTickUpper };\n}\n\nfunction alignMakerTicks(\n params: OpenMakerPositionParams,\n tickSpacing: number\n): { alignedTickLower: number; alignedTickUpper: number } {\n return calculateAlignedTicks(params.priceLower, params.priceUpper, tickSpacing);\n}\n\nexport const DEFAULT_MAKER_SLIPPAGE_TOLERANCE = 0.01;\nexport const MAX_UINT128 = 2n ** 128n - 1n;\n\nexport async function quoteOpenMakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenMakerPositionParams\n): Promise<QuoteOpenMakerPositionResult> {\n return withErrorHandling(async () => {\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.priceLower >= params.priceUpper) {\n throw new Error(\"priceLower must be less than priceUpper\");\n }\n\n const marginScaled = scale6Decimals(params.margin);\n const perpData = await context.getPerpData(perpId);\n const { alignedTickLower, alignedTickUpper } = alignMakerTicks(params, perpData.tickSpacing);\n\n const contractParams = buildMakerContractParams(\n context,\n marginScaled,\n params,\n alignedTickLower,\n alignedTickUpper,\n MAX_UINT128,\n MAX_UINT128\n );\n\n const [unexpectedReason, perpDelta, usdDelta] = (await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteOpenMakerPosition\" as any,\n args: [perpId, contractParams] as any,\n })) as unknown as readonly [string, bigint, bigint];\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(`Quote failed: ${unexpectedReason}`);\n }\n\n return { perpDelta, usdDelta };\n }, \"quoteOpenMakerPosition\");\n}\n\n/**\n * Computes maxAmtIn slippage limit from a quote delta.\n *\n * When delta < 0 (tokens need to go in), applies slippage tolerance to the\n * absolute amount. When delta >= 0 (quote says no tokens needed), uses\n * `fallbackRef` as a reference to compute a small buffer — this prevents\n * reverts when price moves between quote and execution, shifting the token\n * split so some amount of this token is now required.\n *\n * Note: `fallbackRef` is intentionally the *other* leg's delta (cross-unit).\n * It is only used as a rough magnitude reference for sizing a small buffer,\n * not as a precise same-unit value. For maker positions the two legs are\n * correlated in magnitude, so this heuristic produces a reasonable buffer.\n */\nexport function applySlippage(\n delta: bigint,\n slippageTolerance: number,\n fallbackRef?: bigint\n): bigint {\n const slippageBps = BigInt(Math.ceil(slippageTolerance * 10000));\n\n if (delta < 0n) {\n const absDelta = -delta;\n return absDelta + (absDelta * slippageBps) / 10000n;\n }\n\n // delta >= 0: quote says no tokens sent in, but price may move.\n // Use a fraction of the fallback reference as a buffer.\n if (fallbackRef !== undefined && fallbackRef !== 0n) {\n const absRef = fallbackRef < 0n ? -fallbackRef : fallbackRef;\n return (absRef * slippageBps) / 10000n;\n }\n\n return 0n;\n}\n\nexport async function openMakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenMakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.priceLower >= params.priceUpper) {\n throw new Error(\"priceLower must be less than priceUpper\");\n }\n\n const marginScaled = scale6Decimals(params.margin);\n const perpData = await context.getPerpData(perpId);\n const { alignedTickLower, alignedTickUpper } = alignMakerTicks(params, perpData.tickSpacing);\n\n let maxAmt0In: bigint;\n let maxAmt1In: bigint;\n\n if ((params.maxAmt0In === undefined) !== (params.maxAmt1In === undefined)) {\n throw new Error(\n \"Both maxAmt0In and maxAmt1In must be provided together or neither. \" +\n \"Omit both to use automatic quote-based slippage calculation.\"\n );\n }\n\n if (params.maxAmt0In !== undefined && params.maxAmt1In !== undefined) {\n maxAmt0In =\n typeof params.maxAmt0In === \"bigint\" ? params.maxAmt0In : scale6Decimals(params.maxAmt0In);\n maxAmt1In =\n typeof params.maxAmt1In === \"bigint\" ? params.maxAmt1In : scale6Decimals(params.maxAmt1In);\n } else {\n const quote = await quoteOpenMakerPosition(context, perpId, params);\n const slippage = params.slippageTolerance ?? DEFAULT_MAKER_SLIPPAGE_TOLERANCE;\n // Pass the other delta as fallback: if one token has delta >= 0 (not needed),\n // use the other token's delta to compute a small buffer for price movement.\n maxAmt0In = applySlippage(quote.perpDelta, slippage, quote.usdDelta);\n maxAmt1In = applySlippage(quote.usdDelta, slippage, quote.perpDelta);\n }\n\n // Approve USDC spending only if current allowance is insufficient\n // maxAmt1In is a slippage limit, not the actual amount needed\n // For positions below current price, only margin is deposited\n const currentAllowance = await context.publicClient.readContract({\n address: context.deployments().usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, context.deployments().perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < marginScaled) {\n await approveUsdc(context, marginScaled);\n }\n\n const contractParams = buildMakerContractParams(\n context,\n marginScaled,\n params,\n alignedTickLower,\n alignedTickUpper,\n maxAmt0In,\n maxAmt1In\n );\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"openMakerPos\" as any,\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n let makerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n });\n\n if (\n decoded.eventName === \"PositionOpened\" &&\n (decoded.args.perpId as string).toLowerCase() === perpId.toLowerCase() &&\n decoded.args.isMaker\n ) {\n makerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (_e) {}\n }\n\n if (!makerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n return new OpenPosition(context, perpId, makerPosId, undefined, true, txHash);\n }, \"openMakerPosition\");\n}\n\nexport async function quoteTakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: {\n holder: Address;\n isLong: boolean;\n margin: number;\n leverage: number;\n }\n): Promise<QuoteTakerPositionResult> {\n return withErrorHandling(async () => {\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.leverage <= 0) {\n throw new Error(\"Leverage must be greater than 0\");\n }\n\n const marginScaled = scale6Decimals(params.margin);\n const marginRatio = Math.floor(NUMBER_1E6 / params.leverage);\n\n const result = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteOpenTakerPosition\" as any,\n args: [\n perpId,\n {\n holder: params.holder,\n isLong: params.isLong,\n margin: marginScaled,\n marginRatio,\n unspecifiedAmountLimit: params.isLong ? 0n : (1n << 128n) - 1n,\n },\n ] as any,\n account: params.holder,\n });\n\n const [unexpectedReason, perpDelta, usdDelta] = result.result as unknown as readonly [\n Hex,\n bigint,\n bigint,\n ];\n\n if (unexpectedReason && unexpectedReason !== \"0x\") {\n let errorName = \"Quote simulation failed\";\n try {\n const decoded = decodeErrorResult({\n abi: PERP_MANAGER_ABI,\n data: unexpectedReason,\n });\n errorName = decoded.errorName;\n } catch {\n // Could not decode, use generic name\n }\n throw new Error(errorName);\n }\n\n const absPerpDelta = perpDelta < 0n ? -perpDelta : perpDelta;\n const absUsdDelta = usdDelta < 0n ? -usdDelta : usdDelta;\n\n if (absPerpDelta === 0n) {\n throw new Error(\"Zero position size\");\n }\n\n const fillPrice = Number(absUsdDelta) / Number(absPerpDelta);\n\n return { perpDelta, usdDelta, fillPrice };\n }, \"quoteTakerPosition\");\n}\n\nexport async function adjustMargin(\n context: PerpCityContext,\n positionId: bigint,\n marginDelta: bigint\n): Promise<{ txHash: Hex }> {\n return withErrorHandling(async () => {\n const deployments = context.deployments();\n\n if (marginDelta > 0n) {\n const currentAllowance = await context.publicClient.readContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, deployments.perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < marginDelta) {\n await approveUsdc(context, marginDelta);\n }\n }\n\n const { request } = await context.publicClient.simulateContract({\n address: deployments.perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"adjustMargin\",\n args: [{ posId: positionId, marginDelta }],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n return { txHash };\n }, `adjustMargin for position ${positionId}`);\n}\n\nexport async function adjustNotional(\n context: PerpCityContext,\n positionId: bigint,\n usdDelta: bigint,\n perpLimit: bigint\n): Promise<{ txHash: Hex }> {\n return withErrorHandling(async () => {\n const deployments = context.deployments();\n\n if (usdDelta > 0n) {\n // Approve the USDC amount (usdDelta), not the perp-side limit\n const currentAllowance = await context.publicClient.readContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, deployments.perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < usdDelta) {\n await approveUsdc(context, usdDelta);\n }\n }\n\n const { request } = await context.publicClient.simulateContract({\n address: deployments.perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"adjustNotional\",\n args: [{ posId: positionId, usdDelta, perpLimit }],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n return { txHash };\n }, `adjustNotional for position ${positionId}`);\n}\n","import { decodeErrorResult, decodeEventLog, formatUnits, type Hex } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type {\n ClosePositionParams,\n ClosePositionResult,\n LiveDetails,\n OpenPositionData,\n PositionRawData,\n QuoteClosePositionResult,\n} from \"../types/entity-data\";\nimport { scale6Decimals, uint256ToInt256 } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\n\n// Pure functions that operate on OpenPositionData\nexport function getPositionPerpId(positionData: OpenPositionData): Hex {\n return positionData.perpId;\n}\n\nexport function getPositionId(positionData: OpenPositionData): bigint {\n return positionData.positionId;\n}\n\nexport function getPositionIsLong(positionData: OpenPositionData): boolean | undefined {\n return positionData.isLong;\n}\n\nexport function getPositionIsMaker(positionData: OpenPositionData): boolean | undefined {\n return positionData.isMaker;\n}\n\nexport function getPositionLiveDetails(positionData: OpenPositionData): LiveDetails {\n return positionData.liveDetails;\n}\n\nexport function getPositionPnl(positionData: OpenPositionData): number {\n return positionData.liveDetails.pnl;\n}\n\nexport function getPositionFundingPayment(positionData: OpenPositionData): number {\n return positionData.liveDetails.fundingPayment;\n}\n\nexport function getPositionEffectiveMargin(positionData: OpenPositionData): number {\n return positionData.liveDetails.effectiveMargin;\n}\n\nexport function getPositionIsLiquidatable(positionData: OpenPositionData): boolean {\n return positionData.liveDetails.isLiquidatable;\n}\n\nexport async function quoteClosePosition(\n context: PerpCityContext,\n positionId: bigint\n): Promise<QuoteClosePositionResult> {\n return withErrorHandling(async () => {\n const result = await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n });\n\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] =\n result as unknown as readonly [Hex, bigint, bigint, bigint, boolean];\n\n if (unexpectedReason && unexpectedReason !== \"0x\") {\n let errorName = \"Quote simulation failed\";\n try {\n const decoded = decodeErrorResult({\n abi: PERP_MANAGER_ABI,\n data: unexpectedReason,\n });\n errorName = decoded.errorName;\n } catch {\n // Could not decode, use generic name\n }\n throw new Error(errorName);\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n // Negate so positive = user receives funding, matching live details convention\n funding: -Number(formatUnits(funding, 6)),\n netMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n wasLiquidated,\n };\n }, `quoteClosePosition for position ${positionId}`);\n}\n\nexport async function closePositionWithQuote(\n context: PerpCityContext,\n _perpId: Hex,\n positionId: bigint,\n /** Slippage as a fraction, e.g. 0.01 = 1%. Compare with calculateClosePositionParams which uses percentage form (1 = 1%). */\n slippageTolerance: number = 0.01\n): Promise<ClosePositionResult> {\n return withErrorHandling(async () => {\n // Read position to determine if it's a maker position\n const rawData = await context.getPositionRawData(positionId);\n const isMaker = rawData.makerDetails !== null;\n\n const result = await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n });\n\n const [unexpectedReason, quotePnl] = result as unknown as readonly [\n Hex,\n bigint,\n bigint,\n bigint,\n boolean,\n ];\n\n if (unexpectedReason && unexpectedReason !== \"0x\") {\n throw new Error(\"Quote failed — position may be invalid or already closed\");\n }\n\n let contractParams = {\n posId: positionId,\n minAmt0Out: 0n,\n minAmt1Out: 0n,\n maxAmt1In: 0n,\n };\n\n const canonicalPerpId = rawData.perpId;\n\n if (!isMaker) {\n const isLong = rawData.entryPerpDelta > 0n;\n const slippageBps = BigInt(Math.ceil(slippageTolerance * 10000));\n\n // Derive the actual swap cost/revenue from the quote simulation.\n // The quote already accounts for AMM price impact, so slippage\n // only needs to cover price movement between quote and execution.\n const absEntryUsd =\n rawData.entryUsdDelta < 0n ? -rawData.entryUsdDelta : rawData.entryUsdDelta;\n\n if (isLong) {\n // Long close: sell perps for USD. Revenue = pnl + entryNotional.\n // entryUsdDelta < 0 for longs (paid USDC), so absEntryUsd = |entryUsdDelta|.\n const swapRevenue = quotePnl + absEntryUsd;\n const minOut = swapRevenue > 0n ? swapRevenue - (swapRevenue * slippageBps) / 10000n : 0n;\n contractParams = {\n posId: positionId,\n minAmt0Out: 0n,\n minAmt1Out: minOut,\n maxAmt1In: 0n,\n };\n } else {\n // Short close: buy back perps with USD. Cost = entryNotional - pnl.\n // entryUsdDelta > 0 for shorts (received USDC), so absEntryUsd = entryUsdDelta.\n const swapCost = absEntryUsd - quotePnl;\n const maxIn = swapCost > 0n ? swapCost + (swapCost * slippageBps) / 10000n : 0n;\n contractParams = {\n posId: positionId,\n minAmt0Out: 0n,\n minAmt1Out: 0n,\n maxAmt1In: maxIn,\n };\n }\n }\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"closePosition\",\n args: [contractParams],\n account: context.walletClient.account,\n gas: 500000n,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n let newPositionId: bigint | null = null;\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionOpened\",\n });\n const eventPerpId = (decoded.args.perpId as string).toLowerCase();\n const eventPosId = decoded.args.posId as bigint;\n if (eventPerpId === canonicalPerpId.toLowerCase() && eventPosId !== positionId) {\n newPositionId = eventPosId;\n break;\n }\n } catch (_e) {}\n }\n\n if (!newPositionId) {\n return { position: null, txHash };\n }\n\n return {\n position: {\n perpId: canonicalPerpId,\n positionId: newPositionId,\n liveDetails: await getPositionLiveDetailsFromContract(\n context,\n canonicalPerpId,\n newPositionId\n ),\n },\n txHash,\n };\n }, `closePositionWithQuote for position ${positionId}`);\n}\n\n// Functions that require context for operations\nexport async function closePosition(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint,\n params: ClosePositionParams\n): Promise<ClosePositionResult> {\n return withErrorHandling(async () => {\n const contractParams = {\n posId: positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"closePosition\",\n args: [contractParams],\n account: context.walletClient.account,\n gas: 500000n, // Provide explicit gas limit to avoid estimation issues\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Check if transaction was successful\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract actual positionId from transaction receipt logs\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, no PositionOpened event will be present\n let newPositionId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionOpened\",\n });\n\n // Match the perpId (case-insensitive) and extract the new position ID\n // For partial closes, a NEW position is created with a DIFFERENT posId\n const eventPerpId = (decoded.args.perpId as string).toLowerCase();\n const eventPosId = decoded.args.posId as bigint;\n\n if (eventPerpId === perpId.toLowerCase() && eventPosId !== positionId) {\n newPositionId = eventPosId;\n break;\n }\n } catch (_e) {}\n }\n\n // If no PositionOpened event found with a new posId, this was a full close - return null\n if (!newPositionId) {\n return { position: null, txHash };\n }\n\n // Return the updated position data with actual on-chain position ID\n return {\n position: {\n perpId,\n positionId: newPositionId,\n liveDetails: await getPositionLiveDetailsFromContract(context, perpId, newPositionId),\n },\n txHash,\n };\n }, `closePosition for position ${positionId}`);\n}\n\nexport async function getPositionLiveDetailsFromContract(\n context: PerpCityContext,\n _perpId: Hex,\n positionId: bigint\n): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n })) as unknown as readonly [Hex, bigint, bigint, bigint, boolean];\n\n // The result is a tuple: [unexpectedReason, pnl, funding, netMargin, wasLiquidated]\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(\n `Failed to quote position ${positionId} - position may be invalid or already closed`\n );\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n // Negate so positive = user receives funding, matching quoteClosePosition convention\n fundingPayment: -Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `getPositionLiveDetailsFromContract for position ${positionId}`);\n}\n\n// Pure calculation functions for position metrics\n\n/**\n * Calculate the entry price from raw position data\n * Entry price = abs(entryUsdDelta) / abs(entryPerpDelta)\n * @param rawData - The raw position data from the contract\n * @returns Entry price in USD\n */\nexport function calculateEntryPrice(rawData: PositionRawData): number {\n const perpDelta = rawData.entryPerpDelta;\n const usdDelta = rawData.entryUsdDelta;\n\n // Handle edge case where position size is zero\n if (perpDelta === 0n) {\n return 0;\n }\n\n // Both values are in scaled format (6 decimals each)\n // entryUsdDelta is scaled by 1e6, entryPerpDelta is scaled by 1e6\n // Price = USD / Perp = (usdDelta / 1e6) / (perpDelta / 1e6) = usdDelta / perpDelta\n const absPerpDelta = perpDelta < 0n ? -perpDelta : perpDelta;\n const absUsdDelta = usdDelta < 0n ? -usdDelta : usdDelta;\n\n // Since both are scaled by 1e6, they cancel out\n return Number(absUsdDelta) / Number(absPerpDelta);\n}\n\n/**\n * Calculate the position size (in perp units)\n * @param rawData - The raw position data from the contract\n * @returns Position size (positive for long, negative for short)\n */\nexport function calculatePositionSize(rawData: PositionRawData): number {\n // entryPerpDelta is scaled by 1e6\n return Number(rawData.entryPerpDelta) / 1e6;\n}\n\n/**\n * Calculate the current position value at a given mark price\n * Position value = abs(size) * markPrice\n * @param rawData - The raw position data from the contract\n * @param markPrice - Current mark price\n * @returns Position value in USD (always positive)\n */\nexport function calculatePositionValue(rawData: PositionRawData, markPrice: number): number {\n const size = calculatePositionSize(rawData);\n return Math.abs(size) * markPrice;\n}\n\n/**\n * Calculate the current leverage of a position\n * Leverage = positionValue / effectiveMargin\n * @param positionValue - Current position value in USD\n * @param effectiveMargin - Current effective margin in USD\n * @returns Leverage multiplier\n */\nexport function calculateLeverage(positionValue: number, effectiveMargin: number): number {\n if (effectiveMargin <= 0) {\n return Infinity;\n }\n return positionValue / effectiveMargin;\n}\n\n/**\n * Calculate the liquidation price for a position\n * Liquidation occurs when: effectiveMargin / positionValue <= liqMarginRatio\n * For longs: liqPrice = entryPrice - (margin - liqRatio * entryNotional) / size\n * For shorts: liqPrice = entryPrice + (margin - liqRatio * entryNotional) / size\n *\n * @param rawData - The raw position data from the contract\n * @param isLong - Whether the position is long\n * @returns Liquidation price in USD, or null if cannot be calculated\n */\nexport function calculateLiquidationPrice(\n rawData: PositionRawData,\n isLong: boolean\n): number | null {\n const entryPrice = calculateEntryPrice(rawData);\n const positionSize = Math.abs(calculatePositionSize(rawData));\n\n if (positionSize === 0 || rawData.margin <= 0) {\n return null;\n }\n\n // Liquidation margin ratio is scaled by 1e6, convert to decimal\n const liqMarginRatio = rawData.marginRatios.liq / 1e6;\n\n // Entry notional value\n const entryNotional = positionSize * entryPrice;\n\n // Calculate price move that would trigger liquidation\n // At liquidation: margin + pnl = liqMarginRatio * notional\n // For long: margin + (liqPrice - entryPrice) * size = liqMarginRatio * liqPrice * size\n // Solving: liqPrice = (margin + entryPrice * size) / (size * (1 + liqMarginRatio))\n // Simplified: liqPrice = entryPrice - (margin - liqMarginRatio * entryNotional) / size\n\n if (isLong) {\n // For longs, liquidation happens when price drops\n const liqPrice = entryPrice - (rawData.margin - liqMarginRatio * entryNotional) / positionSize;\n return Math.max(0, liqPrice);\n } else {\n // For shorts, liquidation happens when price rises\n const liqPrice = entryPrice + (rawData.margin - liqMarginRatio * entryNotional) / positionSize;\n return liqPrice;\n }\n}\n\nexport function calculatePnlPercentage(pnl: number, funding: number, margin: number): number {\n const totalPnl = pnl + funding;\n const initialMargin = margin - totalPnl;\n if (initialMargin <= 0) return 0;\n return (totalPnl / initialMargin) * 100;\n}\n\n/**\n * Calculates ClosePositionParams for a position close, handling the difference\n * between taker and maker positions.\n *\n * For taker positions, the contract checks minAmt1Out (for longs) or maxAmt1In\n * (for shorts) against the raw USD swap delta — NOT netMargin. The swap amount\n * corresponds to the position's notional value at current price, so slippage\n * limits must be based on `notional`, not `expectedReturn`.\n *\n * For maker positions, the contract checks minAmt0Out and minAmt1Out against\n * the raw token amounts from Uniswap liquidity removal. The split between\n * perp tokens and USDC depends on where the current price sits in the LP range,\n * and quoteClosePosition only returns the aggregate netMargin. Since we cannot\n * predict the individual token amounts, both minimums are set to 0.\n */\nexport function calculateClosePositionParams(opts: {\n isMaker: boolean;\n isLong?: boolean;\n notional: number;\n /** Slippage as a percentage, e.g. 1 = 1%. Compare with closePositionWithQuote which uses fractional form (0.01 = 1%). */\n slippagePercent: number;\n}): ClosePositionParams {\n if (opts.isMaker) {\n return { minAmt0Out: 0, minAmt1Out: 0, maxAmt1In: 0 };\n }\n\n if (typeof opts.isLong !== \"boolean\") {\n throw new Error(\"isLong must be explicitly set for taker positions\");\n }\n\n const absNotional = Math.abs(opts.notional);\n\n if (opts.isLong) {\n // Long close: swap perps → USD. Contract checks minAmt1Out (min USD out).\n return {\n minAmt0Out: 0,\n minAmt1Out: Math.max(0, absNotional * (1 - opts.slippagePercent / 100)),\n maxAmt1In: 0,\n };\n } else {\n // Short close: swap USD → perps. Contract checks maxAmt1In (max USD in).\n return {\n minAmt0Out: 0,\n minAmt1Out: 0,\n maxAmt1In: absNotional * (1 + opts.slippagePercent / 100),\n };\n }\n}\n","import type { Hex } from \"viem\";\nimport type { OpenPositionData, UserData } from \"../types/entity-data\";\n\n// Pure functions that operate on UserData\nexport function getUserUsdcBalance(userData: UserData): number {\n return userData.usdcBalance;\n}\n\nexport function getUserOpenPositions(userData: UserData): OpenPositionData[] {\n return userData.openPositions;\n}\n\nexport function getUserWalletAddress(userData: UserData): Hex {\n return userData.walletAddress;\n}\n"],"mappings":"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AQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AA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","names":["import_viem","import_viem","ErrorCategory","ErrorSource","Q96","TTLCache","import_viem","import_viem","import_viem"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/abis/beacon.ts","../src/abis/perp-manager.ts","../src/context.ts","../src/abis/fees.ts","../src/abis/margin-ratios.ts","../src/utils/approve.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/utils/errors.ts","../src/utils/funding.ts","../src/utils/liquidity.ts","../src/utils/rpc.ts","../src/functions/open-position.ts","../src/functions/perp.ts","../src/functions/perp-manager.ts","../src/functions/position.ts","../src/functions/user.ts"],"sourcesContent":["export * from \"./abis\";\nexport * from \"./context\";\nexport * from \"./functions\";\nexport * from \"./types\";\nexport * from \"./types/entity-data\";\nexport * from \"./utils\";\n","export const BEACON_ABI = [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"contract IVerifierAdapter\",\n name: \"adapter\",\n type: \"address\",\n },\n {\n internalType: \"contract IIndexEngine\",\n name: \"engine\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"initialIndex\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [],\n name: \"AlreadyInitialized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NewOwnerIsZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NoHandoverRequest\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"Unauthorized\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"IndexUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverCanceled\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverRequested\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"oldOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"cancelOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"completeOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint16\",\n name: \"newCap\",\n type: \"uint16\",\n },\n ],\n name: \"increaseCardinalityCap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"index\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"indexEngine\",\n outputs: [\n {\n internalType: \"contract IIndexEngine\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"ownershipHandoverExpiresAt\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"result\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"requestOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IIndexEngine\",\n name: \"newIndexEngine\",\n type: \"address\",\n },\n ],\n name: \"setIndexEngine\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IVerifierAdapter\",\n name: \"newVerifierAdapter\",\n type: \"address\",\n },\n ],\n name: \"setVerifierAdapter\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint32\",\n name: \"secondsAgo\",\n type: \"uint32\",\n },\n ],\n name: \"twAvg\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"twAvgState\",\n outputs: [\n {\n internalType: \"uint16\",\n name: \"index\",\n type: \"uint16\",\n },\n {\n internalType: \"uint16\",\n name: \"cardinality\",\n type: \"uint16\",\n },\n {\n internalType: \"uint16\",\n name: \"cardinalityCap\",\n type: \"uint16\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"proof\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"inputs\",\n type: \"bytes\",\n },\n ],\n name: \"updateIndex\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"verifierAdapter\",\n outputs: [\n {\n internalType: \"contract IVerifierAdapter\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","export const PERP_MANAGER_ABI = [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"contract IBeaconRegistry\",\n name: \"beaconRegistry\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [],\n name: \"AccountBalanceOverflow\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"AlreadyInitialized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BalanceQueryForZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BeaconNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"CouldNotFullyFill\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"FeeTooLarge\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"FeesNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint8\",\n name: \"action\",\n type: \"uint8\",\n },\n ],\n name: \"InvalidAction\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidCaller\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidMargin\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidMarginRatio\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"LockupPeriodNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MakerNotAllowed\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MarginRatiosNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MaximumAmountExceeded\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MinimumAmountInsufficient\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NewOwnerIsZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NoHandoverRequest\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NotOwnerNorApproved\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NotPoolManager\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"PerpDoesNotExist\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"PositionLocked\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"SqrtPriceImpactLimitNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"StartingSqrtPriceTooHigh\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"StartingSqrtPriceTooLow\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TicksOutOfBounds\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TokenAlreadyExists\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TokenDoesNotExist\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TransferFromIncorrectOwner\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TransferToNonERC721ReceiverImplementer\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TransferToZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"Unauthorized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroDelta\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroLiquidity\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroNotional\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"isApproved\",\n type: \"bool\",\n },\n ],\n name: \"ApprovalForAll\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint8\",\n name: \"moduleType\",\n type: \"uint8\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"module\",\n type: \"address\",\n },\n ],\n name: \"ModuleRegistered\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"newMargin\",\n type: \"uint256\",\n },\n ],\n name: \"MarginAdjusted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"longOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"shortOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"newPerpDelta\",\n type: \"int256\",\n },\n ],\n name: \"NotionalAdjusted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverCanceled\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipHandoverRequested\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"oldOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"beacon\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"indexPriceX96\",\n type: \"uint256\",\n },\n ],\n name: \"PerpCreated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"longOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"shortOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"wasMaker\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"wasLiquidated\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"wasPartialClose\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"exitPerpDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"exitUsdDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"netUsdDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"funding\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"utilizationFee\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"adl\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"liquidationFee\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"netMargin\",\n type: \"int256\",\n },\n ],\n name: \"PositionClosed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sqrtPriceX96\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"longOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"shortOI\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bool\",\n name: \"isMaker\",\n type: \"bool\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n indexed: false,\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n ],\n name: \"PositionOpened\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"BEACON_REGISTRY\",\n outputs: [\n {\n internalType: \"contract IBeaconRegistry\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ERC721_NAME\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ERC721_SYMBOL\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ERC721_URI\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MAX_PROTOCOL_FEE\",\n outputs: [\n {\n internalType: \"uint24\",\n name: \"\",\n type: \"uint24\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n internalType: \"int256\",\n name: \"marginDelta\",\n type: \"int256\",\n },\n ],\n internalType: \"struct IPerpManager.AdjustMarginParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"adjustMargin\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n {\n internalType: \"uint128\",\n name: \"perpLimit\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.AdjustNotionalParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"adjustNotional\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"result\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"cancelOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"cardinalityCap\",\n outputs: [\n {\n internalType: \"uint16\",\n name: \"\",\n type: \"uint16\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n name: \"cfgs\",\n outputs: [\n {\n components: [\n {\n internalType: \"Currency\",\n name: \"currency0\",\n type: \"address\",\n },\n {\n internalType: \"Currency\",\n name: \"currency1\",\n type: \"address\",\n },\n {\n internalType: \"uint24\",\n name: \"fee\",\n type: \"uint24\",\n },\n {\n internalType: \"int24\",\n name: \"tickSpacing\",\n type: \"int24\",\n },\n {\n internalType: \"contract IHooks\",\n name: \"hooks\",\n type: \"address\",\n },\n ],\n internalType: \"struct PoolKey\",\n name: \"key\",\n type: \"tuple\",\n },\n {\n internalType: \"address\",\n name: \"creator\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"vault\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"beacon\",\n type: \"address\",\n },\n {\n internalType: \"contract IFees\",\n name: \"fees\",\n type: \"address\",\n },\n {\n internalType: \"contract IMarginRatios\",\n name: \"marginRatios\",\n type: \"address\",\n },\n {\n internalType: \"contract ILockupPeriod\",\n name: \"lockupPeriod\",\n type: \"address\",\n },\n {\n internalType: \"contract ISqrtPriceImpactLimit\",\n name: \"sqrtPriceImpactLimit\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint128\",\n name: \"minAmt0Out\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"minAmt1Out\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt1In\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.ClosePositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"closePosition\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n ],\n name: \"collectProtocolFees\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"completeOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"address\",\n name: \"beacon\",\n type: \"address\",\n },\n {\n internalType: \"contract IFees\",\n name: \"fees\",\n type: \"address\",\n },\n {\n internalType: \"contract IMarginRatios\",\n name: \"marginRatios\",\n type: \"address\",\n },\n {\n internalType: \"contract ILockupPeriod\",\n name: \"lockupPeriod\",\n type: \"address\",\n },\n {\n internalType: \"contract ISqrtPriceImpactLimit\",\n name: \"sqrtPriceImpactLimit\",\n type: \"address\",\n },\n ],\n internalType: \"struct IPerpManager.CreatePerpParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"createPerp\",\n outputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"fundingPerSecondX96\",\n outputs: [\n {\n internalType: \"int256\",\n name: \"\",\n type: \"int256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"getApproved\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint16\",\n name: \"cardinalityCap\",\n type: \"uint16\",\n },\n ],\n name: \"increaseCardinalityCap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"insurance\",\n outputs: [\n {\n internalType: \"uint128\",\n name: \"\",\n type: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n ],\n name: \"isApprovedForAll\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"result\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint8\",\n name: \"moduleType\",\n type: \"uint8\",\n },\n {\n internalType: \"address\",\n name: \"module\",\n type: \"address\",\n },\n ],\n name: \"isModuleRegistered\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"nextPosId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint120\",\n name: \"liquidity\",\n type: \"uint120\",\n },\n {\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt0In\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt1In\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenMakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"openMakerPos\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"bool\",\n name: \"isLong\",\n type: \"bool\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint24\",\n name: \"marginRatio\",\n type: \"uint24\",\n },\n {\n internalType: \"uint128\",\n name: \"unspecifiedAmountLimit\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenTakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"openTakerPos\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"ownerOf\",\n outputs: [\n {\n internalType: \"address\",\n name: \"result\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"pendingOwner\",\n type: \"address\",\n },\n ],\n name: \"ownershipHandoverExpiresAt\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"result\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n name: \"positions\",\n outputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"margin\",\n type: \"uint256\",\n },\n {\n internalType: \"int256\",\n name: \"entryPerpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryUsdDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingX96\",\n type: \"int256\",\n },\n {\n internalType: \"uint256\",\n name: \"entryCumlBadDebtX96\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"entryCumlUtilizationX96\",\n type: \"uint256\",\n },\n {\n components: [\n {\n internalType: \"uint24\",\n name: \"min\",\n type: \"uint24\",\n },\n {\n internalType: \"uint24\",\n name: \"max\",\n type: \"uint24\",\n },\n {\n internalType: \"uint24\",\n name: \"liq\",\n type: \"uint24\",\n },\n ],\n internalType: \"struct IMarginRatios.MarginRatios\",\n name: \"marginRatios\",\n type: \"tuple\",\n },\n {\n components: [\n {\n internalType: \"uint32\",\n name: \"unlockTimestamp\",\n type: \"uint32\",\n },\n {\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n internalType: \"uint128\",\n name: \"liquidity\",\n type: \"uint128\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingBelowX96\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingWithinX96\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"entryCumlFundingDivSqrtPWithinX96\",\n type: \"int256\",\n },\n ],\n internalType: \"struct IPerpManager.MakerDetails\",\n name: \"makerDetails\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"protocolFee\",\n outputs: [\n {\n internalType: \"uint24\",\n name: \"\",\n type: \"uint24\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n name: \"quoteClosePosition\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"pnl\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"funding\",\n type: \"int256\",\n },\n {\n internalType: \"uint256\",\n name: \"netMargin\",\n type: \"uint256\",\n },\n {\n internalType: \"bool\",\n name: \"wasLiquidated\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint120\",\n name: \"liquidity\",\n type: \"uint120\",\n },\n {\n internalType: \"int24\",\n name: \"tickLower\",\n type: \"int24\",\n },\n {\n internalType: \"int24\",\n name: \"tickUpper\",\n type: \"int24\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt0In\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"maxAmt1In\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenMakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"quoteOpenMakerPosition\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n components: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n internalType: \"bool\",\n name: \"isLong\",\n type: \"bool\",\n },\n {\n internalType: \"uint128\",\n name: \"margin\",\n type: \"uint128\",\n },\n {\n internalType: \"uint24\",\n name: \"marginRatio\",\n type: \"uint24\",\n },\n {\n internalType: \"uint128\",\n name: \"unspecifiedAmountLimit\",\n type: \"uint128\",\n },\n ],\n internalType: \"struct IPerpManager.OpenTakerPositionParams\",\n name: \"params\",\n type: \"tuple\",\n },\n ],\n name: \"quoteOpenTakerPosition\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"bool\",\n name: \"zeroForOne\",\n type: \"bool\",\n },\n {\n internalType: \"bool\",\n name: \"isExactIn\",\n type: \"bool\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint160\",\n name: \"sqrtPriceLimitX96\",\n type: \"uint160\",\n },\n ],\n name: \"quoteSwap\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"unexpectedReason\",\n type: \"bytes\",\n },\n {\n internalType: \"int256\",\n name: \"perpDelta\",\n type: \"int256\",\n },\n {\n internalType: \"int256\",\n name: \"usdDelta\",\n type: \"int256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint8\",\n name: \"moduleType\",\n type: \"uint8\",\n },\n {\n internalType: \"address\",\n name: \"module\",\n type: \"address\",\n },\n ],\n name: \"registerModule\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"requestOwnershipHandover\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"safeTransferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"safeTransferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n {\n internalType: \"bool\",\n name: \"isApproved\",\n type: \"bool\",\n },\n ],\n name: \"setApprovalForAll\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint24\",\n name: \"newProtocolFee\",\n type: \"uint24\",\n },\n ],\n name: \"setProtocolFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes4\",\n name: \"interfaceId\",\n type: \"bytes4\",\n },\n ],\n name: \"supportsInterface\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"result\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"takerOpenInterest\",\n outputs: [\n {\n internalType: \"uint128\",\n name: \"longOI\",\n type: \"uint128\",\n },\n {\n internalType: \"uint128\",\n name: \"shortOI\",\n type: \"uint128\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint32\",\n name: \"lookbackWindow\",\n type: \"uint32\",\n },\n ],\n name: \"timeWeightedAvgSqrtPriceX96\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"twAvg\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"posId\",\n type: \"uint256\",\n },\n ],\n name: \"tokenURI\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"id\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"unlockCallback\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"encodedDelta\",\n type: \"bytes\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"PoolId\",\n name: \"perpId\",\n type: \"bytes32\",\n },\n ],\n name: \"utilFeePerSecX96\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import TTLCache from \"@isaacs/ttlcache\";\nimport {\n type Address,\n createPublicClient,\n erc20Abi,\n formatUnits,\n type Hex,\n http,\n type PublicClient,\n} from \"viem\";\nimport { FEES_ABI } from \"./abis/fees\";\nimport { MARGIN_RATIOS_ABI } from \"./abis/margin-ratios\";\nimport { PERP_MANAGER_ABI } from \"./abis/perp-manager\";\nimport type { PerpCityContextConfig, PerpCityDeployments } from \"./types\";\nimport type {\n Bounds,\n Fees,\n LiveDetails,\n OpenPositionData,\n PerpConfig,\n PerpData,\n PositionRawData,\n UserData,\n} from \"./types/entity-data\";\nimport {\n marginRatioToLeverage,\n priceToSqrtPriceX96,\n sqrtPriceX96ToPrice,\n uint256ToInt256,\n} from \"./utils\";\nimport { withErrorHandling } from \"./utils/errors\";\n\nexport class PerpCityContext {\n public readonly walletClient;\n public readonly publicClient: PublicClient;\n private readonly _deployments: PerpCityDeployments;\n private readonly configCache: TTLCache<Hex, PerpConfig>;\n\n constructor(config: PerpCityContextConfig) {\n this.configCache = new TTLCache({ ttl: 5 * 60 * 1000 });\n this.walletClient = config.walletClient;\n\n // Validate walletClient.chain exists\n if (!config.walletClient.chain?.id) {\n throw new Error(\n \"PerpCityContext: walletClient.chain must be defined with a numeric id. \" +\n \"Ensure your walletClient was created with a chain parameter.\"\n );\n }\n\n // Create publicClient with HTTP transport and batching enabled\n this.publicClient = createPublicClient({\n chain: config.walletClient.chain,\n transport: http(config.rpcUrl, { batch: true }),\n });\n\n this._deployments = config.deployments;\n }\n\n /**\n * Validates that the RPC endpoint matches the expected chain.\n * Call this after construction to verify configuration.\n * @throws Error if RPC chain ID doesn't match walletClient chain ID\n */\n async validateChainId(): Promise<void> {\n const rpcChainId = await this.publicClient.getChainId();\n const expectedChainId = this.walletClient.chain!.id;\n\n if (rpcChainId !== expectedChainId) {\n throw new Error(\n `PerpCityContext: RPC chain mismatch. ` +\n `RPC returned chain ID ${rpcChainId}, but walletClient expects chain ID ${expectedChainId}. ` +\n `Ensure rpcUrl corresponds to the correct network.`\n );\n }\n }\n\n deployments(): PerpCityDeployments {\n return this._deployments;\n }\n\n // Optimized batch data fetching methods\n\n private async fetchPerpData(perpId: Hex): Promise<PerpData> {\n return withErrorHandling(async () => {\n // Fetch contract data only - no historical time series\n const contractData = await this.fetchPerpContractData(perpId);\n const config = await this.getPerpConfig(perpId);\n\n const perpData: PerpData = {\n id: perpId,\n tickSpacing: contractData.tickSpacing,\n mark: sqrtPriceX96ToPrice(contractData.sqrtPriceX96),\n beacon: config.beacon,\n bounds: contractData.bounds,\n fees: contractData.fees,\n };\n\n return perpData;\n }, `fetchPerpData for perp ${perpId}`);\n }\n\n /**\n * Fetches and caches the config for a perpId\n * The config includes module addresses (fees, marginRatios, etc.) and pool settings\n */\n async getPerpConfig(perpId: Hex): Promise<PerpConfig> {\n // Check cache first\n const cached = this.configCache.get(perpId);\n if (cached) {\n return cached;\n }\n\n // Fetch from contract\n const result = await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"cfgs\",\n args: [perpId],\n });\n\n // Viem returns outer tuple as array, inner tuples as objects with named properties\n const resultArray = result as unknown as any[];\n const keyData = resultArray[0];\n\n // Validate that perpId exists - contract returns empty values for non-existent perps\n if (\n !keyData ||\n keyData.tickSpacing === 0 ||\n keyData.currency0 === \"0x0000000000000000000000000000000000000000\"\n ) {\n throw new Error(`Perp ID ${perpId} not found or invalid`);\n }\n\n const cfg: PerpConfig = {\n key: {\n currency0: keyData.currency0 as Address,\n currency1: keyData.currency1 as Address,\n fee: Number(keyData.fee),\n tickSpacing: Number(keyData.tickSpacing),\n hooks: keyData.hooks as Address,\n },\n creator: resultArray[1] as Address,\n vault: resultArray[2] as Address,\n beacon: resultArray[3] as Address,\n fees: resultArray[4] as Address,\n marginRatios: resultArray[5] as Address,\n lockupPeriod: resultArray[6] as Address,\n sqrtPriceImpactLimit: resultArray[7] as Address,\n };\n\n // Store in cache\n this.configCache.set(perpId, cfg);\n\n return cfg;\n }\n\n private async fetchPerpContractData(\n perpId: Hex,\n markPrice?: number\n ): Promise<{\n tickSpacing: number;\n sqrtPriceX96: bigint;\n bounds: Bounds;\n fees: Fees;\n }> {\n return withErrorHandling(async () => {\n // Get config from cache or fetch if not cached\n const cfg = await this.getPerpConfig(perpId);\n\n // Extract tickSpacing from PoolKey\n const tickSpacing = Number(cfg.key.tickSpacing);\n\n // Calculate sqrtPriceX96 from mark price if available, otherwise use TWAP\n let sqrtPriceX96: bigint;\n if (markPrice) {\n sqrtPriceX96 = priceToSqrtPriceX96(markPrice);\n } else {\n // Fallback to TWAP with 1 second lookback\n sqrtPriceX96 = (await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"timeWeightedAvgSqrtPriceX96\",\n args: [perpId, 1],\n })) as bigint;\n }\n\n // Fetch bounds and fees from module contracts in parallel\n const [\n minTakerRatio,\n maxTakerRatio,\n liquidationTakerRatio,\n creatorFee,\n insuranceFee,\n lpFee,\n liquidationFee,\n ] = await Promise.all([\n this.publicClient.readContract({\n address: cfg.marginRatios,\n abi: MARGIN_RATIOS_ABI,\n functionName: \"MIN_TAKER_RATIO\",\n }),\n this.publicClient.readContract({\n address: cfg.marginRatios,\n abi: MARGIN_RATIOS_ABI,\n functionName: \"MAX_TAKER_RATIO\",\n }),\n this.publicClient.readContract({\n address: cfg.marginRatios,\n abi: MARGIN_RATIOS_ABI,\n functionName: \"LIQUIDATION_TAKER_RATIO\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"CREATOR_FEE\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"INSURANCE_FEE\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"LP_FEE\",\n }),\n this.publicClient.readContract({\n address: cfg.fees,\n abi: FEES_ABI,\n functionName: \"LIQUIDATION_FEE\",\n }),\n ]);\n\n // Convert margin ratios to leverage bounds\n // Margin ratio is scaled by 1e6, where ratio = margin / notional\n // Leverage = notional / margin = 1 / ratio\n const minTakerLeverage = marginRatioToLeverage(Number(maxTakerRatio)); // Note: max ratio -> min leverage\n const maxTakerLeverage = marginRatioToLeverage(Number(minTakerRatio)); // Note: min ratio -> max leverage\n\n // Convert fees from scaled uint24 (1e6) to decimal percentages\n const scaleFee = (fee: number) => fee / 1e6;\n\n return {\n tickSpacing,\n sqrtPriceX96,\n bounds: {\n minMargin: 10, // Still hardcoded - not available from margin ratios module\n minTakerLeverage,\n maxTakerLeverage,\n liquidationTakerRatio: Number(liquidationTakerRatio) / 1e6,\n },\n fees: {\n creatorFee: scaleFee(Number(creatorFee)),\n insuranceFee: scaleFee(Number(insuranceFee)),\n lpFee: scaleFee(Number(lpFee)),\n liquidationFee: scaleFee(Number(liquidationFee)),\n },\n };\n }, `fetchPerpContractData for perp ${perpId}`);\n }\n\n /**\n * Fetch comprehensive perp data with all related information in a single batched request\n */\n async getPerpData(perpId: Hex): Promise<PerpData> {\n return this.fetchPerpData(perpId);\n }\n\n private async fetchUserData(\n userAddress: Hex,\n positions: Array<{ perpId: Hex; positionId: bigint; isLong: boolean; isMaker: boolean }>\n ): Promise<UserData> {\n const usdcBalance = await this.publicClient.readContract({\n address: this.deployments().usdc,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [userAddress],\n });\n\n // Fetch live details for all positions in parallel\n const openPositionsData = await Promise.all(\n positions.map(async ({ perpId, positionId, isLong, isMaker }) => {\n const liveDetails = await this.fetchPositionLiveDetailsFromContract(perpId, positionId);\n return {\n perpId,\n positionId,\n isLong,\n isMaker,\n liveDetails,\n };\n })\n );\n\n return {\n walletAddress: userAddress,\n usdcBalance: Number(formatUnits(usdcBalance, 6)),\n openPositions: openPositionsData,\n };\n }\n\n private async fetchPositionLiveDetailsFromContract(\n _perpId: Hex,\n positionId: bigint\n ): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n })) as unknown as readonly [Hex, bigint, bigint, bigint, boolean, bigint];\n\n // The result is a tuple: [unexpectedReason, pnl, funding, netMargin, wasLiquidated, notional]\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(\n `Failed to quote position ${positionId} - position may be invalid or already closed`\n );\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n // Negate so positive = user receives funding\n fundingPayment: -Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `fetchPositionLiveDetailsFromContract for position ${positionId}`);\n }\n\n /**\n * Fetch comprehensive user data with live details for all positions\n * @param userAddress - The user's wallet address\n * @param positions - Array of position metadata (perpId, positionId, isLong, isMaker) tracked from transaction receipts\n */\n async getUserData(\n userAddress: Hex,\n positions: Array<{ perpId: Hex; positionId: bigint; isLong: boolean; isMaker: boolean }>\n ): Promise<UserData> {\n return this.fetchUserData(userAddress, positions);\n }\n\n /**\n * Fetch open position data with live details\n * @param perpId - The perpetual market ID\n * @param positionId - The position ID\n * @param isLong - Whether the position is long (true) or short (false)\n * @param isMaker - Whether the position is a maker (LP) position\n */\n async getOpenPositionData(\n perpId: Hex,\n positionId: bigint,\n isLong: boolean,\n isMaker: boolean\n ): Promise<OpenPositionData> {\n const liveDetails = await this.fetchPositionLiveDetailsFromContract(perpId, positionId);\n\n return {\n perpId,\n positionId,\n isLong,\n isMaker,\n liveDetails,\n };\n }\n\n /**\n * Fetch raw position data from the contract\n * This includes entry price data, margin, and position size needed for calculations\n * @param positionId - The position ID\n */\n async getPositionRawData(positionId: bigint): Promise<PositionRawData> {\n return withErrorHandling(async () => {\n const result = await this.publicClient.readContract({\n address: this.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"positions\",\n args: [positionId],\n });\n\n // The result is a tuple matching the Position struct:\n // [perpId, margin, entryPerpDelta, entryUsdDelta, entryCumlFundingX96,\n // entryCumlBadDebtX96, entryCumlUtilizationX96, marginRatios, makerDetails]\n const resultArray = result as unknown as readonly [\n Hex, // perpId\n bigint, // margin\n bigint, // entryPerpDelta\n bigint, // entryUsdDelta\n bigint, // entryCumlFundingX96\n bigint, // entryCumlBadDebtX96\n bigint, // entryCumlUtilizationX96\n { min: number; max: number; liq: number }, // marginRatios\n { unlockTimestamp: bigint; tickLower: number; tickUpper: number } | null, // makerDetails\n ];\n\n const [perpId, margin, entryPerpDelta, entryUsdDelta, , , , marginRatios, makerDetailsRaw] =\n resultArray;\n\n // Check if position exists (non-existent positions have zero perpId)\n const zeroPerpId = `0x${\"0\".repeat(64)}` as Hex;\n if (perpId === zeroPerpId) {\n throw new Error(`Position ${positionId} does not exist`);\n }\n\n const isMaker =\n makerDetailsRaw != null &&\n (makerDetailsRaw.tickLower !== 0 || makerDetailsRaw.tickUpper !== 0);\n\n return {\n perpId,\n positionId,\n margin: Number(formatUnits(margin, 6)),\n entryPerpDelta,\n entryUsdDelta,\n marginRatios: {\n min: Number(marginRatios.min),\n max: Number(marginRatios.max),\n liq: Number(marginRatios.liq),\n },\n makerDetails: isMaker\n ? {\n unlockTimestamp: Number(makerDetailsRaw.unlockTimestamp),\n tickLower: makerDetailsRaw.tickLower,\n tickUpper: makerDetailsRaw.tickUpper,\n }\n : null,\n };\n }, `getPositionRawData for position ${positionId}`);\n }\n}\n","export const FEES_ABI = [\n {\n inputs: [],\n name: \"CREATOR_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"INSURANCE_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LP_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LIQUIDATION_FEE\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","export const MARGIN_RATIOS_ABI = [\n {\n inputs: [],\n name: \"MIN_MAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MAX_MAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LIQUIDATION_MAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MIN_TAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"MAX_TAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"LIQUIDATION_TAKER_RATIO\",\n outputs: [{ internalType: \"uint24\", name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","import { type Address, erc20Abi } from \"viem\";\nimport type { PerpCityContext } from \"../context\";\n\nconst DEFAULT_CONFIRMATIONS = 2;\n\nexport async function getUsdcAllowance(context: PerpCityContext, owner: Address): Promise<bigint> {\n const deployments = context.deployments();\n return context.publicClient.readContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [owner, deployments.perpManager],\n }) as Promise<bigint>;\n}\n\nexport async function approveUsdc(\n context: PerpCityContext,\n amount: bigint,\n confirmations: number = DEFAULT_CONFIRMATIONS\n) {\n const deployments = context.deployments();\n\n const { request } = await context.publicClient.simulateContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [deployments.perpManager, amount],\n account: context.walletClient.account,\n });\n\n const hash = await context.walletClient.writeContract(request);\n\n await context.publicClient.waitForTransactionReceipt({\n confirmations: confirmations,\n hash,\n });\n}\n","export const NUMBER_1E6: number = 1000000; // 1e6\nexport const BIGINT_1E6: bigint = 1000000n; // 1e6\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n\nexport const MIN_TICK = -887272;\nexport const MAX_TICK = 887272;\nexport const MIN_PRICE = 1e-6;\nexport const MAX_PRICE = 1e6;\n\nexport const UINT256_MAX = (1n << 256n) - 1n;\nexport const INT256_THRESHOLD = 1n << 255n;\n","import {\n BIGINT_1E6,\n INT256_THRESHOLD,\n MAX_PRICE,\n MIN_PRICE,\n NUMBER_1E6,\n Q96,\n UINT256_MAX,\n} from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price <= 0) {\n throw new Error(\"Price must be positive\");\n }\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error(\"Price too large\");\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * NUMBER_1E6;\n return (BigInt(Math.floor(scaledSqrtPrice)) * Q96) / BigInt(NUMBER_1E6);\n}\n\n/**\n * Scales a number to 6 decimal precision as a bigint\n * @param amount - The amount to scale (can be negative for signed values)\n * @returns The scaled amount as a bigint\n */\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / NUMBER_1E6) {\n throw new Error(\"Amount too large\");\n }\n\n return BigInt(Math.floor(amount * NUMBER_1E6));\n}\n\nexport function scaleToX96(amount: number): bigint {\n return (BigInt(scale6Decimals(amount)) * Q96) / BigInt(NUMBER_1E6);\n}\n\nexport function scaleFromX96(valueX96: bigint): number {\n const valueScaled6Decimals = (valueX96 * BIGINT_1E6) / Q96;\n\n if (valueScaled6Decimals > Number.MAX_SAFE_INTEGER) {\n throw new Error(\"Value too large\");\n }\n\n return Number(valueScaled6Decimals) / NUMBER_1E6;\n}\n\nexport function priceToTick(price: number, roundDown: boolean): number {\n if (price <= 0) {\n throw new Error(\"Price must be positive\");\n }\n if (price < MIN_PRICE || price > MAX_PRICE) {\n throw new Error(\n `Price ${price} is outside the representable range [${MIN_PRICE}, ${MAX_PRICE}]`\n );\n }\n const logPrice = Math.log(price) / Math.log(1.0001);\n return roundDown ? Math.floor(logPrice) : Math.ceil(logPrice);\n}\n\nexport function tickToPrice(tick: number): number {\n return 1.0001 ** tick;\n}\n\n/**\n * Interprets a uint256 as int256 if it exceeds 2^255 (unsigned underflow).\n * The contract returns netMargin as uint256, but it can underflow when\n * the effective margin is negative (position is underwater).\n */\nexport function uint256ToInt256(value: bigint): bigint {\n if (value >= INT256_THRESHOLD) {\n return value - UINT256_MAX - 1n;\n }\n return value;\n}\n\nexport function sqrtPriceX96ToPrice(sqrtPriceX96: bigint): number {\n const priceX96 = (sqrtPriceX96 * sqrtPriceX96) / Q96;\n return scaleFromX96(priceX96);\n}\n\nexport function marginRatioToLeverage(marginRatio: number): number {\n if (marginRatio <= 0) {\n throw new Error(\"Margin ratio must be greater than 0\");\n }\n return NUMBER_1E6 / marginRatio;\n}\n\nexport function scaleFrom6Decimals(value: number): number {\n return value / NUMBER_1E6;\n}\n","import { BaseError, ContractFunctionRevertedError } from \"viem\";\n\n/**\n * Error category classification\n */\nexport enum ErrorCategory {\n USER_ERROR = \"USER_ERROR\",\n STATE_ERROR = \"STATE_ERROR\",\n SYSTEM_ERROR = \"SYSTEM_ERROR\",\n CONFIG_ERROR = \"CONFIG_ERROR\",\n}\n\n/**\n * Contract source classification\n */\nexport enum ErrorSource {\n PERP_MANAGER = \"PERP_MANAGER\",\n POOL_MANAGER = \"POOL_MANAGER\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Debug information for contract errors\n */\nexport interface ErrorDebugInfo {\n errorSelector?: string;\n source: ErrorSource;\n category: ErrorCategory;\n rawData?: string;\n canRetry?: boolean;\n retryGuidance?: string;\n}\n\n/**\n * Base class for all PerpCity SDK errors\n */\nexport class PerpCityError extends Error {\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"PerpCityError\";\n }\n}\n\n/**\n * Error thrown when a contract call reverts\n */\nexport class ContractError extends PerpCityError {\n constructor(\n message: string,\n public readonly errorName?: string,\n public readonly args?: readonly unknown[],\n public readonly debug?: ErrorDebugInfo,\n cause?: Error\n ) {\n super(message, cause);\n this.name = \"ContractError\";\n }\n}\n\n/**\n * Error thrown when a transaction is rejected by the user\n */\nexport class TransactionRejectedError extends PerpCityError {\n constructor(message = \"Transaction rejected by user\", cause?: Error) {\n super(message, cause);\n this.name = \"TransactionRejectedError\";\n }\n}\n\n/**\n * Error thrown when there are insufficient funds\n */\nexport class InsufficientFundsError extends PerpCityError {\n constructor(message = \"Insufficient funds for transaction\", cause?: Error) {\n super(message, cause);\n this.name = \"InsufficientFundsError\";\n }\n}\n\n/**\n * Error thrown when an RPC call fails\n */\nexport class RPCError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"RPCError\";\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends PerpCityError {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = \"ValidationError\";\n }\n}\n\n/**\n * Parse and format a contract error into a user-friendly message\n */\nexport function parseContractError(error: unknown): PerpCityError {\n if (error instanceof PerpCityError) {\n return error;\n }\n\n // Handle viem BaseError\n if (error instanceof BaseError) {\n const revertError = error.walk((err) => err instanceof ContractFunctionRevertedError);\n\n if (revertError instanceof ContractFunctionRevertedError) {\n const errorName = revertError.data?.errorName ?? \"Unknown\";\n const args = revertError.data?.args ?? [];\n\n // Map known contract errors to user-friendly messages\n const { message, debug } = formatContractError(errorName, args);\n return new ContractError(message, errorName, args, debug, error as Error);\n }\n\n // Check for user rejection\n if (error.message?.includes(\"User rejected\") || (error as any).code === 4001) {\n return new TransactionRejectedError(error.message, error as Error);\n }\n\n // Check for insufficient funds\n if (error.message?.includes(\"insufficient funds\")) {\n return new InsufficientFundsError(error.message, error as Error);\n }\n\n return new PerpCityError(error.shortMessage || error.message, error as Error);\n }\n\n // Handle generic errors\n if (error instanceof Error) {\n return new PerpCityError(error.message, error);\n }\n\n return new PerpCityError(String(error));\n}\n\n/**\n * Detect the source of an error based on its name\n */\nfunction detectErrorSource(errorName: string): ErrorSource {\n // Uniswap V4 PoolManager errors\n const poolManagerErrors = [\n \"CurrencyNotSettled\",\n \"PoolNotInitialized\",\n \"AlreadyUnlocked\",\n \"ManagerLocked\",\n \"TickSpacingTooLarge\",\n \"TickSpacingTooSmall\",\n \"CurrenciesOutOfOrderOrEqual\",\n \"UnauthorizedDynamicLPFeeUpdate\",\n \"SwapAmountCannotBeZero\",\n \"NonzeroNativeValue\",\n \"MustClearExactPositiveDelta\",\n ];\n\n // Known PerpManager errors\n const perpManagerErrors = [\n \"InvalidBeaconAddress\",\n \"InvalidTradingFeeSplits\",\n \"InvalidMaxOpeningLev\",\n \"InvalidLiquidationLev\",\n \"InvalidLiquidationFee\",\n \"InvalidLiquidatorFeeSplit\",\n \"InvalidClose\",\n \"InvalidCaller\",\n \"InvalidLiquidity\",\n \"InvalidMargin\",\n \"InvalidLevX96\",\n \"MakerPositionLocked\",\n \"MaximumAmountExceeded\",\n \"MinimumAmountInsufficient\",\n \"PriceImpactTooHigh\",\n \"SwapReverted\",\n \"ZeroSizePosition\",\n \"InvalidFundingInterval\",\n \"InvalidPriceImpactBand\",\n \"InvalidMarketDeathThreshold\",\n \"InvalidTickRange\",\n \"MarketNotKillable\",\n \"InvalidStartingSqrtPriceX96\",\n \"AccountBalanceOverflow\",\n \"BalanceQueryForZeroAddress\",\n \"NotOwnerNorApproved\",\n \"TokenAlreadyExists\",\n \"TokenDoesNotExist\",\n \"TransferFromIncorrectOwner\",\n \"TransferToNonERC721ReceiverImplementer\",\n \"TransferToZeroAddress\",\n \"NewOwnerIsZeroAddress\",\n \"NoHandoverRequest\",\n \"Unauthorized\",\n \"TransferFromFailed\",\n \"TransferFailed\",\n \"ApproveFailed\",\n \"AlreadyInitialized\",\n \"FeesNotRegistered\",\n \"FeeTooLarge\",\n \"MarginRatiosNotRegistered\",\n \"LockupPeriodNotRegistered\",\n \"SqrtPriceImpactLimitNotRegistered\",\n \"ModuleAlreadyRegistered\",\n \"InvalidAction\",\n \"InvalidMarginRatio\",\n \"MakerNotAllowed\",\n \"PositionLocked\",\n \"ZeroDelta\",\n \"NotPoolManager\",\n \"NoLiquidityToReceiveFees\",\n ];\n\n if (poolManagerErrors.includes(errorName)) {\n return ErrorSource.POOL_MANAGER;\n }\n\n if (perpManagerErrors.includes(errorName)) {\n return ErrorSource.PERP_MANAGER;\n }\n\n return ErrorSource.UNKNOWN;\n}\n\n/**\n * Format a contract error name and args into a user-friendly message with debug info\n */\nfunction formatContractError(\n errorName: string,\n args: readonly unknown[]\n): { message: string; debug: ErrorDebugInfo } {\n const source = detectErrorSource(errorName);\n\n switch (errorName) {\n // Existing PerpManager errors\n case \"InvalidBeaconAddress\":\n return {\n message: `Invalid beacon address: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidTradingFeeSplits\":\n return {\n message: `Invalid trading fee splits. Insurance split: ${args[0]}, Creator split: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidMaxOpeningLev\":\n return {\n message: `Invalid maximum opening leverage: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidLiquidationLev\":\n return {\n message: `Invalid liquidation leverage: ${args[0]}. Must be less than max opening leverage: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidLiquidationFee\":\n return {\n message: `Invalid liquidation fee: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidLiquidatorFeeSplit\":\n return {\n message: `Invalid liquidator fee split: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidClose\":\n return {\n message: `Cannot close position. Caller: ${args[0]}, Holder: ${args[1]}, Is Liquidated: ${args[2]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidCaller\":\n return {\n message: `Invalid caller. Expected: ${args[1]}, Got: ${args[0]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidLiquidity\":\n return {\n message: `Invalid liquidity amount: ${args[0]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidMargin\":\n return {\n message: `Invalid margin amount: ${args[0]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidLevX96\":\n return {\n message: `Invalid leverage: ${args[0]}. Maximum allowed: ${args[1]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MakerPositionLocked\":\n return {\n message: `Maker position is locked until ${new Date(Number(args[1]) * 1000).toISOString()}. Current time: ${new Date(Number(args[0]) * 1000).toISOString()}`,\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"MaximumAmountExceeded\":\n return {\n message: `Maximum amount exceeded. Maximum: ${args[0]}, Requested: ${args[1]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MinimumAmountInsufficient\":\n return {\n message:\n \"Slippage tolerance exceeded. The position's value moved unfavorably during execution. Try increasing your slippage tolerance.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"PriceImpactTooHigh\":\n return {\n message: `Price impact too high. Current price: ${args[0]}, Min acceptable: ${args[1]}, Max acceptable: ${args[2]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"SwapReverted\":\n return {\n message: \"Swap failed. This may be due to insufficient liquidity or slippage tolerance.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"ZeroSizePosition\":\n return {\n message: `Cannot create zero-size position. Perp delta: ${args[0]}, USD delta: ${args[1]}`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidFundingInterval\":\n return {\n message: `Invalid funding interval: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidPriceImpactBand\":\n return {\n message: `Invalid price impact band: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidMarketDeathThreshold\":\n return {\n message: `Invalid market death threshold: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"InvalidTickRange\":\n return {\n message: `Invalid tick range. Lower: ${args[0]}, Upper: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"MarketNotKillable\":\n return {\n message: `Market health (${args[0]}) is above death threshold (${args[1]}). Market cannot be killed yet.`,\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"InvalidStartingSqrtPriceX96\":\n return {\n message: `Invalid starting sqrt price: ${args[0]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n // Uniswap V4 PoolManager errors\n case \"CurrencyNotSettled\":\n return {\n message:\n \"Currency balance not settled after operation. The pool manager requires all currency deltas to be settled before unlocking.\",\n debug: {\n source,\n category: ErrorCategory.SYSTEM_ERROR,\n retryGuidance: \"This indicates an issue with the transaction flow. Please try again.\",\n },\n };\n\n case \"PoolNotInitialized\":\n return {\n message:\n \"Pool does not exist or has not been initialized. Ensure the pool has been created before attempting to interact with it.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"AlreadyUnlocked\":\n return {\n message: \"Pool manager is already unlocked. This indicates a potential reentrancy issue.\",\n debug: {\n source,\n category: ErrorCategory.SYSTEM_ERROR,\n canRetry: true,\n retryGuidance: \"This is a temporary state. Please retry your transaction.\",\n },\n };\n\n case \"ManagerLocked\":\n return {\n message:\n \"Uniswap V4 Pool Manager is currently locked. This is a temporary state during transaction processing.\",\n debug: {\n source,\n category: ErrorCategory.STATE_ERROR,\n canRetry: true,\n retryGuidance: \"Please retry your transaction in a moment.\",\n },\n };\n\n case \"TickSpacingTooLarge\":\n return {\n message: `Tick spacing (${args[0]}) exceeds the maximum allowed value. Please use a smaller tick spacing.`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"TickSpacingTooSmall\":\n return {\n message: `Tick spacing (${args[0]}) is below the minimum allowed value. Please use a larger tick spacing.`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"CurrenciesOutOfOrderOrEqual\":\n return {\n message: `Currencies must be ordered (currency0 < currency1) and not equal. Got currency0: ${args[0]}, currency1: ${args[1]}`,\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"UnauthorizedDynamicLPFeeUpdate\":\n return {\n message:\n \"Unauthorized attempt to update dynamic LP fee. Only authorized addresses can modify fees.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"SwapAmountCannotBeZero\":\n return {\n message: \"Swap amount cannot be zero. Please specify a valid swap amount.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NonzeroNativeValue\":\n return {\n message:\n \"Native ETH was sent with the transaction when none was expected. Do not send ETH with this operation.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MustClearExactPositiveDelta\":\n return {\n message:\n \"Must clear exact positive delta. The transaction must settle the exact amount owed to the pool.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n // Missing PerpManager errors - ERC721/Ownership\n case \"AccountBalanceOverflow\":\n return {\n message:\n \"Account balance overflow detected. This is a critical error that should not occur under normal conditions.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n case \"BalanceQueryForZeroAddress\":\n return {\n message: \"Cannot query balance for the zero address.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NotOwnerNorApproved\":\n return {\n message: \"Caller is not the owner or an approved operator for this position.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TokenAlreadyExists\":\n return {\n message: \"A position with this ID already exists.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"TokenDoesNotExist\":\n return {\n message: \"The specified position does not exist.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferFromIncorrectOwner\":\n return {\n message: \"Attempting to transfer position from incorrect owner.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferToNonERC721ReceiverImplementer\":\n return {\n message:\n \"Cannot transfer position to a contract that does not implement ERC721 receiver interface.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferToZeroAddress\":\n return {\n message: \"Cannot transfer position to the zero address.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NewOwnerIsZeroAddress\":\n return {\n message: \"New owner cannot be the zero address.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"NoHandoverRequest\":\n return {\n message: \"No pending ownership handover request exists.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"Unauthorized\":\n return {\n message: \"Unauthorized access. Caller does not have permission to perform this operation.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n // Missing PerpManager errors - Transfer/Approval\n case \"TransferFromFailed\":\n return {\n message:\n \"ERC20 transferFrom operation failed. Ensure you have approved sufficient tokens and have enough balance.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"TransferFailed\":\n return {\n message:\n \"ERC20 transfer operation failed. This may indicate insufficient balance or a token contract issue.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n case \"ApproveFailed\":\n return {\n message: \"ERC20 approve operation failed. Please check the token contract.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n // Missing PerpManager errors - Module Config\n case \"AlreadyInitialized\":\n return {\n message: \"Contract has already been initialized. Initialization can only occur once.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"FeesNotRegistered\":\n return {\n message:\n \"Fees module has not been registered for this pool. Please register the fees module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"FeeTooLarge\":\n return {\n message: \"The specified fee exceeds the maximum allowed value.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"MarginRatiosNotRegistered\":\n return {\n message:\n \"Margin ratios module has not been registered for this pool. Please register the module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"LockupPeriodNotRegistered\":\n return {\n message:\n \"Lockup period module has not been registered for this pool. Please register the module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"SqrtPriceImpactLimitNotRegistered\":\n return {\n message:\n \"Sqrt price impact limit module has not been registered for this pool. Please register the module before proceeding.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n case \"ModuleAlreadyRegistered\":\n return {\n message: \"This module has already been registered and cannot be registered again.\",\n debug: { source, category: ErrorCategory.CONFIG_ERROR },\n };\n\n // Missing PerpManager errors - Position/Trading\n case \"InvalidAction\":\n return {\n message: `Invalid action type: ${args[0]}. Please specify a valid action.`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"InvalidMarginRatio\":\n return {\n message: `Invalid margin ratio: ${args[0]}. The margin ratio must be within acceptable bounds.`,\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"MakerNotAllowed\":\n return {\n message: \"Maker positions are not allowed for this operation.\",\n debug: { source, category: ErrorCategory.USER_ERROR },\n };\n\n case \"PositionLocked\":\n return {\n message:\n \"This position is currently locked. Maker positions have a time-based lockup period to ensure liquidity stability.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"ZeroDelta\":\n return {\n message:\n \"Position has zero size. Cannot perform operation on a position with no open size.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n case \"NotPoolManager\":\n return {\n message:\n \"Only the Uniswap V4 Pool Manager can call this function. This indicates an architectural issue.\",\n debug: { source, category: ErrorCategory.SYSTEM_ERROR },\n };\n\n case \"NoLiquidityToReceiveFees\":\n return {\n message:\n \"No liquidity available to receive fees. Ensure there is sufficient liquidity in the pool.\",\n debug: { source, category: ErrorCategory.STATE_ERROR },\n };\n\n default:\n return {\n message: `Contract error: ${errorName}${args.length > 0 ? ` (${args.join(\", \")})` : \"\"}`,\n debug: { source: ErrorSource.UNKNOWN, category: ErrorCategory.SYSTEM_ERROR },\n };\n }\n}\n\n/**\n * Wrap an async function with error handling\n */\nexport async function withErrorHandling<T>(fn: () => Promise<T>, context: string): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const parsedError = parseContractError(error);\n parsedError.message = `${context}: ${parsedError.message}`;\n throw parsedError;\n }\n}\n","import { Q96 } from \"./constants\";\n\nconst PRECISION = 10n ** 18n;\n\n/**\n * Convert a funding diff (over `interval` seconds) to a percentage for `period` seconds.\n * Defers the interval division until after scaling to avoid truncating small differentials.\n */\nexport function convertFundingDiffX96ToPercentPerPeriod(\n fundingDiffX96: bigint,\n interval: bigint,\n periodSeconds: bigint\n): number {\n // rate = (diff / interval) * period = (diff * period) / interval\n // Scale by PRECISION before dividing by Q96 and interval to preserve precision.\n const scaledRate = (fundingDiffX96 * periodSeconds * PRECISION) / (Q96 * interval);\n return Number(scaledRate) / Number(PRECISION);\n}\n\nexport function convertFundingPerSecondX96ToPercentPerMinute(fundingPerSecondX96: bigint): number {\n const SECONDS_PER_MINUTE = 60n;\n const scaledRate = (fundingPerSecondX96 * SECONDS_PER_MINUTE * PRECISION) / Q96;\n return Number(scaledRate) / Number(PRECISION);\n}\n\nexport function convertFundingPerSecondX96ToPercentPerDay(fundingPerSecondX96: bigint): number {\n const SECONDS_PER_DAY = 86400n;\n const scaledRate = (fundingPerSecondX96 * SECONDS_PER_DAY * PRECISION) / Q96;\n return Number(scaledRate) / Number(PRECISION);\n}\n","import type { PerpCityContext } from \"../context\";\nimport { sqrtPriceX96ToPrice, tickToPrice } from \"./conversions\";\n\n/**\n * Calculate liquidity from USDC amount (amount1) using Uniswap v3 formula\n * liquidity = amount1 / (sqrt(priceUpper) - sqrt(priceLower))\n *\n * This replicates the estimateLiquidityForAmount1 function that existed in older contracts\n * but is not present in the deployed contracts.\n */\nexport async function estimateLiquidity(\n _context: PerpCityContext,\n tickLower: number,\n tickUpper: number,\n usdScaled: bigint\n): Promise<bigint> {\n // Validate inputs\n if (tickLower >= tickUpper) {\n throw new Error(\n `Invalid tick range: tickLower (${tickLower}) must be less than tickUpper (${tickUpper})`\n );\n }\n\n if (usdScaled === 0n) {\n return 0n;\n }\n\n // Calculate sqrt prices from ticks using Uniswap v3 formula\n // sqrtPriceX96 = sqrt(1.0001^tick) * 2^96\n const Q96 = 1n << 96n;\n\n const sqrtPriceLowerX96 = getSqrtRatioAtTick(tickLower);\n const sqrtPriceUpperX96 = getSqrtRatioAtTick(tickUpper);\n\n // Calculate liquidity using the formula:\n // L = amount1 / (sqrtPriceUpper - sqrtPriceLower) * Q96\n const sqrtPriceDiff = sqrtPriceUpperX96 - sqrtPriceLowerX96;\n\n if (sqrtPriceDiff === 0n) {\n throw new Error(\n `Division by zero: sqrtPriceDiff is 0 for ticks ${tickLower} to ${tickUpper}. sqrtLower=${sqrtPriceLowerX96}, sqrtUpper=${sqrtPriceUpperX96}`\n );\n }\n\n const liquidity = (usdScaled * Q96) / sqrtPriceDiff;\n\n return liquidity;\n}\n\n/**\n * Get sqrt price at tick using Uniswap v4 formula\n * sqrtPriceX96 = sqrt(1.0001^tick) * 2^96\n */\nfunction getSqrtRatioAtTick(tick: number): bigint {\n const absTick = Math.abs(tick);\n\n let ratio =\n absTick & 0x1 ? 0xfffcb933bd6fad37aa2d162d1a594001n : 0x100000000000000000000000000000000n;\n if (absTick & 0x2) ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;\n if (absTick & 0x4) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;\n if (absTick & 0x8) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;\n if (absTick & 0x10) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;\n if (absTick & 0x20) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;\n if (absTick & 0x40) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;\n if (absTick & 0x80) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;\n if (absTick & 0x100) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;\n if (absTick & 0x200) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;\n if (absTick & 0x400) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;\n if (absTick & 0x800) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;\n if (absTick & 0x1000) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;\n if (absTick & 0x2000) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;\n if (absTick & 0x4000) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;\n if (absTick & 0x8000) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;\n if (absTick & 0x10000) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;\n if (absTick & 0x20000) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;\n if (absTick & 0x40000) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;\n if (absTick & 0x80000) ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;\n\n if (tick > 0) ratio = (1n << 256n) / ratio;\n return ratio >> 32n;\n}\n\n/**\n * Calculate liquidity amount to achieve a target margin ratio for a maker position.\n *\n * For a Uniswap v3 style maker position:\n * - Margin ratio = margin / total_debt\n * - Total debt = USD value of LP exposure at current price\n *\n * When price P is within range [pL, pU]:\n * - amount0 = liquidity * (1/sqrt(P) - 1/sqrt(pU))\n * - amount1 = liquidity * (sqrt(P) - sqrt(pL))\n * - total_debt = amount0 * P + amount1 (in USD terms)\n *\n * @param marginScaled - Margin in scaled units (6 decimals)\n * @param tickLower - Lower tick of the range\n * @param tickUpper - Upper tick of the range\n * @param currentSqrtPriceX96 - Current sqrt price in Q96 format\n * @param targetMarginRatio - Target margin ratio (e.g., 1.2 for 120%)\n * @returns Liquidity amount as bigint\n */\nexport function calculateLiquidityForTargetRatio(\n marginScaled: bigint,\n tickLower: number,\n tickUpper: number,\n currentSqrtPriceX96: bigint,\n targetMarginRatio: number\n): bigint {\n // Validate inputs\n if (tickLower >= tickUpper) {\n throw new Error(\n `Invalid tick range: tickLower (${tickLower}) must be less than tickUpper (${tickUpper})`\n );\n }\n\n if (marginScaled === 0n) {\n return 0n;\n }\n\n if (targetMarginRatio <= 0) {\n throw new Error(`Invalid target margin ratio: ${targetMarginRatio} must be positive`);\n }\n\n // Get prices from ticks\n const priceLower = tickToPrice(tickLower);\n const priceUpper = tickToPrice(tickUpper);\n\n // Current price from sqrtPriceX96\n const currentPrice = sqrtPriceX96ToPrice(currentSqrtPriceX96);\n\n // Calculate sqrt prices\n const sqrtCurrentPrice = Math.sqrt(currentPrice);\n const sqrtPriceLower = Math.sqrt(priceLower);\n const sqrtPriceUpper = Math.sqrt(priceUpper);\n\n // Debt per unit liquidity (in USD terms)\n // When price is within range:\n // amount0_per_L = (1/sqrtP - 1/sqrtPU) [perp tokens per unit liquidity]\n // amount1_per_L = (sqrtP - sqrtPL) [USD per unit liquidity]\n // debt_per_L = amount0_per_L * P + amount1_per_L [total USD value per unit liquidity]\n let debtPerL: number;\n\n if (currentPrice <= priceLower) {\n // Price below range: only token0 exposure\n // amount0_per_L = (1/sqrtPL - 1/sqrtPU)\n const amount0PerL = 1 / sqrtPriceLower - 1 / sqrtPriceUpper;\n debtPerL = amount0PerL * currentPrice;\n } else if (currentPrice >= priceUpper) {\n // Price above range: only token1 exposure\n // amount1_per_L = (sqrtPU - sqrtPL)\n debtPerL = sqrtPriceUpper - sqrtPriceLower;\n } else {\n // Price within range: both token0 and token1 exposure\n const amount0PerL = 1 / sqrtCurrentPrice - 1 / sqrtPriceUpper;\n const amount1PerL = sqrtCurrentPrice - sqrtPriceLower;\n debtPerL = amount0PerL * currentPrice + amount1PerL;\n }\n\n if (debtPerL <= 0) {\n throw new Error(\"Calculated debt per unit liquidity is zero or negative\");\n }\n\n // Target debt = margin / targetRatio\n const margin = Number(marginScaled) / 1e6;\n const targetDebt = margin / targetMarginRatio;\n\n // Liquidity = targetDebt / debtPerL\n const liquidity = targetDebt / debtPerL;\n\n if (liquidity <= 0) {\n throw new Error(\"Calculated liquidity is zero or negative\");\n }\n\n return BigInt(Math.floor(liquidity));\n}\n","/**\n * RPC URL utilities for connecting to blockchain networks\n */\n\nexport interface RpcConfig {\n url?: string;\n}\n\n/**\n * Get the RPC URL from environment or configuration\n *\n * This is a simple helper that retrieves the RPC URL from the RPC_URL\n * environment variable or accepts a direct override. The function does\n * not construct URLs - it expects the full endpoint URL to be provided.\n *\n * @param config - Optional configuration with URL override\n * @returns The RPC URL to use for connections\n * @throws Error if no RPC URL is configured\n *\n * @example\n * // Get URL from RPC_URL environment variable\n * // RPC_URL=https://your-rpc-endpoint.example\n * const url = getRpcUrl();\n * // Returns: https://your-rpc-endpoint.example\n *\n * @example\n * // Override with custom URL\n * const url = getRpcUrl({\n * url: 'https://custom-rpc.example'\n * });\n * // Returns: https://custom-rpc.example\n */\nexport function getRpcUrl(config: RpcConfig = {}): string {\n const rpcUrl = config.url ?? process.env.RPC_URL;\n\n if (!rpcUrl) {\n throw new Error(\n \"RPC_URL is required. Please set the RPC_URL environment variable with your full RPC endpoint URL.\\n\" +\n \"Example URLs (use your own provider and API key):\\n\" +\n \" https://base-sepolia.g.alchemy.com/v2/YOUR_API_KEY\\n\" +\n \" https://base-sepolia.infura.io/v3/YOUR_API_KEY\\n\" +\n \" https://sepolia.base.org\"\n );\n }\n\n return rpcUrl;\n}\n","import type { Hex } from \"viem\";\nimport { decodeEventLog, formatUnits } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type { ClosePositionParams, ClosePositionResult, LiveDetails } from \"../types/entity-data\";\nimport { scale6Decimals, uint256ToInt256 } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\n\nexport class OpenPosition {\n public readonly context: PerpCityContext;\n public readonly perpId: Hex;\n public readonly positionId: bigint;\n public readonly isLong?: boolean;\n public readonly isMaker?: boolean;\n public readonly txHash?: Hex;\n\n constructor(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint,\n isLong?: boolean,\n isMaker?: boolean,\n txHash?: Hex\n ) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n this.isLong = isLong;\n this.isMaker = isMaker;\n this.txHash = txHash;\n }\n\n async closePosition(params: ClosePositionParams): Promise<ClosePositionResult> {\n return withErrorHandling(\n async () => {\n const contractParams = {\n posId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n // Simulate the transaction first - this will catch contract errors early\n const { request } = await this.context.publicClient.simulateContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"closePosition\",\n args: [contractParams],\n account: this.context.walletClient.account,\n gas: 500000n, // Provide explicit gas limit to avoid estimation issues\n });\n\n // Execute the transaction\n const txHash = await this.context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const receipt = await this.context.publicClient.waitForTransactionReceipt({ hash: txHash });\n\n // Check if transaction was successful\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Scan transaction events to determine if this was a partial or full close\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, a PositionClosed event is emitted\n let newPositionId: bigint | null = null;\n let _wasFullyClosed = false;\n\n for (const log of receipt.logs) {\n try {\n // Check for PositionOpened event (partial close)\n const openedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionOpened\",\n });\n\n // Match the perpId (case-insensitive) and extract the new position ID\n // For partial closes, a NEW position is created with a DIFFERENT posId\n const eventPerpId = (openedDecoded.args.perpId as string).toLowerCase();\n const eventPosId = openedDecoded.args.posId as bigint;\n\n if (eventPerpId === this.perpId.toLowerCase() && eventPosId !== this.positionId) {\n newPositionId = eventPosId;\n break;\n }\n } catch (_e) {\n // Not a PositionOpened event, try PositionClosed\n try {\n const closedDecoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionClosed\",\n });\n\n // If this position was fully closed, mark it (case-insensitive perpId comparison)\n const closedPerpId = (closedDecoded.args.perpId as string).toLowerCase();\n if (\n closedPerpId === this.perpId.toLowerCase() &&\n closedDecoded.args.posId === this.positionId\n ) {\n _wasFullyClosed = true;\n break;\n }\n } catch (_e2) {}\n }\n }\n\n // If no new position ID, this was a full close\n if (!newPositionId) {\n return { position: null, txHash };\n }\n\n // Return new OpenPosition with the new position from partial close\n return {\n position: new OpenPosition(\n this.context,\n this.perpId,\n newPositionId,\n this.isLong,\n this.isMaker,\n txHash\n ),\n txHash,\n };\n },\n `closePosition for ${this.isMaker ? \"maker\" : \"taker\"} position ${this.positionId}`\n );\n }\n\n async liveDetails(): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await this.context.publicClient.readContract({\n address: this.context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [this.positionId],\n })) as unknown as readonly [Hex, bigint, bigint, bigint, boolean, bigint];\n\n // The result is a tuple: [unexpectedReason, pnl, funding, netMargin, wasLiquidated, notional]\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(\n `Failed to quote position ${this.positionId} - position may be invalid or already closed`\n );\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n fundingPayment: Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `liveDetails for position ${this.positionId}`);\n }\n}\n","import type { Hex } from \"viem\";\nimport { BEACON_ABI } from \"../abis/beacon\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type { PerpData } from \"../types/entity-data\";\nimport { Q96 } from \"../utils/constants\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { convertFundingDiffX96ToPercentPerPeriod } from \"../utils/funding\";\n\nconst TWAVG_WINDOW = 3600; // 1 hour, matches Constants.sol TWAVG_WINDOW\nconst INTERVAL = 86400n; // 1 day in seconds, matches Constants.sol INTERVAL\n\n// Pure functions that operate on PerpData\nexport function getPerpMark(perpData: PerpData): number {\n return perpData.mark;\n}\n\nexport function getPerpBeacon(perpData: PerpData): string {\n return perpData.beacon;\n}\n\nexport function getPerpBounds(perpData: PerpData) {\n return perpData.bounds;\n}\n\nexport function getPerpFees(perpData: PerpData) {\n return perpData.fees;\n}\n\nexport function getPerpTickSpacing(perpData: PerpData): number {\n return perpData.tickSpacing;\n}\n\nexport async function getFundingRate(\n context: PerpCityContext,\n perpId: Hex\n): Promise<{ ratePerDay: number; ratePerMinute: number; rawX96: bigint }> {\n return withErrorHandling(async () => {\n const perpManagerAddr = context.deployments().perpManager;\n const cfg = await context.getPerpConfig(perpId);\n\n const [twAvgSqrtMarkX96, twAvgIndexX96] = await Promise.all([\n context.publicClient.readContract({\n address: perpManagerAddr,\n abi: PERP_MANAGER_ABI,\n functionName: \"timeWeightedAvgSqrtPriceX96\",\n args: [perpId, TWAVG_WINDOW],\n }) as Promise<bigint>,\n context.publicClient.readContract({\n address: cfg.beacon,\n abi: BEACON_ABI,\n functionName: \"twAvg\",\n args: [TWAVG_WINDOW],\n }) as Promise<bigint>,\n ]);\n\n const twAvgMarkX96 = (twAvgSqrtMarkX96 * twAvgSqrtMarkX96) / Q96;\n // Defer INTERVAL division to avoid truncating small funding differentials.\n // fundingDiffX96 = (mark - index) per INTERVAL period.\n const fundingDiffX96 = twAvgMarkX96 - twAvgIndexX96;\n // For rawX96 (per-second rate), divide here — callers expect per-second.\n const fundingPerSecondX96 = fundingDiffX96 / INTERVAL;\n\n return {\n ratePerDay: convertFundingDiffX96ToPercentPerPeriod(fundingDiffX96, INTERVAL, 86400n),\n ratePerMinute: convertFundingDiffX96ToPercentPerPeriod(fundingDiffX96, INTERVAL, 60n),\n rawX96: fundingPerSecondX96,\n };\n }, `getFundingRate for perp ${perpId}`);\n}\n\nexport async function getIndexValue(context: PerpCityContext, perpId: Hex): Promise<bigint> {\n return withErrorHandling(async () => {\n const perpData = await context.getPerpData(perpId);\n return (await context.publicClient.readContract({\n address: perpData.beacon,\n abi: BEACON_ABI,\n functionName: \"index\",\n })) as bigint;\n }, `getIndexValue for perp ${perpId}`);\n}\n\nexport async function getIndexTWAP(\n context: PerpCityContext,\n perpId: Hex,\n secondsAgo: number\n): Promise<bigint> {\n return withErrorHandling(async () => {\n const perpData = await context.getPerpData(perpId);\n return (await context.publicClient.readContract({\n address: perpData.beacon,\n abi: BEACON_ABI,\n functionName: \"twAvg\",\n args: [secondsAgo],\n })) as bigint;\n }, `getIndexTWAP for perp ${perpId}`);\n}\n","import type { Address, Hex } from \"viem\";\nimport { decodeErrorResult, decodeEventLog, erc20Abi } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type {\n CreatePerpParams,\n OpenMakerPositionParams,\n OpenTakerPositionParams,\n QuoteOpenMakerPositionResult,\n QuoteTakerPositionResult,\n} from \"../types/entity-data\";\nimport { MAX_TICK, MIN_TICK, NUMBER_1E6, priceToTick, scale6Decimals } from \"../utils\";\nimport { approveUsdc } from \"../utils/approve\";\nimport { withErrorHandling } from \"../utils/errors\";\nimport { OpenPosition } from \"./open-position\";\n\nexport async function createPerp(context: PerpCityContext, params: CreatePerpParams): Promise<Hex> {\n return withErrorHandling(async () => {\n const deployments = context.deployments();\n\n // Use params if provided, otherwise fall back to deployment config\n const fees = params.fees ?? deployments.feesModule;\n const marginRatios = params.marginRatios ?? deployments.marginRatiosModule;\n const lockupPeriod = params.lockupPeriod ?? deployments.lockupPeriodModule;\n const sqrtPriceImpactLimit =\n params.sqrtPriceImpactLimit ?? deployments.sqrtPriceImpactLimitModule;\n\n if (!fees || !marginRatios || !lockupPeriod || !sqrtPriceImpactLimit) {\n throw new Error(\"Module addresses must be provided either in params or deployment config\");\n }\n\n const contractParams = {\n beacon: params.beacon,\n fees,\n marginRatios,\n lockupPeriod,\n sqrtPriceImpactLimit,\n };\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"createPerp\",\n args: [contractParams],\n account: context.walletClient.account,\n });\n\n // Execute the transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Check if transaction was successful\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract perpId from PerpCreated event\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PerpCreated\",\n });\n\n // Return the perpId from the event\n return decoded.args.perpId as Hex;\n } catch (_e) {}\n }\n\n throw new Error(\"PerpCreated event not found in transaction receipt\");\n }, \"createPerp\");\n}\n\nexport async function openTakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenTakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n // Validate inputs\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.leverage <= 0) {\n throw new Error(\"Leverage must be greater than 0\");\n }\n\n // Convert margin to 6-decimal scaled bigint\n const marginScaled = scale6Decimals(params.margin);\n\n // Calculate margin ratio by inverting leverage\n const marginRatio = Math.floor(NUMBER_1E6 / params.leverage);\n\n // Calculate total approval amount: margin + fees\n // Fees are percentages of notional (= margin * leverage)\n const perpData = await context.getPerpData(perpId);\n const { creatorFee, insuranceFee, lpFee } = perpData.fees;\n\n const protocolFeeRaw = await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"protocolFee\",\n });\n const protocolFeeRate = Number(protocolFeeRaw) / NUMBER_1E6;\n\n const notional = (marginScaled * BigInt(NUMBER_1E6)) / BigInt(marginRatio);\n const totalFeeRate = creatorFee + insuranceFee + lpFee + protocolFeeRate;\n const totalFees = BigInt(Math.ceil(Number(notional) * totalFeeRate));\n\n const requiredAmount = marginScaled + totalFees;\n const currentAllowance = await context.publicClient.readContract({\n address: context.deployments().usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, context.deployments().perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < requiredAmount) {\n await approveUsdc(context, requiredAmount);\n }\n\n // Handle unspecifiedAmountLimit - can be number (human units) or bigint (raw value)\n const unspecifiedAmountLimit =\n typeof params.unspecifiedAmountLimit === \"bigint\"\n ? params.unspecifiedAmountLimit\n : scale6Decimals(params.unspecifiedAmountLimit);\n\n // Prepare contract parameters - deployed contract requires holder address\n const contractParams = {\n holder: context.walletClient.account!.address,\n isLong: params.isLong,\n margin: marginScaled,\n marginRatio: marginRatio,\n unspecifiedAmountLimit,\n };\n\n // Simulate transaction - deployed contract uses openTakerPos\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"openTakerPos\" as any,\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n // Execute transaction\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for confirmation\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Verify success\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract takerPosId from PositionOpened event\n let takerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n // Don't specify eventName - let viem auto-detect from ABI\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n });\n\n // Check if this is a PositionOpened event for our perpId and it's a taker\n // Note: perpId from events is lowercased, so normalize both for comparison\n if (\n decoded.eventName === \"PositionOpened\" &&\n (decoded.args.perpId as string).toLowerCase() === perpId.toLowerCase() &&\n !decoded.args.isMaker\n ) {\n takerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (_e) {}\n }\n\n if (!takerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n // Return OpenPosition instance with transaction hash\n return new OpenPosition(context, perpId, takerPosId, params.isLong, false, txHash);\n }, \"openTakerPosition\");\n}\n\nfunction buildMakerContractParams(\n context: PerpCityContext,\n marginScaled: bigint,\n params: OpenMakerPositionParams,\n alignedTickLower: number,\n alignedTickUpper: number,\n maxAmt0In: bigint,\n maxAmt1In: bigint\n) {\n return {\n holder: context.walletClient.account!.address,\n margin: marginScaled,\n liquidity: params.liquidity,\n tickLower: alignedTickLower,\n tickUpper: alignedTickUpper,\n maxAmt0In,\n maxAmt1In,\n };\n}\n\nexport function calculateAlignedTicks(\n priceLower: number,\n priceUpper: number,\n tickSpacing: number\n): { alignedTickLower: number; alignedTickUpper: number } {\n const tickLower = priceToTick(priceLower, true);\n const tickUpper = priceToTick(priceUpper, false);\n\n const alignedTickLower = Math.floor(tickLower / tickSpacing) * tickSpacing;\n const alignedTickUpper = Math.ceil(tickUpper / tickSpacing) * tickSpacing;\n\n if (alignedTickLower < MIN_TICK) {\n throw new Error(\n `Lower tick ${alignedTickLower} is below MIN_TICK (${MIN_TICK}). Increase priceLower.`\n );\n }\n if (alignedTickUpper > MAX_TICK) {\n throw new Error(\n `Upper tick ${alignedTickUpper} exceeds MAX_TICK (${MAX_TICK}). Decrease priceUpper.`\n );\n }\n if (alignedTickLower === alignedTickUpper) {\n throw new Error(\n \"Price range too narrow: lower and upper ticks are equal after alignment. Widen the range.\"\n );\n }\n\n return { alignedTickLower, alignedTickUpper };\n}\n\nfunction alignMakerTicks(\n params: OpenMakerPositionParams,\n tickSpacing: number\n): { alignedTickLower: number; alignedTickUpper: number } {\n return calculateAlignedTicks(params.priceLower, params.priceUpper, tickSpacing);\n}\n\nexport const DEFAULT_MAKER_SLIPPAGE_TOLERANCE = 0.01;\nexport const MAX_UINT128 = 2n ** 128n - 1n;\n\nexport async function quoteOpenMakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenMakerPositionParams\n): Promise<QuoteOpenMakerPositionResult> {\n return withErrorHandling(async () => {\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.priceLower >= params.priceUpper) {\n throw new Error(\"priceLower must be less than priceUpper\");\n }\n\n const marginScaled = scale6Decimals(params.margin);\n const perpData = await context.getPerpData(perpId);\n const { alignedTickLower, alignedTickUpper } = alignMakerTicks(params, perpData.tickSpacing);\n\n const contractParams = buildMakerContractParams(\n context,\n marginScaled,\n params,\n alignedTickLower,\n alignedTickUpper,\n MAX_UINT128,\n MAX_UINT128\n );\n\n const [unexpectedReason, perpDelta, usdDelta] = (await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteOpenMakerPosition\" as any,\n args: [perpId, contractParams] as any,\n })) as unknown as readonly [string, bigint, bigint];\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(`Quote failed: ${unexpectedReason}`);\n }\n\n return { perpDelta, usdDelta };\n }, \"quoteOpenMakerPosition\");\n}\n\n/**\n * Computes maxAmtIn slippage limit from a quote delta.\n *\n * When delta < 0 (tokens need to go in), applies slippage tolerance to the\n * absolute amount. When delta >= 0 (quote says no tokens needed), uses\n * `fallbackRef` as a reference to compute a small buffer — this prevents\n * reverts when price moves between quote and execution, shifting the token\n * split so some amount of this token is now required.\n *\n * Note: `fallbackRef` is intentionally the *other* leg's delta (cross-unit).\n * It is only used as a rough magnitude reference for sizing a small buffer,\n * not as a precise same-unit value. For maker positions the two legs are\n * correlated in magnitude, so this heuristic produces a reasonable buffer.\n */\nexport function applySlippage(\n delta: bigint,\n slippageTolerance: number,\n fallbackRef?: bigint\n): bigint {\n const slippageBps = BigInt(Math.ceil(slippageTolerance * 10000));\n\n if (delta < 0n) {\n const absDelta = -delta;\n return absDelta + (absDelta * slippageBps) / 10000n;\n }\n\n // delta >= 0: quote says no tokens sent in, but price may move.\n // Use a fraction of the fallback reference as a buffer.\n if (fallbackRef !== undefined && fallbackRef !== 0n) {\n const absRef = fallbackRef < 0n ? -fallbackRef : fallbackRef;\n return (absRef * slippageBps) / 10000n;\n }\n\n return 0n;\n}\n\nexport async function openMakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: OpenMakerPositionParams\n): Promise<OpenPosition> {\n return withErrorHandling(async () => {\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.priceLower >= params.priceUpper) {\n throw new Error(\"priceLower must be less than priceUpper\");\n }\n\n const marginScaled = scale6Decimals(params.margin);\n const perpData = await context.getPerpData(perpId);\n const { alignedTickLower, alignedTickUpper } = alignMakerTicks(params, perpData.tickSpacing);\n\n let maxAmt0In: bigint;\n let maxAmt1In: bigint;\n\n if ((params.maxAmt0In === undefined) !== (params.maxAmt1In === undefined)) {\n throw new Error(\n \"Both maxAmt0In and maxAmt1In must be provided together or neither. \" +\n \"Omit both to use automatic quote-based slippage calculation.\"\n );\n }\n\n if (params.maxAmt0In !== undefined && params.maxAmt1In !== undefined) {\n maxAmt0In =\n typeof params.maxAmt0In === \"bigint\" ? params.maxAmt0In : scale6Decimals(params.maxAmt0In);\n maxAmt1In =\n typeof params.maxAmt1In === \"bigint\" ? params.maxAmt1In : scale6Decimals(params.maxAmt1In);\n } else {\n const quote = await quoteOpenMakerPosition(context, perpId, params);\n const slippage = params.slippageTolerance ?? DEFAULT_MAKER_SLIPPAGE_TOLERANCE;\n // Pass the other delta as fallback: if one token has delta >= 0 (not needed),\n // use the other token's delta to compute a small buffer for price movement.\n maxAmt0In = applySlippage(quote.perpDelta, slippage, quote.usdDelta);\n maxAmt1In = applySlippage(quote.usdDelta, slippage, quote.perpDelta);\n }\n\n // Approve USDC spending only if current allowance is insufficient\n // maxAmt1In is a slippage limit, not the actual amount needed\n // For positions below current price, only margin is deposited\n const currentAllowance = await context.publicClient.readContract({\n address: context.deployments().usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, context.deployments().perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < marginScaled) {\n await approveUsdc(context, marginScaled);\n }\n\n const contractParams = buildMakerContractParams(\n context,\n marginScaled,\n params,\n alignedTickLower,\n alignedTickUpper,\n maxAmt0In,\n maxAmt1In\n );\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"openMakerPos\" as any,\n args: [perpId, contractParams],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n let makerPosId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n });\n\n if (\n decoded.eventName === \"PositionOpened\" &&\n (decoded.args.perpId as string).toLowerCase() === perpId.toLowerCase() &&\n decoded.args.isMaker\n ) {\n makerPosId = decoded.args.posId as bigint;\n break;\n }\n } catch (_e) {}\n }\n\n if (!makerPosId) {\n throw new Error(`PositionOpened event not found in transaction receipt. Hash: ${txHash}`);\n }\n\n return new OpenPosition(context, perpId, makerPosId, undefined, true, txHash);\n }, \"openMakerPosition\");\n}\n\nexport async function quoteTakerPosition(\n context: PerpCityContext,\n perpId: Hex,\n params: {\n holder: Address;\n isLong: boolean;\n margin: number;\n leverage: number;\n }\n): Promise<QuoteTakerPositionResult> {\n return withErrorHandling(async () => {\n if (params.margin <= 0) {\n throw new Error(\"Margin must be greater than 0\");\n }\n if (params.leverage <= 0) {\n throw new Error(\"Leverage must be greater than 0\");\n }\n\n const marginScaled = scale6Decimals(params.margin);\n const marginRatio = Math.floor(NUMBER_1E6 / params.leverage);\n\n const result = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteOpenTakerPosition\" as any,\n args: [\n perpId,\n {\n holder: params.holder,\n isLong: params.isLong,\n margin: marginScaled,\n marginRatio,\n unspecifiedAmountLimit: params.isLong ? 0n : (1n << 128n) - 1n,\n },\n ] as any,\n account: params.holder,\n });\n\n const [unexpectedReason, perpDelta, usdDelta] = result.result as unknown as readonly [\n Hex,\n bigint,\n bigint,\n ];\n\n if (unexpectedReason && unexpectedReason !== \"0x\") {\n let errorName = \"Quote simulation failed\";\n try {\n const decoded = decodeErrorResult({\n abi: PERP_MANAGER_ABI,\n data: unexpectedReason,\n });\n errorName = decoded.errorName;\n } catch {\n // Could not decode, use generic name\n }\n throw new Error(errorName);\n }\n\n const absPerpDelta = perpDelta < 0n ? -perpDelta : perpDelta;\n const absUsdDelta = usdDelta < 0n ? -usdDelta : usdDelta;\n\n if (absPerpDelta === 0n) {\n throw new Error(\"Zero position size\");\n }\n\n const fillPrice = Number(absUsdDelta) / Number(absPerpDelta);\n\n return { perpDelta, usdDelta, fillPrice };\n }, \"quoteTakerPosition\");\n}\n\nexport async function adjustMargin(\n context: PerpCityContext,\n positionId: bigint,\n marginDelta: bigint\n): Promise<{ txHash: Hex }> {\n return withErrorHandling(async () => {\n const deployments = context.deployments();\n\n if (marginDelta > 0n) {\n const currentAllowance = await context.publicClient.readContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, deployments.perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < marginDelta) {\n await approveUsdc(context, marginDelta);\n }\n }\n\n const { request } = await context.publicClient.simulateContract({\n address: deployments.perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"adjustMargin\",\n args: [{ posId: positionId, marginDelta }],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n return { txHash };\n }, `adjustMargin for position ${positionId}`);\n}\n\nexport async function adjustNotional(\n context: PerpCityContext,\n positionId: bigint,\n usdDelta: bigint,\n perpLimit: bigint\n): Promise<{ txHash: Hex }> {\n return withErrorHandling(async () => {\n const deployments = context.deployments();\n\n if (usdDelta > 0n) {\n // Approve the USDC amount (usdDelta), not the perp-side limit\n const currentAllowance = await context.publicClient.readContract({\n address: deployments.usdc,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [context.walletClient.account!.address, deployments.perpManager],\n blockTag: \"latest\",\n });\n if (currentAllowance < usdDelta) {\n await approveUsdc(context, usdDelta);\n }\n }\n\n const { request } = await context.publicClient.simulateContract({\n address: deployments.perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"adjustNotional\",\n args: [{ posId: positionId, usdDelta, perpLimit }],\n account: context.walletClient.account,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n return { txHash };\n }, `adjustNotional for position ${positionId}`);\n}\n","import { decodeErrorResult, decodeEventLog, formatUnits, type Hex } from \"viem\";\nimport { PERP_MANAGER_ABI } from \"../abis/perp-manager\";\nimport type { PerpCityContext } from \"../context\";\nimport type {\n ClosePositionParams,\n ClosePositionResult,\n LiveDetails,\n OpenPositionData,\n PositionRawData,\n QuoteClosePositionResult,\n} from \"../types/entity-data\";\nimport { scale6Decimals, uint256ToInt256 } from \"../utils\";\nimport { withErrorHandling } from \"../utils/errors\";\n\n// Pure functions that operate on OpenPositionData\nexport function getPositionPerpId(positionData: OpenPositionData): Hex {\n return positionData.perpId;\n}\n\nexport function getPositionId(positionData: OpenPositionData): bigint {\n return positionData.positionId;\n}\n\nexport function getPositionIsLong(positionData: OpenPositionData): boolean | undefined {\n return positionData.isLong;\n}\n\nexport function getPositionIsMaker(positionData: OpenPositionData): boolean | undefined {\n return positionData.isMaker;\n}\n\nexport function getPositionLiveDetails(positionData: OpenPositionData): LiveDetails {\n return positionData.liveDetails;\n}\n\nexport function getPositionPnl(positionData: OpenPositionData): number {\n return positionData.liveDetails.pnl;\n}\n\nexport function getPositionFundingPayment(positionData: OpenPositionData): number {\n return positionData.liveDetails.fundingPayment;\n}\n\nexport function getPositionEffectiveMargin(positionData: OpenPositionData): number {\n return positionData.liveDetails.effectiveMargin;\n}\n\nexport function getPositionIsLiquidatable(positionData: OpenPositionData): boolean {\n return positionData.liveDetails.isLiquidatable;\n}\n\nexport async function quoteClosePosition(\n context: PerpCityContext,\n positionId: bigint\n): Promise<QuoteClosePositionResult> {\n return withErrorHandling(async () => {\n const result = await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n });\n\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] =\n result as unknown as readonly [Hex, bigint, bigint, bigint, boolean];\n\n if (unexpectedReason && unexpectedReason !== \"0x\") {\n let errorName = \"Quote simulation failed\";\n try {\n const decoded = decodeErrorResult({\n abi: PERP_MANAGER_ABI,\n data: unexpectedReason,\n });\n errorName = decoded.errorName;\n } catch {\n // Could not decode, use generic name\n }\n throw new Error(errorName);\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n // Negate so positive = user receives funding, matching live details convention\n funding: -Number(formatUnits(funding, 6)),\n netMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n wasLiquidated,\n };\n }, `quoteClosePosition for position ${positionId}`);\n}\n\nexport async function closePositionWithQuote(\n context: PerpCityContext,\n _perpId: Hex,\n positionId: bigint,\n /** Slippage as a fraction, e.g. 0.01 = 1%. Compare with calculateClosePositionParams which uses percentage form (1 = 1%). */\n slippageTolerance: number = 0.01\n): Promise<ClosePositionResult> {\n return withErrorHandling(async () => {\n // Read position to determine if it's a maker position\n const rawData = await context.getPositionRawData(positionId);\n const isMaker = rawData.makerDetails !== null;\n\n const result = await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n });\n\n const [unexpectedReason, quotePnl] = result as unknown as readonly [\n Hex,\n bigint,\n bigint,\n bigint,\n boolean,\n ];\n\n if (unexpectedReason && unexpectedReason !== \"0x\") {\n throw new Error(\"Quote failed — position may be invalid or already closed\");\n }\n\n let contractParams = {\n posId: positionId,\n minAmt0Out: 0n,\n minAmt1Out: 0n,\n maxAmt1In: 0n,\n };\n\n const canonicalPerpId = rawData.perpId;\n\n if (!isMaker) {\n const isLong = rawData.entryPerpDelta > 0n;\n const slippageBps = BigInt(Math.ceil(slippageTolerance * 10000));\n\n // Derive the actual swap cost/revenue from the quote simulation.\n // The quote already accounts for AMM price impact, so slippage\n // only needs to cover price movement between quote and execution.\n const absEntryUsd =\n rawData.entryUsdDelta < 0n ? -rawData.entryUsdDelta : rawData.entryUsdDelta;\n\n if (isLong) {\n // Long close: sell perps for USD. Revenue = pnl + entryNotional.\n // entryUsdDelta < 0 for longs (paid USDC), so absEntryUsd = |entryUsdDelta|.\n const swapRevenue = quotePnl + absEntryUsd;\n const minOut = swapRevenue > 0n ? swapRevenue - (swapRevenue * slippageBps) / 10000n : 0n;\n contractParams = {\n posId: positionId,\n minAmt0Out: 0n,\n minAmt1Out: minOut,\n maxAmt1In: 0n,\n };\n } else {\n // Short close: buy back perps with USD. Cost = entryNotional - pnl.\n // entryUsdDelta > 0 for shorts (received USDC), so absEntryUsd = entryUsdDelta.\n const swapCost = absEntryUsd - quotePnl;\n const maxIn = swapCost > 0n ? swapCost + (swapCost * slippageBps) / 10000n : 0n;\n contractParams = {\n posId: positionId,\n minAmt0Out: 0n,\n minAmt1Out: 0n,\n maxAmt1In: maxIn,\n };\n }\n }\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"closePosition\",\n args: [contractParams],\n account: context.walletClient.account,\n gas: 500000n,\n });\n\n const txHash = await context.walletClient.writeContract(request);\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n let newPositionId: bigint | null = null;\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionOpened\",\n });\n const eventPerpId = (decoded.args.perpId as string).toLowerCase();\n const eventPosId = decoded.args.posId as bigint;\n if (eventPerpId === canonicalPerpId.toLowerCase() && eventPosId !== positionId) {\n newPositionId = eventPosId;\n break;\n }\n } catch (_e) {}\n }\n\n if (!newPositionId) {\n return { position: null, txHash };\n }\n\n return {\n position: {\n perpId: canonicalPerpId,\n positionId: newPositionId,\n liveDetails: await getPositionLiveDetailsFromContract(\n context,\n canonicalPerpId,\n newPositionId\n ),\n },\n txHash,\n };\n }, `closePositionWithQuote for position ${positionId}`);\n}\n\n// Functions that require context for operations\nexport async function closePosition(\n context: PerpCityContext,\n perpId: Hex,\n positionId: bigint,\n params: ClosePositionParams\n): Promise<ClosePositionResult> {\n return withErrorHandling(async () => {\n const contractParams = {\n posId: positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { request } = await context.publicClient.simulateContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"closePosition\",\n args: [contractParams],\n account: context.walletClient.account,\n gas: 500000n, // Provide explicit gas limit to avoid estimation issues\n });\n\n const txHash = await context.walletClient.writeContract(request);\n\n // Wait for transaction confirmation\n const receipt = await context.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Check if transaction was successful\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted. Hash: ${txHash}`);\n }\n\n // Extract actual positionId from transaction receipt logs\n // For partial closes, a PositionOpened event is emitted with the new position ID\n // For full closes, no PositionOpened event will be present\n let newPositionId: bigint | null = null;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: PERP_MANAGER_ABI,\n data: log.data,\n topics: log.topics,\n eventName: \"PositionOpened\",\n });\n\n // Match the perpId (case-insensitive) and extract the new position ID\n // For partial closes, a NEW position is created with a DIFFERENT posId\n const eventPerpId = (decoded.args.perpId as string).toLowerCase();\n const eventPosId = decoded.args.posId as bigint;\n\n if (eventPerpId === perpId.toLowerCase() && eventPosId !== positionId) {\n newPositionId = eventPosId;\n break;\n }\n } catch (_e) {}\n }\n\n // If no PositionOpened event found with a new posId, this was a full close - return null\n if (!newPositionId) {\n return { position: null, txHash };\n }\n\n // Return the updated position data with actual on-chain position ID\n return {\n position: {\n perpId,\n positionId: newPositionId,\n liveDetails: await getPositionLiveDetailsFromContract(context, perpId, newPositionId),\n },\n txHash,\n };\n }, `closePosition for position ${positionId}`);\n}\n\nexport async function getPositionLiveDetailsFromContract(\n context: PerpCityContext,\n _perpId: Hex,\n positionId: bigint\n): Promise<LiveDetails> {\n return withErrorHandling(async () => {\n // Use quoteClosePosition which provides live position details\n const result = (await context.publicClient.readContract({\n address: context.deployments().perpManager,\n abi: PERP_MANAGER_ABI,\n functionName: \"quoteClosePosition\" as any,\n args: [positionId],\n })) as unknown as readonly [Hex, bigint, bigint, bigint, boolean];\n\n // The result is a tuple: [unexpectedReason, pnl, funding, netMargin, wasLiquidated]\n const [unexpectedReason, pnl, funding, netMargin, wasLiquidated] = result;\n\n if (unexpectedReason !== \"0x\") {\n throw new Error(\n `Failed to quote position ${positionId} - position may be invalid or already closed`\n );\n }\n\n return {\n pnl: Number(formatUnits(pnl, 6)),\n // Negate so positive = user receives funding, matching quoteClosePosition convention\n fundingPayment: -Number(formatUnits(funding, 6)),\n effectiveMargin: Number(formatUnits(uint256ToInt256(netMargin), 6)),\n isLiquidatable: wasLiquidated,\n };\n }, `getPositionLiveDetailsFromContract for position ${positionId}`);\n}\n\n// Pure calculation functions for position metrics\n\n/**\n * Calculate the entry price from raw position data\n * Entry price = abs(entryUsdDelta) / abs(entryPerpDelta)\n * @param rawData - The raw position data from the contract\n * @returns Entry price in USD\n */\nexport function calculateEntryPrice(rawData: PositionRawData): number {\n const perpDelta = rawData.entryPerpDelta;\n const usdDelta = rawData.entryUsdDelta;\n\n // Handle edge case where position size is zero\n if (perpDelta === 0n) {\n return 0;\n }\n\n // Both values are in scaled format (6 decimals each)\n // entryUsdDelta is scaled by 1e6, entryPerpDelta is scaled by 1e6\n // Price = USD / Perp = (usdDelta / 1e6) / (perpDelta / 1e6) = usdDelta / perpDelta\n const absPerpDelta = perpDelta < 0n ? -perpDelta : perpDelta;\n const absUsdDelta = usdDelta < 0n ? -usdDelta : usdDelta;\n\n // Since both are scaled by 1e6, they cancel out\n return Number(absUsdDelta) / Number(absPerpDelta);\n}\n\n/**\n * Calculate the position size (in perp units)\n * @param rawData - The raw position data from the contract\n * @returns Position size (positive for long, negative for short)\n */\nexport function calculatePositionSize(rawData: PositionRawData): number {\n // entryPerpDelta is scaled by 1e6\n return Number(rawData.entryPerpDelta) / 1e6;\n}\n\n/**\n * Calculate the current position value at a given mark price\n * Position value = abs(size) * markPrice\n * @param rawData - The raw position data from the contract\n * @param markPrice - Current mark price\n * @returns Position value in USD (always positive)\n */\nexport function calculatePositionValue(rawData: PositionRawData, markPrice: number): number {\n const size = calculatePositionSize(rawData);\n return Math.abs(size) * markPrice;\n}\n\n/**\n * Calculate the current leverage of a position\n * Leverage = positionValue / effectiveMargin\n * @param positionValue - Current position value in USD\n * @param effectiveMargin - Current effective margin in USD\n * @returns Leverage multiplier\n */\nexport function calculateLeverage(positionValue: number, effectiveMargin: number): number {\n if (effectiveMargin <= 0) {\n return Infinity;\n }\n return positionValue / effectiveMargin;\n}\n\n/**\n * Calculate the liquidation price for a position\n * Liquidation occurs when: effectiveMargin / positionValue <= liqMarginRatio\n * For longs: liqPrice = entryPrice - (margin - liqRatio * entryNotional) / size\n * For shorts: liqPrice = entryPrice + (margin - liqRatio * entryNotional) / size\n *\n * @param rawData - The raw position data from the contract\n * @param isLong - Whether the position is long\n * @returns Liquidation price in USD, or null if cannot be calculated\n */\nexport function calculateLiquidationPrice(\n rawData: PositionRawData,\n isLong: boolean,\n effectiveMargin?: number\n): number | null {\n const entryPrice = calculateEntryPrice(rawData);\n const positionSize = Math.abs(calculatePositionSize(rawData));\n\n const margin = effectiveMargin ?? rawData.margin;\n\n if (positionSize === 0 || margin <= 0) {\n return null;\n }\n\n const liqMarginRatio = rawData.marginRatios.liq / 1e6;\n const entryNotional = positionSize * entryPrice;\n\n if (isLong) {\n const liqPrice = entryPrice - (margin - liqMarginRatio * entryNotional) / positionSize;\n return Math.max(0, liqPrice);\n } else {\n const liqPrice = entryPrice + (margin - liqMarginRatio * entryNotional) / positionSize;\n return liqPrice;\n }\n}\n\nexport function calculatePnlPercentage(pnl: number, funding: number, margin: number): number {\n const totalPnl = pnl + funding;\n const initialMargin = margin - totalPnl;\n if (initialMargin <= 0) return 0;\n return (totalPnl / initialMargin) * 100;\n}\n\n/**\n * Calculates ClosePositionParams for a position close, handling the difference\n * between taker and maker positions.\n *\n * For taker positions, the contract checks minAmt1Out (for longs) or maxAmt1In\n * (for shorts) against the raw USD swap delta — NOT netMargin. The swap amount\n * corresponds to the position's notional value at current price, so slippage\n * limits must be based on `notional`, not `expectedReturn`.\n *\n * For maker positions, the contract checks minAmt0Out and minAmt1Out against\n * the raw token amounts from Uniswap liquidity removal. The split between\n * perp tokens and USDC depends on where the current price sits in the LP range,\n * and quoteClosePosition only returns the aggregate netMargin. Since we cannot\n * predict the individual token amounts, both minimums are set to 0.\n */\nexport function calculateClosePositionParams(opts: {\n isMaker: boolean;\n isLong?: boolean;\n notional: number;\n /** Slippage as a percentage, e.g. 1 = 1%. Compare with closePositionWithQuote which uses fractional form (0.01 = 1%). */\n slippagePercent: number;\n}): ClosePositionParams {\n if (opts.isMaker) {\n return { minAmt0Out: 0, minAmt1Out: 0, maxAmt1In: 0 };\n }\n\n if (typeof opts.isLong !== \"boolean\") {\n throw new Error(\"isLong must be explicitly set for taker positions\");\n }\n\n const absNotional = Math.abs(opts.notional);\n\n if (opts.isLong) {\n // Long close: swap perps → USD. Contract checks minAmt1Out (min USD out).\n return {\n minAmt0Out: 0,\n minAmt1Out: Math.max(0, absNotional * (1 - opts.slippagePercent / 100)),\n maxAmt1In: 0,\n };\n } else {\n // Short close: swap USD → perps. Contract checks maxAmt1In (max USD in).\n return {\n minAmt0Out: 0,\n minAmt1Out: 0,\n maxAmt1In: absNotional * (1 + opts.slippagePercent / 100),\n };\n }\n}\n","import type { Hex } from \"viem\";\nimport type { OpenPositionData, UserData } from \"../types/entity-data\";\n\n// Pure functions that operate on UserData\nexport function getUserUsdcBalance(userData: UserData): number {\n return userData.usdcBalance;\n}\n\nexport function getUserOpenPositions(userData: UserData): OpenPositionData[] {\n return userData.openPositions;\n}\n\nexport function getUserWalletAddress(userData: UserData): Hex {\n return userData.walletAddress;\n}\n"],"mappings":"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AQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ,CAAC;AA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","names":["import_viem","import_viem","ErrorCategory","ErrorSource","Q96","TTLCache","import_viem","import_viem","import_viem"]}
|