@ubi.fun/sdk 0.1.1 → 0.2.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 (67) hide show
  1. package/README.md +33 -0
  2. package/dist/abi/DividendVault.d.cts +670 -0
  3. package/dist/abi/DividendVault.d.ts +671 -0
  4. package/dist/abi/DividendVault.d.ts.map +1 -0
  5. package/dist/abi/HolderShareFeeCalculator.d.cts +287 -0
  6. package/dist/abi/HolderShareFeeCalculator.d.ts +288 -0
  7. package/dist/abi/HolderShareFeeCalculator.d.ts.map +1 -0
  8. package/dist/abi/IndexerSubscriber.d.cts +221 -0
  9. package/dist/abi/IndexerSubscriber.d.ts +222 -0
  10. package/dist/abi/IndexerSubscriber.d.ts.map +1 -0
  11. package/dist/abi/MemecoinDividends.d.cts +1021 -0
  12. package/dist/abi/MemecoinDividends.d.ts +1022 -0
  13. package/dist/abi/MemecoinDividends.d.ts.map +1 -0
  14. package/dist/abi/index.cjs +6447 -3585
  15. package/dist/abi/index.cjs.map +1 -1
  16. package/dist/abi/index.d.cts +4 -0
  17. package/dist/abi/index.d.ts +4 -0
  18. package/dist/abi/index.d.ts.map +1 -1
  19. package/dist/abi/index.js +6444 -3586
  20. package/dist/abi/index.js.map +1 -1
  21. package/dist/addresses/index.cjs +17 -0
  22. package/dist/addresses/index.cjs.map +1 -1
  23. package/dist/addresses/index.js +14 -1
  24. package/dist/addresses/index.js.map +1 -1
  25. package/dist/addresses.d.cts +25 -0
  26. package/dist/addresses.d.ts +25 -0
  27. package/dist/addresses.d.ts.map +1 -1
  28. package/dist/clients/DividendVaultClient.d.cts +32 -0
  29. package/dist/clients/DividendVaultClient.d.ts +33 -0
  30. package/dist/clients/DividendVaultClient.d.ts.map +1 -0
  31. package/dist/clients/FlaunchPositionManagerClient.d.cts +18 -0
  32. package/dist/clients/FlaunchPositionManagerClient.d.ts +18 -0
  33. package/dist/clients/FlaunchPositionManagerClient.d.ts.map +1 -1
  34. package/dist/clients/FlaunchZapClient.d.cts +41 -0
  35. package/dist/clients/FlaunchZapClient.d.ts +41 -0
  36. package/dist/clients/FlaunchZapClient.d.ts.map +1 -1
  37. package/dist/clients/IndexerSubscriberClient.d.cts +46 -0
  38. package/dist/clients/IndexerSubscriberClient.d.ts +47 -0
  39. package/dist/clients/IndexerSubscriberClient.d.ts.map +1 -0
  40. package/dist/clients/MemecoinDividendsClient.d.cts +23 -0
  41. package/dist/clients/MemecoinDividendsClient.d.ts +24 -0
  42. package/dist/clients/MemecoinDividendsClient.d.ts.map +1 -0
  43. package/dist/helpers/index.cjs.map +1 -1
  44. package/dist/helpers/index.js.map +1 -1
  45. package/dist/index.cjs +11710 -8366
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +6 -0
  48. package/dist/index.d.ts +6 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +11687 -8368
  51. package/dist/index.js.map +1 -1
  52. package/dist/index.umd.cjs +1 -1
  53. package/dist/index.umd.cjs.map +1 -1
  54. package/dist/sdk/FlaunchSDK.d.cts +47 -1
  55. package/dist/sdk/FlaunchSDK.d.ts +47 -1
  56. package/dist/sdk/FlaunchSDK.d.ts.map +1 -1
  57. package/dist/utils/creatorVaults.d.cts +64 -0
  58. package/dist/utils/creatorVaults.d.ts +65 -0
  59. package/dist/utils/creatorVaults.d.ts.map +1 -0
  60. package/dist/utils/index.cjs +64 -0
  61. package/dist/utils/index.cjs.map +1 -1
  62. package/dist/utils/index.d.cts +1 -0
  63. package/dist/utils/index.d.ts +1 -0
  64. package/dist/utils/index.d.ts.map +1 -1
  65. package/dist/utils/index.js +55 -2
  66. package/dist/utils/index.js.map +1 -1
  67. package/package.json +1 -1
