@whetstone-research/doppler-sdk 0.0.17 → 0.0.19
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 +66 -1
- package/dist/DopplerSDK.js +19 -19
- package/dist/DopplerSDK.mjs +18 -18
- package/dist/abis/index.d.mts +32 -1
- package/dist/abis/index.d.ts +32 -1
- package/dist/abis/index.js +26 -22
- package/dist/abis/index.mjs +1 -1
- package/dist/addresses.d.mts +1 -0
- package/dist/addresses.d.ts +1 -0
- package/dist/addresses.js +7 -7
- package/dist/addresses.mjs +2 -2
- package/dist/builders/DynamicAuctionBuilder.js +10 -10
- package/dist/builders/DynamicAuctionBuilder.mjs +9 -9
- package/dist/builders/MulticurveBuilder.d.mts +16 -0
- package/dist/builders/MulticurveBuilder.d.ts +16 -0
- package/dist/builders/MulticurveBuilder.js +10 -10
- package/dist/builders/MulticurveBuilder.mjs +9 -9
- package/dist/builders/StaticAuctionBuilder.js +10 -10
- package/dist/builders/StaticAuctionBuilder.mjs +9 -9
- package/dist/builders/index.js +18 -18
- package/dist/builders/index.mjs +11 -11
- package/dist/builders/shared.js +11 -11
- package/dist/builders/shared.mjs +7 -7
- package/dist/{chunk-LOVD3NCN.js → chunk-3MVW6UIW.js} +18 -2
- package/dist/chunk-3MVW6UIW.js.map +1 -0
- package/dist/{chunk-DVAQB7TB.mjs → chunk-3NFSMMBF.mjs} +3 -3
- package/dist/{chunk-DVAQB7TB.mjs.map → chunk-3NFSMMBF.mjs.map} +1 -1
- package/dist/{chunk-PBWOCVDZ.mjs → chunk-4TAAZ6W3.mjs} +248 -51
- package/dist/chunk-4TAAZ6W3.mjs.map +1 -0
- package/dist/{chunk-4DUE547M.js → chunk-6BQY5EPB.js} +4 -2
- package/dist/chunk-6BQY5EPB.js.map +1 -0
- package/dist/{chunk-HVM7KZJM.mjs → chunk-6HFZ6XMV.mjs} +4 -4
- package/dist/{chunk-HVM7KZJM.mjs.map → chunk-6HFZ6XMV.mjs.map} +1 -1
- package/dist/{chunk-EG6O2TUX.js → chunk-7Z2UGWE7.js} +26 -26
- package/dist/{chunk-EG6O2TUX.js.map → chunk-7Z2UGWE7.js.map} +1 -1
- package/dist/{chunk-O2DZH23A.mjs → chunk-CYY5IATT.mjs} +9 -5
- package/dist/chunk-CYY5IATT.mjs.map +1 -0
- package/dist/{chunk-BZKX3J3R.mjs → chunk-E2NF4AQB.mjs} +18 -3
- package/dist/chunk-E2NF4AQB.mjs.map +1 -0
- package/dist/{chunk-B4B7BXLI.js → chunk-E6ACC5S6.js} +24 -24
- package/dist/{chunk-B4B7BXLI.js.map → chunk-E6ACC5S6.js.map} +1 -1
- package/dist/{chunk-K5CV3MIH.mjs → chunk-FQ3PVXZU.mjs} +5 -5
- package/dist/{chunk-K5CV3MIH.mjs.map → chunk-FQ3PVXZU.mjs.map} +1 -1
- package/dist/{chunk-WQKBQRBS.mjs → chunk-GCT3IZ3E.mjs} +12 -12
- package/dist/{chunk-WQKBQRBS.mjs.map → chunk-GCT3IZ3E.mjs.map} +1 -1
- package/dist/{chunk-LDZCTC5Q.mjs → chunk-H5SUGQ2C.mjs} +45 -7
- package/dist/chunk-H5SUGQ2C.mjs.map +1 -0
- package/dist/{chunk-PE47QUJV.mjs → chunk-HH7HQ4HC.mjs} +3 -3
- package/dist/{chunk-PE47QUJV.mjs.map → chunk-HH7HQ4HC.mjs.map} +1 -1
- package/dist/{chunk-LXUF7RNX.mjs → chunk-IWJOPXYN.mjs} +4 -3
- package/dist/chunk-IWJOPXYN.mjs.map +1 -0
- package/dist/{chunk-MBOKYN2Y.js → chunk-K3TEDYUG.js} +20 -20
- package/dist/{chunk-MBOKYN2Y.js.map → chunk-K3TEDYUG.js.map} +1 -1
- package/dist/{chunk-NVVEUALG.mjs → chunk-MH74WYVZ.mjs} +5 -5
- package/dist/{chunk-NVVEUALG.mjs.map → chunk-MH74WYVZ.mjs.map} +1 -1
- package/dist/{chunk-ZVH7VBH5.mjs → chunk-N74ICDSX.mjs} +118 -20
- package/dist/chunk-N74ICDSX.mjs.map +1 -0
- package/dist/{chunk-C7GN6GPG.js → chunk-OROTK4OT.js} +51 -27
- package/dist/chunk-OROTK4OT.js.map +1 -0
- package/dist/{chunk-Z7ZGPSQF.js → chunk-P4BT5GDO.js} +76 -72
- package/dist/chunk-P4BT5GDO.js.map +1 -0
- package/dist/{chunk-YBDWQTUH.mjs → chunk-QFQXHDC7.mjs} +76 -9
- package/dist/chunk-QFQXHDC7.mjs.map +1 -0
- package/dist/{chunk-RKJ2466C.mjs → chunk-QOGBOT2M.mjs} +3 -3
- package/dist/{chunk-RKJ2466C.mjs.map → chunk-QOGBOT2M.mjs.map} +1 -1
- package/dist/{chunk-3ALNQHGL.js → chunk-RLUMYHPI.js} +76 -9
- package/dist/chunk-RLUMYHPI.js.map +1 -0
- package/dist/{chunk-5FJCRKQ6.js → chunk-RXUJ4DUB.js} +28 -28
- package/dist/{chunk-5FJCRKQ6.js.map → chunk-RXUJ4DUB.js.map} +1 -1
- package/dist/{chunk-MGLI4N4B.js → chunk-SAX7P3MH.js} +22 -22
- package/dist/{chunk-MGLI4N4B.js.map → chunk-SAX7P3MH.js.map} +1 -1
- package/dist/{chunk-3ORKVXQL.js → chunk-TJCMFITE.js} +27 -27
- package/dist/{chunk-3ORKVXQL.js.map → chunk-TJCMFITE.js.map} +1 -1
- package/dist/{chunk-TL7U67CX.js → chunk-UIPSHVT4.js} +11 -11
- package/dist/{chunk-TL7U67CX.js.map → chunk-UIPSHVT4.js.map} +1 -1
- package/dist/{chunk-5ZPBKSNS.mjs → chunk-UY4TVYEU.mjs} +3 -3
- package/dist/{chunk-5ZPBKSNS.mjs.map → chunk-UY4TVYEU.mjs.map} +1 -1
- package/dist/{chunk-PQUS2LCD.js → chunk-UZTVXZP3.js} +16 -16
- package/dist/{chunk-PQUS2LCD.js.map → chunk-UZTVXZP3.js.map} +1 -1
- package/dist/{chunk-HMZEYBFO.mjs → chunk-V32Q2S3U.mjs} +4 -4
- package/dist/{chunk-HMZEYBFO.mjs.map → chunk-V32Q2S3U.mjs.map} +1 -1
- package/dist/{chunk-7F4O7NPS.js → chunk-V5GPJ6S2.js} +26 -26
- package/dist/{chunk-7F4O7NPS.js.map → chunk-V5GPJ6S2.js.map} +1 -1
- package/dist/{chunk-DOWDXOTK.mjs → chunk-VGCXJRUV.mjs} +51 -27
- package/dist/chunk-VGCXJRUV.mjs.map +1 -0
- package/dist/{chunk-J32XSN44.js → chunk-WYRM5BAI.js} +344 -147
- package/dist/chunk-WYRM5BAI.js.map +1 -0
- package/dist/{chunk-OUUFER2X.mjs → chunk-X7FRTHUL.mjs} +4 -4
- package/dist/{chunk-OUUFER2X.mjs.map → chunk-X7FRTHUL.mjs.map} +1 -1
- package/dist/{chunk-E54BP2GN.js → chunk-Y6VZD4C6.js} +53 -15
- package/dist/chunk-Y6VZD4C6.js.map +1 -0
- package/dist/{chunk-5MP6AMPB.js → chunk-YFJUIO2A.js} +132 -34
- package/dist/chunk-YFJUIO2A.js.map +1 -0
- package/dist/{chunk-WHQHXYPB.js → chunk-YKRDFXU3.js} +5 -5
- package/dist/{chunk-WHQHXYPB.js.map → chunk-YKRDFXU3.js.map} +1 -1
- package/dist/constants.d.mts +7 -1
- package/dist/constants.d.ts +7 -1
- package/dist/constants.js +51 -47
- package/dist/constants.mjs +1 -1
- package/dist/deployments.generated.d.mts +72 -5
- package/dist/deployments.generated.d.ts +72 -5
- package/dist/deployments.generated.js +2 -2
- package/dist/deployments.generated.mjs +1 -1
- package/dist/entities/DopplerFactory.d.mts +2 -0
- package/dist/entities/DopplerFactory.d.ts +2 -0
- package/dist/entities/DopplerFactory.js +8 -8
- package/dist/entities/DopplerFactory.mjs +7 -7
- package/dist/entities/auction/DynamicAuction.js +5 -5
- package/dist/entities/auction/DynamicAuction.mjs +4 -4
- package/dist/entities/auction/MulticurvePool.d.mts +9 -3
- package/dist/entities/auction/MulticurvePool.d.ts +9 -3
- package/dist/entities/auction/MulticurvePool.js +7 -6
- package/dist/entities/auction/MulticurvePool.mjs +6 -5
- package/dist/entities/auction/StaticAuction.js +5 -5
- package/dist/entities/auction/StaticAuction.mjs +4 -4
- package/dist/entities/auction/index.js +11 -10
- package/dist/entities/auction/index.mjs +8 -7
- package/dist/entities/quoter/Quoter.js +5 -5
- package/dist/entities/quoter/Quoter.mjs +4 -4
- package/dist/entities/quoter/index.js +5 -5
- package/dist/entities/quoter/index.mjs +4 -4
- package/dist/entities/token/derc20/Derc20.js +3 -3
- package/dist/entities/token/derc20/Derc20.mjs +2 -2
- package/dist/entities/token/derc20/index.js +3 -3
- package/dist/entities/token/derc20/index.mjs +2 -2
- package/dist/entities/token/index.js +3 -3
- package/dist/entities/token/index.mjs +2 -2
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +110 -102
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -18
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.mts +32 -1
- package/dist/types.d.ts +32 -1
- 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/index.js +10 -10
- package/dist/utils/index.mjs +5 -5
- package/dist/utils/tokenAddressMiner.d.mts +7 -0
- package/dist/utils/tokenAddressMiner.d.ts +7 -0
- package/dist/utils/tokenAddressMiner.js +3 -3
- package/dist/utils/tokenAddressMiner.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-3ALNQHGL.js.map +0 -1
- package/dist/chunk-4DUE547M.js.map +0 -1
- package/dist/chunk-5MP6AMPB.js.map +0 -1
- package/dist/chunk-BZKX3J3R.mjs.map +0 -1
- package/dist/chunk-C7GN6GPG.js.map +0 -1
- package/dist/chunk-DOWDXOTK.mjs.map +0 -1
- package/dist/chunk-E54BP2GN.js.map +0 -1
- package/dist/chunk-J32XSN44.js.map +0 -1
- package/dist/chunk-LDZCTC5Q.mjs.map +0 -1
- package/dist/chunk-LOVD3NCN.js.map +0 -1
- package/dist/chunk-LXUF7RNX.mjs.map +0 -1
- package/dist/chunk-O2DZH23A.mjs.map +0 -1
- package/dist/chunk-PBWOCVDZ.mjs.map +0 -1
- package/dist/chunk-YBDWQTUH.mjs.map +0 -1
- package/dist/chunk-Z7ZGPSQF.js.map +0 -1
- package/dist/chunk-ZVH7VBH5.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/entities/DopplerFactory.ts"],"names":["resolved","decoded"],"mappings":"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","file":"chunk-4TAAZ6W3.mjs","sourcesContent":["import {\n type Address,\n type Hex,\n type Hash,\n type PublicClient,\n type WalletClient,\n type Account,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n getAddress,\n decodeEventLog,\n toHex,\n} from 'viem';\nimport type {\n CreateStaticAuctionParams,\n CreateDynamicAuctionParams,\n CreateMulticurveParams,\n MigrationConfig,\n SupportedPublicClient,\n TokenConfig,\n Doppler404TokenConfig,\n StandardTokenConfig,\n SupportedChainId,\n CreateParams,\n MulticurveBundleExactInResult,\n MulticurveBundleExactOutResult,\n V4PoolKey,\n RehypeDopplerHookConfig,\n} from '../types';\nimport type { ModuleAddressOverrides } from '../types';\nimport { getAddresses } from '../addresses';\nimport { zeroAddress } from 'viem';\nimport {\n ZERO_ADDRESS,\n WAD,\n DEFAULT_PD_SLUGS,\n FLAG_MASK,\n DEFAULT_V3_NUM_POSITIONS,\n DEFAULT_V3_YEARLY_MINT_RATE,\n DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n DEFAULT_V4_YEARLY_MINT_RATE,\n DEFAULT_V3_INITIAL_VOTING_DELAY,\n DEFAULT_V3_INITIAL_VOTING_PERIOD,\n DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n DEFAULT_V4_INITIAL_VOTING_DELAY,\n DEFAULT_V4_INITIAL_VOTING_PERIOD,\n DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n DEFAULT_CREATE_GAS_LIMIT,\n TICK_SPACINGS,\n DOPPLER_MAX_TICK_SPACING,\n DYNAMIC_FEE_FLAG,\n DECAY_MAX_START_FEE,\n V4_MAX_FEE,\n} from '../constants';\nimport {\n computeOptimalGamma,\n MIN_TICK,\n MAX_TICK,\n isToken0Expected,\n} from '../utils';\nimport {\n airlockAbi,\n bundlerAbi,\n DERC20Bytecode,\n DERC2080Bytecode,\n DopplerBytecode,\n DopplerDN404Bytecode,\n v4MulticurveInitializerAbi,\n} from '../abis';\n\n// Type definition for the custom migration encoder function\nexport type MigrationEncoder = (config: MigrationConfig) => Hex;\n\nconst MAX_UINT128 = (1n << 128n) - 1n;\n\n// TokenFactory80 has the same deterministic CREATE2 address across all chains\nconst TOKEN_FACTORY_80_ADDRESS =\n '0xf0b5141dd9096254b2ca624dff26024f46087229' as const;\n\ntype ResolvedMulticurveInitializerMode =\n | { type: 'standard' }\n | { type: 'scheduled'; startTime: number }\n | { type: 'decay'; startTime: number; startFee: number; durationSeconds: number }\n | { type: 'rehype'; hookConfig?: RehypeDopplerHookConfig };\n\nexport class DopplerFactory<C extends SupportedChainId = SupportedChainId> {\n private publicClient: SupportedPublicClient;\n private walletClient?: WalletClient;\n private chainId: C;\n private customMigrationEncoder?: MigrationEncoder;\n\n private multicurveBundlerSupport = new Map<Address, boolean>();\n\n constructor(\n publicClient: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n chainId: C,\n ) {\n this.publicClient = publicClient;\n this.walletClient = walletClient;\n this.chainId = chainId;\n }\n\n /**\n * Set a custom migration data encoder function\n * @param encoder Custom function to encode migration data\n * @returns The factory instance for method chaining\n */\n withCustomMigrationEncoder(encoder: MigrationEncoder): this {\n this.customMigrationEncoder = encoder;\n return this;\n }\n\n async encodeCreateStaticAuctionParams(\n params: CreateStaticAuctionParams<C>,\n ): Promise<CreateParams> {\n // Validate parameters\n this.validateStaticAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // Check if beneficiaries are provided - this determines which initializer to use\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n // 1. Encode pool initializer data\n // Standard V3 initializer expects InitData struct WITHOUT beneficiaries (5 fields)\n // Lockable V3 initializer expects InitData struct WITH beneficiaries (6 fields)\n let poolInitializerData: Hex;\n\n if (hasBeneficiaries) {\n // Sort beneficiaries by address (ascending) as required by the contract\n const sortedBeneficiaries = params.pool\n .beneficiaries!.slice()\n .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\n // Lockable V3 initializer encoding (6 fields including beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n {\n type: 'tuple[]',\n name: 'beneficiaries',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n beneficiaries: sortedBeneficiaries.map((b) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n })),\n },\n ],\n );\n } else {\n // Standard V3 initializer encoding (5 fields, no beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n },\n ],\n );\n }\n\n // 2. Encode migration data based on MigrationConfig\n const liquidityMigratorData = this.encodeMigrationData(params.migration);\n\n // 3. Encode token parameters (standard vs Doppler404)\n let tokenFactoryData: Hex;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n // Doppler404 expects: name, symbol, baseURI, unit\n const baseURI = token404.baseURI;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [params.token.name, params.token.symbol, baseURI, unit],\n );\n } else {\n const tokenStd = params.token as StandardTokenConfig;\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const yearlyMintRate =\n tokenStd.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n tokenStd.name,\n tokenStd.symbol,\n yearlyMintRate,\n BigInt(vestingDuration),\n vestingRecipients,\n vestingAmounts,\n tokenStd.tokenURI,\n ],\n );\n }\n\n // 4. Encode governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V3_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V3_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // 4.1 Choose governance factory\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 5. Generate a unique salt\n // Resolve token factory with override priority\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n\n if (!resolvedTokenFactory || resolvedTokenFactory === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address via builder.withTokenFactory(...) or ensure chain config includes a valid factory.',\n );\n }\n\n // Build the base CreateParams for the V3-style ABI; salt will be mined below\n const baseCreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData: tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: (() => {\n if (hasBeneficiaries) {\n const lockableInitializer =\n params.modules?.lockableV3Initializer ??\n addresses.lockableV3Initializer;\n if (!lockableInitializer) {\n throw new Error(\n 'Lockable V3 initializer address not configured on this chain. Required when using beneficiaries.',\n );\n }\n return lockableInitializer;\n }\n return params.modules?.v3Initializer ?? addresses.v3Initializer;\n })(),\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n };\n\n const minedCreateParams = await this.mineTokenOrder({\n params,\n baseCreateParams,\n addresses,\n });\n\n return minedCreateParams;\n }\n\n /**\n * Simulate a static auction creation and return predicted addresses.\n * Useful for pre-buy flows (bundle) to know the token/pool before sending.\n */\n async simulateCreateStaticAuction(\n params: CreateStaticAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n asset: Address;\n pool: Address;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }>;\n }> {\n const createParams = await this.encodeCreateStaticAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate static auction create');\n }\n\n return {\n createParams,\n asset: simResult[0] as Address,\n pool: simResult[1] as Address,\n gasEstimate,\n execute: () =>\n this.createStaticAuction(params, { _createParams: createParams }),\n };\n }\n\n /**\n * Create a new static auction (using Uniswap V3 for initial liquidity)\n * @param params Configuration for the static auction\n * @returns The address of the created pool and token\n */\n async createStaticAuction(\n params: CreateStaticAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }> {\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateStaticAuction(params)).createParams;\n\n const addresses = getAddresses(this.chainId);\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedPool = simResult[1] as Address;\n if (\n simulatedToken.toLowerCase() !==\n actualAddresses.tokenAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualAddresses.tokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (\n simulatedPool.toLowerCase() !==\n actualAddresses.poolOrHookAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted pool ${simulatedPool} but actual is ${actualAddresses.poolOrHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n return {\n tokenAddress: actualAddresses.tokenAddress,\n poolAddress: actualAddresses.poolOrHookAddress,\n transactionHash: hash,\n };\n }\n\n /**\n * Generate a random salt based on user address\n */\n private generateRandomSalt(account: Address): Hex {\n // Use crypto.getRandomValues for secure random generation\n const array = new Uint8Array(32);\n\n // Try to use crypto API if available (Node.js or browser)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n // Fallback: use timestamp and account for deterministic generation\n const timestamp = Date.now();\n const timestampBytes = new Uint8Array(8);\n for (let i = 0; i < 8; i++) {\n timestampBytes[i] = (timestamp >> (i * 8)) & 0xff;\n }\n\n // Fill array with timestamp and account-based entropy\n for (let i = 0; i < 32; i++) {\n if (i < 8) {\n array[i] = timestampBytes[i];\n } else {\n array[i] = i;\n }\n }\n }\n\n // XOR with address bytes for additional entropy\n if (account) {\n const addressBytes = account.slice(2).padStart(40, '0');\n for (let i = 0; i < 20; i++) {\n const addressByte = parseInt(\n addressBytes.slice(i * 2, (i + 1) * 2),\n 16,\n );\n array[i] ^= addressByte;\n }\n }\n\n return `0x${Array.from(array)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}` as Hex;\n }\n\n /**\n * Extract actual deployed addresses from Create event logs.\n * This is the source of truth - what actually deployed on-chain.\n * @param receipt Transaction receipt containing logs\n * @returns Token and pool/hook addresses from the Create event, or null if not found\n */\n private extractAddressesFromCreateEvent(receipt: {\n logs: readonly unknown[];\n }): { tokenAddress: Address; poolOrHookAddress: Address } | null {\n const createEvent = receipt.logs.find((log: unknown) => {\n try {\n const decoded = decodeEventLog({\n abi: airlockAbi,\n data: (log as { data: Hex }).data,\n topics: (log as { topics: readonly `0x${string}`[] }).topics as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n return decoded.eventName === 'Create';\n } catch {\n return false;\n }\n });\n\n if (!createEvent) return null;\n\n const decoded = decodeEventLog({\n abi: airlockAbi,\n data: (createEvent as { data: Hex }).data,\n topics: (createEvent as { topics: readonly `0x${string}`[] }).topics as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n\n if (decoded.eventName === 'Create') {\n const args = decoded.args as { asset: Address; poolOrHook: Address };\n return { tokenAddress: args.asset, poolOrHookAddress: args.poolOrHook };\n }\n\n return null;\n }\n\n /**\n * Iteratively mine a salt that ensures the newly created token sorts after the numeraire.\n * This mirrors the legacy SDK behaviour so tick configuration can assume the numeraire is token0.\n */\n private async mineTokenOrder(args: {\n params: CreateStaticAuctionParams<C>;\n baseCreateParams: Omit<CreateParams, 'salt'>;\n addresses: ReturnType<typeof getAddresses>;\n }): Promise<CreateParams> {\n const { params, baseCreateParams, addresses } = args;\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n if (!airlockAddress || airlockAddress === ZERO_ADDRESS) {\n throw new Error(\n 'Airlock address not configured. Provide an explicit address via modules.airlock or ensure chain config includes a valid airlock.',\n );\n }\n\n const accountForSimulation =\n this.walletClient?.account ?? params.userAddress;\n const numeraireBigInt = BigInt(params.sale.numeraire);\n\n let attempt = 0n;\n const maxAttempts = 256n;\n let salt = this.generateRandomSalt(params.userAddress);\n\n while (attempt < maxAttempts) {\n const createParams = { ...baseCreateParams, salt } as CreateParams;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: accountForSimulation,\n });\n\n const simResult = result as readonly unknown[] | undefined;\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error(\n 'Failed to simulate static auction create while mining token ordering',\n );\n }\n\n const tokenAddress = simResult[0] as Address;\n if (BigInt(tokenAddress) > numeraireBigInt) {\n return createParams;\n }\n\n attempt += 1n;\n const incrementedAccount = toHex(\n BigInt(params.userAddress) + attempt,\n ) as Address;\n salt = this.generateRandomSalt(incrementedAccount);\n }\n\n throw new Error(\n 'Token mining exceeded iteration limit while trying to force token order. Try again or provide a different user address.',\n );\n }\n\n async encodeCreateDynamicAuctionParams(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n }> {\n // Validate parameters\n this.validateDynamicAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // 1. Calculate gamma if not provided\n const gamma =\n params.auction.gamma ??\n computeOptimalGamma(\n params.auction.startTick,\n params.auction.endTick,\n params.auction.duration,\n params.auction.epochLength,\n params.pool.tickSpacing,\n );\n\n // 2. Prepare time parameters\n // Use provided block timestamp or fetch the latest\n let blockTimestamp: number;\n if (params.blockTimestamp !== undefined) {\n blockTimestamp = params.blockTimestamp;\n } else {\n const latestBlock = await (this.publicClient as PublicClient).getBlock({\n blockTag: 'latest',\n });\n blockTimestamp = Number(\n (latestBlock as { timestamp: bigint | number }).timestamp,\n );\n }\n\n // Use startTimeOffset if provided, otherwise default to 30 seconds\n const startTimeOffset = params.startTimeOffset ?? 30;\n const startTime = blockTimestamp + startTimeOffset;\n const endTime = blockTimestamp + params.auction.duration + startTimeOffset;\n\n // 3. Prepare hook initialization data\n const dopplerData = {\n minimumProceeds: params.auction.minProceeds,\n maximumProceeds: params.auction.maxProceeds,\n startingTime: BigInt(startTime),\n endingTime: BigInt(endTime),\n startingTick: params.auction.startTick,\n endingTick: params.auction.endTick,\n epochLength: BigInt(params.auction.epochLength),\n gamma,\n isToken0: false, // Will be determined during mining\n numPDSlugs: BigInt(params.auction.numPdSlugs ?? DEFAULT_PD_SLUGS),\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n };\n\n // 4. Prepare token parameters (standard vs Doppler404)\n if (this.isDoppler404Token(params.token)) {\n if (\n !addresses.doppler404Factory ||\n addresses.doppler404Factory === ZERO_ADDRESS\n ) {\n throw new Error(\n 'Doppler404 factory address not configured for this chain',\n );\n }\n }\n\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const tokenFactoryData = this.isDoppler404Token(params.token)\n ? (() => {\n const t = params.token as Doppler404TokenConfig;\n return {\n name: t.name,\n symbol: t.symbol,\n baseURI: t.baseURI,\n unit: t.unit !== undefined ? BigInt(t.unit) : 1000n,\n };\n })()\n : (() => {\n const t = params.token as StandardTokenConfig;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n return {\n name: t.name,\n symbol: t.symbol,\n initialSupply: params.sale.initialSupply,\n airlock: addresses.airlock,\n yearlyMintRate: t.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE,\n vestingDuration: BigInt(vestingDuration),\n recipients: vestingRecipients,\n amounts: vestingAmounts,\n tokenURI: t.tokenURI,\n };\n })();\n\n // 5. Mine hook address with appropriate flags\n // Resolve token factory with override priority (works for both standard and doppler404 variants)\n const resolvedTokenFactoryDyn: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n\n if (!resolvedTokenFactoryDyn || resolvedTokenFactoryDyn === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address via builder.withTokenFactory(...) or ensure chain config includes a valid factory.',\n );\n }\n\n const [\n salt,\n hookAddress,\n tokenAddress,\n poolInitializerData,\n encodedTokenFactoryData,\n ] = this.mineHookAddress({\n airlock: params.modules?.airlock ?? addresses.airlock,\n poolManager: params.modules?.poolManager ?? addresses.poolManager,\n deployer: params.modules?.dopplerDeployer ?? addresses.dopplerDeployer,\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: tokenFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: dopplerData,\n tokenVariant: this.isDoppler404Token(params.token)\n ? 'doppler404'\n : 'standard',\n });\n\n // 6. Encode migration data\n const liquidityMigratorData = this.encodeMigrationData(params.migration);\n\n // 7. Encode governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V4_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V4_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // 7.1 Choose governance factory\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 8. Build the complete CreateParams for the V4-style ABI\n const createParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: encodedTokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt: salt,\n };\n\n return { createParams, hookAddress, tokenAddress };\n }\n\n /**\n * Create a new dynamic auction (using Uniswap V4 hook for gradual Dutch auction)\n * @param params Configuration for the dynamic auction\n * @returns The address of the created hook and token\n */\n async createDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }> {\n const addresses = getAddresses(this.chainId);\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n let createParams: CreateParams;\n\n if (options?._createParams) {\n createParams = options._createParams;\n } else {\n const simulation = await this.simulateCreateDynamicAuction(params);\n createParams = simulation.createParams;\n }\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n const actualHookAddress = actualAddresses.poolOrHookAddress;\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedHook = simResult[1] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (simulatedHook.toLowerCase() !== actualHookAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted hook ${simulatedHook} but actual is ${actualHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Calculate pool ID for V4 using actual addresses\n const poolId = this.computePoolId({\n currency0:\n actualTokenAddress < params.sale.numeraire\n ? actualTokenAddress\n : params.sale.numeraire,\n currency1:\n actualTokenAddress < params.sale.numeraire\n ? params.sale.numeraire\n : actualTokenAddress,\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: actualHookAddress,\n });\n\n return {\n hookAddress: actualHookAddress,\n tokenAddress: actualTokenAddress,\n poolId,\n transactionHash: hash,\n };\n }\n\n /**\n * Simulate a dynamic auction creation and return predicted addresses and poolId.\n * Useful for clients that need the hook/token/poolId before submitting the tx.\n */\n async simulateCreateDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }>;\n }> {\n const { createParams } =\n await this.encodeCreateDynamicAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate dynamic auction create');\n }\n\n const tokenAddress = simResult[0] as Address;\n const hookAddress = simResult[1] as Address;\n\n const poolId = this.computePoolId({\n currency0:\n tokenAddress < params.sale.numeraire\n ? tokenAddress\n : params.sale.numeraire,\n currency1:\n tokenAddress < params.sale.numeraire\n ? params.sale.numeraire\n : tokenAddress,\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n });\n\n return {\n createParams,\n hookAddress,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createDynamicAuction(params, { _createParams: createParams }),\n };\n }\n\n private async resolveCreateGasEstimate(args: {\n request?: unknown;\n address: Address;\n createParams: CreateParams;\n account?: Address | Account;\n }): Promise<bigint | undefined> {\n const { request, address, createParams, account } = args;\n const gasFromRequest =\n request &&\n typeof request === 'object' &&\n 'gas' in (request as Record<string, unknown>)\n ? (request as { gas?: bigint }).gas\n : undefined;\n\n if (gasFromRequest) {\n return gasFromRequest;\n }\n\n try {\n const estimated = await (\n this.publicClient as PublicClient\n ).estimateContractGas({\n address,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account,\n });\n return estimated;\n } catch {\n return undefined;\n }\n }\n\n private isDoppler404Token(\n token: TokenConfig,\n ): token is Doppler404TokenConfig {\n return (token as Doppler404TokenConfig).type === 'doppler404';\n }\n\n /**\n * Encode migration data based on the MigrationConfig\n * This replaces the manual encoding methods from the old SDKs\n */\n private encodeMigrationData(config: MigrationConfig): Hex {\n // Use custom encoder if available\n if (this.customMigrationEncoder) {\n return this.customMigrationEncoder(config);\n }\n\n switch (config.type) {\n case 'uniswapV2':\n // V2 migrator expects empty data\n return '0x' as Hex;\n\n case 'noOp':\n // NoOp migrator expects empty data\n return '0x' as Hex;\n\n case 'uniswapV4':\n // Encode V4 migration data with optional streamable fees config\n // When streamableFees is omitted, mirror legacy SDK behaviour by emitting an empty payload\n const streamableFees = config.streamableFees;\n if (!streamableFees) {\n // Default V4 migrator behaviour: no additional payload required\n return '0x';\n }\n\n // Copy beneficiaries and sort by address in ascending order (required by contract)\n const beneficiaryData = [...streamableFees.beneficiaries].sort(\n (a, b) => {\n const addrA = a.beneficiary.toLowerCase();\n const addrB = b.beneficiary.toLowerCase();\n return addrA < addrB ? -1 : addrA > addrB ? 1 : 0;\n },\n );\n\n // Note: The contract will validate that the airlock owner gets at least 5%\n // If not present, the SDK user should add it manually\n\n return encodeAbiParameters(\n [\n { type: 'uint24' }, // fee\n { type: 'int24' }, // tickSpacing\n { type: 'uint32' }, // lockDuration (0 if no streamableFees)\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n [\n config.fee,\n config.tickSpacing,\n streamableFees.lockDuration,\n beneficiaryData,\n ],\n );\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n /**\n * Encode create params for Uniswap V4 Multicurve initializer/migrator flow\n */\n private normalizeUint32(\n value: number | bigint,\n label: string,\n ): number {\n const normalized = typeof value === 'bigint' ? Number(value) : Number(value);\n if (!Number.isFinite(normalized) || !Number.isInteger(normalized)) {\n throw new Error(\n `${label} must be an integer number of seconds since Unix epoch`,\n );\n }\n if (normalized < 0) {\n throw new Error(`${label} cannot be negative`);\n }\n const UINT32_MAX = 0xffffffff;\n if (normalized > UINT32_MAX) {\n throw new Error(\n `${label} must fit within uint32 (seconds since Unix epoch up to year 2106)`,\n );\n }\n return normalized;\n }\n\n private resolveMulticurveInitializerMode(\n params: CreateMulticurveParams<C>,\n ): ResolvedMulticurveInitializerMode {\n const legacySchedule = params.schedule;\n const legacyHook = params.dopplerHook;\n const hasLegacySchedule = legacySchedule !== undefined;\n const hasLegacyHook = legacyHook !== undefined;\n\n if (hasLegacySchedule && hasLegacyHook) {\n throw new Error(\n 'Cannot combine schedule and dopplerHook legacy multicurve options. Use exactly one initializer mode.',\n );\n }\n\n const initializer = params.initializer;\n let mode: ResolvedMulticurveInitializerMode;\n\n if (!initializer) {\n if (hasLegacySchedule) {\n mode = {\n type: 'scheduled',\n startTime: this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n ),\n };\n } else if (hasLegacyHook) {\n mode = {\n type: 'rehype',\n hookConfig: legacyHook,\n };\n } else {\n mode = { type: 'standard' };\n }\n } else {\n switch (initializer.type) {\n case 'standard': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'standard' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n mode = { type: 'standard' };\n break;\n }\n case 'scheduled': {\n if (hasLegacyHook) {\n throw new Error(\n \"Initializer type 'scheduled' cannot be combined with dopplerHook\",\n );\n }\n const normalizedStart = this.normalizeUint32(\n initializer.startTime,\n 'Scheduled multicurve startTime',\n );\n if (hasLegacySchedule) {\n const legacyStart = this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n );\n if (legacyStart !== normalizedStart) {\n throw new Error(\n 'Conflicting scheduled start times provided via initializer and schedule',\n );\n }\n }\n mode = { type: 'scheduled', startTime: normalizedStart };\n break;\n }\n case 'decay': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'decay' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n const startTime = this.normalizeUint32(\n initializer.startTime,\n 'Decay multicurve startTime',\n );\n const startFee = Number(initializer.startFee);\n const durationSeconds = this.normalizeUint32(\n initializer.durationSeconds,\n 'Decay multicurve durationSeconds',\n );\n const endFee = Number(params.pool.fee);\n if (!Number.isInteger(startFee)) {\n throw new Error('Decay multicurve startFee must be an integer');\n }\n if (startFee < 0 || startFee > DECAY_MAX_START_FEE) {\n throw new Error(\n `Decay multicurve startFee must be between 0 and ${DECAY_MAX_START_FEE}`,\n );\n }\n if (!Number.isInteger(endFee) || endFee < 0 || endFee > V4_MAX_FEE) {\n throw new Error(\n `Multicurve pool fee must be between 0 and ${V4_MAX_FEE}`,\n );\n }\n if (startFee < endFee) {\n throw new Error(\n `Decay multicurve startFee (${startFee}) must be greater than or equal to terminal pool fee (${endFee})`,\n );\n }\n if (startFee > endFee && durationSeconds <= 0) {\n throw new Error(\n 'Decay multicurve durationSeconds must be greater than 0 when startFee is greater than terminal pool fee',\n );\n }\n mode = {\n type: 'decay',\n startTime,\n startFee,\n durationSeconds,\n };\n break;\n }\n case 'rehype': {\n if (hasLegacySchedule) {\n throw new Error(\n \"Initializer type 'rehype' cannot be combined with schedule\",\n );\n }\n mode = { type: 'rehype', hookConfig: initializer.config };\n break;\n }\n default: {\n const exhaustive: never = initializer;\n throw new Error(\n `Unsupported multicurve initializer type: ${(exhaustive as { type?: string })?.type ?? 'unknown'}`,\n );\n }\n }\n }\n\n // Backwards-compatible behavior: an explicit dopplerHookInitializer override\n // selects the DopplerHookInitializer path even without hook config.\n if (params.modules?.dopplerHookInitializer !== undefined) {\n if (mode.type === 'standard') {\n mode = { type: 'rehype' };\n } else if (mode.type !== 'rehype') {\n throw new Error(\n 'modules.dopplerHookInitializer can only be used with the rehype or standard multicurve initializer mode',\n );\n }\n }\n\n return mode;\n }\n\n encodeCreateMulticurveParams(\n params: CreateMulticurveParams<C>,\n ): CreateParams {\n // Validate parameters\n this.validateMulticurveParams(params);\n\n // Basic validation\n if (!params.pool || params.pool.curves.length === 0) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n const normalizedCurves = this.normalizeMulticurveCurves(\n params.pool.curves,\n params.pool.tickSpacing,\n );\n\n const addresses = getAddresses(this.chainId);\n\n // Pool initializer data: (fee, tickSpacing, farTick, curves[], beneficiaries[], dopplerHook, onInitializationCalldata, graduationCalldata)\n const sortedBeneficiaries = (params.pool.beneficiaries ?? [])\n .slice()\n .sort(\n (\n a: NonNullable<typeof params.pool.beneficiaries>[number],\n b: NonNullable<typeof params.pool.beneficiaries>[number],\n ) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n },\n );\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n const useScheduledInitializer = initializerMode.type === 'scheduled';\n const useDecayInitializer = initializerMode.type === 'decay';\n const useDopplerHookInitializer = initializerMode.type === 'rehype';\n\n // Validate dopplerHook fee distribution if provided\n if (initializerMode.type === 'rehype' && initializerMode.hookConfig) {\n const hook = initializerMode.hookConfig;\n const totalDistribution =\n hook.assetBuybackPercentWad +\n hook.numeraireBuybackPercentWad +\n hook.beneficiaryPercentWad +\n hook.lpPercentWad;\n if (totalDistribution !== WAD) {\n throw new Error(\n `DopplerHook fee distribution must sum to ${WAD} (100%), but got ${totalDistribution}`,\n );\n }\n }\n\n // Shared curve and beneficiary component definitions for ABI encoding\n const curveComponents = [\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'shares' },\n ];\n const beneficiaryComponents = [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ];\n\n // Prepare curve and beneficiary data (shared across all initializer formats)\n const curvesData = normalizedCurves.map(\n (c: (typeof normalizedCurves)[number]) => ({\n tickLower: c.tickLower,\n tickUpper: c.tickUpper,\n numPositions: c.numPositions,\n shares: c.shares,\n }),\n );\n const beneficiariesData = sortedBeneficiaries.map(\n (b: NonNullable<typeof params.pool.beneficiaries>[number]) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n }),\n );\n\n // Encode pool initializer data based on which initializer is being used\n // Each initializer expects a different InitData struct format:\n //\n // UniswapV4MulticurveInitializer (basic):\n // struct InitData { uint24 fee; int24 tickSpacing; Curve[] curves; BeneficiaryData[] beneficiaries; }\n //\n // UniswapV4ScheduledMulticurveInitializer:\n // struct InitData { uint24 fee; int24 tickSpacing; Curve[] curves; BeneficiaryData[] beneficiaries; uint32 startingTime; }\n //\n // DecayMulticurveInitializer:\n // struct InitData { uint24 startFee; uint24 fee; uint32 durationSeconds; int24 tickSpacing; Curve[] curves;\n // BeneficiaryData[] beneficiaries; uint32 startingTime; }\n //\n // DopplerHookInitializer:\n // struct InitData { uint24 fee; int24 tickSpacing; int24 farTick; Curve[] curves; BeneficiaryData[] beneficiaries;\n // address dopplerHook; bytes onInitializationDopplerHookCalldata; bytes graduationDopplerHookCalldata; }\n\n let poolInitializerData: Hex;\n\n if (useDopplerHookInitializer) {\n const hookConfig =\n initializerMode.type === 'rehype'\n ? initializerMode.hookConfig\n : undefined;\n // DopplerHookInitializer format (8 fields)\n // Calculate farTick: use provided value from dopplerHook, or auto-calculate from curves\n let farTick: number;\n if (hookConfig?.farTick !== undefined) {\n farTick = hookConfig.farTick;\n } else {\n // Auto-calculate from curves (max tickUpper)\n const allTickUppers = params.pool.curves.map((c) => c.tickUpper);\n farTick = Math.max(...allTickUppers);\n }\n\n // Encode dopplerHook initialization calldata if provided\n let onInitializationDopplerHookCalldata: Hex = '0x';\n let graduationDopplerHookCalldata: Hex = '0x';\n let dopplerHookAddress: Address = ZERO_ADDRESS;\n\n if (hookConfig) {\n dopplerHookAddress = hookConfig.hookAddress;\n onInitializationDopplerHookCalldata = encodeAbiParameters(\n [\n { type: 'address' }, // numeraire\n { type: 'address' }, // buybackDst\n { type: 'uint24' }, // customFee\n { type: 'uint256' }, // assetBuybackPercentWad\n { type: 'uint256' }, // numeraireBuybackPercentWad\n { type: 'uint256' }, // beneficiaryPercentWad\n { type: 'uint256' }, // lpPercentWad\n ],\n [\n params.sale.numeraire,\n hookConfig.buybackDestination,\n hookConfig.customFee,\n hookConfig.assetBuybackPercentWad,\n hookConfig.numeraireBuybackPercentWad,\n hookConfig.beneficiaryPercentWad,\n hookConfig.lpPercentWad,\n ],\n );\n graduationDopplerHookCalldata = hookConfig.graduationCalldata ?? '0x';\n }\n\n const dopplerHookTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'farTick', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'dopplerHook', type: 'address' },\n { name: 'onInitializationDopplerHookCalldata', type: 'bytes' },\n { name: 'graduationDopplerHookCalldata', type: 'bytes' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: dopplerHookTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n farTick,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n dopplerHook: dopplerHookAddress,\n onInitializationDopplerHookCalldata,\n graduationDopplerHookCalldata,\n },\n ],\n );\n } else if (useDecayInitializer) {\n // DecayMulticurveInitializer format (7 fields)\n const decayTupleComponents = [\n { name: 'startFee', type: 'uint24' },\n { name: 'fee', type: 'uint24' },\n { name: 'durationSeconds', type: 'uint32' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n if (initializerMode.type !== 'decay') {\n throw new Error('Invalid multicurve initializer state for decay mode');\n }\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: decayTupleComponents }],\n [\n {\n startFee: initializerMode.startFee,\n fee: params.pool.fee,\n durationSeconds: initializerMode.durationSeconds,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else if (useScheduledInitializer) {\n // UniswapV4ScheduledMulticurveInitializer format (5 fields)\n if (initializerMode.type !== 'scheduled') {\n throw new Error(\n 'Invalid multicurve initializer state for scheduled mode',\n );\n }\n const scheduledTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: scheduledTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else {\n // UniswapV4MulticurveInitializer format (4 fields - basic)\n const basicTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: basicTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n },\n ],\n );\n }\n\n // Token factory data (standard vs 404)\n let tokenFactoryData: Hex;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [token404.name, token404.symbol, token404.baseURI, unit],\n );\n } else {\n const tokenStd = params.token as StandardTokenConfig;\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const yearlyMintRate =\n tokenStd.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n tokenStd.name,\n tokenStd.symbol,\n yearlyMintRate,\n BigInt(vestingDuration),\n vestingRecipients,\n vestingAmounts,\n tokenStd.tokenURI,\n ],\n );\n }\n\n // Governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V4_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V4_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // Resolve module addresses\n const salt = this.generateRandomSalt(params.userAddress);\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n if (!resolvedTokenFactory || resolvedTokenFactory === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address or ensure chain config includes a valid factory.',\n );\n }\n\n const resolvedInitializer: Address | undefined = (() => {\n if (useDopplerHookInitializer) {\n return (\n params.modules?.dopplerHookInitializer ??\n addresses.dopplerHookInitializer\n );\n }\n if (useDecayInitializer) {\n return (\n params.modules?.v4DecayMulticurveInitializer ??\n addresses.v4DecayMulticurveInitializer\n );\n }\n if (useScheduledInitializer) {\n return (\n params.modules?.v4ScheduledMulticurveInitializer ??\n addresses.v4ScheduledMulticurveInitializer\n );\n }\n return (\n params.modules?.v4MulticurveInitializer ??\n addresses.v4MulticurveInitializer\n );\n })();\n if (!resolvedInitializer || resolvedInitializer === ZERO_ADDRESS) {\n if (useDopplerHookInitializer) {\n throw new Error(\n 'DopplerHookInitializer address not configured on this chain. Override via builder.withDopplerHookInitializer() or update chain config.',\n );\n }\n if (useDecayInitializer) {\n throw new Error(\n 'Decay multicurve initializer address not configured on this chain. Override via builder.withV4DecayMulticurveInitializer() or update chain config.',\n );\n }\n throw new Error(\n useScheduledInitializer\n ? 'Scheduled multicurve initializer address not configured on this chain. Override via builder or update chain config.'\n : 'Multicurve initializer address not configured on this chain. Override via builder or update chain config.',\n );\n }\n\n // When beneficiaries are provided, use NoOpMigrator with empty data\n // The beneficiaries will be handled by the multicurve initializer, not the migrator\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n let liquidityMigratorData: Hex;\n let resolvedMigrator: Address | undefined;\n\n if (hasBeneficiaries) {\n // Use NoOpMigrator with empty data when beneficiaries are provided\n liquidityMigratorData = '0x' as Hex;\n resolvedMigrator = params.modules?.noOpMigrator ?? addresses.noOpMigrator;\n if (!resolvedMigrator || resolvedMigrator === ZERO_ADDRESS) {\n throw new Error(\n 'NoOpMigrator address not configured on this chain. Override via modules.noOpMigrator or update chain config.',\n );\n }\n } else {\n // Use standard migration flow when no beneficiaries\n liquidityMigratorData = this.encodeMigrationData(params.migration);\n resolvedMigrator = this.getMigratorAddress(\n params.migration,\n params.modules,\n );\n if (!resolvedMigrator || resolvedMigrator === ZERO_ADDRESS) {\n throw new Error(\n 'Migrator address not configured on this chain. Override via builder or update chain config.',\n );\n }\n }\n\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n const createParams: CreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData,\n poolInitializer: resolvedInitializer,\n poolInitializerData,\n liquidityMigrator: resolvedMigrator,\n liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt,\n };\n\n return createParams;\n }\n\n async simulateCreateMulticurve(params: CreateMulticurveParams<C>): Promise<{\n createParams: CreateParams;\n tokenAddress: Address;\n poolId: Hex;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n tokenAddress: Address;\n poolId: Hex;\n transactionHash: string;\n }>;\n }> {\n const addresses = getAddresses(this.chainId);\n const createParams = this.encodeCreateMulticurveParams(params);\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate multicurve create');\n }\n\n // simResult[0] is \"asset\" in contract terminology, we call it tokenAddress for SDK consistency\n const tokenAddress = simResult[0] as Address;\n const poolId = await this.computeMulticurvePoolId(params, tokenAddress);\n\n return {\n createParams,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createMulticurve(params, { _createParams: createParams }),\n };\n }\n\n async createMulticurve(\n params: CreateMulticurveParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{ tokenAddress: Address; poolId: Hex; transactionHash: string }> {\n const addresses = getAddresses(this.chainId);\n if (!this.walletClient)\n throw new Error('Wallet client required for write operations');\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateMulticurve(params)).createParams;\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({ ...request, gas });\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract token address from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n\n // Warn if simulation predicted different address (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 1) {\n const simulatedToken = simResult[0] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Compute poolId from the PoolKey using actual token address\n const poolId = await this.computeMulticurvePoolId(\n params,\n actualTokenAddress,\n );\n\n return { tokenAddress: actualTokenAddress, poolId, transactionHash: hash };\n }\n\n /**\n * Normalize user-provided multicurve positions and ensure they satisfy SDK constraints\n */\n private normalizeMulticurveCurves(\n curves: CreateMulticurveParams['pool']['curves'],\n tickSpacing: number,\n ): CreateMulticurveParams['pool']['curves'] {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n if (!curves.length) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n let totalShares = 0n;\n let mostPositiveTickUpper: number | undefined;\n\n const sanitizedCurves = curves.map((curve) => {\n const sanitized = { ...curve };\n\n if (\n !Number.isFinite(sanitized.tickLower) ||\n !Number.isFinite(sanitized.tickUpper)\n ) {\n throw new Error('Multicurve ticks must be finite numbers');\n }\n if (sanitized.tickLower >= sanitized.tickUpper) {\n throw new Error(\n 'Multicurve curve tickLower must be less than tickUpper',\n );\n }\n if (\n !Number.isInteger(sanitized.numPositions) ||\n sanitized.numPositions <= 0\n ) {\n throw new Error(\n 'Multicurve curve numPositions must be a positive integer',\n );\n }\n if (sanitized.shares <= 0n) {\n throw new Error('Multicurve curve shares must be positive');\n }\n\n totalShares += sanitized.shares;\n if (totalShares > WAD) {\n throw new Error('Total multicurve shares cannot exceed 100% (1e18)');\n }\n\n if (\n mostPositiveTickUpper === undefined ||\n sanitized.tickUpper > mostPositiveTickUpper\n ) {\n mostPositiveTickUpper = sanitized.tickUpper;\n }\n\n return sanitized;\n });\n\n if (totalShares === WAD) {\n return sanitizedCurves;\n }\n\n const missingShare = WAD - totalShares;\n if (missingShare <= 0n) {\n return sanitizedCurves;\n }\n\n const fallbackTickLower = mostPositiveTickUpper;\n if (fallbackTickLower === undefined) {\n throw new Error('Unable to determine fallback multicurve tick range');\n }\n\n const fallbackTickUpper = this.roundMaxTickDown(tickSpacing);\n\n const fallbackCurve = {\n // Extend from the most positive user tick out to the maximum supported tick bucket\n tickLower: fallbackTickLower,\n tickUpper: fallbackTickUpper,\n numPositions:\n sanitizedCurves[sanitizedCurves.length - 1]?.numPositions ?? 1,\n shares: missingShare,\n };\n\n return [...sanitizedCurves, fallbackCurve];\n }\n\n private roundMaxTickDown(tickSpacing: number): number {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n const rounded = Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n return rounded;\n }\n\n private validateStaticAuctionParams(params: CreateStaticAuctionParams): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n if (params.pool.startTick >= params.pool.endTick) {\n throw new Error('Start tick must be less than end tick');\n }\n\n const tickSpacing = (TICK_SPACINGS as Record<number, number>)[\n params.pool.fee\n ];\n if (tickSpacing === undefined) {\n throw new Error(\n `Unsupported fee tier ${params.pool.fee} for static auctions`,\n );\n }\n\n if (params.pool.startTick < MIN_TICK || params.pool.endTick > MAX_TICK) {\n throw new Error(\n `Ticks must be within the allowed range (${MIN_TICK} to ${MAX_TICK})`,\n );\n }\n\n const startTickAligned = params.pool.startTick % tickSpacing === 0;\n const endTickAligned = params.pool.endTick % tickSpacing === 0;\n if (!startTickAligned || !endTickAligned) {\n throw new Error(\n `Pool ticks must be multiples of tick spacing ${tickSpacing} for fee tier ${params.pool.fee}`,\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate vesting if provided\n if (params.vesting) {\n // Validate recipients and amounts arrays match\n if (params.vesting.recipients && params.vesting.amounts) {\n if (\n params.vesting.recipients.length !== params.vesting.amounts.length\n ) {\n throw new Error(\n 'Vesting recipients and amounts arrays must have the same length',\n );\n }\n if (params.vesting.recipients.length === 0) {\n throw new Error('Vesting recipients array cannot be empty');\n }\n // Validate total vested amount doesn't exceed available tokens\n const totalVested = params.vesting.amounts.reduce(\n (sum, amt) => sum + amt,\n BigInt(0),\n );\n const availableForVesting =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n } else {\n // Default case: validate there are tokens available for vesting\n const vestedAmount =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (vestedAmount <= BigInt(0)) {\n throw new Error('No tokens available for vesting');\n }\n }\n }\n\n // Validate migration config\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n\n // Validate pool beneficiaries for V3 locked pools\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n\n // Validate each beneficiary has positive shares\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n }\n\n /**\n * Validate dynamic auction parameters\n */\n private validateDynamicAuctionParams(\n params: CreateDynamicAuctionParams,\n ): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n const isToken0 = isToken0Expected(params.sale.numeraire);\n if (isToken0 && params.auction.startTick <= params.auction.endTick) {\n throw new Error(\n 'Start tick must be greater than end tick if base token is currency0',\n );\n }\n if (!isToken0 && params.auction.startTick >= params.auction.endTick) {\n throw new Error(\n 'Start tick must be less than end tick if base token is currency1',\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate auction parameters\n if (params.auction.duration <= 0) {\n throw new Error('Auction duration must be positive');\n }\n if (params.auction.epochLength <= 0) {\n throw new Error('Epoch length must be positive');\n }\n if (params.pool.tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n // Validate tick spacing against Doppler contract constraint\n // @see Doppler.sol line 159: `int24 constant MAX_TICK_SPACING = 30`\n if (params.pool.tickSpacing > DOPPLER_MAX_TICK_SPACING) {\n throw new Error(\n `Dynamic auctions require tickSpacing <= ${DOPPLER_MAX_TICK_SPACING} (Doppler.sol MAX_TICK_SPACING). ` +\n `Got tickSpacing=${params.pool.tickSpacing}. ` +\n `Use withMarketCapRange() which handles this automatically, or use a smaller tickSpacing with poolConfig().`,\n );\n }\n\n // Validate that total duration is divisible by epoch length\n if (params.auction.duration % params.auction.epochLength !== 0) {\n throw new Error('Epoch length must divide total duration evenly');\n }\n\n // Validate gamma if provided\n if (params.auction.gamma !== undefined) {\n if (params.auction.gamma % params.pool.tickSpacing !== 0) {\n throw new Error('Gamma must be divisible by tick spacing');\n }\n }\n\n // Validate migration config\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Validate multicurve auction parameters\n */\n private validateMulticurveParams(params: CreateMulticurveParams<C>): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate initializer mode / compatibility and mode-specific constraints.\n this.resolveMulticurveInitializerMode(params);\n\n // Validate vesting if provided\n if (params.vesting) {\n // Validate recipients and amounts arrays match\n if (params.vesting.recipients && params.vesting.amounts) {\n if (\n params.vesting.recipients.length !== params.vesting.amounts.length\n ) {\n throw new Error(\n 'Vesting recipients and amounts arrays must have the same length',\n );\n }\n if (params.vesting.recipients.length === 0) {\n throw new Error('Vesting recipients array cannot be empty');\n }\n // Validate total vested amount doesn't exceed available tokens\n const totalVested = params.vesting.amounts.reduce(\n (sum, amt) => sum + amt,\n BigInt(0),\n );\n const availableForVesting =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n }\n }\n\n // Validate pool beneficiaries if provided\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n\n // Validate migration config for V4\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Get the airlock contract address for the current chain\n */\n private getAirlockAddress(): Address {\n const addresses = getAddresses(this.chainId);\n return addresses.airlock;\n }\n\n /**\n * Get the appropriate initializer address based on auction type\n */\n private getInitializerAddress(isStatic: boolean): Address {\n const addresses = getAddresses(this.chainId);\n return isStatic ? addresses.v3Initializer : addresses.v4Initializer;\n }\n\n /**\n * Get the Bundler contract address for the current chain\n * Used to perform atomic create + swap (\"bundle\") flows for static auctions\n */\n private getBundlerAddress(): Address {\n const addresses = getAddresses(this.chainId);\n const addr = addresses.bundler;\n if (!addr || addr === zeroAddress) {\n throw new Error('Bundler address not configured for this chain');\n }\n return addr;\n }\n\n /**\n * Get the appropriate migrator address based on migration config\n * Allows override via ModuleAddressOverrides when provided in params.\n */\n private getMigratorAddress(\n config: MigrationConfig,\n overrides?: ModuleAddressOverrides,\n ): Address {\n const addresses = getAddresses(this.chainId);\n\n switch (config.type) {\n case 'uniswapV2':\n return overrides?.v2Migrator ?? addresses.v2Migrator;\n case 'uniswapV4': {\n const v4Address = overrides?.v4Migrator ?? addresses.v4Migrator;\n if (v4Address === '0x0000000000000000000000000000000000000000') {\n throw new Error(\n 'UniswapV4Migrator not deployed on this chain. Use uniswapV2 migration or provide override via modules.v4Migrator.',\n );\n }\n return v4Address;\n }\n case 'noOp': {\n const noOpAddress = overrides?.noOpMigrator ?? addresses.noOpMigrator;\n if (!noOpAddress) {\n throw new Error(\n 'NoOpMigrator not configured on this chain. Provide override via modules.noOpMigrator or update chain config.',\n );\n }\n return noOpAddress;\n }\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n // computeTicks moved to builders. No longer needed here.\n // computeOptimalGamma moved to utils.\n\n // -----------------------------\n // Bundler helpers (Static/V3)\n // -----------------------------\n\n /**\n * Simulate a bundle with exact input on Uniswap V3 as part of create\n * Returns the expected output amount for the provided exact input.\n */\n async simulateBundleExactInput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactIn',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n /**\n * Simulate a bundle with exact output on Uniswap V3 as part of create\n * Returns the required input amount for the provided exact output.\n */\n async simulateBundleExactOutput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amount: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactOut',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amount: params.amount,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n // Bundler helpers (Multicurve/V4)\n async simulateMulticurveBundleExactOut(\n createParams: CreateParams,\n params?: {\n exactAmountOut?: bigint;\n },\n ): Promise<MulticurveBundleExactOutResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n const exactAmountOut = params?.exactAmountOut ?? 0n;\n this.ensureUint128(exactAmountOut, 'exactAmountOut', { allowZero: true });\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactOut',\n args: [{ ...createParams }, exactAmountOut, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountIn: amount,\n gasEstimate,\n };\n }\n\n async simulateMulticurveBundleExactIn(\n createParams: CreateParams,\n params: {\n exactAmountIn: bigint;\n },\n ): Promise<MulticurveBundleExactInResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n if (params.exactAmountIn === undefined) {\n throw new Error(\n 'exactAmountIn is required for multicurve bundle simulations',\n );\n }\n const exactAmountIn = params.exactAmountIn;\n this.ensureUint128(exactAmountIn, 'exactAmountIn');\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactIn',\n args: [{ ...createParams }, exactAmountIn, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountOut: amount,\n gasEstimate,\n };\n }\n\n /**\n * Execute an atomic create + swap bundle through the Bundler\n * commands/inputs are Universal Router encoded values (e.g., from doppler-router)\n */\n async bundle(\n createParams: CreateParams,\n commands: Hex,\n inputs: Hex[],\n options?: { gas?: bigint; value?: bigint },\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const bundler = this.getBundlerAddress();\n const { request } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'bundle',\n args: [{ ...createParams }, commands, inputs],\n account: this.walletClient.account,\n value: options?.value ?? 0n,\n });\n const gas = options?.gas ?? undefined;\n const tx = await this.walletClient.writeContract(\n gas ? { ...request, gas } : request,\n );\n return tx;\n }\n\n private ensureUint128(\n value: bigint,\n paramName: string,\n options: { allowZero?: boolean } = {},\n ): void {\n const { allowZero = false } = options;\n if (value < 0n) {\n throw new Error(`${paramName} cannot be negative`);\n }\n if (!allowZero && value === 0n) {\n throw new Error(`${paramName} must be greater than zero`);\n }\n if (value > MAX_UINT128) {\n throw new Error(`${paramName} exceeds uint128 range`);\n }\n }\n\n private parseMulticurveBundleResult(result: unknown): {\n asset: Address;\n poolKey: V4PoolKey;\n amount: bigint;\n gasEstimate: bigint;\n } {\n let asset: Address | undefined;\n let poolKeyRaw: unknown;\n let amount: bigint | undefined;\n let gasEstimate: bigint | undefined;\n\n if (Array.isArray(result)) {\n if (result.length < 4) {\n throw new Error('Unexpected multicurve bundle simulation result shape');\n }\n asset = result[0] as Address;\n poolKeyRaw = result[1];\n amount = result[2] as bigint;\n gasEstimate = result[3] as bigint;\n } else if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n asset = obj.asset as Address | undefined;\n poolKeyRaw = obj.poolKey;\n amount = (obj.amountIn ?? obj.amountOut ?? obj.amount) as\n | bigint\n | undefined;\n gasEstimate = obj.gasEstimate as bigint | undefined;\n } else {\n throw new Error('Unexpected multicurve bundle simulation result format');\n }\n\n if (\n asset === undefined ||\n poolKeyRaw === undefined ||\n amount === undefined ||\n gasEstimate === undefined\n ) {\n throw new Error('Incomplete multicurve bundle simulation result');\n }\n\n return {\n asset,\n poolKey: this.normalizePoolKey(poolKeyRaw),\n amount,\n gasEstimate,\n };\n }\n\n private normalizePoolKey(value: any): V4PoolKey {\n if (Array.isArray(value)) {\n const [currency0, currency1, feeRaw, tickSpacingRaw, hooks] = value as [\n Address,\n Address,\n number | bigint,\n number | bigint,\n Address,\n ];\n const feeValue = Number(feeRaw);\n const tickSpacingValue = Number(tickSpacingRaw);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n if (value && typeof value === 'object') {\n const { currency0, currency1, fee, tickSpacing, hooks } = value as Record<\n string,\n unknown\n >;\n const feeValue = Number(fee);\n const tickSpacingValue = Number(tickSpacing);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n throw new Error(\n 'Unable to normalize PoolKey from multicurve bundle simulation result',\n );\n }\n /**\n * Mines a salt and hook address with the appropriate flags\n *\n * This method iterates through possible salt values to find a combination that:\n * - Produces a hook address with required Doppler flags\n * - Maintains proper token ordering relative to numeraire\n * - Ensures deterministic deployment addresses\n *\n * @param params - Parameters for hook address mining\n * @returns Tuple of [salt, hook address, token address, pool data, token data]\n * @throws {Error} If no valid salt can be found within the search limit\n * @private\n */\n private mineHookAddress(params: {\n airlock: Address;\n poolManager: Address;\n deployer: Address;\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n tokenFactory: Address;\n tokenFactoryData:\n | {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n }\n | {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n poolInitializer: Address;\n poolInitializerData: {\n minimumProceeds: bigint;\n maximumProceeds: bigint;\n startingTime: bigint;\n endingTime: bigint;\n startingTick: number;\n endingTick: number;\n epochLength: bigint;\n gamma: number;\n numPDSlugs: bigint;\n fee: number;\n tickSpacing: number;\n };\n customDerc20Bytecode?: `0x${string}`;\n tokenVariant?: 'standard' | 'doppler404';\n }): [Hash, Address, Address, Hex, Hex] {\n const isToken0 = isToken0Expected(params.numeraire);\n\n const {\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n numPDSlugs,\n fee,\n tickSpacing,\n } = params.poolInitializerData;\n\n const poolInitializerData = encodeAbiParameters(\n [\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'uint24' },\n { type: 'int24' },\n ],\n [\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n fee,\n tickSpacing,\n ],\n );\n\n const { poolManager, numTokensToSell, poolInitializer } = params;\n\n const hookInitHashData = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'uint24' },\n ],\n [\n poolManager,\n numTokensToSell,\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n poolInitializer,\n fee,\n ],\n );\n\n const hookInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerBytecode as Hex, hookInitHashData],\n ),\n );\n\n const tokenFactoryData =\n params.tokenVariant === 'doppler404'\n ? (() => {\n const t = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [t.name, t.symbol, t.baseURI, t.unit ?? 1000n],\n );\n })()\n : (() => {\n const {\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n ],\n );\n })();\n\n // Compute token init hash; use DN404 bytecode if tokenVariant is doppler404\n let tokenInitHash: Hash | undefined;\n if (params.tokenVariant === 'doppler404') {\n const { name, symbol, baseURI } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n const { airlock, initialSupply } = params;\n // DN404 constructor: (name, symbol, initialSupply, recipient, owner, baseURI)\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'string' },\n ],\n [name, symbol, initialSupply, airlock, airlock, baseURI],\n );\n tokenInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerDN404Bytecode as Hex, initHashData],\n ),\n );\n } else {\n const {\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n const { airlock, initialSupply } = params;\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n name,\n symbol,\n initialSupply,\n airlock,\n airlock,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n ],\n );\n // Use DERC2080Bytecode for TokenFactory80, DERC20Bytecode otherwise\n const isTokenFactory80 =\n params.tokenFactory.toLowerCase() === TOKEN_FACTORY_80_ADDRESS;\n const bytecode = isTokenFactory80\n ? (DERC2080Bytecode as Hex)\n : ((params.customDerc20Bytecode as Hex) ?? (DERC20Bytecode as Hex));\n\n tokenInitHash = keccak256(\n encodePacked(['bytes', 'bytes'], [bytecode, initHashData]),\n );\n }\n\n // Use the exact flags from V4 SDK\n const flags = BigInt(\n (1 << 13) | // BEFORE_INITIALIZE_FLAG\n (1 << 12) | // AFTER_INITIALIZE_FLAG\n (1 << 11) | // BEFORE_ADD_LIQUIDITY_FLAG\n (1 << 7) | // BEFORE_SWAP_FLAG\n (1 << 6) | // AFTER_SWAP_FLAG\n (1 << 5), // BEFORE_DONATE_FLAG\n );\n\n // Pre-compute values outside the loop (optimization)\n const numeraireBigInt = BigInt(params.numeraire);\n\n // Pre-allocate CREATE2 buffers with constant parts\n const hookBuffer = this.prepareCreate2Buffer(params.deployer, hookInitHash);\n const tokenBuffer = tokenInitHash\n ? this.prepareCreate2Buffer(params.tokenFactory, tokenInitHash)\n : null;\n\n for (let salt = 0n; salt < 1_000_000n; salt++) {\n // Update salt in pre-computed buffer (avoids string formatting)\n this.updateSaltInBuffer(hookBuffer, salt);\n\n // Compute hook address using fast method (no checksum)\n const hookRaw = this.computeCreate2AddressFast(hookBuffer);\n const hookBigInt = BigInt(hookRaw);\n\n // Early termination: skip token computation if hook flags don't match\n // Only ~1 in 8192 addresses match the required flags, so this saves ~50% of keccak256 calls\n if ((hookBigInt & FLAG_MASK) !== flags) {\n continue;\n }\n\n if (tokenBuffer) {\n // Update salt in token buffer\n this.updateSaltInBuffer(tokenBuffer, salt);\n\n // Compute token address using fast method\n const tokenRaw = this.computeCreate2AddressFast(tokenBuffer);\n const tokenBigInt = BigInt(tokenRaw);\n\n if (\n (isToken0 && tokenBigInt < numeraireBigInt) ||\n (!isToken0 && tokenBigInt > numeraireBigInt)\n ) {\n // Found a match! Convert to proper format for return\n const saltBytes = `0x${salt.toString(16).padStart(64, '0')}` as Hash;\n const hook = getAddress(hookRaw) as Address;\n const token = getAddress(tokenRaw) as Address;\n return [\n saltBytes,\n hook,\n token,\n poolInitializerData,\n tokenFactoryData,\n ];\n }\n }\n }\n\n throw new Error('AirlockMiner: could not find salt');\n }\n\n /**\n * Computes the CREATE2 address for a contract deployment\n * @param salt - The salt used for deployment\n * @param initCodeHash - Hash of the initialization code\n * @param deployer - Address of the deploying contract\n * @returns The computed contract address\n * @private\n */\n private computeCreate2Address(\n salt: Hash,\n initCodeHash: Hash,\n deployer: Address,\n ): Address {\n const encoded = encodePacked(\n ['bytes1', 'address', 'bytes32', 'bytes32'],\n ['0xff', deployer, salt, initCodeHash],\n );\n return getAddress(`0x${keccak256(encoded).slice(-40)}`);\n }\n\n /**\n * Helper to convert hex string to Uint8Array\n * @private\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);\n }\n return bytes;\n }\n\n /**\n * Helper to convert Uint8Array to hex string\n * @private\n */\n private bytesToHex(bytes: Uint8Array): string {\n return (\n '0x' +\n Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n );\n }\n\n /**\n * Pre-compute CREATE2 buffer with constant prefix for fast mining\n * Buffer layout: 0xff (1 byte) + deployer (20 bytes) + salt (32 bytes) + initCodeHash (32 bytes) = 85 bytes\n * @private\n */\n private prepareCreate2Buffer(\n deployer: Address,\n initCodeHash: Hash,\n ): Uint8Array {\n const buffer = new Uint8Array(85);\n buffer[0] = 0xff;\n const deployerBytes = this.hexToBytes(deployer);\n buffer.set(deployerBytes, 1);\n const initCodeHashBytes = this.hexToBytes(initCodeHash);\n buffer.set(initCodeHashBytes, 53); // 1 + 20 + 32 = 53\n return buffer;\n }\n\n /**\n * Update salt in pre-computed CREATE2 buffer (bytes 21-52)\n * Uses direct byte manipulation instead of string conversion\n * @private\n */\n private updateSaltInBuffer(buffer: Uint8Array, salt: bigint): void {\n // Salt is 32 bytes, positioned at offset 21 (after 0xff + 20-byte deployer)\n // Clear salt region first\n for (let i = 21; i < 53; i++) {\n buffer[i] = 0;\n }\n // Write salt bytes from right to left (big-endian)\n let remaining = salt;\n for (let i = 52; remaining > 0n && i >= 21; i--) {\n buffer[i] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n }\n\n /**\n * Compute CREATE2 address from pre-computed buffer (fast version for mining)\n * Returns raw lowercase address without checksum for comparison\n * @private\n */\n private computeCreate2AddressFast(buffer: Uint8Array): string {\n const hash = keccak256(this.bytesToHex(buffer) as Hex);\n // Return last 40 hex chars (20 bytes) as lowercase address\n return '0x' + hash.slice(-40).toLowerCase();\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Compute the V4 poolId for a multicurve pool by reading the hook address from the initializer\n */\n private async computeMulticurvePoolId(\n params: CreateMulticurveParams<C>,\n tokenAddress: Address,\n ): Promise<Hex> {\n const addresses = getAddresses(this.chainId);\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n let hookAddress: Address;\n if (initializerMode.type === 'rehype') {\n // For DopplerHookInitializer mode, hook address comes from the encoded\n // initializer payload (or defaults to zero when no hook config is set).\n hookAddress = initializerMode.hookConfig?.hookAddress ?? ZERO_ADDRESS;\n } else {\n const initializerAddress = (() => {\n if (initializerMode.type === 'decay') {\n return (\n params.modules?.v4DecayMulticurveInitializer ??\n addresses.v4DecayMulticurveInitializer\n );\n }\n if (initializerMode.type === 'scheduled') {\n return (\n params.modules?.v4ScheduledMulticurveInitializer ??\n addresses.v4ScheduledMulticurveInitializer\n );\n }\n return (\n params.modules?.v4MulticurveInitializer ??\n addresses.v4MulticurveInitializer\n );\n })();\n\n if (!initializerAddress) {\n throw new Error('Multicurve initializer address not configured');\n }\n\n // Standard/scheduled/decay initializers expose HOOK() directly.\n hookAddress = (await (this.publicClient as PublicClient).readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'HOOK',\n })) as Address;\n }\n\n // Construct the pool key and compute poolId\n const numeraire = params.sale.numeraire;\n const currency0 = tokenAddress < numeraire ? tokenAddress : numeraire;\n const currency1 = tokenAddress < numeraire ? numeraire : tokenAddress;\n const fee =\n initializerMode.type === 'decay' ? DYNAMIC_FEE_FLAG : params.pool.fee;\n\n return this.computePoolId({\n currency0,\n currency1,\n fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n }) as Hex;\n }\n\n private async ensureMulticurveBundlerSupport(\n bundler: Address,\n ): Promise<void> {\n if (this.multicurveBundlerSupport.get(bundler)) {\n return;\n }\n\n const client = this.publicClient as PublicClient;\n if (!client || typeof client.getBytecode !== 'function') {\n // If we cannot check support, optimistically assume true.\n this.multicurveBundlerSupport.set(bundler, true);\n return;\n }\n\n const bytecode = await client.getBytecode({ address: bundler });\n const supports = Boolean(\n bytecode &&\n MULTICURVE_BUNDLER_SELECTORS.every((selector) =>\n bytecode.includes(selector.slice(2)),\n ),\n );\n\n if (!supports) {\n throw new Error(\n `Bundler at ${bundler} does not support multicurve bundling. Ensure the Doppler Bundler has been upgraded and update chain addresses.`,\n );\n }\n\n this.multicurveBundlerSupport.set(bundler, true);\n }\n}\n\nconst MULTICURVE_BUNDLER_SELECTORS = ['0xe2e9faa1', '0x07087b06'] as const;\n"]}
|
|
@@ -24,6 +24,7 @@ var VALID_FEE_TIERS = [
|
|
|
24
24
|
];
|
|
25
25
|
var V3_FEE_TIERS = VALID_FEE_TIERS;
|
|
26
26
|
var V4_MAX_FEE = 1e5;
|
|
27
|
+
var DECAY_MAX_START_FEE = 8e5;
|
|
27
28
|
var TICK_SPACINGS = {
|
|
28
29
|
100: 1,
|
|
29
30
|
500: 10,
|
|
@@ -95,6 +96,7 @@ var DYNAMIC_AUCTION_VALID_FEES = [100, 500, 3e3, 1e4];
|
|
|
95
96
|
exports.BASIS_POINTS = BASIS_POINTS;
|
|
96
97
|
exports.DAY_SECONDS = DAY_SECONDS;
|
|
97
98
|
exports.DEAD_ADDRESS = DEAD_ADDRESS;
|
|
99
|
+
exports.DECAY_MAX_START_FEE = DECAY_MAX_START_FEE;
|
|
98
100
|
exports.DEFAULT_AUCTION_DURATION = DEFAULT_AUCTION_DURATION;
|
|
99
101
|
exports.DEFAULT_CREATE_GAS_LIMIT = DEFAULT_CREATE_GAS_LIMIT;
|
|
100
102
|
exports.DEFAULT_EPOCH_LENGTH = DEFAULT_EPOCH_LENGTH;
|
|
@@ -138,5 +140,5 @@ exports.V4_MAX_FEE = V4_MAX_FEE;
|
|
|
138
140
|
exports.VALID_FEE_TIERS = VALID_FEE_TIERS;
|
|
139
141
|
exports.WAD = WAD;
|
|
140
142
|
exports.ZERO_ADDRESS = ZERO_ADDRESS;
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
143
|
+
//# sourceMappingURL=chunk-6BQY5EPB.js.map
|
|
144
|
+
//# sourceMappingURL=chunk-6BQY5EPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"names":["parseEther"],"mappings":";;;;;AAGO,IAAM,MAAM,GAAA,IAAO;AACnB,IAAM,YAAA,GACX;AACK,IAAM,YAAA,GACX;AAaK,IAAM,SAAA,GAAY;AAAA,EACvB,MAAA,EAAQ,GAAA;AAAA;AAAA,EACR,GAAA,EAAK,GAAA;AAAA;AAAA,EACL,MAAA,EAAQ,GAAA;AAAA;AAAA,EACR,IAAA,EAAM;AAAA;AACR;AASO,IAAM,eAAA,GAAsC;AAAA,EACjD,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAM;AAClB;AAMO,IAAM,YAAA,GAAe;AAOrB,IAAM,UAAA,GAAa;AAOnB,IAAM,mBAAA,GAAsB;AAI5B,IAAM,aAAA,GAAgB;AAAA,EAC3B,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,GAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAO;AACT;AAMO,IAAM,wBAAA,GAA2B;AAGjC,IAAM,eAAA,GAAkB;AACxB,IAAM,mBAAmB,GAAA,GAAM;AAG/B,IAAM,oBAAA,GAAuB;AAC7B,IAAM,2BAA2B,CAAA,GAAI;AACrC,IAAM,qBAAA,GAAwB;AAC9B,IAAM,gBAAA,GAAmB;AACzB,IAAM,WAAA,GAAc;AAGpB,IAAM,wBAAA,GAA2B;AAGjC,IAAM,qBAAA,GAAwB;AAC9B,IAAM,mBAAA,GAAsB;AAC5B,IAAM,wBAAA,GAA2B;AACjC,IAAM,cAAA,GAAiB;AACvB,IAAM,+BAAA,GAAkC;AACxC,IAAM,gCAAA,GAAmC;AACzC,IAAM,qCAAA,GAAwC;AAC9C,IAAM,2BAAA,GAA8B,OAAO,gBAAgB;AAC3D,IAAM,yBAAA,GAA4BA,gBAAW,YAAY;AACzD,IAAM,6BAAA,GAAgCA,gBAAW,WAAW;AAC5D,IAAM,2BAAA,GAA8BA,gBAAW,MAAM;AACrD,IAAM,mBAAA,GAAsBA,gBAAW,SAAS;AAChD,IAAM,+BAAA,GAAkCA,gBAAW,MAAM;AAGzD,IAAM,+BAAA,GAAkC;AACxC,IAAM,gCAAA,GAAmC;AACzC,IAAM,qCAAA,GAAwC;AAC9C,IAAM,2BAAA,GAA8BA,gBAAW,MAAM;AAKrD,IAAM,8BAAA,GAAiC;AAAA,EAC5C,OAAA;AAAA,EAAU,OAAA;AAAA,EAAU;AACtB;AACO,IAAM,8BAAA,GAAiC;AAAA,EAC5C,OAAA;AAAA,EAAU,OAAA;AAAA,EAAU;AACtB;AACO,IAAM,gCAAA,GAAmC,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE;AACpD,IAAM,oCAAA,GAAuC;AAAA,EAClDA,gBAAW,MAAM,CAAA;AAAA;AAAA,EACjBA,gBAAW,OAAO,CAAA;AAAA;AAAA,EAClBA,gBAAW,KAAK;AAAA;AAClB;AAGO,IAAM,cAAA,GAAiB;AACvB,IAAM,cAAA,GACX;AAGK,IAAM,YAAA,GAAe;AAGrB,IAAM,SAAA,GAAY,OAAO,KAAM;AAC/B,IAAM,aAAA,GAAgB,MAAA;AAAA,EAC1B,CAAA,IAAK,EAAA;AAAA,EACH,CAAA,IAAK,EAAA;AAAA,EACL,CAAA,IAAK,EAAA;AAAA,EACL,CAAA,IAAK,CAAA;AAAA,EACL,CAAA,IAAK,CAAA;AAAA,EACL,CAAA,IAAK;AAAA;AACV;AAGO,IAAM,gBAAA,GAAmB;AACzB,IAAM,eAAA,GAAkB;AAOxB,IAAM,0BAAA,GAA6B,CAAC,GAAA,EAAK,GAAA,EAAK,KAAM,GAAK","file":"chunk-6BQY5EPB.js","sourcesContent":["import { Address, parseEther } from 'viem';\n\n// Common constants\nexport const WAD = 10n ** 18n;\nexport const DEAD_ADDRESS =\n '0x000000000000000000000000000000000000dEaD' as Address;\nexport const ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as Address;\n\n// =============================================================================\n// Fee Tiers - V3 vs V4 Distinction\n// =============================================================================\n//\n// Uniswap V3 (Static Auctions): Fees are COUPLED to tick spacings. Only 4 tiers allowed.\n// Uniswap V4 (Dynamic/Multicurve): Fees are DECOUPLED. Any fee 0-100,000 is valid.\n//\n// The standard fee tiers below are recognized by both V3 and V4, but V4 pools\n// can use ANY fee value as long as you provide an explicit tickSpacing.\n\n/** Standard fee tiers recognized by both Uniswap V3 and V4 */\nexport const FEE_TIERS = {\n LOWEST: 100, // 0.01%\n LOW: 500, // 0.05%\n MEDIUM: 3000, // 0.30%\n HIGH: 10000, // 1.00%\n} as const;\n\n/** Valid fee tier values (100, 500, 3000, 10000) */\nexport type FeeTier = (typeof FEE_TIERS)[keyof typeof FEE_TIERS];\n\n/**\n * Standard fee tiers - REQUIRED for V3 (Static Auctions).\n * V4 pools can use custom fees but these are the recommended defaults.\n */\nexport const VALID_FEE_TIERS: readonly FeeTier[] = [\n 100, 500, 3000, 10000,\n] as const;\n\n/**\n * V3 fee tiers - These are the ONLY valid fees for Uniswap V3 pools.\n * Static Auctions use V3 and must use one of these tiers.\n */\nexport const V3_FEE_TIERS = VALID_FEE_TIERS;\n\n/**\n * Maximum LP fee for V4 pools (from DopplerHookInitializer.sol).\n * V4 pools can use any fee from 0 to this value.\n * @see DopplerHookInitializer.sol line 171: `uint24 constant MAX_LP_FEE = 100_000`\n */\nexport const V4_MAX_FEE = 100_000; // 10%\n\n/**\n * Maximum allowed start fee for decay multicurve schedules.\n * This is intentionally higher than V4_MAX_FEE to support anti-sniping launches.\n * 800_000 = 80%\n */\nexport const DECAY_MAX_START_FEE = 800_000; // 80%\n\n// Tick spacings for different fee tiers (standard Uniswap V3 mapping)\n// In V4, tickSpacing is independent of fee - you can use any combination\nexport const TICK_SPACINGS = {\n 100: 1,\n 500: 10,\n 3000: 60,\n 10000: 200,\n} as const;\n\n/**\n * Maximum tick spacing allowed by Doppler.sol for dynamic (Dutch) auctions.\n * @see Doppler.sol line 159: `int24 constant MAX_TICK_SPACING = 30`\n */\nexport const DOPPLER_MAX_TICK_SPACING = 30;\n\n// Time constants\nexport const SECONDS_PER_DAY = 86400;\nexport const SECONDS_PER_YEAR = 365 * SECONDS_PER_DAY;\n\n// Default values\nexport const DEFAULT_EPOCH_LENGTH = 43200; // 12 hours in seconds (matching V4 SDK)\nexport const DEFAULT_AUCTION_DURATION = 7 * SECONDS_PER_DAY; // 7 days\nexport const DEFAULT_LOCK_DURATION = SECONDS_PER_YEAR; // 1 year\nexport const DEFAULT_PD_SLUGS = 5; // Default price discovery slugs\nexport const DAY_SECONDS = SECONDS_PER_DAY; // Alias for consistency\n\n// Default gas limit to fall back on when create() simulations do not return a value\nexport const DEFAULT_CREATE_GAS_LIMIT = 13_500_000n;\n\n// V3 Default parameters\nexport const DEFAULT_V3_START_TICK = 175000;\nexport const DEFAULT_V3_END_TICK = 225000;\nexport const DEFAULT_V3_NUM_POSITIONS = 15;\nexport const DEFAULT_V3_FEE = 10000; // 1% fee tier\nexport const DEFAULT_V3_INITIAL_VOTING_DELAY = 172800; // 2 days\nexport const DEFAULT_V3_INITIAL_VOTING_PERIOD = 1209600; // 14 days\nexport const DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD = 0n;\nexport const DEFAULT_V3_VESTING_DURATION = BigInt(SECONDS_PER_YEAR);\nexport const DEFAULT_V3_INITIAL_SUPPLY = parseEther('1000000000'); // 1 billion tokens\nexport const DEFAULT_V3_NUM_TOKENS_TO_SELL = parseEther('900000000'); // 900 million tokens\nexport const DEFAULT_V3_YEARLY_MINT_RATE = parseEther('0.02'); // 2% yearly mint rate\nexport const DEFAULT_V3_PRE_MINT = parseEther('9000000'); // 9 million tokens (0.9%)\nexport const DEFAULT_V3_MAX_SHARE_TO_BE_SOLD = parseEther('0.35'); // 35%\n\n// V4 Default parameters\nexport const DEFAULT_V4_INITIAL_VOTING_DELAY = 7200; // 2 hours\nexport const DEFAULT_V4_INITIAL_VOTING_PERIOD = 50400; // 14 hours\nexport const DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD = 0n;\nexport const DEFAULT_V4_YEARLY_MINT_RATE = parseEther('0.02'); // 2% yearly mint rate\n\n// V4 Multicurve Default Tick Ranges\n// Based on market cap tiers: LOW ($7.5k -> $30k), MEDIUM ($50k -> $150k), HIGH ($250k -> $750k)\n// Calculated for 1B token supply, $4500 numeraire (e.g., WETH on Base)\nexport const DEFAULT_MULTICURVE_LOWER_TICKS = [\n -202_100, -183_100, -167_000,\n] as const;\nexport const DEFAULT_MULTICURVE_UPPER_TICKS = [\n -188_200, -172_100, -156_000,\n] as const;\nexport const DEFAULT_MULTICURVE_NUM_POSITIONS = [11, 11, 11] as const;\nexport const DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES = [\n parseEther('0.05'), // 5% for LOW tier\n parseEther('0.125'), // 12.5% for MEDIUM tier\n parseEther('0.2'), // 20% for HIGH tier\n] as const;\n\n// Price bounds\nexport const MIN_SQRT_RATIO = 4295128739n;\nexport const MAX_SQRT_RATIO =\n 1461446703485210103287273052203988822378723970342n;\n\n// Basis points\nexport const BASIS_POINTS = 10000;\n\n// V4 Hook Flags for Doppler\nexport const FLAG_MASK = BigInt(0x3fff);\nexport const DOPPLER_FLAGS = BigInt(\n (1 << 13) | // BEFORE_INITIALIZE_FLAG\n (1 << 12) | // AFTER_INITIALIZE_FLAG\n (1 << 11) | // BEFORE_ADD_LIQUIDITY_FLAG\n (1 << 7) | // BEFORE_SWAP_FLAG\n (1 << 6) | // AFTER_SWAP_FLAG\n (1 << 5), // BEFORE_DONATE_FLAG\n);\n\n// V4 Dynamic Fee Flag\nexport const DYNAMIC_FEE_FLAG = 0x800000; // 8388608 in decimal\nexport const FEE_AMOUNT_MASK = 0xffffff; // Mask to extract actual fee from dynamic fee\n\n/**\n * @deprecated Dynamic auctions (V4) support ANY fee 0-100,000 with explicit tickSpacing.\n * This constant is kept for backwards compatibility but is no longer enforced.\n * Standard fee tiers still auto-derive tickSpacing; custom fees require explicit tickSpacing.\n */\nexport const DYNAMIC_AUCTION_VALID_FEES = [100, 500, 3000, 10000] as const;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getAddresses } from './chunk-
|
|
2
|
-
import { dopplerHookAbi, airlockAbi } from './chunk-
|
|
1
|
+
import { getAddresses } from './chunk-CYY5IATT.mjs';
|
|
2
|
+
import { dopplerHookAbi, airlockAbi } from './chunk-E2NF4AQB.mjs';
|
|
3
3
|
import { zeroAddress, encodeAbiParameters, keccak256 } from 'viem';
|
|
4
4
|
|
|
5
5
|
var DynamicAuction = class {
|
|
@@ -291,5 +291,5 @@ var DynamicAuction = class {
|
|
|
291
291
|
};
|
|
292
292
|
|
|
293
293
|
export { DynamicAuction };
|
|
294
|
-
//# sourceMappingURL=chunk-
|
|
295
|
-
//# sourceMappingURL=chunk-
|
|
294
|
+
//# sourceMappingURL=chunk-6HFZ6XMV.mjs.map
|
|
295
|
+
//# sourceMappingURL=chunk-6HFZ6XMV.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/auction/DynamicAuction.ts"],"names":[],"mappings":";;;;AAkBO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,IAAY,GAAA,GAAoB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,WAAA,CAAY,QAA+B,WAAA,EAAsB;AAC/D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CAAkB,IAAA,EAAW,aAAA,GAAwB,CAAA,EAAkB;AAC3E,IAAA,MAAM,KAAK,GAAA,CAAI,yBAAA,CAA0B,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAiC;AAErC,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,SAAA;AAAA,MACA,oBAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MACpB,KAAK,aAAA,EAAc;AAAA,MACnB,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf;AAAA,KACF,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AACxD,IAAA,MAAM,cACJ,WAAA,GAAc,YAAA,GAAe,WAAA,GAAc,YAAA,GAAe,OAAO,CAAC,CAAA;AACpE,IAAA,MAAM,eACJ,WAAA,GAAc,EAAA,GAAK,MAAA,CAAO,WAAA,GAAc,WAAW,CAAA,GAAI,CAAA;AAGzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,UAAiB,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,QAAQ,SAAA,KAAc,WAAA;AACvC,IAAA,MAAM,YAAA,GAAe,QAAA,GAAW,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,SAAA;AAC5D,IAAA,MAAM,gBAAA,GAAmB,QAAA,GAAW,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,SAAA;AAGhE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAgB,KAAA,CAAc,aAAA;AAAA,MAC9B,iBAAkB,KAAA,CAAc,eAAA;AAAA,MAChC,SAAA;AAAA,MACA,oBAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAoC;AACxC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAC7C,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,UAAiB,CAAA;AAEvD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAC3C,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,OAAO,QAAA,GAAW,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,SAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA6B;AACjC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAC7C,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,UAAiB,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,cAAc,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAiC;AACrC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,EAAgB;AAChD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAW;AAC1C,IAAA,MAAM,SAAA,GAAY,aAAa,OAAO,CAAA;AAEtC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAC5C,SAAS,SAAA,CAAU,OAAA;AAAA,MACnB,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,cAAA;AAAA,MACd,IAAA,EAAM,CAAC,YAAY;AAAA,KACpB,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,MAAM,OAAA,CAAQ,SAAS,IAC5C,SAAA,CAAkB,CAAC,IACnB,SAAA,EAAmB,iBAAA;AACxB,IAAA,OAAO,iBAAA,KAAsB,WAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,CAAC,YAAA,EAAc,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACpD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf;AAAA,KACF,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AACxD,IAAA,MAAM,cACJ,WAAA,GAAc,YAAA,GAAe,WAAA,GAAc,YAAA,GAAe,OAAO,CAAC,CAAA;AAEpE,IAAA,OAAO,MAAA,CAAO,cAAc,WAAW,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,CAAC,MAAA,EAAQ,YAAA,EAAc,UAAA,EAAY,KAAA,EAAO,cAAc,WAAW,CAAA,GACvE,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAChB,KAAK,aAAA,EAAc;AAAA,MACnB,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,QACpB,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,cAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf;AAAA,KACF,CAAA;AAGH,IAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AACxD,IAAA,MAAM,cACJ,WAAA,GAAc,YAAA,GAAe,WAAA,GAAc,YAAA,GAAe,OAAO,CAAC,CAAA;AACpE,IAAA,MAAM,eACJ,WAAA,GAAc,EAAA,GAAK,MAAA,CAAO,WAAA,GAAc,WAAW,CAAA,GAAI,CAAA;AAIzD,IAAA,MAAM,SAAA,GAAY,UAAA,GAAa,YAAA,GAAe,CAAA,GAAI,EAAA;AAClD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,QAAQ,SAAS,CAAA;AAChE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,YAAY,CAAA;AAM1D,IAAA,OAAO,OAAO,WAAW,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAoC;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,EAAc;AAEvC,IAAA,OAAQ,KAAA,CAAc,aAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAkC;AACtC,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MACjC,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAA,EAMX;AAET,IAAA,MAAM,OAAA,GAAU,mBAAA;AAAA,MACd;AAAA,QACE,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,QAAA,EAAS;AAAA,QACjB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,SAAA;AAAU,OACpB;AAAA,MACA;AAAA,QACE,OAAA,CAAQ,SAAA;AAAA,QACR,OAAA,CAAQ,SAAA;AAAA,QACR,OAAA,CAAQ,GAAA;AAAA,QACR,OAAA,CAAQ,WAAA;AAAA,QACR,OAAA,CAAQ;AAAA;AACV,KACF;AACA,IAAA,OAAO,UAAU,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,GAA8B;AAC1C,IAAA,MAAM,MAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAC9C,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,GAAA,EAAK,cAAA;AAAA,MACL,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,MAAM;AAAA,QACJ,SAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,aAAA;AAAA,QACA,wBAAA;AAAA,QACA;AAAA,OACF,GAAI,MAAA;AACJ,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,aAAA;AAAA,QACA,wBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,KAAA,EAMvB;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,CAAC,SAAA,EAAW,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,KAAK,CAAA,GAAI,KAAA;AAOxD,MAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,GAAA,EAAK,aAAa,KAAA,EAAM;AAAA,IACzD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"chunk-HVM7KZJM.mjs","sourcesContent":["import {\n type Address,\n type PublicClient,\n type Hex,\n keccak256,\n encodeAbiParameters,\n zeroAddress,\n} from 'viem';\nimport type { HookInfo, SupportedPublicClient } from '../../types';\nimport { dopplerHookAbi, airlockAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\n\n/**\n * DynamicAuction class for interacting with dynamic auctions (Uniswap V4 hook based)\n *\n * Dynamic auctions use a Uniswap V4 hook to create a gradual Dutch auction\n * where the price moves dynamically over time according to set parameters.\n */\nexport class DynamicAuction {\n private client: SupportedPublicClient;\n private hookAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(client: SupportedPublicClient, hookAddress: Address) {\n this.client = client;\n this.hookAddress = hookAddress;\n }\n\n /**\n * Wait for a transaction to be confirmed and the contract to be ready for reads\n * @param hash - Transaction hash to wait for\n * @param confirmations - Number of block confirmations to wait for (default: 2)\n */\n async waitForDeployment(hash: Hex, confirmations: number = 2): Promise<void> {\n await this.rpc.waitForTransactionReceipt({ hash, confirmations });\n }\n\n /**\n * Get the hook address\n */\n getAddress(): Address {\n return this.hookAddress;\n }\n\n /**\n * Get current hook information\n */\n async getHookInfo(): Promise<HookInfo> {\n // Fetch all hook data in parallel\n const [\n state,\n earlyExit,\n insufficientProceeds,\n poolKeyRaw,\n startingTime,\n endingTime,\n epochLength,\n minimumProceeds,\n maximumProceeds,\n ] = await Promise.all([\n this.readHookState(),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'earlyExit',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'insufficientProceeds',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'endingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'minimumProceeds',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'maximumProceeds',\n }),\n ]);\n\n // Calculate current epoch\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n const currentEpoch =\n epochLength > 0n ? Number(elapsedTime / epochLength) : 0;\n\n // Determine token addresses from poolKey\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n const isToken0 = poolKey.currency0 !== zeroAddress;\n const tokenAddress = isToken0 ? poolKey.currency0 : poolKey.currency1;\n const numeraireAddress = isToken0 ? poolKey.currency1 : poolKey.currency0;\n\n // Compute pool ID\n const poolId = this.computePoolId(poolKey);\n\n return {\n hookAddress: this.hookAddress,\n tokenAddress,\n numeraireAddress,\n poolId,\n currentEpoch,\n totalProceeds: (state as any).totalProceeds,\n totalTokensSold: (state as any).totalTokensSold,\n earlyExit,\n insufficientProceeds,\n startingTime,\n endingTime,\n epochLength,\n minimumProceeds,\n maximumProceeds,\n };\n }\n\n /**\n * Get the token address for this auction\n */\n async getTokenAddress(): Promise<Address> {\n const poolKeyRaw = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n });\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n\n const isToken0 = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'isToken0',\n });\n\n return isToken0 ? poolKey.currency0 : poolKey.currency1;\n }\n\n /**\n * Get the pool ID for this auction\n */\n async getPoolId(): Promise<string> {\n const poolKeyRaw = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n });\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n return this.computePoolId(poolKey);\n }\n\n /**\n * Check if the auction has graduated (ready for migration)\n */\n async hasGraduated(): Promise<boolean> {\n const tokenAddress = await this.getTokenAddress();\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId);\n\n const assetData = await this.rpc.readContract({\n address: addresses.airlock,\n abi: airlockAbi,\n functionName: 'getAssetData',\n args: [tokenAddress],\n });\n // Check if the asset is graduated (liquidityMigrator is zero)\n const liquidityMigrator = Array.isArray(assetData)\n ? (assetData as any)[3]\n : (assetData as any)?.liquidityMigrator;\n return liquidityMigrator === zeroAddress;\n }\n\n /**\n * Get the current epoch\n */\n async getCurrentEpoch(): Promise<number> {\n const [startingTime, epochLength] = await Promise.all([\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n ]);\n\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n\n return Number(elapsedTime / epochLength);\n }\n\n /**\n * Get the current price in the auction\n * Returns the current tick based on the epoch and gamma parameters\n */\n async getCurrentPrice(): Promise<bigint> {\n const [_state, startingTick, endingTick, gamma, startingTime, epochLength] =\n await Promise.all([\n this.readHookState(),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTick',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'endingTick',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'gamma',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n ]);\n\n // Calculate current epoch\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n const currentEpoch =\n epochLength > 0n ? Number(elapsedTime / epochLength) : 0;\n\n // Calculate current tick based on the auction progression\n // The tick moves from startingTick towards endingTick based on epochs and gamma\n const direction = endingTick > startingTick ? 1 : -1;\n const tickMovement = Math.floor(currentEpoch * gamma * direction);\n const currentTick = Math.floor(startingTick + tickMovement);\n\n // Convert tick to price\n // price = 1.0001^tick\n // For simplicity, returning the tick as bigint for now\n // In production, you'd convert this to actual price using TickMath\n return BigInt(currentTick);\n }\n\n /**\n * Get total proceeds collected so far\n */\n async getTotalProceeds(): Promise<bigint> {\n const state = await this.readHookState();\n\n return (state as any).totalProceeds;\n }\n\n /**\n * Check if the auction ended early due to max proceeds\n */\n async hasEndedEarly(): Promise<boolean> {\n return await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'earlyExit',\n });\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Read hook state with backward-compatible decoding.\n * Falls back to legacy state() ABI if the latest ABI fails to decode.\n */\n private async readHookState(): Promise<any> {\n const result: any = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'state',\n });\n if (Array.isArray(result)) {\n const [\n lastEpoch,\n tickAccumulator,\n totalTokensSold,\n totalProceeds,\n totalTokensSoldLastEpoch,\n feesAccrued,\n ] = result as any[];\n return {\n lastEpoch,\n tickAccumulator,\n totalTokensSold,\n totalProceeds,\n totalTokensSoldLastEpoch,\n feesAccrued,\n };\n }\n return result;\n }\n\n private normalizePoolKey(value: any): {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n } {\n if (Array.isArray(value)) {\n const [currency0, currency1, fee, tickSpacing, hooks] = value as [\n Address,\n Address,\n number,\n number,\n Address,\n ];\n return { currency0, currency1, fee, tickSpacing, hooks };\n }\n return value as any;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/auction/DynamicAuction.ts"],"names":[],"mappings":"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","file":"chunk-6HFZ6XMV.mjs","sourcesContent":["import {\n type Address,\n type PublicClient,\n type Hex,\n keccak256,\n encodeAbiParameters,\n zeroAddress,\n} from 'viem';\nimport type { HookInfo, SupportedPublicClient } from '../../types';\nimport { dopplerHookAbi, airlockAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\n\n/**\n * DynamicAuction class for interacting with dynamic auctions (Uniswap V4 hook based)\n *\n * Dynamic auctions use a Uniswap V4 hook to create a gradual Dutch auction\n * where the price moves dynamically over time according to set parameters.\n */\nexport class DynamicAuction {\n private client: SupportedPublicClient;\n private hookAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(client: SupportedPublicClient, hookAddress: Address) {\n this.client = client;\n this.hookAddress = hookAddress;\n }\n\n /**\n * Wait for a transaction to be confirmed and the contract to be ready for reads\n * @param hash - Transaction hash to wait for\n * @param confirmations - Number of block confirmations to wait for (default: 2)\n */\n async waitForDeployment(hash: Hex, confirmations: number = 2): Promise<void> {\n await this.rpc.waitForTransactionReceipt({ hash, confirmations });\n }\n\n /**\n * Get the hook address\n */\n getAddress(): Address {\n return this.hookAddress;\n }\n\n /**\n * Get current hook information\n */\n async getHookInfo(): Promise<HookInfo> {\n // Fetch all hook data in parallel\n const [\n state,\n earlyExit,\n insufficientProceeds,\n poolKeyRaw,\n startingTime,\n endingTime,\n epochLength,\n minimumProceeds,\n maximumProceeds,\n ] = await Promise.all([\n this.readHookState(),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'earlyExit',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'insufficientProceeds',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'endingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'minimumProceeds',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'maximumProceeds',\n }),\n ]);\n\n // Calculate current epoch\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n const currentEpoch =\n epochLength > 0n ? Number(elapsedTime / epochLength) : 0;\n\n // Determine token addresses from poolKey\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n const isToken0 = poolKey.currency0 !== zeroAddress;\n const tokenAddress = isToken0 ? poolKey.currency0 : poolKey.currency1;\n const numeraireAddress = isToken0 ? poolKey.currency1 : poolKey.currency0;\n\n // Compute pool ID\n const poolId = this.computePoolId(poolKey);\n\n return {\n hookAddress: this.hookAddress,\n tokenAddress,\n numeraireAddress,\n poolId,\n currentEpoch,\n totalProceeds: (state as any).totalProceeds,\n totalTokensSold: (state as any).totalTokensSold,\n earlyExit,\n insufficientProceeds,\n startingTime,\n endingTime,\n epochLength,\n minimumProceeds,\n maximumProceeds,\n };\n }\n\n /**\n * Get the token address for this auction\n */\n async getTokenAddress(): Promise<Address> {\n const poolKeyRaw = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n });\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n\n const isToken0 = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'isToken0',\n });\n\n return isToken0 ? poolKey.currency0 : poolKey.currency1;\n }\n\n /**\n * Get the pool ID for this auction\n */\n async getPoolId(): Promise<string> {\n const poolKeyRaw = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n });\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n return this.computePoolId(poolKey);\n }\n\n /**\n * Check if the auction has graduated (ready for migration)\n */\n async hasGraduated(): Promise<boolean> {\n const tokenAddress = await this.getTokenAddress();\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId);\n\n const assetData = await this.rpc.readContract({\n address: addresses.airlock,\n abi: airlockAbi,\n functionName: 'getAssetData',\n args: [tokenAddress],\n });\n // Check if the asset is graduated (liquidityMigrator is zero)\n const liquidityMigrator = Array.isArray(assetData)\n ? (assetData as any)[3]\n : (assetData as any)?.liquidityMigrator;\n return liquidityMigrator === zeroAddress;\n }\n\n /**\n * Get the current epoch\n */\n async getCurrentEpoch(): Promise<number> {\n const [startingTime, epochLength] = await Promise.all([\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n ]);\n\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n\n return Number(elapsedTime / epochLength);\n }\n\n /**\n * Get the current price in the auction\n * Returns the current tick based on the epoch and gamma parameters\n */\n async getCurrentPrice(): Promise<bigint> {\n const [_state, startingTick, endingTick, gamma, startingTime, epochLength] =\n await Promise.all([\n this.readHookState(),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTick',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'endingTick',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'gamma',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n ]);\n\n // Calculate current epoch\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n const currentEpoch =\n epochLength > 0n ? Number(elapsedTime / epochLength) : 0;\n\n // Calculate current tick based on the auction progression\n // The tick moves from startingTick towards endingTick based on epochs and gamma\n const direction = endingTick > startingTick ? 1 : -1;\n const tickMovement = Math.floor(currentEpoch * gamma * direction);\n const currentTick = Math.floor(startingTick + tickMovement);\n\n // Convert tick to price\n // price = 1.0001^tick\n // For simplicity, returning the tick as bigint for now\n // In production, you'd convert this to actual price using TickMath\n return BigInt(currentTick);\n }\n\n /**\n * Get total proceeds collected so far\n */\n async getTotalProceeds(): Promise<bigint> {\n const state = await this.readHookState();\n\n return (state as any).totalProceeds;\n }\n\n /**\n * Check if the auction ended early due to max proceeds\n */\n async hasEndedEarly(): Promise<boolean> {\n return await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'earlyExit',\n });\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Read hook state with backward-compatible decoding.\n * Falls back to legacy state() ABI if the latest ABI fails to decode.\n */\n private async readHookState(): Promise<any> {\n const result: any = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'state',\n });\n if (Array.isArray(result)) {\n const [\n lastEpoch,\n tickAccumulator,\n totalTokensSold,\n totalProceeds,\n totalTokensSoldLastEpoch,\n feesAccrued,\n ] = result as any[];\n return {\n lastEpoch,\n tickAccumulator,\n totalTokensSold,\n totalProceeds,\n totalTokensSoldLastEpoch,\n feesAccrued,\n };\n }\n return result;\n }\n\n private normalizePoolKey(value: any): {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n } {\n if (Array.isArray(value)) {\n const [currency0, currency1, fee, tickSpacing, hooks] = value as [\n Address,\n Address,\n number,\n number,\n Address,\n ];\n return { currency0, currency1, fee, tickSpacing, hooks };\n }\n return value as any;\n }\n}\n"]}
|