@ubi.fun/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +279 -0
  3. package/dist/abi/AddressFeeSplitManager.d.cts +938 -0
  4. package/dist/abi/AddressFeeSplitManager.d.ts +939 -0
  5. package/dist/abi/AddressFeeSplitManager.d.ts.map +1 -0
  6. package/dist/abi/BidWall.d.cts +739 -0
  7. package/dist/abi/BidWall.d.ts +740 -0
  8. package/dist/abi/BidWall.d.ts.map +1 -0
  9. package/dist/abi/FairLaunch.d.cts +535 -0
  10. package/dist/abi/FairLaunch.d.ts +536 -0
  11. package/dist/abi/FairLaunch.d.ts.map +1 -0
  12. package/dist/abi/FeeEscrow.d.cts +281 -0
  13. package/dist/abi/FeeEscrow.d.ts +282 -0
  14. package/dist/abi/FeeEscrow.d.ts.map +1 -0
  15. package/dist/abi/Flaunch.d.cts +775 -0
  16. package/dist/abi/Flaunch.d.ts +776 -0
  17. package/dist/abi/Flaunch.d.ts.map +1 -0
  18. package/dist/abi/FlaunchPositionManager.d.cts +2170 -0
  19. package/dist/abi/FlaunchPositionManager.d.ts +2171 -0
  20. package/dist/abi/FlaunchPositionManager.d.ts.map +1 -0
  21. package/dist/abi/FlaunchZap.d.cts +300 -0
  22. package/dist/abi/FlaunchZap.d.ts +301 -0
  23. package/dist/abi/FlaunchZap.d.ts.map +1 -0
  24. package/dist/abi/InitialPrice.d.cts +252 -0
  25. package/dist/abi/InitialPrice.d.ts +253 -0
  26. package/dist/abi/InitialPrice.d.ts.map +1 -0
  27. package/dist/abi/Memecoin.d.cts +680 -0
  28. package/dist/abi/Memecoin.d.ts +681 -0
  29. package/dist/abi/Memecoin.d.ts.map +1 -0
  30. package/dist/abi/Multicall.d.cts +332 -0
  31. package/dist/abi/Multicall.d.ts +333 -0
  32. package/dist/abi/Multicall.d.ts.map +1 -0
  33. package/dist/abi/PoolManager.d.cts +1056 -0
  34. package/dist/abi/PoolManager.d.ts +1057 -0
  35. package/dist/abi/PoolManager.d.ts.map +1 -0
  36. package/dist/abi/PoolSwap.d.cts +89 -0
  37. package/dist/abi/PoolSwap.d.ts +90 -0
  38. package/dist/abi/PoolSwap.d.ts.map +1 -0
  39. package/dist/abi/Quoter.d.cts +485 -0
  40. package/dist/abi/Quoter.d.ts +486 -0
  41. package/dist/abi/Quoter.d.ts.map +1 -0
  42. package/dist/abi/ReferralEscrow.d.cts +459 -0
  43. package/dist/abi/ReferralEscrow.d.ts +460 -0
  44. package/dist/abi/ReferralEscrow.d.ts.map +1 -0
  45. package/dist/abi/TreasuryManager.d.cts +325 -0
  46. package/dist/abi/TreasuryManager.d.ts +326 -0
  47. package/dist/abi/TreasuryManager.d.ts.map +1 -0
  48. package/dist/abi/TreasuryManagerFactory.d.cts +433 -0
  49. package/dist/abi/TreasuryManagerFactory.d.ts +434 -0
  50. package/dist/abi/TreasuryManagerFactory.d.ts.map +1 -0
  51. package/dist/abi/UniversalRewardsDistributor.d.cts +191 -0
  52. package/dist/abi/UniversalRewardsDistributor.d.ts +192 -0
  53. package/dist/abi/UniversalRewardsDistributor.d.ts.map +1 -0
  54. package/dist/abi/XHandleClaims.d.cts +383 -0
  55. package/dist/abi/XHandleClaims.d.ts +384 -0
  56. package/dist/abi/XHandleClaims.d.ts.map +1 -0
  57. package/dist/abi/index.cjs +13541 -0
  58. package/dist/abi/index.cjs.map +1 -0
  59. package/dist/abi/index.d.cts +18 -0
  60. package/dist/abi/index.d.ts +19 -0
  61. package/dist/abi/index.d.ts.map +1 -0
  62. package/dist/abi/index.js +13522 -0
  63. package/dist/abi/index.js.map +1 -0
  64. package/dist/addresses/index.cjs +90 -0
  65. package/dist/addresses/index.cjs.map +1 -0
  66. package/dist/addresses/index.js +70 -0
  67. package/dist/addresses/index.js.map +1 -0
  68. package/dist/addresses.d.cts +48 -0
  69. package/dist/addresses.d.ts +49 -0
  70. package/dist/addresses.d.ts.map +1 -0
  71. package/dist/clients/BidWallClient.d.cts +44 -0
  72. package/dist/clients/BidWallClient.d.ts +45 -0
  73. package/dist/clients/BidWallClient.d.ts.map +1 -0
  74. package/dist/clients/FairLaunchClient.d.cts +47 -0
  75. package/dist/clients/FairLaunchClient.d.ts +48 -0
  76. package/dist/clients/FairLaunchClient.d.ts.map +1 -0
  77. package/dist/clients/FeeEscrowClient.d.cts +40 -0
  78. package/dist/clients/FeeEscrowClient.d.ts +41 -0
  79. package/dist/clients/FeeEscrowClient.d.ts.map +1 -0
  80. package/dist/clients/FlaunchClient.d.cts +35 -0
  81. package/dist/clients/FlaunchClient.d.ts +36 -0
  82. package/dist/clients/FlaunchClient.d.ts.map +1 -0
  83. package/dist/clients/FlaunchPositionManagerClient.d.cts +117 -0
  84. package/dist/clients/FlaunchPositionManagerClient.d.ts +118 -0
  85. package/dist/clients/FlaunchPositionManagerClient.d.ts.map +1 -0
  86. package/dist/clients/FlaunchZapClient.d.cts +127 -0
  87. package/dist/clients/FlaunchZapClient.d.ts +128 -0
  88. package/dist/clients/FlaunchZapClient.d.ts.map +1 -0
  89. package/dist/clients/InitialPriceClient.d.cts +32 -0
  90. package/dist/clients/InitialPriceClient.d.ts +33 -0
  91. package/dist/clients/InitialPriceClient.d.ts.map +1 -0
  92. package/dist/clients/MemecoinClient.d.cts +66 -0
  93. package/dist/clients/MemecoinClient.d.ts +67 -0
  94. package/dist/clients/MemecoinClient.d.ts.map +1 -0
  95. package/dist/clients/MulticallClient.d.cts +15 -0
  96. package/dist/clients/MulticallClient.d.ts +16 -0
  97. package/dist/clients/MulticallClient.d.ts.map +1 -0
  98. package/dist/clients/PoolManagerClient.d.cts +50 -0
  99. package/dist/clients/PoolManagerClient.d.ts +51 -0
  100. package/dist/clients/PoolManagerClient.d.ts.map +1 -0
  101. package/dist/clients/PoolSwapClient.d.cts +37 -0
  102. package/dist/clients/PoolSwapClient.d.ts +38 -0
  103. package/dist/clients/PoolSwapClient.d.ts.map +1 -0
  104. package/dist/clients/QuoterClient.d.cts +58 -0
  105. package/dist/clients/QuoterClient.d.ts +59 -0
  106. package/dist/clients/QuoterClient.d.ts.map +1 -0
  107. package/dist/clients/ReferralEscrowClient.d.cts +39 -0
  108. package/dist/clients/ReferralEscrowClient.d.ts +40 -0
  109. package/dist/clients/ReferralEscrowClient.d.ts.map +1 -0
  110. package/dist/clients/TreasuryManagerClient.d.cts +71 -0
  111. package/dist/clients/TreasuryManagerClient.d.ts +72 -0
  112. package/dist/clients/TreasuryManagerClient.d.ts.map +1 -0
  113. package/dist/clients/TreasuryManagerFactoryClient.d.cts +15 -0
  114. package/dist/clients/TreasuryManagerFactoryClient.d.ts +16 -0
  115. package/dist/clients/TreasuryManagerFactoryClient.d.ts.map +1 -0
  116. package/dist/clients/UniversalRewardsDistributorClient.d.cts +45 -0
  117. package/dist/clients/UniversalRewardsDistributorClient.d.ts +46 -0
  118. package/dist/clients/UniversalRewardsDistributorClient.d.ts.map +1 -0
  119. package/dist/clients/XHandleClaimsClient.d.cts +64 -0
  120. package/dist/clients/XHandleClaimsClient.d.ts +65 -0
  121. package/dist/clients/XHandleClaimsClient.d.ts.map +1 -0
  122. package/dist/helpers/chainIdToChain.d.cts +113 -0
  123. package/dist/helpers/chainIdToChain.d.ts +114 -0
  124. package/dist/helpers/chainIdToChain.d.ts.map +1 -0
  125. package/dist/helpers/hex.d.cts +3 -0
  126. package/dist/helpers/hex.d.ts +4 -0
  127. package/dist/helpers/hex.d.ts.map +1 -0
  128. package/dist/helpers/index.cjs +196 -0
  129. package/dist/helpers/index.cjs.map +1 -0
  130. package/dist/helpers/index.d.cts +3 -0
  131. package/dist/helpers/index.d.ts +4 -0
  132. package/dist/helpers/index.d.ts.map +1 -0
  133. package/dist/helpers/index.js +184 -0
  134. package/dist/helpers/index.js.map +1 -0
  135. package/dist/helpers/ipfs.d.cts +56 -0
  136. package/dist/helpers/ipfs.d.ts +57 -0
  137. package/dist/helpers/ipfs.d.ts.map +1 -0
  138. package/dist/hooks/FlaunchPositionManagerHooks.d.cts +28 -0
  139. package/dist/hooks/FlaunchPositionManagerHooks.d.ts +29 -0
  140. package/dist/hooks/FlaunchPositionManagerHooks.d.ts.map +1 -0
  141. package/dist/hooks/index.cjs +73 -0
  142. package/dist/hooks/index.cjs.map +1 -0
  143. package/dist/hooks/index.d.cts +1 -0
  144. package/dist/hooks/index.d.ts +2 -0
  145. package/dist/hooks/index.d.ts.map +1 -0
  146. package/dist/hooks/index.js +70 -0
  147. package/dist/hooks/index.js.map +1 -0
  148. package/dist/index.cjs +16808 -0
  149. package/dist/index.cjs.map +1 -0
  150. package/dist/index.d.cts +31 -0
  151. package/dist/index.d.ts +32 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +16718 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/index.umd.cjs +2 -0
  156. package/dist/index.umd.cjs.map +1 -0
  157. package/dist/sdk/FlaunchSDK.d.cts +520 -0
  158. package/dist/sdk/FlaunchSDK.d.ts +521 -0
  159. package/dist/sdk/FlaunchSDK.d.ts.map +1 -0
  160. package/dist/sdk/calldata.d.cts +65 -0
  161. package/dist/sdk/calldata.d.ts +66 -0
  162. package/dist/sdk/calldata.d.ts.map +1 -0
  163. package/dist/sdk/drift.d.cts +20 -0
  164. package/dist/sdk/drift.d.ts +21 -0
  165. package/dist/sdk/drift.d.ts.map +1 -0
  166. package/dist/sdk/factory.d.cts +20 -0
  167. package/dist/sdk/factory.d.ts +21 -0
  168. package/dist/sdk/factory.d.ts.map +1 -0
  169. package/dist/types.d.cts +56 -0
  170. package/dist/types.d.ts +57 -0
  171. package/dist/types.d.ts.map +1 -0
  172. package/dist/utils/index.cjs +455 -0
  173. package/dist/utils/index.cjs.map +1 -0
  174. package/dist/utils/index.d.cts +4 -0
  175. package/dist/utils/index.d.ts +5 -0
  176. package/dist/utils/index.d.ts.map +1 -0
  177. package/dist/utils/index.js +431 -0
  178. package/dist/utils/index.js.map +1 -0
  179. package/dist/utils/parseSwap.d.cts +45 -0
  180. package/dist/utils/parseSwap.d.ts +46 -0
  181. package/dist/utils/parseSwap.d.ts.map +1 -0
  182. package/dist/utils/slippage.d.cts +11 -0
  183. package/dist/utils/slippage.d.ts +12 -0
  184. package/dist/utils/slippage.d.ts.map +1 -0
  185. package/dist/utils/swap.d.cts +49 -0
  186. package/dist/utils/swap.d.ts +50 -0
  187. package/dist/utils/swap.d.ts.map +1 -0
  188. package/dist/utils/univ4.d.cts +78 -0
  189. package/dist/utils/univ4.d.ts +79 -0
  190. package/dist/utils/univ4.d.ts.map +1 -0
  191. package/package.json +161 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/utils/univ4.ts","../../src/utils/parseSwap.ts","../../src/utils/slippage.ts","../../src/addresses.ts","../../src/utils/swap.ts"],"sourcesContent":["import { concat, keccak256, pad, toHex } from \"viem\";\nimport { PoolKey } from \"../types\";\n\n// our min/max tick range that is valid for the tick spacing (60)\nexport const TickFinder = {\n MIN_TICK: -887220,\n MAX_TICK: 887220,\n};\n\nexport const Q96 = 2n ** 96n;\nexport const Q192 = 2n ** 192n;\n\nexport const TICK_SPACING = 60;\n\nexport const getPoolId = (poolKey: PoolKey) => {\n // Pack the data in the same order as Solidity struct\n const packed = concat([\n pad(poolKey.currency0, { size: 32 }), // address padded to 32 bytes\n pad(poolKey.currency1, { size: 32 }), // address padded to 32 bytes\n pad(toHex(poolKey.fee), { size: 32 }), // uint24 padded to 32 bytes\n pad(toHex(poolKey.tickSpacing), { size: 32 }), // int24 padded to 32 bytes\n pad(poolKey.hooks, { size: 32 }), // address padded to 32 bytes\n ]);\n\n return keccak256(packed);\n};\n\nexport const orderPoolKey = (poolKey: PoolKey) => {\n // Compare lowercased so checksummed input cannot flip the v4 numeric ordering\n const [currency0, currency1] =\n poolKey.currency0.toLowerCase() < poolKey.currency1.toLowerCase()\n ? [poolKey.currency0, poolKey.currency1]\n : [poolKey.currency1, poolKey.currency0];\n\n return {\n ...poolKey,\n currency0,\n currency1,\n };\n};\n\nexport const getValidTick = ({\n tick,\n tickSpacing,\n roundDown = true,\n}: {\n tick: number;\n tickSpacing: number;\n roundDown?: boolean;\n}) => {\n // If the tick is already valid, exit early\n if (tick % tickSpacing === 0) {\n return tick;\n }\n\n // Division that rounds towards zero (like Solidity)\n let validTick = Math.trunc(tick / tickSpacing) * tickSpacing;\n\n // Handle negative ticks (Solidity behavior)\n if (tick < 0 && tick % tickSpacing !== 0) {\n validTick -= tickSpacing;\n }\n\n // If not rounding down, add TICK_SPACING to get the upper tick\n if (!roundDown) {\n validTick += tickSpacing;\n }\n\n return validTick;\n};\n\n// Rounds up or down to the nearest tick\nexport const getNearestUsableTick = ({\n tick,\n tickSpacing,\n}: {\n tick: number;\n tickSpacing: number;\n}): number => {\n const rounded = Math.round(tick / tickSpacing) * tickSpacing;\n return Math.max(TickFinder.MIN_TICK, Math.min(TickFinder.MAX_TICK, rounded));\n};\n\nconst getAmount0ForLiquidity = (\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint\n) => {\n let [sqrtRatioA, sqrtRatioB] = [sqrtRatioAX96, sqrtRatioBX96];\n\n if (sqrtRatioA > sqrtRatioB) {\n [sqrtRatioA, sqrtRatioB] = [sqrtRatioB, sqrtRatioA];\n }\n\n const leftShiftedLiquidity = liquidity << 96n;\n const sqrtDiff = sqrtRatioB - sqrtRatioA;\n const multipliedRes = leftShiftedLiquidity * sqrtDiff;\n const numerator = multipliedRes / sqrtRatioB;\n const amount0 = numerator / sqrtRatioA;\n\n return amount0;\n};\n\nconst getAmount1ForLiquidity = (\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint\n) => {\n let [sqrtRatioA, sqrtRatioB] = [sqrtRatioAX96, sqrtRatioBX96];\n\n if (sqrtRatioA > sqrtRatioB) {\n [sqrtRatioA, sqrtRatioB] = [sqrtRatioB, sqrtRatioA];\n }\n\n const sqrtDiff = sqrtRatioB - sqrtRatioA;\n const multipliedRes = liquidity * sqrtDiff;\n\n const amount1 = multipliedRes / 2n ** 96n;\n\n return amount1;\n};\n\nexport const getSqrtPriceX96FromTick = (tick: number): bigint => {\n const absTick = tick < 0 ? BigInt(-tick) : BigInt(tick);\n if (absTick > TickFinder.MAX_TICK) {\n throw new Error(\"Tick out of range\");\n }\n\n let ratio =\n (absTick & 1n) !== 0n\n ? 0xfffcb933bd6fad37aa2d162d1a594001n\n : 0x100000000000000000000000000000000n;\n\n if ((absTick & 2n) !== 0n)\n ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;\n if ((absTick & 4n) !== 0n)\n ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;\n if ((absTick & 8n) !== 0n)\n ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;\n if ((absTick & 16n) !== 0n)\n ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;\n if ((absTick & 32n) !== 0n)\n ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;\n if ((absTick & 64n) !== 0n)\n ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;\n if ((absTick & 128n) !== 0n)\n ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;\n if ((absTick & 256n) !== 0n)\n ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;\n if ((absTick & 512n) !== 0n)\n ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;\n if ((absTick & 1024n) !== 0n)\n ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;\n if ((absTick & 2048n) !== 0n)\n ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;\n if ((absTick & 4096n) !== 0n)\n ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;\n if ((absTick & 8192n) !== 0n)\n ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;\n if ((absTick & 16384n) !== 0n)\n ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;\n if ((absTick & 32768n) !== 0n)\n ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;\n if ((absTick & 65536n) !== 0n)\n ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;\n if ((absTick & 131072n) !== 0n)\n ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;\n if ((absTick & 262144n) !== 0n)\n ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;\n if ((absTick & 524288n) !== 0n)\n ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;\n\n if (tick > 0) {\n ratio = (2n ** 256n - 1n) / ratio;\n }\n\n // Convert from Q128.128 to Q128.96\n const resultShifted = ratio >> 32n;\n if (ratio % (1n << 32n) === 0n) {\n return resultShifted;\n }\n return resultShifted + 1n;\n};\n\nexport const calculateUnderlyingTokenBalances = (\n liquidity: bigint,\n tickLower: number,\n tickUpper: number,\n tickCurrent: number\n): { amount0: bigint; amount1: bigint } => {\n const sqrtPriceCurrentX96 = getSqrtPriceX96FromTick(tickCurrent);\n const sqrtPriceLowerX96 = getSqrtPriceX96FromTick(tickLower);\n const sqrtPriceUpperX96 = getSqrtPriceX96FromTick(tickUpper);\n\n let amount0 = 0n;\n let amount1 = 0n;\n\n if (sqrtPriceCurrentX96 <= sqrtPriceLowerX96) {\n // Current price is below the position range\n amount0 = getAmount0ForLiquidity(\n sqrtPriceLowerX96,\n sqrtPriceUpperX96,\n liquidity\n );\n } else if (sqrtPriceCurrentX96 < sqrtPriceUpperX96) {\n // Current price is within the position range\n amount0 = getAmount0ForLiquidity(\n sqrtPriceCurrentX96,\n sqrtPriceUpperX96,\n liquidity\n );\n amount1 = getAmount1ForLiquidity(\n sqrtPriceLowerX96,\n sqrtPriceCurrentX96,\n liquidity\n );\n } else {\n // Current price is above the position range\n amount1 = getAmount1ForLiquidity(\n sqrtPriceLowerX96,\n sqrtPriceUpperX96,\n liquidity\n );\n }\n\n return { amount0, amount1 };\n};\n\n// Helper function to convert price ratio to tick with decimal handling\nexport const priceRatioToTick = ({\n priceInput,\n isDirection1Per0,\n decimals0,\n decimals1,\n spacing,\n shouldGetNearestUsableTick = true,\n}: {\n priceInput: string;\n isDirection1Per0: boolean;\n decimals0: number;\n decimals1: number;\n spacing: number;\n shouldGetNearestUsableTick?: boolean;\n}): number => {\n if (!priceInput || isNaN(Number(priceInput))) return 0;\n\n const inputPrice = Number(priceInput);\n\n try {\n // For Uniswap v3/v4, the tick represents price as: price = 1.0001^tick\n // where price = amount1/amount0 in their raw decimal format\n\n let priceRatio: number;\n\n if (isDirection1Per0) {\n // Input is token1 per token0 (e.g., memecoin per USDC)\n // Convert from human-readable to raw: divide by (10^decimals0 / 10^decimals1)\n priceRatio = inputPrice / Math.pow(10, decimals0 - decimals1);\n } else {\n // Input is token0 per token1 (e.g., USDC per memecoin)\n // Invert to get token1 per token0, then convert to raw\n priceRatio = 1 / inputPrice / Math.pow(10, decimals0 - decimals1);\n }\n\n // Calculate tick: tick = log(price) / log(1.0001)\n const tick = Math.log(priceRatio) / Math.log(1.0001);\n\n if (shouldGetNearestUsableTick) {\n return getValidTick({\n tick: Math.round(tick),\n tickSpacing: spacing,\n });\n } else {\n return Math.round(tick);\n }\n } catch (error) {\n console.error(\"Error converting price to tick:\", error);\n // Fallback to basic calculation\n const rawTick = Math.floor(Math.log(inputPrice) / Math.log(1.0001));\n if (shouldGetNearestUsableTick) {\n return getValidTick({\n tick: rawTick,\n tickSpacing: spacing,\n });\n } else {\n return rawTick;\n }\n }\n};\n\n/**\n * Accurate liquidity calculation using proper Uniswap v3/v4 math\n */\nexport const getLiquidityFromAmounts = (params: {\n currentTick: number;\n tickLower: number;\n tickUpper: number;\n amount0: bigint;\n amount1: bigint;\n}) => {\n const sqrtRatioCurrentX96 = getSqrtPriceX96FromTick(params.currentTick);\n let sqrtRatioAX96 = getSqrtPriceX96FromTick(params.tickLower);\n let sqrtRatioBX96 = getSqrtPriceX96FromTick(params.tickUpper);\n\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n if (sqrtRatioCurrentX96 <= sqrtRatioAX96) {\n return maxLiquidityForAmount0Precise(\n sqrtRatioAX96,\n sqrtRatioBX96,\n params.amount0\n );\n } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) {\n const liquidity0 = maxLiquidityForAmount0Precise(\n sqrtRatioCurrentX96,\n sqrtRatioBX96,\n params.amount0\n );\n const liquidity1 = maxLiquidityForAmount1(\n sqrtRatioAX96,\n sqrtRatioCurrentX96,\n params.amount1\n );\n return liquidity0 < liquidity1 ? liquidity0 : liquidity1;\n } else {\n return maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, params.amount1);\n }\n};\n\n/**\n * Returns a precise maximum amount of liquidity received for a given amount of token 0 by dividing by Q64 instead of Q96 in the intermediate step,\n * and shifting the subtracted ratio left by 32 bits.\n * @param sqrtRatioAX96 The price at the lower boundary\n * @param sqrtRatioBX96 The price at the upper boundary\n * @param amount0 The token0 amount\n * @returns liquidity for amount0, precise\n */\nexport function maxLiquidityForAmount0Precise(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n amount0: bigint\n): bigint {\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n // Handle edge case where sqrt ratios are equal (division by zero)\n if (sqrtRatioAX96 === sqrtRatioBX96) {\n return 0n;\n }\n\n const Q96 = 2n ** 96n;\n const numerator = amount0 * sqrtRatioAX96 * sqrtRatioBX96;\n const denominator = Q96 * (sqrtRatioBX96 - sqrtRatioAX96);\n\n return numerator / denominator;\n}\n\n/**\n * Computes the maximum amount of liquidity received for a given amount of token1\n * @param sqrtRatioAX96 The price at the lower tick boundary\n * @param sqrtRatioBX96 The price at the upper tick boundary\n * @param amount1 The token1 amount\n * @returns liquidity for amount1\n */\nexport function maxLiquidityForAmount1(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n amount1: bigint\n): bigint {\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n // Handle edge case where sqrt ratios are equal (division by zero)\n if (sqrtRatioAX96 === sqrtRatioBX96) {\n return 0n;\n }\n\n const Q96 = 2n ** 96n;\n return (amount1 * Q96) / (sqrtRatioBX96 - sqrtRatioAX96);\n}\n\n/**\n * Calculate the actual amounts needed for a given liquidity\n * This prevents MaximumAmountExceeded errors by ensuring we provide sufficient maximums\n */\nexport const getAmountsForLiquidity = (params: {\n currentTick: number;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n}): { amount0: bigint; amount1: bigint } => {\n // Handle zero liquidity case\n if (params.liquidity === 0n) {\n return { amount0: 0n, amount1: 0n };\n }\n\n const sqrtRatioCurrentX96 = getSqrtPriceX96FromTick(params.currentTick);\n let sqrtRatioAX96 = getSqrtPriceX96FromTick(params.tickLower);\n let sqrtRatioBX96 = getSqrtPriceX96FromTick(params.tickUpper);\n\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n let amount0 = 0n;\n let amount1 = 0n;\n\n if (sqrtRatioCurrentX96 <= sqrtRatioAX96) {\n // Current price is below the range, only token0 needed\n amount0 = getAmount0ForLiquidity(\n sqrtRatioAX96,\n sqrtRatioBX96,\n params.liquidity\n );\n } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) {\n // Current price is within the range, need both tokens\n amount0 = getAmount0ForLiquidity(\n sqrtRatioCurrentX96,\n sqrtRatioBX96,\n params.liquidity\n );\n amount1 = getAmount1ForLiquidity(\n sqrtRatioAX96,\n sqrtRatioCurrentX96,\n params.liquidity\n );\n } else {\n // Current price is above the range, only token1 needed\n amount1 = getAmount1ForLiquidity(\n sqrtRatioAX96,\n sqrtRatioBX96,\n params.liquidity\n );\n }\n\n return { amount0, amount1 };\n};\n","export interface SwapLogArgs {\n flAmount0: bigint;\n flAmount1: bigint;\n flFee0: bigint;\n flFee1: bigint;\n ispAmount0: bigint;\n ispAmount1: bigint;\n ispFee0: bigint;\n ispFee1: bigint;\n uniAmount0: bigint;\n uniAmount1: bigint;\n uniFee0: bigint;\n uniFee1: bigint;\n}\n\nexport interface SwapFees {\n /** True when the fee was taken on the USDC side, false when in the coin. */\n isInUSDC: boolean;\n amount: bigint;\n}\n\nexport interface BuySwapData {\n type: \"BUY\";\n delta: {\n coinsBought: bigint;\n usdcSold: bigint;\n fees: SwapFees;\n };\n}\n\nexport interface SellSwapData {\n type: \"SELL\";\n delta: {\n coinsSold: bigint;\n usdcBought: bigint;\n fees: SwapFees;\n };\n}\n\nexport type ParsedSwapData = BuySwapData | SellSwapData;\n\n/**\n * Parses raw PoolSwap log arguments into structured swap data. The three\n * amount-pair legs (fl = fair launch fill, isp = internal swap pool, uni =\n * Uniswap pool) show how a fill was sourced; this nets them into one delta.\n * @param args - The swap log arguments\n * @param usdcIsCurrencyZero - Whether USDC is currency0 in the pool\n * @returns Parsed swap data with type and delta information\n */\nexport function parseSwapData(\n args: SwapLogArgs,\n usdcIsCurrencyZero: boolean\n): ParsedSwapData {\n const {\n flAmount0,\n flAmount1,\n flFee0,\n flFee1,\n ispAmount0,\n ispAmount1,\n ispFee0,\n ispFee1,\n uniAmount0,\n uniAmount1,\n uniFee0,\n uniFee1,\n } = args;\n\n const currency0Delta = flAmount0 + ispAmount0 + uniAmount0;\n const currency1Delta = flAmount1 + ispAmount1 + uniAmount1;\n const currency0Fees = flFee0 + ispFee0 + uniFee0;\n const currency1Fees = flFee1 + ispFee1 + uniFee1;\n\n let feesIsInUSDC: boolean;\n let swapType: \"BUY\" | \"SELL\";\n\n if (usdcIsCurrencyZero) {\n swapType = currency0Delta < 0 ? \"BUY\" : \"SELL\";\n feesIsInUSDC = currency0Fees < 0;\n } else {\n swapType = currency1Delta < 0 ? \"BUY\" : \"SELL\";\n feesIsInUSDC = currency1Fees < 0;\n }\n\n const absCurrency0Delta =\n currency0Delta < 0 ? -currency0Delta : currency0Delta;\n const absCurrency1Delta =\n currency1Delta < 0 ? -currency1Delta : currency1Delta;\n const absCurrency0Fees = currency0Fees < 0 ? -currency0Fees : currency0Fees;\n const absCurrency1Fees = currency1Fees < 0 ? -currency1Fees : currency1Fees;\n\n const fees: SwapFees = {\n isInUSDC: feesIsInUSDC,\n amount: usdcIsCurrencyZero\n ? feesIsInUSDC\n ? absCurrency0Fees\n : absCurrency1Fees\n : feesIsInUSDC\n ? absCurrency1Fees\n : absCurrency0Fees,\n };\n\n if (swapType === \"BUY\") {\n return {\n type: swapType,\n delta: {\n coinsBought: usdcIsCurrencyZero\n ? absCurrency1Delta - (!fees.isInUSDC ? fees.amount : 0n)\n : absCurrency0Delta - (!fees.isInUSDC ? fees.amount : 0n),\n usdcSold: usdcIsCurrencyZero\n ? absCurrency0Delta - (fees.isInUSDC ? fees.amount : 0n)\n : absCurrency1Delta - (fees.isInUSDC ? fees.amount : 0n),\n fees,\n },\n };\n } else {\n return {\n type: swapType,\n delta: {\n coinsSold: usdcIsCurrencyZero\n ? absCurrency1Delta - (!fees.isInUSDC ? fees.amount : 0n)\n : absCurrency0Delta - (!fees.isInUSDC ? fees.amount : 0n),\n usdcBought: usdcIsCurrencyZero\n ? absCurrency0Delta - (fees.isInUSDC ? fees.amount : 0n)\n : absCurrency1Delta - (fees.isInUSDC ? fees.amount : 0n),\n fees,\n },\n };\n }\n}\n","import { parseEther } from \"viem\";\n\n/**\n * Applies a slippage tolerance to an amount.\n *\n * @dev EXACT_OUT adds the slippage, EXACT_IN removes it. `slippage` is a\n * fraction string, e.g. \"0.05\" for 5%.\n */\nexport const getAmountWithSlippage = ({\n amount,\n slippage,\n swapType,\n}: {\n amount: bigint | undefined;\n slippage: string;\n swapType: \"EXACT_IN\" | \"EXACT_OUT\";\n}) => {\n if (amount == null) {\n return 0n;\n }\n\n const absAmount = amount < 0n ? -amount : amount;\n const slippageMultiplier =\n swapType === \"EXACT_IN\"\n ? BigInt(1e18) - parseEther(slippage)\n : BigInt(1e18) + parseEther(slippage);\n\n return (absAmount * slippageMultiplier) / BigInt(1e18);\n};\n","import { Addresses } from \"./types\";\n\n/**\n * ubi.fun deployments on Arc (Circle).\n *\n * Source of truth: deployments/arc-mainnet-5042.json and\n * deployments/arc-testnet-5042002.json in the contracts repo, mirrored by the\n * committed frontend registry. The cash / native asset on Arc is native USDC\n * (6 decimals through its ERC20 interface) at\n * 0x3600000000000000000000000000000000000000: the position manager's\n * \"nativeToken\" slot IS this USDC, and every pool pairs a coin against it.\n * There is no flETH, no WETH wrapping, and no unwrap step on this chain.\n */\nexport const ARC_MAINNET_CHAIN_ID = 5042;\nexport const ARC_TESTNET_CHAIN_ID = 5042002;\n\n/** Arc native USDC (ERC20 interface, 6 decimals). The cash side of every pool. */\nexport const USDC_ADDRESS =\n \"0x3600000000000000000000000000000000000000\" as const;\n\n/**\n * The pool \"native token\": Arc native USDC on both networks. Kept as an\n * Addresses map so client code stays chain-keyed like every other contract.\n */\nexport const NativeTokenAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: USDC_ADDRESS,\n [ARC_TESTNET_CHAIN_ID]: USDC_ADDRESS,\n};\n\nexport const FlaunchZapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe07F7cA66EC795592385018Dd998F0B50b8A2834\",\n [ARC_TESTNET_CHAIN_ID]: \"0x3fd667aaa89519772bb44e984de408bfcd40e285\",\n};\n\n// SDK \"FlaunchPositionManager\" maps to our deployment \"PositionManager\".\nexport const FlaunchPositionManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC780c0f4aAc690908854D351b8bFda2812daeFDc\",\n [ARC_TESTNET_CHAIN_ID]: \"0x88af0b76752ff31aa351cea2cc2e43a1b7c32fdc\",\n};\n\nexport const FlaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x93E5A7565008db9688BA5211Fa552d8b108B9c75\",\n [ARC_TESTNET_CHAIN_ID]: \"0x55a0e1a458f1c13023dbd6b204e2a439c3b44663\",\n};\n\nexport const FairLaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xdCDADa707264d9e2B0E8c2feC467860C97434Bd4\",\n [ARC_TESTNET_CHAIN_ID]: \"0xd2ea5591fe0b5820b6de33afbc3b468d070038ea\",\n};\n\n// SDK \"BidWall\" maps to our deployment \"BurningBidWall\" (a modified BidWall).\nexport const BidWallAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC5DD30802fefab789Cd9b1e835Bd7301a8D23F8A\",\n [ARC_TESTNET_CHAIN_ID]: \"0x04f947e5fc0ac42836f880d45705af7483a2c4c0\",\n};\n\n/** Referrer-aware swap router: the supported way to trade ubi.fun pools. */\nexport const PoolSwapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x3A61B6E86fde5Fc657a48819837F346C7E2Fffa7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x396d41eb4d110d64491d01cd186548fdc82b1b4a\",\n};\n\nexport const TreasuryManagerFactoryAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xE25C132F379DB49C463328eF427E28DBCbD3a2F0\",\n [ARC_TESTNET_CHAIN_ID]: \"0x093c10b780f7cf8fca9aa7dbc83a64cddf55215f\",\n};\n\n// The approved AddressFeeSplitManager IMPLEMENTATION (factory deploys clones).\nexport const AddressFeeSplitManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xde10818344f5ab75ecfA772887cE5751D6Cb91C7\",\n [ARC_TESTNET_CHAIN_ID]: \"0xA7d182B81aF7B40b6d09Da88A12a4f7ad770e162\",\n};\n\n/** Creator revenue escrow: balances accrue here, claimed as USDC (unwrap=false). */\nexport const FeeEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x678f0D1C045e820Ec1d4806749f2629e1035550e\",\n [ARC_TESTNET_CHAIN_ID]: \"0x59b3269aaf9db83bd3029c84d8b5226fa5702f78\",\n};\n\n/** Referrer rewards escrow: 5% of every swap fee routed with your address. */\nexport const ReferralEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf25B9ceAba005CcCb0cefC4e323e6e519F111eB3\",\n [ARC_TESTNET_CHAIN_ID]: \"0x51b6a4759f9c9a681349c857f6fd912cdfeb8fef\",\n};\n\n/** X-handle earnings registry: per-handle CREATE2 escrows + attested claims. */\nexport const XHandleClaimsAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xfC38298590893c39E46D319aEd9EC3bf6CB17A3E\",\n [ARC_TESTNET_CHAIN_ID]: \"0x6fE2b9e1Da493E4584e742C03e1926a4CD8AC2A1\",\n};\n\n/**\n * Morpho UniversalRewardsDistributor paying the daily USDC holder pool\n * (24% of every swap fee). Claims are Merkle-proofed cumulative amounts.\n */\nexport const UniversalRewardsDistributorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x66003091e723778d7D3285BB6c24ff3F0Ddcc7F7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x7a8e9dA46db2be8436c4404476b40F07a31A6d95\",\n};\n\n/** Uniswap v4 PoolManager (canonical deployment on mainnet, ours on testnet). */\nexport const PoolManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x8366a39CC670B4001A1121B8F6A443A643e40951\",\n [ARC_TESTNET_CHAIN_ID]: \"0x5fb24c800133a0930280788c5eb3468764154309\",\n};\n\nexport const QuoterAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x4595D3CD7A6D98d83A719934e829db5076fF1d0d\",\n [ARC_TESTNET_CHAIN_ID]: \"0xf517623f178Ba90e5b3299cb121D38F5A0733ac4\",\n};\n\n/** Base URL of the ubi.fun read/upload API serving each network. */\nexport const ApiBaseUrl: { [chainId: number]: string } = {\n [ARC_MAINNET_CHAIN_ID]: \"https://api.ubi.fun\",\n [ARC_TESTNET_CHAIN_ID]: \"https://api-dev.ubi.fun\",\n};\n","import { encodeAbiParameters, isAddress, zeroAddress, type Address } from \"viem\";\nimport { PoolKey } from \"../types\";\nimport { USDC_ADDRESS } from \"../addresses\";\nimport { orderPoolKey, Q192 } from \"./univ4\";\n\n/**\n * Swap-building helpers shared by the quoter and PoolSwap clients. Pool keys,\n * hook data and direction mirror the ubi.fun app and MCP server exactly; the\n * SDK's price bound additionally anchors on the quoted end price so an\n * exact-input trade's own impact does not eat the slippage budget.\n */\n\n/**\n * Encodes the referrer for the hook: 5% of the swap fee accrues on-chain to\n * this address (claimable from the ReferralEscrow). '0x' means no referrer and\n * the share cascades down the fee split instead. The SAME hookData must be\n * used for the quote and the swap for them to match.\n */\nexport function referrerHookData(\n referrer: Address | undefined\n): `0x${string}` {\n return referrer && isAddress(referrer) && referrer !== zeroAddress\n ? encodeAbiParameters([{ type: \"address\" }], [referrer])\n : \"0x\";\n}\n\n/** Builds the v4 pool key for a coin: USDC on the cash side, hook fixed by the protocol. */\nexport function coinPoolKey(\n coinAddress: Address,\n positionManagerAddress: Address\n): PoolKey {\n return orderPoolKey({\n currency0: USDC_ADDRESS,\n currency1: coinAddress,\n fee: 0,\n tickSpacing: 60,\n hooks: positionManagerAddress,\n });\n}\n\n/** True when USDC sorts as currency0 for this coin's pool. */\nexport function usdcIsCurrencyZero(coinAddress: Address): boolean {\n return coinAddress.toLowerCase() > USDC_ADDRESS.toLowerCase();\n}\n\n/**\n * v4 swap direction. Buys spend USDC for the coin: when USDC is currency0\n * that's a zeroForOne swap, otherwise the reverse.\n */\nexport function swapDirection(\n side: \"buy\" | \"sell\",\n coinAddress: Address\n): boolean {\n return side === \"buy\"\n ? usdcIsCurrencyZero(coinAddress)\n : !usdcIsCurrencyZero(coinAddress);\n}\n\n// Uniswap v4 sqrt price bounds (TickMath.MIN_SQRT_PRICE / MAX_SQRT_PRICE, exclusive).\nconst MIN_SQRT_PRICE = 4_295_128_739n + 1n;\nconst MAX_SQRT_PRICE =\n 1_461_446_703_485_210_103_287_273_052_203_988_822_378_723_970_342n - 1n;\n\nfunction bigintSqrt(value: bigint): bigint {\n if (value < 2n) {\n return value;\n }\n let current = value;\n let next = (current + value / current) / 2n;\n while (next < current) {\n current = next;\n next = (current + value / current) / 2n;\n }\n return current;\n}\n\n/**\n * Expected pool sqrt price after an exact-input fill, derived from the quoted\n * amounts through the constant-liquidity identity amountOut/amountIn =\n * sqrtP_start * sqrtP_end (inverted for oneForZero). Hook fees only skew the\n * estimate toward the permissive side, so a slippage margin applied on top of\n * it never lands tighter than the real fill. Falls back to the spot price when\n * a quote leg is zero or the estimate lands on the wrong side of spot.\n */\nexport function expectedEndSqrtPriceX96({\n current,\n zeroForOne,\n amountIn,\n amountOut,\n}: {\n current: bigint;\n zeroForOne: boolean;\n amountIn: bigint;\n amountOut: bigint;\n}): bigint {\n if (current === 0n || amountIn <= 0n || amountOut <= 0n) {\n return current;\n }\n const end = zeroForOne\n ? (amountOut * Q192) / (amountIn * current)\n : (amountIn * Q192) / (amountOut * current);\n if (zeroForOne) {\n return end < current ? end : current;\n }\n return end > current ? end : current;\n}\n\n/**\n * Slippage bound as a sqrt price limit: the pool price may move at most\n * `slippageBps` beyond `current` (pass the expected end price for exact-input\n * swaps, so the trade's own quoted impact is not counted against the budget)\n * before the swap stops filling.\n */\nexport function sqrtPriceLimit({\n current,\n zeroForOne,\n slippageBps,\n}: {\n current: bigint;\n zeroForOne: boolean;\n slippageBps: number;\n}): bigint {\n if (\n !Number.isInteger(slippageBps) ||\n slippageBps < 0 ||\n slippageBps >= 10_000\n ) {\n throw new Error(\n `slippageBps must be an integer in [0, 10000), got ${slippageBps}`\n );\n }\n const factor = BigInt(\n zeroForOne ? 10_000 - slippageBps : 10_000 + slippageBps\n );\n const multiplier = bigintSqrt((factor * 10n ** 18n) / 10_000n);\n const limit = (current * multiplier) / 10n ** 9n;\n return zeroForOne\n ? limit > MIN_SQRT_PRICE\n ? limit\n : MIN_SQRT_PRICE\n : limit < MAX_SQRT_PRICE\n ? limit\n : MAX_SQRT_PRICE;\n}\n"],"names":["concat","pad","toHex","keccak256","Q96","parseEther","isAddress","zeroAddress","encodeAbiParameters"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./univ4.cjs";
2
+ export * from "./parseSwap.cjs";
3
+ export * from "./slippage.cjs";
4
+ export * from "./swap.cjs";
@@ -0,0 +1,5 @@
1
+ export * from "./univ4.js";
2
+ export * from "./parseSwap.js";
3
+ export * from "./slippage.js";
4
+ export * from "./swap.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,431 @@
1
+ import { concat, pad, toHex, keccak256, parseEther, isAddress, zeroAddress, encodeAbiParameters } from 'viem';
2
+
3
+ const TickFinder = {
4
+ MIN_TICK: -887220,
5
+ MAX_TICK: 887220
6
+ };
7
+ const Q96 = 2n ** 96n;
8
+ const Q192 = 2n ** 192n;
9
+ const TICK_SPACING = 60;
10
+ const getPoolId = (poolKey) => {
11
+ const packed = concat([
12
+ pad(poolKey.currency0, { size: 32 }),
13
+ // address padded to 32 bytes
14
+ pad(poolKey.currency1, { size: 32 }),
15
+ // address padded to 32 bytes
16
+ pad(toHex(poolKey.fee), { size: 32 }),
17
+ // uint24 padded to 32 bytes
18
+ pad(toHex(poolKey.tickSpacing), { size: 32 }),
19
+ // int24 padded to 32 bytes
20
+ pad(poolKey.hooks, { size: 32 })
21
+ // address padded to 32 bytes
22
+ ]);
23
+ return keccak256(packed);
24
+ };
25
+ const orderPoolKey = (poolKey) => {
26
+ const [currency0, currency1] = poolKey.currency0.toLowerCase() < poolKey.currency1.toLowerCase() ? [poolKey.currency0, poolKey.currency1] : [poolKey.currency1, poolKey.currency0];
27
+ return {
28
+ ...poolKey,
29
+ currency0,
30
+ currency1
31
+ };
32
+ };
33
+ const getValidTick = ({
34
+ tick,
35
+ tickSpacing,
36
+ roundDown = true
37
+ }) => {
38
+ if (tick % tickSpacing === 0) {
39
+ return tick;
40
+ }
41
+ let validTick = Math.trunc(tick / tickSpacing) * tickSpacing;
42
+ if (tick < 0 && tick % tickSpacing !== 0) {
43
+ validTick -= tickSpacing;
44
+ }
45
+ if (!roundDown) {
46
+ validTick += tickSpacing;
47
+ }
48
+ return validTick;
49
+ };
50
+ const getNearestUsableTick = ({
51
+ tick,
52
+ tickSpacing
53
+ }) => {
54
+ const rounded = Math.round(tick / tickSpacing) * tickSpacing;
55
+ return Math.max(TickFinder.MIN_TICK, Math.min(TickFinder.MAX_TICK, rounded));
56
+ };
57
+ const getAmount0ForLiquidity = (sqrtRatioAX96, sqrtRatioBX96, liquidity) => {
58
+ let [sqrtRatioA, sqrtRatioB] = [sqrtRatioAX96, sqrtRatioBX96];
59
+ if (sqrtRatioA > sqrtRatioB) {
60
+ [sqrtRatioA, sqrtRatioB] = [sqrtRatioB, sqrtRatioA];
61
+ }
62
+ const leftShiftedLiquidity = liquidity << 96n;
63
+ const sqrtDiff = sqrtRatioB - sqrtRatioA;
64
+ const multipliedRes = leftShiftedLiquidity * sqrtDiff;
65
+ const numerator = multipliedRes / sqrtRatioB;
66
+ const amount0 = numerator / sqrtRatioA;
67
+ return amount0;
68
+ };
69
+ const getAmount1ForLiquidity = (sqrtRatioAX96, sqrtRatioBX96, liquidity) => {
70
+ let [sqrtRatioA, sqrtRatioB] = [sqrtRatioAX96, sqrtRatioBX96];
71
+ if (sqrtRatioA > sqrtRatioB) {
72
+ [sqrtRatioA, sqrtRatioB] = [sqrtRatioB, sqrtRatioA];
73
+ }
74
+ const sqrtDiff = sqrtRatioB - sqrtRatioA;
75
+ const multipliedRes = liquidity * sqrtDiff;
76
+ const amount1 = multipliedRes / 2n ** 96n;
77
+ return amount1;
78
+ };
79
+ const getSqrtPriceX96FromTick = (tick) => {
80
+ const absTick = tick < 0 ? BigInt(-tick) : BigInt(tick);
81
+ if (absTick > TickFinder.MAX_TICK) {
82
+ throw new Error("Tick out of range");
83
+ }
84
+ let ratio = (absTick & 1n) !== 0n ? 0xfffcb933bd6fad37aa2d162d1a594001n : 0x100000000000000000000000000000000n;
85
+ if ((absTick & 2n) !== 0n)
86
+ ratio = ratio * 0xfff97272373d413259a46990580e213an >> 128n;
87
+ if ((absTick & 4n) !== 0n)
88
+ ratio = ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn >> 128n;
89
+ if ((absTick & 8n) !== 0n)
90
+ ratio = ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n >> 128n;
91
+ if ((absTick & 16n) !== 0n)
92
+ ratio = ratio * 0xffcb9843d60f6159c9db58835c926644n >> 128n;
93
+ if ((absTick & 32n) !== 0n)
94
+ ratio = ratio * 0xff973b41fa98c081472e6896dfb254c0n >> 128n;
95
+ if ((absTick & 64n) !== 0n)
96
+ ratio = ratio * 0xff2ea16466c96a3843ec78b326b52861n >> 128n;
97
+ if ((absTick & 128n) !== 0n)
98
+ ratio = ratio * 0xfe5dee046a99a2a811c461f1969c3053n >> 128n;
99
+ if ((absTick & 256n) !== 0n)
100
+ ratio = ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n >> 128n;
101
+ if ((absTick & 512n) !== 0n)
102
+ ratio = ratio * 0xf987a7253ac413176f2b074cf7815e54n >> 128n;
103
+ if ((absTick & 1024n) !== 0n)
104
+ ratio = ratio * 0xf3392b0822b70005940c7a398e4b70f3n >> 128n;
105
+ if ((absTick & 2048n) !== 0n)
106
+ ratio = ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n >> 128n;
107
+ if ((absTick & 4096n) !== 0n)
108
+ ratio = ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n >> 128n;
109
+ if ((absTick & 8192n) !== 0n)
110
+ ratio = ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n >> 128n;
111
+ if ((absTick & 16384n) !== 0n)
112
+ ratio = ratio * 0x70d869a156d2a1b890bb3df62baf32f7n >> 128n;
113
+ if ((absTick & 32768n) !== 0n)
114
+ ratio = ratio * 0x31be135f97d08fd981231505542fcfa6n >> 128n;
115
+ if ((absTick & 65536n) !== 0n)
116
+ ratio = ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n >> 128n;
117
+ if ((absTick & 131072n) !== 0n)
118
+ ratio = ratio * 0x5d6af8dedb81196699c329225ee604n >> 128n;
119
+ if ((absTick & 262144n) !== 0n)
120
+ ratio = ratio * 0x2216e584f5fa1ea926041bedfe98n >> 128n;
121
+ if ((absTick & 524288n) !== 0n)
122
+ ratio = ratio * 0x48a170391f7dc42444e8fa2n >> 128n;
123
+ if (tick > 0) {
124
+ ratio = (2n ** 256n - 1n) / ratio;
125
+ }
126
+ const resultShifted = ratio >> 32n;
127
+ if (ratio % (1n << 32n) === 0n) {
128
+ return resultShifted;
129
+ }
130
+ return resultShifted + 1n;
131
+ };
132
+ const calculateUnderlyingTokenBalances = (liquidity, tickLower, tickUpper, tickCurrent) => {
133
+ const sqrtPriceCurrentX96 = getSqrtPriceX96FromTick(tickCurrent);
134
+ const sqrtPriceLowerX96 = getSqrtPriceX96FromTick(tickLower);
135
+ const sqrtPriceUpperX96 = getSqrtPriceX96FromTick(tickUpper);
136
+ let amount0 = 0n;
137
+ let amount1 = 0n;
138
+ if (sqrtPriceCurrentX96 <= sqrtPriceLowerX96) {
139
+ amount0 = getAmount0ForLiquidity(
140
+ sqrtPriceLowerX96,
141
+ sqrtPriceUpperX96,
142
+ liquidity
143
+ );
144
+ } else if (sqrtPriceCurrentX96 < sqrtPriceUpperX96) {
145
+ amount0 = getAmount0ForLiquidity(
146
+ sqrtPriceCurrentX96,
147
+ sqrtPriceUpperX96,
148
+ liquidity
149
+ );
150
+ amount1 = getAmount1ForLiquidity(
151
+ sqrtPriceLowerX96,
152
+ sqrtPriceCurrentX96,
153
+ liquidity
154
+ );
155
+ } else {
156
+ amount1 = getAmount1ForLiquidity(
157
+ sqrtPriceLowerX96,
158
+ sqrtPriceUpperX96,
159
+ liquidity
160
+ );
161
+ }
162
+ return { amount0, amount1 };
163
+ };
164
+ const priceRatioToTick = ({
165
+ priceInput,
166
+ isDirection1Per0,
167
+ decimals0,
168
+ decimals1,
169
+ spacing,
170
+ shouldGetNearestUsableTick = true
171
+ }) => {
172
+ if (!priceInput || isNaN(Number(priceInput))) return 0;
173
+ const inputPrice = Number(priceInput);
174
+ try {
175
+ let priceRatio;
176
+ if (isDirection1Per0) {
177
+ priceRatio = inputPrice / Math.pow(10, decimals0 - decimals1);
178
+ } else {
179
+ priceRatio = 1 / inputPrice / Math.pow(10, decimals0 - decimals1);
180
+ }
181
+ const tick = Math.log(priceRatio) / Math.log(1.0001);
182
+ if (shouldGetNearestUsableTick) {
183
+ return getValidTick({
184
+ tick: Math.round(tick),
185
+ tickSpacing: spacing
186
+ });
187
+ } else {
188
+ return Math.round(tick);
189
+ }
190
+ } catch (error) {
191
+ console.error("Error converting price to tick:", error);
192
+ const rawTick = Math.floor(Math.log(inputPrice) / Math.log(1.0001));
193
+ if (shouldGetNearestUsableTick) {
194
+ return getValidTick({
195
+ tick: rawTick,
196
+ tickSpacing: spacing
197
+ });
198
+ } else {
199
+ return rawTick;
200
+ }
201
+ }
202
+ };
203
+ const getLiquidityFromAmounts = (params) => {
204
+ const sqrtRatioCurrentX96 = getSqrtPriceX96FromTick(params.currentTick);
205
+ let sqrtRatioAX96 = getSqrtPriceX96FromTick(params.tickLower);
206
+ let sqrtRatioBX96 = getSqrtPriceX96FromTick(params.tickUpper);
207
+ if (sqrtRatioAX96 > sqrtRatioBX96) {
208
+ [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];
209
+ }
210
+ if (sqrtRatioCurrentX96 <= sqrtRatioAX96) {
211
+ return maxLiquidityForAmount0Precise(
212
+ sqrtRatioAX96,
213
+ sqrtRatioBX96,
214
+ params.amount0
215
+ );
216
+ } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) {
217
+ const liquidity0 = maxLiquidityForAmount0Precise(
218
+ sqrtRatioCurrentX96,
219
+ sqrtRatioBX96,
220
+ params.amount0
221
+ );
222
+ const liquidity1 = maxLiquidityForAmount1(
223
+ sqrtRatioAX96,
224
+ sqrtRatioCurrentX96,
225
+ params.amount1
226
+ );
227
+ return liquidity0 < liquidity1 ? liquidity0 : liquidity1;
228
+ } else {
229
+ return maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, params.amount1);
230
+ }
231
+ };
232
+ function maxLiquidityForAmount0Precise(sqrtRatioAX96, sqrtRatioBX96, amount0) {
233
+ if (sqrtRatioAX96 > sqrtRatioBX96) {
234
+ [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];
235
+ }
236
+ if (sqrtRatioAX96 === sqrtRatioBX96) {
237
+ return 0n;
238
+ }
239
+ const Q962 = 2n ** 96n;
240
+ const numerator = amount0 * sqrtRatioAX96 * sqrtRatioBX96;
241
+ const denominator = Q962 * (sqrtRatioBX96 - sqrtRatioAX96);
242
+ return numerator / denominator;
243
+ }
244
+ function maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1) {
245
+ if (sqrtRatioAX96 > sqrtRatioBX96) {
246
+ [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];
247
+ }
248
+ if (sqrtRatioAX96 === sqrtRatioBX96) {
249
+ return 0n;
250
+ }
251
+ const Q962 = 2n ** 96n;
252
+ return amount1 * Q962 / (sqrtRatioBX96 - sqrtRatioAX96);
253
+ }
254
+ const getAmountsForLiquidity = (params) => {
255
+ if (params.liquidity === 0n) {
256
+ return { amount0: 0n, amount1: 0n };
257
+ }
258
+ const sqrtRatioCurrentX96 = getSqrtPriceX96FromTick(params.currentTick);
259
+ let sqrtRatioAX96 = getSqrtPriceX96FromTick(params.tickLower);
260
+ let sqrtRatioBX96 = getSqrtPriceX96FromTick(params.tickUpper);
261
+ if (sqrtRatioAX96 > sqrtRatioBX96) {
262
+ [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];
263
+ }
264
+ let amount0 = 0n;
265
+ let amount1 = 0n;
266
+ if (sqrtRatioCurrentX96 <= sqrtRatioAX96) {
267
+ amount0 = getAmount0ForLiquidity(
268
+ sqrtRatioAX96,
269
+ sqrtRatioBX96,
270
+ params.liquidity
271
+ );
272
+ } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) {
273
+ amount0 = getAmount0ForLiquidity(
274
+ sqrtRatioCurrentX96,
275
+ sqrtRatioBX96,
276
+ params.liquidity
277
+ );
278
+ amount1 = getAmount1ForLiquidity(
279
+ sqrtRatioAX96,
280
+ sqrtRatioCurrentX96,
281
+ params.liquidity
282
+ );
283
+ } else {
284
+ amount1 = getAmount1ForLiquidity(
285
+ sqrtRatioAX96,
286
+ sqrtRatioBX96,
287
+ params.liquidity
288
+ );
289
+ }
290
+ return { amount0, amount1 };
291
+ };
292
+
293
+ function parseSwapData(args, usdcIsCurrencyZero) {
294
+ const {
295
+ flAmount0,
296
+ flAmount1,
297
+ flFee0,
298
+ flFee1,
299
+ ispAmount0,
300
+ ispAmount1,
301
+ ispFee0,
302
+ ispFee1,
303
+ uniAmount0,
304
+ uniAmount1,
305
+ uniFee0,
306
+ uniFee1
307
+ } = args;
308
+ const currency0Delta = flAmount0 + ispAmount0 + uniAmount0;
309
+ const currency1Delta = flAmount1 + ispAmount1 + uniAmount1;
310
+ const currency0Fees = flFee0 + ispFee0 + uniFee0;
311
+ const currency1Fees = flFee1 + ispFee1 + uniFee1;
312
+ let feesIsInUSDC;
313
+ let swapType;
314
+ if (usdcIsCurrencyZero) {
315
+ swapType = currency0Delta < 0 ? "BUY" : "SELL";
316
+ feesIsInUSDC = currency0Fees < 0;
317
+ } else {
318
+ swapType = currency1Delta < 0 ? "BUY" : "SELL";
319
+ feesIsInUSDC = currency1Fees < 0;
320
+ }
321
+ const absCurrency0Delta = currency0Delta < 0 ? -currency0Delta : currency0Delta;
322
+ const absCurrency1Delta = currency1Delta < 0 ? -currency1Delta : currency1Delta;
323
+ const absCurrency0Fees = currency0Fees < 0 ? -currency0Fees : currency0Fees;
324
+ const absCurrency1Fees = currency1Fees < 0 ? -currency1Fees : currency1Fees;
325
+ const fees = {
326
+ isInUSDC: feesIsInUSDC,
327
+ amount: usdcIsCurrencyZero ? feesIsInUSDC ? absCurrency0Fees : absCurrency1Fees : feesIsInUSDC ? absCurrency1Fees : absCurrency0Fees
328
+ };
329
+ if (swapType === "BUY") {
330
+ return {
331
+ type: swapType,
332
+ delta: {
333
+ coinsBought: usdcIsCurrencyZero ? absCurrency1Delta - (!fees.isInUSDC ? fees.amount : 0n) : absCurrency0Delta - (!fees.isInUSDC ? fees.amount : 0n),
334
+ usdcSold: usdcIsCurrencyZero ? absCurrency0Delta - (fees.isInUSDC ? fees.amount : 0n) : absCurrency1Delta - (fees.isInUSDC ? fees.amount : 0n),
335
+ fees
336
+ }
337
+ };
338
+ } else {
339
+ return {
340
+ type: swapType,
341
+ delta: {
342
+ coinsSold: usdcIsCurrencyZero ? absCurrency1Delta - (!fees.isInUSDC ? fees.amount : 0n) : absCurrency0Delta - (!fees.isInUSDC ? fees.amount : 0n),
343
+ usdcBought: usdcIsCurrencyZero ? absCurrency0Delta - (fees.isInUSDC ? fees.amount : 0n) : absCurrency1Delta - (fees.isInUSDC ? fees.amount : 0n),
344
+ fees
345
+ }
346
+ };
347
+ }
348
+ }
349
+
350
+ const getAmountWithSlippage = ({
351
+ amount,
352
+ slippage,
353
+ swapType
354
+ }) => {
355
+ if (amount == null) {
356
+ return 0n;
357
+ }
358
+ const absAmount = amount < 0n ? -amount : amount;
359
+ const slippageMultiplier = swapType === "EXACT_IN" ? BigInt(1e18) - parseEther(slippage) : BigInt(1e18) + parseEther(slippage);
360
+ return absAmount * slippageMultiplier / BigInt(1e18);
361
+ };
362
+
363
+ const USDC_ADDRESS = "0x3600000000000000000000000000000000000000";
364
+
365
+ function referrerHookData(referrer) {
366
+ return referrer && isAddress(referrer) && referrer !== zeroAddress ? encodeAbiParameters([{ type: "address" }], [referrer]) : "0x";
367
+ }
368
+ function coinPoolKey(coinAddress, positionManagerAddress) {
369
+ return orderPoolKey({
370
+ currency0: USDC_ADDRESS,
371
+ currency1: coinAddress,
372
+ fee: 0,
373
+ tickSpacing: 60,
374
+ hooks: positionManagerAddress
375
+ });
376
+ }
377
+ function usdcIsCurrencyZero(coinAddress) {
378
+ return coinAddress.toLowerCase() > USDC_ADDRESS.toLowerCase();
379
+ }
380
+ function swapDirection(side, coinAddress) {
381
+ return side === "buy" ? usdcIsCurrencyZero(coinAddress) : !usdcIsCurrencyZero(coinAddress);
382
+ }
383
+ const MIN_SQRT_PRICE = 4295128739n + 1n;
384
+ const MAX_SQRT_PRICE = 1461446703485210103287273052203988822378723970342n - 1n;
385
+ function bigintSqrt(value) {
386
+ if (value < 2n) {
387
+ return value;
388
+ }
389
+ let current = value;
390
+ let next = (current + value / current) / 2n;
391
+ while (next < current) {
392
+ current = next;
393
+ next = (current + value / current) / 2n;
394
+ }
395
+ return current;
396
+ }
397
+ function expectedEndSqrtPriceX96({
398
+ current,
399
+ zeroForOne,
400
+ amountIn,
401
+ amountOut
402
+ }) {
403
+ if (current === 0n || amountIn <= 0n || amountOut <= 0n) {
404
+ return current;
405
+ }
406
+ const end = zeroForOne ? amountOut * Q192 / (amountIn * current) : amountIn * Q192 / (amountOut * current);
407
+ if (zeroForOne) {
408
+ return end < current ? end : current;
409
+ }
410
+ return end > current ? end : current;
411
+ }
412
+ function sqrtPriceLimit({
413
+ current,
414
+ zeroForOne,
415
+ slippageBps
416
+ }) {
417
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps >= 1e4) {
418
+ throw new Error(
419
+ `slippageBps must be an integer in [0, 10000), got ${slippageBps}`
420
+ );
421
+ }
422
+ const factor = BigInt(
423
+ zeroForOne ? 1e4 - slippageBps : 1e4 + slippageBps
424
+ );
425
+ const multiplier = bigintSqrt(factor * 10n ** 18n / 10000n);
426
+ const limit = current * multiplier / 10n ** 9n;
427
+ return zeroForOne ? limit > MIN_SQRT_PRICE ? limit : MIN_SQRT_PRICE : limit < MAX_SQRT_PRICE ? limit : MAX_SQRT_PRICE;
428
+ }
429
+
430
+ export { Q192, Q96, TICK_SPACING, TickFinder, calculateUnderlyingTokenBalances, coinPoolKey, expectedEndSqrtPriceX96, getAmountWithSlippage, getAmountsForLiquidity, getLiquidityFromAmounts, getNearestUsableTick, getPoolId, getSqrtPriceX96FromTick, getValidTick, maxLiquidityForAmount0Precise, maxLiquidityForAmount1, orderPoolKey, parseSwapData, priceRatioToTick, referrerHookData, sqrtPriceLimit, swapDirection, usdcIsCurrencyZero };
431
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/utils/univ4.ts","../../src/utils/parseSwap.ts","../../src/utils/slippage.ts","../../src/addresses.ts","../../src/utils/swap.ts"],"sourcesContent":["import { concat, keccak256, pad, toHex } from \"viem\";\nimport { PoolKey } from \"../types\";\n\n// our min/max tick range that is valid for the tick spacing (60)\nexport const TickFinder = {\n MIN_TICK: -887220,\n MAX_TICK: 887220,\n};\n\nexport const Q96 = 2n ** 96n;\nexport const Q192 = 2n ** 192n;\n\nexport const TICK_SPACING = 60;\n\nexport const getPoolId = (poolKey: PoolKey) => {\n // Pack the data in the same order as Solidity struct\n const packed = concat([\n pad(poolKey.currency0, { size: 32 }), // address padded to 32 bytes\n pad(poolKey.currency1, { size: 32 }), // address padded to 32 bytes\n pad(toHex(poolKey.fee), { size: 32 }), // uint24 padded to 32 bytes\n pad(toHex(poolKey.tickSpacing), { size: 32 }), // int24 padded to 32 bytes\n pad(poolKey.hooks, { size: 32 }), // address padded to 32 bytes\n ]);\n\n return keccak256(packed);\n};\n\nexport const orderPoolKey = (poolKey: PoolKey) => {\n // Compare lowercased so checksummed input cannot flip the v4 numeric ordering\n const [currency0, currency1] =\n poolKey.currency0.toLowerCase() < poolKey.currency1.toLowerCase()\n ? [poolKey.currency0, poolKey.currency1]\n : [poolKey.currency1, poolKey.currency0];\n\n return {\n ...poolKey,\n currency0,\n currency1,\n };\n};\n\nexport const getValidTick = ({\n tick,\n tickSpacing,\n roundDown = true,\n}: {\n tick: number;\n tickSpacing: number;\n roundDown?: boolean;\n}) => {\n // If the tick is already valid, exit early\n if (tick % tickSpacing === 0) {\n return tick;\n }\n\n // Division that rounds towards zero (like Solidity)\n let validTick = Math.trunc(tick / tickSpacing) * tickSpacing;\n\n // Handle negative ticks (Solidity behavior)\n if (tick < 0 && tick % tickSpacing !== 0) {\n validTick -= tickSpacing;\n }\n\n // If not rounding down, add TICK_SPACING to get the upper tick\n if (!roundDown) {\n validTick += tickSpacing;\n }\n\n return validTick;\n};\n\n// Rounds up or down to the nearest tick\nexport const getNearestUsableTick = ({\n tick,\n tickSpacing,\n}: {\n tick: number;\n tickSpacing: number;\n}): number => {\n const rounded = Math.round(tick / tickSpacing) * tickSpacing;\n return Math.max(TickFinder.MIN_TICK, Math.min(TickFinder.MAX_TICK, rounded));\n};\n\nconst getAmount0ForLiquidity = (\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint\n) => {\n let [sqrtRatioA, sqrtRatioB] = [sqrtRatioAX96, sqrtRatioBX96];\n\n if (sqrtRatioA > sqrtRatioB) {\n [sqrtRatioA, sqrtRatioB] = [sqrtRatioB, sqrtRatioA];\n }\n\n const leftShiftedLiquidity = liquidity << 96n;\n const sqrtDiff = sqrtRatioB - sqrtRatioA;\n const multipliedRes = leftShiftedLiquidity * sqrtDiff;\n const numerator = multipliedRes / sqrtRatioB;\n const amount0 = numerator / sqrtRatioA;\n\n return amount0;\n};\n\nconst getAmount1ForLiquidity = (\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n liquidity: bigint\n) => {\n let [sqrtRatioA, sqrtRatioB] = [sqrtRatioAX96, sqrtRatioBX96];\n\n if (sqrtRatioA > sqrtRatioB) {\n [sqrtRatioA, sqrtRatioB] = [sqrtRatioB, sqrtRatioA];\n }\n\n const sqrtDiff = sqrtRatioB - sqrtRatioA;\n const multipliedRes = liquidity * sqrtDiff;\n\n const amount1 = multipliedRes / 2n ** 96n;\n\n return amount1;\n};\n\nexport const getSqrtPriceX96FromTick = (tick: number): bigint => {\n const absTick = tick < 0 ? BigInt(-tick) : BigInt(tick);\n if (absTick > TickFinder.MAX_TICK) {\n throw new Error(\"Tick out of range\");\n }\n\n let ratio =\n (absTick & 1n) !== 0n\n ? 0xfffcb933bd6fad37aa2d162d1a594001n\n : 0x100000000000000000000000000000000n;\n\n if ((absTick & 2n) !== 0n)\n ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;\n if ((absTick & 4n) !== 0n)\n ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;\n if ((absTick & 8n) !== 0n)\n ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;\n if ((absTick & 16n) !== 0n)\n ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;\n if ((absTick & 32n) !== 0n)\n ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;\n if ((absTick & 64n) !== 0n)\n ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;\n if ((absTick & 128n) !== 0n)\n ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;\n if ((absTick & 256n) !== 0n)\n ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;\n if ((absTick & 512n) !== 0n)\n ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;\n if ((absTick & 1024n) !== 0n)\n ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;\n if ((absTick & 2048n) !== 0n)\n ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;\n if ((absTick & 4096n) !== 0n)\n ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;\n if ((absTick & 8192n) !== 0n)\n ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;\n if ((absTick & 16384n) !== 0n)\n ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;\n if ((absTick & 32768n) !== 0n)\n ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;\n if ((absTick & 65536n) !== 0n)\n ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;\n if ((absTick & 131072n) !== 0n)\n ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;\n if ((absTick & 262144n) !== 0n)\n ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;\n if ((absTick & 524288n) !== 0n)\n ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;\n\n if (tick > 0) {\n ratio = (2n ** 256n - 1n) / ratio;\n }\n\n // Convert from Q128.128 to Q128.96\n const resultShifted = ratio >> 32n;\n if (ratio % (1n << 32n) === 0n) {\n return resultShifted;\n }\n return resultShifted + 1n;\n};\n\nexport const calculateUnderlyingTokenBalances = (\n liquidity: bigint,\n tickLower: number,\n tickUpper: number,\n tickCurrent: number\n): { amount0: bigint; amount1: bigint } => {\n const sqrtPriceCurrentX96 = getSqrtPriceX96FromTick(tickCurrent);\n const sqrtPriceLowerX96 = getSqrtPriceX96FromTick(tickLower);\n const sqrtPriceUpperX96 = getSqrtPriceX96FromTick(tickUpper);\n\n let amount0 = 0n;\n let amount1 = 0n;\n\n if (sqrtPriceCurrentX96 <= sqrtPriceLowerX96) {\n // Current price is below the position range\n amount0 = getAmount0ForLiquidity(\n sqrtPriceLowerX96,\n sqrtPriceUpperX96,\n liquidity\n );\n } else if (sqrtPriceCurrentX96 < sqrtPriceUpperX96) {\n // Current price is within the position range\n amount0 = getAmount0ForLiquidity(\n sqrtPriceCurrentX96,\n sqrtPriceUpperX96,\n liquidity\n );\n amount1 = getAmount1ForLiquidity(\n sqrtPriceLowerX96,\n sqrtPriceCurrentX96,\n liquidity\n );\n } else {\n // Current price is above the position range\n amount1 = getAmount1ForLiquidity(\n sqrtPriceLowerX96,\n sqrtPriceUpperX96,\n liquidity\n );\n }\n\n return { amount0, amount1 };\n};\n\n// Helper function to convert price ratio to tick with decimal handling\nexport const priceRatioToTick = ({\n priceInput,\n isDirection1Per0,\n decimals0,\n decimals1,\n spacing,\n shouldGetNearestUsableTick = true,\n}: {\n priceInput: string;\n isDirection1Per0: boolean;\n decimals0: number;\n decimals1: number;\n spacing: number;\n shouldGetNearestUsableTick?: boolean;\n}): number => {\n if (!priceInput || isNaN(Number(priceInput))) return 0;\n\n const inputPrice = Number(priceInput);\n\n try {\n // For Uniswap v3/v4, the tick represents price as: price = 1.0001^tick\n // where price = amount1/amount0 in their raw decimal format\n\n let priceRatio: number;\n\n if (isDirection1Per0) {\n // Input is token1 per token0 (e.g., memecoin per USDC)\n // Convert from human-readable to raw: divide by (10^decimals0 / 10^decimals1)\n priceRatio = inputPrice / Math.pow(10, decimals0 - decimals1);\n } else {\n // Input is token0 per token1 (e.g., USDC per memecoin)\n // Invert to get token1 per token0, then convert to raw\n priceRatio = 1 / inputPrice / Math.pow(10, decimals0 - decimals1);\n }\n\n // Calculate tick: tick = log(price) / log(1.0001)\n const tick = Math.log(priceRatio) / Math.log(1.0001);\n\n if (shouldGetNearestUsableTick) {\n return getValidTick({\n tick: Math.round(tick),\n tickSpacing: spacing,\n });\n } else {\n return Math.round(tick);\n }\n } catch (error) {\n console.error(\"Error converting price to tick:\", error);\n // Fallback to basic calculation\n const rawTick = Math.floor(Math.log(inputPrice) / Math.log(1.0001));\n if (shouldGetNearestUsableTick) {\n return getValidTick({\n tick: rawTick,\n tickSpacing: spacing,\n });\n } else {\n return rawTick;\n }\n }\n};\n\n/**\n * Accurate liquidity calculation using proper Uniswap v3/v4 math\n */\nexport const getLiquidityFromAmounts = (params: {\n currentTick: number;\n tickLower: number;\n tickUpper: number;\n amount0: bigint;\n amount1: bigint;\n}) => {\n const sqrtRatioCurrentX96 = getSqrtPriceX96FromTick(params.currentTick);\n let sqrtRatioAX96 = getSqrtPriceX96FromTick(params.tickLower);\n let sqrtRatioBX96 = getSqrtPriceX96FromTick(params.tickUpper);\n\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n if (sqrtRatioCurrentX96 <= sqrtRatioAX96) {\n return maxLiquidityForAmount0Precise(\n sqrtRatioAX96,\n sqrtRatioBX96,\n params.amount0\n );\n } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) {\n const liquidity0 = maxLiquidityForAmount0Precise(\n sqrtRatioCurrentX96,\n sqrtRatioBX96,\n params.amount0\n );\n const liquidity1 = maxLiquidityForAmount1(\n sqrtRatioAX96,\n sqrtRatioCurrentX96,\n params.amount1\n );\n return liquidity0 < liquidity1 ? liquidity0 : liquidity1;\n } else {\n return maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, params.amount1);\n }\n};\n\n/**\n * Returns a precise maximum amount of liquidity received for a given amount of token 0 by dividing by Q64 instead of Q96 in the intermediate step,\n * and shifting the subtracted ratio left by 32 bits.\n * @param sqrtRatioAX96 The price at the lower boundary\n * @param sqrtRatioBX96 The price at the upper boundary\n * @param amount0 The token0 amount\n * @returns liquidity for amount0, precise\n */\nexport function maxLiquidityForAmount0Precise(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n amount0: bigint\n): bigint {\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n // Handle edge case where sqrt ratios are equal (division by zero)\n if (sqrtRatioAX96 === sqrtRatioBX96) {\n return 0n;\n }\n\n const Q96 = 2n ** 96n;\n const numerator = amount0 * sqrtRatioAX96 * sqrtRatioBX96;\n const denominator = Q96 * (sqrtRatioBX96 - sqrtRatioAX96);\n\n return numerator / denominator;\n}\n\n/**\n * Computes the maximum amount of liquidity received for a given amount of token1\n * @param sqrtRatioAX96 The price at the lower tick boundary\n * @param sqrtRatioBX96 The price at the upper tick boundary\n * @param amount1 The token1 amount\n * @returns liquidity for amount1\n */\nexport function maxLiquidityForAmount1(\n sqrtRatioAX96: bigint,\n sqrtRatioBX96: bigint,\n amount1: bigint\n): bigint {\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n // Handle edge case where sqrt ratios are equal (division by zero)\n if (sqrtRatioAX96 === sqrtRatioBX96) {\n return 0n;\n }\n\n const Q96 = 2n ** 96n;\n return (amount1 * Q96) / (sqrtRatioBX96 - sqrtRatioAX96);\n}\n\n/**\n * Calculate the actual amounts needed for a given liquidity\n * This prevents MaximumAmountExceeded errors by ensuring we provide sufficient maximums\n */\nexport const getAmountsForLiquidity = (params: {\n currentTick: number;\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n}): { amount0: bigint; amount1: bigint } => {\n // Handle zero liquidity case\n if (params.liquidity === 0n) {\n return { amount0: 0n, amount1: 0n };\n }\n\n const sqrtRatioCurrentX96 = getSqrtPriceX96FromTick(params.currentTick);\n let sqrtRatioAX96 = getSqrtPriceX96FromTick(params.tickLower);\n let sqrtRatioBX96 = getSqrtPriceX96FromTick(params.tickUpper);\n\n if (sqrtRatioAX96 > sqrtRatioBX96) {\n [sqrtRatioAX96, sqrtRatioBX96] = [sqrtRatioBX96, sqrtRatioAX96];\n }\n\n let amount0 = 0n;\n let amount1 = 0n;\n\n if (sqrtRatioCurrentX96 <= sqrtRatioAX96) {\n // Current price is below the range, only token0 needed\n amount0 = getAmount0ForLiquidity(\n sqrtRatioAX96,\n sqrtRatioBX96,\n params.liquidity\n );\n } else if (sqrtRatioCurrentX96 < sqrtRatioBX96) {\n // Current price is within the range, need both tokens\n amount0 = getAmount0ForLiquidity(\n sqrtRatioCurrentX96,\n sqrtRatioBX96,\n params.liquidity\n );\n amount1 = getAmount1ForLiquidity(\n sqrtRatioAX96,\n sqrtRatioCurrentX96,\n params.liquidity\n );\n } else {\n // Current price is above the range, only token1 needed\n amount1 = getAmount1ForLiquidity(\n sqrtRatioAX96,\n sqrtRatioBX96,\n params.liquidity\n );\n }\n\n return { amount0, amount1 };\n};\n","export interface SwapLogArgs {\n flAmount0: bigint;\n flAmount1: bigint;\n flFee0: bigint;\n flFee1: bigint;\n ispAmount0: bigint;\n ispAmount1: bigint;\n ispFee0: bigint;\n ispFee1: bigint;\n uniAmount0: bigint;\n uniAmount1: bigint;\n uniFee0: bigint;\n uniFee1: bigint;\n}\n\nexport interface SwapFees {\n /** True when the fee was taken on the USDC side, false when in the coin. */\n isInUSDC: boolean;\n amount: bigint;\n}\n\nexport interface BuySwapData {\n type: \"BUY\";\n delta: {\n coinsBought: bigint;\n usdcSold: bigint;\n fees: SwapFees;\n };\n}\n\nexport interface SellSwapData {\n type: \"SELL\";\n delta: {\n coinsSold: bigint;\n usdcBought: bigint;\n fees: SwapFees;\n };\n}\n\nexport type ParsedSwapData = BuySwapData | SellSwapData;\n\n/**\n * Parses raw PoolSwap log arguments into structured swap data. The three\n * amount-pair legs (fl = fair launch fill, isp = internal swap pool, uni =\n * Uniswap pool) show how a fill was sourced; this nets them into one delta.\n * @param args - The swap log arguments\n * @param usdcIsCurrencyZero - Whether USDC is currency0 in the pool\n * @returns Parsed swap data with type and delta information\n */\nexport function parseSwapData(\n args: SwapLogArgs,\n usdcIsCurrencyZero: boolean\n): ParsedSwapData {\n const {\n flAmount0,\n flAmount1,\n flFee0,\n flFee1,\n ispAmount0,\n ispAmount1,\n ispFee0,\n ispFee1,\n uniAmount0,\n uniAmount1,\n uniFee0,\n uniFee1,\n } = args;\n\n const currency0Delta = flAmount0 + ispAmount0 + uniAmount0;\n const currency1Delta = flAmount1 + ispAmount1 + uniAmount1;\n const currency0Fees = flFee0 + ispFee0 + uniFee0;\n const currency1Fees = flFee1 + ispFee1 + uniFee1;\n\n let feesIsInUSDC: boolean;\n let swapType: \"BUY\" | \"SELL\";\n\n if (usdcIsCurrencyZero) {\n swapType = currency0Delta < 0 ? \"BUY\" : \"SELL\";\n feesIsInUSDC = currency0Fees < 0;\n } else {\n swapType = currency1Delta < 0 ? \"BUY\" : \"SELL\";\n feesIsInUSDC = currency1Fees < 0;\n }\n\n const absCurrency0Delta =\n currency0Delta < 0 ? -currency0Delta : currency0Delta;\n const absCurrency1Delta =\n currency1Delta < 0 ? -currency1Delta : currency1Delta;\n const absCurrency0Fees = currency0Fees < 0 ? -currency0Fees : currency0Fees;\n const absCurrency1Fees = currency1Fees < 0 ? -currency1Fees : currency1Fees;\n\n const fees: SwapFees = {\n isInUSDC: feesIsInUSDC,\n amount: usdcIsCurrencyZero\n ? feesIsInUSDC\n ? absCurrency0Fees\n : absCurrency1Fees\n : feesIsInUSDC\n ? absCurrency1Fees\n : absCurrency0Fees,\n };\n\n if (swapType === \"BUY\") {\n return {\n type: swapType,\n delta: {\n coinsBought: usdcIsCurrencyZero\n ? absCurrency1Delta - (!fees.isInUSDC ? fees.amount : 0n)\n : absCurrency0Delta - (!fees.isInUSDC ? fees.amount : 0n),\n usdcSold: usdcIsCurrencyZero\n ? absCurrency0Delta - (fees.isInUSDC ? fees.amount : 0n)\n : absCurrency1Delta - (fees.isInUSDC ? fees.amount : 0n),\n fees,\n },\n };\n } else {\n return {\n type: swapType,\n delta: {\n coinsSold: usdcIsCurrencyZero\n ? absCurrency1Delta - (!fees.isInUSDC ? fees.amount : 0n)\n : absCurrency0Delta - (!fees.isInUSDC ? fees.amount : 0n),\n usdcBought: usdcIsCurrencyZero\n ? absCurrency0Delta - (fees.isInUSDC ? fees.amount : 0n)\n : absCurrency1Delta - (fees.isInUSDC ? fees.amount : 0n),\n fees,\n },\n };\n }\n}\n","import { parseEther } from \"viem\";\n\n/**\n * Applies a slippage tolerance to an amount.\n *\n * @dev EXACT_OUT adds the slippage, EXACT_IN removes it. `slippage` is a\n * fraction string, e.g. \"0.05\" for 5%.\n */\nexport const getAmountWithSlippage = ({\n amount,\n slippage,\n swapType,\n}: {\n amount: bigint | undefined;\n slippage: string;\n swapType: \"EXACT_IN\" | \"EXACT_OUT\";\n}) => {\n if (amount == null) {\n return 0n;\n }\n\n const absAmount = amount < 0n ? -amount : amount;\n const slippageMultiplier =\n swapType === \"EXACT_IN\"\n ? BigInt(1e18) - parseEther(slippage)\n : BigInt(1e18) + parseEther(slippage);\n\n return (absAmount * slippageMultiplier) / BigInt(1e18);\n};\n","import { Addresses } from \"./types\";\n\n/**\n * ubi.fun deployments on Arc (Circle).\n *\n * Source of truth: deployments/arc-mainnet-5042.json and\n * deployments/arc-testnet-5042002.json in the contracts repo, mirrored by the\n * committed frontend registry. The cash / native asset on Arc is native USDC\n * (6 decimals through its ERC20 interface) at\n * 0x3600000000000000000000000000000000000000: the position manager's\n * \"nativeToken\" slot IS this USDC, and every pool pairs a coin against it.\n * There is no flETH, no WETH wrapping, and no unwrap step on this chain.\n */\nexport const ARC_MAINNET_CHAIN_ID = 5042;\nexport const ARC_TESTNET_CHAIN_ID = 5042002;\n\n/** Arc native USDC (ERC20 interface, 6 decimals). The cash side of every pool. */\nexport const USDC_ADDRESS =\n \"0x3600000000000000000000000000000000000000\" as const;\n\n/**\n * The pool \"native token\": Arc native USDC on both networks. Kept as an\n * Addresses map so client code stays chain-keyed like every other contract.\n */\nexport const NativeTokenAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: USDC_ADDRESS,\n [ARC_TESTNET_CHAIN_ID]: USDC_ADDRESS,\n};\n\nexport const FlaunchZapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe07F7cA66EC795592385018Dd998F0B50b8A2834\",\n [ARC_TESTNET_CHAIN_ID]: \"0x3fd667aaa89519772bb44e984de408bfcd40e285\",\n};\n\n// SDK \"FlaunchPositionManager\" maps to our deployment \"PositionManager\".\nexport const FlaunchPositionManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC780c0f4aAc690908854D351b8bFda2812daeFDc\",\n [ARC_TESTNET_CHAIN_ID]: \"0x88af0b76752ff31aa351cea2cc2e43a1b7c32fdc\",\n};\n\nexport const FlaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x93E5A7565008db9688BA5211Fa552d8b108B9c75\",\n [ARC_TESTNET_CHAIN_ID]: \"0x55a0e1a458f1c13023dbd6b204e2a439c3b44663\",\n};\n\nexport const FairLaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xdCDADa707264d9e2B0E8c2feC467860C97434Bd4\",\n [ARC_TESTNET_CHAIN_ID]: \"0xd2ea5591fe0b5820b6de33afbc3b468d070038ea\",\n};\n\n// SDK \"BidWall\" maps to our deployment \"BurningBidWall\" (a modified BidWall).\nexport const BidWallAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC5DD30802fefab789Cd9b1e835Bd7301a8D23F8A\",\n [ARC_TESTNET_CHAIN_ID]: \"0x04f947e5fc0ac42836f880d45705af7483a2c4c0\",\n};\n\n/** Referrer-aware swap router: the supported way to trade ubi.fun pools. */\nexport const PoolSwapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x3A61B6E86fde5Fc657a48819837F346C7E2Fffa7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x396d41eb4d110d64491d01cd186548fdc82b1b4a\",\n};\n\nexport const TreasuryManagerFactoryAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xE25C132F379DB49C463328eF427E28DBCbD3a2F0\",\n [ARC_TESTNET_CHAIN_ID]: \"0x093c10b780f7cf8fca9aa7dbc83a64cddf55215f\",\n};\n\n// The approved AddressFeeSplitManager IMPLEMENTATION (factory deploys clones).\nexport const AddressFeeSplitManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xde10818344f5ab75ecfA772887cE5751D6Cb91C7\",\n [ARC_TESTNET_CHAIN_ID]: \"0xA7d182B81aF7B40b6d09Da88A12a4f7ad770e162\",\n};\n\n/** Creator revenue escrow: balances accrue here, claimed as USDC (unwrap=false). */\nexport const FeeEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x678f0D1C045e820Ec1d4806749f2629e1035550e\",\n [ARC_TESTNET_CHAIN_ID]: \"0x59b3269aaf9db83bd3029c84d8b5226fa5702f78\",\n};\n\n/** Referrer rewards escrow: 5% of every swap fee routed with your address. */\nexport const ReferralEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf25B9ceAba005CcCb0cefC4e323e6e519F111eB3\",\n [ARC_TESTNET_CHAIN_ID]: \"0x51b6a4759f9c9a681349c857f6fd912cdfeb8fef\",\n};\n\n/** X-handle earnings registry: per-handle CREATE2 escrows + attested claims. */\nexport const XHandleClaimsAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xfC38298590893c39E46D319aEd9EC3bf6CB17A3E\",\n [ARC_TESTNET_CHAIN_ID]: \"0x6fE2b9e1Da493E4584e742C03e1926a4CD8AC2A1\",\n};\n\n/**\n * Morpho UniversalRewardsDistributor paying the daily USDC holder pool\n * (24% of every swap fee). Claims are Merkle-proofed cumulative amounts.\n */\nexport const UniversalRewardsDistributorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x66003091e723778d7D3285BB6c24ff3F0Ddcc7F7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x7a8e9dA46db2be8436c4404476b40F07a31A6d95\",\n};\n\n/** Uniswap v4 PoolManager (canonical deployment on mainnet, ours on testnet). */\nexport const PoolManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x8366a39CC670B4001A1121B8F6A443A643e40951\",\n [ARC_TESTNET_CHAIN_ID]: \"0x5fb24c800133a0930280788c5eb3468764154309\",\n};\n\nexport const QuoterAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x4595D3CD7A6D98d83A719934e829db5076fF1d0d\",\n [ARC_TESTNET_CHAIN_ID]: \"0xf517623f178Ba90e5b3299cb121D38F5A0733ac4\",\n};\n\n/** Base URL of the ubi.fun read/upload API serving each network. */\nexport const ApiBaseUrl: { [chainId: number]: string } = {\n [ARC_MAINNET_CHAIN_ID]: \"https://api.ubi.fun\",\n [ARC_TESTNET_CHAIN_ID]: \"https://api-dev.ubi.fun\",\n};\n","import { encodeAbiParameters, isAddress, zeroAddress, type Address } from \"viem\";\nimport { PoolKey } from \"../types\";\nimport { USDC_ADDRESS } from \"../addresses\";\nimport { orderPoolKey, Q192 } from \"./univ4\";\n\n/**\n * Swap-building helpers shared by the quoter and PoolSwap clients. Pool keys,\n * hook data and direction mirror the ubi.fun app and MCP server exactly; the\n * SDK's price bound additionally anchors on the quoted end price so an\n * exact-input trade's own impact does not eat the slippage budget.\n */\n\n/**\n * Encodes the referrer for the hook: 5% of the swap fee accrues on-chain to\n * this address (claimable from the ReferralEscrow). '0x' means no referrer and\n * the share cascades down the fee split instead. The SAME hookData must be\n * used for the quote and the swap for them to match.\n */\nexport function referrerHookData(\n referrer: Address | undefined\n): `0x${string}` {\n return referrer && isAddress(referrer) && referrer !== zeroAddress\n ? encodeAbiParameters([{ type: \"address\" }], [referrer])\n : \"0x\";\n}\n\n/** Builds the v4 pool key for a coin: USDC on the cash side, hook fixed by the protocol. */\nexport function coinPoolKey(\n coinAddress: Address,\n positionManagerAddress: Address\n): PoolKey {\n return orderPoolKey({\n currency0: USDC_ADDRESS,\n currency1: coinAddress,\n fee: 0,\n tickSpacing: 60,\n hooks: positionManagerAddress,\n });\n}\n\n/** True when USDC sorts as currency0 for this coin's pool. */\nexport function usdcIsCurrencyZero(coinAddress: Address): boolean {\n return coinAddress.toLowerCase() > USDC_ADDRESS.toLowerCase();\n}\n\n/**\n * v4 swap direction. Buys spend USDC for the coin: when USDC is currency0\n * that's a zeroForOne swap, otherwise the reverse.\n */\nexport function swapDirection(\n side: \"buy\" | \"sell\",\n coinAddress: Address\n): boolean {\n return side === \"buy\"\n ? usdcIsCurrencyZero(coinAddress)\n : !usdcIsCurrencyZero(coinAddress);\n}\n\n// Uniswap v4 sqrt price bounds (TickMath.MIN_SQRT_PRICE / MAX_SQRT_PRICE, exclusive).\nconst MIN_SQRT_PRICE = 4_295_128_739n + 1n;\nconst MAX_SQRT_PRICE =\n 1_461_446_703_485_210_103_287_273_052_203_988_822_378_723_970_342n - 1n;\n\nfunction bigintSqrt(value: bigint): bigint {\n if (value < 2n) {\n return value;\n }\n let current = value;\n let next = (current + value / current) / 2n;\n while (next < current) {\n current = next;\n next = (current + value / current) / 2n;\n }\n return current;\n}\n\n/**\n * Expected pool sqrt price after an exact-input fill, derived from the quoted\n * amounts through the constant-liquidity identity amountOut/amountIn =\n * sqrtP_start * sqrtP_end (inverted for oneForZero). Hook fees only skew the\n * estimate toward the permissive side, so a slippage margin applied on top of\n * it never lands tighter than the real fill. Falls back to the spot price when\n * a quote leg is zero or the estimate lands on the wrong side of spot.\n */\nexport function expectedEndSqrtPriceX96({\n current,\n zeroForOne,\n amountIn,\n amountOut,\n}: {\n current: bigint;\n zeroForOne: boolean;\n amountIn: bigint;\n amountOut: bigint;\n}): bigint {\n if (current === 0n || amountIn <= 0n || amountOut <= 0n) {\n return current;\n }\n const end = zeroForOne\n ? (amountOut * Q192) / (amountIn * current)\n : (amountIn * Q192) / (amountOut * current);\n if (zeroForOne) {\n return end < current ? end : current;\n }\n return end > current ? end : current;\n}\n\n/**\n * Slippage bound as a sqrt price limit: the pool price may move at most\n * `slippageBps` beyond `current` (pass the expected end price for exact-input\n * swaps, so the trade's own quoted impact is not counted against the budget)\n * before the swap stops filling.\n */\nexport function sqrtPriceLimit({\n current,\n zeroForOne,\n slippageBps,\n}: {\n current: bigint;\n zeroForOne: boolean;\n slippageBps: number;\n}): bigint {\n if (\n !Number.isInteger(slippageBps) ||\n slippageBps < 0 ||\n slippageBps >= 10_000\n ) {\n throw new Error(\n `slippageBps must be an integer in [0, 10000), got ${slippageBps}`\n );\n }\n const factor = BigInt(\n zeroForOne ? 10_000 - slippageBps : 10_000 + slippageBps\n );\n const multiplier = bigintSqrt((factor * 10n ** 18n) / 10_000n);\n const limit = (current * multiplier) / 10n ** 9n;\n return zeroForOne\n ? limit > MIN_SQRT_PRICE\n ? limit\n : MIN_SQRT_PRICE\n : limit < MAX_SQRT_PRICE\n ? limit\n : MAX_SQRT_PRICE;\n}\n"],"names":["Q96"],"mappings":"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"}