@@ -1 +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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"}
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","../../src/utils/creatorVaults.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/**\n * Creator vaults (docs/CREATOR-VAULTS.md in the contracts repo): the approved DividendVault\n * IMPLEMENTATION every new launch clones, and the HolderShareFeeCalculator. Empty until the\n * contracts are deployed; once the calculator is the PositionManager's fee calculator, every\n * launch must attach a vault (`flaunchWithVault`).\n */\nexport const DividendVaultAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xA9E566b548D5D0203e4d00bc3dFdB4BC38883514\",\n};\nexport const HolderShareFeeCalculatorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe5737916951Fe20235Bddef5a65af5d18406f92E\",\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/**\n * Uniswap v4 StateView (canonical periphery view over PoolManager storage).\n *\n * MAINNET ONLY. Arc testnet runs our own PoolManager instance, and no StateView\n * was deployed against it, so there is no testnet entry. The SDK does not\n * depend on StateView on either network: `ReadPoolManager` reads slot0,\n * liquidity, positions and tick data straight from PoolManager storage with\n * `extsload`, using the same slot derivations as Uniswap's StateLibrary. Use\n * that path if you need one code path across both chains.\n */\nexport const StateViewAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b\",\n};\n\n/**\n * IndexerSubscriber: on-chain reverse index PoolId -> (flaunch, memecoin,\n * memecoinTreasury, tokenId). Attached to the PositionManager's Notifier, so it\n * is populated at pool initialisation. See contracts/IndexerSubscriber.sol.\n */\nexport const IndexerSubscriberAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x2c68B21C9f8b899a662A71dd188C1c919D578a9F\",\n [ARC_TESTNET_CHAIN_ID]: \"0xe6d8164d67c60ff860e1a0d90636f5f65b665be7\",\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","import { encodeAbiParameters, isAddressEqual, type Address, type Hex } from \"viem\";\n\n/**\n * Creator vault rules, mirrored from the contracts (and the ubi.fun app):\n * HolderShareFeeCalculator fees are FeeDistributor units (100_00 = 100%),\n * DividendVault shares are SHARE_DENOMINATOR units (100_00 = 100%).\n */\nexport const VAULT_MIN_FEE = 150;\nexport const VAULT_MAX_FEE = 500;\nexport const VAULT_MIN_HOLDER_SHARE = 16_67;\nexport const VAULT_SHARE_DENOMINATOR = 100_00;\n/** The calculator only registers launches whose creator side is 90% or more. */\nexport const VAULT_MIN_CREATOR_ALLOCATION_PERCENT = 90;\n/** DividendVault.MAX_RECIPIENTS is 5, and the creator always takes one of them. */\nexport const VAULT_MAX_SPLIT_RECEIVERS = 4;\n\n/**\n * `feeCalculatorParams` for a launch WITHOUT a vault: a fee of 0. With no fee\n * calculator set the PositionManager never reads them; the vault calculator\n * refuses them (`FeeOutOfRange(0)`), so a launch without a vault that lands\n * after activation reverts instead of creating a token that can never trade.\n */\nexport const NO_VAULT_FEE_CALCULATOR_PARAMS: Hex = encodeAbiParameters(\n [{ type: \"uint256\" }],\n [0n]\n);\n\n/** `feeCalculatorParams` registering a vault launch at `fee` (FeeDistributor units). */\nexport function vaultFeeCalculatorParams(fee: number): Hex {\n return encodeAbiParameters([{ type: \"uint256\" }], [BigInt(fee)]);\n}\n\n/** Basis points of a percent with at most two decimals, at least 1; throws otherwise. */\nexport function percentToVaultBps(percent: number, label: string): number {\n const bps = Math.round(percent * 100);\n if (!Number.isFinite(percent) || bps < 1 || Math.abs(bps - percent * 100) > 1e-6) {\n throw new Error(\n `${label} must be a positive percent with at most 2 decimals, got ${percent}`\n );\n }\n return bps;\n}\n\n/**\n * DividendVault initialize data: `abi.encode(holderShare, recipients, shares)`.\n * Receivers come first and the creator last with the remainder (the vault pays\n * rounding dust to the last recipient), so shares always sum to exactly 100_00.\n */\nexport function encodeVaultInitializeData(params: {\n holderShare: number;\n receivers: { address: Address; bps: number }[];\n creator: Address;\n}): Hex {\n const total = params.receivers.reduce((sum, receiver) => sum + receiver.bps, 0);\n if (total >= VAULT_SHARE_DENOMINATOR) {\n throw new Error(\"splitReceivers total 100% or more; the creator must keep a share\");\n }\n return encodeAbiParameters(\n [{ type: \"uint256\" }, { type: \"address[]\" }, { type: \"uint256[]\" }],\n [\n BigInt(params.holderShare),\n [...params.receivers.map((receiver) => receiver.address), params.creator],\n [\n ...params.receivers.map((receiver) => BigInt(receiver.bps)),\n BigInt(VAULT_SHARE_DENOMINATOR - total),\n ],\n ]\n );\n}\n\n/** What a launch must look like under the calculators set on-chain right now. */\nexport interface LaunchCalculatorState {\n /** The vault calculator is live: every launch must attach its DividendVault. */\n vault: boolean;\n /** `feeCalculatorParams` for a launch without a vault in this state. */\n noVaultParams: Hex;\n}\n\n/**\n * Classifies the PositionManager's two calculator slots. The vault flow is live\n * when this SDK knows the vault and calculator and that calculator is the one\n * set. A launch without a vault sends the no-vault marker while no calculator\n * is set or when the SDK cannot place what is set (fail closed), and empty\n * params only beside a calculator that is certainly not the vault one.\n */\nexport function launchCalculatorState(params: {\n standard: Address;\n fairLaunch: Address;\n vaultCalculator?: Address;\n vaultImplementation?: Address;\n /**\n * TreasuryManagerFactory approval of the vault implementation: the zap only\n * clones an approved one, and would hand the creator NFT to an unapproved\n * implementation itself (no clone, a token that can never trade).\n */\n vaultApproved?: boolean;\n}): LaunchCalculatorState {\n const zero = \"0x0000000000000000000000000000000000000000\";\n const { standard, fairLaunch, vaultCalculator, vaultImplementation, vaultApproved } = params;\n const isZero = (address: Address) => isAddressEqual(address, zero);\n const isOurs = (address: Address) =>\n vaultCalculator !== undefined && isAddressEqual(address, vaultCalculator);\n if (\n vaultImplementation &&\n vaultApproved === true &&\n isOurs(standard) &&\n (isZero(fairLaunch) || isOurs(fairLaunch))\n ) {\n return { vault: true, noVaultParams: NO_VAULT_FEE_CALCULATOR_PARAMS };\n }\n if (\n vaultCalculator &&\n !(isZero(standard) && isZero(fairLaunch)) &&\n !isOurs(standard) &&\n !isOurs(fairLaunch)\n ) {\n return { vault: false, noVaultParams: \"0x\" };\n }\n return { vault: false, noVaultParams: NO_VAULT_FEE_CALCULATOR_PARAMS };\n}\n"],"names":["concat","pad","toHex","keccak256","Q96","parseEther","isAddress","zeroAddress","encodeAbiParameters","isAddressEqual"],"mappings":"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"}
@@ -2,3 +2,4 @@ export * from "./univ4.cjs";
2
2
  export * from "./parseSwap.cjs";
