@whetstone-research/doppler-sdk 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -0
- package/dist/DopplerSDK.js +25 -24
- package/dist/DopplerSDK.mjs +24 -23
- package/dist/abis/bytecodes/derc20.js +2 -2
- package/dist/abis/bytecodes/derc20.mjs +1 -1
- package/dist/abis/bytecodes/derc2080.js +2 -2
- package/dist/abis/bytecodes/derc2080.mjs +1 -1
- package/dist/abis/bytecodes/doppler.js +2 -2
- package/dist/abis/bytecodes/doppler.mjs +1 -1
- package/dist/abis/bytecodes/dopplerDN404.js +2 -2
- package/dist/abis/bytecodes/dopplerDN404.mjs +1 -1
- package/dist/abis/bytecodes/stateView.js +2 -2
- package/dist/abis/bytecodes/stateView.mjs +1 -1
- package/dist/abis/bytecodes.js +10 -10
- package/dist/abis/bytecodes.mjs +5 -5
- package/dist/abis/index.js +10 -10
- package/dist/abis/index.mjs +5 -5
- package/dist/addresses.d.mts +3 -0
- package/dist/addresses.d.ts +3 -0
- package/dist/addresses.js +7 -7
- package/dist/addresses.mjs +2 -2
- package/dist/builders/DynamicAuctionBuilder.d.mts +2 -0
- package/dist/builders/DynamicAuctionBuilder.d.ts +2 -0
- package/dist/builders/DynamicAuctionBuilder.js +16 -15
- package/dist/builders/DynamicAuctionBuilder.mjs +15 -14
- package/dist/builders/MulticurveBuilder.js +16 -15
- package/dist/builders/MulticurveBuilder.mjs +15 -14
- package/dist/builders/StaticAuctionBuilder.js +16 -15
- package/dist/builders/StaticAuctionBuilder.mjs +15 -14
- package/dist/builders/index.js +24 -23
- package/dist/builders/index.mjs +17 -16
- package/dist/builders/shared.d.mts +1 -1
- package/dist/builders/shared.d.ts +1 -1
- package/dist/builders/shared.js +17 -16
- package/dist/builders/shared.mjs +13 -12
- package/dist/{chunk-AZOBEWP3.mjs → chunk-3NMGCQJ4.mjs} +2 -2
- package/dist/chunk-3NMGCQJ4.mjs.map +1 -0
- package/dist/{chunk-OGYWNJGI.js → chunk-5TQOT6CW.js} +2 -2
- package/dist/chunk-5TQOT6CW.js.map +1 -0
- package/dist/{chunk-GFOBDFVW.js → chunk-6UHDSD42.js} +206 -28
- package/dist/chunk-6UHDSD42.js.map +1 -0
- package/dist/{chunk-JHPDKSC4.js → chunk-7CAAI5DL.js} +115 -84
- package/dist/chunk-7CAAI5DL.js.map +1 -0
- package/dist/{chunk-U7CHPFU6.mjs → chunk-7P2SPZC7.mjs} +189 -11
- package/dist/chunk-7P2SPZC7.mjs.map +1 -0
- package/dist/chunk-7ZUV6WPX.mjs +3 -0
- package/dist/{chunk-5TL5V6UX.mjs.map → chunk-7ZUV6WPX.mjs.map} +1 -1
- package/dist/{chunk-SQRQYDB3.mjs → chunk-C6MH7HYT.mjs} +11 -11
- package/dist/{chunk-SQRQYDB3.mjs.map → chunk-C6MH7HYT.mjs.map} +1 -1
- package/dist/{chunk-RJE6LWWF.mjs → chunk-CATH4QRQ.mjs} +3 -3
- package/dist/{chunk-RJE6LWWF.mjs.map → chunk-CATH4QRQ.mjs.map} +1 -1
- package/dist/{chunk-5JQDXMDN.js → chunk-CMNJZKTM.js} +24 -24
- package/dist/{chunk-5JQDXMDN.js.map → chunk-CMNJZKTM.js.map} +1 -1
- package/dist/chunk-DNB3T5P2.js +269 -0
- package/dist/chunk-DNB3T5P2.js.map +1 -0
- package/dist/chunk-DSYPZETD.js +4 -0
- package/dist/{chunk-WTS75RUC.js.map → chunk-DSYPZETD.js.map} +1 -1
- package/dist/{chunk-GLMPU7VL.js → chunk-EH3V2BJF.js} +12 -12
- package/dist/chunk-EH3V2BJF.js.map +1 -0
- package/dist/{chunk-36Y3N257.mjs → chunk-EIXUJANI.mjs} +5 -5
- package/dist/chunk-EIXUJANI.mjs.map +1 -0
- package/dist/{chunk-HX3A6ALC.mjs → chunk-FFV6DMPA.mjs} +3 -3
- package/dist/{chunk-HX3A6ALC.mjs.map → chunk-FFV6DMPA.mjs.map} +1 -1
- package/dist/{chunk-NJYBKWCD.mjs → chunk-FLFYAWSS.mjs} +3 -3
- package/dist/{chunk-NJYBKWCD.mjs.map → chunk-FLFYAWSS.mjs.map} +1 -1
- package/dist/{chunk-N33R22A2.js → chunk-FNUBKONK.js} +2 -2
- package/dist/{chunk-N33R22A2.js.map → chunk-FNUBKONK.js.map} +1 -1
- package/dist/{chunk-COUZYFEE.js → chunk-FTRCBE3J.js} +11 -11
- package/dist/{chunk-COUZYFEE.js.map → chunk-FTRCBE3J.js.map} +1 -1
- package/dist/{chunk-HHHCRTC7.js → chunk-FZ4FIWCR.js} +5 -5
- package/dist/{chunk-HHHCRTC7.js.map → chunk-FZ4FIWCR.js.map} +1 -1
- package/dist/chunk-GDODJJ7D.mjs +36 -0
- package/dist/chunk-GDODJJ7D.mjs.map +1 -0
- package/dist/{chunk-MQNSJCAW.mjs → chunk-GSBQIVME.mjs} +2 -2
- package/dist/{chunk-MQNSJCAW.mjs.map → chunk-GSBQIVME.mjs.map} +1 -1
- package/dist/{chunk-RKPAL3SU.mjs → chunk-GSTY3GO7.mjs} +3 -3
- package/dist/{chunk-RKPAL3SU.mjs.map → chunk-GSTY3GO7.mjs.map} +1 -1
- package/dist/{chunk-4CJS5XLY.js → chunk-H7WPK5CR.js} +4 -4
- package/dist/{chunk-4CJS5XLY.js.map → chunk-H7WPK5CR.js.map} +1 -1
- package/dist/{chunk-SAX7P3MH.js → chunk-HJFVRV47.js} +2 -2
- package/dist/{chunk-SAX7P3MH.js.map → chunk-HJFVRV47.js.map} +1 -1
- package/dist/{chunk-CXE33IZN.mjs → chunk-HL7ZAAD4.mjs} +19 -7
- package/dist/chunk-HL7ZAAD4.mjs.map +1 -0
- package/dist/{chunk-2ZM4JVFC.js → chunk-J62YDWIK.js} +2 -2
- package/dist/chunk-J62YDWIK.js.map +1 -0
- package/dist/{chunk-TYJZL2XZ.js → chunk-JB5XXPLL.js} +25 -13
- package/dist/chunk-JB5XXPLL.js.map +1 -0
- package/dist/{chunk-WDSV4O6T.mjs → chunk-OHA5KJ2M.mjs} +2 -2
- package/dist/chunk-OHA5KJ2M.mjs.map +1 -0
- package/dist/{chunk-AS5UUJRI.js → chunk-OX5CESVM.js} +13 -11
- package/dist/chunk-OX5CESVM.js.map +1 -0
- package/dist/{chunk-VGOEXLQ2.js → chunk-QAPQGDWK.js} +2 -2
- package/dist/chunk-QAPQGDWK.js.map +1 -0
- package/dist/{chunk-OF7BIKXV.js → chunk-QRTABC4Z.js} +2 -2
- package/dist/chunk-QRTABC4Z.js.map +1 -0
- package/dist/{chunk-XEWKLVOD.mjs → chunk-RI6SDMER.mjs} +3 -3
- package/dist/{chunk-XEWKLVOD.mjs.map → chunk-RI6SDMER.mjs.map} +1 -1
- package/dist/{chunk-NWZGO2CH.mjs → chunk-RIIVW6TQ.mjs} +43 -12
- package/dist/chunk-RIIVW6TQ.mjs.map +1 -0
- package/dist/{chunk-VK5HAWX6.mjs → chunk-SWWLOD7Q.mjs} +2 -2
- package/dist/chunk-SWWLOD7Q.mjs.map +1 -0
- package/dist/{chunk-Y5RAENN5.js → chunk-TIGHBA37.js} +5 -5
- package/dist/{chunk-Y5RAENN5.js.map → chunk-TIGHBA37.js.map} +1 -1
- package/dist/{chunk-BFJGY436.mjs → chunk-TLEVIIUE.mjs} +5 -3
- package/dist/chunk-TLEVIIUE.mjs.map +1 -0
- package/dist/{chunk-LPA32BIK.mjs → chunk-U3GOWK6J.mjs} +2 -2
- package/dist/chunk-U3GOWK6J.mjs.map +1 -0
- package/dist/{chunk-V7YRKFYK.mjs → chunk-VCX6FG3E.mjs} +5 -5
- package/dist/{chunk-V7YRKFYK.mjs.map → chunk-VCX6FG3E.mjs.map} +1 -1
- package/dist/{chunk-64ZQRKG3.mjs → chunk-VYSOAGRU.mjs} +2 -2
- package/dist/chunk-VYSOAGRU.mjs.map +1 -0
- package/dist/chunk-WJBJARLJ.js +38 -0
- package/dist/chunk-WJBJARLJ.js.map +1 -0
- package/dist/{chunk-OROTK4OT.js → chunk-WNUB3UTT.js} +12 -12
- package/dist/chunk-WNUB3UTT.js.map +1 -0
- package/dist/{chunk-SMTHFPBA.js → chunk-XMFOZYNI.js} +2 -2
- package/dist/chunk-XMFOZYNI.js.map +1 -0
- package/dist/chunk-XRYLHTVV.mjs +267 -0
- package/dist/chunk-XRYLHTVV.mjs.map +1 -0
- package/dist/{chunk-K27G7LLT.js → chunk-XT3BAM4H.js} +5 -5
- package/dist/{chunk-K27G7LLT.js.map → chunk-XT3BAM4H.js.map} +1 -1
- package/dist/{chunk-VGCXJRUV.mjs → chunk-YBK6EBA5.mjs} +10 -10
- package/dist/chunk-YBK6EBA5.mjs.map +1 -0
- package/dist/{chunk-545TB6TH.js → chunk-YFEPTSI2.js} +11 -11
- package/dist/{chunk-545TB6TH.js.map → chunk-YFEPTSI2.js.map} +1 -1
- package/dist/{chunk-HH7HQ4HC.mjs → chunk-ZEDJUNC6.mjs} +2 -2
- package/dist/{chunk-HH7HQ4HC.mjs.map → chunk-ZEDJUNC6.mjs.map} +1 -1
- package/dist/deployments.generated.d.mts +39 -19
- package/dist/deployments.generated.d.ts +39 -19
- package/dist/deployments.generated.js +2 -2
- package/dist/deployments.generated.mjs +1 -1
- package/dist/entities/DopplerFactory.js +14 -13
- package/dist/entities/DopplerFactory.mjs +13 -12
- package/dist/entities/auction/DynamicAuction.js +9 -9
- package/dist/entities/auction/DynamicAuction.mjs +8 -8
- package/dist/entities/auction/MulticurvePool.js +10 -10
- package/dist/entities/auction/MulticurvePool.mjs +9 -9
- package/dist/entities/auction/StaticAuction.js +9 -9
- package/dist/entities/auction/StaticAuction.mjs +8 -8
- package/dist/entities/auction/index.js +17 -17
- package/dist/entities/auction/index.mjs +11 -11
- package/dist/entities/quoter/Quoter.js +9 -9
- package/dist/entities/quoter/Quoter.mjs +8 -8
- package/dist/entities/quoter/index.js +9 -9
- package/dist/entities/quoter/index.mjs +8 -8
- package/dist/entities/token/derc20/Derc20.js +5 -5
- package/dist/entities/token/derc20/Derc20.mjs +5 -5
- package/dist/entities/token/derc20/index.js +5 -5
- package/dist/entities/token/derc20/index.mjs +5 -5
- package/dist/entities/token/index.js +6 -6
- package/dist/entities/token/index.mjs +6 -6
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +71 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -23
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.mts +33 -5
- package/dist/types.d.ts +33 -5
- package/dist/types.js +8 -8
- package/dist/types.mjs +3 -3
- package/dist/utils/airlock.js +7 -7
- package/dist/utils/airlock.mjs +3 -3
- package/dist/utils/dopplerHookMigrator.d.mts +11 -0
- package/dist/utils/dopplerHookMigrator.d.ts +11 -0
- package/dist/utils/dopplerHookMigrator.js +12 -0
- package/dist/utils/dopplerHookMigrator.js.map +1 -0
- package/dist/utils/dopplerHookMigrator.mjs +3 -0
- package/dist/utils/dopplerHookMigrator.mjs.map +1 -0
- package/dist/utils/index.d.mts +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +36 -31
- package/dist/utils/index.mjs +12 -11
- package/dist/utils/marketCapHelpers.js +13 -13
- package/dist/utils/marketCapHelpers.mjs +1 -1
- package/dist/utils/tokenAddressMiner.js +7 -7
- package/dist/utils/tokenAddressMiner.mjs +6 -6
- package/package.json +1 -1
- package/dist/chunk-2ZM4JVFC.js.map +0 -1
- package/dist/chunk-36Y3N257.mjs.map +0 -1
- package/dist/chunk-5TL5V6UX.mjs +0 -3
- package/dist/chunk-64ZQRKG3.mjs.map +0 -1
- package/dist/chunk-AS5UUJRI.js.map +0 -1
- package/dist/chunk-AZOBEWP3.mjs.map +0 -1
- package/dist/chunk-BFJGY436.mjs.map +0 -1
- package/dist/chunk-CXE33IZN.mjs.map +0 -1
- package/dist/chunk-GFOBDFVW.js.map +0 -1
- package/dist/chunk-GLMPU7VL.js.map +0 -1
- package/dist/chunk-JHPDKSC4.js.map +0 -1
- package/dist/chunk-LPA32BIK.mjs.map +0 -1
- package/dist/chunk-NWZGO2CH.mjs.map +0 -1
- package/dist/chunk-OF7BIKXV.js.map +0 -1
- package/dist/chunk-OGYWNJGI.js.map +0 -1
- package/dist/chunk-OROTK4OT.js.map +0 -1
- package/dist/chunk-QFQXHDC7.mjs +0 -247
- package/dist/chunk-QFQXHDC7.mjs.map +0 -1
- package/dist/chunk-RLUMYHPI.js +0 -249
- package/dist/chunk-RLUMYHPI.js.map +0 -1
- package/dist/chunk-SMTHFPBA.js.map +0 -1
- package/dist/chunk-TYJZL2XZ.js.map +0 -1
- package/dist/chunk-U7CHPFU6.mjs.map +0 -1
- package/dist/chunk-VGCXJRUV.mjs.map +0 -1
- package/dist/chunk-VGOEXLQ2.js.map +0 -1
- package/dist/chunk-VK5HAWX6.mjs.map +0 -1
- package/dist/chunk-WDSV4O6T.mjs.map +0 -1
- package/dist/chunk-WTS75RUC.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/marketCapHelpers.ts"],"names":["MAX_TICK","MIN_TICK","isToken0Expected"],"mappings":"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","file":"chunk-N33R22A2.js","sourcesContent":["/**\n * Market cap conversion utilities for token launches\n *\n * These utilities convert between market cap (USD) and Uniswap ticks\n * following the mathematical relationship:\n *\n * Market Cap (USD) → Token Price (USD) → Ratio (numeraire/token) → Tick\n *\n * Based on reference implementation: plan/priceMultiCurve.py\n */\n\nimport type { Address } from 'viem';\nimport type {\n MarketCapRange,\n MarketCapValidationResult,\n StaticAuctionTickParams,\n DynamicAuctionTickParams,\n MulticurveTickRangeParams,\n MulticurveTickParams,\n TickToMarketCapParams,\n} from '../types';\nimport { MIN_TICK, MAX_TICK } from './tickMath';\nimport { isToken0Expected } from './isToken0Expected';\n\n// Re-export types from types.ts for convenience\nexport type {\n MarketCapRange,\n MarketCapValidationResult,\n StaticAuctionTickParams,\n DynamicAuctionTickParams,\n MulticurveTickRangeParams,\n MulticurveTickParams,\n TickToMarketCapParams,\n} from '../types';\n\nexport function getMaxTickRounded(tickSpacing: number): number {\n return Math.floor(MAX_TICK / tickSpacing) * tickSpacing\n}\n\n/**\n * Convert market cap to token price\n *\n * @param marketCapUSD - Market capitalization in USD\n * @param tokenSupply - Total token supply (as bigint with decimals, e.g., parseEther('1000000000'))\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Price of one token in USD\n *\n * @example\n * ```ts\n * // $1M market cap with 1B tokens (18 decimals)\n * const price = marketCapToTokenPrice(1_000_000, parseEther('1000000000'))\n * // Returns: 0.001 (each token is worth $0.001)\n * ```\n */\nexport function marketCapToTokenPrice(\n marketCapUSD: number,\n tokenSupply: bigint,\n tokenDecimals: number = 18,\n): number {\n if (marketCapUSD <= 0) {\n throw new Error('Market cap must be positive');\n }\n if (tokenSupply <= 0n) {\n throw new Error('Token supply must be positive');\n }\n\n // Convert supply from bigint with decimals to human-readable number\n const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;\n return marketCapUSD / supplyNum;\n}\n\n/**\n * Convert token price to price ratio (numeraire per token)\n *\n * @param tokenPriceUSD - Price of one token in USD\n * @param numerairePriceUSD - Price of numeraire (e.g., ETH) in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @returns Price ratio adjusted for decimals\n *\n * @example\n * ```ts\n * // Token at $0.001, ETH at $3000, both 18 decimals\n * const ratio = tokenPriceToRatio(0.001, 3000, 18, 18)\n * // Returns: 3,000,000 (3M ETH wei per token wei at this ratio)\n * ```\n */\nexport function tokenPriceToRatio(\n tokenPriceUSD: number,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18,\n): number {\n if (tokenPriceUSD <= 0) {\n throw new Error('Token price must be positive');\n }\n if (numerairePriceUSD <= 0) {\n throw new Error('Numeraire price must be positive');\n }\n\n // How much numeraire per token (in USD terms first)\n // numerairePriceUSD / tokenPriceUSD = numeraire units per token\n const ratio = numerairePriceUSD / tokenPriceUSD;\n\n // Adjust for decimal differences\n // Formula: (numeraire / tokenPrice) * (10 ** (assetDecimals - numeraireDecimals))\n const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);\n\n return ratio * decimalAdjustment;\n}\n\n/**\n * Convert ratio to tick using Uniswap's formula: tick = log(ratio) / log(1.0001)\n *\n * @param ratio - Price ratio (must be positive)\n * @returns Raw tick value (before spacing adjustment)\n *\n * @example\n * ```ts\n * ratioToTick(1) // Returns: 0\n * ratioToTick(1.0001) // Returns: ~1\n * ratioToTick(Math.pow(1.0001, 1000)) // Returns: ~1000\n * ```\n */\nexport function ratioToTick(ratio: number): number {\n if (ratio <= 0) {\n throw new Error('Ratio must be positive');\n }\n\n // Uniswap tick formula: tick = log(price) / log(1.0001)\n return Math.log(ratio) / Math.log(1.0001);\n}\n\n/**\n * Determine if the new token will be token1 in the Uniswap pair\n *\n * Uniswap orders tokens by address (token0 < token1 in hex comparison).\n * This affects how ticks are interpreted for price calculations.\n *\n * @param tokenAddress - Address of the new token\n * @param numeraireAddress - Address of the numeraire (e.g., WETH)\n * @returns true if token will be token1, false if token0\n *\n * @example\n * ```ts\n * isToken1('0xB000...', '0xA000...') // true (B > A)\n * isToken1('0xA000...', '0xB000...') // false (A < B)\n * ```\n */\nexport function isToken1(\n tokenAddress: string,\n numeraireAddress: string,\n): boolean {\n return tokenAddress.toLowerCase() > numeraireAddress.toLowerCase();\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// CORE TICK COMPUTATION (Internal)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Core tick computation - NO sign manipulation.\n * Returns the raw mathematical tick for a given market cap.\n *\n * @internal Not exported - use auction-specific functions instead.\n */\nfunction _computeRawTick(\n marketCapUSD: number,\n tokenSupply: bigint,\n numerairePriceUSD: number,\n tokenDecimals: number,\n numeraireDecimals: number,\n tickSpacing: number,\n): number {\n if (marketCapUSD <= 0) {\n throw new Error('Market cap must be positive');\n }\n\n // Step 1: Market cap → token price\n const tokenPrice = marketCapToTokenPrice(\n marketCapUSD,\n tokenSupply,\n tokenDecimals,\n );\n\n // Step 2: Token price → ratio\n const ratio = tokenPriceToRatio(\n tokenPrice,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n );\n\n // Step 3: Ratio → raw tick\n const rawTick = ratioToTick(ratio);\n\n // Step 4: Align to tick spacing (floor division)\n const alignedTick = Math.floor(rawTick / tickSpacing) * tickSpacing;\n\n // Step 5: Bounds check\n if (alignedTick < MIN_TICK || alignedTick > MAX_TICK) {\n throw new Error(\n `Calculated tick ${alignedTick} is out of bounds [${MIN_TICK}, ${MAX_TICK}]. ` +\n `Market cap ${marketCapUSD.toLocaleString()} may be too extreme for the given parameters.`,\n );\n }\n\n return alignedTick;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// AUCTION-SPECIFIC TICK FUNCTIONS\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Convert market cap range to ticks for V3 Static Auctions.\n *\n * V3 Static auctions ALWAYS use positive ticks with startTick < endTick.\n * This is because CREATE2 mining ensures token address > numeraire (token1).\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { startTick, endTick } - positive ticks, startTick < endTick\n *\n * @example\n * ```ts\n * const { startTick, endTick } = marketCapToTicksForStaticAuction({\n * marketCapRange: { start: 100_000, end: 10_000_000 },\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 3000,\n * tickSpacing: 60,\n * })\n * // Returns: { startTick: 120000, endTick: 170000 } (both positive)\n * ```\n */\nexport function marketCapToTicksForStaticAuction(\n params: StaticAuctionTickParams,\n): { startTick: number; endTick: number } {\n const {\n marketCapRange,\n tokenSupply,\n numerairePriceUSD,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n if (marketCapRange.start <= 0) {\n throw new Error('Start market cap must be positive');\n }\n if (marketCapRange.end <= 0) {\n throw new Error('End market cap must be positive');\n }\n if (marketCapRange.start >= marketCapRange.end) {\n throw new Error('Start market cap must be less than end market cap');\n }\n\n // Compute raw ticks\n const tickAtStart = _computeRawTick(\n marketCapRange.start,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n const tickAtEnd = _computeRawTick(\n marketCapRange.end,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // V3 Static: Always positive ticks, startTick < endTick\n // Take absolute value and ensure proper ordering\n const startTick = Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n const endTick = Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range ${marketCapRange.start.toLocaleString()} - ${marketCapRange.end.toLocaleString()} ` +\n `resulted in same tick (${startTick}). Try a wider range or smaller tick spacing.`,\n );\n }\n\n return { startTick, endTick };\n}\n\n/**\n * Convert market cap range to ticks for V4 Dynamic Auctions (Doppler).\n *\n * Dynamic auctions compute tick sign based on expected token ordering:\n * - Token1 (ETH numeraire): positive ticks, startTick < endTick\n * - Token0 (stablecoin numeraire): negative ticks, startTick > endTick\n *\n * Unlike Multicurve, Doppler contract does NOT auto-flip ticks.\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { startTick, endTick } with correct sign and ordering for Doppler contract\n *\n * @example\n * ```ts\n * // ETH numeraire (token1) - positive ticks\n * const eth = marketCapToTicksForDynamicAuction({\n * marketCapRange: { start: 50_000, end: 500_000 },\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 3000,\n * numeraire: WETH_ADDRESS,\n * tickSpacing: 30,\n * })\n * // Returns: { startTick: 120000, endTick: 170000 } (positive, ascending)\n *\n * // USDC numeraire (token0) - negative ticks\n * const usdc = marketCapToTicksForDynamicAuction({\n * marketCapRange: { start: 50_000, end: 500_000 },\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 1,\n * numeraire: USDC_ADDRESS,\n * tickSpacing: 30,\n * tokenDecimals: 18,\n * numeraireDecimals: 6,\n * })\n * // Returns: { startTick: -120000, endTick: -170000 } (negative, descending)\n * ```\n */\nexport function marketCapToTicksForDynamicAuction(\n params: DynamicAuctionTickParams,\n): { startTick: number; endTick: number } {\n const {\n marketCapRange,\n tokenSupply,\n numerairePriceUSD,\n numeraire,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n if (marketCapRange.start <= 0 || marketCapRange.end <= 0) {\n throw new Error('Market cap values must be positive');\n }\n if (marketCapRange.start >= marketCapRange.end) {\n throw new Error('Start market cap must be less than end market cap');\n }\n\n // Compute raw ticks\n const tickAtStart = _computeRawTick(\n marketCapRange.start,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n const tickAtEnd = _computeRawTick(\n marketCapRange.end,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // Determine token ordering from numeraire address\n const tokenIsToken0 = isToken0Expected(numeraire);\n\n if (tokenIsToken0) {\n // Token0 (stablecoin numeraire): negative ticks, startTick > endTick\n const startTick = -Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n const endTick = -Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range resulted in same tick (${startTick}). Try a wider range.`,\n );\n }\n\n return { startTick, endTick }; // e.g., { -120000, -170000 }\n } else {\n // Token1 (ETH numeraire): positive ticks, startTick < endTick\n const startTick = Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n const endTick = Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range resulted in same tick (${startTick}). Try a wider range.`,\n );\n }\n\n return { startTick, endTick }; // e.g., { 120000, 170000 }\n }\n}\n\n/**\n * Convert market cap range to ticks for V4 Multicurve pools.\n *\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n * The contract's adjustCurves() handles token ordering internally.\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { tickLower, tickUpper } - tick range where tickLower < tickUpper\n *\n * @example\n * ```ts\n * const { tickLower, tickUpper } = marketCapToTicksForMulticurve({\n * marketCapLower: 500_000,\n * marketCapUpper: 5_000_000,\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 3000,\n * tickSpacing: 60,\n * })\n * ```\n */\nexport function marketCapToTicksForMulticurve(\n params: MulticurveTickRangeParams,\n): { tickLower: number; tickUpper: number } {\n const {\n marketCapLower,\n marketCapUpper,\n tokenSupply,\n numerairePriceUSD,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n if (marketCapLower <= 0) {\n throw new Error('Lower market cap must be positive');\n }\n if (marketCapUpper !== 'max' && marketCapUpper <= 0) {\n throw new Error('Upper market cap must be positive');\n }\n if (marketCapUpper !== 'max' && marketCapLower >= marketCapUpper) {\n throw new Error('Lower market cap must be less than upper market cap');\n }\n\n // Compute raw ticks\n const tickAtLower = -_computeRawTick(\n marketCapLower,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n const tickAtUpper = marketCapUpper === 'max'\n ? getMaxTickRounded(tickSpacing)\n : -_computeRawTick(\n marketCapUpper,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // Use natural tick ordering (lower market cap = lower tick value)\n const tickLower = Math.min(tickAtLower, tickAtUpper);\n const tickUpper = Math.max(tickAtLower, tickAtUpper);\n\n if (tickLower === tickUpper) {\n const upperLabel = marketCapUpper === 'max' ? 'max' : `$${marketCapUpper.toLocaleString()}`;\n throw new Error(\n `Market cap range $${marketCapLower.toLocaleString()} - ${upperLabel} ` +\n `resulted in same tick (${tickLower}). Try a wider range or smaller tick spacing.`,\n );\n }\n\n return { tickLower, tickUpper };\n}\n\n/**\n * Convert a single market cap to a tick for Multicurve use cases.\n *\n * Used for farTick and pegTick calculations.\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n *\n * @param params - Configuration object with market cap and token parameters\n * @returns Tick value (sign depends on price ratio)\n *\n * @example\n * ```ts\n * const farTick = marketCapToTickForMulticurve({\n * marketCapUSD: 50_000_000,\n * tokenSupply: supply,\n * numerairePriceUSD: 3000,\n * tickSpacing: 60,\n * })\n * ```\n */\nexport function marketCapToTickForMulticurve(\n params: MulticurveTickParams,\n): number {\n const {\n marketCapUSD,\n tokenSupply,\n numerairePriceUSD,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n // Multicurve uses a canonical tick space where the contract's adjustCurves()\n // resolves token ordering. This must match marketCapToTicksForMulticurve().\n const rawTick = -_computeRawTick(\n marketCapUSD,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // Normalize -0 to 0\n return rawTick === 0 ? 0 : rawTick;\n}\n\n/**\n * Apply curvature offsets to a peg tick for Multicurve positions.\n *\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n * The contract's adjustCurves() handles token ordering internally.\n *\n * @example\n * ```ts\n * // Peg at 200000, curve extends 10000 ticks toward higher market cap\n * applyTickOffsets(200000, 0, 10000, WETH)\n * // Returns: { tickLower: 200000, tickUpper: 210000 }\n * ```\n */\nexport function applyTickOffsets(\n pegTick: number,\n offsetLower: number,\n offsetUpper: number,\n numeraire: Address,\n): { tickLower: number; tickUpper: number } {\n void numeraire; // Kept for API compatibility\n return {\n tickLower: pegTick + offsetLower,\n tickUpper: pegTick + offsetUpper,\n };\n}\n\n/**\n * Validate market cap parameters and return warnings for unusual values\n *\n * This doesn't prevent execution but helps catch potential mistakes:\n * - Very small market caps (< $1,000)\n * - Very large market caps (> $1 trillion)\n * - Extreme token prices (< $0.000001 or > $1M)\n *\n * @param marketCap - Market cap value to validate\n * @param tokenSupply - Token supply (with decimals)\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Validation result with warnings array\n *\n * @example\n * ```ts\n * const result = validateMarketCapParameters(500, parseEther('1000000'))\n * if (result.warnings.length > 0) {\n * console.warn('Warnings:', result.warnings)\n * }\n * ```\n */\nexport function validateMarketCapParameters(\n marketCap: number,\n tokenSupply: bigint,\n tokenDecimals: number = 18,\n): MarketCapValidationResult {\n const warnings: string[] = [];\n\n // Check for unreasonably small market caps\n if (marketCap < 1000) {\n warnings.push(\n `Market cap $${marketCap.toLocaleString()} is very small. Consider if this is intentional.`,\n );\n }\n\n // Check for unreasonably large market caps\n if (marketCap > 1_000_000_000_000) {\n warnings.push(\n `Market cap $${marketCap.toLocaleString()} is very large (> $1T). Verify this is correct.`,\n );\n }\n\n // Calculate implied token price\n const tokenPrice = marketCapToTokenPrice(\n marketCap,\n tokenSupply,\n tokenDecimals,\n );\n\n // Check for extremely small token prices\n if (tokenPrice < 0.000001) {\n warnings.push(\n `Implied token price $${tokenPrice.toExponential(2)} is very small. ` +\n `This may cause precision issues.`,\n );\n }\n\n // Check for extremely large token prices\n if (tokenPrice > 1_000_000) {\n warnings.push(\n `Implied token price $${tokenPrice.toLocaleString()} is very large. ` +\n `Verify your token supply and market cap values.`,\n );\n }\n\n return {\n valid: warnings.length === 0,\n warnings,\n };\n}\n\n/**\n * Calculate market cap from a tick (reverse conversion)\n *\n * Useful for displaying what market cap a given tick represents.\n * Works with ticks from any auction type (Static, Dynamic, Multicurve).\n *\n * @param params - Configuration object with tick and token parameters\n * @returns Market cap in USD\n *\n * @example\n * ```ts\n * // Works with negative ticks (Multicurve)\n * tickToMarketCap({\n * tick: -156000,\n * tokenSupply: supply,\n * numerairePriceUSD: 3000,\n * })\n *\n * // Works with positive ticks (Static/Dynamic)\n * tickToMarketCap({\n * tick: 156000,\n * tokenSupply: supply,\n * numerairePriceUSD: 3000,\n * })\n * ```\n */\nexport function tickToMarketCap(params: TickToMarketCapParams): number {\n const {\n tick,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n // Use absolute value since tick sign varies by auction type\n // but the underlying ratio is always positive\n const adjustedTick = Math.abs(tick);\n\n // Tick → ratio (reverse of ratioToTick)\n const ratio = Math.pow(1.0001, adjustedTick);\n\n // Ratio → token price (reverse of tokenPriceToRatio)\n // ratio = (numerairePriceUSD / tokenPriceUSD) * 10^(tokenDecimals - numeraireDecimals)\n // tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment)\n const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);\n const tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment);\n\n // Token price → market cap (reverse of marketCapToTokenPrice)\n const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;\n return tokenPriceUSD * supplyNum;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/marketCapHelpers.ts"],"names":["MAX_TICK","MIN_TICK","isToken0Expected"],"mappings":";;;;;;AAmCO,SAAS,kBAAkB,WAAA,EAA6B;AAC7D,EAAA,OAAO,IAAA,CAAK,KAAA,CAAMA,yBAAA,GAAW,WAAW,CAAA,GAAI,WAAA;AAC9C;AAiBO,SAAS,qBAAA,CACd,YAAA,EACA,WAAA,EACA,aAAA,GAAwB,EAAA,EAChB;AACR,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,WAAW,CAAA,GAAI,EAAA,IAAM,aAAA;AAC9C,EAAA,OAAO,YAAA,GAAe,SAAA;AACxB;AAkBO,SAAS,kBACd,aAAA,EACA,iBAAA,EACA,aAAA,GAAwB,EAAA,EACxB,oBAA4B,EAAA,EACpB;AACR,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AAIA,EAAA,MAAM,QAAQ,iBAAA,GAAoB,aAAA;AAIlC,EAAA,MAAM,iBAAA,GAAoB,OAAO,aAAA,GAAgB,iBAAA,CAAA;AAEjD,EAAA,OAAO,KAAA,GAAQ,iBAAA;AACjB;AAeO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC1C;AAGA,EAAA,OAAO,KAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,MAAM,CAAA;AAC1C;AAkBO,SAAS,QAAA,CACd,cACA,gBAAA,EACS;AACT,EAAA,OAAO,YAAA,CAAa,WAAA,EAAY,GAAI,gBAAA,CAAiB,WAAA,EAAY;AACnE;AAYA,SAAS,gBACP,YAAA,EACA,WAAA,EACA,iBAAA,EACA,aAAA,EACA,mBACA,WAAA,EACQ;AACR,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,UAAA,GAAa,qBAAA;AAAA,IACjB,YAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,KAAA,GAAQ,iBAAA;AAAA,IACZ,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,OAAA,GAAU,YAAY,KAAK,CAAA;AAGjC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,WAAW,CAAA,GAAI,WAAA;AAGxD,EAAA,IAAI,WAAA,GAAcC,yBAAA,IAAY,WAAA,GAAcD,yBAAA,EAAU;AACpD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gBAAA,EAAmB,WAAW,CAAA,mBAAA,EAAsBC,yBAAQ,KAAKD,yBAAQ,CAAA,cAAA,EACzD,YAAA,CAAa,cAAA,EAAgB,CAAA,6CAAA;AAAA,KAC/C;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;AA0BO,SAAS,iCACd,MAAA,EACwC;AACxC,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAEJ,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,cAAA,CAAe,KAAA,IAAS,cAAA,CAAe,GAAA,EAAK;AAC9C,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAGA,EAAA,MAAM,WAAA,GAAc,eAAA;AAAA,IAClB,cAAA,CAAe,KAAA;AAAA,IACf,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,SAAA,GAAY,eAAA;AAAA,IAChB,cAAA,CAAe,GAAA;AAAA,IACf,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAEnE,EAAA,IAAI,cAAc,OAAA,EAAS;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,iBAAA,EAAoB,cAAA,CAAe,KAAA,CAAM,cAAA,EAAgB,CAAA,GAAA,EAAM,cAAA,CAAe,GAAA,CAAI,cAAA,EAAgB,CAAA,wBAAA,EACtE,SAAS,CAAA,6CAAA;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAC9B;AAuCO,SAAS,kCACd,MAAA,EACwC;AACxC,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAEJ,EAAA,IAAI,cAAA,CAAe,KAAA,IAAS,CAAA,IAAK,cAAA,CAAe,OAAO,CAAA,EAAG;AACxD,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,cAAA,CAAe,KAAA,IAAS,cAAA,CAAe,GAAA,EAAK;AAC9C,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAGA,EAAA,MAAM,WAAA,GAAc,eAAA;AAAA,IAClB,cAAA,CAAe,KAAA;AAAA,IACf,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,SAAA,GAAY,eAAA;AAAA,IAChB,cAAA,CAAe,GAAA;AAAA,IACf,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,aAAA,GAAgBE,kCAAiB,SAAS,CAAA;AAEhD,EAAA,IAAI,aAAA,EAAe;AAEjB,IAAA,MAAM,SAAA,GAAY,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAEpE,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,2CAA2C,SAAS,CAAA,qBAAA;AAAA,OACtD;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAAA,EAC9B,CAAA,MAAO;AAEL,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACrE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAEnE,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,2CAA2C,SAAS,CAAA,qBAAA;AAAA,OACtD;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAAA,EAC9B;AACF;AAsBO,SAAS,8BACd,MAAA,EAC0C;AAC1C,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAEJ,EAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,cAAA,KAAmB,KAAA,IAAS,cAAA,IAAkB,CAAA,EAAG;AACnD,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,cAAA,KAAmB,KAAA,IAAS,cAAA,IAAkB,cAAA,EAAgB;AAChE,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAGA,EAAA,MAAM,cAAc,CAAC,eAAA;AAAA,IACnB,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,cACJ,cAAA,KAAmB,KAAA,GACf,iBAAA,CAAkB,WAAW,IAC7B,CAAC,eAAA;AAAA,IACC,cAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAGN,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,WAAW,CAAA;AACnD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,WAAW,CAAA;AAEnD,EAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,IAAA,MAAM,aACJ,cAAA,KAAmB,KAAA,GAAQ,QAAQ,CAAA,CAAA,EAAI,cAAA,CAAe,gBAAgB,CAAA,CAAA;AACxE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,qBAAqB,cAAA,CAAe,cAAA,EAAgB,CAAA,GAAA,EAAM,UAAU,2BACxC,SAAS,CAAA,6CAAA;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAChC;AAqBO,SAAS,6BACd,MAAA,EACQ;AACR,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAIJ,EAAA,MAAM,UAAU,CAAC,eAAA;AAAA,IACf,YAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,OAAO,OAAA,KAAY,IAAI,CAAA,GAAI,OAAA;AAC7B;AAeO,SAAS,gBAAA,CACd,OAAA,EACA,WAAA,EACA,WAAA,EACA,SAAA,EAC0C;AAE1C,EAAA,OAAO;AAAA,IACL,WAAW,OAAA,GAAU,WAAA;AAAA,IACrB,WAAW,OAAA,GAAU;AAAA,GACvB;AACF;AAuBO,SAAS,2BAAA,CACd,SAAA,EACA,WAAA,EACA,aAAA,GAAwB,EAAA,EACG;AAC3B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI,YAAY,GAAA,EAAM;AACpB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,YAAA,EAAe,SAAA,CAAU,cAAA,EAAgB,CAAA,gDAAA;AAAA,KAC3C;AAAA,EACF;AAGA,EAAA,IAAI,YAAY,IAAA,EAAmB;AACjC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,YAAA,EAAe,SAAA,CAAU,cAAA,EAAgB,CAAA,+CAAA;AAAA,KAC3C;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,qBAAA;AAAA,IACjB,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,aAAa,IAAA,EAAU;AACzB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,qBAAA,EAAwB,UAAA,CAAW,aAAA,CAAc,CAAC,CAAC,CAAA,gDAAA;AAAA,KAErD;AAAA,EACF;AAGA,EAAA,IAAI,aAAa,GAAA,EAAW;AAC1B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,qBAAA,EAAwB,UAAA,CAAW,cAAA,EAAgB,CAAA,+DAAA;AAAA,KAErD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAS,MAAA,KAAW,CAAA;AAAA,IAC3B;AAAA,GACF;AACF;AA4BO,SAAS,gBAAgB,MAAA,EAAuC;AACrE,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAIJ,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAGlC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,YAAY,CAAA;AAK3C,EAAA,MAAM,iBAAA,GAAoB,OAAO,aAAA,GAAgB,iBAAA,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,qBAAqB,KAAA,GAAQ,iBAAA,CAAA;AAGnD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,WAAW,CAAA,GAAI,EAAA,IAAM,aAAA;AAC9C,EAAA,OAAO,aAAA,GAAgB,SAAA;AACzB","file":"chunk-FNUBKONK.js","sourcesContent":["/**\n * Market cap conversion utilities for token launches\n *\n * These utilities convert between market cap (USD) and Uniswap ticks\n * following the mathematical relationship:\n *\n * Market Cap (USD) → Token Price (USD) → Ratio (numeraire/token) → Tick\n *\n * Based on reference implementation: plan/priceMultiCurve.py\n */\n\nimport type { Address } from 'viem';\nimport type {\n MarketCapRange,\n MarketCapValidationResult,\n StaticAuctionTickParams,\n DynamicAuctionTickParams,\n MulticurveTickRangeParams,\n MulticurveTickParams,\n TickToMarketCapParams,\n} from '../types';\nimport { MIN_TICK, MAX_TICK } from './tickMath';\nimport { isToken0Expected } from './isToken0Expected';\n\n// Re-export types from types.ts for convenience\nexport type {\n MarketCapRange,\n MarketCapValidationResult,\n StaticAuctionTickParams,\n DynamicAuctionTickParams,\n MulticurveTickRangeParams,\n MulticurveTickParams,\n TickToMarketCapParams,\n} from '../types';\n\nexport function getMaxTickRounded(tickSpacing: number): number {\n return Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n}\n\n/**\n * Convert market cap to token price\n *\n * @param marketCapUSD - Market capitalization in USD\n * @param tokenSupply - Total token supply (as bigint with decimals, e.g., parseEther('1000000000'))\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Price of one token in USD\n *\n * @example\n * ```ts\n * // $1M market cap with 1B tokens (18 decimals)\n * const price = marketCapToTokenPrice(1_000_000, parseEther('1000000000'))\n * // Returns: 0.001 (each token is worth $0.001)\n * ```\n */\nexport function marketCapToTokenPrice(\n marketCapUSD: number,\n tokenSupply: bigint,\n tokenDecimals: number = 18,\n): number {\n if (marketCapUSD <= 0) {\n throw new Error('Market cap must be positive');\n }\n if (tokenSupply <= 0n) {\n throw new Error('Token supply must be positive');\n }\n\n // Convert supply from bigint with decimals to human-readable number\n const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;\n return marketCapUSD / supplyNum;\n}\n\n/**\n * Convert token price to price ratio (numeraire per token)\n *\n * @param tokenPriceUSD - Price of one token in USD\n * @param numerairePriceUSD - Price of numeraire (e.g., ETH) in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @returns Price ratio adjusted for decimals\n *\n * @example\n * ```ts\n * // Token at $0.001, ETH at $3000, both 18 decimals\n * const ratio = tokenPriceToRatio(0.001, 3000, 18, 18)\n * // Returns: 3,000,000 (3M ETH wei per token wei at this ratio)\n * ```\n */\nexport function tokenPriceToRatio(\n tokenPriceUSD: number,\n numerairePriceUSD: number,\n tokenDecimals: number = 18,\n numeraireDecimals: number = 18,\n): number {\n if (tokenPriceUSD <= 0) {\n throw new Error('Token price must be positive');\n }\n if (numerairePriceUSD <= 0) {\n throw new Error('Numeraire price must be positive');\n }\n\n // How much numeraire per token (in USD terms first)\n // numerairePriceUSD / tokenPriceUSD = numeraire units per token\n const ratio = numerairePriceUSD / tokenPriceUSD;\n\n // Adjust for decimal differences\n // Formula: (numeraire / tokenPrice) * (10 ** (assetDecimals - numeraireDecimals))\n const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);\n\n return ratio * decimalAdjustment;\n}\n\n/**\n * Convert ratio to tick using Uniswap's formula: tick = log(ratio) / log(1.0001)\n *\n * @param ratio - Price ratio (must be positive)\n * @returns Raw tick value (before spacing adjustment)\n *\n * @example\n * ```ts\n * ratioToTick(1) // Returns: 0\n * ratioToTick(1.0001) // Returns: ~1\n * ratioToTick(Math.pow(1.0001, 1000)) // Returns: ~1000\n * ```\n */\nexport function ratioToTick(ratio: number): number {\n if (ratio <= 0) {\n throw new Error('Ratio must be positive');\n }\n\n // Uniswap tick formula: tick = log(price) / log(1.0001)\n return Math.log(ratio) / Math.log(1.0001);\n}\n\n/**\n * Determine if the new token will be token1 in the Uniswap pair\n *\n * Uniswap orders tokens by address (token0 < token1 in hex comparison).\n * This affects how ticks are interpreted for price calculations.\n *\n * @param tokenAddress - Address of the new token\n * @param numeraireAddress - Address of the numeraire (e.g., WETH)\n * @returns true if token will be token1, false if token0\n *\n * @example\n * ```ts\n * isToken1('0xB000...', '0xA000...') // true (B > A)\n * isToken1('0xA000...', '0xB000...') // false (A < B)\n * ```\n */\nexport function isToken1(\n tokenAddress: string,\n numeraireAddress: string,\n): boolean {\n return tokenAddress.toLowerCase() > numeraireAddress.toLowerCase();\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// CORE TICK COMPUTATION (Internal)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Core tick computation - NO sign manipulation.\n * Returns the raw mathematical tick for a given market cap.\n *\n * @internal Not exported - use auction-specific functions instead.\n */\nfunction _computeRawTick(\n marketCapUSD: number,\n tokenSupply: bigint,\n numerairePriceUSD: number,\n tokenDecimals: number,\n numeraireDecimals: number,\n tickSpacing: number,\n): number {\n if (marketCapUSD <= 0) {\n throw new Error('Market cap must be positive');\n }\n\n // Step 1: Market cap → token price\n const tokenPrice = marketCapToTokenPrice(\n marketCapUSD,\n tokenSupply,\n tokenDecimals,\n );\n\n // Step 2: Token price → ratio\n const ratio = tokenPriceToRatio(\n tokenPrice,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n );\n\n // Step 3: Ratio → raw tick\n const rawTick = ratioToTick(ratio);\n\n // Step 4: Align to tick spacing (floor division)\n const alignedTick = Math.floor(rawTick / tickSpacing) * tickSpacing;\n\n // Step 5: Bounds check\n if (alignedTick < MIN_TICK || alignedTick > MAX_TICK) {\n throw new Error(\n `Calculated tick ${alignedTick} is out of bounds [${MIN_TICK}, ${MAX_TICK}]. ` +\n `Market cap ${marketCapUSD.toLocaleString()} may be too extreme for the given parameters.`,\n );\n }\n\n return alignedTick;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// AUCTION-SPECIFIC TICK FUNCTIONS\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Convert market cap range to ticks for V3 Static Auctions.\n *\n * V3 Static auctions ALWAYS use positive ticks with startTick < endTick.\n * This is because CREATE2 mining ensures token address > numeraire (token1).\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { startTick, endTick } - positive ticks, startTick < endTick\n *\n * @example\n * ```ts\n * const { startTick, endTick } = marketCapToTicksForStaticAuction({\n * marketCapRange: { start: 100_000, end: 10_000_000 },\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 3000,\n * tickSpacing: 60,\n * })\n * // Returns: { startTick: 120000, endTick: 170000 } (both positive)\n * ```\n */\nexport function marketCapToTicksForStaticAuction(\n params: StaticAuctionTickParams,\n): { startTick: number; endTick: number } {\n const {\n marketCapRange,\n tokenSupply,\n numerairePriceUSD,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n if (marketCapRange.start <= 0) {\n throw new Error('Start market cap must be positive');\n }\n if (marketCapRange.end <= 0) {\n throw new Error('End market cap must be positive');\n }\n if (marketCapRange.start >= marketCapRange.end) {\n throw new Error('Start market cap must be less than end market cap');\n }\n\n // Compute raw ticks\n const tickAtStart = _computeRawTick(\n marketCapRange.start,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n const tickAtEnd = _computeRawTick(\n marketCapRange.end,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // V3 Static: Always positive ticks, startTick < endTick\n // Take absolute value and ensure proper ordering\n const startTick = Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n const endTick = Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range ${marketCapRange.start.toLocaleString()} - ${marketCapRange.end.toLocaleString()} ` +\n `resulted in same tick (${startTick}). Try a wider range or smaller tick spacing.`,\n );\n }\n\n return { startTick, endTick };\n}\n\n/**\n * Convert market cap range to ticks for V4 Dynamic Auctions (Doppler).\n *\n * Dynamic auctions compute tick sign based on expected token ordering:\n * - Token1 (ETH numeraire): positive ticks, startTick < endTick\n * - Token0 (stablecoin numeraire): negative ticks, startTick > endTick\n *\n * Unlike Multicurve, Doppler contract does NOT auto-flip ticks.\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { startTick, endTick } with correct sign and ordering for Doppler contract\n *\n * @example\n * ```ts\n * // ETH numeraire (token1) - positive ticks\n * const eth = marketCapToTicksForDynamicAuction({\n * marketCapRange: { start: 50_000, end: 500_000 },\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 3000,\n * numeraire: WETH_ADDRESS,\n * tickSpacing: 30,\n * })\n * // Returns: { startTick: 120000, endTick: 170000 } (positive, ascending)\n *\n * // USDC numeraire (token0) - negative ticks\n * const usdc = marketCapToTicksForDynamicAuction({\n * marketCapRange: { start: 50_000, end: 500_000 },\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 1,\n * numeraire: USDC_ADDRESS,\n * tickSpacing: 30,\n * tokenDecimals: 18,\n * numeraireDecimals: 6,\n * })\n * // Returns: { startTick: -120000, endTick: -170000 } (negative, descending)\n * ```\n */\nexport function marketCapToTicksForDynamicAuction(\n params: DynamicAuctionTickParams,\n): { startTick: number; endTick: number } {\n const {\n marketCapRange,\n tokenSupply,\n numerairePriceUSD,\n numeraire,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n if (marketCapRange.start <= 0 || marketCapRange.end <= 0) {\n throw new Error('Market cap values must be positive');\n }\n if (marketCapRange.start >= marketCapRange.end) {\n throw new Error('Start market cap must be less than end market cap');\n }\n\n // Compute raw ticks\n const tickAtStart = _computeRawTick(\n marketCapRange.start,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n const tickAtEnd = _computeRawTick(\n marketCapRange.end,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // Determine token ordering from numeraire address\n const tokenIsToken0 = isToken0Expected(numeraire);\n\n if (tokenIsToken0) {\n // Token0 (stablecoin numeraire): negative ticks, startTick > endTick\n const startTick = -Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n const endTick = -Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range resulted in same tick (${startTick}). Try a wider range.`,\n );\n }\n\n return { startTick, endTick }; // e.g., { -120000, -170000 }\n } else {\n // Token1 (ETH numeraire): positive ticks, startTick < endTick\n const startTick = Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n const endTick = Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n if (startTick === endTick) {\n throw new Error(\n `Market cap range resulted in same tick (${startTick}). Try a wider range.`,\n );\n }\n\n return { startTick, endTick }; // e.g., { 120000, 170000 }\n }\n}\n\n/**\n * Convert market cap range to ticks for V4 Multicurve pools.\n *\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n * The contract's adjustCurves() handles token ordering internally.\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { tickLower, tickUpper } - tick range where tickLower < tickUpper\n *\n * @example\n * ```ts\n * const { tickLower, tickUpper } = marketCapToTicksForMulticurve({\n * marketCapLower: 500_000,\n * marketCapUpper: 5_000_000,\n * tokenSupply: parseEther('1000000000'),\n * numerairePriceUSD: 3000,\n * tickSpacing: 60,\n * })\n * ```\n */\nexport function marketCapToTicksForMulticurve(\n params: MulticurveTickRangeParams,\n): { tickLower: number; tickUpper: number } {\n const {\n marketCapLower,\n marketCapUpper,\n tokenSupply,\n numerairePriceUSD,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n if (marketCapLower <= 0) {\n throw new Error('Lower market cap must be positive');\n }\n if (marketCapUpper !== 'max' && marketCapUpper <= 0) {\n throw new Error('Upper market cap must be positive');\n }\n if (marketCapUpper !== 'max' && marketCapLower >= marketCapUpper) {\n throw new Error('Lower market cap must be less than upper market cap');\n }\n\n // Compute raw ticks\n const tickAtLower = -_computeRawTick(\n marketCapLower,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n const tickAtUpper =\n marketCapUpper === 'max'\n ? getMaxTickRounded(tickSpacing)\n : -_computeRawTick(\n marketCapUpper,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // Use natural tick ordering (lower market cap = lower tick value)\n const tickLower = Math.min(tickAtLower, tickAtUpper);\n const tickUpper = Math.max(tickAtLower, tickAtUpper);\n\n if (tickLower === tickUpper) {\n const upperLabel =\n marketCapUpper === 'max' ? 'max' : `$${marketCapUpper.toLocaleString()}`;\n throw new Error(\n `Market cap range $${marketCapLower.toLocaleString()} - ${upperLabel} ` +\n `resulted in same tick (${tickLower}). Try a wider range or smaller tick spacing.`,\n );\n }\n\n return { tickLower, tickUpper };\n}\n\n/**\n * Convert a single market cap to a tick for Multicurve use cases.\n *\n * Used for farTick and pegTick calculations.\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n *\n * @param params - Configuration object with market cap and token parameters\n * @returns Tick value (sign depends on price ratio)\n *\n * @example\n * ```ts\n * const farTick = marketCapToTickForMulticurve({\n * marketCapUSD: 50_000_000,\n * tokenSupply: supply,\n * numerairePriceUSD: 3000,\n * tickSpacing: 60,\n * })\n * ```\n */\nexport function marketCapToTickForMulticurve(\n params: MulticurveTickParams,\n): number {\n const {\n marketCapUSD,\n tokenSupply,\n numerairePriceUSD,\n tickSpacing,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n // Multicurve uses a canonical tick space where the contract's adjustCurves()\n // resolves token ordering. This must match marketCapToTicksForMulticurve().\n const rawTick = -_computeRawTick(\n marketCapUSD,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals,\n numeraireDecimals,\n tickSpacing,\n );\n\n // Normalize -0 to 0\n return rawTick === 0 ? 0 : rawTick;\n}\n\n/**\n * Apply curvature offsets to a peg tick for Multicurve positions.\n *\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n * The contract's adjustCurves() handles token ordering internally.\n *\n * @example\n * ```ts\n * // Peg at 200000, curve extends 10000 ticks toward higher market cap\n * applyTickOffsets(200000, 0, 10000, WETH)\n * // Returns: { tickLower: 200000, tickUpper: 210000 }\n * ```\n */\nexport function applyTickOffsets(\n pegTick: number,\n offsetLower: number,\n offsetUpper: number,\n numeraire: Address,\n): { tickLower: number; tickUpper: number } {\n void numeraire; // Kept for API compatibility\n return {\n tickLower: pegTick + offsetLower,\n tickUpper: pegTick + offsetUpper,\n };\n}\n\n/**\n * Validate market cap parameters and return warnings for unusual values\n *\n * This doesn't prevent execution but helps catch potential mistakes:\n * - Very small market caps (< $1,000)\n * - Very large market caps (> $1 trillion)\n * - Extreme token prices (< $0.000001 or > $1M)\n *\n * @param marketCap - Market cap value to validate\n * @param tokenSupply - Token supply (with decimals)\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Validation result with warnings array\n *\n * @example\n * ```ts\n * const result = validateMarketCapParameters(500, parseEther('1000000'))\n * if (result.warnings.length > 0) {\n * console.warn('Warnings:', result.warnings)\n * }\n * ```\n */\nexport function validateMarketCapParameters(\n marketCap: number,\n tokenSupply: bigint,\n tokenDecimals: number = 18,\n): MarketCapValidationResult {\n const warnings: string[] = [];\n\n // Check for unreasonably small market caps\n if (marketCap < 1000) {\n warnings.push(\n `Market cap $${marketCap.toLocaleString()} is very small. Consider if this is intentional.`,\n );\n }\n\n // Check for unreasonably large market caps\n if (marketCap > 1_000_000_000_000) {\n warnings.push(\n `Market cap $${marketCap.toLocaleString()} is very large (> $1T). Verify this is correct.`,\n );\n }\n\n // Calculate implied token price\n const tokenPrice = marketCapToTokenPrice(\n marketCap,\n tokenSupply,\n tokenDecimals,\n );\n\n // Check for extremely small token prices\n if (tokenPrice < 0.000001) {\n warnings.push(\n `Implied token price $${tokenPrice.toExponential(2)} is very small. ` +\n `This may cause precision issues.`,\n );\n }\n\n // Check for extremely large token prices\n if (tokenPrice > 1_000_000) {\n warnings.push(\n `Implied token price $${tokenPrice.toLocaleString()} is very large. ` +\n `Verify your token supply and market cap values.`,\n );\n }\n\n return {\n valid: warnings.length === 0,\n warnings,\n };\n}\n\n/**\n * Calculate market cap from a tick (reverse conversion)\n *\n * Useful for displaying what market cap a given tick represents.\n * Works with ticks from any auction type (Static, Dynamic, Multicurve).\n *\n * @param params - Configuration object with tick and token parameters\n * @returns Market cap in USD\n *\n * @example\n * ```ts\n * // Works with negative ticks (Multicurve)\n * tickToMarketCap({\n * tick: -156000,\n * tokenSupply: supply,\n * numerairePriceUSD: 3000,\n * })\n *\n * // Works with positive ticks (Static/Dynamic)\n * tickToMarketCap({\n * tick: 156000,\n * tokenSupply: supply,\n * numerairePriceUSD: 3000,\n * })\n * ```\n */\nexport function tickToMarketCap(params: TickToMarketCapParams): number {\n const {\n tick,\n tokenSupply,\n numerairePriceUSD,\n tokenDecimals = 18,\n numeraireDecimals = 18,\n } = params;\n\n // Use absolute value since tick sign varies by auction type\n // but the underlying ratio is always positive\n const adjustedTick = Math.abs(tick);\n\n // Tick → ratio (reverse of ratioToTick)\n const ratio = Math.pow(1.0001, adjustedTick);\n\n // Ratio → token price (reverse of tokenPriceToRatio)\n // ratio = (numerairePriceUSD / tokenPriceUSD) * 10^(tokenDecimals - numeraireDecimals)\n // tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment)\n const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);\n const tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment);\n\n // Token price → market cap (reverse of marketCapToTokenPrice)\n const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;\n return tokenPriceUSD * supplyNum;\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkHJFVRV47_js = require('./chunk-HJFVRV47.js');
|
|
4
|
+
var chunkFNUBKONK_js = require('./chunk-FNUBKONK.js');
|
|
5
5
|
var chunk6BQY5EPB_js = require('./chunk-6BQY5EPB.js');
|
|
6
|
-
var
|
|
6
|
+
var chunkOX5CESVM_js = require('./chunk-OX5CESVM.js');
|
|
7
7
|
|
|
8
8
|
// src/builders/StaticAuctionBuilder.ts
|
|
9
9
|
var StaticAuctionBuilder = class _StaticAuctionBuilder {
|
|
@@ -82,7 +82,7 @@ var StaticAuctionBuilder = class _StaticAuctionBuilder {
|
|
|
82
82
|
}
|
|
83
83
|
const fee = params.fee ?? chunk6BQY5EPB_js.DEFAULT_V3_FEE;
|
|
84
84
|
const tickSpacing = fee === 100 ? chunk6BQY5EPB_js.TICK_SPACINGS[100] : fee === 500 ? chunk6BQY5EPB_js.TICK_SPACINGS[500] : fee === 3e3 ? chunk6BQY5EPB_js.TICK_SPACINGS[3e3] : chunk6BQY5EPB_js.TICK_SPACINGS[1e4];
|
|
85
|
-
const ticks =
|
|
85
|
+
const ticks = chunkHJFVRV47_js.computeTicks(params.priceRange, tickSpacing);
|
|
86
86
|
return this.poolByTicks({
|
|
87
87
|
startTick: ticks.startTick,
|
|
88
88
|
endTick: ticks.endTick,
|
|
@@ -250,12 +250,12 @@ var StaticAuctionBuilder = class _StaticAuctionBuilder {
|
|
|
250
250
|
}
|
|
251
251
|
const fee = config.fee ?? chunk6BQY5EPB_js.DEFAULT_V3_FEE;
|
|
252
252
|
const tickSpacing = fee === 100 ? chunk6BQY5EPB_js.TICK_SPACINGS[100] : fee === 500 ? chunk6BQY5EPB_js.TICK_SPACINGS[500] : fee === 3e3 ? chunk6BQY5EPB_js.TICK_SPACINGS[3e3] : chunk6BQY5EPB_js.TICK_SPACINGS[1e4];
|
|
253
|
-
const startValidation =
|
|
253
|
+
const startValidation = chunkFNUBKONK_js.validateMarketCapParameters(
|
|
254
254
|
config.marketCap.start,
|
|
255
255
|
tokenSupply,
|
|
256
256
|
config.tokenDecimals
|
|
257
257
|
);
|
|
258
|
-
const endValidation =
|
|
258
|
+
const endValidation = chunkFNUBKONK_js.validateMarketCapParameters(
|
|
259
259
|
config.marketCap.end,
|
|
260
260
|
tokenSupply,
|
|
261
261
|
config.tokenDecimals
|
|
@@ -268,7 +268,7 @@ var StaticAuctionBuilder = class _StaticAuctionBuilder {
|
|
|
268
268
|
console.warn("Market cap validation warnings:");
|
|
269
269
|
allWarnings.forEach((w) => console.warn(` - ${w}`));
|
|
270
270
|
}
|
|
271
|
-
const { startTick, endTick } =
|
|
271
|
+
const { startTick, endTick } = chunkFNUBKONK_js.marketCapToTicksForStaticAuction({
|
|
272
272
|
marketCapRange: config.marketCap,
|
|
273
273
|
tokenSupply,
|
|
274
274
|
numerairePriceUSD: config.numerairePrice,
|
|
@@ -285,8 +285,8 @@ var StaticAuctionBuilder = class _StaticAuctionBuilder {
|
|
|
285
285
|
};
|
|
286
286
|
}
|
|
287
287
|
if (!this.pool) throw new Error("pool configuration is required");
|
|
288
|
-
const governance = this.governance ?? (
|
|
289
|
-
if (governance.type === "launchpad" && !
|
|
288
|
+
const governance = this.governance ?? (chunkOX5CESVM_js.isNoOpEnabledChain(this.chainId) ? { type: "noOp" } : { type: "default" });
|
|
289
|
+
if (governance.type === "launchpad" && !chunkOX5CESVM_js.isLaunchpadEnabledChain(this.chainId)) {
|
|
290
290
|
throw new Error(
|
|
291
291
|
`Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`
|
|
292
292
|
);
|
|
@@ -316,5 +316,5 @@ var StaticAuctionBuilder = class _StaticAuctionBuilder {
|
|
|
316
316
|
};
|
|
317
317
|
|
|
318
318
|
exports.StaticAuctionBuilder = StaticAuctionBuilder;
|
|
319
|
-
//# sourceMappingURL=chunk-
|
|
320
|
-
//# sourceMappingURL=chunk-
|
|
319
|
+
//# sourceMappingURL=chunk-FTRCBE3J.js.map
|
|
320
|
+
//# sourceMappingURL=chunk-FTRCBE3J.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builders/StaticAuctionBuilder.ts"],"names":["DEFAULT_V3_YEARLY_MINT_RATE","DEFAULT_V3_FEE","V3_FEE_TIERS","DEFAULT_V3_START_TICK","DEFAULT_V3_END_TICK","DEFAULT_V3_NUM_POSITIONS","DEFAULT_V3_MAX_SHARE_TO_BE_SOLD","TICK_SPACINGS","computeTicks","DEFAULT_V3_VESTING_DURATION","ZERO_ADDRESS","validateMarketCapParameters","marketCapToTicksForStaticAuction","isNoOpEnabledChain","isLaunchpadEnabledChain"],"mappings":"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","file":"chunk-COUZYFEE.js","sourcesContent":["import type { Address } from 'viem';\nimport {\n DEFAULT_V3_END_TICK,\n DEFAULT_V3_FEE,\n DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n DEFAULT_V3_NUM_POSITIONS,\n DEFAULT_V3_START_TICK,\n DEFAULT_V3_VESTING_DURATION,\n DEFAULT_V3_YEARLY_MINT_RATE,\n TICK_SPACINGS,\n V3_FEE_TIERS,\n ZERO_ADDRESS,\n} from '../constants';\nimport {\n marketCapToTicksForStaticAuction,\n validateMarketCapParameters,\n} from '../utils';\nimport {\n isNoOpEnabledChain,\n isLaunchpadEnabledChain,\n type CreateStaticAuctionParams,\n type GovernanceOption,\n type MigrationConfig,\n type PriceRange,\n type VestingConfig,\n type TokenConfig,\n type StaticAuctionMarketCapConfig,\n type ModuleAddressOverrides,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport { computeTicks, type BaseAuctionBuilder } from './shared';\n\nexport class StaticAuctionBuilder<\n C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n private token?: TokenConfig;\n private sale?: CreateStaticAuctionParams<C>['sale'];\n private pool?: CreateStaticAuctionParams<C>['pool'];\n private beneficiaries?: { beneficiary: Address; shares: bigint }[];\n private vesting?: VestingConfig;\n private governance?: GovernanceOption<C>;\n private migration?: MigrationConfig;\n private integrator?: Address;\n private userAddress?: Address;\n private moduleAddresses?: ModuleAddressOverrides;\n private gasLimit?: bigint;\n // Deferred market cap config - converted to pool in build()\n private marketCapConfig?: {\n marketCap: { start: number; end: number };\n numerairePrice: number;\n tokenSupply?: bigint;\n tokenDecimals?: number;\n numeraireDecimals?: number;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n };\n public chainId: C;\n\n constructor(chainId: C) {\n this.chainId = chainId;\n }\n\n static forChain<C extends SupportedChainId>(\n chainId: C,\n ): StaticAuctionBuilder<C> {\n return new StaticAuctionBuilder(chainId);\n }\n\n tokenConfig(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire,\n };\n return this;\n }\n\n /**\n * Provide pool ticks directly.\n *\n * Note: Static Auctions use Uniswap V3, which only supports 4 fee tiers:\n * 100 (0.01%), 500 (0.05%), 3000 (0.3%), 10000 (1%).\n * For custom fees, use Dynamic or Multicurve auctions (V4).\n */\n poolByTicks(params: {\n startTick?: number;\n endTick?: number;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n }): this {\n // Mutual exclusion: cannot use poolByTicks() after withMarketCapRange()\n if (this.marketCapConfig) {\n throw new Error(\n 'Cannot use poolByTicks() after withMarketCapRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n const fee = params.fee ?? DEFAULT_V3_FEE;\n\n // Validate fee is a V3-supported tier\n if (!(V3_FEE_TIERS as readonly number[]).includes(fee)) {\n throw new Error(\n `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n `Got: ${fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n );\n }\n\n const startTick = params.startTick ?? DEFAULT_V3_START_TICK;\n const endTick = params.endTick ?? DEFAULT_V3_END_TICK;\n this.pool = {\n startTick,\n endTick,\n fee,\n numPositions: params.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n };\n return this;\n }\n\n /**\n * @deprecated Use withMarketCapRange() instead for more intuitive market cap configuration\n */\n poolByPriceRange(params: {\n priceRange: PriceRange;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n }): this {\n // Mutual exclusion: cannot use poolByPriceRange() after withMarketCapRange()\n if (this.marketCapConfig) {\n throw new Error(\n 'Cannot use poolByPriceRange() after withMarketCapRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n const fee = params.fee ?? DEFAULT_V3_FEE;\n const tickSpacing =\n fee === 100\n ? TICK_SPACINGS[100]\n : fee === 500\n ? TICK_SPACINGS[500]\n : fee === 3000\n ? TICK_SPACINGS[3000]\n : TICK_SPACINGS[10000];\n const ticks = computeTicks(params.priceRange, tickSpacing);\n return this.poolByTicks({\n startTick: ticks.startTick,\n endTick: ticks.endTick,\n fee,\n numPositions: params.numPositions,\n maxShareToBeSold: params.maxShareToBeSold,\n });\n }\n\n /**\n * Configure pool using target market cap range.\n * Converts market cap values (in USD) to Uniswap ticks.\n *\n * @param params - Market cap configuration\n * @returns Builder instance for chaining\n *\n * @example\n * ```ts\n * builder\n * .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n * .withMarketCapRange({\n * marketCap: { start: 100_000, end: 10_000_000 }, // $100k to $10M\n * numerairePrice: 3000, // ETH = $3000\n * })\n * ```\n */\n withMarketCapRange(params: StaticAuctionMarketCapConfig): this {\n // Mutual exclusion: cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange()\n if (this.pool) {\n throw new Error(\n 'Cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n // Basic validation that doesn't require saleConfig\n if (params.numerairePrice <= 0) {\n throw new Error('numerairePrice must be greater than 0');\n }\n if (params.marketCap.start <= 0 || params.marketCap.end <= 0) {\n throw new Error('marketCap values must be greater than 0');\n }\n if (params.marketCap.start >= params.marketCap.end) {\n throw new Error('marketCap.start must be less than marketCap.end');\n }\n\n // Validate fee is a V3-supported tier (if provided)\n if (params.fee !== undefined) {\n if (!(V3_FEE_TIERS as readonly number[]).includes(params.fee)) {\n throw new Error(\n `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n `Got: ${params.fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n );\n }\n }\n\n // Store config for deferred conversion in build()\n this.marketCapConfig = {\n marketCap: params.marketCap,\n numerairePrice: params.numerairePrice,\n tokenSupply: params.tokenSupply,\n tokenDecimals: params.tokenDecimals,\n numeraireDecimals: params.numeraireDecimals,\n fee: params.fee,\n numPositions: params.numPositions,\n maxShareToBeSold: params.maxShareToBeSold,\n };\n\n return this;\n }\n\n /**\n * Configure beneficiaries for fee streaming on locked V3 pools.\n *\n * When beneficiaries are provided, the pool enters a \"Locked\" state where:\n * - Fees are collected and distributed to beneficiaries according to their shares\n * - Liquidity cannot be exited/migrated (pool stays locked permanently)\n * - Anyone can call collectFees() to distribute accumulated fees\n *\n * IMPORTANT:\n * - Shares must sum to exactly WAD (1e18 = 100%)\n * - Protocol owner (Airlock.owner()) must be included with at least 5% shares\n * - Beneficiaries will be automatically sorted by address (ascending)\n * - Use withMigration({ type: 'noOp' }) when using beneficiaries\n *\n * @example\n * ```typescript\n * builder.withBeneficiaries([\n * { beneficiary: protocolOwner, shares: parseEther('0.05') }, // 5% (minimum required)\n * { beneficiary: teamWallet, shares: parseEther('0.45') }, // 45%\n * { beneficiary: daoTreasury, shares: parseEther('0.50') }, // 50%\n * ])\n * ```\n */\n withBeneficiaries(\n beneficiaries: { beneficiary: Address; shares: bigint }[],\n ): this {\n // Sort beneficiaries by address (ascending) as required by the contract\n this.beneficiaries = [...beneficiaries].sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n });\n return this;\n }\n\n withVesting(params?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? DEFAULT_V3_VESTING_DURATION),\n cliffDuration: params.cliffDuration ?? 0,\n recipients: params.recipients,\n amounts: params.amounts,\n };\n return this;\n }\n\n withGovernance(params: GovernanceOption<C>): this {\n this.governance = params;\n return this;\n }\n\n withMigration(migration: MigrationConfig): this {\n this.migration = migration;\n return this;\n }\n\n withUserAddress(address: Address): this {\n this.userAddress = address;\n return this;\n }\n\n withIntegrator(address?: Address): this {\n this.integrator = address ?? ZERO_ADDRESS;\n return this;\n }\n\n withGasLimit(gas?: bigint): this {\n this.gasLimit = gas;\n return this;\n }\n\n // Address override helpers\n private overrideModule<K extends keyof ModuleAddressOverrides>(\n key: K,\n address: NonNullable<ModuleAddressOverrides[K]>,\n ): this {\n this.moduleAddresses = {\n ...this.moduleAddresses,\n [key]: address,\n } as ModuleAddressOverrides;\n return this;\n }\n\n withTokenFactory(address: Address): this {\n return this.overrideModule('tokenFactory', address);\n }\n\n withAirlock(address: Address): this {\n return this.overrideModule('airlock', address);\n }\n\n withV3Initializer(address: Address): this {\n return this.overrideModule('v3Initializer', address);\n }\n\n withGovernanceFactory(address: Address): this {\n return this.overrideModule('governanceFactory', address);\n }\n\n withV2Migrator(address: Address): this {\n return this.overrideModule('v2Migrator', address);\n }\n\n withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', address);\n }\n\n withNoOpMigrator(address: Address): this {\n return this.overrideModule('noOpMigrator', address);\n }\n\n build(): CreateStaticAuctionParams<C> {\n if (!this.token) throw new Error('tokenConfig is required');\n if (!this.sale) throw new Error('saleConfig is required');\n if (!this.migration) throw new Error('migration configuration is required');\n if (!this.userAddress) throw new Error('userAddress is required');\n\n // Convert deferred market cap config to pool if set\n if (this.marketCapConfig && !this.pool) {\n const config = this.marketCapConfig;\n\n // Get token supply from config or saleConfig\n const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n if (!tokenSupply) {\n throw new Error(\n 'tokenSupply must be provided (either via saleConfig() or withMarketCapRange() params)',\n );\n }\n\n // Determine fee and tick spacing\n const fee = config.fee ?? DEFAULT_V3_FEE;\n const tickSpacing =\n fee === 100\n ? TICK_SPACINGS[100]\n : fee === 500\n ? TICK_SPACINGS[500]\n : fee === 3000\n ? TICK_SPACINGS[3000]\n : TICK_SPACINGS[10000];\n\n // Validate market cap parameters\n const startValidation = validateMarketCapParameters(\n config.marketCap.start,\n tokenSupply,\n config.tokenDecimals,\n );\n const endValidation = validateMarketCapParameters(\n config.marketCap.end,\n tokenSupply,\n config.tokenDecimals,\n );\n\n // Log warnings if any\n const allWarnings = [\n ...startValidation.warnings,\n ...endValidation.warnings,\n ];\n if (allWarnings.length > 0) {\n console.warn('Market cap validation warnings:');\n allWarnings.forEach((w) => console.warn(` - ${w}`));\n }\n\n // Convert market cap range to ticks for V3 Static auction\n const { startTick, endTick } = marketCapToTicksForStaticAuction({\n marketCapRange: config.marketCap,\n tokenSupply,\n numerairePriceUSD: config.numerairePrice,\n tickSpacing,\n tokenDecimals: config.tokenDecimals ?? 18,\n numeraireDecimals: config.numeraireDecimals ?? 18,\n });\n\n // Set pool config\n this.pool = {\n startTick,\n endTick,\n fee,\n numPositions: config.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n config.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n };\n }\n\n if (!this.pool) throw new Error('pool configuration is required');\n\n // Default governance: noOp on supported chains, default on others (e.g., Ink)\n const governance =\n this.governance ??\n (isNoOpEnabledChain(this.chainId)\n ? { type: 'noOp' as const }\n : { type: 'default' as const });\n\n if (\n governance.type === 'launchpad' &&\n !isLaunchpadEnabledChain(this.chainId)\n ) {\n throw new Error(\n `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n );\n }\n\n // Merge beneficiaries into pool config if provided\n const poolWithBeneficiaries = this.beneficiaries\n ? { ...this.pool, beneficiaries: this.beneficiaries }\n : this.pool;\n\n // Validate noOp migration requires beneficiaries\n // NoOpMigrator is designed for locked pools with beneficiaries. Without beneficiaries,\n // the pool status is \"Initialized\" (not \"Locked\"), meaning exitLiquidity() can be called.\n // But NoOpMigrator.migrate() always reverts, so the entire graduation transaction fails\n // and liquidity becomes trapped.\n if (this.migration.type === 'noOp') {\n const hasBeneficiaries =\n poolWithBeneficiaries.beneficiaries &&\n poolWithBeneficiaries.beneficiaries.length > 0;\n if (!hasBeneficiaries) {\n throw new Error(\n 'noOp migration requires beneficiaries. Without beneficiaries, the pool would be stuck after reaching ' +\n 'graduation - exitLiquidity() succeeds but NoOpMigrator.migrate() always reverts, causing the entire ' +\n 'transaction to fail. Either add beneficiaries via withBeneficiaries() or use a different migration type (uniswapV2, uniswapV4).',\n );\n }\n }\n\n return {\n token: this.token,\n sale: this.sale,\n pool: poolWithBeneficiaries,\n vesting: this.vesting,\n governance: governance as GovernanceOption<C>,\n migration: this.migration,\n integrator: this.integrator ?? ZERO_ADDRESS,\n userAddress: this.userAddress,\n modules: this.moduleAddresses,\n gas: this.gasLimit,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/builders/StaticAuctionBuilder.ts"],"names":["DEFAULT_V3_YEARLY_MINT_RATE","DEFAULT_V3_FEE","V3_FEE_TIERS","DEFAULT_V3_START_TICK","DEFAULT_V3_END_TICK","DEFAULT_V3_NUM_POSITIONS","DEFAULT_V3_MAX_SHARE_TO_BE_SOLD","TICK_SPACINGS","computeTicks","DEFAULT_V3_VESTING_DURATION","ZERO_ADDRESS","validateMarketCapParameters","marketCapToTicksForStaticAuction","isNoOpEnabledChain","isLaunchpadEnabledChain"],"mappings":"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","file":"chunk-FTRCBE3J.js","sourcesContent":["import type { Address } from 'viem';\nimport {\n DEFAULT_V3_END_TICK,\n DEFAULT_V3_FEE,\n DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n DEFAULT_V3_NUM_POSITIONS,\n DEFAULT_V3_START_TICK,\n DEFAULT_V3_VESTING_DURATION,\n DEFAULT_V3_YEARLY_MINT_RATE,\n TICK_SPACINGS,\n V3_FEE_TIERS,\n ZERO_ADDRESS,\n} from '../constants';\nimport {\n marketCapToTicksForStaticAuction,\n validateMarketCapParameters,\n} from '../utils';\nimport {\n isNoOpEnabledChain,\n isLaunchpadEnabledChain,\n type CreateStaticAuctionParams,\n type GovernanceOption,\n type MigrationConfig,\n type PriceRange,\n type VestingConfig,\n type TokenConfig,\n type StaticAuctionMarketCapConfig,\n type ModuleAddressOverrides,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport { computeTicks, type BaseAuctionBuilder } from './shared';\n\nexport class StaticAuctionBuilder<\n C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n private token?: TokenConfig;\n private sale?: CreateStaticAuctionParams<C>['sale'];\n private pool?: CreateStaticAuctionParams<C>['pool'];\n private beneficiaries?: { beneficiary: Address; shares: bigint }[];\n private vesting?: VestingConfig;\n private governance?: GovernanceOption<C>;\n private migration?: MigrationConfig;\n private integrator?: Address;\n private userAddress?: Address;\n private moduleAddresses?: ModuleAddressOverrides;\n private gasLimit?: bigint;\n // Deferred market cap config - converted to pool in build()\n private marketCapConfig?: {\n marketCap: { start: number; end: number };\n numerairePrice: number;\n tokenSupply?: bigint;\n tokenDecimals?: number;\n numeraireDecimals?: number;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n };\n public chainId: C;\n\n constructor(chainId: C) {\n this.chainId = chainId;\n }\n\n static forChain<C extends SupportedChainId>(\n chainId: C,\n ): StaticAuctionBuilder<C> {\n return new StaticAuctionBuilder(chainId);\n }\n\n tokenConfig(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire,\n };\n return this;\n }\n\n /**\n * Provide pool ticks directly.\n *\n * Note: Static Auctions use Uniswap V3, which only supports 4 fee tiers:\n * 100 (0.01%), 500 (0.05%), 3000 (0.3%), 10000 (1%).\n * For custom fees, use Dynamic or Multicurve auctions (V4).\n */\n poolByTicks(params: {\n startTick?: number;\n endTick?: number;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n }): this {\n // Mutual exclusion: cannot use poolByTicks() after withMarketCapRange()\n if (this.marketCapConfig) {\n throw new Error(\n 'Cannot use poolByTicks() after withMarketCapRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n const fee = params.fee ?? DEFAULT_V3_FEE;\n\n // Validate fee is a V3-supported tier\n if (!(V3_FEE_TIERS as readonly number[]).includes(fee)) {\n throw new Error(\n `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n `Got: ${fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n );\n }\n\n const startTick = params.startTick ?? DEFAULT_V3_START_TICK;\n const endTick = params.endTick ?? DEFAULT_V3_END_TICK;\n this.pool = {\n startTick,\n endTick,\n fee,\n numPositions: params.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n };\n return this;\n }\n\n /**\n * @deprecated Use withMarketCapRange() instead for more intuitive market cap configuration\n */\n poolByPriceRange(params: {\n priceRange: PriceRange;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n }): this {\n // Mutual exclusion: cannot use poolByPriceRange() after withMarketCapRange()\n if (this.marketCapConfig) {\n throw new Error(\n 'Cannot use poolByPriceRange() after withMarketCapRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n const fee = params.fee ?? DEFAULT_V3_FEE;\n const tickSpacing =\n fee === 100\n ? TICK_SPACINGS[100]\n : fee === 500\n ? TICK_SPACINGS[500]\n : fee === 3000\n ? TICK_SPACINGS[3000]\n : TICK_SPACINGS[10000];\n const ticks = computeTicks(params.priceRange, tickSpacing);\n return this.poolByTicks({\n startTick: ticks.startTick,\n endTick: ticks.endTick,\n fee,\n numPositions: params.numPositions,\n maxShareToBeSold: params.maxShareToBeSold,\n });\n }\n\n /**\n * Configure pool using target market cap range.\n * Converts market cap values (in USD) to Uniswap ticks.\n *\n * @param params - Market cap configuration\n * @returns Builder instance for chaining\n *\n * @example\n * ```ts\n * builder\n * .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n * .withMarketCapRange({\n * marketCap: { start: 100_000, end: 10_000_000 }, // $100k to $10M\n * numerairePrice: 3000, // ETH = $3000\n * })\n * ```\n */\n withMarketCapRange(params: StaticAuctionMarketCapConfig): this {\n // Mutual exclusion: cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange()\n if (this.pool) {\n throw new Error(\n 'Cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n // Basic validation that doesn't require saleConfig\n if (params.numerairePrice <= 0) {\n throw new Error('numerairePrice must be greater than 0');\n }\n if (params.marketCap.start <= 0 || params.marketCap.end <= 0) {\n throw new Error('marketCap values must be greater than 0');\n }\n if (params.marketCap.start >= params.marketCap.end) {\n throw new Error('marketCap.start must be less than marketCap.end');\n }\n\n // Validate fee is a V3-supported tier (if provided)\n if (params.fee !== undefined) {\n if (!(V3_FEE_TIERS as readonly number[]).includes(params.fee)) {\n throw new Error(\n `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n `Got: ${params.fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n );\n }\n }\n\n // Store config for deferred conversion in build()\n this.marketCapConfig = {\n marketCap: params.marketCap,\n numerairePrice: params.numerairePrice,\n tokenSupply: params.tokenSupply,\n tokenDecimals: params.tokenDecimals,\n numeraireDecimals: params.numeraireDecimals,\n fee: params.fee,\n numPositions: params.numPositions,\n maxShareToBeSold: params.maxShareToBeSold,\n };\n\n return this;\n }\n\n /**\n * Configure beneficiaries for fee streaming on locked V3 pools.\n *\n * When beneficiaries are provided, the pool enters a \"Locked\" state where:\n * - Fees are collected and distributed to beneficiaries according to their shares\n * - Liquidity cannot be exited/migrated (pool stays locked permanently)\n * - Anyone can call collectFees() to distribute accumulated fees\n *\n * IMPORTANT:\n * - Shares must sum to exactly WAD (1e18 = 100%)\n * - Protocol owner (Airlock.owner()) must be included with at least 5% shares\n * - Beneficiaries will be automatically sorted by address (ascending)\n * - Use withMigration({ type: 'noOp' }) when using beneficiaries\n *\n * @example\n * ```typescript\n * builder.withBeneficiaries([\n * { beneficiary: protocolOwner, shares: parseEther('0.05') }, // 5% (minimum required)\n * { beneficiary: teamWallet, shares: parseEther('0.45') }, // 45%\n * { beneficiary: daoTreasury, shares: parseEther('0.50') }, // 50%\n * ])\n * ```\n */\n withBeneficiaries(\n beneficiaries: { beneficiary: Address; shares: bigint }[],\n ): this {\n // Sort beneficiaries by address (ascending) as required by the contract\n this.beneficiaries = [...beneficiaries].sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n });\n return this;\n }\n\n withVesting(params?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? DEFAULT_V3_VESTING_DURATION),\n cliffDuration: params.cliffDuration ?? 0,\n recipients: params.recipients,\n amounts: params.amounts,\n };\n return this;\n }\n\n withGovernance(params: GovernanceOption<C>): this {\n this.governance = params;\n return this;\n }\n\n withMigration(migration: MigrationConfig): this {\n this.migration = migration;\n return this;\n }\n\n withUserAddress(address: Address): this {\n this.userAddress = address;\n return this;\n }\n\n withIntegrator(address?: Address): this {\n this.integrator = address ?? ZERO_ADDRESS;\n return this;\n }\n\n withGasLimit(gas?: bigint): this {\n this.gasLimit = gas;\n return this;\n }\n\n // Address override helpers\n private overrideModule<K extends keyof ModuleAddressOverrides>(\n key: K,\n address: NonNullable<ModuleAddressOverrides[K]>,\n ): this {\n this.moduleAddresses = {\n ...this.moduleAddresses,\n [key]: address,\n } as ModuleAddressOverrides;\n return this;\n }\n\n withTokenFactory(address: Address): this {\n return this.overrideModule('tokenFactory', address);\n }\n\n withAirlock(address: Address): this {\n return this.overrideModule('airlock', address);\n }\n\n withV3Initializer(address: Address): this {\n return this.overrideModule('v3Initializer', address);\n }\n\n withGovernanceFactory(address: Address): this {\n return this.overrideModule('governanceFactory', address);\n }\n\n withV2Migrator(address: Address): this {\n return this.overrideModule('v2Migrator', address);\n }\n\n withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', address);\n }\n\n withNoOpMigrator(address: Address): this {\n return this.overrideModule('noOpMigrator', address);\n }\n\n build(): CreateStaticAuctionParams<C> {\n if (!this.token) throw new Error('tokenConfig is required');\n if (!this.sale) throw new Error('saleConfig is required');\n if (!this.migration) throw new Error('migration configuration is required');\n if (!this.userAddress) throw new Error('userAddress is required');\n\n // Convert deferred market cap config to pool if set\n if (this.marketCapConfig && !this.pool) {\n const config = this.marketCapConfig;\n\n // Get token supply from config or saleConfig\n const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n if (!tokenSupply) {\n throw new Error(\n 'tokenSupply must be provided (either via saleConfig() or withMarketCapRange() params)',\n );\n }\n\n // Determine fee and tick spacing\n const fee = config.fee ?? DEFAULT_V3_FEE;\n const tickSpacing =\n fee === 100\n ? TICK_SPACINGS[100]\n : fee === 500\n ? TICK_SPACINGS[500]\n : fee === 3000\n ? TICK_SPACINGS[3000]\n : TICK_SPACINGS[10000];\n\n // Validate market cap parameters\n const startValidation = validateMarketCapParameters(\n config.marketCap.start,\n tokenSupply,\n config.tokenDecimals,\n );\n const endValidation = validateMarketCapParameters(\n config.marketCap.end,\n tokenSupply,\n config.tokenDecimals,\n );\n\n // Log warnings if any\n const allWarnings = [\n ...startValidation.warnings,\n ...endValidation.warnings,\n ];\n if (allWarnings.length > 0) {\n console.warn('Market cap validation warnings:');\n allWarnings.forEach((w) => console.warn(` - ${w}`));\n }\n\n // Convert market cap range to ticks for V3 Static auction\n const { startTick, endTick } = marketCapToTicksForStaticAuction({\n marketCapRange: config.marketCap,\n tokenSupply,\n numerairePriceUSD: config.numerairePrice,\n tickSpacing,\n tokenDecimals: config.tokenDecimals ?? 18,\n numeraireDecimals: config.numeraireDecimals ?? 18,\n });\n\n // Set pool config\n this.pool = {\n startTick,\n endTick,\n fee,\n numPositions: config.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n config.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n };\n }\n\n if (!this.pool) throw new Error('pool configuration is required');\n\n // Default governance: noOp on supported chains, default on others (e.g., Ink)\n const governance =\n this.governance ??\n (isNoOpEnabledChain(this.chainId)\n ? { type: 'noOp' as const }\n : { type: 'default' as const });\n\n if (\n governance.type === 'launchpad' &&\n !isLaunchpadEnabledChain(this.chainId)\n ) {\n throw new Error(\n `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n );\n }\n\n // Merge beneficiaries into pool config if provided\n const poolWithBeneficiaries = this.beneficiaries\n ? { ...this.pool, beneficiaries: this.beneficiaries }\n : this.pool;\n\n // Validate noOp migration requires beneficiaries\n // NoOpMigrator is designed for locked pools with beneficiaries. Without beneficiaries,\n // the pool status is \"Initialized\" (not \"Locked\"), meaning exitLiquidity() can be called.\n // But NoOpMigrator.migrate() always reverts, so the entire graduation transaction fails\n // and liquidity becomes trapped.\n if (this.migration.type === 'noOp') {\n const hasBeneficiaries =\n poolWithBeneficiaries.beneficiaries &&\n poolWithBeneficiaries.beneficiaries.length > 0;\n if (!hasBeneficiaries) {\n throw new Error(\n 'noOp migration requires beneficiaries. Without beneficiaries, the pool would be stuck after reaching ' +\n 'graduation - exitLiquidity() succeeds but NoOpMigrator.migrate() always reverts, causing the entire ' +\n 'transaction to fail. Either add beneficiaries via withBeneficiaries() or use a different migration type (uniswapV2, uniswapV4).',\n );\n }\n }\n\n return {\n token: this.token,\n sale: this.sale,\n pool: poolWithBeneficiaries,\n vesting: this.vesting,\n governance: governance as GovernanceOption<C>,\n migration: this.migration,\n integrator: this.integrator ?? ZERO_ADDRESS,\n userAddress: this.userAddress,\n modules: this.moduleAddresses,\n gas: this.gasLimit,\n };\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var chunk7M57PU6V_js = require('./chunk-7M57PU6V.js');
|
|
4
4
|
var chunk6BQY5EPB_js = require('./chunk-6BQY5EPB.js');
|
|
5
|
-
var
|
|
5
|
+
var chunk7CAAI5DL_js = require('./chunk-7CAAI5DL.js');
|
|
6
6
|
var chunk3MVW6UIW_js = require('./chunk-3MVW6UIW.js');
|
|
7
7
|
var viem = require('viem');
|
|
8
8
|
|
|
@@ -40,7 +40,7 @@ var MulticurvePool = class {
|
|
|
40
40
|
*/
|
|
41
41
|
async findInitializerForPool() {
|
|
42
42
|
const chainId = await this.rpc.getChainId();
|
|
43
|
-
const addresses =
|
|
43
|
+
const addresses = chunk7CAAI5DL_js.getAddresses(chainId);
|
|
44
44
|
const initializersToTry = [
|
|
45
45
|
addresses.v4MulticurveInitializer,
|
|
46
46
|
addresses.v4ScheduledMulticurveInitializer,
|
|
@@ -95,7 +95,7 @@ var MulticurvePool = class {
|
|
|
95
95
|
throw new Error("Wallet client required to collect fees");
|
|
96
96
|
}
|
|
97
97
|
const chainId = await this.rpc.getChainId();
|
|
98
|
-
const addresses =
|
|
98
|
+
const addresses = chunk7CAAI5DL_js.getAddresses(chainId);
|
|
99
99
|
const { initializerAddress, state } = await this.findInitializerForPool();
|
|
100
100
|
if (state.status === 2 /* Locked */) {
|
|
101
101
|
const poolId = chunk7M57PU6V_js.computePoolId(state.poolKey);
|
|
@@ -236,5 +236,5 @@ var MulticurvePool = class {
|
|
|
236
236
|
};
|
|
237
237
|
|
|
238
238
|
exports.MulticurvePool = MulticurvePool;
|
|
239
|
-
//# sourceMappingURL=chunk-
|
|
240
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
//# sourceMappingURL=chunk-FZ4FIWCR.js.map
|
|
240
|
+
//# sourceMappingURL=chunk-FZ4FIWCR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/auction/MulticurvePool.ts"],"names":["getAddresses","zeroAddress","v4MulticurveInitializerAbi","computePoolId","v4MulticurveMigratorAbi","streamableFeesLockerAbi","DYNAMIC_FEE_FLAG","decayMulticurveInitializerHookAbi"],"mappings":";;;;;;;;AA8CO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,IAAY,GAAA,GAAoB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,WAAA,CACE,MAAA,EACA,YAAA,EACA,YAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAyC;AAC7C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAK,sBAAA,EAAuB;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,sBAAA,GAA8D;AAC1E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAW;AAC1C,IAAA,MAAM,SAAA,GAAYA,8BAAa,OAA2B,CAAA;AAG1D,IAAA,MAAM,iBAAA,GAA+B;AAAA,MACnC,SAAA,CAAU,uBAAA;AAAA,MACV,SAAA,CAAU,gCAAA;AAAA,MACV,SAAA,CAAU;AAAA,KACZ,CAAE,MAAA;AAAA,MACA,CAAC,IAAA,KAA0B,IAAA,KAAS,MAAA,IAAa,IAAA,KAASC;AAAA,KAC5D;AAEA,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,oBAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,sBAAsB,iBAAA,EAAmB;AAClD,MAAA,iBAAA,CAAkB,KAAK,kBAAkB,CAAA;AAEzC,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC5C,OAAA,EAAS,kBAAA;AAAA,QACT,GAAA,EAAKC,2CAAA;AAAA,QACL,YAAA,EAAc,UAAA;AAAA,QACd,IAAA,EAAM,CAAC,IAAA,CAAK,YAAY;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,CAAC,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA,GAAI,SAAA;AAajD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAI5C,MAAA,IAAI,OAAA,CAAQ,KAAA,KAAUD,gBAAA,IAAe,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC9D,QAAA,MAAM,KAAA,GAA6B;AAAA,UACjC,OAAO,IAAA,CAAK,YAAA;AAAA,UACZ,SAAA;AAAA,UACA,KAAK,OAAA,CAAQ,GAAA;AAAA,UACb,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,MAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA,EAAS,OAAO,OAAO;AAAA,SACzB;AACA,QAAA,OAAO,EAAE,oBAAoB,KAAA,EAAM;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4BAA4B,IAAA,CAAK,YAAY,yBACpB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,WAAA,GAIH;AACD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAW;AAC1C,IAAA,MAAM,SAAA,GAAYD,8BAAa,OAA2B,CAAA;AAG1D,IAAA,MAAM,EAAE,kBAAA,EAAoB,KAAA,EAAM,GAAI,MAAM,KAAK,sBAAA,EAAuB;AAExE,IAAA,IAAI,MAAM,MAAA,KAAA,CAAA,eAAsC;AAC9C,MAAA,MAAM,MAAA,GAASG,8BAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,QACV,kBAAA;AAAA,QACAD,2CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,MAAA,KAAA,CAAA,eAAsC;AAC9C,MAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AACzB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC5C,SAAS,SAAA,CAAU,UAAA;AAAA,QACnB,GAAA,EAAKE,wCAAA;AAAA,QACL,YAAA,EAAc,cAAA;AAAA,QACd,MAAM,CAAC,KAAA,CAAM,QAAQ,SAAA,EAAW,KAAA,CAAM,QAAQ,SAAS;AAAA,OACxD,CAAA;AAED,MAAA,MAAM,kBAAkB,IAAA,CAAK,YAAA;AAAA,QAC1B,SAAA,CAAkB,OAAA,IAAY,SAAA,CAAkB,CAAC;AAAA,OACpD;AACA,MAAA,MAAM,MAAA,GAASD,+BAAc,eAAe,CAAA;AAE5C,MAAA,MAAM,gBACH,SAAA,CAAkB,aAAA,IAAkB,SAAA,CAAkB,CAAC,KAAK,EAAC;AAChE,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,IAAK,aAAA,CAAc,WAAW,CAAA,EAAG;AAC/D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,oBAAA;AAAA,QAC/B,SAAA,CAAU,UAAA;AAAA,QACV,SAAA,CAAU;AAAA,OACZ;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC7C,OAAA,EAAS,aAAA;AAAA,QACT,GAAA,EAAKE,wCAAA;AAAA,QACL,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAM;AAAA,OACd,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,MAAA;AAAA,QACf,UAAA,CAAmB,SAAA,IAAc,UAAA,CAAmB,CAAC,CAAA,IAAK;AAAA,OAC7D;AACA,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AAEA,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,QACV,aAAA;AAAA,QACAA,wCAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAAwC;AAC5C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,IAAA,OAAO,KAAA,CAAM,SAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,GAA6D;AACjE,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAK,sBAAA,EAAuB;AACpD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,KAAQC,iCAAA,EAAkB;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAASH,8BAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC/C,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,QACvB,GAAA,EAAKI,kDAAA;AAAA,QACL,YAAA,EAAc,kBAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAM;AAAA,OACd,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,YAAA;AACvB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,MAAA;AAAA,UACZ,cAAA,CAAe,YAAA,IAAgB,cAAA,CAAe,CAAC,CAAA,IAAK;AAAA,SACtD;AAAA,QACA,UAAU,MAAA,CAAO,cAAA,CAAe,YAAY,cAAA,CAAe,CAAC,KAAK,CAAC,CAAA;AAAA,QAClE,QAAQ,MAAA,CAAO,cAAA,CAAe,UAAU,cAAA,CAAe,CAAC,KAAK,CAAC,CAAA;AAAA,QAC9D,SAAS,MAAA,CAAO,cAAA,CAAe,WAAW,cAAA,CAAe,CAAC,KAAK,CAAC,CAAA;AAAA,QAChE,eAAA,EAAiB,MAAA;AAAA,UACf,cAAA,CAAe,eAAA,IAAmB,cAAA,CAAe,CAAC,CAAA,IAAK;AAAA;AACzD,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,2BAAA,EAA8B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,yCAAA;AAAA,OACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,UAAA,EAAgC;AACnD,IAAA,MAAM,aAAA,GAAgB,UAAA;AACtB,IAAA,OAAO;AAAA,MACL,SAAA,EAAY,aAAA,CAAc,SAAA,IAAa,aAAA,CAAc,CAAC,CAAA;AAAA,MACtD,SAAA,EAAY,aAAA,CAAc,SAAA,IAAa,aAAA,CAAc,CAAC,CAAA;AAAA,MACtD,KAAK,MAAA,CAAO,aAAA,CAAc,GAAA,IAAO,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,MACjD,aAAa,MAAA,CAAO,aAAA,CAAc,WAAA,IAAe,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,MACjE,KAAA,EAAQ,aAAA,CAAc,KAAA,IAAS,aAAA,CAAc,CAAC;AAAA,KAChD;AAAA,EACF;AAAA,EAEA,MAAc,oBAAA,CACZ,eAAA,EACA,gBAAA,EACkB;AAClB,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAChD,OAAA,EAAS,eAAA;AAAA,MACT,GAAA,EAAKH,wCAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,MAAM;AAAC,KACR,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEA,MAAc,uBAAA,CACZ,eAAA,EACA,GAAA,EACA,MAAA,EACkE;AAClE,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAAM,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MAC1D,OAAA,EAAS,eAAA;AAAA,MACT,GAAA;AAAA,MACA,YAAA,EAAc,aAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,OAAA,EAAS,KAAK,YAAA,CAAc;AAAA,KAC7B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAc,cAAc,OAAO,CAAA;AAE3D,IAAA,MAAM,KAAK,GAAA,CAAI,yBAAA,CAA0B,EAAE,IAAA,EAAM,aAAA,EAAe,GAAG,CAAA;AAEnE,IAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAA;AAEvB,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AACF","file":"chunk-HHHCRTC7.js","sourcesContent":["import {\n type Address,\n type PublicClient,\n type WalletClient,\n type Hash,\n type Hex,\n zeroAddress,\n} from 'viem';\nimport {\n LockablePoolStatus,\n type MulticurveDecayFeeSchedule,\n type MulticurvePoolState,\n type SupportedPublicClient,\n type V4PoolKey,\n} from '../../types';\nimport {\n decayMulticurveInitializerHookAbi,\n v4MulticurveInitializerAbi,\n v4MulticurveMigratorAbi,\n streamableFeesLockerAbi,\n} from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport type { SupportedChainId } from '../../addresses';\nimport { DYNAMIC_FEE_FLAG } from '../../constants';\nimport { computePoolId } from '../../utils/poolKey';\n\n/** Result from finding which initializer contains the pool */\ninterface InitializerDiscoveryResult {\n initializerAddress: Address;\n state: MulticurvePoolState;\n}\n\n/**\n * MulticurvePool class for interacting with V4 multicurve pools\n *\n * Multicurve pools use the V4 multicurve initializer which supports:\n * - Multiple bonding curves with different price ranges\n * - Fee collection for configured beneficiaries\n * - No-migration lockable liquidity\n *\n * Note: V4 pools don't have their own contract addresses. The token address\n * is used as the lookup key to retrieve pool state from the initializer contract.\n *\n * Terminology: The contracts call the created token \"asset\" (paired against \"numeraire\", e.g., WETH).\n * We use \"tokenAddress\" in the SDK for consistency.\n */\nexport class MulticurvePool {\n private client: SupportedPublicClient;\n private walletClient?: WalletClient;\n private tokenAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(\n client: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n tokenAddress: Address,\n ) {\n this.client = client;\n this.walletClient = walletClient;\n this.tokenAddress = tokenAddress;\n }\n\n /**\n * Get the token address for this pool\n * This is also the lookup key used to retrieve pool state from the initializer\n * (Called \"asset\" in the contracts, but we use \"tokenAddress\" for SDK consistency)\n */\n getTokenAddress(): Address {\n return this.tokenAddress;\n }\n\n /**\n * Get current pool state from the multicurve initializer\n *\n * Automatically discovers which initializer (standard, scheduled, or decay) contains the pool.\n */\n async getState(): Promise<MulticurvePoolState> {\n const { state } = await this.findInitializerForPool();\n return state;\n }\n\n /**\n * Find which initializer contains this pool and return both the address and state.\n *\n * Tries v4MulticurveInitializer first (more common), then falls back to\n * v4ScheduledMulticurveInitializer and v4DecayMulticurveInitializer if needed.\n */\n private async findInitializerForPool(): Promise<InitializerDiscoveryResult> {\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Build list of initializers to try, preferring non-scheduled (more common)\n const initializersToTry: Address[] = [\n addresses.v4MulticurveInitializer,\n addresses.v4ScheduledMulticurveInitializer,\n addresses.v4DecayMulticurveInitializer,\n ].filter(\n (addr): addr is Address => addr !== undefined && addr !== zeroAddress,\n );\n\n if (initializersToTry.length === 0) {\n throw new Error(\n 'No V4 multicurve initializer addresses configured for this chain',\n );\n }\n\n const triedInitializers: Address[] = [];\n\n for (const initializerAddress of initializersToTry) {\n triedInitializers.push(initializerAddress);\n\n const stateData = await this.rpc.readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'getState',\n args: [this.tokenAddress],\n });\n\n // Parse the returned tuple into a strongly typed PoolKey\n const [numeraire, status, rawPoolKey, farTick] = stateData as readonly [\n Address,\n number,\n {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n } & readonly [Address, Address, number, number, Address],\n number,\n ];\n\n const poolKey = this.parsePoolKey(rawPoolKey);\n\n // Check if pool exists in this initializer\n // A non-existent pool will have zeroed hooks and tickSpacing\n if (poolKey.hooks !== zeroAddress && poolKey.tickSpacing !== 0) {\n const state: MulticurvePoolState = {\n asset: this.tokenAddress,\n numeraire,\n fee: poolKey.fee,\n tickSpacing: poolKey.tickSpacing,\n status,\n poolKey,\n farTick: Number(farTick),\n };\n return { initializerAddress, state };\n }\n }\n\n // Pool not found in any initializer\n throw new Error(\n `Pool not found for token ${this.tokenAddress}. ` +\n `Tried initializers: ${triedInitializers.join(', ')}`,\n );\n }\n\n /**\n * Collect fees from the pool and distribute to beneficiaries\n *\n * This function can be called by any beneficiary to trigger fee collection\n * and distribution. Fees are automatically distributed according to the\n * configured beneficiary shares.\n *\n * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash\n */\n async collectFees(): Promise<{\n fees0: bigint;\n fees1: bigint;\n transactionHash: Hash;\n }> {\n if (!this.walletClient) {\n throw new Error('Wallet client required to collect fees');\n }\n\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Discover which initializer has this pool and get state in one call\n const { initializerAddress, state } = await this.findInitializerForPool();\n\n if (state.status === LockablePoolStatus.Locked) {\n const poolId = computePoolId(state.poolKey);\n return this.collectFeesFromContract(\n initializerAddress,\n v4MulticurveInitializerAbi,\n poolId,\n );\n }\n\n if (state.status === LockablePoolStatus.Exited) {\n if (!addresses.v4Migrator) {\n throw new Error(\n 'V4 multicurve migrator address not configured for this chain',\n );\n }\n\n const assetData = await this.rpc.readContract({\n address: addresses.v4Migrator,\n abi: v4MulticurveMigratorAbi,\n functionName: 'getAssetData',\n args: [state.poolKey.currency0, state.poolKey.currency1],\n });\n\n const migratorPoolKey = this.parsePoolKey(\n (assetData as any).poolKey ?? (assetData as any)[1],\n );\n const poolId = computePoolId(migratorPoolKey);\n\n const beneficiaries =\n (assetData as any).beneficiaries ?? (assetData as any)[4] ?? [];\n if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {\n throw new Error(\n 'Migrated multicurve pool has no beneficiaries configured',\n );\n }\n\n const lockerAddress = await this.resolveLockerAddress(\n addresses.v4Migrator,\n addresses.streamableFeesLocker,\n );\n\n const streamData = await this.rpc.readContract({\n address: lockerAddress,\n abi: streamableFeesLockerAbi,\n functionName: 'streams',\n args: [poolId],\n });\n\n const startDate = Number(\n (streamData as any).startDate ?? (streamData as any)[2] ?? 0,\n );\n if (startDate === 0) {\n throw new Error('Migrated multicurve stream not initialized');\n }\n\n return this.collectFeesFromContract(\n lockerAddress,\n streamableFeesLockerAbi,\n poolId,\n );\n }\n\n throw new Error('Multicurve pool is not locked or migrated');\n }\n\n /**\n * Get the numeraire address for this pool\n */\n async getNumeraireAddress(): Promise<Address> {\n const state = await this.getState();\n return state.numeraire;\n }\n\n /**\n * Get the decay fee schedule for dynamic-fee multicurve pools.\n *\n * Returns `null` when the pool is not using dynamic fees.\n */\n async getFeeSchedule(): Promise<MulticurveDecayFeeSchedule | null> {\n const { state } = await this.findInitializerForPool();\n if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {\n return null;\n }\n\n const poolId = computePoolId(state.poolKey);\n try {\n const scheduleData = await this.rpc.readContract({\n address: state.poolKey.hooks,\n abi: decayMulticurveInitializerHookAbi,\n functionName: 'getFeeScheduleOf',\n args: [poolId],\n });\n\n const scheduleStruct = scheduleData as any;\n return {\n startingTime: Number(\n scheduleStruct.startingTime ?? scheduleStruct[0] ?? 0,\n ),\n startFee: Number(scheduleStruct.startFee ?? scheduleStruct[1] ?? 0),\n endFee: Number(scheduleStruct.endFee ?? scheduleStruct[2] ?? 0),\n lastFee: Number(scheduleStruct.lastFee ?? scheduleStruct[3] ?? 0),\n durationSeconds: Number(\n scheduleStruct.durationSeconds ?? scheduleStruct[4] ?? 0,\n ),\n };\n } catch {\n throw new Error(\n `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,\n );\n }\n }\n\n private parsePoolKey(rawPoolKey: unknown): V4PoolKey {\n const poolKeyStruct = rawPoolKey as any;\n return {\n currency0: (poolKeyStruct.currency0 ?? poolKeyStruct[0]) as Address,\n currency1: (poolKeyStruct.currency1 ?? poolKeyStruct[1]) as Address,\n fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),\n tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),\n hooks: (poolKeyStruct.hooks ?? poolKeyStruct[4]) as Address,\n };\n }\n\n private async resolveLockerAddress(\n migratorAddress: Address,\n configuredLocker?: Address,\n ): Promise<Address> {\n if (configuredLocker) {\n return configuredLocker;\n }\n\n const lockerAddress = await this.rpc.readContract({\n address: migratorAddress,\n abi: v4MulticurveMigratorAbi,\n functionName: 'locker',\n args: [],\n });\n\n return lockerAddress as Address;\n }\n\n private async collectFeesFromContract(\n contractAddress: Address,\n abi: typeof v4MulticurveInitializerAbi | typeof streamableFeesLockerAbi,\n poolId: Hex,\n ): Promise<{ fees0: bigint; fees1: bigint; transactionHash: Hash }> {\n const { request, result } = await this.rpc.simulateContract({\n address: contractAddress,\n abi,\n functionName: 'collectFees',\n args: [poolId],\n account: this.walletClient!.account,\n });\n\n const hash = await this.walletClient!.writeContract(request);\n\n await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n const [fees0, fees1] = result as readonly [bigint, bigint];\n\n return {\n fees0,\n fees1,\n transactionHash: hash,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/auction/MulticurvePool.ts"],"names":["getAddresses","zeroAddress","v4MulticurveInitializerAbi","computePoolId","v4MulticurveMigratorAbi","streamableFeesLockerAbi","DYNAMIC_FEE_FLAG","decayMulticurveInitializerHookAbi"],"mappings":"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","file":"chunk-FZ4FIWCR.js","sourcesContent":["import {\n type Address,\n type PublicClient,\n type WalletClient,\n type Hash,\n type Hex,\n zeroAddress,\n} from 'viem';\nimport {\n LockablePoolStatus,\n type MulticurveDecayFeeSchedule,\n type MulticurvePoolState,\n type SupportedPublicClient,\n type V4PoolKey,\n} from '../../types';\nimport {\n decayMulticurveInitializerHookAbi,\n v4MulticurveInitializerAbi,\n v4MulticurveMigratorAbi,\n streamableFeesLockerAbi,\n} from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport type { SupportedChainId } from '../../addresses';\nimport { DYNAMIC_FEE_FLAG } from '../../constants';\nimport { computePoolId } from '../../utils/poolKey';\n\n/** Result from finding which initializer contains the pool */\ninterface InitializerDiscoveryResult {\n initializerAddress: Address;\n state: MulticurvePoolState;\n}\n\n/**\n * MulticurvePool class for interacting with V4 multicurve pools\n *\n * Multicurve pools use the V4 multicurve initializer which supports:\n * - Multiple bonding curves with different price ranges\n * - Fee collection for configured beneficiaries\n * - No-migration lockable liquidity\n *\n * Note: V4 pools don't have their own contract addresses. The token address\n * is used as the lookup key to retrieve pool state from the initializer contract.\n *\n * Terminology: The contracts call the created token \"asset\" (paired against \"numeraire\", e.g., WETH).\n * We use \"tokenAddress\" in the SDK for consistency.\n */\nexport class MulticurvePool {\n private client: SupportedPublicClient;\n private walletClient?: WalletClient;\n private tokenAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(\n client: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n tokenAddress: Address,\n ) {\n this.client = client;\n this.walletClient = walletClient;\n this.tokenAddress = tokenAddress;\n }\n\n /**\n * Get the token address for this pool\n * This is also the lookup key used to retrieve pool state from the initializer\n * (Called \"asset\" in the contracts, but we use \"tokenAddress\" for SDK consistency)\n */\n getTokenAddress(): Address {\n return this.tokenAddress;\n }\n\n /**\n * Get current pool state from the multicurve initializer\n *\n * Automatically discovers which initializer (standard, scheduled, or decay) contains the pool.\n */\n async getState(): Promise<MulticurvePoolState> {\n const { state } = await this.findInitializerForPool();\n return state;\n }\n\n /**\n * Find which initializer contains this pool and return both the address and state.\n *\n * Tries v4MulticurveInitializer first (more common), then falls back to\n * v4ScheduledMulticurveInitializer and v4DecayMulticurveInitializer if needed.\n */\n private async findInitializerForPool(): Promise<InitializerDiscoveryResult> {\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Build list of initializers to try, preferring non-scheduled (more common)\n const initializersToTry: Address[] = [\n addresses.v4MulticurveInitializer,\n addresses.v4ScheduledMulticurveInitializer,\n addresses.v4DecayMulticurveInitializer,\n ].filter(\n (addr): addr is Address => addr !== undefined && addr !== zeroAddress,\n );\n\n if (initializersToTry.length === 0) {\n throw new Error(\n 'No V4 multicurve initializer addresses configured for this chain',\n );\n }\n\n const triedInitializers: Address[] = [];\n\n for (const initializerAddress of initializersToTry) {\n triedInitializers.push(initializerAddress);\n\n const stateData = await this.rpc.readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'getState',\n args: [this.tokenAddress],\n });\n\n // Parse the returned tuple into a strongly typed PoolKey\n const [numeraire, status, rawPoolKey, farTick] = stateData as readonly [\n Address,\n number,\n {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n } & readonly [Address, Address, number, number, Address],\n number,\n ];\n\n const poolKey = this.parsePoolKey(rawPoolKey);\n\n // Check if pool exists in this initializer\n // A non-existent pool will have zeroed hooks and tickSpacing\n if (poolKey.hooks !== zeroAddress && poolKey.tickSpacing !== 0) {\n const state: MulticurvePoolState = {\n asset: this.tokenAddress,\n numeraire,\n fee: poolKey.fee,\n tickSpacing: poolKey.tickSpacing,\n status,\n poolKey,\n farTick: Number(farTick),\n };\n return { initializerAddress, state };\n }\n }\n\n // Pool not found in any initializer\n throw new Error(\n `Pool not found for token ${this.tokenAddress}. ` +\n `Tried initializers: ${triedInitializers.join(', ')}`,\n );\n }\n\n /**\n * Collect fees from the pool and distribute to beneficiaries\n *\n * This function can be called by any beneficiary to trigger fee collection\n * and distribution. Fees are automatically distributed according to the\n * configured beneficiary shares.\n *\n * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash\n */\n async collectFees(): Promise<{\n fees0: bigint;\n fees1: bigint;\n transactionHash: Hash;\n }> {\n if (!this.walletClient) {\n throw new Error('Wallet client required to collect fees');\n }\n\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Discover which initializer has this pool and get state in one call\n const { initializerAddress, state } = await this.findInitializerForPool();\n\n if (state.status === LockablePoolStatus.Locked) {\n const poolId = computePoolId(state.poolKey);\n return this.collectFeesFromContract(\n initializerAddress,\n v4MulticurveInitializerAbi,\n poolId,\n );\n }\n\n if (state.status === LockablePoolStatus.Exited) {\n if (!addresses.v4Migrator) {\n throw new Error(\n 'V4 multicurve migrator address not configured for this chain',\n );\n }\n\n const assetData = await this.rpc.readContract({\n address: addresses.v4Migrator,\n abi: v4MulticurveMigratorAbi,\n functionName: 'getAssetData',\n args: [state.poolKey.currency0, state.poolKey.currency1],\n });\n\n const migratorPoolKey = this.parsePoolKey(\n (assetData as any).poolKey ?? (assetData as any)[1],\n );\n const poolId = computePoolId(migratorPoolKey);\n\n const beneficiaries =\n (assetData as any).beneficiaries ?? (assetData as any)[4] ?? [];\n if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {\n throw new Error(\n 'Migrated multicurve pool has no beneficiaries configured',\n );\n }\n\n const lockerAddress = await this.resolveLockerAddress(\n addresses.v4Migrator,\n addresses.streamableFeesLocker,\n );\n\n const streamData = await this.rpc.readContract({\n address: lockerAddress,\n abi: streamableFeesLockerAbi,\n functionName: 'streams',\n args: [poolId],\n });\n\n const startDate = Number(\n (streamData as any).startDate ?? (streamData as any)[2] ?? 0,\n );\n if (startDate === 0) {\n throw new Error('Migrated multicurve stream not initialized');\n }\n\n return this.collectFeesFromContract(\n lockerAddress,\n streamableFeesLockerAbi,\n poolId,\n );\n }\n\n throw new Error('Multicurve pool is not locked or migrated');\n }\n\n /**\n * Get the numeraire address for this pool\n */\n async getNumeraireAddress(): Promise<Address> {\n const state = await this.getState();\n return state.numeraire;\n }\n\n /**\n * Get the decay fee schedule for dynamic-fee multicurve pools.\n *\n * Returns `null` when the pool is not using dynamic fees.\n */\n async getFeeSchedule(): Promise<MulticurveDecayFeeSchedule | null> {\n const { state } = await this.findInitializerForPool();\n if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {\n return null;\n }\n\n const poolId = computePoolId(state.poolKey);\n try {\n const scheduleData = await this.rpc.readContract({\n address: state.poolKey.hooks,\n abi: decayMulticurveInitializerHookAbi,\n functionName: 'getFeeScheduleOf',\n args: [poolId],\n });\n\n const scheduleStruct = scheduleData as any;\n return {\n startingTime: Number(\n scheduleStruct.startingTime ?? scheduleStruct[0] ?? 0,\n ),\n startFee: Number(scheduleStruct.startFee ?? scheduleStruct[1] ?? 0),\n endFee: Number(scheduleStruct.endFee ?? scheduleStruct[2] ?? 0),\n lastFee: Number(scheduleStruct.lastFee ?? scheduleStruct[3] ?? 0),\n durationSeconds: Number(\n scheduleStruct.durationSeconds ?? scheduleStruct[4] ?? 0,\n ),\n };\n } catch {\n throw new Error(\n `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,\n );\n }\n }\n\n private parsePoolKey(rawPoolKey: unknown): V4PoolKey {\n const poolKeyStruct = rawPoolKey as any;\n return {\n currency0: (poolKeyStruct.currency0 ?? poolKeyStruct[0]) as Address,\n currency1: (poolKeyStruct.currency1 ?? poolKeyStruct[1]) as Address,\n fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),\n tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),\n hooks: (poolKeyStruct.hooks ?? poolKeyStruct[4]) as Address,\n };\n }\n\n private async resolveLockerAddress(\n migratorAddress: Address,\n configuredLocker?: Address,\n ): Promise<Address> {\n if (configuredLocker) {\n return configuredLocker;\n }\n\n const lockerAddress = await this.rpc.readContract({\n address: migratorAddress,\n abi: v4MulticurveMigratorAbi,\n functionName: 'locker',\n args: [],\n });\n\n return lockerAddress as Address;\n }\n\n private async collectFeesFromContract(\n contractAddress: Address,\n abi: typeof v4MulticurveInitializerAbi | typeof streamableFeesLockerAbi,\n poolId: Hex,\n ): Promise<{ fees0: bigint; fees1: bigint; transactionHash: Hash }> {\n const { request, result } = await this.rpc.simulateContract({\n address: contractAddress,\n abi,\n functionName: 'collectFees',\n args: [poolId],\n account: this.walletClient!.account,\n });\n\n const hash = await this.walletClient!.writeContract(request);\n\n await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n const [fees0, fees1] = result as readonly [bigint, bigint];\n\n return {\n fees0,\n fees1,\n transactionHash: hash,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { encodeAbiParameters } from 'viem';
|
|
2
|
+
|
|
3
|
+
// src/utils/dopplerHookMigrator.ts
|
|
4
|
+
function encodeRehypeDopplerHookMigratorCalldata(params) {
|
|
5
|
+
return encodeAbiParameters(
|
|
6
|
+
[
|
|
7
|
+
{ type: "address" },
|
|
8
|
+
// numeraire
|
|
9
|
+
{ type: "address" },
|
|
10
|
+
// buybackDestination
|
|
11
|
+
{ type: "uint24" },
|
|
12
|
+
// customFee
|
|
13
|
+
{ type: "uint256" },
|
|
14
|
+
// assetBuybackPercentWad
|
|
15
|
+
{ type: "uint256" },
|
|
16
|
+
// numeraireBuybackPercentWad
|
|
17
|
+
{ type: "uint256" },
|
|
18
|
+
// beneficiaryPercentWad
|
|
19
|
+
{ type: "uint256" }
|
|
20
|
+
// lpPercentWad
|
|
21
|
+
],
|
|
22
|
+
[
|
|
23
|
+
params.numeraire,
|
|
24
|
+
params.config.buybackDestination,
|
|
25
|
+
params.config.customFee,
|
|
26
|
+
params.config.assetBuybackPercentWad,
|
|
27
|
+
params.config.numeraireBuybackPercentWad,
|
|
28
|
+
params.config.beneficiaryPercentWad,
|
|
29
|
+
params.config.lpPercentWad
|
|
30
|
+
]
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { encodeRehypeDopplerHookMigratorCalldata };
|
|
35
|
+
//# sourceMappingURL=chunk-GDODJJ7D.mjs.map
|
|
36
|
+
//# sourceMappingURL=chunk-GDODJJ7D.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/dopplerHookMigrator.ts"],"names":[],"mappings":";;;AAGO,SAAS,wCAAwC,MAAA,EAGhD;AACN,EAAA,OAAO,mBAAA;AAAA,IACL;AAAA,MACE,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,MAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,MAClB,EAAE,MAAM,QAAA,EAAS;AAAA;AAAA,MACjB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,MAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,MAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,MAClB,EAAE,MAAM,SAAA;AAAU;AAAA,KACpB;AAAA,IACA;AAAA,MACE,MAAA,CAAO,SAAA;AAAA,MACP,OAAO,MAAA,CAAO,kBAAA;AAAA,MACd,OAAO,MAAA,CAAO,SAAA;AAAA,MACd,OAAO,MAAA,CAAO,sBAAA;AAAA,MACd,OAAO,MAAA,CAAO,0BAAA;AAAA,MACd,OAAO,MAAA,CAAO,qBAAA;AAAA,MACd,OAAO,MAAA,CAAO;AAAA;AAChB,GACF;AACF","file":"chunk-GDODJJ7D.mjs","sourcesContent":["import { encodeAbiParameters, type Address, type Hex } from 'viem';\nimport type { RehypeDopplerHookMigratorConfig } from '../types';\n\nexport function encodeRehypeDopplerHookMigratorCalldata(params: {\n numeraire: Address;\n config: RehypeDopplerHookMigratorConfig;\n}): Hex {\n return encodeAbiParameters(\n [\n { type: 'address' }, // numeraire\n { type: 'address' }, // buybackDestination\n { type: 'uint24' }, // customFee\n { type: 'uint256' }, // assetBuybackPercentWad\n { type: 'uint256' }, // numeraireBuybackPercentWad\n { type: 'uint256' }, // beneficiaryPercentWad\n { type: 'uint256' }, // lpPercentWad\n ],\n [\n params.numeraire,\n params.config.buybackDestination,\n params.config.customFee,\n params.config.assetBuybackPercentWad,\n params.config.numeraireBuybackPercentWad,\n params.config.beneficiaryPercentWad,\n params.config.lpPercentWad,\n ],\n );\n}\n"]}
|
|
@@ -274,5 +274,5 @@ function tickToMarketCap(params) {
|
|
|
274
274
|
}
|
|
275
275
|
|
|
276
276
|
export { applyTickOffsets, getMaxTickRounded, isToken1, marketCapToTickForMulticurve, marketCapToTicksForDynamicAuction, marketCapToTicksForMulticurve, marketCapToTicksForStaticAuction, marketCapToTokenPrice, ratioToTick, tickToMarketCap, tokenPriceToRatio, validateMarketCapParameters };
|
|
277
|
-
//# sourceMappingURL=chunk-
|
|
278
|
-
//# sourceMappingURL=chunk-
|
|
277
|
+
//# sourceMappingURL=chunk-GSBQIVME.mjs.map
|
|
278
|
+
//# sourceMappingURL=chunk-GSBQIVME.mjs.map
|