3
3
  export * from "./slippage.cjs";
4
4
  export * from "./swap.cjs";
5
+ export * from "./creatorVaults.cjs";
@@ -2,4 +2,5 @@ export * from "./univ4.js";
2
2
  export * from "./parseSwap.js";
3
3
  export * from "./slippage.js";
4
4
  export * from "./swap.js";
5
+ export * from "./creatorVaults.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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;AACvB,cAAc,iBAAiB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { concat, pad, toHex, keccak256, parseEther, isAddress, zeroAddress, encodeAbiParameters } from 'viem';
1
+ import { concat, pad, toHex, keccak256, parseEther, isAddress, zeroAddress, encodeAbiParameters, isAddressEqual } from 'viem';
2
2
 
3
3
  const TickFinder = {
4
4
  MIN_TICK: -887220,
@@ -427,5 +427,58 @@ function sqrtPriceLimit({
427
427
  return zeroForOne ? limit > MIN_SQRT_PRICE ? limit : MIN_SQRT_PRICE : limit < MAX_SQRT_PRICE ? limit : MAX_SQRT_PRICE;
428
428
  }
429
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 };
430
+ const VAULT_MIN_FEE = 150;
431
+ const VAULT_MAX_FEE = 500;
432
+ const VAULT_MIN_HOLDER_SHARE = 1667;
433
+ const VAULT_SHARE_DENOMINATOR = 1e4;
434
+ const VAULT_MIN_CREATOR_ALLOCATION_PERCENT = 90;
435
+ const VAULT_MAX_SPLIT_RECEIVERS = 4;
436
+ const NO_VAULT_FEE_CALCULATOR_PARAMS = encodeAbiParameters(
437
+ [{ type: "uint256" }],
438
+ [0n]
439
+ );
440
+ function vaultFeeCalculatorParams(fee) {
441
+ return encodeAbiParameters([{ type: "uint256" }], [BigInt(fee)]);
442
+ }
443
+ function percentToVaultBps(percent, label) {
444
+ const bps = Math.round(percent * 100);
445
+ if (!Number.isFinite(percent) || bps < 1 || Math.abs(bps - percent * 100) > 1e-6) {
446
+ throw new Error(
447
+ `${label} must be a positive percent with at most 2 decimals, got ${percent}`
448
+ );
449
+ }
450
+ return bps;
451
+ }
452
+ function encodeVaultInitializeData(params) {
453
+ const total = params.receivers.reduce((sum, receiver) => sum + receiver.bps, 0);
454
+ if (total >= VAULT_SHARE_DENOMINATOR) {
455
+ throw new Error("splitReceivers total 100% or more; the creator must keep a share");
456
+ }
457
+ return encodeAbiParameters(
458
+ [{ type: "uint256" }, { type: "address[]" }, { type: "uint256[]" }],
459
+ [
460
+ BigInt(params.holderShare),
461
+ [...params.receivers.map((receiver) => receiver.address), params.creator],
462
+ [
463
+ ...params.receivers.map((receiver) => BigInt(receiver.bps)),
464
+ BigInt(VAULT_SHARE_DENOMINATOR - total)
465
+ ]
466
+ ]
467
+ );
468
+ }
469
+ function launchCalculatorState(params) {
470
+ const zero = "0x0000000000000000000000000000000000000000";
471
+ const { standard, fairLaunch, vaultCalculator, vaultImplementation, vaultApproved } = params;
472
+ const isZero = (address) => isAddressEqual(address, zero);
473
+ const isOurs = (address) => vaultCalculator !== void 0 && isAddressEqual(address, vaultCalculator);
474
+ if (vaultImplementation && vaultApproved === true && isOurs(standard) && (isZero(fairLaunch) || isOurs(fairLaunch))) {
475
+ return { vault: true, noVaultParams: NO_VAULT_FEE_CALCULATOR_PARAMS };
476
+ }
477
+ if (vaultCalculator && !(isZero(standard) && isZero(fairLaunch)) && !isOurs(standard) && !isOurs(fairLaunch)) {
478
+ return { vault: false, noVaultParams: "0x" };
479
+ }
480
+ return { vault: false, noVaultParams: NO_VAULT_FEE_CALCULATOR_PARAMS };
481
+ }
482
+
483
+ export { NO_VAULT_FEE_CALCULATOR_PARAMS, Q192, Q96, TICK_SPACING, TickFinder, VAULT_MAX_FEE, VAULT_MAX_SPLIT_RECEIVERS, VAULT_MIN_CREATOR_ALLOCATION_PERCENT, VAULT_MIN_FEE, VAULT_MIN_HOLDER_SHARE, VAULT_SHARE_DENOMINATOR, calculateUnderlyingTokenBalances, coinPoolKey, encodeVaultInitializeData, expectedEndSqrtPriceX96, getAmountWithSlippage, getAmountsForLiquidity, getLiquidityFromAmounts, getNearestUsableTick, getPoolId, getSqrtPriceX96FromTick, getValidTick, launchCalculatorState, maxLiquidityForAmount0Precise, maxLiquidityForAmount1, orderPoolKey, parseSwapData, percentToVaultBps, priceRatioToTick, referrerHookData, sqrtPriceLimit, swapDirection, usdcIsCurrencyZero, vaultFeeCalculatorParams };
431
484
  //# sourceMappingURL=index.js.map
@@ -1 +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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"}
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","../../src/utils/creatorVaults.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/**\n * Creator vaults (docs/CREATOR-VAULTS.md in the contracts repo): the approved DividendVault\n * IMPLEMENTATION every new launch clones, and the HolderShareFeeCalculator. Empty until the\n * contracts are deployed; once the calculator is the PositionManager's fee calculator, every\n * launch must attach a vault (`flaunchWithVault`).\n */\nexport const DividendVaultAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xA9E566b548D5D0203e4d00bc3dFdB4BC38883514\",\n};\nexport const HolderShareFeeCalculatorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe5737916951Fe20235Bddef5a65af5d18406f92E\",\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/**\n * Uniswap v4 StateView (canonical periphery view over PoolManager storage).\n *\n * MAINNET ONLY. Arc testnet runs our own PoolManager instance, and no StateView\n * was deployed against it, so there is no testnet entry. The SDK does not\n * depend on StateView on either network: `ReadPoolManager` reads slot0,\n * liquidity, positions and tick data straight from PoolManager storage with\n * `extsload`, using the same slot derivations as Uniswap's StateLibrary. Use\n * that path if you need one code path across both chains.\n */\nexport const StateViewAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b\",\n};\n\n/**\n * IndexerSubscriber: on-chain reverse index PoolId -> (flaunch, memecoin,\n * memecoinTreasury, tokenId). Attached to the PositionManager's Notifier, so it\n * is populated at pool initialisation. See contracts/IndexerSubscriber.sol.\n */\nexport const IndexerSubscriberAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x2c68B21C9f8b899a662A71dd188C1c919D578a9F\",\n [ARC_TESTNET_CHAIN_ID]: \"0xe6d8164d67c60ff860e1a0d90636f5f65b665be7\",\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","import { encodeAbiParameters, isAddressEqual, type Address, type Hex } from \"viem\";\n\n/**\n * Creator vault rules, mirrored from the contracts (and the ubi.fun app):\n * HolderShareFeeCalculator fees are FeeDistributor units (100_00 = 100%),\n * DividendVault shares are SHARE_DENOMINATOR units (100_00 = 100%).\n */\nexport const VAULT_MIN_FEE = 150;\nexport const VAULT_MAX_FEE = 500;\nexport const VAULT_MIN_HOLDER_SHARE = 16_67;\nexport const VAULT_SHARE_DENOMINATOR = 100_00;\n/** The calculator only registers launches whose creator side is 90% or more. */\nexport const VAULT_MIN_CREATOR_ALLOCATION_PERCENT = 90;\n/** DividendVault.MAX_RECIPIENTS is 5, and the creator always takes one of them. */\nexport const VAULT_MAX_SPLIT_RECEIVERS = 4;\n\n/**\n * `feeCalculatorParams` for a launch WITHOUT a vault: a fee of 0. With no fee\n * calculator set the PositionManager never reads them; the vault calculator\n * refuses them (`FeeOutOfRange(0)`), so a launch without a vault that lands\n * after activation reverts instead of creating a token that can never trade.\n */\nexport const NO_VAULT_FEE_CALCULATOR_PARAMS: Hex = encodeAbiParameters(\n [{ type: \"uint256\" }],\n [0n]\n);\n\n/** `feeCalculatorParams` registering a vault launch at `fee` (FeeDistributor units). */\nexport function vaultFeeCalculatorParams(fee: number): Hex {\n return encodeAbiParameters([{ type: \"uint256\" }], [BigInt(fee)]);\n}\n\n/** Basis points of a percent with at most two decimals, at least 1; throws otherwise. */\nexport function percentToVaultBps(percent: number, label: string): number {\n const bps = Math.round(percent * 100);\n if (!Number.isFinite(percent) || bps < 1 || Math.abs(bps - percent * 100) > 1e-6) {\n throw new Error(\n `${label} must be a positive percent with at most 2 decimals, got ${percent}`\n );\n }\n return bps;\n}\n\n/**\n * DividendVault initialize data: `abi.encode(holderShare, recipients, shares)`.\n * Receivers come first and the creator last with the remainder (the vault pays\n * rounding dust to the last recipient), so shares always sum to exactly 100_00.\n */\nexport function encodeVaultInitializeData(params: {\n holderShare: number;\n receivers: { address: Address; bps: number }[];\n creator: Address;\n}): Hex {\n const total = params.receivers.reduce((sum, receiver) => sum + receiver.bps, 0);\n if (total >= VAULT_SHARE_DENOMINATOR) {\n throw new Error(\"splitReceivers total 100% or more; the creator must keep a share\");\n }\n return encodeAbiParameters(\n [{ type: \"uint256\" }, { type: \"address[]\" }, { type: \"uint256[]\" }],\n [\n BigInt(params.holderShare),\n [...params.receivers.map((receiver) => receiver.address), params.creator],\n [\n ...params.receivers.map((receiver) => BigInt(receiver.bps)),\n BigInt(VAULT_SHARE_DENOMINATOR - total),\n ],\n ]\n );\n}\n\n/** What a launch must look like under the calculators set on-chain right now. */\nexport interface LaunchCalculatorState {\n /** The vault calculator is live: every launch must attach its DividendVault. */\n vault: boolean;\n /** `feeCalculatorParams` for a launch without a vault in this state. */\n noVaultParams: Hex;\n}\n\n/**\n * Classifies the PositionManager's two calculator slots. The vault flow is live\n * when this SDK knows the vault and calculator and that calculator is the one\n * set. A launch without a vault sends the no-vault marker while no calculator\n * is set or when the SDK cannot place what is set (fail closed), and empty\n * params only beside a calculator that is certainly not the vault one.\n */\nexport function launchCalculatorState(params: {\n standard: Address;\n fairLaunch: Address;\n vaultCalculator?: Address;\n vaultImplementation?: Address;\n /**\n * TreasuryManagerFactory approval of the vault implementation: the zap only\n * clones an approved one, and would hand the creator NFT to an unapproved\n * implementation itself (no clone, a token that can never trade).\n */\n vaultApproved?: boolean;\n}): LaunchCalculatorState {\n const zero = \"0x0000000000000000000000000000000000000000\";\n const { standard, fairLaunch, vaultCalculator, vaultImplementation, vaultApproved } = params;\n const isZero = (address: Address) => isAddressEqual(address, zero);\n const isOurs = (address: Address) =>\n vaultCalculator !== undefined && isAddressEqual(address, vaultCalculator);\n if (\n vaultImplementation &&\n vaultApproved === true &&\n isOurs(standard) &&\n (isZero(fairLaunch) || isOurs(fairLaunch))\n ) {\n return { vault: true, noVaultParams: NO_VAULT_FEE_CALCULATOR_PARAMS };\n }\n if (\n vaultCalculator &&\n !(isZero(standard) && isZero(fairLaunch)) &&\n !isOurs(standard) &&\n !isOurs(fairLaunch)\n ) {\n return { vault: false, noVaultParams: \"0x\" };\n }\n return { vault: false, noVaultParams: NO_VAULT_FEE_CALCULATOR_PARAMS };\n}\n"],"names":["Q96"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ubi.fun/sdk",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "TypeScript SDK for the ubi.fun protocol on Arc: launch coins, trade USDC pools, and claim creator, referral, and daily holder rewards",
5
5
  "license": "MIT",
6
6
  "author": "ubi.fun",