{"version":3,"sources":["../../src/evm/deployments.generated.ts","../../src/evm/constants.ts","../../src/evm/addresses.ts","../../src/evm/utils/tickMath.ts","../../src/evm/utils/priceHelpers.ts","../../src/evm/abis/multicurve/feeClaimsAbi.ts","../../src/evm/abis/dopplerDN404.ts","../../src/evm/abis/bytecodes/doppler.ts","../../src/evm/abis/bytecodes/dopplerDN404.ts","../../src/evm/abis/bytecodes/dopplerDN404BaseSepolia.ts","../../src/evm/abis/bytecodes/openingAuction.ts","../../src/evm/abis/bytecodes/derc20.ts","../../src/evm/abis/bytecodes/derc2080.ts","../../src/evm/abis/bytecodes/stateView.ts","../../src/evm/abis/index.ts","../../src/evm/utils/tokenAddressMiner.ts","../../src/evm/utils/airlock.ts","../../src/evm/utils/balanceDelta.ts","../../src/evm/utils/poolKey.ts","../../src/evm/utils/liquidityMath.ts","../../src/evm/utils/multicurveLiquidity.ts","../../src/evm/utils/computeOptimalGamma.ts","../../src/evm/utils/gasEstimate.ts","../../src/evm/utils/isToken0Expected.ts","../../src/evm/utils/beneficiaries.ts","../../src/evm/types.ts","../../src/evm/utils/rehypeFeeDistribution.ts","../../src/evm/utils/rehypeDopplerHookInitializer.ts","../../src/evm/utils/rehypeDopplerHookInitializerEncoding.ts","../../src/evm/utils/dopplerHookMigrator.ts","../../src/evm/utils/airlockCreateReceipt.ts","../../src/evm/utils/marketCapHelpers.ts","../../src/evm/builders/shared.ts","../../src/evm/entities/DopplerFactory.ts","../../src/evm/entities/auction/contractResults.ts","../../src/evm/entities/auction/StaticAuction.ts","../../src/evm/entities/auction/DynamicAuction.ts","../../src/evm/entities/auction/multicurve/multicurveInitializerDiscovery.ts","../../src/evm/entities/auction/multicurve/multicurveFeeCollection.ts","../../src/evm/entities/auction/multicurve/multicurveFeeSchedule.ts","../../src/evm/utils/multicall3.ts","../../src/evm/entities/auction/multicurve/multicurvePendingFees.ts","../../src/evm/entities/auction/multicurve/multicurvePendingFeeReader.ts","../../src/evm/entities/auction/MulticurvePool.ts","../../src/evm/entities/auction/multicurve/multicurvePendingFeeBreakdown.ts","../../src/evm/entities/auction/MulticurveFees.ts","../../src/evm/entities/auction/RehypeDopplerHookInitializer.ts","../../src/evm/entities/auction/RehypeDopplerHook.ts","../../src/evm/entities/auction/RehypeDopplerHookMigrator.ts","../../src/evm/entities/auction/OpeningAuctionPositionManager.ts","../../src/evm/entities/auction/OpeningAuction.ts","../../src/evm/entities/auction/OpeningAuctionLifecycle.ts","../../src/evm/entities/auction/OpeningAuctionBidManager.ts","../../src/evm/entities/quoter/Quoter.ts","../../src/evm/entities/token/derc20/Derc20.ts","../../src/evm/entities/token/derc20/Derc20V2.ts","../../src/evm/entities/token/derc20/DopplerERC20V1.ts","../../src/evm/entities/token/doppler404/DopplerDN404.ts","../../src/evm/entities/token/eth/Eth.ts","../../src/evm/entities/TopUpDistributor.ts","../../src/evm/entities/Bundler.ts","../../src/evm/builders/StaticAuctionBuilder.ts","../../src/evm/builders/DynamicAuctionBuilder.ts","../../src/evm/builders/MulticurveBuilder.ts","../../src/evm/builders/OpeningAuctionBuilder.ts","../../src/evm/DopplerSDK.ts","../../src/evm/index.ts"],"names":["parseEther","formatEther","keccak256","name","symbol","decodeAbiParameters","initHashData","encodeAbiParameters","encodePacked","getAddress","airlockAbi","isAddress","zeroAddress","LockablePoolStatus","OpeningAuctionPhase","OpeningAuctionStatus","RehypeFeeRoutingMode","resolveRehypeFeeDistributionInfo","decodeEventLog","normalizePoolKey","TOKEN_FACTORY_80_ADDRESS","resolved","isTokenFactory80","decoded","tokenAddress","toHex","poolId","ContractFunctionRevertedError","ExecutionRevertedError","BaseError","beneficiaryData","beneficiaryComponents","createParams","result","prediction","encodeFunctionData","erc20Abi","account","accountAddress","tokenFactoryData","isHex","Q96","decodeErrorResult","ContractFunctionZeroDataError","multicall3Abi","decodeFunctionResult","zeroHash","request","gamma"],"mappings":"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","file":"index.cjs","sourcesContent":["// AUTO-GENERATED FILE. DO NOT EDIT.\n// Generated by scripts/generate-addresses.mjs\n// Source: ../doppler/Deployments.json\n// WARNING: This file is an internal build artifact and is NOT part of the public API.\n// WARNING: Do NOT import from this file directly. It should not appear in IDE IntelliSense/suggestions.\n// WARNING: If you need Doppler addresses, import from @addresses.ts instead (e.g. use ADDRESSES / getAddresses).\n\n/** @internal */\nexport type GeneratedDopplerDeployments = Record<\n  string,\n  Record<string, string>\n>;\n\n/** @internal */\nexport const GENERATED_DOPPLER_DEPLOYMENTS = {\n  '1': {\n    Airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA',\n    Bundler: '0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c',\n    DopplerCreateXDeployer: '0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83',\n    DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n    DopplerERC20V1: '0xDB7B520bb5C3a2C5d4871198081911359f93be87',\n    DopplerERC20V1Factory: '0x89C261C05B5F9b6BcBA07C199b8DeE7cFaD45292',\n    DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n    DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n    GovernanceFactory: '0x9F309D79BEe3E8b2f56FaCF74b7195Df176c8F61',\n    LaunchpadGovernanceFactory: '0x2A8DA67F277442cFF7Dc2143e52Fdd0cBF5A8175',\n    LockableUniswapV3Initializer: '0xA2E0435225D52a8B950122752978007D758056d7',\n    NoOpGovernanceFactory: '0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638',\n    NoOpMigrator: '0x233A71A7bB928b1357A1Ebf454298320989Ca5B5',\n    Quoter: '0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D',\n    RehypeDopplerHookInitializer: '0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215',\n    RehypeDopplerHookMigrator: '0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B',\n    StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n    TimelockFactory: '0x9fd40af2baAfAF03513f091444e821c0d5b06ea0',\n    TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n    UniswapV2Locker: '0x06731e30df4B0209ED19C39Ba8eD253e17b0E495',\n    UniswapV2MigratorSplit: '0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3',\n    UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n  },\n  '143': {\n    Airlock: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n    Bundler: '0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c',\n    DopplerCreateXDeployer: '0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83',\n    DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n    DopplerERC20V1: '0xDB7B520bb5C3a2C5d4871198081911359f93be87',\n    DopplerERC20V1Factory: '0x89C261C05B5F9b6BcBA07C199b8DeE7cFaD45292',\n    DopplerHookInitializer: '0x56ea13Da5f39863D3B3d54826187306Af7ada544',\n    DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n    GovernanceFactory: '0xFAafdE6a5b658684cC5eb0C5c2c755B00A246F45',\n    LaunchpadGovernanceFactory: '0x5FBe931dc4B923A7abe4c47aD68d5bF9Eda5B76D',\n    LockableUniswapV3Initializer: '0x8b4C7DB9121FC885689C0A50D5a1429F15AEc2a0',\n    NoOpGovernanceFactory: '0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9',\n    NoOpMigrator: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731',\n    Quoter: '0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D',\n    RehypeDopplerHookInitializer: '0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215',\n    RehypeDopplerHookMigrator: '0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B',\n    StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n    TimelockFactory: '0x44610355465c1F5914C8B8ea0E7c887CC67459b2',\n    TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n    UniswapV2Locker: '0x06731e30df4B0209ED19C39Ba8eD253e17b0E495',\n    UniswapV2MigratorSplit: '0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3',\n    UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n  },\n  '4663': {\n    Airlock: '0xeb7C034704eF8Dcd2D32324c1545f62fB4aD0862',\n    Bundler: '0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c',\n    DN404Factory: '0x37A9Fa204a4d3A429FDED7e3469ab076C854Bc9d',\n    DopplerCreateXDeployer: '0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83',\n    DopplerDeployer: '0x4389AD34938B14F25cff7ED983c53f5a42A2573f',\n    DopplerERC20V1: '0x3Be8B97Fd0e713B5aBE0649Fa830223B6B4BC599',\n    DopplerERC20V1Factory: '0x1B37D3a72082029c44B35B604Ea473617580b69a',\n    DopplerHookInitializer: '0x4e3468951D49f2EEa976eD0D6e75fFCb44a9a544',\n    DopplerHookMigrator: '0x7BF319d8e969f7596B1Bc171Da9ce322f67Ae0c4',\n    DopplerLensQuoter: '0xf4c22465532f64777FfcD7770831AEca38F35c04',\n    GovernanceFactory: '0xDeb0447DAE3EB177c4dbA8bBCCCa25c8F273B7ef',\n    LaunchpadGovernanceFactory: '0xdb036746D65DD52126b1915f1AdF555e6C5237Cf',\n    LockableUniswapV3Initializer: '0xde8886A0019Ea060B8378Ee37b8A23b8117F29A3',\n    NoOpGovernanceFactory: '0x85f37f74Ef2478A770318bc810177a9835911aD7',\n    NoOpMigrator: '0xba2F330EDb16cD8056f5988d8CE19BbC63475A0e',\n    Quoter: '0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D',\n    RehypeDopplerHookInitializer: '0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215',\n    RehypeDopplerHookMigrator: '0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B',\n    StreamableFeesLockerV2: '0x7B6147AC3F615bdb764e7EbD5f517dac1AD163B8',\n    SwapRestrictorDopplerHook: '0xC16c826F75338A5Ea626f94f8992191B4ce5abA2',\n    TimelockFactory: '0x6076fdDFCaC0dD980e0350dfF5239feC3f86C578',\n    TopUpDistributor: '0x46adee7595d48b1Ec53090e9bc78e1E69Fa0eF06',\n    UniswapV2Locker: '0x63f6Efe03F25A8C6650b38d05C5a454051d642a5',\n    UniswapV2MigratorSplit: '0xB05046cEa797c993FB5b583098B1c4682e9Da333',\n    UniswapV4Initializer: '0x6cce158B6D1747617fc218592B4D60B239B957ea',\n  },\n  '8453': {\n    Airlock: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n    Bundler: '0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c',\n    DN404Factory: '0x37A9Fa204a4d3A429FDED7e3469ab076C854Bc9d',\n    DopplerCreateXDeployer: '0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83',\n    DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n    DopplerERC20V1: '0xDB7B520bb5C3a2C5d4871198081911359f93be87',\n    DopplerERC20V1Factory: '0x89C261C05B5F9b6BcBA07C199b8DeE7cFaD45292',\n    DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n    DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n    DopplerLensQuoter: '0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3',\n    GovernanceFactory: '0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B',\n    LaunchpadGovernanceFactory: '0x40Bcb4dDA3BcF7dba30C5d10c31EE2791ed9ddCa',\n    LockableUniswapV3Initializer: '0xE0dC4012AC9C868F09c6e4b20d66ED46D6F258d0',\n    NoOpGovernanceFactory: '0xe7dfbd5b0A2C3B4464653A9beCdc489229eF090E',\n    NoOpMigrator: '0x6ddfED58D238Ca3195E49d8ac3d4cEa6386E5C33',\n    Quoter: '0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D',\n    RehypeDopplerHookInitializer: '0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215',\n    RehypeDopplerHookMigrator: '0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B',\n    StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n    TimelockFactory: '0xa636bD5F9179E80e9EdB371Ed90956fA5ebdCB33',\n    TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n    UniswapV2Locker: '0x06731e30df4B0209ED19C39Ba8eD253e17b0E495',\n    UniswapV2MigratorSplit: '0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3',\n    UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n  },\n  '42161': {\n    Airlock: '0xeb7C034704eF8Dcd2D32324c1545f62fB4aD0862',\n    Bundler: '0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c',\n    DN404Factory: '0x37A9Fa204a4d3A429FDED7e3469ab076C854Bc9d',\n    DopplerCreateXDeployer: '0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83',\n    DopplerDeployer: '0x4389AD34938B14F25cff7ED983c53f5a42A2573f',\n    DopplerERC20V1: '0x3Be8B97Fd0e713B5aBE0649Fa830223B6B4BC599',\n    DopplerERC20V1Factory: '0x1B37D3a72082029c44B35B604Ea473617580b69a',\n    DopplerHookInitializer: '0xAa7f809BB3752f715fA2e418230667C382A56544',\n    DopplerHookMigrator: '0x7BF319d8e969f7596B1Bc171Da9ce322f67Ae0c4',\n    DopplerLensQuoter: '0xf4c22465532f64777FfcD7770831AEca38F35c04',\n    GovernanceFactory: '0xDeb0447DAE3EB177c4dbA8bBCCCa25c8F273B7ef',\n    LaunchpadGovernanceFactory: '0xdb036746D65DD52126b1915f1AdF555e6C5237Cf',\n    LockableUniswapV3Initializer: '0xde8886A0019Ea060B8378Ee37b8A23b8117F29A3',\n    NoOpGovernanceFactory: '0x85f37f74Ef2478A770318bc810177a9835911aD7',\n    NoOpMigrator: '0xba2F330EDb16cD8056f5988d8CE19BbC63475A0e',\n    Quoter: '0xc9Be59b344Ec66547A4C697aa374e959D59b0567',\n    RehypeDopplerHookInitializer: '0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215',\n    RehypeDopplerHookMigrator: '0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B',\n    StreamableFeesLockerV2: '0xEd822828B6109d16a9D362b8146a35789E0064f5',\n    SwapRestrictorDopplerHook: '0xC16c826F75338A5Ea626f94f8992191B4ce5abA2',\n    TimelockFactory: '0x6076fdDFCaC0dD980e0350dfF5239feC3f86C578',\n    TopUpDistributor: '0x46adee7595d48b1Ec53090e9bc78e1E69Fa0eF06',\n    UniswapV2Locker: '0x63f6Efe03F25A8C6650b38d05C5a454051d642a5',\n    UniswapV2MigratorSplit: '0xB05046cEa797c993FB5b583098B1c4682e9Da333',\n    UniswapV4Initializer: '0x6cce158B6D1747617fc218592B4D60B239B957ea',\n  },\n  '84532': {\n    Airlock: '0x3411306Ce66c9469BFF1535BA955503c4Bde1C6e',\n    AirlockMultisigTestnet: '0x0abCf819FD57C9f0141628410fFC273405E44426',\n    Bundler: '0xDdDDDd67579B73fDdFf301DB92Fd4A01afD4613a',\n    DN404Factory: '0x98b0Aa2e0f134dbB3eb157b5646D387E6D55243a',\n    DopplerCreateXDeployer: '0x0000000000f13Ab5b685F03A412A26719aB6bE60',\n    DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n    DopplerERC20V1: '0xDB7B520bb5C3a2C5d4871198081911359f93be87',\n    DopplerERC20V1Factory: '0x89C261C05B5F9b6BcBA07C199b8DeE7cFaD45292',\n    DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n    DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n    DopplerLensQuoter: '0x4a8d81Db741248a36D9eb3bc6eF648Bf798B47a7',\n    GovernanceFactory: '0x9dBFaaDC8c0cB2c34bA698DD9426555336992e20',\n    LaunchpadGovernanceFactory: '0x0902e7C7207df8ed6303Aef4382bcab181b5fBFA',\n    LockableUniswapV3Initializer: '0x16AdA5Be50C3c2D94Af5fEae6b539C40A78Ad53c',\n    NoOpGovernanceFactory: '0x7bD798fafC99A3b17E261F8308A8C11B56935ea1',\n    NoOpMigrator: '0xF11066abbd329ac4bBA39455340539322C222eb0',\n    Quoter: '0xc20347a97646ed6e2B45DBfEcE372f68d928ec0a',\n    RehypeDopplerHookInitializer: '0xAdB90eF4dc001CFB81ecADEd2CDbda7D18487606',\n    RehypeDopplerHookMigrator: '0x5E2A91F8eBE288e0AA76a0C1A47877Ded801e90d',\n    StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n    TimelockFactory: '0x80F42ECCc91177D39E20f1A88A54D231c1b086a2',\n    TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n    UniswapV2Locker: '0x06731e30df4B0209ED19C39Ba8eD253e17b0E495',\n    UniswapV2MigratorSplit: '0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3',\n    UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n  },\n} as const;\n","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;\nexport const MAX_UINT64 = (1n << 64n) - 1n;\nexport const MAX_UINT128 = (1n << 128n) - 1n;\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;\nexport const MIN_BUNDLER_VESTING_DURATION = BigInt(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// Opening Auction (Phase 1 lifecycle) default parameters\n// Defaults mirror current opening-auction test/reference config in doppler.\nexport const OPENING_AUCTION_BPS = 10_000;\nexport const DEFAULT_OPENING_AUCTION_DURATION = SECONDS_PER_DAY; // 1 day\nexport const DEFAULT_OPENING_AUCTION_MIN_ACCEPTABLE_TICK_TOKEN0 = -34_020;\nexport const DEFAULT_OPENING_AUCTION_MIN_ACCEPTABLE_TICK_TOKEN1 = -34_020;\nexport const DEFAULT_OPENING_AUCTION_INCENTIVE_SHARE_BPS = 1000; // 10%\nexport const DEFAULT_OPENING_AUCTION_FEE = 3000; // 0.3%\nexport const DEFAULT_OPENING_AUCTION_MIN_LIQUIDITY = 10n ** 15n;\nexport const DEFAULT_OPENING_AUCTION_SHARE_TO_AUCTION_BPS = OPENING_AUCTION_BPS;\n\n// Doppler handoff defaults for opening-auction transitions\nexport const DEFAULT_OPENING_DOPPLER_DURATION = DEFAULT_AUCTION_DURATION; // 7 days\nexport const DEFAULT_OPENING_DOPPLER_EPOCH_LENGTH = DEFAULT_EPOCH_LENGTH; // 12 hours\nexport const DEFAULT_OPENING_DOPPLER_NUM_PD_SLUGS = DEFAULT_PD_SLUGS;\nexport const DEFAULT_OPENING_DOPPLER_FEE = FEE_TIERS.HIGH; // 1%\nexport const DEFAULT_OPENING_DOPPLER_TICK_SPACING = DOPPLER_MAX_TICK_SPACING;\n\n// V4 Multicurve Default Tick Ranges\n// Based on market cap tiers: LOW ($0 -> $3M), MEDIUM ($1k -> $40M), HIGH ($100k -> $1B)\n// Calculated for 1B token supply, $4500 numeraire (e.g., WETH on Base).\n// The zero-start low tier uses the lowest usable tick rounded to 100 tick spacing.\nexport const DEFAULT_MULTICURVE_LOWER_TICKS = [\n  -887_200, -222_200, -176_200,\n] as const;\nexport const DEFAULT_MULTICURVE_UPPER_TICKS = [\n  -142_200, -116_300, -84_100,\n] as const;\nexport const DEFAULT_MULTICURVE_NUM_POSITIONS = [11, 11, 11] as const;\nexport const DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES = [\n  parseEther('0.5'), // 50% for LOW tier\n  parseEther('0.25'), // 25% for MEDIUM tier\n  parseEther('0.24'), // 24% 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 Hook Flags for OpeningAuction\nexport const OPENING_AUCTION_FLAGS = BigInt(\n  (1 << 13) | // BEFORE_INITIALIZE_FLAG\n    (1 << 12) | // AFTER_INITIALIZE_FLAG\n    (1 << 11) | // BEFORE_ADD_LIQUIDITY_FLAG\n    (1 << 10) | // BEFORE_REMOVE_LIQUIDITY_FLAG\n    (1 << 9) | // AFTER_ADD_LIQUIDITY_FLAG\n    (1 << 8) | // AFTER_REMOVE_LIQUIDITY_FLAG\n    (1 << 7) | // BEFORE_SWAP_FLAG\n    (1 << 5), // BEFORE_DONATE_FLAG\n);\n\n// Opening Auction phase constants (matches on-chain AuctionPhase enum)\nexport const OPENING_AUCTION_PHASE_NOT_STARTED = 0;\nexport const OPENING_AUCTION_PHASE_ACTIVE = 1;\nexport const OPENING_AUCTION_PHASE_CLOSED = 2;\nexport const OPENING_AUCTION_PHASE_SETTLED = 3;\n\n// Opening Auction status constants (matches on-chain OpeningAuctionStatus enum)\nexport const OPENING_AUCTION_STATUS_UNINITIALIZED = 0;\nexport const OPENING_AUCTION_STATUS_ACTIVE = 1;\nexport const OPENING_AUCTION_STATUS_DOPPLER_ACTIVE = 2;\nexport const OPENING_AUCTION_STATUS_EXITED = 3;\n\n// Int24 bounds (Uniswap V4 tick type)\nexport const INT24_MIN = -8_388_608;\nexport const INT24_MAX = 8_388_607;\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","import { Address } from 'viem';\nimport { GENERATED_DOPPLER_DEPLOYMENTS } from './deployments.generated';\nimport { ZERO_ADDRESS } from './constants';\n\n// Chain IDs\nexport const CHAIN_IDS = {\n  MAINNET: 1,\n  ETH_SEPOLIA: 11155111,\n  ARBITRUM: 42161,\n  BASE: 8453,\n  BASE_SEPOLIA: 84532,\n  INK: 57073,\n  ROBINHOOD: 4663,\n  UNICHAIN: 130,\n  UNICHAIN_SEPOLIA: 1301,\n  MONAD_TESTNET: 10143,\n  MONAD_MAINNET: 143,\n} as const;\n\nexport type SupportedChainId = (typeof CHAIN_IDS)[keyof typeof CHAIN_IDS];\n\n// Human-friendly chain key type (e.g., 'BASE', 'UNICHAIN')\nexport type SupportedChainKey = keyof typeof CHAIN_IDS;\n\n// Contract addresses per chain\nexport interface ChainAddresses {\n  // Core contracts\n  airlock: Address;\n  tokenFactory: Address;\n  derc20V2Factory?: Address;\n  derc20V2Implementation?: Address;\n  dopplerERC20V1Factory?: Address;\n  dopplerERC20V1Implementation?: Address;\n\n  // Static auction contracts (V3)\n  v3Initializer: Address;\n  v3Quoter: Address;\n  lockableV3Initializer?: Address;\n\n  // Dynamic auction contracts (V4)\n  v4Initializer: Address;\n  // Multicurve initializer (V4) — optional per chain\n  v4MulticurveInitializer?: Address;\n  v4ScheduledMulticurveInitializer?: Address;\n  v4DecayMulticurveInitializer?: Address;\n  openingAuctionInitializer?: Address;\n  openingAuctionPositionManager?: Address;\n\n  // DopplerHook system (for RehypeDopplerHook support)\n  dopplerHookInitializer?: Address;\n  rehypeDopplerHookInitializer?: Address;\n  /**\n   * @deprecated Use rehypeDopplerHookInitializer instead.\n   */\n  rehypeDopplerHook?: Address;\n  dopplerLens: Address;\n  dopplerDeployer: Address;\n  poolManager: Address;\n\n  // Doppler404 contracts\n  doppler404Factory?: Address;\n\n  // Migration contracts\n  v2Migrator: Address;\n  v2MigratorSplit?: Address;\n  v4Migrator: Address;\n  v4MigratorSplit?: Address;\n  dopplerHookMigrator?: Address;\n  rehypeDopplerHookMigrator?: Address;\n  v4MigratorHook?: Address;\n  noOpMigrator?: Address;\n\n  // Governance contracts\n  governanceFactory: Address;\n  noOpGovernanceFactory?: Address;\n  launchpadGovernanceFactory?: Address;\n  streamableFeesLocker?: Address;\n  streamableFeesLockerV2?: Address;\n  topUpDistributor?: Address;\n\n  // Router contracts\n  universalRouter: Address;\n  univ2Router02?: Address;\n  permit2: Address;\n\n  // Other contracts\n  bundler?: Address;\n\n  // Uniswap contracts\n  weth: Address;\n  uniswapV2Factory?: Address;\n  uniswapV3Factory?: Address;\n  uniswapV4Quoter: Address;\n}\n\nfunction getGeneratedAddress(\n  chainId: SupportedChainId,\n  key: string,\n): Address | undefined {\n  const deployments = GENERATED_DOPPLER_DEPLOYMENTS[\n    chainId as unknown as keyof typeof GENERATED_DOPPLER_DEPLOYMENTS\n  ] as Record<string, string> | undefined;\n  return deployments?.[key] as Address | undefined;\n}\n\nfunction getRehypeDopplerHookInitializerAddress(\n  chainId: SupportedChainId,\n): Address | undefined {\n  return (\n    getGeneratedAddress(chainId, 'RehypeDopplerHookInitializer') ??\n    getGeneratedAddress(chainId, 'RehypeDopplerHook')\n  );\n}\n\nexport const ADDRESSES: Record<SupportedChainId, ChainAddresses> = {\n  [CHAIN_IDS.MAINNET]: {\n    airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .Airlock as Address,\n    tokenFactory: '0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e' as Address,\n    derc20V2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n    derc20V2Implementation: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n    dopplerERC20V1Factory: getGeneratedAddress(\n      CHAIN_IDS.MAINNET,\n      'DopplerERC20V1Factory',\n    ),\n    dopplerERC20V1Implementation: getGeneratedAddress(\n      CHAIN_IDS.MAINNET,\n      'DopplerERC20V1',\n    ),\n    v3Initializer: ZERO_ADDRESS,\n    v3Quoter: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e' as Address,\n    lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .LockableUniswapV3Initializer as Address,\n    v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .UniswapV4Initializer as Address,\n    v4ScheduledMulticurveInitializer:\n      '0xF84378C9F39e0FF267f3101c88773359c5393876' as Address,\n    dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .DopplerHookInitializer as Address,\n    rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.MAINNET,\n    ),\n    rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.MAINNET,\n    ),\n    dopplerLens: ZERO_ADDRESS,\n    dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .DopplerDeployer as Address,\n    poolManager: '0x000000000004444c5dc75cB358380D2e3dE08A90' as Address,\n    v2Migrator: '0x765875bff87614cE0581ee73B9fa663B71F3DfF2' as Address,\n    v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .UniswapV2MigratorSplit as Address,\n    v4Migrator: '0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5' as Address,\n    v4MigratorSplit: '0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732' as Address,\n    v4MigratorHook: '0x4053D4fa966cbdCC20Ec62070aC8814De8bEE500' as Address,\n    dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .DopplerHookMigrator as Address,\n    rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .RehypeDopplerHookMigrator as Address,\n    noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .NoOpMigrator as Address,\n    governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .GovernanceFactory as Address,\n    noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .NoOpGovernanceFactory as Address,\n    launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .LaunchpadGovernanceFactory as Address,\n    streamableFeesLocker:\n      '0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6' as Address,\n    streamableFeesLockerV2: getGeneratedAddress(\n      CHAIN_IDS.MAINNET,\n      'StreamableFeesLockerV2',\n    ),\n    topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .TopUpDistributor as Address,\n    universalRouter: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n      .Bundler as Address,\n    weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' as Address,\n    univ2Router02: '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' as Address,\n    uniswapV2Factory: '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f' as Address,\n    uniswapV3Factory: '0x1F98431c8aD98523631AE4a59f267346ea31F984' as Address,\n    uniswapV4Quoter: '0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203' as Address,\n  },\n  [CHAIN_IDS.ETH_SEPOLIA]: {\n    airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA' as Address,\n    tokenFactory: '0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e' as Address,\n    derc20V2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n    derc20V2Implementation: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n    v3Initializer: ZERO_ADDRESS,\n    v3Quoter: ZERO_ADDRESS,\n    v4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad' as Address,\n    v4ScheduledMulticurveInitializer:\n      '0xF84378C9F39e0FF267f3101c88773359c5393876' as Address,\n    dopplerHookInitializer:\n      '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544' as Address,\n    rehypeDopplerHookInitializer: '0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123',\n    rehypeDopplerHook: '0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123',\n    dopplerLens: ZERO_ADDRESS,\n    dopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421' as Address,\n    poolManager: '0xE03A1074c86CFeDd5C142C4F04F1a1536e203543' as Address,\n    v2Migrator: '0x765875bff87614cE0581ee73B9fa663B71F3DfF2' as Address,\n    v4Migrator: '0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5' as Address,\n    dopplerHookMigrator:\n      '0x1E40b0875DDa35f41E15cFB475403859B8c860c4' as Address,\n    rehypeDopplerHookMigrator:\n      '0xea95DfdF69B90c65C827070852F7039D6aF6Dd7b' as Address,\n    noOpMigrator: '0x233A71A7bB928b1357A1Ebf454298320989Ca5B5' as Address,\n    governanceFactory: ZERO_ADDRESS,\n    noOpGovernanceFactory:\n      '0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638' as Address,\n    streamableFeesLocker:\n      '0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6' as Address,\n    universalRouter: '0x3A9D48AB9751398BbFa63ad67599Bb04e4BdF98b' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14' as Address,\n    uniswapV4Quoter: '0x61b3f2011a92d183c7dbadbda940a7555ccf9227' as Address,\n  },\n  [CHAIN_IDS.ARBITRUM]: {\n    airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .Airlock as Address,\n    tokenFactory: ZERO_ADDRESS,\n    dopplerERC20V1Factory: getGeneratedAddress(\n      CHAIN_IDS.ARBITRUM,\n      'DopplerERC20V1Factory',\n    ),\n    dopplerERC20V1Implementation: getGeneratedAddress(\n      CHAIN_IDS.ARBITRUM,\n      'DopplerERC20V1',\n    ),\n    doppler404Factory: getGeneratedAddress(CHAIN_IDS.ARBITRUM, 'DN404Factory'),\n    v3Initializer: ZERO_ADDRESS,\n    v3Quoter: '0x61fFE014bA17989E743c5F6cB21bF9697530B21e' as Address,\n    lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .LockableUniswapV3Initializer as Address,\n    v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .UniswapV4Initializer as Address,\n    dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .DopplerHookInitializer as Address,\n    rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.ARBITRUM,\n    ),\n    rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.ARBITRUM,\n    ),\n    dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .DopplerLensQuoter as Address,\n    dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .DopplerDeployer as Address,\n    poolManager: '0x360E68faCcca8cA495c1B759Fd9EEe466db9FB32' as Address,\n    v2Migrator: ZERO_ADDRESS,\n    v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .UniswapV2MigratorSplit as Address,\n    v4Migrator: ZERO_ADDRESS,\n    dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .DopplerHookMigrator as Address,\n    rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .RehypeDopplerHookMigrator as Address,\n    noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .NoOpMigrator as Address,\n    governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .GovernanceFactory as Address,\n    noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .NoOpGovernanceFactory as Address,\n    launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.ARBITRUM\n    ].LaunchpadGovernanceFactory as Address,\n    streamableFeesLocker: ZERO_ADDRESS,\n    streamableFeesLockerV2: getGeneratedAddress(\n      CHAIN_IDS.ARBITRUM,\n      'StreamableFeesLockerV2',\n    ),\n    topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .TopUpDistributor as Address,\n    universalRouter: '0xA51afAFe0263b40EdaEf0Df8781eA9aa03E381a3' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM]\n      .Bundler as Address,\n    weth: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1' as Address,\n    uniswapV2Factory: '0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9' as Address,\n    uniswapV3Factory: '0x1F98431c8aD98523631AE4a59f267346ea31F984' as Address,\n    uniswapV4Quoter: '0x3972C00f7ed4885e145823eb7C655375d275A1C5' as Address,\n  },\n  [CHAIN_IDS.BASE]: {\n    airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].Airlock as Address,\n    tokenFactory: '0xf0B5141dD9096254B2ca624dff26024f46087229' as Address,\n    derc20V2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n    derc20V2Implementation: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n    dopplerERC20V1Factory: getGeneratedAddress(\n      CHAIN_IDS.BASE,\n      'DopplerERC20V1Factory',\n    ),\n    dopplerERC20V1Implementation: getGeneratedAddress(\n      CHAIN_IDS.BASE,\n      'DopplerERC20V1',\n    ),\n    doppler404Factory: getGeneratedAddress(CHAIN_IDS.BASE, 'DN404Factory'),\n    v3Initializer: '0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5' as Address,\n    v3Quoter: '0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a' as Address,\n    lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .LockableUniswapV3Initializer as Address,\n    v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .UniswapV4Initializer as Address,\n    v4MulticurveInitializer:\n      '0x65dE470Da664A5be139A5D812bE5FDa0d76CC951' as Address, // From Doppler multicurve deployments (Base mainnet)\n    v4ScheduledMulticurveInitializer:\n      '0xA36715dA46Ddf4A769f3290f49AF58bF8132ED8E' as Address, // From Doppler scheduled multicurve deployments (Base mainnet)\n    v4DecayMulticurveInitializer:\n      '0xD59cE43E53D69F190E15d9822Fb4540dCcc91178' as Address, // From Doppler decay multicurve deployments (Base mainnet)\n    // Opening auction slots reserved for phase-1 lifecycle support (not deployed on Base yet)\n    openingAuctionInitializer: ZERO_ADDRESS,\n    openingAuctionPositionManager: ZERO_ADDRESS,\n    dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .DopplerLensQuoter as Address,\n    dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .DopplerDeployer as Address,\n    poolManager: '0x498581ff718922c3f8e6a244956af099b2652b2b' as Address,\n    rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.BASE,\n    ),\n    rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(CHAIN_IDS.BASE),\n    dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .DopplerHookInitializer as Address,\n    v2Migrator: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731' as Address,\n    v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .UniswapV2MigratorSplit as Address,\n    v4Migrator: '0xd3B4cF7FD24381e90A4F012fC6c5976b87B9B3cE' as Address,\n    v4MigratorSplit: '0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732' as Address,\n    v4MigratorHook: '0xD6FECFF347c6203A41874e8D77dE669B54e7A500' as Address,\n    dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .DopplerHookMigrator as Address,\n    rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .RehypeDopplerHookMigrator as Address,\n    noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .NoOpMigrator as Address,\n    governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .GovernanceFactory as Address,\n    noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .NoOpGovernanceFactory as Address,\n    launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .LaunchpadGovernanceFactory as Address,\n    streamableFeesLocker:\n      '0x0A00775D71a42cd33D62780003035e7F5b47bD3A' as Address,\n    streamableFeesLockerV2: getGeneratedAddress(\n      CHAIN_IDS.BASE,\n      'StreamableFeesLockerV2',\n    ),\n    topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n      .TopUpDistributor as Address,\n    universalRouter: '0x6ff5693b99212da76ad316178a184ab56d299b43' as Address,\n    univ2Router02: '0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24' as Address,\n    uniswapV2Factory: '0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].Bundler as Address,\n    weth: '0x4200000000000000000000000000000000000006' as Address,\n    uniswapV3Factory: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD' as Address,\n    uniswapV4Quoter: '0x0d5e0f971ed27fbff6c2837bf31316121532048d' as Address,\n  },\n  [CHAIN_IDS.BASE_SEPOLIA]: {\n    airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .Airlock as Address,\n    tokenFactory: '0xf0B5141dD9096254B2ca624dff26024f46087229' as Address,\n    derc20V2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n    derc20V2Implementation: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n    dopplerERC20V1Factory: getGeneratedAddress(\n      CHAIN_IDS.BASE_SEPOLIA,\n      'DopplerERC20V1Factory',\n    ),\n    dopplerERC20V1Implementation: getGeneratedAddress(\n      CHAIN_IDS.BASE_SEPOLIA,\n      'DopplerERC20V1',\n    ),\n    doppler404Factory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .DN404Factory as Address,\n    v3Initializer: '0x4C3062B9ccFdbCB10353F57C1B59a29d4c5CFa47' as Address,\n    v3Quoter: '0xC5290058841028F1614F3A6F0F5816cAd0df5E27' as Address,\n    lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .LockableUniswapV3Initializer as Address,\n    v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .UniswapV4Initializer as Address,\n    v4MulticurveInitializer:\n      '0x1718405E58c61425cDc0083262bC9f72198F5232' as Address,\n    v4ScheduledMulticurveInitializer:\n      '0xF84378C9F39e0FF267f3101c88773359c5393876' as Address, // From Doppler scheduled multicurve deployments (Base Sepolia)\n    v4DecayMulticurveInitializer:\n      '0xD59cE43E53D69F190E15d9822Fb4540dCcc91178' as Address, // From Doppler decay multicurve deployments (Base Sepolia)\n    // Opening Auction contracts (deployed Feb 2025)\n    openingAuctionInitializer:\n      '0x3dCd35945Dc86a9FaA80846B06CB4676961d0AEa' as Address,\n    openingAuctionPositionManager:\n      '0x957CA7472ced1C1B3608152F83E0E69F975a37a9' as Address,\n    dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.BASE_SEPOLIA\n    ].DopplerHookInitializer as Address,\n    rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.BASE_SEPOLIA,\n    ),\n    rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.BASE_SEPOLIA,\n    ),\n    dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .DopplerLensQuoter as Address,\n    dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .DopplerDeployer as Address,\n    poolManager: '0x05E73354cFDd6745C338b50BcFDfA3Aa6fA03408' as Address,\n    v2Migrator: '0x04a898f3722c38F9Def707bD17DC78920EFA977C' as Address,\n    v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .UniswapV2MigratorSplit as Address,\n    v4Migrator: '0xEEe0eCCb54398ce371CAACBCEf076d3Ed597DDb3' as Address,\n    v4MigratorSplit: '0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732' as Address,\n    dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .DopplerHookMigrator as Address,\n    rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.BASE_SEPOLIA\n    ].RehypeDopplerHookMigrator as Address,\n    v4MigratorHook: '0x127cAAAd598Ffa97577940b0a5c3b6150019E500' as Address,\n    noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .NoOpMigrator as Address,\n    governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .GovernanceFactory as Address,\n    noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .NoOpGovernanceFactory as Address,\n    launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.BASE_SEPOLIA\n    ].LaunchpadGovernanceFactory as Address,\n    streamableFeesLocker:\n      '0x3345E557c5C0b474bE1eb4693264008B8562Aa9c' as Address,\n    streamableFeesLockerV2: getGeneratedAddress(\n      CHAIN_IDS.BASE_SEPOLIA,\n      'StreamableFeesLockerV2',\n    ),\n    topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .TopUpDistributor as Address,\n    universalRouter: '0x492E6456D9528771018DeB9E87ef7750EF184104' as Address,\n    univ2Router02: '0x1689E7B1F10000AE47eBfE339a4f69dECd19F602' as Address,\n    uniswapV2Factory: '0x7Ae58f10f7849cA6F5fB71b7f45CB416c9204b1e' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n      .Bundler as Address,\n    weth: '0x4200000000000000000000000000000000000006' as Address,\n    uniswapV3Factory: '0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24' as Address,\n    uniswapV4Quoter: '0x4A6513c898fe1B2d0E78d3b0e0A4a151589B1cBa' as Address,\n  },\n  [CHAIN_IDS.INK]: {\n    airlock: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12' as Address,\n    tokenFactory: '0xFAafdE6a5b658684cC5eb0C5c2c755B00A246F45' as Address,\n    derc20V2Factory: getGeneratedAddress(\n      CHAIN_IDS.INK,\n      'CloneDERC20VotesV2Factory',\n    ),\n    derc20V2Implementation: getGeneratedAddress(\n      CHAIN_IDS.INK,\n      'CloneDERC20VotesV2',\n    ),\n    v3Initializer: '0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5' as Address,\n    v3Quoter: '0x96b572D2d880cf2Fa2563651BD23ADE6f5516652' as Address,\n    v4Initializer: '0xC99b485499f78995C6F1640dbB1413c57f8BA684' as Address,\n    dopplerLens: '0x3972c00f7ed4885e145823eb7c655375d275a1c5' as Address,\n    dopplerDeployer: '0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B' as Address,\n    poolManager: '0x360e68faccca8ca495c1b759fd9eee466db9fb32' as Address,\n    v2Migrator: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731' as Address,\n    v4Migrator: ZERO_ADDRESS,\n    governanceFactory: '0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9' as Address,\n    noOpGovernanceFactory: ZERO_ADDRESS, // Not yet deployed\n    streamableFeesLocker: ZERO_ADDRESS, // Not yet deployed\n    universalRouter: '0x112908dac86e20e7241b0927479ea3bf935d1fa0' as Address,\n    univ2Router02: '0xB3FB126ACDd5AdCA2f50Ac644a7a2303745f18b4' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    weth: '0x4200000000000000000000000000000000000006' as Address,\n    uniswapV4Quoter: '0x3972c00f7ed4885e145823eb7c655375d275a1c5' as Address,\n  },\n  [CHAIN_IDS.ROBINHOOD]: {\n    airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .Airlock as Address,\n    tokenFactory: ZERO_ADDRESS,\n    dopplerERC20V1Factory: getGeneratedAddress(\n      CHAIN_IDS.ROBINHOOD,\n      'DopplerERC20V1Factory',\n    ),\n    dopplerERC20V1Implementation: getGeneratedAddress(\n      CHAIN_IDS.ROBINHOOD,\n      'DopplerERC20V1',\n    ),\n    doppler404Factory: getGeneratedAddress(CHAIN_IDS.ROBINHOOD, 'DN404Factory'),\n    v3Initializer: ZERO_ADDRESS,\n    v3Quoter: '0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7' as Address,\n    lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .LockableUniswapV3Initializer as Address,\n    v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .UniswapV4Initializer as Address,\n    dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .DopplerHookInitializer as Address,\n    rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.ROBINHOOD,\n    ),\n    rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.ROBINHOOD,\n    ),\n    dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .DopplerLensQuoter as Address,\n    dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .DopplerDeployer as Address,\n    poolManager: '0x8366a39cc670b4001a1121b8f6a443a643e40951' as Address,\n    v2Migrator: ZERO_ADDRESS,\n    v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .UniswapV2MigratorSplit as Address,\n    v4Migrator: ZERO_ADDRESS,\n    dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .DopplerHookMigrator as Address,\n    rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.ROBINHOOD\n    ].RehypeDopplerHookMigrator as Address,\n    noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .NoOpMigrator as Address,\n    governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .GovernanceFactory as Address,\n    noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .NoOpGovernanceFactory as Address,\n    launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.ROBINHOOD\n    ].LaunchpadGovernanceFactory as Address,\n    streamableFeesLocker: ZERO_ADDRESS,\n    streamableFeesLockerV2: getGeneratedAddress(\n      CHAIN_IDS.ROBINHOOD,\n      'StreamableFeesLockerV2',\n    ),\n    topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .TopUpDistributor as Address,\n    universalRouter: '0x8876789976decbfcbbbe364623c63652db8c0904' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ROBINHOOD]\n      .Bundler as Address,\n    weth: '0x0bd7d308f8e1639fab988df18a8011f41eacad73' as Address,\n    uniswapV2Factory: '0x8bceaa40b9acdfaedf85adf4ff01f5ad6517937f' as Address,\n    uniswapV3Factory: '0x1f7d7550b1b028f7571e69a784071f0205fd2efa' as Address,\n    uniswapV4Quoter: '0x8dc178efb8111bb0973dd9d722ebeff267c98f94' as Address,\n  },\n  [CHAIN_IDS.UNICHAIN]: {\n    airlock: '0x77EbfBAE15AD200758E9E2E61597c0B07d731254' as Address,\n    tokenFactory: '0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3' as Address,\n    derc20V2Factory: getGeneratedAddress(\n      CHAIN_IDS.UNICHAIN,\n      'CloneDERC20VotesV2Factory',\n    ),\n    derc20V2Implementation: getGeneratedAddress(\n      CHAIN_IDS.UNICHAIN,\n      'CloneDERC20VotesV2',\n    ),\n    v3Initializer: '0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec' as Address,\n    v3Quoter: '0x385A5cf5F83e99f7BB2852b6A19C3538b9FA7658' as Address,\n    v4Initializer: '0x2F2BAcd46d3F5c9EE052Ab392b73711dB89129DB' as Address,\n    dopplerLens: '0x333e3c607b141b18ff6de9f258db6e77fe7491e0' as Address,\n    dopplerDeployer: '0x06FEFD02F0b6d9f57F52cfacFc113665Dfa20F0f' as Address,\n    poolManager: '0x1f98400000000000000000000000000000000004' as Address,\n    v2Migrator: '0xf6023127f6E937091D5B605680056A6D27524bad' as Address,\n    v4Migrator: '0x49F3fBB2dFF7f3d03B622e3b2a6d3F2E6fdB2a5A' as Address,\n    noOpMigrator: '0x917da361072ce968acD810BbfC9B64079426ebf0' as Address,\n    governanceFactory: '0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE' as Address,\n    noOpGovernanceFactory:\n      '0x3AD727ee0FBBb8Ee0920933FdB96F23fD56f1299' as Address,\n    streamableFeesLocker: ZERO_ADDRESS, // Not yet deployed\n    universalRouter: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3' as Address,\n    univ2Router02: '0x284f11109359a7e1306c3e447ef14d38400063ff' as Address,\n    uniswapV2Factory: '0x1f98400000000000000000000000000000000002' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    weth: '0x4200000000000000000000000000000000000006' as Address,\n    uniswapV4Quoter: '0x333e3c607b141b18ff6de9f258db6e77fe7491e0' as Address,\n  },\n  [CHAIN_IDS.UNICHAIN_SEPOLIA]: {\n    airlock: '0x651ab94B4777e2e4cdf96082d90C65bd947b73A4' as Address,\n    tokenFactory: '0x82Ac010C67f70BACf7655cd8948a4AD92A173CAC' as Address,\n    derc20V2Factory: getGeneratedAddress(\n      CHAIN_IDS.UNICHAIN_SEPOLIA,\n      'CloneDERC20VotesV2Factory',\n    ),\n    derc20V2Implementation: getGeneratedAddress(\n      CHAIN_IDS.UNICHAIN_SEPOLIA,\n      'CloneDERC20VotesV2',\n    ),\n    v3Initializer: '0x7Fb9a622186B4660A5988C223ebb9d3690dD5007' as Address,\n    v3Quoter: '0x6Dd37329A1A225a6Fca658265D460423DCafBF89' as Address,\n    v4Initializer: '0x992375478626E67F4e639d3298EbCAaE51C3dF0b' as Address,\n    dopplerLens: '0x56dcd40a3f2d466f48e7f48bdbe5cc9b92ae4472' as Address,\n    dopplerDeployer: '0x2f2bacd46d3f5c9ee052ab392b73711db89129db' as Address,\n    poolManager: '0x00B036B58a818B1BC34d502D3fE730Db729e62AC' as Address,\n    v2Migrator: '0x620e3fec244e913d73f2163623b62d02DB69638B' as Address,\n    v4Migrator: '0xb6D69eAA98E657bEEFF7ca4452768e6f707aa6b1' as Address,\n    noOpMigrator: '0x193F48A45B6025dDeD10bc4BaeEF65c833696387' as Address,\n    governanceFactory: '0x1E4332EEfAE9e4967C2D186f7b2d439D778e81cC' as Address,\n    noOpGovernanceFactory:\n      '0x7E5D336A6E9e453c9f02E5102CC039E015Fd8fb8' as Address,\n    streamableFeesLocker: ZERO_ADDRESS, // Not yet deployed\n    universalRouter: '0xf70536B3bcC1bD1a972dc186A2cf84cC6da6Be5D' as Address,\n    univ2Router02: '0x284f11109359a7e1306c3e447ef14d38400063ff' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    weth: '0x4200000000000000000000000000000000000006' as Address,\n    uniswapV4Quoter: '0x56dcd40a3f2d466f48e7f48bdbe5cc9b92ae4472' as Address,\n  },\n  [CHAIN_IDS.MONAD_TESTNET]: {\n    airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA' as Address,\n    tokenFactory: '0xf0B5141dD9096254B2ca624dff26024f46087229' as Address,\n    derc20V2Factory: getGeneratedAddress(\n      CHAIN_IDS.MONAD_TESTNET,\n      'CloneDERC20VotesV2Factory',\n    ),\n    derc20V2Implementation: getGeneratedAddress(\n      CHAIN_IDS.MONAD_TESTNET,\n      'CloneDERC20VotesV2',\n    ),\n    v3Initializer: '0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec' as Address,\n    v3Quoter: ZERO_ADDRESS,\n    v4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad' as Address,\n    dopplerLens: '0x2F2BAcd46d3F5c9EE052Ab392b73711dB89129DB' as Address,\n    dopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421' as Address,\n    poolManager: '0xe93882f395B0b24180855c68Ab19B2d78573ceBc' as Address,\n    v2Migrator: '0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3' as Address,\n    v4Migrator: '0xBEd386a1Fc62B6598c9b8d2BF634471B6Fe75EB7' as Address,\n    noOpMigrator: '0x5CadB034267751a364dDD4d321C99E07A307f915' as Address,\n    governanceFactory: '0x014E1c0bd34f3B10546E554CB33B3293fECDD056' as Address,\n    noOpGovernanceFactory:\n      '0x094D926A969B3024ca46D2186BF13FD5CDBA9CE2' as Address,\n    streamableFeesLocker:\n      '0x91231cDdD8d6C86Df602070a3081478e074b97b7' as Address, // Not yet deployed\n    universalRouter: ZERO_ADDRESS,\n    univ2Router02: ZERO_ADDRESS,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    weth: ZERO_ADDRESS, // TODO: Get Monad Testnet weth\n    uniswapV4Quoter: ZERO_ADDRESS,\n  },\n  [CHAIN_IDS.MONAD_MAINNET]: {\n    airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .Airlock as Address,\n    tokenFactory: '0xf0B5141dD9096254B2ca624dff26024f46087229' as Address,\n    derc20V2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n    derc20V2Implementation: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n    dopplerERC20V1Factory: getGeneratedAddress(\n      CHAIN_IDS.MONAD_MAINNET,\n      'DopplerERC20V1Factory',\n    ),\n    dopplerERC20V1Implementation: getGeneratedAddress(\n      CHAIN_IDS.MONAD_MAINNET,\n      'DopplerERC20V1',\n    ),\n    v3Initializer: ZERO_ADDRESS,\n    v3Quoter: '0x661E93cca42AfacB172121EF892830cA3b70F08d' as Address,\n    lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.MONAD_MAINNET\n    ].LockableUniswapV3Initializer as Address,\n    v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .UniswapV4Initializer as Address,\n    dopplerLens: ZERO_ADDRESS,\n    dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .DopplerDeployer as Address,\n    poolManager: '0x188d586ddcf52439676ca21a244753fa19f9ea8e' as Address,\n    v2Migrator: '0x136191B46478cAB023cbC01a36160C4Aad81677a' as Address,\n    v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .UniswapV2MigratorSplit as Address,\n    v4Migrator: '0x44bf742e57cd8cF23ABbc8dab2c44e2a3228356E' as Address,\n    v4MigratorSplit: '0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732' as Address,\n    v4MigratorHook: '0x3E4c689BBf33b37106eBC13Db8aa5BF13a25e500' as Address,\n    noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .NoOpMigrator as Address,\n    governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .GovernanceFactory as Address,\n    noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.MONAD_MAINNET\n    ].NoOpGovernanceFactory as Address,\n    launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.MONAD_MAINNET\n    ].LaunchpadGovernanceFactory as Address,\n    topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .TopUpDistributor as Address,\n    v4ScheduledMulticurveInitializer:\n      '0xCe3099B2F07029b086E5e92a1573C5f5A3071783' as Address,\n    dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.MONAD_MAINNET\n    ].DopplerHookInitializer as Address,\n    rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.MONAD_MAINNET,\n    ),\n    rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(\n      CHAIN_IDS.MONAD_MAINNET,\n    ),\n    streamableFeesLocker:\n      '0x63f8C8F9beFaab2FaCD7Ece0b0242f78B920Ee90' as Address,\n    streamableFeesLockerV2: getGeneratedAddress(\n      CHAIN_IDS.MONAD_MAINNET,\n      'StreamableFeesLockerV2',\n    ),\n    universalRouter: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3' as Address,\n    univ2Router02: '0x4B2ab38DBF28D31D467aA8993f6c2585981D6804' as Address,\n    uniswapV2Factory: '0x182a927119d56008d921126764bf884221b10f59' as Address,\n    permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n    bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .Bundler as Address,\n    dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n      .DopplerHookMigrator as Address,\n    rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[\n      CHAIN_IDS.MONAD_MAINNET\n    ].RehypeDopplerHookMigrator as Address,\n    weth: '0x3bd359c1119da7da1d913d1c4d2b7c461115433a' as Address, // INFO: this is wmon, but we treat it as weth because mon is native\n    uniswapV4Quoter: '0xa222dd357a9076d1091ed6aa2e16c9742dd26891' as Address,\n  },\n};\n/**\n * Get addresses for a specific chain\n */\nexport function getAddresses(chainId: number): ChainAddresses {\n  const addresses = ADDRESSES[chainId as SupportedChainId];\n  if (!addresses) {\n    throw new Error(`Unsupported chain ID: ${chainId}`);\n  }\n  return addresses;\n}\n\n/**\n * List of supported chain IDs for easy iteration/validation\n */\nexport const SUPPORTED_CHAIN_IDS = Object.values(\n  CHAIN_IDS,\n) as SupportedChainId[];\n\n/**\n * Runtime/type guard for narrowing a number to SupportedChainId\n */\nexport function isSupportedChainId(id: number): id is SupportedChainId {\n  // Numeric object keys are coerced to strings at runtime; `in` is fine here\n  return id in ADDRESSES;\n}\n","/**\n * Tick math utilities for Uniswap V3/V4 price calculations\n *\n * These utilities help convert between ticks, sqrtPriceX96 values, and human-readable prices\n */\n\n// Constants\nexport const MIN_TICK = -887272;\nexport const MAX_TICK = 887272;\nexport const MIN_SQRT_RATIO = 4295128739n;\nexport const MAX_SQRT_RATIO =\n  1461446703485210103287273052203988822378723970342n;\nexport const Q96 = 2n ** 96n;\nexport const Q192 = Q96 * Q96;\n\n// Precision constant for price calculations (10^18 for high precision)\nconst PRICE_PRECISION = 10n ** 18n;\n\n/**\n * Integer square root using Newton's method (for BigInt)\n * @param n The number to take the square root of\n * @returns The floor of the square root\n */\nfunction bigIntSqrt(n: bigint): bigint {\n  if (n < 0n) throw new Error('Square root of negative number');\n  if (n === 0n) return 0n;\n  if (n === 1n) return 1n;\n\n  let x = n;\n  let y = (x + 1n) / 2n;\n\n  while (y < x) {\n    x = y;\n    y = (x + n / x) / 2n;\n  }\n\n  return x;\n}\n\n/**\n * Get the sqrt ratio at a given tick\n * @param tick The tick value\n * @returns The sqrt price as a Q64.96 fixed point number\n */\nexport function getSqrtRatioAtTick(tick: number): bigint {\n  if (tick < MIN_TICK || tick > MAX_TICK) {\n    throw new Error('Tick out of bounds');\n  }\n\n  const absTick = tick < 0 ? -tick : tick;\n\n  let ratio =\n    (absTick & 0x1) !== 0\n      ? 0xfffcb933bd6fad37aa2d162d1a594001n\n      : 0x100000000000000000000000000000000n;\n\n  if ((absTick & 0x2) !== 0)\n    ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;\n  if ((absTick & 0x4) !== 0)\n    ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;\n  if ((absTick & 0x8) !== 0)\n    ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;\n  if ((absTick & 0x10) !== 0)\n    ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;\n  if ((absTick & 0x20) !== 0)\n    ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;\n  if ((absTick & 0x40) !== 0)\n    ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;\n  if ((absTick & 0x80) !== 0)\n    ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;\n  if ((absTick & 0x100) !== 0)\n    ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;\n  if ((absTick & 0x200) !== 0)\n    ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;\n  if ((absTick & 0x400) !== 0)\n    ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;\n  if ((absTick & 0x800) !== 0)\n    ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;\n  if ((absTick & 0x1000) !== 0)\n    ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;\n  if ((absTick & 0x2000) !== 0)\n    ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;\n  if ((absTick & 0x4000) !== 0)\n    ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;\n  if ((absTick & 0x8000) !== 0)\n    ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;\n  if ((absTick & 0x10000) !== 0)\n    ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;\n  if ((absTick & 0x20000) !== 0)\n    ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;\n  if ((absTick & 0x40000) !== 0)\n    ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;\n  if ((absTick & 0x80000) !== 0)\n    ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;\n\n  if (tick > 0) ratio = (2n ** 256n - 1n) / ratio;\n\n  // Shift to get Q64.96\n  return ratio >> 32n;\n}\n\n/**\n * Get the tick at a given sqrt ratio\n * Based on Uniswap v3 TickMath.sol with corrected BigInt handling\n *\n * @param sqrtRatioX96 The sqrt price as a Q64.96 fixed point number\n * @returns The tick value\n */\nexport function getTickAtSqrtRatio(sqrtRatioX96: bigint): number {\n  if (sqrtRatioX96 < MIN_SQRT_RATIO || sqrtRatioX96 >= MAX_SQRT_RATIO) {\n    throw new Error('sqrt ratio out of bounds');\n  }\n\n  // Shift to Q128.128 format\n  const ratio = sqrtRatioX96 << 32n;\n\n  // Find MSB (most significant bit position)\n  let r = ratio;\n  let msb = 0n;\n\n  // Binary search for MSB\n  let f = r > 0xffffffffffffffffffffffffffffffffn ? 1n : 0n;\n  msb = msb | (f << 7n);\n  r = r >> (f * 128n);\n\n  f = r > 0xffffffffffffffffn ? 1n : 0n;\n  msb = msb | (f << 6n);\n  r = r >> (f * 64n);\n\n  f = r > 0xffffffffn ? 1n : 0n;\n  msb = msb | (f << 5n);\n  r = r >> (f * 32n);\n\n  f = r > 0xffffn ? 1n : 0n;\n  msb = msb | (f << 4n);\n  r = r >> (f * 16n);\n\n  f = r > 0xffn ? 1n : 0n;\n  msb = msb | (f << 3n);\n  r = r >> (f * 8n);\n\n  f = r > 0xfn ? 1n : 0n;\n  msb = msb | (f << 2n);\n  r = r >> (f * 4n);\n\n  f = r > 0x3n ? 1n : 0n;\n  msb = msb | (f << 1n);\n  r = r >> (f * 2n);\n\n  f = r > 0x1n ? 1n : 0n;\n  msb = msb | f;\n\n  // Calculate log2 in Q64.64 format\n  let log2 = (msb - 128n) << 64n;\n\n  // CRITICAL FIX: Shift ratio to normalize to [1, 2) range in Q127 format\n  // This is equivalent to Solidity's: r := shr(msb, shl(127, ratio))\n  // Which normalizes ratio so the MSB is at position 127\n  r = (ratio << 127n) >> msb;\n\n  // Now compute fractional bits of log2 through repeated squaring\n  // Each iteration computes one more bit of precision\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 63n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 62n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 61n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 60n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 59n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 58n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 57n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 56n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 55n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 54n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 53n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 52n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 51n);\n  r = r >> f;\n\n  r = (r * r) >> 127n;\n  f = r >> 128n;\n  log2 = log2 | (f << 50n);\n\n  // Convert log2 to log_sqrt(1.0001) = log2 * log_sqrt(1.0001) / log(2)\n  const log_sqrt10001 = log2 * 255738958999603826347141n;\n\n  // Calculate tick bounds with magic numbers for rounding\n  const tickLow = Number(\n    (log_sqrt10001 - 3402992956809132418596140100660247210n) >> 128n,\n  );\n  const tickHigh = Number(\n    (log_sqrt10001 + 291339464771989622907027621153398088495n) >> 128n,\n  );\n\n  // Return the correct tick by checking which one is valid\n  return tickLow === tickHigh\n    ? tickLow\n    : getSqrtRatioAtTick(tickHigh) <= sqrtRatioX96\n      ? tickHigh\n      : tickLow;\n}\n\n/**\n * Convert sqrtPriceX96 to a human-readable price\n * Uses BigInt arithmetic throughout to avoid precision loss with Q96\n *\n * @param sqrtPriceX96 The sqrt price as a Q64.96 fixed point number\n * @param decimals0 Decimals of token0\n * @param decimals1 Decimals of token1\n * @param token0IsBase Whether to return price in terms of token0 (true) or token1 (false)\n * @returns The price as a number\n */\nexport function sqrtPriceX96ToPrice(\n  sqrtPriceX96: bigint,\n  decimals0: number,\n  decimals1: number,\n  token0IsBase = true,\n): number {\n  // Calculate price using BigInt: price = (sqrtPriceX96)^2 / Q192 * 10^(decimals1 - decimals0)\n  // We scale by PRICE_PRECISION to maintain precision before converting to Number\n  const sqrtPriceSquared = sqrtPriceX96 * sqrtPriceX96;\n\n  // Apply decimal adjustment using BigInt\n  const decimalDiff = decimals1 - decimals0;\n  let adjustedPrice: bigint;\n\n  if (decimalDiff >= 0) {\n    // Multiply by 10^decimalDiff, scale by PRICE_PRECISION\n    const decimalMultiplier = 10n ** BigInt(decimalDiff);\n    adjustedPrice =\n      (sqrtPriceSquared * decimalMultiplier * PRICE_PRECISION) / Q192;\n  } else {\n    // Divide by 10^|decimalDiff|, scale by PRICE_PRECISION\n    const decimalDivisor = 10n ** BigInt(-decimalDiff);\n    adjustedPrice =\n      (sqrtPriceSquared * PRICE_PRECISION) / (Q192 * decimalDivisor);\n  }\n\n  // Convert to Number, accounting for precision scaling\n  const price = Number(adjustedPrice) / Number(PRICE_PRECISION);\n\n  return token0IsBase ? price : 1 / price;\n}\n\n/**\n * Convert a human-readable price to sqrtPriceX96\n * Uses BigInt arithmetic throughout to avoid precision loss with Q96\n *\n * @param price The price (token1/token0)\n * @param decimals0 Decimals of token0\n * @param decimals1 Decimals of token1\n * @returns The sqrt price as a Q64.96 fixed point number\n */\nexport function priceToSqrtPriceX96(\n  price: number,\n  decimals0: number,\n  decimals1: number,\n): bigint {\n  if (price <= 0) {\n    throw new Error('Price must be positive');\n  }\n\n  // We want: sqrtPriceX96 = sqrt(price / 10^(decimals1 - decimals0)) * Q96\n  //                       = sqrt(price * 10^(decimals0 - decimals1)) * Q96\n  //\n  // Strategy: Scale price to BigInt, compute sqrt in BigInt, then scale result\n  // Using PRICE_PRECISION^2 as scaling factor so sqrt gives us PRICE_PRECISION scaling\n\n  // Convert price to scaled BigInt\n  // price_scaled = price * 10^36\n  const priceScaled = BigInt(Math.floor(price * 1e18)) * PRICE_PRECISION;\n\n  // Apply decimal adjustment\n  const decimalDiff = decimals0 - decimals1;\n  let adjustedPriceScaled: bigint;\n\n  if (decimalDiff >= 0) {\n    const decimalMultiplier = 10n ** BigInt(decimalDiff);\n    adjustedPriceScaled = priceScaled * decimalMultiplier;\n  } else {\n    const decimalDivisor = 10n ** BigInt(-decimalDiff);\n    adjustedPriceScaled = priceScaled / decimalDivisor;\n  }\n\n  // Compute sqrt: sqrt(adjustedPriceScaled) has scale of 10^18\n  const sqrtPriceScaled = bigIntSqrt(adjustedPriceScaled);\n\n  // sqrtPriceX96 = sqrtPriceScaled * Q96 / PRICE_PRECISION\n  const sqrtPriceX96 = (sqrtPriceScaled * Q96) / PRICE_PRECISION;\n\n  // Clamp to valid range\n  if (sqrtPriceX96 < MIN_SQRT_RATIO) {\n    return MIN_SQRT_RATIO;\n  }\n  if (sqrtPriceX96 >= MAX_SQRT_RATIO) {\n    return MAX_SQRT_RATIO - 1n;\n  }\n\n  return sqrtPriceX96;\n}\n\n/**\n * Convert a tick to a human-readable price\n * @param tick The tick value\n * @param decimals0 Decimals of token0\n * @param decimals1 Decimals of token1\n * @param token0IsBase Whether to return price in terms of token0 (true) or token1 (false)\n * @returns The price as a number\n */\nexport function tickToPrice(\n  tick: number,\n  decimals0: number,\n  decimals1: number,\n  token0IsBase = true,\n): number {\n  const sqrtPriceX96 = getSqrtRatioAtTick(tick);\n  return sqrtPriceX96ToPrice(sqrtPriceX96, decimals0, decimals1, token0IsBase);\n}\n\n/**\n * Convert a human-readable price to a tick\n * @param price The price (token1/token0)\n * @param decimals0 Decimals of token0\n * @param decimals1 Decimals of token1\n * @returns The tick value\n */\nexport function priceToTick(\n  price: number,\n  decimals0: number,\n  decimals1: number,\n): number {\n  const sqrtPriceX96 = priceToSqrtPriceX96(price, decimals0, decimals1);\n  return getTickAtSqrtRatio(sqrtPriceX96);\n}\n\n/**\n * Get the nearest usable tick for a given tick spacing\n * @param tick The desired tick\n * @param tickSpacing The tick spacing of the pool\n * @returns The nearest valid tick\n */\nexport function getNearestUsableTick(\n  tick: number,\n  tickSpacing: number,\n): number {\n  const rounded = Math.round(tick / tickSpacing) * tickSpacing;\n  if (rounded < MIN_TICK) return MIN_TICK;\n  if (rounded > MAX_TICK) return MAX_TICK;\n  return rounded;\n}\n","/**\n * Price helper utilities for common token launch scenarios\n */\n\nimport { parseEther, formatEther } from 'viem';\nimport { priceToTick, tickToPrice, getNearestUsableTick } from './tickMath';\n\n/**\n * Calculate the tick range for a desired price range\n * @param minPrice Minimum price (ETH per token)\n * @param maxPrice Maximum price (ETH per token)\n * @param tickSpacing The tick spacing of the pool\n * @param wethDecimals Decimals of WETH (usually 18)\n * @param tokenDecimals Decimals of the token (usually 18)\n * @returns Object with startTick and endTick\n */\nexport function calculateTickRange(\n  minPrice: number,\n  maxPrice: number,\n  tickSpacing: number,\n  wethDecimals = 18,\n  tokenDecimals = 18,\n): { startTick: number; endTick: number } {\n  // For token/WETH pools, we need to invert the price\n  // because Uniswap orders tokens by address\n  const startTick = getNearestUsableTick(\n    priceToTick(1 / maxPrice, tokenDecimals, wethDecimals),\n    tickSpacing,\n  );\n\n  const endTick = getNearestUsableTick(\n    priceToTick(1 / minPrice, tokenDecimals, wethDecimals),\n    tickSpacing,\n  );\n\n  return { startTick, endTick };\n}\n\n/**\n * Calculate the number of tokens to sell based on desired raise\n * @param targetRaiseETH Target amount to raise in ETH\n * @param avgPricePerToken Average expected price per token in ETH\n * @returns Number of tokens to sell (as bigint)\n */\nexport function calculateTokensToSell(\n  targetRaiseETH: number,\n  avgPricePerToken: number,\n): bigint {\n  const tokensToSell = targetRaiseETH / avgPricePerToken;\n  return parseEther(tokensToSell.toFixed(18));\n}\n\n/**\n * Calculate gamma for dynamic auctions\n * @param startTick Starting tick\n * @param endTick Ending tick\n * @param duration Duration in seconds\n * @param epochLength Epoch length in seconds\n * @returns Gamma value\n */\nexport function calculateGamma(\n  startTick: number,\n  endTick: number,\n  duration: number,\n  epochLength: number,\n): number {\n  const totalEpochs = duration / epochLength;\n  const tickRange = Math.abs(endTick - startTick);\n  return Math.floor(tickRange / totalEpochs);\n}\n\n/**\n * Estimate the price at a specific epoch in a dynamic auction\n * @param startTick Starting tick\n * @param gamma Tick movement per epoch\n * @param currentEpoch Current epoch number\n * @param tokenDecimals Token decimals\n * @param wethDecimals WETH decimals\n * @param isIncreasing Whether price increases (true) or decreases (false) over time\n * @returns Estimated price in ETH per token\n */\nexport function estimatePriceAtEpoch(\n  startTick: number,\n  gamma: number,\n  currentEpoch: number,\n  tokenDecimals = 18,\n  wethDecimals = 18,\n  isIncreasing = true,\n): number {\n  const direction = isIncreasing ? 1 : -1;\n  const currentTick = startTick + currentEpoch * gamma * direction;\n\n  // Get price from tick (returns WETH/token)\n  const wethPerToken = tickToPrice(\n    currentTick,\n    tokenDecimals,\n    wethDecimals,\n    false,\n  );\n\n  // Invert to get ETH per token\n  return 1 / wethPerToken;\n}\n\n/**\n * Format a tick value to a human-readable price string\n * @param tick The tick value\n * @param tokenSymbol Symbol of the token\n * @param numeraireSymbol Symbol of the numeraire (e.g., \"ETH\")\n * @param tokenDecimals Token decimals\n * @param numeraireDecimals Numeraire decimals\n * @returns Formatted price string\n */\nexport function formatTickAsPrice(\n  tick: number,\n  tokenSymbol: string,\n  numeraireSymbol: string,\n  tokenDecimals = 18,\n  numeraireDecimals = 18,\n): string {\n  const price = tickToPrice(tick, tokenDecimals, numeraireDecimals, false);\n  const ethPerToken = 1 / price;\n\n  if (ethPerToken < 0.0001) {\n    return `${ethPerToken.toExponential(2)} ${numeraireSymbol} per ${tokenSymbol}`;\n  } else if (ethPerToken < 1) {\n    return `${ethPerToken.toFixed(6)} ${numeraireSymbol} per ${tokenSymbol}`;\n  } else {\n    return `${ethPerToken.toFixed(2)} ${numeraireSymbol} per ${tokenSymbol}`;\n  }\n}\n\n/**\n * Calculate the market cap at a given price\n * @param totalSupply Total token supply (as bigint)\n * @param pricePerToken Price per token in ETH\n * @param ethPrice Current ETH price in USD (optional)\n * @returns Market cap object with ETH and USD values\n */\nexport function calculateMarketCap(\n  totalSupply: bigint,\n  pricePerToken: number,\n  ethPrice?: number,\n): { eth: string; usd?: string } {\n  const totalSupplyNumber = Number(formatEther(totalSupply));\n  const marketCapETH = totalSupplyNumber * pricePerToken;\n\n  const result: { eth: string; usd?: string } = {\n    eth: `${marketCapETH.toFixed(2)} ETH`,\n  };\n\n  if (ethPrice) {\n    const marketCapUSD = marketCapETH * ethPrice;\n    result.usd = `$${marketCapUSD.toLocaleString('en-US', { maximumFractionDigits: 0 })}`;\n  }\n\n  return result;\n}\n\n/**\n * Calculate fully diluted valuation (FDV)\n * @param totalSupply Total token supply including vested tokens (as bigint)\n * @param pricePerToken Price per token in ETH\n * @param ethPrice Current ETH price in USD (optional)\n * @returns FDV object with ETH and USD values\n */\nexport function calculateFDV(\n  totalSupply: bigint,\n  pricePerToken: number,\n  ethPrice?: number,\n): { eth: string; usd?: string } {\n  // FDV is the same calculation as market cap but includes all tokens\n  return calculateMarketCap(totalSupply, pricePerToken, ethPrice);\n}\n\n/**\n * Estimate slippage for a trade in a concentrated liquidity pool\n * @param amountIn Amount to trade\n * @param liquidity Current liquidity\n * @param currentTick Current tick\n * @param fee Pool fee (e.g., 3000 for 0.3%)\n * @returns Estimated slippage percentage\n */\nexport function estimateSlippage(\n  amountIn: bigint,\n  liquidity: bigint,\n  currentTick: number,\n  fee: number,\n): number {\n  // Simplified slippage estimation\n  // In practice, you'd need to simulate the swap through tick ranges\n  const feeMultiplier = 1 - fee / 1000000;\n  const liquidityNumber = Number(liquidity) / 1e18;\n  const amountNumber = Number(amountIn) / 1e18;\n\n  // Basic approximation: slippage increases with trade size relative to liquidity\n  const impactRatio = amountNumber / liquidityNumber;\n  const slippage = impactRatio * 100 * feeMultiplier;\n\n  return Math.min(slippage, 100); // Cap at 100%\n}\n","export const feesManagerAbi = [\n  {\n    type: 'function',\n    name: 'getCumulatedFees0',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getCumulatedFees1',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getLastCumulatedFees0',\n    inputs: [\n      { name: 'poolId', type: 'bytes32', internalType: 'PoolId' },\n      { name: 'user', type: 'address', internalType: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getLastCumulatedFees1',\n    inputs: [\n      { name: 'poolId', type: 'bytes32', internalType: 'PoolId' },\n      { name: 'user', type: 'address', internalType: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getShares',\n    inputs: [\n      { name: 'poolId', type: 'bytes32', internalType: 'PoolId' },\n      { name: 'user', type: 'address', internalType: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getPoolKey',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      {\n        name: 'currency0',\n        type: 'address',\n        internalType: 'Currency',\n      },\n      { name: 'currency1', type: 'address', internalType: 'Currency' },\n      { name: 'fee', type: 'uint24', internalType: 'uint24' },\n      { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n      { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'updateBeneficiary',\n    inputs: [\n      { name: 'poolId', type: 'bytes32', internalType: 'PoolId' },\n      { name: 'newBeneficiary', type: 'address', internalType: 'address' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'event',\n    name: 'Collect',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: true,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'fees0',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'fees1',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Release',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: true,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'beneficiary',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'fees0',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'fees1',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'UpdateBeneficiary',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: false,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'oldBeneficiary',\n        type: 'address',\n        indexed: false,\n        internalType: 'address',\n      },\n      {\n        name: 'newBeneficiary',\n        type: 'address',\n        indexed: false,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  { type: 'error', name: 'CallerNotBeneficiary', inputs: [] },\n  { type: 'error', name: 'InvalidNewBeneficiary', inputs: [] },\n] as const;\n\n/** @deprecated Use feesManagerAbi instead. */\nexport const feeClaimsInitializerAbi = feesManagerAbi;\n","export const dopplerDN404Abi = [\n  {\n    type: 'function',\n    name: 'name',\n    inputs: [],\n    outputs: [{ name: '', type: 'string' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'symbol',\n    inputs: [],\n    outputs: [{ name: '', type: 'string' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'decimals',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint8' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalSupply',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'balanceOf',\n    inputs: [{ name: 'owner', type: 'address' }],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'allowance',\n    inputs: [\n      { name: 'owner', type: 'address' },\n      { name: 'spender', type: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'approve',\n    inputs: [\n      { name: 'spender', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'transfer',\n    inputs: [\n      { name: 'to', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'unit',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'baseURI',\n    inputs: [],\n    outputs: [{ name: '', type: 'string' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'mirrorERC721',\n    inputs: [],\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalNFTSupply',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getSkipNFT',\n    inputs: [{ name: 'owner', type: 'address' }],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'setSkipNFT',\n    inputs: [{ name: 'skipNFT', type: 'bool' }],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'pool',\n    inputs: [],\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isPoolUnlocked',\n    inputs: [],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n  },\n] as const;\n","export default '0x60a06040523461057b57604051601f615c0338819003918201601f19168301916001600160401b0383118484101761057f578084926101c09460405283398101031261057b5780516001600160a01b038116810361057b5760208201516040830151906060840151608085015160a08601519061007e60c088016105b3565b9161008b60e089016105b3565b91610100890151946100a06101208b016105b3565b976101408b0151978815988915810361057b576101608d01516101808e01516001600160a01b0381169e919d91908f0361057b576101a001519062ffffff821680920361057b576080525f6101a06100f6610593565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201525f6101a0610154610593565b6001815260016020820152600160408201528260608201528260808201528260a0820152600160c0820152600160e082015260016101008201528261012082015282610140820152826101608201528261018082015201526120003016151560011480159061056a575b8015610559575b801561054c575b801561053f575b8015610532575b8015610522575b8015610512575b8015610502575b80156104f6575b80156104ea575b80156104de575b80156104d2575b80156104c6575b6104b35762ffffff1960165416176016558442116104a4578660020b8860020b91818303610463575b5050508484101561045457838503858111610440578a60020b5f811380159061042b575b61041c578915610408578982066103f9578c156103eb57600f8d116103eb578484116103dc5761029861029d928b81046017558b6105c1565b610658565b628000008110156103cf5762ffffff19601854169062ffffff1617601855600d55600e55600f5560105560115562ffffff6012549160181b65ffffff0000001692169065ffffffffffff1916171760125560135562ffffff63ff000000601454921560181b1692169063ffffffff1916171760145560155560018060a01b0319600c541617600c5560405161552f90816106d48239608051818181601c01528181610205015281816102a80152818161045c0152818161050c0152818161098701528181610a1e01528181610af501528181610b9201528181610c5a01528181610e8301528181610f3a0152818161103d015281816110b201528181611d2c01528181611de40152818161217801528181613b8301528181613c4d01528181613fe9015281816140f40152614be40152f35b6335278d125f526004601cfd5b638cc99b7b60e01b5f5260045ffd5b6287e39960e61b5f5260045ffd5b6388ac089760e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6312469eb560e11b5f5260045ffd5b5061043a81610298848d6105c1565b1561025f565b634e487b7160e01b5f52601160045260245ffd5b63536a71af60e01b5f5260045ffd5b8061049b575b610483578a9182610491575b5050610483575f808061023b565b6264847d60e41b5f5260045ffd5b1390505f80610475565b50808212610469565b632ca4094f60e21b5f5260045ffd5b630732d7b560e51b5f523060045260245ffd5b50600130161515610212565b5060023016151561020b565b50600430161515610204565b506008301615156101fd565b506010301615156101f6565b50602030161515600114156101ef565b50604030161515600114156101e8565b50608030161515600114156101e1565b50610100301615156101da565b50610200301615156101d3565b50610400301615156101cc565b5061080030161515600114156101c5565b5061100030161515600114156101be565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051906101c082016001600160401b0381118382101761057f57604052565b51908160020b820361057b57565b90670de0b6b3a76400008202905f19670de0b6b3a764000084099282808510940393808503948584111561057b571461065157670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b808202905f1983820990828083109203918083039283670de0b6b3a7640000111561057b57146106c2577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a76400009150049056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b6393c866c160e01b5f5260045ffd5b5f905f3560e01c908163182148ef146111155750806318cb1700146110f357806321d0ee701461109f578063259982e51461102a578063392e53cd1461100857806339518b5e14610feb578063514ea4bf14610f96578063575e24b414610ee357806357d775f814610ec65780636c2bbe7e14610e705780636c47a6c314610e535780636fe7e6eb14610c19578063897479cb14610bfb57806390ebab0a14610bdd57806391dd734614610b5e5780639ce110d714610b355780639f063efc14610ade578063a4dee15514610ab9578063b137392914610a98578063b356603014610a74578063b47b2fb1146109c6578063b6a8b0fa14610970578063c19d93fb14610921578063c4e833ce146107b6578063c70dfb4f14610795578063ce5494bb146104cb578063d0c52e21146104a9578063d65b4cb91461048b578063dc4c90d314610446578063dc98354e14610276578063dcf93f3214610250578063e1b4af69146101ee5763ee4644300361000f57346101eb57806003193601126101eb576020600d54604051908152f35b80fd5b50346101eb57600490610200366112dc565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303925061024491505057630a85dc2960e01b8152fd5b63570c108560e11b8152fd5b50346101eb57806003193601126101eb57602060ff60145460181c166040519015158152f35b50346101eb5760e03660031901126101eb5761029061116b565b5060a03660231901126101eb576102a561128e565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036104375760085460ff81166104295760ff19166001176008556001600160a01b03602435908116908181036104255750600980546001600160a01b0319169190911790556044356001600160a01b038116908181036104255750600a80546001600160a01b03191691909117905560643562ffffff8116810361042157600a5461035a612061565b60b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b19161717600a5560a43560018060a01b03811680910361042157600b80546001600160a01b031916919091179055601e6103b5612061565b60020b136104125760145460020b6103cb612061565b60020b9081156103fe570760020b6103ef57604051636e4c1aa760e11b8152602090f35b6312469eb560e11b8152600490fd5b634e487b7160e01b83526012600452602483fd5b63013840ad60e51b8152600490fd5b5080fd5b8280fd5b62dc149f60e41b8252600482fd5b63570c108560e11b8152600490fd5b50346101eb57806003193601126101eb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101eb57806003193601126101eb576020600f54604051908152f35b50346101eb57806003193601126101eb5760ff60209154166040519015158152f35b50346101eb5760203660031901126101eb576104e561116b565b600c546001600160a01b031633036107865760ff825460081c161580610765575b610756577f000000000000000000000000000000000000000000000000000000000000000061059d8361057561058360405161054181611333565b610549611f3d565b815260018060a01b03871660208201528360408201526001606082015260405192839160208301611f8a565b03601f1981018352826113b4565b604051809381926348c8949160e01b8352600483016112b2565b0381836001600160a01b0387165af190811561074b57916105d785926105e2959460e09791610729575b50602080825183010191016114d8565b600695919554613282565b9161064160018060a01b0360095416926106306105fe856145cf565b948761061f8761061760018060a01b03600a54166145cf565b9a8b94614611565b600a546001600160a01b0316614611565b60a061063a611f3d565b2090614754565b5050600954600a5492976001600160a01b039182169791909316946106879250610678906001600160801b03608086901d16611472565b926001600160801b0316611472565b906001600160801b0381111561071a57506001600160801b03915b506001600160801b0381111561070b57506001600160801b03935b604080516001600160a01b0397909716875260208701919091526001600160801b03608085811d821692880192909252918216606087015285019190915290811660a08401521660c0820152f35b6001600160801b0316936106bd565b6001600160801b0316916106a2565b61074591503d8086833e61073d81836113b4565b810190611fcb565b5f6105c7565b6040513d86823e3d90fd5b63051a2a5560e51b8252600482fd5b50600454600e5411158061077a575b15610506565b50601154421015610774565b638341a67960e01b8252600482fd5b50346101eb57806003193601126101eb57602060125460020b604051908152f35b50346101eb57806003193601126101eb576020816101c0926101a06040516107dd81611362565b82815282858201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201528060405161083b81611362565b60018152838101600181526040820160018152606083018481526080840185815260a0850186815260c08601906001825260e087019260018452610100880194600186526101208901968a88526101408a01988b8a526101a06101608c019b8d8d5261018081019d8e52019c8d526040519d8e916001835251151591015251151560408d015251151560608c015251151560808b015251151560a08a015251151560c089015251151560e08801525115156101008701525115156101208601525115156101408501525115156101608401525115156101808301525115156101a0820152f35b50346101eb57806003193601126101eb5760c064ffffffffff600154166002546003546004546005549160065493604051958652602086015260408501526060840152608083015260a0820152f35b50346101eb57600490610982366112dc565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506102449150505763567d91d160e01b8152fd5b50346101eb576101603660031901126101eb576109e161116b565b5060a03660231901126101eb5760603660c31901126101eb57610144356001600160401b03811161042157610a1a903690600401611195565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610437576040610a5a610124356140d7565b82516001600160e01b03199092168252600f0b6020820152f35b50346101eb57806003193601126101eb57602060125460181c60020b604051908152f35b50346101eb57806003193601126101eb57602060145460020b604051908152f35b50346101eb57806003193601126101eb5760ff6020915460081c166040519015158152f35b50346101eb57600490610af036611225565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506102449250505057630a85dc2960e01b8152fd5b50346101eb57806003193601126101eb57600c546040516001600160a01b039091168152602090f35b50346101eb5760203660031901126101eb576004356001600160401b03811161042157610b8f903690600401611195565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361043757610bd9610bcd848461168f565b604051918291826112b2565b0390f35b50346101eb57806003193601126101eb576020601554604051908152f35b50346101eb57806003193601126101eb576020600e54604051908152f35b5034610e4057610100366003190112610e4057610c3461116b565b60a0366023190112610e4057610c4861128e565b5060e435908160020b809203610e40577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169133839003610e445762ffffff6016541691833b15610e4057604051635275965160e01b815292602435906001600160a01b038216808303610e40576004860152604435946001600160a01b038616808703610e4057602482015260643562ffffff8116808203610e40576044830152608435918260020b808403610e4057606482015260a435936001600160a01b038516808603610e4057608483015260a48201525f8160c481838d5af18015610e3557610e07575b509488979461057594610da6948a9994610dc29960405196610d5a88611333565b60405194610d678661137e565b85526020850152604084015260608301526080820152835260018060a01b03166020830152604082015285606082015260405192839160208301611f8a565b6040519485809481936348c8949160e01b8352600483016112b2565b03925af18015610dfc57610de3575b604051636fe7e6eb60e01b8152602090f35b610df6913d8091833e61073d81836113b4565b5f610dd1565b6040513d84823e3d90fd5b610da69399509461057594610e245f610dc299949a959b986113b4565b5f9a94509450949791969095610d39565b6040513d5f823e3d90fd5b5f80fd5b63570c108560e11b5f5260045ffd5b34610e40575f366003190112610e40576020601154604051908152f35b34610e4057610e7e36611225565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039350610e449250505057630a85dc2960e01b5f5260045ffd5b34610e40575f366003190112610e40576020601354604051908152f35b34610e4057610140366003190112610e4057610efd61116b565b5060a0366023190112610e405760603660c3190112610e4057610124356001600160401b038111610e4057610f36903690600401611195565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610e4457606062ffffff610f766120bd565b906040939293519363ffffffff60e01b1684526020840152166040820152f35b34610e40576020366003190112610e40576004355f526007602052608060405f205460ff604051918060020b83528060181c60020b6020840152600180851b038160301c16604084015260b01c166060820152f35b34610e40575f366003190112610e40576020601054604051908152f35b34610e40575f366003190112610e4057602060ff600854166040519015158152f35b34610e4057611038366111c2565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039050610e4457306001600160a01b03909116036110905760405163259982e560e01b8152602090f35b636d1ed89b60e01b5f5260045ffd5b34610e40576110ad366111c2565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039150610e44905057630a85dc2960e01b5f5260045ffd5b34610e40575f366003190112610e4057602062ffffff60165416604051908152f35b34610e40575f366003190112610e4057600954600a54600b546001600160a01b039283168452818316602085015260a082811c62ffffff16604086015260b89290921c60020b6060850152909116608083015290f35b600435906001600160a01b0382168203610e4057565b35906001600160a01b0382168203610e4057565b9181601f84011215610e40578235916001600160401b038311610e405760208381860195010111610e4057565b90610160600319830112610e40576004356001600160a01b0381168103610e40579160a0602319820112610e4057602491608060c319830112610e405760c49161014435906001600160401b038211610e405761122191600401611195565b9091565b906101a0600319830112610e40576004356001600160a01b0381168103610e40579160a0602319820112610e4057602491608060c319830112610e405760c4916101443591610164359161018435906001600160401b038211610e405761122191600401611195565b60c435906001600160a01b0382168203610e4057565b35908160020b8203610e4057565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b610120600319820112610e40576004356001600160a01b0381168103610e40579160a0602319830112610e405760249160c4359160e4359161010435906001600160401b038211610e405761122191600401611195565b608081019081106001600160401b0382111761134e57604052565b634e487b7160e01b5f52604160045260245ffd5b6101c081019081106001600160401b0382111761134e57604052565b60a081019081106001600160401b0382111761134e57604052565b606081019081106001600160401b0382111761134e57604052565b601f909101601f19168101906001600160401b0382119082101761134e57604052565b359062ffffff82168203610e4057565b91908260a0910312610e40576040516113ff8161137e565b608061144b81839561141081611181565b855261141e60208201611181565b602086015261142f604082016113d7565b6040860152611440606082016112a4565b606086015201611181565b910152565b600201908160021161145e57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161145e57565b9060405161148c81611333565b9154600281810b8452601882901c900b6020840152603081901c6001600160801b0316604084015260b01c60ff166060830152565b600f0b60016001607f1b0319811461145e575f0390565b9190826040910312610e40576020825192015190565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b9061016092611542836060936114ee565b805160020b60a0840152602081015160020b60c0840152604081015160e084015201516101008201526101406101208201525f6101408201520190565b6001600160a01b03918216815291166020820152604081019190915260600190565b9190820391821161145e57565b6001600160401b03811161134e5760051b60200190565b906115cf826115ae565b6115dc60405191826113b4565b82815280926115ed601f19916115ae565b01905f5b8281106115fd57505050565b60209060405161160c81611333565b5f81525f838201525f60408201525f6060820152828285010152016115f1565b8051156116395760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156116395760400190565b80518210156116395760209160051b010190565b9081549060181b65ffffff000000169065ffffff0000001916179055565b919082015f61010084830312610e40576116b5604051926116af84611333565b856113e7565b938483526116c560a08201611181565b80602085015260e06116d960c084016112a4565b92836040870152013580151594858203610e40576060015260018060a01b03169060020b92611c4e5750600164ffffffffff1981541617600155606084019261173c845160020b61173761172c85614ef6565b60125460020b61209f565b614f2e565b6014549060ff8260181c165f14611c3b5761175a9160020b9061209f565b945b61176584613378565b61176e85613378565b956040519561177c87611399565b808752602087018181526118d8604089019a888c526118d0600d54956117a06136a5565b956118088c6118036117fa6117db6117d26117c96117c46117bf61480d565b614ea2565b6136c3565b60135490614e80565b60105490614ebe565b6117f46117eb60105480936115a1565b916011546115a1565b90615033565b600d5490615113565b6136d4565b8c929083811315611c2c5761186b9293508981115f14611c275750885b928d60185460020b835160020b8082135f14611c1f5750905b50818a5260145460181c60ff1615611c105761185f9150895160020b61209f565b905b5160020b90614f2e565b60020b60208701525b855160020b966020870197885160020b14155f14611c055760ff60145460181c166118c5836118a68a5160020b613378565b8b516001600160801b039491906118bf9060020b613378565b91614fcc565b1660408801526115a1565b90848861374b565b996118eb6118e68c51611450565b6115c5565b985160020b915160020b9060018060801b03905116906040519261190e84611333565b8352602083015260408201526001606082015261192a8861162c565b526119348761162c565b50805160020b915160020b90604060018060801b0391015116906040519261195b84611333565b835260208301526040820152600260608201526119778661164d565b526119818561164d565b50835b8751811015611a3457611997818961165d565b515160020b60206119a8838b61165d565b51015160020b6001600160801b0360406119c2858d61165d565b51015116836003019182600311611a2057611a1992600195949260ff92604051946119ec86611333565b855260208501526040840152166060820152611a0783611450565b90611a12828b61165d565b528861165d565b5001611984565b634e487b7160e01b89526011600452602489fd5b50611a429293969585613a82565b611a4b8261162c565b516001855260076020526040852090805162ffffff198354169062ffffff16178255611a7e602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055611ac58261164d565b516002855260076020526040852090805162ffffff198354169062ffffff16178255611af8602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055835b8351811015611be557611b53611b4d82611450565b8461165d565b518160030180600311611bd1579060019291875260076020526040872090805162ffffff198354169062ffffff16178255611b95602082015160020b83611671565b604081015190825490606060ff60b01b91015160b01b16918560301b8660b01b039060301b16908560301b8660b81b0319161717905501611b38565b634e487b7160e01b87526011600452602487fd5b509291505060405190611bf96020836113b4565b81525f36602083013790565b8b60408801526115a1565b611c199161335b565b90611861565b90509061183e565b611825565b50508087526020870152611874565b611c489160020b9061335b565b9461175c565b925f9250829160015b6015546003018060031161145e57811015611ddc57805f526007602052611c8060405f2061147f565b60408101516001600160801b031680611c9e575b5050600101611c57565b611d279160409160ff6014999598995460181c1691825f14611dce57805160020b925b15611db95760ff6060611ce3611cde602085015160020b95613263565b6114c1565b9201511691845193611cf485611333565b60020b845260020b6020840152600f0b838301526060820152815180938192632d35e7ed60e11b83528c60048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192611d7e925f905f92611d86575b50611d789192613282565b96613282565b93905f611c94565b611d789250611dac915060403d8111611db2575b611da481836113b4565b8101906114d8565b91611d6d565b503d611d9a565b60ff6060611ce3611cde845160020b95613263565b602081015160020b92611cc1565b5091929390947f000000000000000000000000000000000000000000000000000000000000000091611e1860018060a01b0383511630856132c4565b926020830192611e3260018060a01b0385511630846132c4565b945f8113611ed6575b5050848413611e6a575b5050505050604051916020830152604082015260408152611e676060826113b4565b90565b91516001600160a01b039283169216823b15611ed25791611ea6939185809460405196879586948593630b0d9c0960e01b85526004850161157f565b03925af18015610dfc57611ebd575b808080611e45565b611ec88280926113b4565b6101eb5780611eb5565b8480fd5b90516001600160a01b0383811692911690823b15610e4057611f1392855f809460405196879586948593630b0d9c0960e01b85526004850161157f565b03925af18015610e3557611f28575b80611e3b565b611f359195505f906113b4565b5f935f611f22565b60405190611f4a8261137e565b6009546001600160a01b039081168352600a54808216602085015260a081901c62ffffff16604085015260b81c60020b6060840152600b54166080830152565b91909160e06060610100830194611fa28482516114ee565b60208101516001600160a01b031660a0850152604081015160020b60c085015201511515910152565b602081830312610e40578051906001600160401b038211610e40570181601f82011215610e40578051906001600160401b03821161134e576040519261201b601f8401601f1916602001856113b4565b82845260208383010111610e4057815f9260208093018386015e8301015290565b600f91820b910b019060016001607f1b0319821260016001607f1b0383131761145e57565b6084358060020b8103610e405790565b60020b627fffff19811461145e575f0390565b60020b60010190627fffff8213627fffff1983121761145e57565b9060020b9060020b0190627fffff198212627fffff83131761145e57565b5f80549160ff8360081c16613254576010544210613245576120dd61480d565b64ffffffffff600154161015613234575f9260115442101580613229575b612e7e575b509060ff5f5416155f14612e105761211661480d565b9060015461212b64ffffffffff8216846115a1565b64ffffffffff1990911664ffffffffff84161760015560035460025f526007602052946121645f8051602061550383398151915261147f565b9461219c60a06121753660246113e7565b207f0000000000000000000000000000000000000000000000000000000000000000614754565b505050946121a986614841565b608435978860020b90818a14159283610e40578a6121c691614f2e565b905f916121d68d600554906136d4565b5f198a0194908a861161145e575f8f966121f26121f791613a72565b614fac565b80971115911280612e09575b15612cac575050506122249192505160020b9161221e615332565b90614ebe565b955b60018111612c165750612262908a60055561225c670de0b6b3a764000061224f89600254614ebe565b9880612c0d575b05614ef6565b9061209f565b90612c09578761227191614f2e565b9061228d8861173761172c670de0b6b3a76400005f9905614ef6565b9760145460ff8160181c165f14612bf6576122ab9060020b8a61209f565b955b8960ff60145460181c16809b811580612be6575b15612baa57505050612ba6576122d7908361209f565b945b6122e283613378565b986122ec87613378565b908b15612b9d5715612aea5760016123058c8c84615420565b91818060a01b038c1690828060a01b0316038060ff1d9081011891818060801b031661233183826150ca565b928260601b9109151516015b975b60155461234e6118e682611450565b9060018a52600760205261236460408b2061147f565b61236d8361162c565b526123778261162c565b5060028a52600760205261238d60408b2061147f565b6123968361164d565b526123a08261164d565b50895b818110612aa25750506123c1906123bb3660246113e7565b90614afa565b5060145460181c60ff1699908a156129fc576044356001600160a01b03811681036129f857612402906123f3906145cf565b6001600160801b038316611472565b6006549061241a906001600160801b038316906115a1565b916024356001600160a01b03811681036129f4579e6118e69f936124728e969461245d8c9561244b89879a506145cf565b9060801d6001600160801b0316611472565b60809190911d6001600160801b0316906115a1565b9e5b61247f3660246113e7565b906124886136a5565b958361299457505050505060020b80825260208201528260408201525b604081018051909c6125ab916125a391612591916001600160801b031615612985575b6124d33660246113e7565b906124fa6124df6136a5565b976118036117fa6117db6117d26117c96117c46117bf61480d565b88808213156129715750818111156129685750612555815b928d606060185460020b920191825160020b8082135f146129605750905b60020b90818b5260ff60145460181c165f14611c105761185f91508a5160020b61209f565b60020b60208801525b865160020b976020880198895160020b14155f14612956575060ff60145460181c166118c5836118a68a5160020b613378565b878561259e3660246113e7565b61374b565b9e8f51611450565b9b6020825160020b92015160020b9060018060801b0390511690604051926125d284611333565b835260208301526040820152600160608201526125ee8c61162c565b526125f88b61162c565b50805160020b915160020b90604060018060801b0391015116906040519261261f84611333565b8352602083015260408201526002606082015261263b8a61164d565b526126458961164d565b50875b8b518110156126f9578b602061266d83612662818561165d565b515160020b9361165d565b51015160020b8d60406126878560018060801b039361165d565b510151168360030191826003116126e5579260ff6126de938f9360019796604051946126b286611333565b8552602085015260408401521660608201526126d76126d085611450565b809361165d565b528c61165d565b5001612648565b634e487b7160e01b8d52601160045260248dfd5b50612719919293949596999a979a6127123660246113e7565b918a613a82565b6127228761162c565b5160018a52600760205260408a2090805162ffffff198354169062ffffff16178255612755602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b1617905561279c8761164d565b5160028a52600760205260408a2090805162ffffff198354169062ffffff161782556127cf602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055885b6015548110156128fc578651811061285957806003018060031161284557906001918b5260076020528a60408120555b0161280f565b634e487b7160e01b8b52601160045260248bfd5b61286b61286582611450565b8961165d565b5181600301806003116128e85790600192918c52600760205260408c2090805162ffffff198354169062ffffff161782556128ad602082015160020b83611671565b604081015190825490606060ff60b01b91015160b01b16918560301b8660b01b039060301b16908560301b8660b81b0319161717905561283f565b634e487b7160e01b8c52601160045260248cfd5b5090919295507f223157ec47d7bd04fa3ed10c0a8adb38faf97b51ec856a777425a2e39253bd739450608093966040519360020b845260020b602084015260020b60408301526060820152a15b6315d7892d60e21b929190565b60408801526115a1565b905090612530565b61255590612512565b9250508b60020b808852602088015261255e565b602085015160020b85526124c8565b838111156129ad5750506129a89450614ca4565b6124a5565b92509350506129e991508c60020b84528960020b60208501526129cf8d613378565b6001600160801b0393906129e28c613378565b9115614fcc565b1660408201526124a5565b8c80fd5b8a80fd5b6024356001600160a01b03811681036129f857612a2f90612a1c906145cf565b608083901d6001600160801b0316611472565b60065490612a4b90608083901d6001600160801b0316906115a1565b916044356001600160a01b03811681036129f4579e6118e69f93612a9c8e9694612a8b8c95612a7c89879a506145cf565b906001600160801b0316611472565b6001600160801b03909116906115a1565b9e612474565b80600301806003116128e857906001918c526007602052612ae360408d20612ad2612acc84611450565b9161147f565b612adc828861165d565b528561165d565b50016123a3565b612af58b8b836153dd565b8a826001600160a01b0380831690821611612b92575b506001600160a01b038316918215612b865760601b600160601b600160e01b0316926001600160a01b03828116929190910316612b4982828661527d565b938215612b725709612b63575b808206151591040161233d565b906001019081612b56575b8880fd5b634e487b7160e01b8c52601260045260248cfd5b62bfc9218b526004601cfd5b8c935090505f612b0b565b5050869761233f565b8680fd5b91989392509081612bd5575b50612bc2575b506122d9565b612bce9196508361335b565b945f612bbc565b905060020b8460020b13155f612bb6565b508060020b8760020b12156122c1565b612c039060020b8a61335b565b956122ad565b8580fd5b89600255612256565b612c1f906136ec565b5f198101818111611a20576121f2612c3691613a72565b808c10612c44575b50612226565b612c59612c52989298615332565b918d615033565b670de0b6b3a76400000390670de0b6b3a76400008211612c9857612c8a612c919392670de0b6b3a764000092614e80565b0590614ebe565b955f612c3e565b634e487b7160e01b8a52601160045260248afd5b9192909115612d0957505083612b6e578a612cc691614f2e565b91612cd2612c52615332565b670de0b6b3a76400000390670de0b6b3a76400008211612c9857612c8a612d039392670de0b6b3a764000092614e80565b95612226565b93509350975050612d2f60125460020b670de0b6b3a76400006002540560020b9061209f565b60185460020b5f9381135f14612dfe57905b6014549260ff8460181c1692835f14612deb57612d61915160020b61209f565b915b829985610e4057612db394612d7b8e612dab96614f2e565b938315612dd857612d8f9160020b9061209f565b915b15612dc3578160020b8160020b135f14612dbc575061335b565b60020b614e5c565b955f9695612226565b905061335b565b8160020b8160020b125f14612dbc575061335b565b612de59160020b9061335b565b91612d91565b612df8915160020b61335b565b91612d63565b505f92508990612d41565b5080612203565b915060ff60145460181c168080612e67575b8115612e47575b50612e38576240000090612949565b63016ccb0760e01b5f5260045ffd5b90501580612e56575b5f612e29565b5060c4358015158114612e50575f80fd5b905060c43580159081158103610e40575090612e22565b600454600e54111561321a5760019060ff1916175f557fe8775e4a58023f399765c3455b45eebcc45ad6b99607a1163f02e1318430970c5f80a1612ed3612ecb60a06121753660246113e7565b505050614841565b601554612ee26118e682611450565b60015f52600760205290612f025f805160206154e383398151915261147f565b612f0b8361162c565b52612f158261162c565b5060025f526007602052612f355f8051602061550383398151915261147f565b612f3e8361164d565b52612f488261164d565b505f5b8181106131e9575050612f63906123bb3660246113e7565b5060145460181c60ff1690811561319e576044356001600160a01b0381168103610e4057612fce918491612fb8906001600160801b0390612fa3906145cf565b16600f0b60018060801b0392600f0b9061203c565b165b60035490612fc93660246113e7565b614ca4565b90604080519290612fdf81856113b4565b60018452601f19015f5b81811061316f575050805160020b6020820191825160020b90604060018060801b0391015116906040519261301d84611333565b835260208301526040820152600160608201526130398461162c565b526130438361162c565b505160020b901561314657608435928360020b8403610e405761308061307a613075613093948761309898509061209f565b613378565b91613378565b9061308c3660246113e7565b9184613a82565b61162c565b5160015f52600760205260405f2090805162ffffff198354169062ffffff161782556130cb602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b161790555f5b6015546001810180911161145e5781101561313f578061312c600192611450565b5f5260076020525f60408120550161310b565b505f612100565b608435928360020b8403610e405761308061307a6130756130939461225c886130989950612071565b60209060405161317e81611333565b5f81525f838201525f60408201525f606082015282828801015201612fe9565b6024356001600160a01b0381168103610e4057612fce9184916131e3906001600160801b03906131cd906145cf565b6001600160801b039360801d9116600f0b61203c565b16612fba565b80600301908160031161145e576001915f52600760205261321360405f20612ad2612acc84611450565b5001612f4b565b631ed9bcf960e01b5f5260045ffd5b5060ff8116156120fb565b6315d7892d60e21b92505f91508190565b630fc95b4360e01b5f5260045ffd5b636fce6c3960e01b5f5260045ffd5b6001607f1b81101561327557600f0b90565b6335278d125f526004601cfd5b6132a5906132978360801d8260801d01614ed9565b92600f0b90600f0b01614ed9565b60018060801b03169060801b1790565b90816020910312610e40575190565b6001600160a01b039182165f9081529282166020908152604093849020935163789add5560e11b815260048101949094529183916024918391165afa908115610e35575f91613311575090565b90506020813d602011613338575b8161332c602093836113b4565b81010312610e40575190565b3d915061331f565b60020b5f190190627fffff198212627fffff83131761145e57565b600291820b910b0390627fffff198212627fffff83131761145e57565b60020b908160ff1d82810118620d89e881116136925763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b189160028116613676575b6004811661365a575b6008811661363e575b60108116613622575b60208116613606575b604081166135ea575b608081166135ce575b61010081166135b2575b6102008116613596575b610400811661357a575b610800811661355e575b6110008116613542575b6120008116613526575b614000811661350a575b61800081166134ee575b6201000081166134d2575b6202000081166134b7575b62040000811661349c575b6208000016613483575b5f1261347b575b0160201c90565b5f1904613474565b6b048a170391f7dc42444e8fa290910260801c9061346d565b6d2216e584f5fa1ea926041bedfe9890920260801c91613463565b916e5d6af8dedb81196699c329225ee6040260801c91613458565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c9161344d565b916f31be135f97d08fd981231505542fcfa60260801c91613442565b916f70d869a156d2a1b890bb3df62baf32f70260801c91613438565b916fa9f746462d870fdf8a65dc1f90e061e50260801c9161342e565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91613424565b916fe7159475a2c29b7443b29c7fa6e889d90260801c9161341a565b916ff3392b0822b70005940c7a398e4b70f30260801c91613410565b916ff987a7253ac413176f2b074cf7815e540260801c91613406565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c916133fc565b916ffe5dee046a99a2a811c461f1969c30530260801c916133f2565b916fff2ea16466c96a3843ec78b326b528610260801c916133e9565b916fff973b41fa98c081472e6896dfb254c00260801c916133e0565b916fffcb9843d60f6159c9db58835c9266440260801c916133d7565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c916133ce565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c916133c5565b916ffff97272373d413259a46990580e213a0260801c916133bc565b826345c3193d60e11b5f5260045260245ffd5b604051906136b282611399565b5f6040838281528260208201520152565b905f19820191821360011661145e57565b81810392915f13801582851316918412161761145e57565b801561145e575f190190565b60020b9060020b90811561371a57627fffff1981145f1983141661145e570590565b634e487b7160e01b5f52601260045260245ffd5b8181029291811591840414171561145e57565b811561371a570490565b9291909161375761480d565b613764601354809261372e565b906137726010548093611472565b9060115492838311613a46575b61378761480d565b6001810180911161145e576137a49261379f9161372e565b611472565b91808311613a3e575b50808214613a01576137e06137cf6137e6936117f46117eb60105480936115a1565b916117f46117eb60105480936115a1565b906115a1565b936015549384805b6139c0575b5061380a6020613814920194855160020b9061335b565b8560020b906136f8565b918461384b60ff60145460181c1694855f1461398657606085015160020b90818160020b125f1461397f57505b97600d5490615113565b9180613857838561372e565b1161396f575050925b5160020b9461386e856115ae565b9561387c60405197886113b4565b858752601f1961388b876115ae565b015f5b8181106139585750505f905b8682106138ab575050505050505090565b6138b5828961165d565b519060020b905260016138e76138d9846138cf858c61165d565b515160020b61209f565b606086015160020b90614f2e565b9160206138f4828b61165d565b51018360020b9052613939878a613932602061392786613921613917828761165d565b515160020b613378565b9461165d565b51015160020b613378565b9089614fcc565b6040613945838c61165d565b510190838060801b03169052019061389a565b6020906139636136a5565b82828c0101520161388e565b6139799250613741565b92613860565b9050613841565b60608501613997815160020b612071565b60020b8260020b125f146139ad57505b976117fa565b6139bb91505160020b612071565b6139a7565b945f19860186811161145e576139d590615001565b6139de87615001565b036139fb576139ef6139f5916136ec565b956136ec565b806137ee565b946137f3565b505050505050604051613a156020826113b4565b5f81525f805b818110613a2757505090565b602090613a326136a5565b82828601015201613a1b565b91505f6137ad565b83925061377f565b805115158252602080820151908301526040908101516001600160a01b0316910152565b600160ff1b811461145e575f0390565b9392916001600160a01b039182169116818103613f83575b50505f915f5b8451811015613c0d576001600160801b036040613abd838861165d565b51015116613ace575b600101613aa0565b613b7e90604060ff60145460181c16805f14613bf557613aee838961165d565b515160020b905b15613be1576020613b06848a61165d565b51015160020b5b613b2c6001600160801b0384613b23878d61165d565b51015116613263565b60ff6060613b3a878d61165d565b5101511691845193613b4b85611333565b60020b845260020b6020840152600f0b838301526060820152815180948192632d35e7ed60e11b83528860048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192613bc4575b509050613ac6565b613bdb9060403d8111611db257611da481836113b4565b50613bbc565b613beb838961165d565b515160020b613b0d565b6020613c01848a61165d565b51015160020b90613af5565b509190928051905f19820191821161145e57602091613c2b9161165d565b5101516018549060181b65ffffff000000169065ffffff0000001916176018557f0000000000000000000000000000000000000000000000000000000000000000613c8060018060a01b0385511630836132c4565b906020850194613c9a60018060a01b0387511630846132c4565b925f8113613f1c575b848413613ea7575b848112613db4575b5050828212613cc4575b5050509050565b84516001600160a01b039081169591169190823b15613db05760405195632961046560e21b87526004870152838660248183875af195861561074b57849596613d93575b505160209291613d2d916001600160a01b0316908390613d2790613a72565b91614611565b600460405180958193630476982d60e21b83525af1908115613d875750613d58575b80808392613cbd565b613d799060203d602011613d80575b613d7181836113b4565b8101906132b5565b505f613d4f565b503d613d67565b604051903d90823e3d90fd5b84613da29195929394956113b4565b613db057908392915f613d08565b8380fd5b81516001600160a01b03848116939116833b15612ba65760405190632961046560e21b82526004820152868160248183885af18015613e9c57908791613e87575b505080516001600160a01b031680613e73575b50516001600160a01b0316613e6957613e22602091613a72565b915b600460405180948193630476982d60e21b83525af1801561074b57613e4a575b80613cb3565b613e629060203d602011613d8057613d7181836113b4565b505f613e44565b5060208491613e24565b613e819084613d2785613a72565b5f613e08565b81613e91916113b4565b612c0957855f613df5565b6040513d89823e3d90fd5b86516001600160a01b038481169116813b15612ba65785613ee392889283604051809681958294630b0d9c0960e01b845230906004850161157f565b03925af18015613f1157908691613efc575b5050613cab565b81613f06916113b4565b611ed257845f613ef5565b6040513d88823e3d90fd5b81516001600160a01b03908116908416803b15610e4057825f91613f599383604051809681958294630b0d9c0960e01b845230906004850161157f565b03925af18015610e3557613f6e575b50613ca3565b613f7b9195505f906113b4565b5f935f613f68565b60405191613f9083611399565b81108252600160208301526040820152613fc860405191633cf3645360e21b8352613fbe60048401856114ee565b60a4830190613a4e565b6101206101048201525f610124820152602081610144815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610e355761401c575b80613a9a565b6140349060203d602011613d8057613d7181836113b4565b505f614016565b6101409290916140c391906001600160a01b0361405782611181565b1684526001600160a01b0361406e60208301611181565b16602085015262ffffff614084604083016113d7565b166040850152614096606082016112a4565b60020b60608501526001600160a01b03906140b390608001611181565b16608084015260a0830190613a4e565b6101206101008201525f6101208201520190565b60ff5f54166145c1576141299060a06140f13660246113e7565b207f00000000000000000000000000000000000000000000000000000000000000009061411e8183614754565b949290969150614841565b60145460181c60ff1680156145ae5760185460181c60020b8260020b135b60015f5260076020525f805160206154e38339815191525460020b9082156145a257818460020b12905b156144c05750505050906141ea91602060ff60145460181c16805f146144ac576141a561307560185460181c60020b612084565b604051916141b283611399565b151582526001838301526001600160a01b031660408083019190915251633cf3645360e21b815294859182919060246004840161403b565b03815f6001600160a01b0386165af18015610e3557614479575b61420e9250614754565b50509050925b60c435908115158203610e405762ffffff91610fff9182911561447057165b169116620f42408183020491010360ff60145460181c165f146143c757608082901d5f600f82900b1261438257600354614276916001600160801b031690611472565b6003555b600f82900b5f81126143285750505f805160206154c3833981519152916142ad60609260018060801b03166004546115a1565b6004555b600454600f548110156142e4575b600354906040519260020b835260208301526040820152a163b47b2fb160e01b905f90565b61010061ff00195f5416175f557f628a470bfdde264ef77cd19acfbfca22b3e4413adaf5837ec9fbc0043e35793f602061431c61480d565b604051908152a16142bf565b62ffffff919250614338906114c1565b9116620f42400391620f4240831161145e575f805160206154c38339815191529260609261437a91614372916001600160801b031661518e565b600454611472565b6004556142b1565b61438b906114c1565b62ffffff8216620f42400390620f4240821161145e576143bf916143b7916001600160801b031661518e565b6003546115a1565b60035561427a565b90600f81900b5f811261443357506003546143ec906001600160801b03831690611472565b6003555b60801d905f600f83900b1261442557505f805160206154c38339815191529161437a60609260018060801b03166004546115a1565b9061433862ffffff916114c1565b61443c906114c1565b62ffffff8316620f42400390620f4240821161145e57614468916143b7916001600160801b031661518e565b6003556143f0565b600c1c16614233565b6020833d6020116144a4575b81614492602093836113b4565b81010312610e405761420e9250614204565b3d9150614485565b6141a561307560185460181c60020b613340565b97949392976144d3575b50505050614214565b614534949750906144f0602092825f146145995761307590613340565b604051916144fd83611399565b1582526001838301526001600160a01b031660408083019190915251633cf3645360e21b815294859182919060246004840161403b565b03815f6001600160a01b0386165af18015610e3557614566575b6145589250614754565b50509050925f8080806144ca565b6020833d602011614591575b8161457f602093836113b4565b81010312610e4057614558925061454e565b3d9150614572565b61307590612084565b818460020b1390614171565b60185460181c60020b8260020b12614147565b5063b47b2fb160e01b905f90565b6001600160a01b0316806145e257504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115610e35575f91613311575090565b9091906001600160a01b038116908161469f5750505f80808093855af1156146365750565b6040516390bfb86560e01b81526001600160a01b0390911660048201525f602482018190526080604483015260a03d601f01601f191690810160648401523d6084840152903d9060a484013e808201600460a482015260c4633d2cec6f60e21b91015260e40190fd5b60205f604481949682604095865198899363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d116001855114161716928281528260208201520152156146f05750565b6040516390bfb86560e01b8152600481019190915263a9059cbb60e01b602482015260806044820152601f3d01601f191660a0810160648301523d60848301523d5f60a484013e808201600460a482015260c4633c9fd93960e21b91015260e40190fd5b919060209060405182810191825260066040820152604081526147786060826113b4565b519020604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa918215610e35575f926147d9575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d602011614805575b816147f5602093836113b4565b81010312610e405751905f6147b1565b3d91506147e8565b60105480421061483b5761482461482d91426115a1565b60135490613741565b6001810180911161145e5790565b50600190565b73fffd8963efd1fc6a506488495d951d51639616826401000276a21982016001600160a01b031611614ada57602081901b600160201b600160c01b0316808015610e4057693627a301d71055774c859160ff8260018060801b031060071b83811c60018060401b031060061b1783811c63ffffffff1060051b1783811c61ffff1060041b1783811c821060031b177b01c1818141808140018080c0814100004181408140c0c100414140c160221b6f8421084210842108cc6318c6db6d54be85831c1c601f161a17169160808310155f14614ace5750607e1982011c5b800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c80029081607f1c8260ff1c1c80029283607f1c8460ff1c1c80029485607f1c8660ff1c1c80029687607f1c8860ff1c1c80029889607f1c8a60ff1c1c80029a8b607f1c8c60ff1c1c80029c8d80607f1c9060ff1c1c600160321b90800260cd1c169d600160331b9060cc1c169c600160341b9060cb1c169b600160351b9060ca1c169a600160361b9060c91c1699600160371b9060c81c1698600160381b9060c71c1697600160391b9060c61c16966001603a1b9060c51c16956001603b1b9060c41c16946001603c1b9060c31c16936001603d1b9060c21c16926001603e1b9060c11c16916001603f1b9060c01c1690607f190160401b1717171717171717171717171717026fdb2df09e81959a81455e260799a0632f6f028f6481ab7f045a5af012a19d003aa919820160801d60020b910160801d60020b918282145f14614aaa5750905090565b6001600160a01b0390811690614abf84613378565b1611614ac9575090565b905090565b905081607f031b61491e565b6318521d4960e21b5f9081526001600160a01b0391909116600452602490fd5b91905f905f905f5b8551811015614c8d576001600160801b036040614b1f838961165d565b51015116614b30575b600101614b02565b9192614bdf604060ff60145460181c16805f14614c7557614b51868a61165d565b515160020b905b15614c61576020614b69878b61165d565b51015160020b5b8960ff6060614b9b8a6139216001600160801b0389614b8f848961165d565b51015116600f0b6114c1565b5101511691845193614bac85611333565b60020b845260020b6020840152600f0b838301526060820152815180938192632d35e7ed60e11b83528760048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192614c36925f905f92614c3e575b50614c309192613282565b95613282565b929050614b28565b614c309250614c5b915060403d8111611db257611da481836113b4565b91614c25565b614c6b868a61165d565b515160020b614b70565b6020614c81878b61165d565b51015160020b90614b58565b505091909250614c9f82600654613282565b600655565b9093929193614cb16136a5565b9480614e0457505f5b6001600160a01b031680614cde5750505060020b80835260208301525f6040830152565b919250614de991614d9090606090614d829060b56001600160881b03821160071b82811c6001600160481b031060061b1782811c64ffffffffff1060051b1782811c62ffffff1060041b17600181811c9290921b9083901c62010000010260121c80830401811c80830401811c80830401811c80830401811c80830401811c80830401811c80830401901c908190048111900360301b6001600160a01b0316614841565b940193845160020b90614f2e565b92614dd1602087019460020b9182865260ff60145460181c1692835f14614df15750614dc690865160020b905160020b9061335b565b60020b808852613378565b93516001600160801b0394906129e29060020b613378565b166040830152565b614dff915160020b9061209f565b614dc6565b8160ff60145460181c165f14614e3d5750600654614e3891614e329160801d6001600160801b0316906115a1565b826152fd565b614cba565b600654614e3892614e57916001600160801b0316906115a1565b6152fd565b90670de0b6b3a7640000820291808305670de0b6b3a7640000149015171561145e57565b81810292915f8212600160ff1b82141661145e57818405149015171561145e57565b9060018201915f60018412911290801582169115161761145e57565b9190915f838201938412911290801582169115161761145e57565b9081600f0b918203614ee757565b6393dafdf160e01b5f5260045ffd5b80628000000160181c15614f11576335278d125f526004601cfd5b60020b90565b9060020b9060020b02908160020b91820361145e57565b9060ff60145460181c165f14614f7a575f8260020b125f14614f6d57614f6881614f63614f5e82611e679661335b565b612084565b6136f8565b614f17565b614f6881611e67936136f8565b5f8260020b125f14614f9357614f6881611e67936136f8565b614f6881614f63614fa782611e679661209f565b613340565b6117fa6117db6117d26117c96117c4611e6795614fc761480d565b614ebe565b90929091908015614ffb575f19810190811161145e57915b15614ff257611e6792615420565b611e67926153dd565b91614fe4565b61501c6150136150259261379f61480d565b6013549061372e565b60105490611472565b601154808211614ac9575090565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610e4057146150c357670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b81810291905f1982820991838084109303928084039384600160601b1115610e40571461510a57600160601b910990828211900360a01b910360601c1790565b50505060601c90565b808202905f1983820990828083109203918083039283670de0b6b3a76400001115610e40571461517d577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a764000091500490565b808202905f1983820990828083109203918083039283620f42401115610e4057146151ee577fde8f6cefed634549b62c77574f722e1ac57e23f24d8fd5cb790fb65668c2613993620f4240910990828211900360fa1b910360061c170290565b5050620f424091500490565b90606082901b905f19600160601b840992828085109403938085039485841115610e4057146150c3578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f1981850993838086109503948086039586851115610e4057146152f5579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b90615307916151fa565b6001600160a01b03811161532d57600160a01b811015613275576001600160a01b031690565b505f90565b615378612dab615348612ecb60a0612175611f3d565b60145460181c60ff16156153ac5760125460020b808260020b135f146153a557505b60125460181c60020b61335b565b61538a614824601154601054906115a1565b90811561371a57600160ff1b81145f1983141661145e570590565b905061536a565b60125460020b808260020b125f146153a5575061536a565b6001600160a01b03918216908216039190821161145e57565b611e67926154159290916001600160a01b038083169082161161541a575b6001600160a01b039161540e91906153c4565b16906151fa565b615474565b906153fb565b611e6792615415929091906001600160a01b038082169083161161546e575b6154676154586001600160a01b038381169085166150ca565b926001600160a01b03926153c4565b169161527d565b9061543f565b6001600160801b0381169190820361548857565b60405162461bcd60e51b81526020600482015260126024820152716c6971756964697479206f766572666c6f7760701b6044820152606490fdfe27db09392d7d230eb65a11bd84925fb8da90df8a067ca8a4fc2933b4f637262bb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828b7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96da164736f6c634300081a000a' as const;\n","export default '0x60a0604052346104a85761390680380380610019816107f1565b928339810160e0828203126104a85781516001600160401b0381116104a85781610044918401610816565b60208301519091906001600160401b0381116104a85781610066918501610816565b9060408401519161007960608601610867565b9361008660808701610867565b60a08701519093906001600160401b0381116104a85760c0916100aa918901610816565b960151926001600160a01b031680156107de575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a382156107cf578284066107c0578051906001600160401b0382116104eb5760015490600182811c921680156107b6575b60208310146105d05781601f849311610748575b50602090601f83116001146106e2575f926106d7575b50508160011b915f199060031b1c1916176001555b8051906001600160401b0382116104eb5760025490600182811c921680156106cd575b60208310146105d05781601f84931161065f575b50602090601f83116001146105f9575f926105ee575b50508160011b915f199060031b1c1916176002555b83516001600160401b0381116104eb57600354600181811c911680156105e4575b60208210146105d057601f811161056d575b50602094601f821160011461050a579481929394955f926104ff575b50508160011b915f199060031b1c1916176003555b608052604051610d35808201906001600160401b038211838310176104eb576020918391612bd183393381520301905ff080156104e0576080516001600160a01b0391909116906001600160601b035f1990910110156104d35768a20d6e21d0e5255309546001600160a01b03166104c65780156104b957630f4599e55f523360205260205f6024601c82855af160015f511416156104ac57678da5cb5b6cef16e65f5260208060046018305afa601f3d1160205160601b151016610499575b68a20d6e21d0e5255308805463ffffffff60201b191664010000000017905568a20d6e21d0e525530980546001600160a01b03191691909117905580610375575b604051612334908161089d823960805181818161040b01528181610a4f01528181610c1c015281816114860152818161171c015281816119110152611f920152f35b6001600160a01b03821691821561048c57608051820463fffffffe108260601c1761047f5768a20d6e21d0e525530880546001600160a01b031660a084901b6001600160a01b03191690811790915561041292906103d28361087b565b80546001600160a01b031690911790555f90815283907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602082a361087b565b906bff00000000000000000000008254918260581c9060015f527fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d642039360205fa2600260ff821691161560011b1860011760581b16906bff000000000000000000000019161790555f80610333565b63e5cfe9575f526004601cfd5b63ea553b345f526004601cfd5b5f806004601c82855af16102f2575b5f80fd5b63d125259c5f526004601cfd5b6339a84a7b5f526004601cfd5b63ead4d2e45f526004601cfd5b63997c4ef45f526004601cfd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b015190505f8061021d565b601f1982169560035f52805f20915f5b8881106105555750836001959697981061053d575b505050811b01600355610232565b01515f1960f88460031b161c191690555f808061052f565b9192602060018192868501518155019401920161051a565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106105c6575b601f0160051c01905b8181106105bb5750610201565b5f81556001016105ae565b90915081906105a5565b634e487b7160e01b5f52602260045260245ffd5b90607f16906101ef565b015190505f806101b9565b60025f9081528281209350601f198516905b818110610647575090846001959493921061062f575b505050811b016002556101ce565b01515f1960f88460031b161c191690555f8080610621565b9293602060018192878601518155019501930161060b565b60025f529091507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191602085106106c3575b90601f859493920160051c01905b8181106106b557506101a3565b5f81558493506001016106a8565b909150819061069a565b91607f169161018f565b015190505f80610157565b60015f9081528281209350601f198516905b8181106107305750908460019594939210610718575b505050811b0160015561016c565b01515f1960f88460031b161c191690555f808061070a565b929360206001819287860151815501950193016106f4565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c810191602085106107ac575b90601f859493920160051c01905b81811061079e5750610141565b5f8155849350600101610791565b9091508190610783565b91607f169161012d565b633eaf92f760e21b5f5260045ffd5b63265f13bd60e21b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b6040519190601f01601f191682016001600160401b038111838210176104eb57604052565b81601f820112156104a8578051906001600160401b0382116104eb57610845601f8301601f19166020016107f1565b92828452602083830101116104a857815f9260208093018386015e8301015290565b51906001600160a01b03821682036104a857565b6001600160a01b03165f90815268a20d6e21d0e5255313602052604090209056fe608080604052600436101561075d575b503615610752575f3560e01c63e5eb36c881146103d25763f6916ddd811461038f576362fb246d811461036b57632d8a746e81146103325763c016aa52811461031f5763d10b6e0c811461022f576327ef549581146102145763f5b100ea81146101ef5763e2c7928181146101d45763cb30b46081146100a95763b7a94eb8146100a057633c10b94e5f526004601cfd5b60015f5260205ff35b60206040510160405260606003546100c0816113a1565b6100e4575b50605f601f198201915f6020825180930101526020835201601f191690f35b905060405190608082019160a081016040525f8352600a600435935b5f19019360308282060185530492831561011c57600a90610100565b9250608083601f19810192030181526040519283915f9061013c856113a1565b94600181169081156101b45750600114610173575b61016d9450518092825e015f815203601f1981018352826113d9565b816100c5565b905060035f5260205f20935f5b818110610198575061016d9450830160200190610151565b8554602082890181019190915260019096019587955001610180565b602092935061016d96915060ff1916828601528015150284010190610151565b63ffffffff68a20d6e21d0e52553085460801c165f5260205ff35b63ffffffff6102086004356001600160a01b031661135f565b5460801c165f5260205ff35b6001600160a01b03610227600435612130565b165f5260205ff35b68a20d6e21d0e5255309546001600160a01b03163303610312576001600160a01b036044358116906024359060043581169061028061027b5f19600160201b861086020160011b612055565b6120eb565b5416928381036102ef575b505f82815268a20d6e21d0e525530c60209081526040822080546001600160a01b0319166001600160a01b03851617905568a20d6e21d0e525530d60601b600885901c018054600160ff90961695861b191693151590941b92909217909255918152f35b6102f990846115cd565b5415610305578361028b565b63cfb3b9425f526004601cfd5b63ce5a776b5f526004601cfd5b6001600160a01b03610227600435612107565b6004356001600160a01b0361034682612107565b161561035e576001600160a01b039061022790612107565b63ceea21b65f526004601cfd5b6103856001600160a01b03602435811690600435166115cd565b5415155f5260205ff35b68a20d6e21d0e5255309546001600160a01b031633036103125760243515156103c86001600160a01b03600435811690604435166115cd565b5560015f5260205ff35b68a20d6e21d0e5255309546001600160a01b031633819003610312576001600160a01b0360043581165f818152600560205260409020547f000000000000000000000000000000000000000000000000000000000000000093919260443592916064358216916024351690610448908790611438565b935f925f948661072d575b83156107205715610713576001600160a01b0361048061027b600160201b851085025f190160011b612055565b54168703610706578681036106cd575b5061049a8661135f565b906104a48361135f565b90825460a01c808a116106c0576105a69361055e916104cf908c90036001600160601b031682612169565b83546104ee9060a01c6001600160601b038d8116919091011685612169565b6104f78361229f565b61068f575b600161052b61050a8c611380565b9261052563ffffffff5f1981845460801c160116809261218c565b83612079565b61054d8161053f5f198801851b8501612055565b9463ffffffff8616906120c3565b63ffffffff165f1901811b01612095565b6105a08463ffffffff845460801c169361058163ffffffff60018701168261218c565b61059b61058d83611380565b8663ffffffff8716916120c3565b6121d0565b90612260565b855f52845f8051602061231483398151915260205fa36105c95760015f5260205ff35b5f19820191821161067b5763ffffffff6105e28461135f565b5460801c169182811061060d575b5050505f52600560205260405f20908154039055808080806100a0565b61061684611380565b928210156105f0578181146105f0576001826106628363ffffffff8481966106628a610645886106739d612079565b928161065d610655838795612079565b809b836120c3565b6120c3565b825f19911601811b01911690612095565b8280806105f0565b634e487b7160e01b5f52601160045260245ffd5b610698836121af565b5f83815268a20d6e21d0e525530c6020526040902080546001600160a01b03191690556104fc565b63f4d678b85f526004601cfd5b6106d781886115cd565b54610490576001600160a01b036106ed83612130565b16036106f95787610490565b6359c896be5f526004601cfd5b63a11481005f526004601cfd5b6340739bf05f526004601cfd5b63ea553b345f526004601cfd5b9350935063ffffffff61074760015f198401811b01612055565b169385851093610453565b3461075957005b5f80fd5b5f3560e01c90816306fdde031461126757508063095ea7b3146111c65780630ad9e7bf1461118e57806310aa0ebb1461116957806316f0115b1461114157806318160ddd14611119578063207d0636146110d657806323b872dd14611030578063274e430b146110035780632a6a935d14610f915780632f745c5914610f2a578063313ce56714610f0f5780634ef41efc14610edf5780634f6ccce714610ec157806355f804b314610d685780635b2aa23914610bcb5780636c0360eb14610b3957806370a0823114610b0a578063715018a614610ac65780638902653814610a995780638da5cb5b14610a72578063907af6c014610a3857806395d89b411461095e578063a9059cbb1461092d578063dd62ed3e146108f95763f2fde38b14610887575f61000f565b34610759576020366003190112610759576108a0611333565b6108a8611589565b6001600160a01b031680156108e6575f80546001600160a01b03198116831782556001600160a01b0316905f805160206122f48339815191529080a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610759576040366003190112610759576020610925610917611333565b61091f611349565b90611523565b604051908152f35b3461075957604036600319011261075957610953610949611333565b60243590336115eb565b602060405160018152f35b34610759575f366003190112610759576040515f60025461097e816113a1565b8084529060018116908115610a1457506001146109b6575b6109b2836109a6818503826113d9565b60405191829182611309565b0390f35b60025f9081527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b8082106109fa575090915081016020016109a6610996565b9192600181602092548385880101520191019092916109e2565b60ff191660208086019190915291151560051b840190910191506109a69050610996565b34610759575f3660031901126107595760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610759575f366003190112610759575f546040516001600160a01b039091168152602090f35b34610759575f36600319011261075957610ab1611589565b6004805460ff60a01b1916600160a01b179055005b34610759575f36600319011261075957610ade611589565b5f80546001600160a01b0319811682556001600160a01b03165f805160206122f48339815191528280a3005b34610759576020366003190112610759576020610b2d610b28611333565b61135f565b5460a01c604051908152f35b34610759575f366003190112610759576040515f600354610b59816113a1565b8084529060018116908115610a145750600114610b80576109b2836109a6818503826113d9565b60035f9081525f805160206122d4833981519152939250905b808210610bb1575090915081016020016109a6610996565b919260018160209254838588010152019101909291610b99565b34610759576020366003190112610759576004356001600160401b03811161075957366023820112156107595760048101356001600160401b038111610759573660248260051b84010111610759577f0000000000000000000000000000000000000000000000000000000000000000918282029282840481148315171561067b57335f52600560205260405f205493610c643361135f565b5460a01c610c728287611456565b11610d5957610c84610c8a9286611438565b94611456565b335f52600560205260405f2055610ca03361135f565b9263ffffffff610caf33611380565b945460801c16915f915b84831015610d575760248360051b8301013584811015610d4857818110610d3e578181600193849303610cf2575b5001925b0191610cb9565b8063ffffffff848b61066282610d0b610d389784612079565b610d26818a610d1a8188612079565b9661065d888c836120c3565b888616919086165f1901811b01612095565b88610ce7565b5091600190610ceb565b633277964160e01b5f5260045ffd5b005b6302579b0560e11b5f5260045ffd5b34610759576020366003190112610759576004356001600160401b03811161075957366023820112156107595760048101356001600160401b03811161075957366024828401011161075957610dbc611589565b610dc76003546113a1565b601f8111610e71575b505f601f8211600114610e0c5781925f92610dfe575b50508160011b915f199060031b1c1916176003555f80f35b602492500101358280610de6565b601f1982169260035f5260205f20915f5b858110610e5657508360019510610e3a575b505050811b01600355005b01602401355f19600384901b60f8161c19169055828080610e2f565b90926020600181926024878701013581550194019101610e1d565b60035f525f805160206122d4833981519152601f830160051c81019160208410610eb7575b601f0160051c01905b818110610eac5750610dd0565b5f8155600101610e9f565b9091508190610e96565b34610759576020366003190112610759576020610925600435611463565b34610759575f3660031901126107595768a20d6e21d0e5255309546040516001600160a01b039091168152602090f35b34610759575f36600319011261075957602060405160128152f35b3461075957604036600319011261075957610f43611333565b60243563ffffffff610f548361135f565b5460801c16811015610f8257610f7963ffffffff91610f74602094611380565b612079565b16604051908152f35b6306ed618760e11b5f5260045ffd5b3461075957602036600319011261075957600435801580158092036107595761095391610fbd3361135f565b91825460581c915f52337fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d642039360205fa2600260ff83169216151860011b186001179061156c565b34610759576020366003190112610759576020611026611021611333565b611410565b6040519015158152f35b3461075957606036600319011261075957611049611333565b611051611349565b6044359061105f33846115af565b926e22d473030f116ddee9f6b43ac78ba33314806110bf575b156110b7575f19935b60018501611095575b5061095393506115eb565b8484116110aa5783610953950390558461108a565b6313be252b5f526004601cfd5b835493611081565b5060046110cb8261135f565b5460581c1615611078565b34610759576020366003190112610759576110ef611333565b6110f7611589565b600480546001600160a81b0319166001600160a01b0392909216919091179055005b34610759575f36600319011261075957602068a20d6e21d0e52553085460a01c604051908152f35b34610759575f366003190112610759576004546040516001600160a01b039091168152602090f35b34610759575f36600319011261075957602060ff60045460a01c166040519015158152f35b34610759576020366003190112610759576001600160a01b036111af611333565b165f526005602052602060405f2054604051908152f35b34610759576040366003190112610759576111df611333565b6001600160a01b03811690602435908190611211906e22d473030f116ddee9f6b43ac78ba38514611245575b336115af565b555f52337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b6112626112513361135f565b600460ff825460581c16179061156c565b61120b565b34610759575f366003190112610759575f600154611284816113a1565b8084529060018116908115610a1457506001146112ab576109b2836109a6818503826113d9565b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106112ef575090915081016020016109a6610996565b9192600181602092548385880101520191019092916112d7565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361075957565b602435906001600160a01b038216820361075957565b6001600160a01b03165f90815268a20d6e21d0e52553136020526040902090565b6001600160a01b03165f90815268a20d6e21d0e52553106020526040902090565b90600182811c921680156113cf575b60208310146113bb57565b634e487b7160e01b5f52602260045260245ffd5b91607f16916113b0565b601f909101601f19168101906001600160401b038211908210176113fc57604052565b634e487b7160e01b5f52604160045260245ffd5b9061141a8261135f565b5460581c9160016002841615159316156114315750565b3b15159150565b8115611442570490565b634e487b7160e01b5f52601260045260245ffd5b9190820180921161067b57565b9068a20d6e21d0e52553085463ffffffff8160801c16831015611514576114ae907f00000000000000000000000000000000000000000000000000000000000000009060a01c611438565b905f925f5b8381106114c957639f6fb6c960e01b5f5260045ffd5b806001018060011161067b5763ffffffff6114e68360011b612055565b166114f5575b506001016114b3565b828692961461150b5750600180910194906114ec565b93505050915090565b639f6fb6c960e01b5f5260045ffd5b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314611551575b61154d916115af565b5490565b600461155c8361135f565b5460581c166115445750505f1990565b805460ff60581b191660589290921b60ff60581b16919091179055565b5f546001600160a01b0316330361159c57565b63118cdaa760e01b5f523360045260245ffd5b9060285260145268a20d6e21d0e525530f5f5260485f20905f602852565b9060285260145268a20d6e21d0e525530b5f5260485f20905f602852565b6004549092906001600160a01b03838116908216149081612046575b50612037576001600160a01b038316611fe0575b6001600160a01b03821615610720576116338361135f565b61163c8361135f565b68a20d6e21d0e5255309546001600160a01b031615610713576040519161018083016001600160401b038111848210176113fc576040525f83525f60208401525f60808401525f60a08401525f60c08401525f60e08401525f6101008401525f6101208401525f6101408401525f610160840152805463ffffffff8160801c16604085015263ffffffff835460801c1660608501528060a01c85116106c0576116f560a082901c8690036001600160601b031683612169565b825460a01c8501906117106001600160601b03831685612169565b611745604086015191877f00000000000000000000000000000000000000000000000000000000000000009160a01c03611438565b808203911102845261175686611410565b15611f78575b50611d73565b68a20d6e21d0e52553085463ffffffff60208501518551928382848360801c1601038060808901528360801b9060801b16908360801b191617928368a20d6e21d0e52553085501916040519260c060a085019180835260051b850101604052836040015260c0830183528261016087015260601c166101208501528351611c53575b505060208201516118c9575b5061014081015180611885575b50610160015180611833575b505f9081526001600160a01b0391821692909116905f8051602061231483398151915290602090a3565b600160206040828060a01b0368a20d6e21d0e5255309541693015192603f19840193849163263c69d6835283601f198301525f825160051b6044019260231901915af19151141615610759575f611809565b600160205f9281838060a01b0368a20d6e21d0e5255309541691015190815160051b60840190607f19830195869360631901915af19151141615610759575f6117fd565b9194610160829492015160208360601b9101526118e582611380565b9463ffffffff6118f584866121d0565b1660e086015268a20d6e21d0e5255308549263ffffffff6119397f00000000000000000000000000000000000000000000000000000000000000008660a01c611438565b9460201c16848111908115021761010087015261196e60608701519563ffffffff602089015188018060c08b0152169061218c565b63ffffffff68a20d6e21d0e52553085460401c169760015b15611bf4575b6101208701515f9063ffffffff8b8116911614611a4257611a3d63ffffffff60018c01169a60e0641fffffffe0631fffffff8360031c1668a20d6e21d0e525531160601b01549260051b16161c63ffffffff165b8060081c685106b710e87292a98760611b0160018260ff161b8019825416179055611a1263ffffffff82168a8d6120c3565b611a3263ffffffff60e08c01511663ffffffff60018c019b169083612260565b6101608a01516122bd565b611986565b949798939291906101008801515b63ffffffff611a645f19830160011b612055565b1615611bd0575f19906001810160081c685106b710e87292a98760611b018054196001830160ff1690811c901b8015611b58575b80611aae575b5050508981119081150217611a50565b600180939450811901167e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405601f6101e07a1412563212c14164235266736f7425221143267a4524367526767760fc7b2aaaaaaaba69a69a6db6db6db2cb2cb2ce739ce73def7bdeffffffff860260f81c161b60f71c1692831c63d76453e004161a179082685106b710e87292a98760611b03190160081b17910181108a8211175f03175f8080611a9e565b506001909c9895929c9a9794919a9693965b01805419685106b710e87292a98760611b60088e901c0182118117611b925750600190611b6a565b9c9295989c9a9194979a969396808d60081c685106b710e87292a98760611b018311611bbf575b50611a98565b508c1960ff1690811b901c80611bb9565b611a3d909a999691929394959a6001810188811190811502176101008b01526119e0565b60c0870151860361198c57945094925094509468a20d6e21d0e52553085463ffffffff60201b61010084015160201b169163ffffffff60401b9060401b1690600160201b600160601b031916171768a20d6e21d0e5255308555f6117f0565b602060018860609a9699959a989497981b17910152611c7182611380565b94611c9160408801519563ffffffff895188038060a08c0152169061218c565b60015b15611d5a575b5f945f190194611caa8688612079565b63ffffffff8116905f1982018060021c685106b710e87292a98960611b019060c082549160061b1681811c60018060401b0316901b189055611cf1826101608c01516122bd565b600160ff62ffffff8360081c16685106b710e87292a98760611b0192161b198154169055611d1e8161229f565b611d29575b50611c94565b611d32816121af565b5f90815268a20d6e21d0e525530c6020526040812080546001600160a01b0319169055611d23565b60a08701518503611c9a57935093509390945f806117e4565b9194604086979294970151948651976020880151898110818b18028a1899888b108b8a18028914611f69578a8918898c10028918908190038a52900360208901526001600160a01b0383811690831614611f47576040805163144027d3818301526001600160a01b03858116606080840191909152908516608083015260a08201528a8918898c1002891860c0820181815260059190911b820160e090810190935260208201529081018152610140890152611e2e83611380565b95611e3883611380565b9763ffffffff611e4885846121d0565b1660e08b015260608a01519a81811090821802188a019560015b15611f01575b878b611eac8163ffffffff808f8f90611ea060e09284611e975f9b5f1960408701510190816040880152612079565b169889916120c3565b01511691169083612260565b6101408c015160208151838152019052611ec58161229f565b611ed0575b50611e62565b611ed9816121af565b5f90815268a20d6e21d0e525530c6020526040812080546001600160a01b0319169055611eca565b9960010199868b03611e6857939895509398611f2e92975063ffffffff919650806060870152168361218c565b611f4263ffffffff6040850151168261218c565b611762565b9492978681989593989792971090821802186060840151016060840152611762565b50509492975094509491611762565b611fb7906001600160a01b0388811690881614611fcd575b7f000000000000000000000000000000000000000000000000000000000000000090611438565b606084015180820391110260208401525f61175c565b6040850151855190036060860152611f90565b611fe98361135f565b5460a01c60018060a01b0384165f52600560205260405f205490808211918215612024575b50501561161b576311acc28f60e01b5f5260045ffd5b81039150811161067b5781115f8061200e565b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f611607565b60e08160031c685106b710e87292a98960611b01549160051b161c63ffffffff1690565b60e0908260031c9060601b01549160051b161c63ffffffff1690565b9060e08260031c685106b710e87292a98960611b019260051b1682549182821c1863ffffffff16901b189055565b60e0909291928360031c9060601b019260051b1682549182821c1863ffffffff16901b189055565b63ffffffff165f5268a20d6e21d0e525530a60205260405f2090565b6001600160a01b039061212b9061027b90600160201b8110025f190160011b612055565b541690565b6001600160a01b0361214182612107565b161561035e575f90815268a20d6e21d0e525530c60205260409020546001600160a01b031690565b80546001600160a01b031660a09290921b6001600160a01b031916919091179055565b805463ffffffff60801b191660809290921b63ffffffff60801b16919091179055565b60018160081c68a20d6e21d0e525530d60601b019160ff161b198154169055565b805460601c63ffffffff16929183156121e7575050565b68a20d6e21d0e5255308805463ffffffff19811663ffffffff918216600101918216908117909255835463ffffffff60601b191660609190911b63ffffffff60601b1617909255909250829061223c826120eb565b80546001600160a01b0319166001600160a01b039092169190911790551561075957565b5f1901908160021c685106b710e87292a98960611b019260c084549360061b169163ffffffff169060201b1782821c1860018060401b0316901b189055565b8060081c68a20d6e21d0e525530d60601b01549060ff161c60011690565b9060209082519060081b8284015117815201905256fec2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef608034607857601f610d3538819003918201601f19168301916001600160401b03831184841017607c57808492602094604052833981010312607857516001600160a01b03811690819003607857683602298b8c10b0123180546001600160a01b031916919091179055604051610ca490816100918239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60808060405260043610156101c5575b5036156101ba575f3560e01c63263c69d681146101405763144027d381146100cf57630f4599e51461004857633c10b94e5f526004601cfd5b683602298b8c10b01231546001600160a01b0316806100ab575b50683602298b8c10b01230546001600160a01b03811661009e576001600160a01b0319163317683602298b8c10b012305560015f908152602090f35b63bf656a465f526004601cfd5b6004356001600160a01b0316036100c2575f610062565b63c59ec47a5f526004601cfd5b683602298b8c10b01230546001600160a01b03163303610133576004356024359060443591602483810193600481013560051b0101925b8381036101165760015f5260205ff35b803582845f80516020610c848339815191525f80a4602001610106565b63363cb3125f526004601cfd5b683602298b8c10b01230546001600160a01b0316330361013357600435602481810191600481013560051b0101905b81810361017f5760015f5260205ff35b8035600881901c6001600160581b03169060018116801560609290921c91820291025f80516020610c848339815191525f80a460200161016f565b346101c157005b5f80fd5b5f3560e01c90816301ffc9a714610aa85750806306fdde0314610a3d578063081812fc146109e6578063095ea7b31461096457806318160ddd1461091857806323b872dd1461090457806324359879146108ad5780632f745c591461083c57806342842e0e146107c95780634f6ccce7146107325780636352211e146107035780636cef16e61461063757806370a08231146105da5780638da5cb5b146105aa57806395d89b411461053f57806397e5311c14610513578063a22cb46514610487578063b88d4fde1461039d578063c87b56dd146103215763e985e9c5146102ad575f61000f565b346101c15760403660031901126101c1576102c6610b1c565b60205f6044601c6102d5610b32565b6102dd610c25565b604080516362fb246d87526001600160a01b039889168852979092169091525afa601f3d1116156103195760405260205f516040519015158152f35b3d5f823e3d90fd5b346101c15760203660031901126101c15760043561033e81610c4f565b505f806024601c61034d610c25565b6040519563cb30b46085526020525afa15610319576103999060205f803e60205f51823e805160205f5101602083013e6040815182015f60208201520160405260405191829182610af2565b0390f35b60803660031901126101c1576103b1610b1c565b6103b9610b32565b60443591606435916001600160401b0383116101c157366023840112156101c1576004830135926001600160401b0384116101c15736602485830101116101c157610405858385610b82565b813b61040d57005b83602094602460a49360405198899763150b7a028952338a8a015260018060a01b0316604089015260608801526080808801528260a08801520160c086013701905f601c8401915af115610479575b5163757a42ff60e11b0161046c57005b63d1a57ed65f526004601cfd5b3d1561045c573d5f823e3d90fd5b346101c15760403660031901126101c1576104a0610b1c565b6024358015158091036101c15760205f6064601c826104bd610c25565b9660018060a01b0316966040519663f6916ddd8352888752604052336060525af160015f511416156103195750337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206040a3005b346101c1575f3660031901126101c157602061052d610c25565b6040516001600160a01b039091168152f35b346101c1575f3660031901126101c157610557610c25565b5f806024601c604051946395d89b418452836020525afa15610319576103999060205f803e60205f51823e805160205f5101602083013e6040815182015f60208201520160405260405191829182610af2565b346101c1575f3660031901126101c157683602298b8c10b01232546040516001600160a01b039091168152602090f35b346101c15760203660031901126101c1576001600160a01b036105fb610b1c565b1660205f6044601c61060b610c25565b6040519563f5b100ea85528552836040525afa601f3d1116156103195760405260205f51604051908152f35b346101c1575f3660031901126101c15761064f610c25565b683602298b8c10b012325460205f6004601c60018060a01b03851695638da5cb5b84525afa9081601f3d1116600c5160601c0291156106ec575b506001600160a01b0316908181036106a7575b602060405160018152f35b683602298b8c10b0123280546001600160a01b031916831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3808061069c565b60601b6001600160601b0319166101c15782610689565b346101c15760203660031901126101c15760206001600160a01b03610729600435610c4f565b16604051908152f35b346101c15760203660031901126101c157602460206001600160a01b03610757610c25565b1660405192838092634f6ccce760e01b825260043560048301525afa80156107be575f9061078b575b602090604051908152f35b506020813d6020116107b6575b816107a560209383610bee565b810103126101c15760209051610780565b3d9150610798565b6040513d5f823e3d90fd5b6107d236610b48565b916107de838383610b82565b813b6107e657005b60a460209260405194859363150b7a028552338686015260018060a01b0316604085015260608401526080808401525f60a08401525f3681375f601c8401915af115610479575163757a42ff60e11b0161046c57005b346101c15760403660031901126101c157610855610b1c565b60206001600160a01b03610867610c25565b604051632f745c5960e01b81526001600160a01b039094166004850152602480359085015283916044918391165afa80156107be575f9061078b57602090604051908152f35b346101c15760203660031901126101c1576108c6610c25565b60205f6044601c6040519463c016aa5284526004358552836040525afa601f3d1116156103195760408190525f516001600160a01b03168152602090f35b61091661091036610b48565b91610b82565b005b346101c1575f3660031901126101c157610930610c25565b60205f6044601c6040519463e2c792818452838552836040525afa601f3d1116156103195760405260205f51604051908152f35b60403660031901126101c157610978610b1c565b60243590610984610c25565b9060018060a01b03169060205f6064601c6040519463d10b6e0c8452868552876040523360605234905af1601f3d1116156103195750600c5160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a4005b346101c15760203660031901126101c1576109ff610c25565b60205f6044601c604051946327ef549584526004358552836040525afa601f3d1116156103195760408190525f516001600160a01b03168152602090f35b346101c1575f3660031901126101c157610a55610c25565b5f806024601c604051946306fdde038452836020525afa15610319576103999060205f803e60205f51823e805160205f5101602083013e6040815182015f60208201520160405260405191829182610af2565b346101c15760203660031901126101c157600435906001600160e01b0319821682036101c15760209160e01c635b5e139f8114906301ffc9a76380ac58cd82149114171715158152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101c157565b602435906001600160a01b03821682036101c157565b60609060031901126101c1576004356001600160a01b03811681036101c157906024356001600160a01b03811681036101c1579060443590565b9060846020610b8f610c25565b6040805163e5eb36c881526001600160a01b03968716848201819052959096169086018190526060860187905233608087015294928391601c83019034905af16001825114161561031957505f80516020610c848339815191525f80a4565b601f909101601f19168101906001600160401b03821190821017610c1157604052565b634e487b7160e01b5f52604160045260245ffd5b683602298b8c10b01230546001600160a01b0316908115610c4257565b635b2a47ae5f526004601cfd5b60205f6044601c610c5e610c25565b60405195632d8a746e85528552836040525afa601f3d111615610319576040525f519056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' as const;\n","export default '0x60a06040523461049b57613a4d80380380610019816107c6565b928339810160e08282031261049b5781516001600160401b03811161049b57816100449184016107eb565b60208301519091906001600160401b03811161049b57816100669185016107eb565b906040840151916100796060860161083c565b936100866080870161083c565b60a08701519093906001600160401b03811161049b5760c0916100aa9189016107eb565b960151926001600160a01b031680156107b3575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a38051906001600160401b0382116104de5760015490600182811c921680156107a9575b60208310146105c35781601f84931161073b575b50602090601f83116001146106d5575f926106ca575b50508160011b915f199060031b1c1916176001555b8051906001600160401b0382116104de5760025490600182811c921680156106c0575b60208310146105c35781601f849311610652575b50602090601f83116001146105ec575f926105e1575b50508160011b915f199060031b1c1916176002555b83516001600160401b0381116104de57600354600181811c911680156105d7575b60208210146105c357601f8111610560575b50602094601f82116001146104fd579481929394955f926104f2575b50508160011b915f199060031b1c1916176003555b608052604051610d41808201906001600160401b038211838310176104de576020918391612d0c83393381520301905ff080156104d3576080516001600160a01b0391909116906001600160601b035f1990910110156104c65768a20d6e21d0e5255309546001600160a01b03166104b95780156104ac57630f4599e55f523360205260205f6024601c82855af160015f5114161561049f57678da5cb5b6cef16e65f5260208060046018305afa601f3d1160205160601b15101661048c575b68a20d6e21d0e5255308805463ffffffff60201b191664010000000017905568a20d6e21d0e525530980546001600160a01b03191691909117905580610368575b60405161249a9081610872823960805181818161040b01528181610a4f01528181610c47015281816115920152818161184701528181611a3c01526120bd0152f35b6001600160a01b03821691821561047f57608051820463fffffffe108260601c176104725768a20d6e21d0e525530880546001600160a01b031660a084901b6001600160a01b03191690811790915561040592906103c583610850565b80546001600160a01b031690911790555f90815283907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602082a3610850565b906bff00000000000000000000008254918260581c9060015f527fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d642039360205fa2600260ff821691161560011b1860011760581b16906bff000000000000000000000019161790555f80610326565b63e5cfe9575f526004601cfd5b63ea553b345f526004601cfd5b5f806004601c82855af16102e5575b5f80fd5b63d125259c5f526004601cfd5b6339a84a7b5f526004601cfd5b63ead4d2e45f526004601cfd5b63997c4ef45f526004601cfd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b015190505f80610210565b601f1982169560035f52805f20915f5b88811061054857508360019596979810610530575b505050811b01600355610225565b01515f1960f88460031b161c191690555f8080610522565b9192602060018192868501518155019401920161050d565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106105b9575b601f0160051c01905b8181106105ae57506101f4565b5f81556001016105a1565b9091508190610598565b634e487b7160e01b5f52602260045260245ffd5b90607f16906101e2565b015190505f806101ac565b60025f9081528281209350601f198516905b81811061063a5750908460019594939210610622575b505050811b016002556101c1565b01515f1960f88460031b161c191690555f8080610614565b929360206001819287860151815501950193016105fe565b60025f529091507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191602085106106b6575b90601f859493920160051c01905b8181106106a85750610196565b5f815584935060010161069b565b909150819061068d565b91607f1691610182565b015190505f8061014a565b60015f9081528281209350601f198516905b818110610723575090846001959493921061070b575b505050811b0160015561015f565b01515f1960f88460031b161c191690555f80806106fd565b929360206001819287860151815501950193016106e7565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c8101916020851061079f575b90601f859493920160051c01905b8181106107915750610134565b5f8155849350600101610784565b9091508190610776565b91607f1691610120565b631e4fbdf760e01b5f525f60045260245ffd5b6040519190601f01601f191682016001600160401b038111838210176104de57604052565b81601f8201121561049b578051906001600160401b0382116104de5761081a601f8301601f19166020016107c6565b928284526020838301011161049b57815f9260208093018386015e8301015290565b51906001600160a01b038216820361049b57565b6001600160a01b03165f90815268a20d6e21d0e5255313602052604090209056fe608080604052600436101561075d575b503615610752575f3560e01c63e5eb36c881146103d25763f6916ddd811461038f576362fb246d811461036b57632d8a746e81146103325763c016aa52811461031f5763d10b6e0c811461022f576327ef549581146102145763f5b100ea81146101ef5763e2c7928181146101d45763cb30b46081146100a95763b7a94eb8146100a057633c10b94e5f526004601cfd5b60015f5260205ff35b60206040510160405260606003546100c0816114af565b6100e4575b50605f601f198201915f6020825180930101526020835201601f191690f35b905060405190608082019160a081016040525f8352600a600435935b5f19019360308282060185530492831561011c57600a90610100565b9250608083601f19810192030181526040519283915f9061013c856114af565b94600181169081156101b45750600114610173575b61016d9450518092825e015f815203601f19810183528261148c565b816100c5565b905060035f5260205f20935f5b818110610198575061016d9450830160200190610151565b8554602082890181019190915260019096019587955001610180565b602092935061016d96915060ff1916828601528015150284010190610151565b63ffffffff68a20d6e21d0e52553085460801c165f5260205ff35b63ffffffff6102086004356001600160a01b031661144a565b5460801c165f5260205ff35b6001600160a01b0361022760043561228a565b165f5260205ff35b68a20d6e21d0e5255309546001600160a01b03163303610312576001600160a01b036044358116906024359060043581169061028061027b5f19600160201b861086020160011b6121af565b612245565b5416928381036102ef575b505f82815268a20d6e21d0e525530c60209081526040822080546001600160a01b0319166001600160a01b03851617905568a20d6e21d0e525530d60601b600885901c018054600160ff90961695861b191693151590941b92909217909255918152f35b6102f990846116f1565b5415610305578361028b565b63cfb3b9425f526004601cfd5b63ce5a776b5f526004601cfd5b6001600160a01b03610227600435612261565b6004356001600160a01b0361034682612261565b161561035e576001600160a01b039061022790612261565b63ceea21b65f526004601cfd5b6103856001600160a01b03602435811690600435166116f1565b5415155f5260205ff35b68a20d6e21d0e5255309546001600160a01b031633036103125760243515156103c86001600160a01b03600435811690604435166116f1565b5560015f5260205ff35b68a20d6e21d0e5255309546001600160a01b031633819003610312576001600160a01b0360043581165f818152600560205260409020547f000000000000000000000000000000000000000000000000000000000000000093919260443592916064358216916024351690610448908790611544565b935f925f948661072d575b83156107205715610713576001600160a01b0361048061027b600160201b851085025f190160011b6121af565b54168703610706578681036106cd575b5061049a8661144a565b906104a48361144a565b90825460a01c808a116106c0576105a69361055e916104cf908c90036001600160601b0316826122c3565b83546104ee9060a01c6001600160601b038d81169190910116856122c3565b6104f7836123f9565b61068f575b600161052b61050a8c61146b565b9261052563ffffffff5f1981845460801c16011680926122e6565b836121d3565b61054d8161053f5f198801851b85016121af565b9463ffffffff86169061221d565b63ffffffff165f1901811b016121ef565b6105a08463ffffffff845460801c169361058163ffffffff6001870116826122e6565b61059b61058d8361146b565b8663ffffffff87169161221d565b61232a565b906123ba565b855f52845f8051602061246e83398151915260205fa36105c95760015f5260205ff35b5f19820191821161067b5763ffffffff6105e28461144a565b5460801c169182811061060d575b5050505f52600560205260405f20908154039055808080806100a0565b6106168461146b565b928210156105f0578181146105f0576001826106628363ffffffff8481966106628a610645886106739d6121d3565b928161065d6106558387956121d3565b809b8361221d565b61221d565b825f19911601811b019116906121ef565b8280806105f0565b634e487b7160e01b5f52601160045260245ffd5b61069883612309565b5f83815268a20d6e21d0e525530c6020526040902080546001600160a01b03191690556104fc565b63f4d678b85f526004601cfd5b6106d781886116f1565b54610490576001600160a01b036106ed8361228a565b16036106f95787610490565b6359c896be5f526004601cfd5b63a11481005f526004601cfd5b6340739bf05f526004601cfd5b63ea553b345f526004601cfd5b9350935063ffffffff61074760015f198401811b016121af565b169385851093610453565b3461075957005b5f80fd5b5f3560e01c90816306fdde031461135257508063095ea7b3146112b15780630ad9e7bf1461127957806310aa0ebb1461125457806316f0115b1461122c57806318160ddd14611204578063207d0636146111c157806323b872dd1461111b578063274e430b146110ee5780632a6a935d1461107c5780632f745c5914610fe3578063313ce56714610fc85780634ef41efc14610f985780634f6ccce714610f7a57806355f804b314610e215780635b2aa23914610bcb5780636c0360eb14610b3957806370a0823114610b0a578063715018a614610ac65780638902653814610a995780638da5cb5b14610a72578063907af6c014610a3857806395d89b411461095e578063a9059cbb1461092d578063dd62ed3e146108f95763f2fde38b14610887575f61000f565b34610759576020366003190112610759576108a061141e565b6108a86116ad565b6001600160a01b031680156108e6575f80546001600160a01b03198116831782556001600160a01b0316905f8051602061244e8339815191529080a3005b631e4fbdf760e01b5f525f60045260245ffd5b3461075957604036600319011261075957602061092561091761141e565b61091f611434565b90611647565b604051908152f35b346107595760403660031901126107595761095361094961141e565b602435903361170f565b602060405160018152f35b34610759575f366003190112610759576040515f60025461097e816114af565b8084529060018116908115610a1457506001146109b6575b6109b2836109a68185038261148c565b604051918291826113f4565b0390f35b60025f9081527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b8082106109fa575090915081016020016109a6610996565b9192600181602092548385880101520191019092916109e2565b60ff191660208086019190915291151560051b840190910191506109a69050610996565b34610759575f3660031901126107595760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610759575f366003190112610759575f546040516001600160a01b039091168152602090f35b34610759575f36600319011261075957610ab16116ad565b6004805460ff60a01b1916600160a01b179055005b34610759575f36600319011261075957610ade6116ad565b5f80546001600160a01b0319811682556001600160a01b03165f8051602061244e8339815191528280a3005b34610759576020366003190112610759576020610b2d610b2861141e565b61144a565b5460a01c604051908152f35b34610759575f366003190112610759576040515f600354610b59816114af565b8084529060018116908115610a145750600114610b80576109b2836109a68185038261148c565b60035f9081525f8051602061242e833981519152939250905b808210610bb1575090915081016020016109a6610996565b919260018160209254838588010152019101909291610b99565b34610759576020366003190112610759576004356001600160401b0381116107595736602382011215610759576004810135906001600160401b038211610e0d578160051b60405192610c21602083018561148c565b8352602460208401918301019136831161075957602401905b828210610dfd57838051907f00000000000000000000000000000000000000000000000000000000000000008083029280840482149015171561067b57335f52600560205260405f205492610c8e3361144a565b5460a01c610c9c8286611562565b11610db957610cae610cb49285611544565b93611562565b335f52600560205260405f2055610cca3361144a565b9163ffffffff610cd93361146b565b935460801c16905f905b8351821015610db75760208260051b8501015183811015610d7357818110610d69578181600193849303610d1d575b5001915b0190610ce3565b8063ffffffff848a61066282610d36610d6397846121d3565b610d51818a610d4581886121d3565b9661065d888c8361221d565b888616919086165f1901811b016121ef565b87610d12565b5090600190610d16565b60405162461bcd60e51b815260206004820152601c60248201527b546f6b656e20494420696e646578206f7574206f6620626f756e647360201b6044820152606490fd5b005b60405162461bcd60e51b815260206004820152601c60248201527b4e6f7420656e6f7567682062616c616e636520746f20667265657a6560201b6044820152606490fd5b8135815260209182019101610c3a565b634e487b7160e01b5f52604160045260245ffd5b34610759576020366003190112610759576004356001600160401b03811161075957366023820112156107595760048101356001600160401b03811161075957366024828401011161075957610e756116ad565b610e806003546114af565b601f8111610f2a575b505f601f8211600114610ec55781925f92610eb7575b50508160011b915f199060031b1c1916176003555f80f35b602492500101358280610e9f565b601f1982169260035f5260205f20915f5b858110610f0f57508360019510610ef3575b505050811b01600355005b01602401355f19600384901b60f8161c19169055828080610ee8565b90926020600181926024878701013581550194019101610ed6565b60035f525f8051602061242e833981519152601f830160051c81019160208410610f70575b601f0160051c01905b818110610f655750610e89565b5f8155600101610f58565b9091508190610f4f565b3461075957602036600319011261075957602061092560043561156f565b34610759575f3660031901126107595768a20d6e21d0e5255309546040516001600160a01b039091168152602090f35b34610759575f36600319011261075957602060405160128152f35b3461075957604036600319011261075957610ffc61141e565b60243563ffffffff61100d8361144a565b5460801c1681101561103b5761103263ffffffff9161102d60209461146b565b6121d3565b16604051908152f35b60405162461bcd60e51b81526020600482015260196024820152784f776e657220696e646578206f7574206f6620626f756e647360381b6044820152606490fd5b34610759576020366003190112610759576004358015801580920361075957610953916110a83361144a565b91825460581c915f52337fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d642039360205fa2600260ff83169216151860011b1860011790611690565b3461075957602036600319011261075957602061111161110c61141e565b6114e7565b6040519015158152f35b346107595760603660031901126107595761113461141e565b61113c611434565b6044359061114a33846116d3565b926e22d473030f116ddee9f6b43ac78ba33314806111aa575b156111a2575f19935b60018501611180575b50610953935061170f565b84841161119557836109539503905584611175565b6313be252b5f526004601cfd5b83549361116c565b5060046111b68261144a565b5460581c1615611163565b34610759576020366003190112610759576111da61141e565b6111e26116ad565b600480546001600160a81b0319166001600160a01b0392909216919091179055005b34610759575f36600319011261075957602068a20d6e21d0e52553085460a01c604051908152f35b34610759575f366003190112610759576004546040516001600160a01b039091168152602090f35b34610759575f36600319011261075957602060ff60045460a01c166040519015158152f35b34610759576020366003190112610759576001600160a01b0361129a61141e565b165f526005602052602060405f2054604051908152f35b34610759576040366003190112610759576112ca61141e565b6001600160a01b038116906024359081906112fc906e22d473030f116ddee9f6b43ac78ba38514611330575b336116d3565b555f52337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b61134d61133c3361144a565b600460ff825460581c161790611690565b6112f6565b34610759575f366003190112610759575f60015461136f816114af565b8084529060018116908115610a145750600114611396576109b2836109a68185038261148c565b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106113da575090915081016020016109a6610996565b9192600181602092548385880101520191019092916113c2565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361075957565b602435906001600160a01b038216820361075957565b6001600160a01b03165f90815268a20d6e21d0e52553136020526040902090565b6001600160a01b03165f90815268a20d6e21d0e52553106020526040902090565b601f909101601f19168101906001600160401b03821190821017610e0d57604052565b90600182811c921680156114dd575b60208310146114c957565b634e487b7160e01b5f52602260045260245ffd5b91607f16916114be565b906114f18261144a565b5460581c9160016002841615159316156115085750565b3b15159150565b60609060208152601a602082015279476c6f62616c20696e646578206f7574206f6620626f756e647360301b60408201520190565b811561154e570490565b634e487b7160e01b5f52601260045260245ffd5b9190820180921161067b57565b9068a20d6e21d0e52553085463ffffffff8160801c1683101561162e576115ba907f00000000000000000000000000000000000000000000000000000000000000009060a01c611544565b905f925f5b8381106115e35760405162461bcd60e51b8152806115df6004820161150f565b0390fd5b806001018060011161067b5763ffffffff6116008360011b6121af565b1661160f575b506001016115bf565b8286929614611625575060018091019490611606565b93505050915090565b60405162461bcd60e51b8152806115df6004820161150f565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba314611675575b611671916116d3565b5490565b60046116808361144a565b5460581c166116685750505f1990565b805460ff60581b191660589290921b60ff60581b16919091179055565b5f546001600160a01b031633036116c057565b63118cdaa760e01b5f523360045260245ffd5b9060285260145268a20d6e21d0e525530f5f5260485f20905f602852565b9060285260145268a20d6e21d0e525530b5f5260485f20905f602852565b6004549092906001600160a01b038381169082161490816121a0575b50612191576001600160a01b03831615158061215b575b61210b576001600160a01b038216156107205761175e8361144a565b6117678361144a565b68a20d6e21d0e5255309546001600160a01b031615610713576040519161018083016001600160401b03811184821017610e0d576040525f83525f60208401525f60808401525f60a08401525f60c08401525f60e08401525f6101008401525f6101208401525f6101408401525f610160840152805463ffffffff8160801c16604085015263ffffffff835460801c1660608501528060a01c85116106c05761182060a082901c8690036001600160601b0316836122c3565b825460a01c85019061183b6001600160601b038316856122c3565b611870604086015191877f00000000000000000000000000000000000000000000000000000000000000009160a01c03611544565b8082039111028452611881866114e7565b156120a3575b50611e9e565b68a20d6e21d0e52553085463ffffffff60208501518551928382848360801c1601038060808901528360801b9060801b16908360801b191617928368a20d6e21d0e52553085501916040519260c060a085019180835260051b850101604052836040015260c0830183528261016087015260601c166101208501528351611d7e575b505060208201516119f4575b50610140810151806119b0575b5061016001518061195e575b505f9081526001600160a01b0391821692909116905f8051602061246e83398151915290602090a3565b600160206040828060a01b0368a20d6e21d0e5255309541693015192603f19840193849163263c69d6835283601f198301525f825160051b6044019260231901915af19151141615610759575f611934565b600160205f9281838060a01b0368a20d6e21d0e5255309541691015190815160051b60840190607f19830195869360631901915af19151141615610759575f611928565b9194610160829492015160208360601b910152611a108261146b565b9463ffffffff611a20848661232a565b1660e086015268a20d6e21d0e5255308549263ffffffff611a647f00000000000000000000000000000000000000000000000000000000000000008660a01c611544565b9460201c168481119081150217610100870152611a9960608701519563ffffffff602089015188018060c08b015216906122e6565b63ffffffff68a20d6e21d0e52553085460401c169760015b15611d1f575b6101208701515f9063ffffffff8b8116911614611b6d57611b6863ffffffff60018c01169a60e0641fffffffe0631fffffff8360031c1668a20d6e21d0e525531160601b01549260051b16161c63ffffffff165b8060081c685106b710e87292a98760611b0160018260ff161b8019825416179055611b3d63ffffffff82168a8d61221d565b611b5d63ffffffff60e08c01511663ffffffff60018c019b1690836123ba565b6101608a0151612417565b611ab1565b949798939291906101008801515b63ffffffff611b8f5f19830160011b6121af565b1615611cfb575f19906001810160081c685106b710e87292a98760611b018054196001830160ff1690811c901b8015611c83575b80611bd9575b5050508981119081150217611b7b565b600180939450811901167e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405601f6101e07a1412563212c14164235266736f7425221143267a4524367526767760fc7b2aaaaaaaba69a69a6db6db6db2cb2cb2ce739ce73def7bdeffffffff860260f81c161b60f71c1692831c63d76453e004161a179082685106b710e87292a98760611b03190160081b17910181108a8211175f03175f8080611bc9565b506001909c9895929c9a9794919a9693965b01805419685106b710e87292a98760611b60088e901c0182118117611cbd5750600190611c95565b9c9295989c9a9194979a969396808d60081c685106b710e87292a98760611b018311611cea575b50611bc3565b508c1960ff1690811b901c80611ce4565b611b68909a999691929394959a6001810188811190811502176101008b0152611b0b565b60c08701518603611ab757945094925094509468a20d6e21d0e52553085463ffffffff60201b61010084015160201b169163ffffffff60401b9060401b1690600160201b600160601b031916171768a20d6e21d0e5255308555f61191b565b602060018860609a9699959a989497981b17910152611d9c8261146b565b94611dbc60408801519563ffffffff895188038060a08c015216906122e6565b60015b15611e85575b5f945f190194611dd586886121d3565b63ffffffff8116905f1982018060021c685106b710e87292a98960611b019060c082549160061b1681811c60018060401b0316901b189055611e1c826101608c0151612417565b600160ff62ffffff8360081c16685106b710e87292a98760611b0192161b198154169055611e49816123f9565b611e54575b50611dbf565b611e5d81612309565b5f90815268a20d6e21d0e525530c6020526040812080546001600160a01b0319169055611e4e565b60a08701518503611dc557935093509390945f8061190f565b9194604086979294970151948651976020880151898110818b18028a1899888b108b8a18028914612094578a8918898c10028918908190038a52900360208901526001600160a01b0383811690831614612072576040805163144027d3818301526001600160a01b03858116606080840191909152908516608083015260a08201528a8918898c1002891860c0820181815260059190911b820160e090810190935260208201529081018152610140890152611f598361146b565b95611f638361146b565b9763ffffffff611f73858461232a565b1660e08b015260608a01519a81811090821802188a019560015b1561202c575b878b611fd78163ffffffff808f8f90611fcb60e09284611fc25f9b5f19604087015101908160408801526121d3565b1698899161221d565b015116911690836123ba565b6101408c015160208151838152019052611ff0816123f9565b611ffb575b50611f8d565b61200481612309565b5f90815268a20d6e21d0e525530c6020526040812080546001600160a01b0319169055611ff5565b9960010199868b03611f935793989550939861205992975063ffffffff91965080606087015216836122e6565b61206d63ffffffff604085015116826122e6565b61188d565b949297868198959398979297109082180218606084015101606084015261188d565b5050949297509450949161188d565b6120e2906001600160a01b03888116908816146120f8575b7f000000000000000000000000000000000000000000000000000000000000000090611544565b606084015180820391110260208401525f611887565b60408501518551900360608601526120bb565b60405162461bcd60e51b815260206004820152602260248201527f5472616e73666572206578636565647320617661696c61626c652062616c616e604482015261636560f01b6064820152608490fd5b506121658361144a565b5460a01c81810390811161067b576001600160a01b0384165f9081526005602052604090205411611742565b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f61172b565b60e08160031c685106b710e87292a98960611b01549160051b161c63ffffffff1690565b60e0908260031c9060601b01549160051b161c63ffffffff1690565b9060e08260031c685106b710e87292a98960611b019260051b1682549182821c1863ffffffff16901b189055565b60e0909291928360031c9060601b019260051b1682549182821c1863ffffffff16901b189055565b63ffffffff165f5268a20d6e21d0e525530a60205260405f2090565b6001600160a01b03906122859061027b90600160201b8110025f190160011b6121af565b541690565b6001600160a01b0361229b82612261565b161561035e575f90815268a20d6e21d0e525530c60205260409020546001600160a01b031690565b80546001600160a01b031660a09290921b6001600160a01b031916919091179055565b805463ffffffff60801b191660809290921b63ffffffff60801b16919091179055565b60018160081c68a20d6e21d0e525530d60601b019160ff161b198154169055565b805460601c63ffffffff1692918315612341575050565b68a20d6e21d0e5255308805463ffffffff19811663ffffffff918216600101918216908117909255835463ffffffff60601b191660609190911b63ffffffff60601b1617909255909250829061239682612245565b80546001600160a01b0319166001600160a01b039092169190911790551561075957565b5f1901908160021c685106b710e87292a98960611b019260c084549360061b169163ffffffff169060201b1782821c1860018060401b0316901b189055565b8060081c68a20d6e21d0e525530d60601b01549060ff161c60011690565b9060209082519060081b8284015117815201905256fec2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c634300081a000a608034607857601f610d4138819003918201601f19168301916001600160401b03831184841017607c57808492602094604052833981010312607857516001600160a01b03811690819003607857683602298b8c10b0123180546001600160a01b031916919091179055604051610cb090816100918239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60808060405260043610156101c5575b5036156101ba575f3560e01c63263c69d681146101405763144027d381146100cf57630f4599e51461004857633c10b94e5f526004601cfd5b683602298b8c10b01231546001600160a01b0316806100ab575b50683602298b8c10b01230546001600160a01b03811661009e576001600160a01b0319163317683602298b8c10b012305560015f908152602090f35b63bf656a465f526004601cfd5b6004356001600160a01b0316036100c2575f610062565b63c59ec47a5f526004601cfd5b683602298b8c10b01230546001600160a01b03163303610133576004356024359060443591602483810193600481013560051b0101925b8381036101165760015f5260205ff35b803582845f80516020610c848339815191525f80a4602001610106565b63363cb3125f526004601cfd5b683602298b8c10b01230546001600160a01b0316330361013357600435602481810191600481013560051b0101905b81810361017f5760015f5260205ff35b8035600881901c6001600160581b03169060018116801560609290921c91820291025f80516020610c848339815191525f80a460200161016f565b346101c157005b5f80fd5b5f3560e01c90816301ffc9a714610aa85750806306fdde0314610a3d578063081812fc146109e6578063095ea7b31461096457806318160ddd1461091857806323b872dd1461090457806324359879146108ad5780632f745c591461083c57806342842e0e146107c95780634f6ccce7146107325780636352211e146107035780636cef16e61461063757806370a08231146105da5780638da5cb5b146105aa57806395d89b411461053f57806397e5311c14610513578063a22cb46514610487578063b88d4fde1461039d578063c87b56dd146103215763e985e9c5146102ad575f61000f565b346101c15760403660031901126101c1576102c6610b1c565b60205f6044601c6102d5610b32565b6102dd610c25565b604080516362fb246d87526001600160a01b039889168852979092169091525afa601f3d1116156103195760405260205f516040519015158152f35b3d5f823e3d90fd5b346101c15760203660031901126101c15760043561033e81610c4f565b505f806024601c61034d610c25565b6040519563cb30b46085526020525afa15610319576103999060205f803e60205f51823e805160205f5101602083013e6040815182015f60208201520160405260405191829182610af2565b0390f35b60803660031901126101c1576103b1610b1c565b6103b9610b32565b60443591606435916001600160401b0383116101c157366023840112156101c1576004830135926001600160401b0384116101c15736602485830101116101c157610405858385610b82565b813b61040d57005b83602094602460a49360405198899763150b7a028952338a8a015260018060a01b0316604089015260608801526080808801528260a08801520160c086013701905f601c8401915af115610479575b5163757a42ff60e11b0161046c57005b63d1a57ed65f526004601cfd5b3d1561045c573d5f823e3d90fd5b346101c15760403660031901126101c1576104a0610b1c565b6024358015158091036101c15760205f6064601c826104bd610c25565b9660018060a01b0316966040519663f6916ddd8352888752604052336060525af160015f511416156103195750337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206040a3005b346101c1575f3660031901126101c157602061052d610c25565b6040516001600160a01b039091168152f35b346101c1575f3660031901126101c157610557610c25565b5f806024601c604051946395d89b418452836020525afa15610319576103999060205f803e60205f51823e805160205f5101602083013e6040815182015f60208201520160405260405191829182610af2565b346101c1575f3660031901126101c157683602298b8c10b01232546040516001600160a01b039091168152602090f35b346101c15760203660031901126101c1576001600160a01b036105fb610b1c565b1660205f6044601c61060b610c25565b6040519563f5b100ea85528552836040525afa601f3d1116156103195760405260205f51604051908152f35b346101c1575f3660031901126101c15761064f610c25565b683602298b8c10b012325460205f6004601c60018060a01b03851695638da5cb5b84525afa9081601f3d1116600c5160601c0291156106ec575b506001600160a01b0316908181036106a7575b602060405160018152f35b683602298b8c10b0123280546001600160a01b031916831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3808061069c565b60601b6001600160601b0319166101c15782610689565b346101c15760203660031901126101c15760206001600160a01b03610729600435610c4f565b16604051908152f35b346101c15760203660031901126101c157602460206001600160a01b03610757610c25565b1660405192838092634f6ccce760e01b825260043560048301525afa80156107be575f9061078b575b602090604051908152f35b506020813d6020116107b6575b816107a560209383610bee565b810103126101c15760209051610780565b3d9150610798565b6040513d5f823e3d90fd5b6107d236610b48565b916107de838383610b82565b813b6107e657005b60a460209260405194859363150b7a028552338686015260018060a01b0316604085015260608401526080808401525f60a08401525f3681375f601c8401915af115610479575163757a42ff60e11b0161046c57005b346101c15760403660031901126101c157610855610b1c565b60206001600160a01b03610867610c25565b604051632f745c5960e01b81526001600160a01b039094166004850152602480359085015283916044918391165afa80156107be575f9061078b57602090604051908152f35b346101c15760203660031901126101c1576108c6610c25565b60205f6044601c6040519463c016aa5284526004358552836040525afa601f3d1116156103195760408190525f516001600160a01b03168152602090f35b61091661091036610b48565b91610b82565b005b346101c1575f3660031901126101c157610930610c25565b60205f6044601c6040519463e2c792818452838552836040525afa601f3d1116156103195760405260205f51604051908152f35b60403660031901126101c157610978610b1c565b60243590610984610c25565b9060018060a01b03169060205f6064601c6040519463d10b6e0c8452868552876040523360605234905af1601f3d1116156103195750600c5160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a4005b346101c15760203660031901126101c1576109ff610c25565b60205f6044601c604051946327ef549584526004358552836040525afa601f3d1116156103195760408190525f516001600160a01b03168152602090f35b346101c1575f3660031901126101c157610a55610c25565b5f806024601c604051946306fdde038452836020525afa15610319576103999060205f803e60205f51823e805160205f5101602083013e6040815182015f60208201520160405260405191829182610af2565b346101c15760203660031901126101c157600435906001600160e01b0319821682036101c15760209160e01c635b5e139f8114906301ffc9a76380ac58cd82149114171715158152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101c157565b602435906001600160a01b03821682036101c157565b60609060031901126101c1576004356001600160a01b03811681036101c157906024356001600160a01b03811681036101c1579060443590565b9060846020610b8f610c25565b6040805163e5eb36c881526001600160a01b03968716848201819052959096169086018190526060860187905233608087015294928391601c83019034905af16001825114161561031957505f80516020610c848339815191525f80a4565b601f909101601f19168101906001600160401b03821190821017610c1157604052565b634e487b7160e01b5f52604160045260245ffd5b683602298b8c10b01230546001600160a01b0316908115610c4257565b635b2a47ae5f526004601cfd5b60205f6044601c610c5e610c25565b60405195632d8a746e85528552836040525afa601f3d111615610319576040525f519056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c634300081a000a' as const;\n","export default '0x60a06040523461042657604051615d4738819003601f8101601f191683016001600160401b0381118482101761042a5783928291604052833981010361016081126104265781516001600160a01b03811681036104265760208301516001600160a01b038116939084900361042657610100604082015193605f190112610426576040519061010082016001600160401b0381118382101761042a57604052606081015182526100b16080820161045e565b602083019081526100c460a0830161045e565b926040810193845260c083015194606082019586526100e560e0850161045e565b608083015261010084015162ffffff811681036104265760a0830152610120840151936001600160801b03851685036104265760c08301948552610140015160e08301526080525f6101a061013861043e565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201525f6101a061019661043e565b6001815260016020820152600160408201526001606082015260016080820152600160a0820152600160c08201528260e0820152600161010082015282610120820152826101408201528261016082015282610180820152015261200030161515600114801590610415575b8015610404575b80156103f3575b80156103e2575b80156103d1575b80156103c1575b80156103b5575b80156103a5575b8015610399575b801561038d575b8015610381575b8015610375575b8015610369575b610356576102b99660018060a01b03195f5416175f5585600d5551600255519162ffffff600354915160181b926601000000000000600160b01b03905160301b1693169060018060b01b031916179065ffffff000000161717600355519061046c565b600e55600160105560405161587190816104d68239608051818181601c0152818161031d015281816103bf015281816105640152818161095f015281816109f801528181610b5501528181610ec0015281816114f801528181611b6a01528181611c9c01528181611f2b01528181612114015281816122d001528181614508015281816146010152818161475801528181614a4e0152614e890152f35b630732d7b560e51b5f523060045260245ffd5b50600130161515610256565b5060023016151561024f565b50600430161515610248565b50600830161515610241565b5060103016151561023a565b5060203016151560011415610233565b5060403016151561022c565b5060803016151560011415610225565b50610100301615156001141561021e565b506102003016151560011415610217565b506104003016151560011415610210565b506108003016151560011415610209565b506110003016151560011415610202565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051906101c082016001600160401b0381118382101761042a57604052565b51908160020b820361042657565b808202905f1983820990828083109203918083039283612710111561042657146104ca577fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e9193612710910990828211900360fc1b910360041c170290565b50506127109150049056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b6393c866c160e01b5f5260045ffd5b5f905f3560e01c90816303fa14c9146125a8575080630cbf54c81461258b578063182148ef14612531578063186a0b89146124af57806319b45b20146124615780631b2bf4dd1461231d57806321d0ee70146122bc578063252cf2d214612290578063259982e5146120ff5780632daebaef146120d957806334d028b2146120b6578063372ebb6114612099578063392e53cd14612077578063449a817614611ff35780634b449cba14611fd657806356cd69da14611fb357806356dec87114611f96578063575e24b414611ed55780635760f2e314611e4e5780635a5b309014611d855780635ac22dd114611d2d578063616f39ff14611d0d57806363b2011714611cf05780636c2bbe7e14611c865780636fe7e6eb14611b2f578063748bfe6514611b05578063791b98bc14611add5780637e57bd0c14611ac05780638416d3b614611aa3578063899346c714611a8657806391dd7346146114c557806399fbab88146113fa5780639b21d8a8146113bf5780639ce110d7146113985780639d4e31531461136e5780639f063efc14610ea8578063a4d0a17e14610a95578063b06faf6214610a72578063b1c9fe6e14610a32578063b47b2fb11461099e578063b6a8b0fa14610948578063bb6db7d11461092a578063c4e833ce146107bd578063c7e6b08b1461079f578063c80951821461077e578063ce5494bb14610593578063dc4c90d31461054e578063dc98354e1461038e578063dcf93f3214610368578063e1b4af6914610306578063eb54f9ec146102e8578063f1db23dc146102ca5763f223e2b20361000f57346102c757806003193601126102c7576020600e54604051908152f35b80fd5b50346102c757806003193601126102c7576020600c54604051908152f35b50346102c757806003193601126102c7576020600454604051908152f35b50346102c75760049061031836612762565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303925061035c91505057630a85dc2960e01b8152fd5b63570c108560e11b8152fd5b50346102c757806003193601126102c757602060ff60035460b01c166040519015158152f35b50346102c75760e03660031901126102c7576103a86125ca565b60a036602319011261050b576103bc612722565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361053f5781546001600160a01b0390811691160361053057600a5460ff81166105225760ff60035460b81c16156105135760ff1916600117600a556001600160a01b036024359081169081810361050f5750600780546001600160a01b0319169190911790556044356001600160a01b0381169081810361050f5750600880546001600160a01b03191691909117905560643562ffffff8116810361050b576008549062ffffff60a01b9060a01b169062ffffff60a01b1916176008556084358060020b810361050b576008549060b81b62ffffff60b81b169062ffffff60b81b19161760085560a4359060018060a01b0382168092036102c75750600980546001600160a01b031916919091179055604051636e4c1aa760e11b8152602090f35b5080fd5b8280fd5b63500b395360e01b8252600482fd5b62dc149f60e41b8252600482fd5b638341a67960e01b8152600490fd5b63570c108560e11b8252600482fd5b50346102c757806003193601126102c7576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102c75760203660031901126102c7576105ad6125ca565b903068929eee149b4bd212685414610771573068929eee149b4bd212685580546001600160a01b031633036105305760ff60065416600481101561075d5760030361074e5760e091610606600a5460081c60020b613556565b6007546008549193916001600160a01b03908116911661062581613883565b9061062f83613883565b91600e54601e548181105f146107465761064891612862565b60035460b01c60ff161561071557808211156107075761066e6106739161067993612862565b6138f4565b926138f4565b915b6001600160801b031691826106f7575b6001600160801b03169485806106e6575b5050600160ff19600f541617600f553868929eee149b4bd21268556040519560018060a01b0316865260208601528260408601526060850152608084015260a083015260c0820152f35b6106f09185613919565b5f8561069c565b610702838784613919565b61068b565b5050610679610673856138f4565b9061071f906138f4565b928181111561073b576107359161066e91612862565b9161067b565b5050610735846138f4565b505084610648565b63472fd19960e01b8152600490fd5b634e487b7160e01b82526021600452602482fd5b63ab143c0690526004601cfd5b50346102c757806003193601126102c757602060195460020b604051908152f35b50346102c757806003193601126102c757602060405162278d008152f35b50346102c757806003193601126102c7576020816101c0926101a06040516107e4816128c9565b82815282858201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152015280604051610842816128c9565b600181528381016001815260408201600181526060830160018152608084016001815260a085016001815260c08601906001825260e0870192888452610100880194600186526101208901968a88526101408a01988b8a526101a06101608c019b8d8d5261018081019d8e52019c8d526040519d8e916001835251151591015251151560408d015251151560608c015251151560808b015251151560a08a015251151560c089015251151560e08801525115156101008701525115156101208601525115156101408501525115156101608401525115156101808301525115156101a0820152f35b50346102c757806003193601126102c7576020601f54604051908152f35b50346102c75760049061095a36612762565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303925061035c9150505763567d91d160e01b8152fd5b50346102c7576101603660031901126102c7576109b96125ca565b5060a03660231901126102c75760603660c31901126102c757610144356001600160401b03811161050b57906109f460049236908401612600565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361035c57630a85dc2960e01b8152fd5b50346102c757806003193601126102c75760ff60065416604051906004811015610a5e57602092508152f35b634e487b7160e01b83526021600452602483fd5b50346102c757806003193601126102c757602060ff600f54166040519015158152f35b50346102c757806003193601126102c7573068929eee149b4bd212685414610771573068929eee149b4bd212685560ff60065416600481101561075d5760018103610e99576005544210610e8a57610afe610af5600d54600e5490612862565b600b5490612862565b9060ff60175460301c16908215159182610e81575b506002908160ff1960065416176006555f805160206158458339815191528580a3601d5460175460ff8160301c16610d72575b50601a5515610d4b57610ba7827f00000000000000000000000000000000000000000000000000000000000000009260405190602082015260208152610b8d60408261291b565b604051809381926348c8949160e01b835260048301612738565b0381836001600160a01b0387165af18015610d4057610c94575b50610bda610be29160a0610bd3612955565b20906131e7565b505050613286565b600a549060081b63ffffff00169063ffffff00191617600a555b62278d004201804211610c8057601f55600360ff1960065416176006557f95f375ed30b2b45b5972e603757856d943ae68c3892f07064c3b1587aaa932306060604051600360025f805160206158458339815191528680a3600a5460081c60020b600b54600c5491835260208301526040820152a13868929eee149b4bd212685580f35b634e487b7160e01b82526011600452602482fd5b3d8084833e610ca3818361291b565b810190602081830312610d38578051906001600160401b038211610d3c57019181601f84011215610d38578251926001600160401b038411610d245760405192859190610cfa601f8701601f19166020018661291b565b8585526020868301011161050b5784610bda94610be29660208094018483015e0101529150610bc1565b634e487b7160e01b85526041600452602485fd5b8380fd5b8480fd5b6040513d85823e3d90fd5b50610d5461350f565b600a549060081b63ffffff00169063ffffff00191617600a55610bfc565b6002949293940b5b60175460181c60020b90818160020b13610e7657610d9a610da991612c0b565b610da3836134d6565b90614029565b91909115908115610e69575b50610e5d57610dcc60085460b81c60020b8261438a565b610dd581613c03565b60020b80845260156020908152604080862083875260149092528520546001600160801b03169081610e13575b505050610e0e906134d6565b610d7a565b906001610e21920154612eea565b908452601b602052604084205490818111610e3d575b80610e02565b92610e4f610e5592610e0e9495612862565b906127b9565b91905f610e37565b50929190925b5f610b46565b90508160020b135f610db5565b505092919092610e63565b91506002610b13565b636463738960e01b8252600482fd5b6334dc687f60e11b8252600482fd5b50346102c757610eb7366126b9565b939550935050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361135f5760ff60065416600481101561134b57600114610f1c575b604080516327c18fbf60e21b815260208101869052f35b610f25916139ab565b610f3260408301356138f4565b90610f44610f3f84612a57565b613c03565b610f4d83612a57565b60020b8452601560205260016040852001549260105492610f6d846134c8565b601055610f7982612a57565b926020830190611080610f8b83612a57565b9560405198610f998a6128ae565b88600360018060a01b0386169b8c8152602081019460020b8552604081019a60020b8b528d6060820160018060801b038b169c8d978883526040608086019489865260a0870198818a5281526011602052209460018060a01b0390511660018060a01b03198654161785555184549060a01b62ffffff60a01b169062ffffff60a01b19161784555183549060b81b60190b62ffffff60b81b169062ffffff60b81b191617835560018060801b03905116600183019060018060801b031660018060801b0319825416179055516002820155019051151560ff80198354169116179055612eea565b61108985612a57565b60020b8952601b6020526110a260408a209182546127b9565b90556110e16110b96110b386612a57565b93612a57565b6110d3604051938492602084019660608a01359288612a65565b03601f19810183528261291b565b51902080875260136020526040872054801515908161132a575b506113185786526013602052836040872055848652601260205260408620805490600160401b821015611304579061113891600182018155612690565b81549060031b9086821b915f19901b191617905561115d61115883612a57565b613eec565b61116682612a57565b60020b865260146020526040862080546001600160801b0390811685019081116112f05781546001600160801b0319166001600160801b039091161790557f5bbfb03bc7e9fc21614928f1a31e76f9d340d606c52a1d9cc823d44b5d94d8bc92604092909161126f91907f6f7dc586dcd0f870dfcef836487dc00343dd204c48a882e20c176ffe3af056626111fa83612a57565b61120384612a57565b60020b8b52601460205260018060801b03878c2054169061122c885192839260020b9583612efd565b0390a2611237613fa9565b61124081612a57565b60020b8852601560205283882061125e61125983612a57565b6139c9565b806112e1575b611286575b50612a57565b9082519160020b82526020820152a35f8080610f05565b60028101805460ff191660011790554290556112a181612a57565b6112aa82612a57565b60020b895260146020525f80516020615805833981519152602060018060801b03878c20541692875193845260020b92a25f611269565b5060ff60028201541615611264565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b88526041600452602488fd5b63f13a34ab60e01b8752600452602486fd5b885250601160205260408720600101546001600160801b031615155f6110fb565b634e487b7160e01b85526021600452602485fd5b63570c108560e11b8452600484fd5b50346102c75760203660031901126102c75760406020916004358152601c83522054604051908152f35b50346102c757806003193601126102c757546040516001600160a01b039091168152602090f35b50346102c75760203660031901126102c7576020906113dc6125e0565b60020b815260148252604060018060801b0391205416604051908152f35b50346102c75760203660031901126102c757604060c0916114196129a2565b506004358152601160205220604051611431816128ae565b81549160018060a01b0383169283835260208301908060a01c60020b8252604084019060b81c60020b815260018060801b03600184015416916060850192835260a060ff600360028701549660808901978852015416950194151585526040519586525160020b60208601525160020b604085015260018060801b03905116606084015251608083015251151560a0820152f35b50346119a95760203660031901126119a9576004356001600160401b0381116119a9576114f6903690600401612600565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038116939290913385900361004c5781602091810103126119a9573561154c60ff60035460b01c169161286f565b61155461314d565b90604051926115628461287f565b1515835260208084019182526001600160a01b03928316604080860191825251633cf3645360e21b815260075485166004820152600854808616602483015260a081901c62ffffff16604483015260b81c60020b6064820152600954851660848201529451151560a4860152915160c4850152905190911660e48301526101206101048301525f61012483018190528290610144908290885af190811561199e575f91611a54575b5060035460b01c60ff16156119f4578060801d5f81600f0b126119cc575b505f81600f0b136119ad575b8060801d9381600f0b9185600f0b5f81125f146119255750600754949586956001600160a01b0316833b156119215760405190632961046560e21b82526004820152868160248183885af19081156119165787916118fd575b50506007546116bd916001600160a01b039091169084906001600160801b03906116b69061293e565b1691613919565b604051630476982d60e21b815260208160048189875af180156118f2576118d3575b505b8483121561183d57506008546001600160a01b0316813b15610d3c5760405190632961046560e21b82526004820152848160248183865af1908115611832578591611818575b5050600854602092611751916001600160a01b03169083906001600160801b03906116b69061293e565b600460405180958193630476982d60e21b83525af1908115610d405761178692610bda926117e9575b505b60a0610bd3612955565b61178e61350f565b60035460b01c60ff16156117dc5760020b9060020b125b6117cd576040516117c9916117bb60208361291b565b815260405191829182612738565b0390f35b63eede5df960e01b8152600490fd5b60020b9060020b136117a5565b61180a9060203d602011611811575b611802818361291b565b8101906131d8565b505f61177a565b503d6117f8565b816118229161291b565b61182d57835f611727565b505050fd5b6040513d87823e3d90fd5b90919380939413611858575b505050610bda6117869161177c565b6008546001600160a01b0316823b15610d3857604051630b0d9c0960e01b8152928492849283918591839161189e916001600160801b03909116903090600485016131b6565b03925af180156118c8576118b3575b80611849565b816118bd9161291b565b61050b57815f6118ad565b6040513d84823e3d90fd5b6118eb9060203d60201161181157611802818361291b565b505f6116df565b6040513d88823e3d90fd5b816119079161291b565b61191257855f61168d565b8580fd5b6040513d89823e3d90fd5b8680fd5b5f12611934575b8495506116e1565b6007546001600160a01b031695823b156119a957604051630b0d9c0960e01b8152965f9188918291611977916001600160801b03909116903090600485016131b6565b038183865af1801561199e571561192c579350935f6119959161291b565b5f92849061192c565b6040513d5f823e3d90fd5b5f80fd5b600c546119c4906001600160801b038316906127b9565b600c55611634565b6119eb906001600160801b03906119e29061293e565b16600b546127b9565b600b555f611628565b80600f0b5f8112611a35575b508060801d5f81600f0b13611a16575b50611634565b600c54611a2c916001600160801b0316906127b9565b600c555f611a10565b611a4b906001600160801b03906119e29061293e565b600b555f611a00565b90506020813d602011611a7e575b81611a6f6020938361291b565b810103126119a957515f61160a565b3d9150611a62565b346119a9575f3660031901126119a9576020601054604051908152f35b346119a9575f3660031901126119a9576020601d54604051908152f35b346119a9575f3660031901126119a9576020601e54604051908152f35b346119a9575f3660031901126119a9576001546040516001600160a01b039091168152602090f35b346119a95760203660031901126119a9576004355f526013602052602060405f2054604051908152f35b346119a9576101003660031901126119a957611b496125ca565b5060a03660231901126119a957611b5e612722565b50611b676125f0565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611c775742600455611ba8600254426127b9565b60055560ff60065416600160ff1960065416176006556004811015611c635760807fa832766a05f1bd0298b0268308621777cfe1e4eea23afe7c06beea79bc6ddd2d916001604051915f805160206158458339815191525f80a3600454600554600d5490600e54928452602084015260408301526060820152a160035460b01c60ff1615611c5957620d89e85b62ffffff19601954169062ffffff16176019556020604051636fe7e6eb60e01b8152f35b620d89e719611c35565b634e487b7160e01b5f52602160045260245ffd5b63570c108560e11b5f5260045ffd5b346119a957611c94366126b9565b9450929150507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611c7757611cd393612f17565b604080516001600160e01b03199093168352602083019190915290f35b346119a9575f3660031901126119a9576020600b54604051908152f35b346119a9575f3660031901126119a957602060035460020b604051908152f35b346119a95760403660031901126119a957611d466125ca565b6001600160a01b03165f908152601260205260409020805460243591908210156119a957602091611d7691612690565b90549060031b1c604051908152f35b346119a95760203660031901126119a957611d9e6125ca565b3068929eee149b4bd212685414611e41573068929eee149b4bd2126855611dc36129d2565b601f54421115611e3257600e5490611dde601e548093612862565b918215611e23575f8051602061582583398151915291602091600e55611e048482612a15565b6040519384526001600160a01b031692a23868929eee149b4bd2126855005b637363096360e11b5f5260045ffd5b63152b1b0d60e21b5f5260045ffd5b63ab143c065f526004601cfd5b346119a95760203660031901126119a957611e676125ca565b5f546001600160a01b03163303611ec6576001600160a01b03168015611eb7576001546001600160a01b038116611ea8576001600160a01b03191617600155005b631241ac0960e21b5f5260045ffd5b63ed5f09f160e01b5f5260045ffd5b638341a67960e01b5f5260045ffd5b346119a9576101403660031901126119a957611eef6125ca565b60a03660231901126119a95760603660c31901126119a957610124356001600160401b0381116119a957611f27903690600401612600565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611c7757306001600160a01b0390911603611f875760606040516315d7892d60e21b81525f60208201525f6040820152f35b638e00b19d60e01b5f5260045ffd5b346119a9575f3660031901126119a9576020600d54604051908152f35b346119a9575f3660031901126119a957602060035460181c60020b604051908152f35b346119a9575f3660031901126119a9576020600554604051908152f35b346119a95760203660031901126119a9576004358015158091036119a9575f546001600160a01b03163303611ec65760ff600a54166120695760035460ff8160b81c1661205a5761ffff60b01b191660b09190911b60ff60b01b1617600160b81b17600355005b63905a47ad60e01b5f5260045ffd5b62dc149f60e41b5f5260045ffd5b346119a9575f3660031901126119a957602060ff600a54166040519015158152f35b346119a9575f3660031901126119a9576020601a54604051908152f35b346119a9575f3660031901126119a9576020600a5460081c60020b604051908152f35b346119a95760203660031901126119a95760206120f76004356127da565b604051908152f35b346119a95761210d3661262d565b50909290507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611c7757306001600160a01b03821603612281575b5060ff600654166004811015611c6357600103612272576005544210156122635760606121809101612a57565b9060208101916121a161219284612a57565b61219b84612a57565b90612c26565b9060020b9060020b03612254576121b661350f565b6003549260ff8460b01c165f1461223357506121d182612a57565b9060020b9060020b126122245760406121ec915b01356138f4565b6001600160801b0360309290921c82169116106122155760405163259982e560e01b8152602090f35b63ab17922760e01b5f5260045ffd5b633b7caccd60e21b5f5260045ffd5b61223c90612a57565b9060020b9060020b136122245760406121ec916121e5565b633868ddbd60e01b5f5260045ffd5b638083ad0360e01b5f5260045ffd5b6334dc687f60e11b5f5260045ffd5b61228a9061396a565b82612153565b346119a9575f3660031901126119a95760035460405160309190911c6001600160801b03168152602090f35b346119a9576122ca3661262d565b919392507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303611c775760209361230a93612a97565b6040516001600160e01b03199091168152f35b346119a95760203660031901126119a9576004353068929eee149b4bd212685414611e41573068929eee149b4bd212685560ff600654166004811015611c635760030361245257601f544211612443575f81815260116020526040902080549091906001600160a01b03161561243457600382019182549260ff8416612425577ffe542bcb2f15de271468211386057898a183c9a98a1c824a4094b76180e1758e9160209160016123cd866127da565b9660ff19161790556123e185601e546127b9565b601e558461240a575b546040519485526001600160a01b031693a33868929eee149b4bd2126855005b80546124209086906001600160a01b0316612a15565b6123ea565b630c8d9eab60e31b5f5260045ffd5b636ec9be1160e01b5f5260045ffd5b630c89414f60e41b5f5260045ffd5b63472fd19960e01b5f5260045ffd5b346119a95760203660031901126119a95761247a6125e0565b60020b5f526015602052606060405f2080549060ff600260018301549201541690604051928352602083015215156040820152f35b346119a95760203660031901126119a9576124c86125ca565b6124d06129d2565b601a5461252257600e549081156125135760205f80516020615825833981519152915f600e556125008482612a15565b6040519384526001600160a01b031692a2005b637ecea47d60e11b5f5260045ffd5b631481bc7960e21b5f5260045ffd5b346119a9575f3660031901126119a957600754600854600954604080516001600160a01b039485168152838516602082015260a084811c62ffffff169282019290925260b89390931c60020b606084015292166080820152f35b346119a9575f3660031901126119a9576020600254604051908152f35b346119a9575f3660031901126119a95760209060ff60035460b81c1615158152f35b600435906001600160a01b03821682036119a957565b600435908160020b82036119a957565b60e435908160020b82036119a957565b9181601f840112156119a9578235916001600160401b0383116119a957602083818601950101116119a957565b906101606003198301126119a9576004356001600160a01b03811681036119a9579160a06023198201126119a957602491608060c3198301126119a95760c49161014435906001600160401b0382116119a95761268c91600401612600565b9091565b80548210156126a5575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b906101a06003198301126119a9576004356001600160a01b03811681036119a9579160a06023198201126119a957602491608060c3198301126119a95760c4916101443591610164359161018435906001600160401b0382116119a95761268c91600401612600565b60c435906001600160a01b03821682036119a957565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6101206003198201126119a9576004356001600160a01b03811681036119a9579160a06023198301126119a95760249160c4359160e4359161010435906001600160401b0382116119a95761268c91600401612600565b919082018092116127c657565b634e487b7160e01b5f52601160045260245ffd5b6127e381612c43565b156128395760a0015161285d576127f990612cc0565b801561285d5760ff600654166004811015611c635760038114908115612852575b501561283f57601a545b80156128395761283691600e54612e6a565b90565b50505f90565b61284d601d54610e4f613b1a565b612824565b60029150145f61281a565b505f90565b919082039182116127c657565b600160ff1b81146127c6575f0390565b606081019081106001600160401b0382111761289a57604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b0382111761289a57604052565b6101c081019081106001600160401b0382111761289a57604052565b60a081019081106001600160401b0382111761289a57604052565b60e081019081106001600160401b0382111761289a57604052565b601f909101601f19168101906001600160401b0382119082101761289a57604052565b600f0b60016001607f1b031981146127c6575f0390565b60405190612962826128e5565b6007546001600160a01b039081168352600854808216602085015260a081901c62ffffff16604085015260b81c60020b6060840152600954166080830152565b604051906129af826128ae565b5f60a0838281528260208201528260408201528260608201528260808201520152565b5f546001600160a01b03163303611ec65760ff600654166004811015611c63576003036124525760ff600f541615612a0657565b6308a027c760e31b5f5260045ffd5b90612a449160ff60035460b01c165f14612a46576007546001600160a01b03165b6001600160a01b0316613919565b565b6008546001600160a01b0316612a36565b358060020b81036119a95790565b60609190911b6001600160601b031916815260e891821b601482015291901b6017820152601a810191909152603a0190565b919290916001600160a01b0381163014612bfb57612ab49061396a565b60ff60065416926004841015611c635760018403612be257612ad79293506139ab565b612ae082612a57565b90612b0a612af060208501612a57565b6110d3604051938492602084019660608901359288612a65565b5190205f52601360205260405f2054801561243457612b2b61125983612a57565b612bd3575f526011602052612ba461066e6040805f20938151612b4d816128ae565b855460018060a01b03811682528060a01c60020b602083015260b81c60020b8382015260a060ff600360018060801b0360018a0154169860608501998a52600281015460808601520154161515910152013561286f565b90516001600160801b03908116911603612bc4575b63021d0ee760e41b90565b632b3dd84160e01b5f5260045ffd5b63bdc9917160e01b5f5260045ffd5b505050600203612bb9576334dc687f60e11b5f5260045ffd5b5063021d0ee760e41b9392505050565b60020b5f190190627fffff198212627fffff8313176127c657565b600291820b910b0390627fffff198212627fffff8313176127c657565b612c4b6129a2565b505f52601160205260405f2090604051612c64816128ae565b82546001600160a01b03811680835260a082811c600290810b602086015260b89390931c830b604085015260018601546001600160801b0316606085015291850154608084015260039094015460ff1615159082015291151590565b90612cca82612c43565b92909215612d25575f52601c60205260405f205491606081019060018060801b03825116612cf6575050565b612836929391816080612d126020610e4f95015160020b613a0b565b92600180831b0390511691015191613ade565b505f9150565b808202905f1983820990828083109203918083039283620f424011156119a95714612d8b577fde8f6cefed634549b62c77574f722e1ac57e23f24d8fd5cb790fb65668c2613993620f4240910990828211900360fa1b910360061c170290565b5050620f424091500490565b81810291905f1982820991838084109303928084039384600160601b11156119a95714612dd757600160601b910990828211900360a01b910360601c1790565b50505060601c90565b90606082901b905f19600160601b8409928280851094039380850394858411156119a95714612e63578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b91818302915f19818509938380861095039480860395868511156119a95714612ee2579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b818102929181159184041417156127c657565b6001600160801b0391821681529116602082015260400190565b9092906001600160a01b03163014612f405760ff600654166004811015611c6357600114612f51575b50633615df3f60e11b925f92509050565b612f6691612f61610f3f85612a57565b6139ab565b612f6f82612a57565b90612f7f612af060208501612a57565b519020805f52601360205260405f2054908161309f575b5050612fa861066e604083013561286f565b612fb182612a57565b60020b5f90815260146020526040902080546001600160801b03838116918116919091039081116127c65781546001600160801b0319166001600160801b03919091161790557f56228732ed42cef18541839aa891a63aa1b23de11cf839c40e79aaa43109656e61302183612a57565b61302a84612a57565b60020b5f52601460205260018060801b0360405f2054169061305560405192839260020b9583612efd565b0390a261306181612a57565b60020b5f908152601460205260409020546001600160801b031615613088575b8080612f40565b61309461309991612a57565b613d52565b5f613081565b5f8281526011602052604090206001810180549091906001600160801b031680613118575b50506130cf83613c7a565b80546001600160801b03191690555f9081526013602052604081208190557f99319fa1a5fca42d549d4d49989116496775f906f62e0e2ff2ea3c3aacdefa279080a25f80612f96565b613126906002830154612eea565b905460a01c60020b5f52601b60205261314460405f20918254612862565b90555f806130c4565b61315d61315861350f565b613556565b6001600160a01b0381166401000276a38111156131ab5773fffd8963efd1fc6a506488495d951d5263988d2611156131925790565b5073fffd8963efd1fc6a506488495d951d5263988d2590565b50506401000276a490565b6001600160a01b03918216815291166020820152604081019190915260600190565b908160209103126119a9575190565b91906131f4602091613e44565b604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa91821561199e575f92613252575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d60201161327e575b8161326e6020938361291b565b810103126119a95751905f61322a565b3d9150613261565b73fffd8963efd1fc6a506488495d951d51639616826401000276a21982016001600160a01b0316116134a857693627a301d71055774c85602082901b600160201b600160c01b03168060ff6132da82613e6a565b16916080831061349c5750607e1982011c5b800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c80029081607f1c8260ff1c1c80029283607f1c8460ff1c1c80029485607f1c8660ff1c1c80029687607f1c8860ff1c1c80029889607f1c8a60ff1c1c80029a8b607f1c8c60ff1c1c80029c8d80607f1c9060ff1c1c600160321b90800260cd1c169d600160331b9060cc1c169c600160341b9060cb1c169b600160351b9060ca1c169a600160361b9060c91c1699600160371b9060c81c1698600160381b9060c71c1697600160391b9060c61c16966001603a1b9060c51c16956001603b1b9060c41c16946001603c1b9060c31c16936001603d1b9060c21c16926001603e1b9060c11c16916001603f1b9060c01c1690607f190160401b1717171717171717171717171717026fdb2df09e81959a81455e260799a0632f6f028f6481ab7f045a5af012a19d003aa919820160801d60020b910160801d60020b918282145f146134785750905090565b6001600160a01b039081169061348d84613556565b1611613497575090565b905090565b905081607f031b6132ec565b6318521d4960e21b5f9081526001600160a01b0391909116600452602490fd5b5f1981146127c65760010190565b60020b60010190627fffff8213627fffff198312176127c657565b9060020b9060020b0190627fffff198212627fffff8313176127c657565b60035460ff8160b81c16156135475760ff8160b01c165f146135315760020b90565b60181c60020b627fffff1981146127c6575f0390565b63500b395360e01b5f5260045ffd5b60020b908160ff1d82810118620d89e881116138705763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b189160028116613854575b60048116613838575b6008811661381c575b60108116613800575b602081166137e4575b604081166137c8575b608081166137ac575b6101008116613790575b6102008116613774575b6104008116613758575b610800811661373c575b6110008116613720575b6120008116613704575b61400081166136e8575b61800081166136cc575b6201000081166136b0575b620200008116613695575b62040000811661367a575b6208000016613661575b5f12613659575b0160201c90565b5f1904613652565b6b048a170391f7dc42444e8fa290910260801c9061364b565b6d2216e584f5fa1ea926041bedfe9890920260801c91613641565b916e5d6af8dedb81196699c329225ee6040260801c91613636565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c9161362b565b916f31be135f97d08fd981231505542fcfa60260801c91613620565b916f70d869a156d2a1b890bb3df62baf32f70260801c91613616565b916fa9f746462d870fdf8a65dc1f90e061e50260801c9161360c565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91613602565b916fe7159475a2c29b7443b29c7fa6e889d90260801c916135f8565b916ff3392b0822b70005940c7a398e4b70f30260801c916135ee565b916ff987a7253ac413176f2b074cf7815e540260801c916135e4565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c916135da565b916ffe5dee046a99a2a811c461f1969c30530260801c916135d0565b916fff2ea16466c96a3843ec78b326b528610260801c916135c7565b916fff973b41fa98c081472e6896dfb254c00260801c916135be565b916fffcb9843d60f6159c9db58835c9266440260801c916135b5565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c916135ac565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c916135a3565b916ffff97272373d413259a46990580e213a0260801c9161359a565b826345c3193d60e11b5f5260045260245ffd5b6001600160a01b03168061389657504790565b6020602491604051928380926370a0823160e01b82523060048301525afa90811561199e575f916138c5575090565b90506020813d6020116138ec575b816138e06020938361291b565b810103126119a9575190565b3d91506138d3565b600160801b81101561390c576001600160801b031690565b6335278d125f526004601cfd5b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f5114161561394c575b50505f603452565b3b153d17101561395d575f80613944565b6390b8ec185f526004601cfd5b6001546001600160a01b031690811561399c576001600160a01b03160361398d57565b635025667760e11b5f5260045ffd5b63185f14f160e31b5f5260045ffd5b906014036139ba573560601c90565b6313dd407360e21b5f5260045ffd5b6139db60085460b81c60020b826134f1565b9060ff60035460b01c165f146139fa575060195460020b9060020b1390565b905060195460020b9060020b131590565b60020b5f52601560205260405f2060405190613a268261287f565b80549182815260ff60026001840154938460208501520154161515806040830152829381613ad4575b50613a5957505090565b60ff600654166004811015611c635760038114908115613ac9575b5015613aaf57600554905b5190818111613a8f575b50505090565b613aa7935090613a9e91612862565b60801b906127b9565b5f8080613a89565b6005548042115f14613ac2575b90613a7f565b5042613abc565b60029150145f613a74565b905015155f613a4f565b6001600160801b039091169081158015613b10575b613b095761283692613b0491612862565b612eea565b5050505f90565b5082811115613af3565b5f9060175460ff8160301c1615612d25578060020b9060181c60020b9060085460b81c60020b905b828160020b1315613b5257505050565b613b5e613b6791612c0b565b610da3846134d6565b158015613bf7575b613bf257613b7d828261438a565b8060020b90815f52601460205260018060801b0360405f2054169081613baf575b505050613baa906134d6565b613b42565b90613b04613bbc92613a0b565b905f52601b60205260405f205490818111613bd8575b80613b9e565b95610e4f613bea92613baa9498612862565b94905f613bd2565b505050565b50828160020b13613b6f565b60020b5f52601560205260405f20600554908142115f14613c7357815b815490811015613bf25760ff60028301541680613c6a575b613c40575055565b613c4a9083612862565b80613c53575055565b613c65600183019160801b82546127b9565b905555565b50801515613c38565b4291613c20565b5f81815260116020526040902080546001600160a01b038116158015613d3d575b613bf25760a01c60020b5f526015602052600160405f2001613cd28154600260018060801b03600186015416940193845491613ade565b80613cde575b50505050565b7f8c604db61ba06f8610b6c68ac9796a6271dbb25c72d6187c153aecca65039cd492602092855f52601c845260405f20613d198482546127b9565b9055613d2783601d546127b9565b601d55549055604051908152a25f808080613cd8565b5060018201546001600160801b031615613c9b565b613d5b906143fd565b613d64816151b1565b9060010b5f526016602052600160ff60405f205492161b1615613e4157613d8a81614447565b60185480156127c6575f19016018819055613daf57506017805460ff60301b19169055565b6017548060020b8260020b8181145f14613df757505050613ddc60175491610da38360181c60020b6134d6565b613de5575b5050565b62ffffff169062ffffff191617601755565b826018949293941c60020b14613e0c57505050565b613e18613e1e92612c0b565b906141e9565b613e26575050565b60181b65ffffff000000169065ffffff000000191617601755565b50565b604051602081019182526006604082015260408152613e6460608261291b565b51902090565b80156119a9577b01c1818141808140018080c0814100004181408140c0c100414140c160221b601f6f8421084210842108cc6318c6db6d54be6001600160801b03841160071b84811c6001600160401b031060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b600281900b5f908152601460205260409020546001600160801b0316613e4157613f15906143fd565b613f1e81614447565b613f296018546134c8565b60185560175460ff8160301c16155f14613f6d575060175490600160301b9162ffffff82169066ffffffffffffff1916179060181b65ffffff000000161717601755565b908060020b918060020b8312613f93575b50601754918260181c60020b12613e26575050565b62ffffff191662ffffff8216176017555f613f7e565b6019548060020b613fd4613fbb61446d565b60ff60035460b01c169060085460b81c60020b91615086565b918260020b90828214613cd85762ffffff191662ffffff8416176019557f360ac5802b06d23803589cb36bf71bab382e98c2aaa5882d14f01530ac7d52339260209261402091906150f7565b604051908152a1565b915f91825b156140365750565b9260010160020b92614047846151b1565b949060010b5f5260166020525f19600160ff87161b011960405f205416948515801596875f146141d45780916119a95760ff906001600160801b038116156141ca575050607f5b6001600160401b038216156141c05760ff603f1991160160ff81116127c6575b63ffffffff8216156141b65760ff601f1991160160ff81116127c6575b61ffff8216156141ac5760ff600f1991160160ff81116127c6575b60ff8216156141a25760ff60071991160160ff81116127c6575b600f8216156141985760ff60031991160160ff81116127c6575b600382161561418c5760ff60011991160160ff81116127c657600190915b16614176575b9060ff91031660020b0160020b935b61416f575f938160020b8160020b1215614167579361402e565b5092505f9150565b5060019150565b60ff5f199116019060ff82116127c6579061413e565b9060019060021c614138565b9060041c9061411a565b9060081c90614100565b9060101c906140e6565b9060201c906140cb565b9060401c906140ae565b60801c915061408e565b505060ff9081031660020b0160020b9361414d565b915f915b926141f7816151b1565b600191820b5f9081526016602052604090205460ff821692831b80015f190116801580159493909190826143785750805f926119a957600160801b811015614369575b50600160401b811015614351575b600160201b811015614339575b62010000811015614321575b610100811015614309575b60108110156142f1575b80600460029210156142d8575b10156142c2575b60ff91031660020b900360020b905b6142ba578360020b8160020b1315612d25576142b490612c0b565b926141ed565b925060019150565b60ff60019116019060ff82116127c6579061428a565b60ff90821c92160160ff81116127c65760029091614283565b60ff600491821c92160160ff81116127c65790614276565b60ff600891821c92160160ff81116127c6579061426c565b60ff601091821c92160160ff81116127c65790614261565b60ff602091821c92160160ff81116127c65790614255565b60ff604091821c92160160ff81116127c65790614248565b91505060801c6080905f61423a565b9250505060020b900360020b90614299565b9060020b9060020b02908160020b9182036127c657565b60020b9060020b9081156143c357627fffff1981145f198314166127c6570590565b634e487b7160e01b5f52601260045260245ffd5b9060020b9081156143c35760020b0790565b60020b627fffff1981146127c6575f190190565b60085460b81c60020b9061441182826143a1565b915f8260020b129182614431575b50506144285790565b612836906143e9565b61443b92506143d7565b60020b15155f8061441f565b614450906151b1565b9060010b5f526016602052600160ff60405f2092161b8154189055565b61447c600d54600e5490612862565b80156150685762ffffff61448e61314d565b926144a160ff60035460b01c169361286f565b604051936144ae8561287f565b1515845260208401526001600160a01b0390931660408301908152926144d2612955565b60405191905f6144e1846128e5565b5f845260208401965f88525f60408601525f60608601525f60808601528561452c60a085207f00000000000000000000000000000000000000000000000000000000000000006131e7565b99919293909916988960608a015216608088015260020b895260018060a01b03168552606083015160020b604086015286511515955f6020890151129160018060a01b0390511691604051976080890189811060018060401b0382111761289a5760405288526020880152604087015260608601526001926145b1602088015161286f565b9760018060a01b03865116905160020b62ffffff608088015116906145d860a08720613e44565b92600384018094116127c657604051631e2eaeaf60e01b815260048101949094526020846024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa93841561199e575f94615034575b506040519b6146478d612900565b8c525f60208d015260408c015260608b01525f60808b015260a08a015260018060801b031660c0890152865115155f1461502357610fff6080860151165b61ffff8116615002575062ffffff606086015116915b8851151580614fe3575b15614fd157506040516146b781612900565b5f81525f60208201525f60408201525f60608201525f60808201525f60a08201525f60c082015260018060a01b0360408a015116815260a08420604087015160020b60608b015160020b908951151561471082846143a1565b92825f82129182614fbb575b5050614fab575b15614e585761473182615525565b60ff81169490916001861b905f1982018281116127c65761477c92614755916127b9565b927f000000000000000000000000000000000000000000000000000000000000000061553b565b16801580159590614e3f57509260ff6147a46147ae9361479e6147b397613e6a565b906151f6565b1660020b90612c26565b61438a565b905b1515604083015260020b60208201819052620d89e719811215614e275750620d89e71960208201525b60208101516001600160a01b03906147f89060020b613556565b166060820181905260408a015188516001600160a01b03909116919015614e125760608901516001600160a01b031681105b15614e0c575060608801516001600160a01b0316905b60018060801b0360c08c015116916148588c5161286f565b62ffffff87169390926001600160a01b038316811015929091905f851215614ce35785620f4240039061488d82875f03612d2b565b8515614cd25761489e848684615626565b965b878210614c35575050958691620f424082145f14614c26575050845b935b15614c1857916148cd92615686565b905b60c085015260a084015260808301526001600160a01b031660408a0152602087015115614bcd57614909608082015160c0830151906127b9565b5f8112614bbe5761491b908a516151de565b8952602089015160a08201515f8112614bbe57614937916151c3565b60208a01525b604089015160608201516001600160a01b0391821691168103614b8f575060408101516149e8575b8651156149dc57602061497c91015160020b612c0b565b60020b60608901525b8551151560208701511515145f146149c2576149a788516020890151906151c3565b60208901515b505060408801516001600160a01b031661469b565b60208801516149d7895160208a0151906151c3565b6149ad565b6020015160020b61497c565b9360a084206149fe602087015160020b91613e44565b600481018091116127c6576040519060208201928352604082015260408152614a2860608261291b565b519020604051631afeb18d60e11b81526004810191909152600360248201525f816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561199e575f90614af4575b60209150015160801d8751614ae6575b60018060801b0360c08b01511690600f0b018060801c614ad9576001600160801b031660c08a015263ffffffff818116146127c65763ffffffff1660010193614965565b6393dafdf15f526004601cfd5b614aef9061293e565b614a95565b503d805f833e614b04818361291b565b8101906020818303126119a9578051906001600160401b0382116119a957019080601f830112156119a9578151916001600160401b03831161289a578260051b9060405193614b56602084018661291b565b84526020808501928201019283116119a957602001905b828210614b7f57505050602090614a85565b8151815260209182019101614b6d565b90516001600160a01b03168103614ba7575b50614985565b614bb090613286565b60020b60608901525f614ba1565b6393dafdf160e01b5f5260045ffd5b60a08101515f8112614bbe57614be4908a516151c3565b89526020890151614bfe608083015160c0840151906127b9565b5f8112614bbe57614c0e916151de565b60208a015261493d565b614c21926155bc565b6148cd565b614c3091876156ee565b6148bc565b96509650505084938115831517614cc5578315614c6357614c57868385615771565b958691015f03936148be565b6001600160a01b038611614ca757614ca2614c9d614c8e6001600160801b03851660608a901b6155b2565b6001600160a01b0386166127b9565b6157f0565b614c57565b614ca2614c9d614cc06001600160801b03851689612de0565b614c8e565b634f2461b85f526004601cfd5b614cdd8483876156b2565b966148a0565b9294939291908515614dfb57614cfa818385615686565b925b838510614d3c57614d2993945080965b15614d2e5791614d1b92615626565b809380620f424003916156ee565b6148cf565b614d37926156b2565b614d1b565b509150828215821517614cc5578515614de7576001600160a01b038111614da95760601b60018060801b0383168082061515910401915b6001600160a01b03821683811115614d9c57614d299390036001600160a01b03165b8096614d0c565b634323a5555f526004601cfd5b6001600160801b038316614dc281600160601b84612e6a565b9181156143c357600160601b9009614ddb575b91614d73565b60010180614dd5575f80fd5b91614df6614d29938284615717565b614d95565b614e068184846155bc565b92614cfc565b90614840565b60608901516001600160a01b0316811161482a565b620d89e812156147de57620d89e860208201526147de565b6147ae9250614e5394915060020b90612c26565b6147b3565b614e69614e64836134d6565b615525565b92909360ff8416946001861b905f1982019182116127c657614ead9119927f000000000000000000000000000000000000000000000000000000000000000061553b565b1690811590811595865f14614f715750614ec6906134d6565b906119a95760ff614f61614f6b95846147ae955f03167e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405601f6101e07f804040554300526644320000502061067405302602000010750620017611707760fc7fb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff860260f81c161b60f71c1692831c63d76453e004161a176151f6565b1660020b906134f1565b906147b5565b94509050614f7f91506134d6565b9162ffffff8160ff03116127c657614fa69262ffffff6147ae9260ff031660020b906134f1565b614f6b565b91614fb5906143e9565b91614723565b614fc592506143d7565b60020b1515825f61471c565b95509650505050506128369150613286565b50604089015160608801516001600160a01b03908116911614156146a5565b610fff62ffffff606088015116911690620f4240818302049101039161469b565b610fff6080860151600c1c16614685565b9093506020813d602011615060575b816150506020938361291b565b810103126119a95751925f614639565b3d9150615043565b5060035460b01c60ff161561507e57620d89e890565b620d89e71990565b909190156150c5575f8260020b125f146150b8576147ae816150b36150ae8261283696612c26565b6134d6565b6143a1565b6147ae81612836936143a1565b5f8260020b125f146150de576147ae81612836936143a1565b6147ae816150b36150f282612836966134f1565b612c0b565b9060ff60175460301c1615613de15760085460b81c60020b9060ff60035460b01c1692835f146151a3578060020b8260020b125b1561517157612a4493508260ff60035460b01c165f14615162576151566150ae8261515c9495612c26565b92612c26565b906153c8565b5061516c906134d6565b6153c8565b9082612a44945f14615194576151566150ae8261518e9495612c26565b9061520a565b5061519e906134d6565b61520a565b8060020b8260020b1361512b565b9060ff8260020b60081d60010b921690565b9190915f83820193841291129080158216911516176127c657565b81810392915f1380158285131691841216176127c657565b9060ff8091169116039060ff82116127c657565b91909161521782826143a1565b90825f8260020b1391826153b2575b505061539b575b9061523b816152609361438a565b9261524682826143a1565b90825f8260020b129182615385575b505061537c5761438a565b908160020b8160020b13613de15761527a615280916143fd565b916143fd565b6017548060020b808460020b12615374575b5060181c60020b808260020b1361536c575b508060020b91828160020b13613bf2575b828160020b13156152c557505050565b610d9a6152d191612c0b565b158015615360575b613bf25761535b906152f360085460b81c60020b8261438a565b600281810b91825f52601560205261530e60405f2091613c03565b0160ff198154169055805f5260146020527f1fd92dd789e8ac301fd676a998b2cc37eeed03ecaca912737aea2de45dbfa952602060018060801b0360405f205416604051908152a26134d6565b6152b5565b50828160020b136152d9565b90505f6152a4565b92505f615292565b6147ae906143e9565b61538f92506143d7565b60020b1515825f615255565b60020b90627fffff82146127c6579060010161522d565b6153bc92506143d7565b60020b1515825f615226565b9190916153d582826143a1565b90825f8260020b13918261550f575b50506154f8575b9061523b816153f99361438a565b908160020b8160020b13613de15761527a615413916143fd565b6017548060020b808460020b126154f0575b5060181c60020b808260020b136154e8575b508060020b91828160020b13613bf2575b828160020b131561545857505050565b610d9a61546491612c0b565b1580156154dc575b613bf2576154d79061548660085460b81c60020b8261438a565b60020b805f526015602052600260405f2042815501600160ff19825416179055805f5260146020525f80516020615805833981519152602060018060801b0360405f205416604051908152a26134d6565b615448565b50828160020b1361546c565b90505f615437565b92505f615425565b60020b90627fffff82146127c657906001016153eb565b61551992506143d7565b60020b1515825f6153e4565b60020b9060ff6101008360081d60010b93071690565b919061554690613e44565b90600582018092116127c657602091604051908382019260010b835260408201526040815261557660608261291b565b519020604051631e2eaeaf60e01b8152600481019190915291829060249082906001600160a01b03165afa90811561199e575f916138c5575090565b81156143c3570490565b906001600160a01b0380821690831611615620575b6001600160a01b038216918215615614576128369361560f926001600160a01b0380821693909103169060601b600160601b600160e01b0316612e6a565b6155b2565b62bfc9215f526004601cfd5b906155d1565b6001600160a01b0382811690821611615680575b6001600160a01b03811692831561561457615674926001600160a01b0380821693909103169060601b600160601b600160e01b03166156ee565b90808206151591040190565b9061563a565b612836926001600160a01b03928316919092160360ff81901d90810118906001600160801b0316612d97565b6001600160a01b0391821691160360ff81901d90810118906001906001600160801b03166156e08382612d97565b928260601b91091515160190565b9291906156fc828286612e6a565b9382156143c3570961570a57565b906001019081156119a957565b9190811561576c576001600160a01b03909216918183029160609190911b600160601b600160e01b03169082048314828211161561575f5761283692614c9d928203916156ee565b63f5c787f15f526004601cfd5b505090565b9190811561576c5760601b600160601b600160e01b0316916001600160a01b031690808202826157a183836155b2565b146157ce575b506157b56157ba92846155b2565b6127b9565b80820491061515016001600160a01b031690565b83018381106157a7576001600160a01b03936157ec939192506156ee565b1690565b6001600160a01b03811691908203614bbe5756fec8d91e589f6bbb26714a08d1a59fb08e98c9f6e31d97596f7a8a7d2a49913f502c72687de19bad2b0040ca13a6c56d4eb94bd30b6102c489f7f99629dfe2ee5eeeb345fea22465c927333e05d324ee5b476597701d8be7e5d9aacc60e7aefbafa164736f6c634300081a000a' as const;\n","export default '0x6101c0604052346100ab5761002761001561023e565b9897909796919695929594939461070b565b60405161278290816112d5823960805181611a4a015260a05181611b07015260c05181611a14015260e05181611a9901526101005181611abf01526101205181610b6b01526101405181610b9401526101605181818161065201528181610c6201526115660152610180518181816104a5015261158801526101a051816114190152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b601f909101601f19168101906001600160401b038211908210176100e657604052565b6100af565b604051906100fa6040836100c3565b565b81601f820112156100ab578051906001600160401b0382116100e65760405192610130601f8401601f1916602001856100c3565b828452602083830101116100ab57815f9260208093018386015e8301015290565b51906001600160a01b03821682036100ab57565b6001600160401b0381116100e65760051b60200190565b9080601f830112156100ab57815161019381610165565b926101a160405194856100c3565b81845260208085019260051b8201019283116100ab57602001905b8282106101c95750505090565b602080916101d684610151565b8152019101906101bc565b9080601f830112156100ab5781516101f881610165565b9261020660405194856100c3565b81845260208085019260051b8201019283116100ab57602001905b82821061022e5750505090565b8151815260209182019101610221565b613a9790813803806040519361025482866100c3565b8439820191610140818403126100ab5780516001600160401b0381116100ab57836102809183016100fc565b60208201519093906001600160401b0381116100ab57816102a29184016100fc565b936040830151936102b560608501610151565b936102c260808201610151565b9360a08201519360c08301519360e084015160018060401b0381116100ab57836102ed91860161017c565b6101008501519094906001600160401b0381116100ab57846103109183016101e1565b6101208201519094906001600160401b0381116100ab5761033192016100fc565b9199989796959493929190565b156103465750565b630ca514df60e01b5f5260045266470de4df82000060245260445ffd5b90600182811c92168015610391575b602083101461037d57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610372565b601f81116103a7575050565b60035f5260205f20906020601f840160051c830193106103e1575b601f0160051c01905b8181106103d6575050565b5f81556001016103cb565b90915081906103c2565b601f82116103f857505050565b5f5260205f20906020601f840160051c83019310610430575b601f0160051c01905b818110610425575050565b5f815560010161041a565b9091508190610411565b8160011b915f199060031b1c19161790565b80519091906001600160401b0381116100e6576104758161046e601054610363565b60106103eb565b602092601f82116001146104a857610498929382915f9261049d575b505061043a565b601055565b015190505f80610491565b60105f52601f198216937f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672915f5b86811061050c57508360019596106104f4575b505050811b01601055565b01515f1960f88460031b161c191690555f80806104e9565b919260206001819286850151815501940192016104d6565b80519091906001600160401b0381116100e65761054d81610546600454610363565b60046103eb565b602092601f82116001146105745761056f929382915f9261049d57505061043a565b600455565b60045f52601f198216937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f5b8681106105d857508360019596106105c0575b505050811b01600455565b01515f1960f88460031b161c191690555f80806105b5565b919260206001819286850151815501940192016105a2565b156105f757565b631dc0052360e11b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b906702c68af0bb1400008202918083046702c68af0bb140000149015171561063e57565b610606565b634e487b7160e01b5f52603260045260245ffd5b805182101561066b5760209160051b010190565b610643565b6001600160a01b03165f90815260096020526040902090565b9190820180921161063e57565b1561069f575050565b630443fb3960e11b5f5260045260245260445ffd5b156106bd575050565b6323f3f88b60e01b5f5260045260245260445ffd5b156106db575050565b6305767d1760e01b5f5260045260245260445ffd5b5f1981019190821161063e57565b9190820391821161063e57565b61074b9591816107249261073d959a9b99969c97610873565b6107388166470de4df82000081111561033e565b600d55565b42610160526101805261044c565b8251610759825182146105f0565b5f936107756107678561061a565b670de0b6b3a7640000900490565b5f935b8385106107d75750505050506100fa9291816107a661079c6107676107c29561061a565b83818111156106b4565b6107b381838181106106d2565b816101a052816107c8576106fe565b906109d9565b6107d282306109d9565b6106fe565b909192939561086884600192610863868b61085c61082a61081d8461085261082a61081d878f8161080791610657565b519c8d61084b61084361082a61081d8686610657565b516001600160a01b031690565b6001600160a01b03165f90815260116020526040902090565b918254610689565b9055610657565b541115938d610657565b5490610696565b610689565b960193929190610778565b9290604051916108846040846100c3565b60018352603160f81b60208401908152845190946001600160401b0382116100e6576108ba826108b5600354610363565b61039b565b602090601f83116001146109525791806108e0926108e895945f9261049d57505061043a565b600355610524565b6108f181610b0f565b610120526108fe82610bf7565b610140526020815191012060e052519020610100524660a05261091f610cdc565b6080523060c0526001600160a01b0381161561093e576100fa90610ac7565b631e4fbdf760e01b5f90815260045260245ffd5b60035f52601f19831691907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b925f5b8181106109c157509160019391856108e8979694106109a9575b505050811b01600355610524565b01515f1960f88460031b161c191690555f808061099b565b92936020600181928786015181550195019301610981565b91906001600160a01b0383168015610ab457600c546001600160a01b03811682149081610aa5575b50610a9657610a1a610a1583600254610689565b600255565b6001600160a01b0384165f90815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3600254926001600160d01b03808511610a7f57506100fa929350610da5565b630e58ae9360e11b5f52600485905260245260445ffd5b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f610a01565b63ec442f0560e01b5f525f60045260245ffd5b600b80546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b908151602081105f14610b2a575090610b2790610d3a565b90565b6001600160401b0381116100e657610b4e81610b47600554610363565b60056103eb565b602092601f8211600114610b7857610b70929382915f9261049d57505061043a565b60055560ff90565b60055f52601f198216937f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0915f5b868110610bdf5750836001959610610bc7575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f8080610bb9565b91926020600181928685015181550194019201610ba6565b908151602081105f14610c0f575090610b2790610d3a565b6001600160401b0381116100e657610c3381610c2c600654610363565b60066103eb565b602092601f8211600114610c5d57610c55929382915f9261049d57505061043a565b60065560ff90565b60065f52601f198216937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f915f5b868110610cc45750836001959610610cac575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f8080610c9e565b91926020600181928685015181550194019201610c8b565b60e051610100516040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152610d3460c0826100c3565b51902090565b601f815111610d65576020815191015160208210610d56571790565b5f198260200360031b1b161790565b604460209160405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b90610daf81610ea4565b9165ffffffffffff4311610e8c57600a5480610e565750610de9610dd96100fa945f5b6001611278565b65ffffffffffff4316600a611159565b50506001600160a01b03168015610e3e575b60086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7545f9182526040909120546001600160a01b039081169116610fd3565b610e4f610e4a83610ea4565b610ed5565b5050610dfb565b92835f1981011161063e57600a5f525f80516020613a57833981519152909301546100fa93610de991610dd9919060301c610dd2565b6306dfcc6560e41b5f5260306004524360245260445ffd5b6001600160d01b038111610ebe576001600160d01b031690565b6306dfcc6560e41b5f5260d060045260245260445ffd5b65ffffffffffff4311610e8c57600a5480610eff5750610dd9610efb915f5b6002611278565b9091565b805f1981011161063e57600a5f525f80516020613a578339815191520154610efb91610dd99160301c610ef4565b65ffffffffffff4311610e8c57805480610f615750610f51610efb925f6002611278565b9065ffffffffffff431690611159565b805f1981011161063e575f82815260209020015f190154610efb92610f519160301c610ef4565b65ffffffffffff4311610e8c57805480610fac5750610f51610efb925f6001611278565b805f1981011161063e575f82815260209020015f190154610efb92610f519160301c610dd2565b6001600160a01b038083169392919081169081851415806110a8575b610ffb575b5050505050565b8161105d575b505082611010575b8080610ff4565b5f80516020613a778339815191529161103461102e61103a93610670565b91610ea4565b90610f88565b604080516001600160d01b039384168152919092166020820152a25f8080611009565b6110866110775f80516020613a7783398151915292610670565b61108086610ea4565b90610f2d565b604080516001600160d01b039384168152919092166020820152a25f80611001565b50831515610fef565b9065ffffffffffff82549181199060301b169116179055565b908154680100000000000000008110156100e6576001810180845581101561066b576100fa925f5260205f20019065ffffffffffff81511665ffffffffffff19835416178255602060018060d01b0391015116906110b1565b604080519192919081016001600160401b038111828210176100e657604052915465ffffffffffff8116835260301c6020830152565b80549293929190821561124f57611185611180611175856106f0565b835f5260205f200190565b611123565b9065ffffffffffff61119d835165ffffffffffff1690565b8185169182911611611240576112049460209488926111d06111c5875165ffffffffffff1690565b65ffffffffffff1690565b0361120857506111f6926111e66111f1926106f0565b905f5260205f200190565b6110b1565b01516001600160d01b031690565b9190565b91505061123b9161122861121a6100eb565b65ffffffffffff9093168352565b6001600160d01b038816828601526110ca565b6111f6565b632520601d60e01b5f5260045ffd5b611273925061125f61121a6100eb565b6001600160d01b03851660208301526110ca565b5f9190565b919091806001146112ba5760021461129e57634e487b7160e01b5f52605160045260245ffd5b6001600160d01b039081169181169190910390811161063e5790565b506001600160d01b039182169082160190811161063e579056fe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146102d4578063095ea7b3146102cf57806310aa0ebb146102ca57806313cff13d146102c55780631514617e146102c057806316f0115b146102bb57806318160ddd146102b657806320720df7146102b1578063207d0636146102ac57806323b872dd146102a7578063254800d4146102a2578063313ce5671461029d5780633644e515146102985780633a46b1a8146102935780633c130d901461028e57806342966c68146102895780634bf5d7e9146102845780634c8697951461027f578063587cde1e1461027a5780635c19a95c146102755780636fcfff451461027057806370a082311461026b578063715018a6146102665780637ecebe001461026157806384b0196e1461025c57806386d1a69f1461025757806389026538146102525780638da5cb5b1461024d5780638e539e8c146102485780638e80ff5d1461024357806391ddadf41461023e57806395d89b411461023957806398cd6153146102345780639ab24eb01461022f5780639ccb51751461022a578063a9059cbb14610225578063c3cda52014610220578063c551a2f91461021b578063d505accf14610216578063dd62ed3e14610211578063f1127ed81461020c578063f2fde38b14610207578063f68d90d8146102025763f6939d34146101fd575f80fd5b611494565b611402565b61138f565b6112f8565b6112cc565b6111c1565b6111a9565b6110b1565b61106b565b610fee565b610fa7565b610f36565b610e65565b610e3a565b610e1d565b610d29565b610d01565b610ccb565b610c50565b610b53565b610b1b565b610ad3565b610ab0565b610a4e565b610a2c565b6109ec565b6109c9565b610939565b610868565b6107d6565b6106b2565b610690565b610675565b61063b565b61056d565b61052a565b61050d565b6104f0565b6104c8565b61048e565b610471565b61044c565b61041b565b610311565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602061030e9281815201906102d9565b90565b346103eb575f3660031901126103eb576040515f60035461033181610747565b80845290600181169081156103c75750600114610369575b61036583610359818503826107b3565b604051918291826102fd565b0390f35b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b8082106103ad57509091508101602001610359610349565b919260018160209254838588010152019101909291610395565b60ff191660208086019190915291151560051b840190910191506103599050610349565b5f80fd5b600435906001600160a01b03821682036103eb57565b602435906001600160a01b03821682036103eb57565b346103eb5760403660031901126103eb576104416104376103ef565b6024359033611d8b565b602060405160018152f35b346103eb575f3660031901126103eb57602060ff600c5460a01c166040519015158152f35b346103eb575f3660031901126103eb576020600e54604051908152f35b346103eb575f3660031901126103eb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346103eb575f3660031901126103eb57600c546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576020600254604051908152f35b346103eb575f3660031901126103eb576020600d54604051908152f35b346103eb5760203660031901126103eb576105436103ef565b61054b61190d565b600c80546001600160a81b0319166001600160a01b0392909216919091179055005b346103eb5760603660031901126103eb576105866103ef565b61058e610405565b6044359061059c33846118ae565b92600184016105bc575b6105b0935061194b565b60405160018152602090f35b828410610620576001600160a01b038116801561060d5733156105fa576105b09484915f526001602052036105f43360405f2061146e565b556105a6565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8284637dc7a0d960e11b5f523360045260245260445260645ffd5b346103eb575f3660031901126103eb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346103eb575f3660031901126103eb57602060405160128152f35b346103eb575f3660031901126103eb5760206106aa611a11565b604051908152f35b346103eb5760403660031901126103eb576106cb6103ef565b60243565ffffffffffff6106de43611b2d565b169182821015610731576001600160a01b03165f90815260096020526040902061036592506001600160d01b0391610720919061071a90611b2d565b90611b5c565b604051911681529081906020820190565b50637669fc0f60e11b5f5260045260245260445ffd5b90600182811c92168015610775575b602083101461076157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610756565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b038211176107ae57604052565b61077f565b601f909101601f19168101906001600160401b038211908210176107ae57604052565b346103eb575f3660031901126103eb576040515f6010546107f681610747565b80845290600181169081156103c7575060011461081d5761036583610359818503826107b3565b60105f9081525f80516020612736833981519152939250905b80821061084e57509091508101602001610359610349565b919260018160209254838588010152019101909291610836565b346103eb5760203660031901126103eb57600435331561092657600c546001600160a01b038116159081610917575b50610908576108a53361143c565b54908082106108f157806108ef92036108bd3361143c565b556108cb8160025403600255565b6040518181525f9033905f8051602061271683398151915290602090a35f336124a5565b005b63391434e360e21b5f526109059133611934565b5ffd5b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f610897565b634b637e8f60e11b5f525f60045260245ffd5b346103eb575f3660031901126103eb5761095243611b2d565b65ffffffffffff8061096343611b2d565b169116036109ba5761036560405161097c6040826107b3565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c7400000060208201526040519182916020835260208301906102d9565b6301bfc1c560e61b5f5260045ffd5b346103eb5760203660031901126103eb5760206106aa6109e76103ef565b611564565b346103eb5760203660031901126103eb576001600160a01b03610a0d6103ef565b165f526008602052602060018060a01b0360405f205416604051908152f35b346103eb5760203660031901126103eb576108ef610a486103ef565b33611bed565b346103eb5760203660031901126103eb576001600160a01b03610a6f6103ef565b165f52600960205260405f205463ffffffff8111610a995760405163ffffffff9091168152602090f35b6306dfcc6560e41b5f52602060045260245260445ffd5b346103eb5760203660031901126103eb5760206106aa610ace6103ef565b611640565b346103eb575f3660031901126103eb57610aeb61190d565b600b80546001600160a01b031981169091555f906001600160a01b03165f805160206126f68339815191528280a3005b346103eb5760203660031901126103eb576001600160a01b03610b3c6103ef565b165f526007602052602060405f2054604051908152f35b346103eb575f3660031901126103eb57610bf7610b8f7f00000000000000000000000000000000000000000000000000000000000000006120af565b610bb87f0000000000000000000000000000000000000000000000000000000000000000612174565b6020604051610bc782826107b3565b5f815281610c0581830194601f198301368737604051978897600f60f81b895260e0858a015260e08901906102d9565b9087820360408901526102d9565b914660608701523060808701525f60a087015285830360c087015251918281520192915f5b828110610c3957505050500390f35b835185528695509381019392810192600101610c2a565b346103eb575f3660031901126103eb577f000000000000000000000000000000000000000000000000000000000000000015610cbc57610c8f33611564565b335f526011602052600160405f2001908154818101809111610cb7576108ef9255333061194b565b6114d8565b63641c0b2160e11b5f5260045ffd5b346103eb575f3660031901126103eb57610ce361190d565b600c805460ff60a01b1916600160a01b17905542600f819055600e55005b346103eb575f3660031901126103eb57600b546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb5760043565ffffffffffff610d4d43611b2d565b169081811015610e0857610d6090611b2d565b600a54905f829160058411610db4575b610d7c9350600a611f63565b80610d98575060205f5b6040516001600160d01b039091168152f35b610da3602091611518565b600a5f52815f20015460301c610d86565b9192610dbf81611df0565b8103908111610cb757610d7c93600a5f5265ffffffffffff8260205f2001541665ffffffffffff8516105f14610df6575091610d70565b929150610e02906114fd565b90610d70565b637669fc0f60e11b5f5260045260245260445ffd5b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb575f3660031901126103eb576020610e5543611b2d565b65ffffffffffff60405191168152f35b346103eb575f3660031901126103eb576040515f600454610e8581610747565b80845290600181169081156103c75750600114610eac5761036583610359818503826107b3565b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610ef057509091508101602001610359610349565b919260018160209254838588010152019101909291610ed8565b60405190610f196040836107b3565b565b6001600160401b0381116107ae57601f01601f191660200190565b346103eb5760203660031901126103eb576004356001600160401b0381116103eb57366023820112156103eb578060040135610f7181610f1b565b90610f7f60405192836107b3565b80825236602482850101116103eb576020815f9260246108ef9601838601378301015261165a565b346103eb5760203660031901126103eb576001600160a01b03610fc86103ef565b165f526009602052602060018060d01b03610fe560405f20611c59565b16604051908152f35b346103eb5760203660031901126103eb5760043561100a61190d565b66470de4df820000811161104e57600e54151580611039575b61102c57600d55005b6110346117ac565b600d55005b50600f544281420311610cb757421415611023565b630ca514df60e01b5f5260045266470de4df82000060245260445ffd5b346103eb5760403660031901126103eb576104416110876103ef565b602435903361194b565b6064359060ff821682036103eb57565b6084359060ff821682036103eb57565b346103eb5760c03660031901126103eb576110ca6103ef565b602435906044356110d9611091565b6084359060a43592804211611197579161115e93916111506111559460405160208101917fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf835260018060a01b038a1660408301528a606083015260808201526080815261114860a0826107b3565b519020611c83565b612219565b909291926122ba565b61116781611d69565b809303611178576108ef9250611bed565b90506301d4b62360e61b5f5260018060a01b031660045260245260445ffd5b632341d78760e11b5f5260045260245ffd5b346103eb575f3660031901126103eb576108ef6117ac565b346103eb5760e03660031901126103eb576111da6103ef565b6111e2610405565b60443590606435926111f26110a1565b60a43560c435908642116112b95761127e9261127961121086611d69565b9860405160208101917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9835260018060a01b0389169b8c604084015260018060a01b038b1660608401528b608084015260a083015260c082015260c0815261114860e0826107b3565b611ca9565b936001600160a01b03851603611298576108ef9350611d8b565b6325c0072360e11b5f526001600160a01b038085166004521660245260445ffd5b8663313c898160e11b5f5260045260245ffd5b346103eb5760403660031901126103eb5760206106aa6112ea6103ef565b6112f2610405565b906118ae565b346103eb5760403660031901126103eb576113116103ef565b6024359063ffffffff821682036103eb5761136691611360916113326118f5565b5061133b6118f5565b506001600160a01b03165f90815260096020526040902061135a6118f5565b50612336565b5061235f565b60408051825165ffffffffffff1681526020928301516001600160d01b03169281019290925290f35b346103eb5760203660031901126103eb576113a86103ef565b6113b061190d565b6001600160a01b031680156113ef57600b80546001600160a01b0319811683179091556001600160a01b03165f805160206126f68339815191525f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b346103eb575f3660031901126103eb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b6001600160a01b03165f90815260208190526040902090565b6001600160a01b03165f90815260096020526040902090565b9060018060a01b03165f5260205260405f2090565b908152602081019190915260400190565b346103eb5760203660031901126103eb576001600160a01b036114b56103ef565b165f52601160205260405f20600181549101549061036560405192839283611483565b634e487b7160e01b5f52601160045260245ffd5b906301e133808201809211610cb757565b9060018201809211610cb757565b91908201809211610cb757565b5f19810191908211610cb757565b91908203918211610cb757565b81810292918115918404141715610cb757565b8115611550570490565b634e487b7160e01b5f52601260045260245ffd5b7f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000808301808411610cb757421015611619576001600160a01b0382165f9081526011602052604090205442938403938411610cb7576115f66001926115f161030e9661161194611533565b611546565b6001600160a01b039093165f90815260116020526040902090565b015490611526565b506001600160a01b03165f908152601160205260409020805461030e925090600190611611565b6001600160a01b03165f9081526020819052604090205490565b9061166361190d565b81516001600160401b0381116107ae5761168781611682601054610747565b611730565b602092601f82116001146116c7576116b7929382915f926116bc575b50508160011b915f199060031b1c19161790565b601055565b015190505f806116a3565b60105f52601f198216935f80516020612736833981519152915f5b8681106117185750836001959610611700575b505050811b01601055565b01515f1960f88460031b161c191690555f80806116f5565b919260206001819286850151815501940192016116e2565b601f811161173c575050565b60105f5260205f20906020601f840160051c83019310611776575b601f0160051c01905b81811061176b575050565b5f8155600101611760565b9091508190611757565b1561178757565b633601f27d60e11b5f5260045ffd5b1561179d57565b63bbb80c2b60e01b5f5260045ffd5b600e546117ba811515611780565b5f90600254600f5490600d54915b6117d1846114ec565b4211156118355761182d9161182161181a6118096117fa611827956117f58a6114ec565b611526565b6118048886611533565b611533565b6a1a1601fc4ea7109e000000900490565b809261150b565b9561150b565b926114ec565b9192826117c8565b9091610f19949392824211611876575b50505061185c90611857831515611796565b600e55565b61186542600f55565b600b546001600160a01b0316611cb8565b6118096118a59361189961189261185c97989561189f95611533565b9142611526565b90611533565b9061150b565b91905f80611845565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba3146118ee576118ea9160018060a01b03165f52600160205260405f2061146e565b5490565b50505f1990565b6040519061190282610793565b5f6020838281520152565b600b546001600160a01b0316330361192157565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b0316600452602452604452606490565b6001600160a01b038116939291908415610926576001600160a01b03821680156119fe57600c546001600160a01b038116821490816119ef575b50610908576119938261143c565b54958487106119da5784610f199697036119ac8461143c565b556119b68461143c565b8054860190556040518581525f8051602061271683398151915290602090a36124a5565b63391434e360e21b5f52610905858885611934565b60ff915060a01c16155f611985565b63ec442f0560e01b5f525f60045260245ffd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480611b04575b15611a6c577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152611afe60c0826107b3565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614611a43565b65ffffffffffff8111611b455765ffffffffffff1690565b6306dfcc6560e41b5f52603060045260245260445ffd5b908154905f829160058411611b9a575b611b77935084611f63565b80611b825750505f90565b611b8b90611518565b905f5260205f20015460301c90565b9192611ba581611df0565b8103908111610cb757611b7793855f5265ffffffffffff8260205f2001541665ffffffffffff8516105f14611bdb575091611b6c565b929150611be7906114fd565b90611b6c565b6001600160a01b038181165f81815260086020526040812080548685166001600160a01b031982168117909255610f1996941694611c539390928691907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9080a4611640565b91611fc7565b80549081611c675750505f90565b815f19810111610cb7575f525f199060205f2001015460301c90565b604290611c8e611a11565b906040519161190160f01b8352600283015260228201522090565b9161030e939161115593612219565b91906001600160a01b03831680156119fe57600c546001600160a01b03811682149081611d5a575b5061090857611cf9611cf48360025461150b565b600255565b611d028461143c565b8054830190556040518281525f905f8051602061271683398151915290602090a3600254926001600160d01b03808511611d435750610f199293505f6124a5565b630e58ae9360e11b5f52600485905260245260445ffd5b60ff915060a01c16155f611ce0565b6001600160a01b03165f90815260076020526040902080546001810190915590565b6001600160a01b031690811561060d576001600160a01b0381169283156105fa5780611de37f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593855f52600160205260405f2061146e565b55604051908152602090a3565b8015611f5e5761030e90611ef4611eed611ee3611ed9611ecf611ec5611ebb611eb16001611e9f5f8b608081901c80611f50575b5080611e33611e959260401c90565b80611f43575b50611e448160201c90565b80611f36575b50611e558160101c90565b80611f29575b50611e668160081c90565b80611f1c575b50611e778160041c90565b80611f0f575b50611e888160021c90565b80611f02575b5060011c90565b611efa5760011c90565b1b611eaa818b611546565b0160011c90565b611eaa818a611546565b611eaa8189611546565b611eaa8188611546565b611eaa8187611546565b611eaa8186611546565b611eaa8185611546565b8092611546565b90612383565b820160011c90565b600291509201915f611e8e565b600491509201915f611e7d565b600891509201915f611e6c565b601091509201915f611e5b565b602091509201915f611e4a565b604091509201915f611e39565b608092509050611e95611e24565b505f90565b91905b838210611f735750505090565b9091928083169080841860011c8201809211610cb757845f5265ffffffffffff8260205f2001541665ffffffffffff8416105f14611fb55750925b9190611f66565b939250611fc1906114fd565b91611fae565b6001600160a01b038083169392919081169081851415806120a6575b611fef575b5050505050565b81612056575b505082612004575b8080611fe8565b5f805160206127568339815191529161202861202261202e93611455565b91612395565b906123fe565b60405191829161204b916001600160d01b03918216911683611483565b0390a25f8080611ffd565b61207f6120705f8051602061275683398151915292611455565b61207986612395565b906123c6565b60405191829161209c916001600160d01b03918216911683611483565b0390a25f80611ff5565b50831515611fe3565b60ff81146120c05761030e90612467565b50604051600554815f6120d283610747565b808352926001811690811561215557506001146120f6575b61030e925003826107b3565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b81831061213957505090602061030e928201016120ea565b6020919350806001915483858801015201910190918392612121565b6020925061030e94915060ff191682840152151560051b8201016120ea565b60ff81146121855761030e90612467565b50604051600654815f61219783610747565b808352926001811690811561215557506001146121ba5761030e925003826107b3565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b8183106121fd57505090602061030e928201016120ea565b60209193508060019154838588010152019101909183926121e5565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411612291579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612286575f516001600160a01b0381161561227c57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b600411156122a657565b634e487b7160e01b5f52602160045260245ffd5b6122c38161229c565b806122cc575050565b6122d58161229c565b600181036122ec5763f645eedf60e01b5f5260045ffd5b6122f58161229c565b60028103612310575063fce698f760e01b5f5260045260245ffd5b8061231c60039261229c565b146123245750565b6335e2f38360e21b5f5260045260245ffd5b805482101561234b575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b9060405161236c81610793565b915465ffffffffffff8116835260301c6020830152565b9080821015612390575090565b905090565b6001600160d01b0381116123af576001600160d01b031690565b6306dfcc6560e41b5f5260d060045260245260445ffd5b906123d043611b2d565b906123da83611c59565b6001600160d01b039182169082160391908211610cb7576123fa926125d6565b9091565b9061240843611b2d565b9061241283611c59565b6001600160d01b039182169082160191908211610cb7576123fa926125d6565b61243b43611b2d565b90612446600a611c59565b6001600160d01b0391821690821603908111610cb7576123fa91600a6125d6565b60ff811690601f821161249657604051916124836040846107b3565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b9091906001600160a01b0316801561250c575b610f19926001600160a01b03169081156124f4575b5f90815260086020526040808220549282529020546001600160a01b039081169116611fc7565b61250561250084612395565b612432565b50506124cd565b61251582612395565b9261251f43611b2d565b9361252a600a611c59565b6001600160d01b039182169082160194908511610cb757610f199461255091600a6125d6565b90505092506124b8565b9065ffffffffffff82549181199060301b169116179055565b8054600160401b8110156107ae5761259091600182018155612336565b6125c3578165ffffffffffff610f1993511665ffffffffffff19835416178255602060018060d01b03910151169061255a565b634e487b7160e01b5f525f60045260245ffd5b8054929392919082156126cc576126026125fd6125f285611518565b835f5260205f200190565b61235f565b9065ffffffffffff61261a835165ffffffffffff1690565b81851691829116116126bd5761268194602094889261264d612642875165ffffffffffff1690565b65ffffffffffff1690565b0361268557506126739261266361266e92611518565b905f5260205f200190565b61255a565b01516001600160d01b031690565b9190565b9150506126b8916126a5612697610f0a565b65ffffffffffff9093168352565b6001600160d01b03881682860152612573565b612673565b632520601d60e01b5f5260045ffd5b6126f092506126dc612697610f0a565b6001600160d01b0385166020830152612573565b5f919056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724a164736f6c634300081a000ac65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a7dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724' as const;\n","export default '0x6101c0604052346100ab5761002761001561023e565b9897909796919695929594939461070b565b60405161279f90816112d5823960805181611a67015260a05181611b24015260c05181611a31015260e05181611ab601526101005181611adc01526101205181610b8701526101405181610bb001526101605181818161065201528181610c7e01526115820152610180518181816104a501526115a401526101a051816114350152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b601f909101601f19168101906001600160401b038211908210176100e657604052565b6100af565b604051906100fa6040836100c3565b565b81601f820112156100ab578051906001600160401b0382116100e65760405192610130601f8401601f1916602001856100c3565b828452602083830101116100ab57815f9260208093018386015e8301015290565b51906001600160a01b03821682036100ab57565b6001600160401b0381116100e65760051b60200190565b9080601f830112156100ab57815161019381610165565b926101a160405194856100c3565b81845260208085019260051b8201019283116100ab57602001905b8282106101c95750505090565b602080916101d684610151565b8152019101906101bc565b9080601f830112156100ab5781516101f881610165565b9261020660405194856100c3565b81845260208085019260051b8201019283116100ab57602001905b82821061022e5750505090565b8151815260209182019101610221565b613ab490813803806040519361025482866100c3565b8439820191610140818403126100ab5780516001600160401b0381116100ab57836102809183016100fc565b60208201519093906001600160401b0381116100ab57816102a29184016100fc565b936040830151936102b560608501610151565b936102c260808201610151565b9360a08201519360c08301519360e084015160018060401b0381116100ab57836102ed91860161017c565b6101008501519094906001600160401b0381116100ab57846103109183016101e1565b6101208201519094906001600160401b0381116100ab5761033192016100fc565b9199989796959493929190565b156103465750565b630ca514df60e01b5f5260045266470de4df82000060245260445ffd5b90600182811c92168015610391575b602083101461037d57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610372565b601f81116103a7575050565b60035f5260205f20906020601f840160051c830193106103e1575b601f0160051c01905b8181106103d6575050565b5f81556001016103cb565b90915081906103c2565b601f82116103f857505050565b5f5260205f20906020601f840160051c83019310610430575b601f0160051c01905b818110610425575050565b5f815560010161041a565b9091508190610411565b8160011b915f199060031b1c19161790565b80519091906001600160401b0381116100e6576104758161046e601054610363565b60106103eb565b602092601f82116001146104a857610498929382915f9261049d575b505061043a565b601055565b015190505f80610491565b60105f52601f198216937f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672915f5b86811061050c57508360019596106104f4575b505050811b01601055565b01515f1960f88460031b161c191690555f80806104e9565b919260206001819286850151815501940192016104d6565b80519091906001600160401b0381116100e65761054d81610546600454610363565b60046103eb565b602092601f82116001146105745761056f929382915f9261049d57505061043a565b600455565b60045f52601f198216937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f5b8681106105d857508360019596106105c0575b505050811b01600455565b01515f1960f88460031b161c191690555f80806105b5565b919260206001819286850151815501940192016105a2565b156105f757565b631dc0052360e11b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b90670b1a2bc2ec500000820291808304670b1a2bc2ec500000149015171561063e57565b610606565b634e487b7160e01b5f52603260045260245ffd5b805182101561066b5760209160051b010190565b610643565b6001600160a01b03165f90815260096020526040902090565b9190820180921161063e57565b1561069f575050565b630443fb3960e11b5f5260045260245260445ffd5b156106bd575050565b6323f3f88b60e01b5f5260045260245260445ffd5b156106db575050565b6305767d1760e01b5f5260045260245260445ffd5b5f1981019190821161063e57565b9190820391821161063e57565b61074b9591816107249261073d959a9b99969c97610873565b6107388166470de4df82000081111561033e565b600d55565b42610160526101805261044c565b8251610759825182146105f0565b5f936107756107678561061a565b670de0b6b3a7640000900490565b5f935b8385106107d75750505050506100fa9291816107a661079c6107676107c29561061a565b83818111156106b4565b6107b381838181106106d2565b816101a052816107c8576106fe565b906109d9565b6107d282306109d9565b6106fe565b909192939561086884600192610863868b61085c61082a61081d8461085261082a61081d878f8161080791610657565b519c8d61084b61084361082a61081d8686610657565b516001600160a01b031690565b6001600160a01b03165f90815260116020526040902090565b918254610689565b9055610657565b541115938d610657565b5490610696565b610689565b960193929190610778565b9290604051916108846040846100c3565b60018352603160f81b60208401908152845190946001600160401b0382116100e6576108ba826108b5600354610363565b61039b565b602090601f83116001146109525791806108e0926108e895945f9261049d57505061043a565b600355610524565b6108f181610b0f565b610120526108fe82610bf7565b610140526020815191012060e052519020610100524660a05261091f610cdc565b6080523060c0526001600160a01b0381161561093e576100fa90610ac7565b631e4fbdf760e01b5f90815260045260245ffd5b60035f52601f19831691907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b925f5b8181106109c157509160019391856108e8979694106109a9575b505050811b01600355610524565b01515f1960f88460031b161c191690555f808061099b565b92936020600181928786015181550195019301610981565b91906001600160a01b0383168015610ab457600c546001600160a01b03811682149081610aa5575b50610a9657610a1a610a1583600254610689565b600255565b6001600160a01b0384165f90815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3600254926001600160d01b03808511610a7f57506100fa929350610da5565b630e58ae9360e11b5f52600485905260245260445ffd5b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f610a01565b63ec442f0560e01b5f525f60045260245ffd5b600b80546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b908151602081105f14610b2a575090610b2790610d3a565b90565b6001600160401b0381116100e657610b4e81610b47600554610363565b60056103eb565b602092601f8211600114610b7857610b70929382915f9261049d57505061043a565b60055560ff90565b60055f52601f198216937f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0915f5b868110610bdf5750836001959610610bc7575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f8080610bb9565b91926020600181928685015181550194019201610ba6565b908151602081105f14610c0f575090610b2790610d3a565b6001600160401b0381116100e657610c3381610c2c600654610363565b60066103eb565b602092601f8211600114610c5d57610c55929382915f9261049d57505061043a565b60065560ff90565b60065f52601f198216937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f915f5b868110610cc45750836001959610610cac575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f8080610c9e565b91926020600181928685015181550194019201610c8b565b60e051610100516040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152610d3460c0826100c3565b51902090565b601f815111610d65576020815191015160208210610d56571790565b5f198260200360031b1b161790565b604460209160405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b90610daf81610ea4565b9165ffffffffffff4311610e8c57600a5480610e565750610de9610dd96100fa945f5b6001611278565b65ffffffffffff4316600a611159565b50506001600160a01b03168015610e3e575b60086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7545f9182526040909120546001600160a01b039081169116610fd3565b610e4f610e4a83610ea4565b610ed5565b5050610dfb565b92835f1981011161063e57600a5f525f80516020613a74833981519152909301546100fa93610de991610dd9919060301c610dd2565b6306dfcc6560e41b5f5260306004524360245260445ffd5b6001600160d01b038111610ebe576001600160d01b031690565b6306dfcc6560e41b5f5260d060045260245260445ffd5b65ffffffffffff4311610e8c57600a5480610eff5750610dd9610efb915f5b6002611278565b9091565b805f1981011161063e57600a5f525f80516020613a748339815191520154610efb91610dd99160301c610ef4565b65ffffffffffff4311610e8c57805480610f615750610f51610efb925f6002611278565b9065ffffffffffff431690611159565b805f1981011161063e575f82815260209020015f190154610efb92610f519160301c610ef4565b65ffffffffffff4311610e8c57805480610fac5750610f51610efb925f6001611278565b805f1981011161063e575f82815260209020015f190154610efb92610f519160301c610dd2565b6001600160a01b038083169392919081169081851415806110a8575b610ffb575b5050505050565b8161105d575b505082611010575b8080610ff4565b5f80516020613a948339815191529161103461102e61103a93610670565b91610ea4565b90610f88565b604080516001600160d01b039384168152919092166020820152a25f8080611009565b6110866110775f80516020613a9483398151915292610670565b61108086610ea4565b90610f2d565b604080516001600160d01b039384168152919092166020820152a25f80611001565b50831515610fef565b9065ffffffffffff82549181199060301b169116179055565b908154680100000000000000008110156100e6576001810180845581101561066b576100fa925f5260205f20019065ffffffffffff81511665ffffffffffff19835416178255602060018060d01b0391015116906110b1565b604080519192919081016001600160401b038111828210176100e657604052915465ffffffffffff8116835260301c6020830152565b80549293929190821561124f57611185611180611175856106f0565b835f5260205f200190565b611123565b9065ffffffffffff61119d835165ffffffffffff1690565b8185169182911611611240576112049460209488926111d06111c5875165ffffffffffff1690565b65ffffffffffff1690565b0361120857506111f6926111e66111f1926106f0565b905f5260205f200190565b6110b1565b01516001600160d01b031690565b9190565b91505061123b9161122861121a6100eb565b65ffffffffffff9093168352565b6001600160d01b038816828601526110ca565b6111f6565b632520601d60e01b5f5260045ffd5b611273925061125f61121a6100eb565b6001600160d01b03851660208301526110ca565b5f9190565b919091806001146112ba5760021461129e57634e487b7160e01b5f52605160045260245ffd5b6001600160d01b039081169181169190910390811161063e5790565b506001600160d01b039182169082160190811161063e579056fe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146102d4578063095ea7b3146102cf57806310aa0ebb146102ca57806313cff13d146102c55780631514617e146102c057806316f0115b146102bb57806318160ddd146102b657806320720df7146102b1578063207d0636146102ac57806323b872dd146102a7578063254800d4146102a2578063313ce5671461029d5780633644e515146102985780633a46b1a8146102935780633c130d901461028e57806342966c68146102895780634bf5d7e9146102845780634c8697951461027f578063587cde1e1461027a5780635c19a95c146102755780636fcfff451461027057806370a082311461026b578063715018a6146102665780637ecebe001461026157806384b0196e1461025c57806386d1a69f1461025757806389026538146102525780638da5cb5b1461024d5780638e539e8c146102485780638e80ff5d1461024357806391ddadf41461023e57806395d89b411461023957806398cd6153146102345780639ab24eb01461022f5780639ccb51751461022a578063a9059cbb14610225578063c3cda52014610220578063c551a2f91461021b578063d505accf14610216578063dd62ed3e14610211578063f1127ed81461020c578063f2fde38b14610207578063f68d90d8146102025763f6939d34146101fd575f80fd5b6114b0565b61141e565b6113ab565b611314565b6112e8565b6111dd565b6111c5565b6110cd565b611087565b61100a565b610fc3565b610f52565b610e81565b610e56565b610e39565b610d45565b610d1d565b610ce7565b610c6c565b610b6f565b610b37565b610aef565b610acc565b610a6a565b610a48565b610a08565b6109e5565b610955565b610868565b6107d6565b6106b2565b610690565b610675565b61063b565b61056d565b61052a565b61050d565b6104f0565b6104c8565b61048e565b610471565b61044c565b61041b565b610311565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90602061030e9281815201906102d9565b90565b346103eb575f3660031901126103eb576040515f60035461033181610747565b80845290600181169081156103c75750600114610369575b61036583610359818503826107b3565b604051918291826102fd565b0390f35b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b8082106103ad57509091508101602001610359610349565b919260018160209254838588010152019101909291610395565b60ff191660208086019190915291151560051b840190910191506103599050610349565b5f80fd5b600435906001600160a01b03821682036103eb57565b602435906001600160a01b03821682036103eb57565b346103eb5760403660031901126103eb576104416104376103ef565b6024359033611da8565b602060405160018152f35b346103eb575f3660031901126103eb57602060ff600c5460a01c166040519015158152f35b346103eb575f3660031901126103eb576020600e54604051908152f35b346103eb575f3660031901126103eb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346103eb575f3660031901126103eb57600c546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576020600254604051908152f35b346103eb575f3660031901126103eb576020600d54604051908152f35b346103eb5760203660031901126103eb576105436103ef565b61054b611929565b600c80546001600160a81b0319166001600160a01b0392909216919091179055005b346103eb5760603660031901126103eb576105866103ef565b61058e610405565b6044359061059c33846118ca565b92600184016105bc575b6105b09350611967565b60405160018152602090f35b828410610620576001600160a01b038116801561060d5733156105fa576105b09484915f526001602052036105f43360405f2061148a565b556105a6565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8284637dc7a0d960e11b5f523360045260245260445260645ffd5b346103eb575f3660031901126103eb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346103eb575f3660031901126103eb57602060405160128152f35b346103eb575f3660031901126103eb5760206106aa611a2e565b604051908152f35b346103eb5760403660031901126103eb576106cb6103ef565b60243565ffffffffffff6106de43611b4a565b169182821015610731576001600160a01b03165f90815260096020526040902061036592506001600160d01b0391610720919061071a90611b4a565b90611b79565b604051911681529081906020820190565b50637669fc0f60e11b5f5260045260245260445ffd5b90600182811c92168015610775575b602083101461076157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610756565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b038211176107ae57604052565b61077f565b601f909101601f19168101906001600160401b038211908210176107ae57604052565b346103eb575f3660031901126103eb576040515f6010546107f681610747565b80845290600181169081156103c7575060011461081d5761036583610359818503826107b3565b60105f9081525f80516020612753833981519152939250905b80821061084e57509091508101602001610359610349565b919260018160209254838588010152019101909291610836565b346103eb5760203660031901126103eb57600435610884611929565b600b546001600160a01b031690811561094257600c546001600160a01b038116159081610933575b50610924576108ba82611458565b5481811061090e5761090c92825f92036108d382611458565b556108e18360025403600255565b81815f805160206127338339815191526040518061090488829190602083019252565b0390a36124c2565b005b63391434e360e21b5f5261092192611950565b5ffd5b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f6108ac565b634b637e8f60e11b5f525f60045260245ffd5b346103eb575f3660031901126103eb5761096e43611b4a565b65ffffffffffff8061097f43611b4a565b169116036109d6576103656040516109986040826107b3565b601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c7400000060208201526040519182916020835260208301906102d9565b6301bfc1c560e61b5f5260045ffd5b346103eb5760203660031901126103eb5760206106aa610a036103ef565b611580565b346103eb5760203660031901126103eb576001600160a01b03610a296103ef565b165f526008602052602060018060a01b0360405f205416604051908152f35b346103eb5760203660031901126103eb5761090c610a646103ef565b33611c0a565b346103eb5760203660031901126103eb576001600160a01b03610a8b6103ef565b165f52600960205260405f205463ffffffff8111610ab55760405163ffffffff9091168152602090f35b6306dfcc6560e41b5f52602060045260245260445ffd5b346103eb5760203660031901126103eb5760206106aa610aea6103ef565b61165c565b346103eb575f3660031901126103eb57610b07611929565b600b80546001600160a01b031981169091555f906001600160a01b03165f805160206127138339815191528280a3005b346103eb5760203660031901126103eb576001600160a01b03610b586103ef565b165f526007602052602060405f2054604051908152f35b346103eb575f3660031901126103eb57610c13610bab7f00000000000000000000000000000000000000000000000000000000000000006120cc565b610bd47f0000000000000000000000000000000000000000000000000000000000000000612191565b6020604051610be382826107b3565b5f815281610c2181830194601f198301368737604051978897600f60f81b895260e0858a015260e08901906102d9565b9087820360408901526102d9565b914660608701523060808701525f60a087015285830360c087015251918281520192915f5b828110610c5557505050500390f35b835185528695509381019392810192600101610c46565b346103eb575f3660031901126103eb577f000000000000000000000000000000000000000000000000000000000000000015610cd857610cab33611580565b335f526011602052600160405f2001908154818101809111610cd35761090c92553330611967565b6114f4565b63641c0b2160e11b5f5260045ffd5b346103eb575f3660031901126103eb57610cff611929565b600c805460ff60a01b1916600160a01b17905542600f819055600e55005b346103eb575f3660031901126103eb57600b546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb5760043565ffffffffffff610d6943611b4a565b169081811015610e2457610d7c90611b4a565b600a54905f829160058411610dd0575b610d989350600a611f80565b80610db4575060205f5b6040516001600160d01b039091168152f35b610dbf602091611534565b600a5f52815f20015460301c610da2565b9192610ddb81611e0d565b8103908111610cd357610d9893600a5f5265ffffffffffff8260205f2001541665ffffffffffff8516105f14610e12575091610d8c565b929150610e1e90611519565b90610d8c565b637669fc0f60e11b5f5260045260245260445ffd5b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb575f3660031901126103eb576020610e7143611b4a565b65ffffffffffff60405191168152f35b346103eb575f3660031901126103eb576040515f600454610ea181610747565b80845290600181169081156103c75750600114610ec85761036583610359818503826107b3565b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610f0c57509091508101602001610359610349565b919260018160209254838588010152019101909291610ef4565b60405190610f356040836107b3565b565b6001600160401b0381116107ae57601f01601f191660200190565b346103eb5760203660031901126103eb576004356001600160401b0381116103eb57366023820112156103eb578060040135610f8d81610f37565b90610f9b60405192836107b3565b80825236602482850101116103eb576020815f92602461090c96018386013783010152611676565b346103eb5760203660031901126103eb576001600160a01b03610fe46103ef565b165f526009602052602060018060d01b0361100160405f20611c76565b16604051908152f35b346103eb5760203660031901126103eb57600435611026611929565b66470de4df820000811161106a57600e54151580611055575b61104857600d55005b6110506117c8565b600d55005b50600f544281420311610cd35742141561103f565b630ca514df60e01b5f5260045266470de4df82000060245260445ffd5b346103eb5760403660031901126103eb576104416110a36103ef565b6024359033611967565b6064359060ff821682036103eb57565b6084359060ff821682036103eb57565b346103eb5760c03660031901126103eb576110e66103ef565b602435906044356110f56110ad565b6084359060a435928042116111b3579161117a939161116c6111719460405160208101917fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf835260018060a01b038a1660408301528a606083015260808201526080815261116460a0826107b3565b519020611ca0565b612236565b909291926122d7565b61118381611d86565b8093036111945761090c9250611c0a565b90506301d4b62360e61b5f5260018060a01b031660045260245260445ffd5b632341d78760e11b5f5260045260245ffd5b346103eb575f3660031901126103eb5761090c6117c8565b346103eb5760e03660031901126103eb576111f66103ef565b6111fe610405565b604435906064359261120e6110bd565b60a43560c435908642116112d55761129a9261129561122c86611d86565b9860405160208101917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9835260018060a01b0389169b8c604084015260018060a01b038b1660608401528b608084015260a083015260c082015260c0815261116460e0826107b3565b611cc6565b936001600160a01b038516036112b45761090c9350611da8565b6325c0072360e11b5f526001600160a01b038085166004521660245260445ffd5b8663313c898160e11b5f5260045260245ffd5b346103eb5760403660031901126103eb5760206106aa6113066103ef565b61130e610405565b906118ca565b346103eb5760403660031901126103eb5761132d6103ef565b6024359063ffffffff821682036103eb576113829161137c9161134e611911565b50611357611911565b506001600160a01b03165f908152600960205260409020611376611911565b50612353565b5061237c565b60408051825165ffffffffffff1681526020928301516001600160d01b03169281019290925290f35b346103eb5760203660031901126103eb576113c46103ef565b6113cc611929565b6001600160a01b0316801561140b57600b80546001600160a01b0319811683179091556001600160a01b03165f805160206127138339815191525f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b346103eb575f3660031901126103eb5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b6001600160a01b03165f90815260208190526040902090565b6001600160a01b03165f90815260096020526040902090565b9060018060a01b03165f5260205260405f2090565b908152602081019190915260400190565b346103eb5760203660031901126103eb576001600160a01b036114d16103ef565b165f52601160205260405f2060018154910154906103656040519283928361149f565b634e487b7160e01b5f52601160045260245ffd5b906301e133808201809211610cd357565b9060018201809211610cd357565b91908201809211610cd357565b5f19810191908211610cd357565b91908203918211610cd357565b81810292918115918404141715610cd357565b811561156c570490565b634e487b7160e01b5f52601260045260245ffd5b7f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000808301808411610cd357421015611635576001600160a01b0382165f9081526011602052604090205442938403938411610cd35761161260019261160d61030e9661162d9461154f565b611562565b6001600160a01b039093165f90815260116020526040902090565b015490611542565b506001600160a01b03165f908152601160205260409020805461030e92509060019061162d565b6001600160a01b03165f9081526020819052604090205490565b9061167f611929565b81516001600160401b0381116107ae576116a38161169e601054610747565b61174c565b602092601f82116001146116e3576116d3929382915f926116d8575b50508160011b915f199060031b1c19161790565b601055565b015190505f806116bf565b60105f52601f198216935f80516020612753833981519152915f5b868110611734575083600195961061171c575b505050811b01601055565b01515f1960f88460031b161c191690555f8080611711565b919260206001819286850151815501940192016116fe565b601f8111611758575050565b60105f5260205f20906020601f840160051c83019310611792575b601f0160051c01905b818110611787575050565b5f815560010161177c565b9091508190611773565b156117a357565b633601f27d60e11b5f5260045ffd5b156117b957565b63bbb80c2b60e01b5f5260045ffd5b600e546117d681151561179c565b5f90600254600f5490600d54915b6117ed84611508565b421115611851576118499161183d611836611825611816611843956118118a611508565b611542565b611820888661154f565b61154f565b6a1a1601fc4ea7109e000000900490565b8092611527565b95611527565b92611508565b9192826117e4565b9091610f35949392824211611892575b505050611878906118738315156117b2565b600e55565b61188142600f55565b600b546001600160a01b0316611cd5565b6118256118c1936118b56118ae6118789798956118bb9561154f565b9142611542565b9061154f565b90611527565b91905f80611861565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba31461190a576119069160018060a01b03165f52600160205260405f2061148a565b5490565b50505f1990565b6040519061191e82610793565b5f6020838281520152565b600b546001600160a01b0316330361193d57565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b0316600452602452604452606490565b6001600160a01b038116939291908415610942576001600160a01b0382168015611a1b57600c546001600160a01b03811682149081611a0c575b50610924576119af82611458565b54958487106119f75784610f359697036119c884611458565b556119d284611458565b8054860190556040518581525f80516020612733833981519152908060208101610904565b63391434e360e21b5f52610921858885611950565b60ff915060a01c16155f6119a1565b63ec442f0560e01b5f525f60045260245ffd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480611b21575b15611a89577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152611b1b60c0826107b3565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614611a60565b65ffffffffffff8111611b625765ffffffffffff1690565b6306dfcc6560e41b5f52603060045260245260445ffd5b908154905f829160058411611bb7575b611b94935084611f80565b80611b9f5750505f90565b611ba890611534565b905f5260205f20015460301c90565b9192611bc281611e0d565b8103908111610cd357611b9493855f5265ffffffffffff8260205f2001541665ffffffffffff8516105f14611bf8575091611b89565b929150611c0490611519565b90611b89565b6001600160a01b038181165f81815260086020526040812080548685166001600160a01b031982168117909255610f3596941694611c709390928691907f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9080a461165c565b91611fe4565b80549081611c845750505f90565b815f19810111610cd3575f525f199060205f2001015460301c90565b604290611cab611a2e565b906040519161190160f01b8352600283015260228201522090565b9161030e939161117193612236565b91906001600160a01b0383168015611a1b57600c546001600160a01b03811682149081611d77575b5061092457611d16611d1183600254611527565b600255565b611d1f84611458565b8054830190556040518281525f905f8051602061273383398151915290602090a3600254926001600160d01b03808511611d605750610f359293505f6124c2565b630e58ae9360e11b5f52600485905260245260445ffd5b60ff915060a01c16155f611cfd565b6001600160a01b03165f90815260076020526040902080546001810190915590565b6001600160a01b031690811561060d576001600160a01b0381169283156105fa5780611e007f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593855f52600160205260405f2061148a565b55604051908152602090a3565b8015611f7b5761030e90611f11611f0a611f00611ef6611eec611ee2611ed8611ece6001611ebc5f8b608081901c80611f6d575b5080611e50611eb29260401c90565b80611f60575b50611e618160201c90565b80611f53575b50611e728160101c90565b80611f46575b50611e838160081c90565b80611f39575b50611e948160041c90565b80611f2c575b50611ea58160021c90565b80611f1f575b5060011c90565b611f175760011c90565b1b611ec7818b611562565b0160011c90565b611ec7818a611562565b611ec78189611562565b611ec78188611562565b611ec78187611562565b611ec78186611562565b611ec78185611562565b8092611562565b906123a0565b820160011c90565b600291509201915f611eab565b600491509201915f611e9a565b600891509201915f611e89565b601091509201915f611e78565b602091509201915f611e67565b604091509201915f611e56565b608092509050611eb2611e41565b505f90565b91905b838210611f905750505090565b9091928083169080841860011c8201809211610cd357845f5265ffffffffffff8260205f2001541665ffffffffffff8416105f14611fd25750925b9190611f83565b939250611fde90611519565b91611fcb565b6001600160a01b038083169392919081169081851415806120c3575b61200c575b5050505050565b81612073575b505082612021575b8080612005565b5f805160206127738339815191529161204561203f61204b93611471565b916123b2565b9061241b565b604051918291612068916001600160d01b0391821691168361149f565b0390a25f808061201a565b61209c61208d5f8051602061277383398151915292611471565b612096866123b2565b906123e3565b6040519182916120b9916001600160d01b0391821691168361149f565b0390a25f80612012565b50831515612000565b60ff81146120dd5761030e90612484565b50604051600554815f6120ef83610747565b80835292600181169081156121725750600114612113575b61030e925003826107b3565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b81831061215657505090602061030e92820101612107565b602091935080600191548385880101520191019091839261213e565b6020925061030e94915060ff191682840152151560051b820101612107565b60ff81146121a25761030e90612484565b50604051600654815f6121b483610747565b808352926001811690811561217257506001146121d75761030e925003826107b3565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b81831061221a57505090602061030e92820101612107565b6020919350806001915483858801015201910190918392612202565b91906fa2a8918ca85bafe22016d0b997e4df60600160ff1b0384116122ae579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156122a3575f516001600160a01b0381161561229957905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b600411156122c357565b634e487b7160e01b5f52602160045260245ffd5b6122e0816122b9565b806122e9575050565b6122f2816122b9565b600181036123095763f645eedf60e01b5f5260045ffd5b612312816122b9565b6002810361232d575063fce698f760e01b5f5260045260245ffd5b806123396003926122b9565b146123415750565b6335e2f38360e21b5f5260045260245ffd5b8054821015612368575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b9060405161238981610793565b915465ffffffffffff8116835260301c6020830152565b90808210156123ad575090565b905090565b6001600160d01b0381116123cc576001600160d01b031690565b6306dfcc6560e41b5f5260d060045260245260445ffd5b906123ed43611b4a565b906123f783611c76565b6001600160d01b039182169082160391908211610cd357612417926125f3565b9091565b9061242543611b4a565b9061242f83611c76565b6001600160d01b039182169082160191908211610cd357612417926125f3565b61245843611b4a565b90612463600a611c76565b6001600160d01b0391821690821603908111610cd35761241791600a6125f3565b60ff811690601f82116124b357604051916124a06040846107b3565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b9091906001600160a01b03168015612529575b610f35926001600160a01b0316908115612511575b5f90815260086020526040808220549282529020546001600160a01b039081169116611fe4565b61252261251d846123b2565b61244f565b50506124ea565b612532826123b2565b9261253c43611b4a565b93612547600a611c76565b6001600160d01b039182169082160194908511610cd357610f359461256d91600a6125f3565b90505092506124d5565b9065ffffffffffff82549181199060301b169116179055565b8054600160401b8110156107ae576125ad91600182018155612353565b6125e0578165ffffffffffff610f3593511665ffffffffffff19835416178255602060018060d01b039101511690612577565b634e487b7160e01b5f525f60045260245ffd5b8054929392919082156126e95761261f61261a61260f85611534565b835f5260205f200190565b61237c565b9065ffffffffffff612637835165ffffffffffff1690565b81851691829116116126da5761269e94602094889261266a61265f875165ffffffffffff1690565b65ffffffffffff1690565b036126a257506126909261268061268b92611534565b905f5260205f200190565b612577565b01516001600160d01b031690565b9190565b9150506126d5916126c26126b4610f26565b65ffffffffffff9093168352565b6001600160d01b03881682860152612590565b612690565b632520601d60e01b5f5260045ffd5b61270d92506126f96126b4610f26565b6001600160d01b0385166020830152612590565b5f919056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724a164736f6c634300081a000ac65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a7dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724' as const;\n","export default '0x60a03460b257601f610b8338819003918201601f19168301916001600160401b0383118484101760b65780849260209460405283398101031260b257516001600160a01b038116810360b257608052604051610ab890816100cb823960805181818160e1015281816101b701528181610217015281816102ba0152818161034a015281816103f50152818161045b015281816104a2015281816104e90152818161054c0152818161060701526107170152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80631c7ccb4c146106a357806353e9c1fb146105de5780637c40f1fe1461050d5780638a2bb9e6146104c657806397fd7b421461048b5780639ec538c814610440578063c815641c146103d5578063caedab5414610309578063dacf1d2f14610246578063dc4c90d314610202578063f0928f29146101835763fa6793d51461009d575f80fd5b34610158576020366003190112610158576100b9600435610a1c565b6003810180911161016f57604051631e2eaeaf60e01b815260048101919091526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610164575f9061012d575b6040516001600160801b039091168152602090f35b506020813d60201161015c575b81610147602093836107c2565b810103126101585760209051610118565b5f80fd5b3d915061013a565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b346101585761019a610194366107ac565b90610a78565b604051631e2eaeaf60e01b815260048101919091526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610164575f9061012d576040516001600160801b039091168152602090f35b34610158575f366003190112610158576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101585760a0366003190112610158576024356001600160a01b03811681036101585761027261079c565b6064358060020b810361015857610305926102de926040519260843560268501526006840152600383015281525f603a600c83012091816040820152816020820152526004357f00000000000000000000000000000000000000000000000000000000000000006108fb565b604080516001600160801b0390941684526020840192909252908201529081906060820190565b0390f35b346101585760403660031901126101585761032d61032561078c565b600435610a42565b604051631e2eaeaf60e01b815260048101919091526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610164575f906103a2575b604080516001600160801b038316815260809290921d600f0b602083015290f35b506020813d6020116103cd575b816103bc602093836107c2565b810103126101585760409051610381565b3d91506103af565b3461015857602036600319011261015857608062ffffff806104196004357f000000000000000000000000000000000000000000000000000000000000000061097d565b9294916040519560018060a01b0316865260020b6020860152166040840152166060820152f35b3461015857602036600319011261015857604061047f6004357f0000000000000000000000000000000000000000000000000000000000000000610972565b82519182526020820152f35b34610158576103056102de61049f366107ac565b907f00000000000000000000000000000000000000000000000000000000000000006108fb565b3461015857604036600319011261015857604061047f6104e461078c565b6004357f000000000000000000000000000000000000000000000000000000000000000061087c565b346101585760403660031901126101585761052961032561078c565b604051631afeb18d60e11b81526004810191909152600360248201525f816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610164576080915f916105bc575b50602081015190606060408201519101519060405192600180861b0381168452841d600f0b602084015260408301526060820152f35b6105d891503d805f833e6105d081836107c2565b8101906107f9565b82610586565b346101585760603660031901126101585760406004356105fc61078c565b9061060561079c565b7f0000000000000000000000000000000000000000000000000000000000000000906106318383610972565b9061063d86868661087c565b96909361065661064e82898961087c565b98909761097d565b5050905060020b9160020b82125f1461067c575050505003910382519182526020820152f35b95969593949360020b1361069457505003910361047f565b9493929094030392030361047f565b34610158576040366003190112610158576024358060010b809103610158576106cd600435610a1c565b6005810180911161016f5760405190602082019283526040820152604081526106f76060826107c2565b519020604051631e2eaeaf60e01b815260048101919091526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015610164575f90610759575b602090604051908152f35b506020813d602011610784575b81610773602093836107c2565b81010312610158576020905161074e565b3d9150610766565b602435908160020b820361015857565b604435908160020b820361015857565b6040906003190112610158576004359060243590565b601f909101601f19168101906001600160401b038211908210176107e557604052565b634e487b7160e01b5f52604160045260245ffd5b602081830312610158578051906001600160401b03821161015857019080601f83011215610158578151916001600160401b0383116107e5578260051b906040519361084860208401866107c2565b845260208085019282010192831161015857602001905b82821061086c5750505090565b815181526020918201910161085f565b929161088791610a42565b6001810180911161016f57604051631afeb18d60e11b8152600481019190915260026024820152915f90839060449082906001600160a01b03165afa918215610164575f926108df575b506040602083015192015190565b6108f49192503d805f833e6105d081836107c2565b905f6108d1565b91610907905f92610a78565b604051631afeb18d60e11b815260048101919091526003602482015291829060449082906001600160a01b03165afa908115610164575f91610958575b506020810151916060604083015192015190565b61096c91503d805f833e6105d081836107c2565b5f610944565b919061088790610a1c565b919061098a602091610a1c565b604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa918215610164575f926109e8575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d602011610a14575b81610a04602093836107c2565b810103126101585751905f6109c0565b3d91506109f7565b604051602081019182526006604082015260408152610a3c6060826107c2565b51902090565b610a4b90610a1c565b6004810180911161016f5760405190602082019260020b8352604082015260408152610a3c6060826107c2565b610a8190610a1c565b6006810180911161016f576040519060208201928352604082015260408152610a3c6060826107c256fea164736f6c634300081a000a' as const;\n","import { feesManagerAbi } from './multicurve/feeClaimsAbi';\n\n// Core contract ABIs needed for static and dynamic auctions\n\nexport { dopplerDN404Abi } from './dopplerDN404';\nexport {\n  feeClaimsInitializerAbi,\n  feesManagerAbi,\n} from './multicurve/feeClaimsAbi';\n\nexport const topUpDistributorAbi = [\n  {\n    type: 'function',\n    name: 'topUp',\n    inputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n] as const;\n\nexport const airlockAbi = [\n  {\n    type: 'constructor',\n    inputs: [{ name: 'owner_', type: 'address', internalType: 'address' }],\n    stateMutability: 'nonpayable',\n  },\n  { type: 'receive', stateMutability: 'payable' },\n  {\n    type: 'function',\n    name: 'collectIntegratorFees',\n    inputs: [\n      { name: 'to', type: 'address', internalType: 'address' },\n      { name: 'token', type: 'address', internalType: 'address' },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'collectProtocolFees',\n    inputs: [\n      { name: 'to', type: 'address', internalType: 'address' },\n      { name: 'token', type: 'address', internalType: 'address' },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'create',\n    inputs: [\n      {\n        name: 'createData',\n        type: 'tuple',\n        internalType: 'struct CreateParams',\n        components: [\n          { name: 'initialSupply', type: 'uint256', internalType: 'uint256' },\n          { name: 'numTokensToSell', type: 'uint256', internalType: 'uint256' },\n          { name: 'numeraire', type: 'address', internalType: 'address' },\n          {\n            name: 'tokenFactory',\n            type: 'address',\n            internalType: 'contract ITokenFactory',\n          },\n          { name: 'tokenFactoryData', type: 'bytes', internalType: 'bytes' },\n          {\n            name: 'governanceFactory',\n            type: 'address',\n            internalType: 'contract IGovernanceFactory',\n          },\n          {\n            name: 'governanceFactoryData',\n            type: 'bytes',\n            internalType: 'bytes',\n          },\n          {\n            name: 'poolInitializer',\n            type: 'address',\n            internalType: 'contract IPoolInitializer',\n          },\n          { name: 'poolInitializerData', type: 'bytes', internalType: 'bytes' },\n          {\n            name: 'liquidityMigrator',\n            type: 'address',\n            internalType: 'contract ILiquidityMigrator',\n          },\n          {\n            name: 'liquidityMigratorData',\n            type: 'bytes',\n            internalType: 'bytes',\n          },\n          { name: 'integrator', type: 'address', internalType: 'address' },\n          { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n        ],\n      },\n    ],\n    outputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'pool', type: 'address', internalType: 'address' },\n      { name: 'governance', type: 'address', internalType: 'address' },\n      { name: 'timelock', type: 'address', internalType: 'address' },\n      { name: 'migrationPool', type: 'address', internalType: 'address' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getAssetData',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      { name: 'timelock', type: 'address', internalType: 'address' },\n      { name: 'governance', type: 'address', internalType: 'address' },\n      {\n        name: 'liquidityMigrator',\n        type: 'address',\n        internalType: 'contract ILiquidityMigrator',\n      },\n      {\n        name: 'poolInitializer',\n        type: 'address',\n        internalType: 'contract IPoolInitializer',\n      },\n      { name: 'pool', type: 'address', internalType: 'address' },\n      { name: 'migrationPool', type: 'address', internalType: 'address' },\n      { name: 'numTokensToSell', type: 'uint256', internalType: 'uint256' },\n      { name: 'totalSupply', type: 'uint256', internalType: 'uint256' },\n      { name: 'integrator', type: 'address', internalType: 'address' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getModuleState',\n    inputs: [{ name: 'module', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'state', type: 'uint8', internalType: 'enum ModuleState' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'integratorFees',\n    inputs: [\n      { name: 'integrator', type: 'address', internalType: 'address' },\n      { name: 'token', type: 'address', internalType: 'address' },\n    ],\n    outputs: [{ name: 'amount', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'migrate',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'owner',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'protocolFees',\n    inputs: [{ name: 'token', type: 'address', internalType: 'address' }],\n    outputs: [{ name: 'amount', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'renounceOwnership',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'setModuleState',\n    inputs: [\n      { name: 'modules', type: 'address[]', internalType: 'address[]' },\n      { name: 'states', type: 'uint8[]', internalType: 'enum ModuleState[]' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'transferOwnership',\n    inputs: [{ name: 'newOwner', type: 'address', internalType: 'address' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'event',\n    name: 'Collect',\n    inputs: [\n      { name: 'to', type: 'address', indexed: true, internalType: 'address' },\n      {\n        name: 'token',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Create',\n    inputs: [\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: false,\n        internalType: 'address',\n      },\n      {\n        name: 'numeraire',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'initializer',\n        type: 'address',\n        indexed: false,\n        internalType: 'address',\n      },\n      {\n        name: 'poolOrHook',\n        type: 'address',\n        indexed: false,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Migrate',\n    inputs: [\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      { name: 'pool', type: 'address', indexed: true, internalType: 'address' },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'OwnershipTransferred',\n    inputs: [\n      {\n        name: 'previousOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'newOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'SetModuleState',\n    inputs: [\n      {\n        name: 'module',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'state',\n        type: 'uint8',\n        indexed: true,\n        internalType: 'enum ModuleState',\n      },\n    ],\n    anonymous: false,\n  },\n  { type: 'error', name: 'ArrayLengthsMismatch', inputs: [] },\n  {\n    type: 'error',\n    name: 'OwnableInvalidOwner',\n    inputs: [{ name: 'owner', type: 'address', internalType: 'address' }],\n  },\n  {\n    type: 'error',\n    name: 'OwnableUnauthorizedAccount',\n    inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n  },\n  {\n    type: 'error',\n    name: 'WrongModuleState',\n    inputs: [\n      { name: 'module', type: 'address', internalType: 'address' },\n      { name: 'expected', type: 'uint8', internalType: 'enum ModuleState' },\n      { name: 'actual', type: 'uint8', internalType: 'enum ModuleState' },\n    ],\n  },\n  // Pool initializer errors (included for better error decoding when calls bubble up)\n  {\n    type: 'error',\n    name: 'InvalidTickRange',\n    inputs: [\n      { name: 'tick', type: 'int24', internalType: 'int24' },\n      { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidTickRangeMisordered',\n    inputs: [\n      { name: 'tickLower', type: 'int24', internalType: 'int24' },\n      { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidFee',\n    inputs: [{ name: 'fee', type: 'uint24', internalType: 'uint24' }],\n  },\n  {\n    type: 'error',\n    name: 'CannotMigrateInsufficientTick',\n    inputs: [\n      { name: 'targetTick', type: 'int24', internalType: 'int24' },\n      { name: 'currentTick', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  { type: 'error', name: 'CannotMintZeroLiquidity', inputs: [] },\n  {\n    type: 'error',\n    name: 'MaxShareToBeSoldExceeded',\n    inputs: [\n      { name: 'value', type: 'uint256', internalType: 'uint256' },\n      { name: 'limit', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n  { type: 'error', name: 'PoolAlreadyExited', inputs: [] },\n  { type: 'error', name: 'PoolAlreadyInitialized', inputs: [] },\n  { type: 'error', name: 'PoolLocked', inputs: [] },\n  { type: 'error', name: 'SenderNotAirlock', inputs: [] },\n  { type: 'error', name: 'UnorderedBeneficiaries', inputs: [] },\n  { type: 'error', name: 'InvalidShares', inputs: [] },\n  { type: 'error', name: 'InvalidTotalShares', inputs: [] },\n  { type: 'error', name: 'InvalidProtocolOwnerShares', inputs: [] },\n  { type: 'error', name: 'InvalidProtocolOwnerBeneficiary', inputs: [] },\n] as const;\n\nexport const uniswapV3InitializerAbi = [\n  {\n    type: 'function',\n    name: 'encodePoolInitializerData',\n    inputs: [\n      {\n        name: 'params',\n        type: 'tuple',\n        components: [\n          { name: 'numTokensToSell', type: 'uint256' },\n          { name: 'startTick', type: 'int24' },\n          { name: 'endTick', type: 'int24' },\n          { name: 'fee', type: 'uint24' },\n        ],\n      },\n    ],\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'pure',\n  },\n] as const;\n\nexport const v2MigratorAbi = [\n  {\n    type: 'function',\n    name: 'encodeLiquidityMigratorData',\n    inputs: [],\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'pure',\n  },\n] as const;\n\nexport const v3MigratorAbi = [\n  {\n    type: 'function',\n    name: 'encodeLiquidityMigratorData',\n    inputs: [\n      { name: 'fee', type: 'uint24' },\n      { name: 'tickSpacing', type: 'int24' },\n    ],\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'pure',\n  },\n] as const;\n\nexport const v4MigratorAbi = [\n  {\n    type: 'function',\n    name: 'encodeLiquidityMigratorData',\n    inputs: [\n      { name: 'fee', type: 'uint24' },\n      { name: 'tickSpacing', type: 'int24' },\n      { name: 'lockDuration', type: 'uint256' },\n      { name: 'beneficiaries', type: 'address[]' },\n      { name: 'percentages', type: 'uint256[]' },\n    ],\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'pure',\n  },\n  // V4 Migrator errors\n  { type: 'error', name: 'TickOutOfRange', inputs: [] },\n  { type: 'error', name: 'ZeroLiquidity', inputs: [] },\n] as const;\n\nexport const uniswapV3PoolAbi = [\n  {\n    type: 'function',\n    name: 'slot0',\n    inputs: [],\n    outputs: [\n      { name: 'sqrtPriceX96', type: 'uint160' },\n      { name: 'tick', type: 'int24' },\n      { name: 'observationIndex', type: 'uint16' },\n      { name: 'observationCardinality', type: 'uint16' },\n      { name: 'observationCardinalityNext', type: 'uint16' },\n      { name: 'feeProtocol', type: 'uint8' },\n      { name: 'unlocked', type: 'bool' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'liquidity',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint128' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'token0',\n    inputs: [],\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'token1',\n    inputs: [],\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'fee',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint24' }],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const derc20Abi = [\n  {\n    type: 'function',\n    name: 'allowance',\n    inputs: [\n      { name: 'owner', type: 'address', internalType: 'address' },\n      { name: 'spender', type: 'address', internalType: 'address' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'approve',\n    inputs: [\n      { name: 'spender', type: 'address', internalType: 'address' },\n      { name: 'value', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  // OpenZeppelin Votes (governance) — delegation + queries\n  {\n    type: 'function',\n    name: 'delegate',\n    inputs: [{ name: 'delegatee', type: 'address', internalType: 'address' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'delegateBySig',\n    inputs: [\n      { name: 'delegatee', type: 'address', internalType: 'address' },\n      { name: 'nonce', type: 'uint256', internalType: 'uint256' },\n      { name: 'expiry', type: 'uint256', internalType: 'uint256' },\n      { name: 'v', type: 'uint8', internalType: 'uint8' },\n      { name: 'r', type: 'bytes32', internalType: 'bytes32' },\n      { name: 's', type: 'bytes32', internalType: 'bytes32' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'delegates',\n    inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getVotes',\n    inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPastVotes',\n    inputs: [\n      { name: 'account', type: 'address', internalType: 'address' },\n      { name: 'timepoint', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPastTotalSupply',\n    inputs: [{ name: 'timepoint', type: 'uint256', internalType: 'uint256' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'nonces',\n    inputs: [{ name: 'owner', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'DOMAIN_SEPARATOR',\n    inputs: [],\n    outputs: [{ name: '', type: 'bytes32', internalType: 'bytes32' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'balanceOf',\n    inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'computeAvailableVestedAmount',\n    inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'currentYearStart',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'decimals',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint8', internalType: 'uint8' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getVestingDataOf',\n    inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'totalAmount', type: 'uint256', internalType: 'uint256' },\n      { name: 'releasedAmount', type: 'uint256', internalType: 'uint256' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isPoolUnlocked',\n    inputs: [],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'lastMintTimestamp',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'name',\n    inputs: [],\n    outputs: [{ name: '', type: 'string', internalType: 'string' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'pool',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'release',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'symbol',\n    inputs: [],\n    outputs: [{ name: '', type: 'string', internalType: 'string' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'tokenURI',\n    inputs: [],\n    outputs: [{ name: '', type: 'string', internalType: 'string' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalSupply',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'transfer',\n    inputs: [\n      { name: 'to', type: 'address', internalType: 'address' },\n      { name: 'value', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'transferFrom',\n    inputs: [\n      { name: 'from', type: 'address', internalType: 'address' },\n      { name: 'to', type: 'address', internalType: 'address' },\n      { name: 'value', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'vestedTotalAmount',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingDuration',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingStart',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'yearlyMintRate',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  // DERC20 errors\n  { type: 'error', name: 'MintingNotStartedYet', inputs: [] },\n  { type: 'error', name: 'ExceedsYearlyMintCap', inputs: [] },\n  { type: 'error', name: 'NoMintableAmount', inputs: [] },\n  { type: 'error', name: 'PoolLocked', inputs: [] },\n  { type: 'error', name: 'ArrayLengthsMismatch', inputs: [] },\n  { type: 'error', name: 'ReleaseAmountInvalid', inputs: [] },\n  {\n    type: 'error',\n    name: 'MaxPreMintPerAddressExceeded',\n    inputs: [\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      { name: 'limit', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'MaxTotalPreMintExceeded',\n    inputs: [\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      { name: 'limit', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'MaxTotalVestedExceeded',\n    inputs: [\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      { name: 'limit', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n  { type: 'error', name: 'VestingNotStartedYet', inputs: [] },\n  {\n    type: 'error',\n    name: 'MaxYearlyMintRateExceeded',\n    inputs: [\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n      { name: 'limit', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n] as const;\n\nexport const derc20V2Abi = [\n  ...derc20Abi,\n  {\n    type: 'function',\n    name: 'computeAvailableVestedAmount',\n    inputs: [{ name: 'beneficiary', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'computeAvailableVestedAmount',\n    inputs: [\n      { name: 'beneficiary', type: 'address', internalType: 'address' },\n      { name: 'scheduleId', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getScheduleIdsOf',\n    inputs: [{ name: 'beneficiary', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256[]', internalType: 'uint256[]' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'release',\n    inputs: [{ name: 'scheduleId', type: 'uint256', internalType: 'uint256' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'releaseFor',\n    inputs: [\n      { name: 'beneficiary', type: 'address', internalType: 'address' },\n      { name: 'scheduleId', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'releaseFor',\n    inputs: [{ name: 'beneficiary', type: 'address', internalType: 'address' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'totalAllocatedOf',\n    inputs: [{ name: 'beneficiary', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingOf',\n    inputs: [\n      { name: 'beneficiary', type: 'address', internalType: 'address' },\n      { name: 'scheduleId', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [\n      { name: 'totalAmount', type: 'uint256', internalType: 'uint256' },\n      { name: 'releasedAmount', type: 'uint256', internalType: 'uint256' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingScheduleCount',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingSchedules',\n    inputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    outputs: [\n      { name: 'cliff', type: 'uint64', internalType: 'uint64' },\n      { name: 'duration', type: 'uint64', internalType: 'uint64' },\n    ],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const dopplerERC20V1Abi = [\n  {\n    type: 'constructor',\n    inputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'CLOCK_MODE',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'string',\n        internalType: 'string',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'DOMAIN_SEPARATOR',\n    inputs: [],\n    outputs: [\n      {\n        name: 'result',\n        type: 'bytes32',\n        internalType: 'bytes32',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'allowance',\n    inputs: [\n      {\n        name: 'owner',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'spender',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'approve',\n    inputs: [\n      {\n        name: 'spender',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'bool',\n        internalType: 'bool',\n      },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'balanceLimitEnd',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint48',\n        internalType: 'uint48',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'balanceOf',\n    inputs: [\n      {\n        name: 'owner',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'burn',\n    inputs: [\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'cancelOwnershipHandover',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'checkpointAt',\n    inputs: [\n      {\n        name: 'account',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'i',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: 'checkpointClock',\n        type: 'uint48',\n        internalType: 'uint48',\n      },\n      {\n        name: 'checkpointValue',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'checkpointCount',\n    inputs: [\n      {\n        name: 'account',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'clock',\n    inputs: [],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint48',\n        internalType: 'uint48',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'completeOwnershipHandover',\n    inputs: [\n      {\n        name: 'pendingOwner',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'computeAvailableVestedAmount',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'computeAvailableVestedAmount',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'total',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'controller',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'decimals',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint8',\n        internalType: 'uint8',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'delegate',\n    inputs: [\n      {\n        name: 'delegatee',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'delegateBySig',\n    inputs: [\n      {\n        name: 'delegatee',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'nonce',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'expiry',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'v',\n        type: 'uint8',\n        internalType: 'uint8',\n      },\n      {\n        name: 'r',\n        type: 'bytes32',\n        internalType: 'bytes32',\n      },\n      {\n        name: 's',\n        type: 'bytes32',\n        internalType: 'bytes32',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'delegates',\n    inputs: [\n      {\n        name: 'delegator',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'result',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'disableBalanceLimit',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getPastVotes',\n    inputs: [\n      {\n        name: 'account',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'timepoint',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPastVotesTotalSupply',\n    inputs: [\n      {\n        name: 'timepoint',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getScheduleIdsOf',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256[]',\n        internalType: 'uint256[]',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getVotes',\n    inputs: [\n      {\n        name: 'account',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getVotesTotalSupply',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'initialize',\n    inputs: [\n      {\n        name: 'name_',\n        type: 'string',\n        internalType: 'string',\n      },\n      {\n        name: 'symbol_',\n        type: 'string',\n        internalType: 'string',\n      },\n      {\n        name: 'initialSupply',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'recipient',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'owner_',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'schedules',\n        type: 'tuple[]',\n        internalType: 'struct VestingSchedule[]',\n        components: [\n          {\n            name: 'cliff',\n            type: 'uint64',\n            internalType: 'uint64',\n          },\n          {\n            name: 'duration',\n            type: 'uint64',\n            internalType: 'uint64',\n          },\n        ],\n      },\n      {\n        name: 'beneficiaries',\n        type: 'address[]',\n        internalType: 'address[]',\n      },\n      {\n        name: 'scheduleIds',\n        type: 'uint256[]',\n        internalType: 'uint256[]',\n      },\n      {\n        name: 'amounts',\n        type: 'uint256[]',\n        internalType: 'uint256[]',\n      },\n      {\n        name: 'tokenURI_',\n        type: 'string',\n        internalType: 'string',\n      },\n      {\n        name: 'maxBalanceLimit_',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'balanceLimitEnd_',\n        type: 'uint48',\n        internalType: 'uint48',\n      },\n      {\n        name: 'controller_',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'excludedFromBalanceLimit',\n        type: 'address[]',\n        internalType: 'address[]',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'isBalanceLimitActive',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'bool',\n        internalType: 'bool',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isExcludedFromBalanceLimit',\n    inputs: [\n      {\n        name: 'account',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'excluded',\n        type: 'bool',\n        internalType: 'bool',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isPoolLocked',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'bool',\n        internalType: 'bool',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'lockPool',\n    inputs: [\n      {\n        name: 'pool_',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'maxBalanceLimit',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'name',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'string',\n        internalType: 'string',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'nonces',\n    inputs: [\n      {\n        name: 'owner',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'owner',\n    inputs: [],\n    outputs: [\n      {\n        name: 'result',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'ownershipHandoverExpiresAt',\n    inputs: [\n      {\n        name: 'pendingOwner',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'permit',\n    inputs: [\n      {\n        name: 'owner',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'spender',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'value',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'deadline',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'v',\n        type: 'uint8',\n        internalType: 'uint8',\n      },\n      {\n        name: 'r',\n        type: 'bytes32',\n        internalType: 'bytes32',\n      },\n      {\n        name: 's',\n        type: 'bytes32',\n        internalType: 'bytes32',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'pool',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'release',\n    inputs: [\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'release',\n    inputs: [\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'releaseFor',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'releaseFor',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'renounceOwnership',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'requestOwnershipHandover',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'symbol',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'string',\n        internalType: 'string',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'tokenURI',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'string',\n        internalType: 'string',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalAllocatedOf',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalSupply',\n    inputs: [],\n    outputs: [\n      {\n        name: 'result',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'transfer',\n    inputs: [\n      {\n        name: 'to',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'bool',\n        internalType: 'bool',\n      },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'transferFrom',\n    inputs: [\n      {\n        name: 'from',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'to',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: '',\n        type: 'bool',\n        internalType: 'bool',\n      },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'transferOwnership',\n    inputs: [\n      {\n        name: 'newOwner',\n        type: 'address',\n        internalType: 'address',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'unlockPool',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'updateTokenURI',\n    inputs: [\n      {\n        name: 'tokenURI_',\n        type: 'string',\n        internalType: 'string',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'vestedTotalAmount',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingOf',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        internalType: 'address',\n      },\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: 'totalAmount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'releasedAmount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingScheduleCount',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingSchedules',\n    inputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [\n      {\n        name: 'cliff',\n        type: 'uint64',\n        internalType: 'uint64',\n      },\n      {\n        name: 'duration',\n        type: 'uint64',\n        internalType: 'uint64',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingStart',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'event',\n    name: 'Approval',\n    inputs: [\n      {\n        name: 'owner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'spender',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'BalanceLimitDisabled',\n    inputs: [\n      {\n        name: 'expired',\n        type: 'bool',\n        indexed: false,\n        internalType: 'bool',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'DelegateChanged',\n    inputs: [\n      {\n        name: 'delegator',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'from',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'to',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'DelegateVotesChanged',\n    inputs: [\n      {\n        name: 'delegate',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'oldValue',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'newValue',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Initialized',\n    inputs: [\n      {\n        name: 'version',\n        type: 'uint64',\n        indexed: false,\n        internalType: 'uint64',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'OwnershipHandoverCanceled',\n    inputs: [\n      {\n        name: 'pendingOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'OwnershipHandoverRequested',\n    inputs: [\n      {\n        name: 'pendingOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'OwnershipTransferred',\n    inputs: [\n      {\n        name: 'oldOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'newOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TokensReleased',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Transfer',\n    inputs: [\n      {\n        name: 'from',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'to',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'UpdateTokenURI',\n    inputs: [\n      {\n        name: 'tokenURI',\n        type: 'string',\n        indexed: false,\n        internalType: 'string',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'VestingAllocated',\n    inputs: [\n      {\n        name: 'beneficiary',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'VestingScheduleCreated',\n    inputs: [\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n      {\n        name: 'cliff',\n        type: 'uint64',\n        indexed: false,\n        internalType: 'uint64',\n      },\n      {\n        name: 'duration',\n        type: 'uint64',\n        indexed: false,\n        internalType: 'uint64',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'error',\n    name: 'AllowanceOverflow',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'AllowanceUnderflow',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'AlreadyInitialized',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ArrayLengthsMismatch',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'BalanceLimitExceeded',\n    inputs: [\n      {\n        name: 'balance',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'limit',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'BalanceLimitNotActive',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ERC5805CheckpointIndexOutOfBounds',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ERC5805CheckpointValueOverflow',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ERC5805CheckpointValueUnderflow',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ERC5805DelegateInvalidSignature',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ERC5805DelegateSignatureExpired',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'ERC5805FutureLookup',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'InsufficientAllowance',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'InsufficientBalance',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'InsufficientReleasableAmount',\n    inputs: [\n      {\n        name: 'available',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'requested',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidAllocation',\n    inputs: [\n      {\n        name: 'index',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidBalanceLimit',\n    inputs: [\n      {\n        name: 'limit',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidBalanceLimitTimestamp',\n    inputs: [\n      {\n        name: 'specified',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'current',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidInitialization',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'InvalidPermit',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'InvalidSchedule',\n    inputs: [\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'MaxPreMintPerAddressExceeded',\n    inputs: [\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'limit',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'MaxTotalPreMintExceeded',\n    inputs: [\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'limit',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'MaxTotalVestedExceeded',\n    inputs: [\n      {\n        name: 'amount',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'limit',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'NewOwnerIsZeroAddress',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'NoHandoverRequest',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'NoReleasableAmount',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'NotInitializing',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'Permit2AllowanceIsFixedAtInfinity',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'PermitExpired',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'PoolAlreadyLocked',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'PoolAlreadyUnlocked',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'PoolLocked',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'TotalSupplyOverflow',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'Unauthorized',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'UnknownScheduleId',\n    inputs: [\n      {\n        name: 'scheduleId',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n  },\n] as const;\n\nexport const uniswapV4InitializerAbi = [\n  {\n    type: 'function',\n    name: 'encodePoolInitializerData',\n    inputs: [\n      {\n        name: 'params',\n        type: 'tuple',\n        components: [\n          { name: 'minimumProceeds', type: 'uint256' },\n          { name: 'maximumProceeds', type: 'uint256' },\n          { name: 'startingTime', type: 'uint256' },\n          { name: 'endingTime', type: 'uint256' },\n          { name: 'startingTick', type: 'int24' },\n          { name: 'endingTick', type: 'int24' },\n          { name: 'epochLength', type: 'uint256' },\n          { name: 'gamma', type: 'int24' },\n          { name: 'isToken0', type: 'bool' },\n          { name: 'numPDSlugs', type: 'uint256' },\n          { name: 'fee', type: 'uint24' },\n          { name: 'tickSpacing', type: 'int24' },\n        ],\n      },\n    ],\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'pure',\n  },\n] as const;\n\nexport const dopplerHookAbi = [\n  {\n    type: 'function',\n    name: 'state',\n    inputs: [],\n    outputs: [\n      { name: 'lastEpoch', type: 'uint40' },\n      { name: 'tickAccumulator', type: 'int256' },\n      { name: 'totalTokensSold', type: 'uint256' },\n      { name: 'totalProceeds', type: 'uint256' },\n      { name: 'totalTokensSoldLastEpoch', type: 'uint256' },\n      // BalanceDelta is encoded as a single int256 in the compiled ABI.\n      { name: 'feesAccrued', type: 'int256' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'earlyExit',\n    inputs: [],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'insufficientProceeds',\n    inputs: [],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'poolKey',\n    inputs: [],\n    outputs: [\n      { name: 'currency0', type: 'address' },\n      { name: 'currency1', type: 'address' },\n      { name: 'fee', type: 'uint24' },\n      { name: 'tickSpacing', type: 'int24' },\n      { name: 'hooks', type: 'address' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'startingTime',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'endingTime',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'epochLength',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minimumProceeds',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'maximumProceeds',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'numTokensToSell',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'startingTick',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'endingTick',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'gamma',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isToken0',\n    inputs: [],\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'numPDSlugs',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  // Doppler Hook errors\n  { type: 'error', name: 'InvalidGamma', inputs: [] },\n  { type: 'error', name: 'InvalidTimeRange', inputs: [] },\n  { type: 'error', name: 'CannotAddLiquidity', inputs: [] },\n  { type: 'error', name: 'CannotSwapBeforeStartTime', inputs: [] },\n  { type: 'error', name: 'SwapBelowRange', inputs: [] },\n  { type: 'error', name: 'InvalidStartTime', inputs: [] },\n  { type: 'error', name: 'InvalidTickRange', inputs: [] },\n  { type: 'error', name: 'InvalidTickSpacing', inputs: [] },\n  { type: 'error', name: 'InvalidEpochLength', inputs: [] },\n  { type: 'error', name: 'InvalidProceedLimits', inputs: [] },\n  { type: 'error', name: 'InvalidNumPDSlugs', inputs: [] },\n  {\n    type: 'error',\n    name: 'InvalidSwapAfterMaturitySufficientProceeds',\n    inputs: [],\n  },\n  {\n    type: 'error',\n    name: 'InvalidSwapAfterMaturityInsufficientProceeds',\n    inputs: [],\n  },\n  { type: 'error', name: 'MaximumProceedsReached', inputs: [] },\n  { type: 'error', name: 'SenderNotPoolManager', inputs: [] },\n  { type: 'error', name: 'AlreadyInitialized', inputs: [] },\n  { type: 'error', name: 'SenderNotInitializer', inputs: [] },\n  { type: 'error', name: 'CannotMigrate', inputs: [] },\n  { type: 'error', name: 'CannotDonate', inputs: [] },\n] as const;\n\nexport const openingAuctionAbi = [\n  {\n    type: 'function',\n    name: 'phase',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint8', internalType: 'enum AuctionPhase' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'auctionStartTime',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'auctionEndTime',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'clearingTick',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24', internalType: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalTokensSold',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalProceeds',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'incentiveTokensTotal',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalAuctionTokens',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalIncentivesClaimed',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'incentivesClaimDeadline',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'positions',\n    inputs: [{ name: 'positionId', type: 'uint256', internalType: 'uint256' }],\n    outputs: [\n      {\n        name: '',\n        type: 'tuple',\n        internalType: 'struct AuctionPosition',\n        components: [\n          { name: 'owner', type: 'address', internalType: 'address' },\n          { name: 'tickLower', type: 'int24', internalType: 'int24' },\n          { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n          { name: 'liquidity', type: 'uint128', internalType: 'uint128' },\n          {\n            name: 'rewardDebtX128',\n            type: 'uint256',\n            internalType: 'uint256',\n          },\n          {\n            name: 'hasClaimedIncentives',\n            type: 'bool',\n            internalType: 'bool',\n          },\n        ],\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isInRange',\n    inputs: [{ name: 'positionId', type: 'uint256', internalType: 'uint256' }],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'calculateIncentives',\n    inputs: [{ name: 'positionId', type: 'uint256', internalType: 'uint256' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'settleAuction',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'claimIncentives',\n    inputs: [{ name: 'positionId', type: 'uint256', internalType: 'uint256' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'estimatedClearingTick',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24', internalType: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'liquidityAtTick',\n    inputs: [{ name: 'tick', type: 'int24', internalType: 'int24' }],\n    outputs: [{ name: '', type: 'uint128', internalType: 'uint128' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'nextPositionId',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'ownerPositions',\n    inputs: [\n      { name: 'owner', type: 'address', internalType: 'address' },\n      { name: 'index', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isToken0',\n    inputs: [],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'poolKey',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minLiquidity',\n    inputs: [],\n    outputs: [{ name: '', type: 'uint128', internalType: 'uint128' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minAcceptableTickToken0',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24', internalType: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minAcceptableTickToken1',\n    inputs: [],\n    outputs: [{ name: '', type: 'int24', internalType: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'event',\n    name: 'AuctionSettled',\n    inputs: [\n      {\n        name: 'clearingTick',\n        type: 'int24',\n        indexed: false,\n        internalType: 'int24',\n      },\n      {\n        name: 'tokensSold',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'proceeds',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'BidPlaced',\n    inputs: [\n      {\n        name: 'positionId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n      {\n        name: 'owner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'tickLower',\n        type: 'int24',\n        indexed: false,\n        internalType: 'int24',\n      },\n      {\n        name: 'liquidity',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'BidWithdrawn',\n    inputs: [\n      {\n        name: 'positionId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'IncentivesClaimed',\n    inputs: [\n      {\n        name: 'positionId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n      {\n        name: 'owner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'EstimatedClearingTickUpdated',\n    inputs: [\n      {\n        name: 'newEstimatedClearingTick',\n        type: 'int24',\n        indexed: false,\n        internalType: 'int24',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'PhaseChanged',\n    inputs: [\n      { name: 'oldPhase', type: 'uint8', indexed: true, internalType: 'uint8' },\n      { name: 'newPhase', type: 'uint8', indexed: true, internalType: 'uint8' },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'AuctionStarted',\n    inputs: [\n      {\n        name: 'auctionStartTime',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'auctionEndTime',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'totalAuctionTokens',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'incentiveTokensTotal',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TickEnteredRange',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true, internalType: 'int24' },\n      {\n        name: 'liquidity',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TickExitedRange',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true, internalType: 'int24' },\n      {\n        name: 'liquidity',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'LiquidityAddedToTick',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true, internalType: 'int24' },\n      {\n        name: 'liquidityAdded',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n      {\n        name: 'totalLiquidity',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'LiquidityRemovedFromTick',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true, internalType: 'int24' },\n      {\n        name: 'liquidityRemoved',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n      {\n        name: 'remainingLiquidity',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TimeHarvested',\n    inputs: [\n      {\n        name: 'positionId',\n        type: 'uint256',\n        indexed: true,\n        internalType: 'uint256',\n      },\n      {\n        name: 'harvestedTimeX128',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'IncentivesRecovered',\n    inputs: [\n      {\n        name: 'recipient',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n] as const;\n\nexport const openingAuctionInitializerAbi = [\n  {\n    type: 'function',\n    name: 'initialize',\n    inputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      {\n        name: 'numTokensToSell',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n      { name: 'data', type: 'bytes', internalType: 'bytes' },\n    ],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'poolManager',\n    inputs: [],\n    outputs: [\n      { name: '', type: 'address', internalType: 'contract IPoolManager' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'auctionDeployer',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'address',\n        internalType: 'contract OpeningAuctionDeployer',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'dopplerDeployer',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'address',\n        internalType: 'contract IDopplerDeployer',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'positionManager',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getState',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      {\n        name: 'auctionStartTime',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'auctionEndTime', type: 'uint256', internalType: 'uint256' },\n      { name: 'auctionTokens', type: 'uint256', internalType: 'uint256' },\n      { name: 'dopplerTokens', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'status',\n        type: 'uint8',\n        internalType: 'enum OpeningAuctionStatus',\n      },\n      {\n        name: 'openingAuctionHook',\n        type: 'address',\n        internalType: 'address',\n      },\n      { name: 'dopplerHook', type: 'address', internalType: 'address' },\n      {\n        name: 'openingAuctionPoolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      { name: 'dopplerInitData', type: 'bytes', internalType: 'bytes' },\n      { name: 'isToken0', type: 'bool', internalType: 'bool' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getOpeningAuctionHook',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getDopplerHook',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'completeAuction',\n    inputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'dopplerSalt', type: 'bytes32', internalType: 'bytes32' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'recoverOpeningAuctionIncentives',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'sweepOpeningAuctionIncentives',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'event',\n    name: 'AuctionCompleted',\n    inputs: [\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'clearingTick',\n        type: 'int24',\n        indexed: false,\n        internalType: 'int24',\n      },\n      {\n        name: 'tokensSold',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'proceeds',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n] as const;\n\n// Placeholder ABI for phase-2 bid-management wrappers.\nexport const openingAuctionPositionManagerAbi = [\n  {\n    type: 'function',\n    name: 'poolManager',\n    inputs: [],\n    outputs: [\n      { name: '', type: 'address', internalType: 'contract IPoolManager' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'modifyLiquidity',\n    inputs: [\n      {\n        name: 'key',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      {\n        name: 'params',\n        type: 'tuple',\n        internalType: 'struct IPoolManager.ModifyLiquidityParams',\n        components: [\n          { name: 'tickLower', type: 'int24', internalType: 'int24' },\n          { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n          {\n            name: 'liquidityDelta',\n            type: 'int256',\n            internalType: 'int256',\n          },\n          { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n        ],\n      },\n      { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n    ],\n    outputs: [{ name: 'delta', type: 'int256', internalType: 'BalanceDelta' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'modifyLiquidity',\n    inputs: [\n      {\n        name: 'key',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      {\n        name: 'params',\n        type: 'tuple',\n        internalType: 'struct IPoolManager.ModifyLiquidityParams',\n        components: [\n          { name: 'tickLower', type: 'int24', internalType: 'int24' },\n          { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n          {\n            name: 'liquidityDelta',\n            type: 'int256',\n            internalType: 'int256',\n          },\n          { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n        ],\n      },\n    ],\n    outputs: [{ name: 'delta', type: 'int256', internalType: 'BalanceDelta' }],\n    stateMutability: 'nonpayable',\n  },\n  // Common bubbled custom errors for easier revert decoding in SDK consumers.\n  {\n    type: 'error',\n    name: 'WrappedError',\n    inputs: [\n      { name: 'target', type: 'address', internalType: 'address' },\n      { name: 'selector', type: 'bytes4', internalType: 'bytes4' },\n      { name: 'reason', type: 'bytes', internalType: 'bytes' },\n      { name: 'details', type: 'bytes', internalType: 'bytes' },\n    ],\n  },\n  { type: 'error', name: 'HookCallFailed', inputs: [] },\n  { type: 'error', name: 'PositionIsLocked', inputs: [] },\n] as const;\n\nexport const quoterV2Abi = [\n  {\n    inputs: [\n      { internalType: 'address', name: '_factory', type: 'address' },\n      { internalType: 'address', name: '_WETH9', type: 'address' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'constructor',\n  },\n  {\n    inputs: [],\n    name: 'WETH9',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'factory',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'bytes', name: 'path', type: 'bytes' },\n      { internalType: 'uint256', name: 'amountIn', type: 'uint256' },\n    ],\n    name: 'quoteExactInput',\n    outputs: [\n      { internalType: 'uint256', name: 'amountOut', type: 'uint256' },\n      {\n        internalType: 'uint160[]',\n        name: 'sqrtPriceX96AfterList',\n        type: 'uint160[]',\n      },\n      {\n        internalType: 'uint32[]',\n        name: 'initializedTicksCrossedList',\n        type: 'uint32[]',\n      },\n      { internalType: 'uint256', name: 'gasEstimate', type: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      {\n        components: [\n          { internalType: 'address', name: 'tokenIn', type: 'address' },\n          { internalType: 'address', name: 'tokenOut', type: 'address' },\n          { internalType: 'uint256', name: 'amountIn', type: 'uint256' },\n          { internalType: 'uint24', name: 'fee', type: 'uint24' },\n          {\n            internalType: 'uint160',\n            name: 'sqrtPriceLimitX96',\n            type: 'uint160',\n          },\n        ],\n        internalType: 'struct IQuoterV2.QuoteExactInputSingleParams',\n        name: 'params',\n        type: 'tuple',\n      },\n    ],\n    name: 'quoteExactInputSingle',\n    outputs: [\n      { internalType: 'uint256', name: 'amountOut', type: 'uint256' },\n      { internalType: 'uint160', name: 'sqrtPriceX96After', type: 'uint160' },\n      {\n        internalType: 'uint32',\n        name: 'initializedTicksCrossed',\n        type: 'uint32',\n      },\n      { internalType: 'uint256', name: 'gasEstimate', type: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'bytes', name: 'path', type: 'bytes' },\n      { internalType: 'uint256', name: 'amountOut', type: 'uint256' },\n    ],\n    name: 'quoteExactOutput',\n    outputs: [\n      { internalType: 'uint256', name: 'amountIn', type: 'uint256' },\n      {\n        internalType: 'uint160[]',\n        name: 'sqrtPriceX96AfterList',\n        type: 'uint160[]',\n      },\n      {\n        internalType: 'uint32[]',\n        name: 'initializedTicksCrossedList',\n        type: 'uint32[]',\n      },\n      { internalType: 'uint256', name: 'gasEstimate', type: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      {\n        components: [\n          { internalType: 'address', name: 'tokenIn', type: 'address' },\n          { internalType: 'address', name: 'tokenOut', type: 'address' },\n          { internalType: 'uint256', name: 'amount', type: 'uint256' },\n          { internalType: 'uint24', name: 'fee', type: 'uint24' },\n          {\n            internalType: 'uint160',\n            name: 'sqrtPriceLimitX96',\n            type: 'uint160',\n          },\n        ],\n        internalType: 'struct IQuoterV2.QuoteExactOutputSingleParams',\n        name: 'params',\n        type: 'tuple',\n      },\n    ],\n    name: 'quoteExactOutputSingle',\n    outputs: [\n      { internalType: 'uint256', name: 'amountIn', type: 'uint256' },\n      { internalType: 'uint160', name: 'sqrtPriceX96After', type: 'uint160' },\n      {\n        internalType: 'uint32',\n        name: 'initializedTicksCrossed',\n        type: 'uint32',\n      },\n      { internalType: 'uint256', name: 'gasEstimate', type: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'int256', name: 'amount0Delta', type: 'int256' },\n      { internalType: 'int256', name: 'amount1Delta', type: 'int256' },\n      { internalType: 'bytes', name: '_data', type: 'bytes' },\n    ],\n    name: 'uniswapV3SwapCallback',\n    outputs: [],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const;\n\nexport const uniswapV2Router02Abi = [\n  {\n    inputs: [\n      { internalType: 'uint256', name: 'amountIn', type: 'uint256' },\n      { internalType: 'address[]', name: 'path', type: 'address[]' },\n    ],\n    name: 'getAmountsOut',\n    outputs: [\n      { internalType: 'uint256[]', name: 'amounts', type: 'uint256[]' },\n    ],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'uint256', name: 'amountOut', type: 'uint256' },\n      { internalType: 'address[]', name: 'path', type: 'address[]' },\n    ],\n    name: 'getAmountsIn',\n    outputs: [\n      { internalType: 'uint256[]', name: 'amounts', type: 'uint256[]' },\n    ],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const;\n\nexport const v4QuoterAbi = [\n  {\n    type: 'constructor',\n    inputs: [\n      {\n        name: '_poolManager',\n        type: 'address',\n        internalType: 'contract IPoolManager',\n      },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'quoteExactInputSingle',\n    inputs: [\n      {\n        name: 'params',\n        type: 'tuple',\n        internalType: 'struct IV4Quoter.QuoteExactSingleParams',\n        components: [\n          {\n            name: 'poolKey',\n            type: 'tuple',\n            internalType: 'struct PoolKey',\n            components: [\n              { name: 'currency0', type: 'address', internalType: 'Currency' },\n              { name: 'currency1', type: 'address', internalType: 'Currency' },\n              { name: 'fee', type: 'uint24', internalType: 'uint24' },\n              { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n              {\n                name: 'hooks',\n                type: 'address',\n                internalType: 'contract IHooks',\n              },\n            ],\n          },\n          { name: 'zeroForOne', type: 'bool', internalType: 'bool' },\n          { name: 'exactAmount', type: 'uint128', internalType: 'uint128' },\n          { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n        ],\n      },\n    ],\n    outputs: [\n      { name: 'amountOut', type: 'uint256', internalType: 'uint256' },\n      { name: 'gasEstimate', type: 'uint256', internalType: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'quoteExactOutputSingle',\n    inputs: [\n      {\n        name: 'params',\n        type: 'tuple',\n        internalType: 'struct IV4Quoter.QuoteExactSingleParams',\n        components: [\n          {\n            name: 'poolKey',\n            type: 'tuple',\n            internalType: 'struct PoolKey',\n            components: [\n              { name: 'currency0', type: 'address', internalType: 'Currency' },\n              { name: 'currency1', type: 'address', internalType: 'Currency' },\n              { name: 'fee', type: 'uint24', internalType: 'uint24' },\n              { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n              {\n                name: 'hooks',\n                type: 'address',\n                internalType: 'contract IHooks',\n              },\n            ],\n          },\n          { name: 'zeroForOne', type: 'bool', internalType: 'bool' },\n          { name: 'exactAmount', type: 'uint128', internalType: 'uint128' },\n          { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n        ],\n      },\n    ],\n    outputs: [\n      { name: 'amountIn', type: 'uint256', internalType: 'uint256' },\n      { name: 'gasEstimate', type: 'uint256', internalType: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'poolManager',\n    inputs: [],\n    outputs: [\n      { name: '', type: 'address', internalType: 'contract IPoolManager' },\n    ],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const lockableUniswapV3InitializerAbi = [\n  {\n    type: 'constructor',\n    inputs: [\n      { name: 'airlock_', type: 'address', internalType: 'address' },\n      {\n        name: 'factory_',\n        type: 'address',\n        internalType: 'contract IUniswapV3Factory',\n      },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'airlock',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract Airlock' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'pool', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'fees0ToDistribute', type: 'uint256', internalType: 'uint256' },\n      { name: 'fees1ToDistribute', type: 'uint256', internalType: 'uint256' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'exitLiquidity',\n    inputs: [{ name: 'pool', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'sqrtPriceX96', type: 'uint160', internalType: 'uint160' },\n      { name: 'token0', type: 'address', internalType: 'address' },\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'balance0', type: 'uint128', internalType: 'uint128' },\n      { name: 'token1', type: 'address', internalType: 'address' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'balance1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'factory',\n    inputs: [],\n    outputs: [\n      { name: '', type: 'address', internalType: 'contract IUniswapV3Factory' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getState',\n    inputs: [{ name: 'pool', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      { name: 'tickLower', type: 'int24', internalType: 'int24' },\n      { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n      { name: 'maxShareToBeSold', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'totalTokensOnBondingCurve',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'status', type: 'uint8', internalType: 'enum PoolStatus' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'initialize',\n    inputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      {\n        name: 'totalTokensOnBondingCurve',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: '', type: 'bytes32', internalType: 'bytes32' },\n      { name: 'data', type: 'bytes', internalType: 'bytes' },\n    ],\n    outputs: [{ name: 'pool', type: 'address', internalType: 'address' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'uniswapV3MintCallback',\n    inputs: [\n      { name: 'amount0Owed', type: 'uint256', internalType: 'uint256' },\n      { name: 'amount1Owed', type: 'uint256', internalType: 'uint256' },\n      { name: 'data', type: 'bytes', internalType: 'bytes' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'encodePoolInitializerData',\n    inputs: [\n      {\n        name: 'params',\n        type: 'tuple',\n        components: [\n          { name: 'fee', type: 'uint24' },\n          { name: 'tickLower', type: 'int24' },\n          { name: 'tickUpper', type: 'int24' },\n          { name: 'numPositions', type: 'uint16' },\n          { name: 'maxShareToBeSold', type: 'uint256' },\n          {\n            name: 'beneficiaries',\n            type: 'tuple[]',\n            components: [\n              { name: 'beneficiary', type: 'address' },\n              { name: 'shares', type: 'uint96' },\n            ],\n          },\n        ],\n      },\n    ],\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'pure',\n  },\n  {\n    type: 'event',\n    name: 'Collect',\n    inputs: [\n      { name: 'pool', type: 'address', indexed: true, internalType: 'address' },\n      {\n        name: 'beneficiary',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'fees0',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'fees1',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Create',\n    inputs: [\n      {\n        name: 'poolOrHook',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'numeraire',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Lock',\n    inputs: [\n      { name: 'pool', type: 'address', indexed: true, internalType: 'address' },\n      {\n        name: 'beneficiaries',\n        type: 'tuple[]',\n        indexed: false,\n        internalType: 'struct BeneficiaryData[]',\n        components: [\n          { name: 'beneficiary', type: 'address', internalType: 'address' },\n          { name: 'shares', type: 'uint96', internalType: 'uint96' },\n        ],\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'error',\n    name: 'CannotMigrateInsufficientTick',\n    inputs: [\n      { name: 'targetTick', type: 'int24', internalType: 'int24' },\n      { name: 'currentTick', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  { type: 'error', name: 'CannotMintZeroLiquidity', inputs: [] },\n  {\n    type: 'error',\n    name: 'InvalidFee',\n    inputs: [{ name: 'fee', type: 'uint24', internalType: 'uint24' }],\n  },\n  {\n    type: 'error',\n    name: 'InvalidTickRange',\n    inputs: [\n      { name: 'tick', type: 'int24', internalType: 'int24' },\n      { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidTickRangeMisordered',\n    inputs: [\n      { name: 'tickLower', type: 'int24', internalType: 'int24' },\n      { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'MaxShareToBeSoldExceeded',\n    inputs: [\n      { name: 'value', type: 'uint256', internalType: 'uint256' },\n      { name: 'limit', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n  { type: 'error', name: 'OnlyPool', inputs: [] },\n  { type: 'error', name: 'PoolAlreadyExited', inputs: [] },\n  { type: 'error', name: 'PoolAlreadyInitialized', inputs: [] },\n  { type: 'error', name: 'PoolLocked', inputs: [] },\n  { type: 'error', name: 'SenderNotAirlock', inputs: [] },\n  { type: 'error', name: 'UnorderedBeneficiaries', inputs: [] },\n  { type: 'error', name: 'InvalidShares', inputs: [] },\n  { type: 'error', name: 'InvalidTotalShares', inputs: [] },\n  { type: 'error', name: 'InvalidProtocolOwnerShares', inputs: [] },\n  { type: 'error', name: 'InvalidProtocolOwnerBeneficiary', inputs: [] },\n] as const;\n\nexport const v4MulticurveInitializerAbi = [\n  {\n    type: 'function',\n    name: 'airlock',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract Airlock' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'HOOK',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract IHooks' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getState',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      { name: 'status', type: 'uint8', internalType: 'enum PoolStatus' },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      { name: 'farTick', type: 'int24', internalType: 'int24' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'event',\n    name: 'Collect',\n    inputs: [\n      { name: 'pool', type: 'address', indexed: true, internalType: 'address' },\n      {\n        name: 'beneficiary',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'fees0',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n      {\n        name: 'fees1',\n        type: 'uint256',\n        indexed: false,\n        internalType: 'uint256',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Create',\n    inputs: [\n      {\n        name: 'poolOrHook',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'numeraire',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'Lock',\n    inputs: [\n      { name: 'pool', type: 'address', indexed: true, internalType: 'address' },\n      {\n        name: 'beneficiaries',\n        type: 'tuple[]',\n        indexed: false,\n        internalType: 'struct BeneficiaryData[]',\n        components: [\n          { name: 'beneficiary', type: 'address', internalType: 'address' },\n          { name: 'shares', type: 'uint96', internalType: 'uint96' },\n        ],\n      },\n    ],\n    anonymous: false,\n  },\n  { type: 'error', name: 'PoolLocked', inputs: [] },\n  { type: 'error', name: 'PoolNotLocked', inputs: [] },\n  { type: 'error', name: 'PoolAlreadyInitialized', inputs: [] },\n  { type: 'error', name: 'PoolAlreadyExited', inputs: [] },\n  {\n    type: 'error',\n    name: 'CannotMigrateInsufficientTick',\n    inputs: [\n      { name: 'targetTick', type: 'int24', internalType: 'int24' },\n      { name: 'currentTick', type: 'int24', internalType: 'int24' },\n    ],\n  },\n  { type: 'error', name: 'SenderNotAirlock', inputs: [] },\n  { type: 'error', name: 'UnorderedBeneficiaries', inputs: [] },\n  { type: 'error', name: 'InvalidShares', inputs: [] },\n  { type: 'error', name: 'InvalidTotalShares', inputs: [] },\n  { type: 'error', name: 'InvalidProtocolOwnerShares', inputs: [] },\n  { type: 'error', name: 'InvalidProtocolOwnerBeneficiary', inputs: [] },\n] as const;\n\nexport const dopplerHookInitializerAbi = [\n  {\n    type: 'function',\n    name: 'airlock',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract Airlock' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getState',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      {\n        name: 'totalTokensOnBondingCurve',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'dopplerHook', type: 'address', internalType: 'address' },\n      {\n        name: 'graduationDopplerHookCalldata',\n        type: 'bytes',\n        internalType: 'bytes',\n      },\n      { name: 'status', type: 'uint8', internalType: 'enum PoolStatus' },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      { name: 'farTick', type: 'int24', internalType: 'int24' },\n    ],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const decayMulticurveInitializerHookAbi = [\n  {\n    type: 'function',\n    name: 'getFeeScheduleOf',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'startingTime', type: 'uint32', internalType: 'uint32' },\n      { name: 'startFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'endFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'lastFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'durationSeconds', type: 'uint32', internalType: 'uint32' },\n    ],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const streamableFeesLockerAbi = [\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'streams',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      { name: 'recipient', type: 'address', internalType: 'address' },\n      { name: 'startDate', type: 'uint32', internalType: 'uint32' },\n      { name: 'lockDuration', type: 'uint32', internalType: 'uint32' },\n      { name: 'isUnlocked', type: 'bool', internalType: 'bool' },\n      {\n        name: 'beneficiaries',\n        type: 'tuple[]',\n        internalType: 'struct BeneficiaryData[]',\n        components: [\n          { name: 'beneficiary', type: 'address', internalType: 'address' },\n          { name: 'shares', type: 'uint96', internalType: 'uint96' },\n        ],\n      },\n      {\n        name: 'positions',\n        type: 'tuple[]',\n        internalType: 'struct Position[]',\n        components: [\n          { name: 'tickLower', type: 'int24', internalType: 'int24' },\n          { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n          { name: 'liquidity', type: 'uint128', internalType: 'uint128' },\n          { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n        ],\n      },\n    ],\n    stateMutability: 'view',\n  },\n  // StreamableFeesLocker errors\n  { type: 'error', name: 'NonPositionManager', inputs: [] },\n  { type: 'error', name: 'NotApprovedMigrator', inputs: [] },\n  { type: 'error', name: 'PositionNotFound', inputs: [] },\n  { type: 'error', name: 'PositionAlreadyUnlocked', inputs: [] },\n  { type: 'error', name: 'InvalidBeneficiary', inputs: [] },\n] as const;\n\nexport const streamableFeesLockerV2Abi = [\n  {\n    type: 'function',\n    name: 'approvedMigrators',\n    stateMutability: 'view',\n    inputs: [{ name: 'migrator', type: 'address' }],\n    outputs: [{ name: 'approved', type: 'bool' }],\n  },\n] as const;\n\nexport const v4MulticurveMigratorAbi = [\n  {\n    type: 'function',\n    name: 'getAssetData',\n    inputs: [\n      { name: 'token0', type: 'address', internalType: 'address' },\n      { name: 'token1', type: 'address', internalType: 'address' },\n    ],\n    outputs: [\n      { name: 'isToken0', type: 'bool', internalType: 'bool' },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      { name: 'lockDuration', type: 'uint32', internalType: 'uint32' },\n      {\n        name: 'curves',\n        type: 'tuple[]',\n        internalType: 'struct Curve[]',\n        components: [\n          { name: 'tickLower', type: 'int24', internalType: 'int24' },\n          { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n          { name: 'numPositions', type: 'uint16', internalType: 'uint16' },\n          { name: 'shares', type: 'uint256', internalType: 'uint256' },\n        ],\n      },\n      {\n        name: 'beneficiaries',\n        type: 'tuple[]',\n        internalType: 'struct BeneficiaryData[]',\n        components: [\n          { name: 'beneficiary', type: 'address', internalType: 'address' },\n          { name: 'shares', type: 'uint96', internalType: 'uint96' },\n        ],\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'locker',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'address',\n        internalType: 'contract StreamableFeesLockerV2',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  // V4 Multicurve Migrator errors\n  { type: 'error', name: 'PoolNotInitialized', inputs: [] },\n] as const;\n\nexport const dopplerLensAbi = [\n  {\n    type: 'function',\n    name: 'quoteDopplerLensData',\n    inputs: [\n      {\n        name: 'params',\n        type: 'tuple',\n        internalType: 'struct IV4Quoter.QuoteExactSingleParams',\n        components: [\n          {\n            name: 'poolKey',\n            type: 'tuple',\n            internalType: 'struct PoolKey',\n            components: [\n              { name: 'currency0', type: 'address', internalType: 'Currency' },\n              { name: 'currency1', type: 'address', internalType: 'Currency' },\n              { name: 'fee', type: 'uint24', internalType: 'uint24' },\n              { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n              {\n                name: 'hooks',\n                type: 'address',\n                internalType: 'contract IHooks',\n              },\n            ],\n          },\n          { name: 'zeroForOne', type: 'bool', internalType: 'bool' },\n          { name: 'exactAmount', type: 'uint128', internalType: 'uint128' },\n          { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n        ],\n      },\n    ],\n    outputs: [\n      {\n        name: 'returnData',\n        type: 'tuple',\n        internalType: 'struct DopplerLensReturnData',\n        components: [\n          { name: 'sqrtPriceX96', type: 'uint160', internalType: 'uint160' },\n          { name: 'amount0', type: 'uint256', internalType: 'uint256' },\n          { name: 'amount1', type: 'uint256', internalType: 'uint256' },\n          { name: 'tick', type: 'int24', internalType: 'int24' },\n        ],\n      },\n    ],\n    stateMutability: 'nonpayable',\n  },\n] as const;\n\nconst bundlerCreateParamsComponents = [\n  { name: 'initialSupply', type: 'uint256', internalType: 'uint256' },\n  { name: 'numTokensToSell', type: 'uint256', internalType: 'uint256' },\n  { name: 'numeraire', type: 'address', internalType: 'address' },\n  {\n    name: 'tokenFactory',\n    type: 'address',\n    internalType: 'contract ITokenFactory',\n  },\n  { name: 'tokenFactoryData', type: 'bytes', internalType: 'bytes' },\n  {\n    name: 'governanceFactory',\n    type: 'address',\n    internalType: 'contract IGovernanceFactory',\n  },\n  {\n    name: 'governanceFactoryData',\n    type: 'bytes',\n    internalType: 'bytes',\n  },\n  {\n    name: 'poolInitializer',\n    type: 'address',\n    internalType: 'contract IPoolInitializer',\n  },\n  { name: 'poolInitializerData', type: 'bytes', internalType: 'bytes' },\n  {\n    name: 'liquidityMigrator',\n    type: 'address',\n    internalType: 'contract ILiquidityMigrator',\n  },\n  {\n    name: 'liquidityMigratorData',\n    type: 'bytes',\n    internalType: 'bytes',\n  },\n  { name: 'integrator', type: 'address', internalType: 'address' },\n  { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n] as const;\n\nconst bundlerPoolKeyComponents = [\n  { name: 'currency0', type: 'address', internalType: 'Currency' },\n  { name: 'currency1', type: 'address', internalType: 'Currency' },\n  { name: 'fee', type: 'uint24', internalType: 'uint24' },\n  { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n  { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n] as const;\n\nexport const bundlerAbi = [\n  {\n    type: 'function',\n    name: 'airlock',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract Airlock' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'poolManager',\n    inputs: [],\n    outputs: [\n      {\n        name: '',\n        type: 'address',\n        internalType: 'contract IPoolManager',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'vestingOf',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'recipient', type: 'address', internalType: 'address' },\n      { name: 'permissionlessClaim', type: 'bool', internalType: 'bool' },\n      { name: 'start', type: 'uint64', internalType: 'uint64' },\n      { name: 'cliffDuration', type: 'uint64', internalType: 'uint64' },\n      { name: 'vestingDuration', type: 'uint64', internalType: 'uint64' },\n      { name: 'totalAmount', type: 'uint128', internalType: 'uint128' },\n      { name: 'claimedAmount', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'claimable',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [{ name: 'amount', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'claim',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [{ name: 'amount', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'bundle',\n    inputs: [\n      {\n        name: 'createData',\n        type: 'tuple',\n        internalType: 'struct CreateParams',\n        components: bundlerCreateParamsComponents,\n      },\n      {\n        name: 'vestingData',\n        type: 'tuple',\n        internalType: 'struct Bundler.VestingParams',\n        components: [\n          {\n            name: 'permissionlessClaim',\n            type: 'bool',\n            internalType: 'bool',\n          },\n          {\n            name: 'vestingDuration',\n            type: 'uint64',\n            internalType: 'uint64',\n          },\n          {\n            name: 'cliffDuration',\n            type: 'uint64',\n            internalType: 'uint64',\n          },\n        ],\n      },\n      { name: 'exactAmountIn', type: 'uint128', internalType: 'uint128' },\n      { name: 'recipient', type: 'address', internalType: 'address' },\n    ],\n    outputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: bundlerPoolKeyComponents,\n      },\n      { name: 'governance', type: 'address', internalType: 'address' },\n      { name: 'timelock', type: 'address', internalType: 'address' },\n      { name: 'amountOut', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'simulateBundle',\n    inputs: [\n      {\n        name: 'createData',\n        type: 'tuple',\n        internalType: 'struct CreateParams',\n        components: bundlerCreateParamsComponents,\n      },\n      { name: 'exactAmountIn', type: 'uint128', internalType: 'uint128' },\n    ],\n    outputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: bundlerPoolKeyComponents,\n      },\n      { name: 'governance', type: 'address', internalType: 'address' },\n      { name: 'timelock', type: 'address', internalType: 'address' },\n      { name: 'amountOut', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: '_simulateBundle',\n    inputs: [\n      {\n        name: 'createData',\n        type: 'tuple',\n        internalType: 'struct CreateParams',\n        components: bundlerCreateParamsComponents,\n      },\n      { name: 'exactAmountIn', type: 'uint128', internalType: 'uint128' },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'unlockCallback',\n    inputs: [{ name: 'data', type: 'bytes', internalType: 'bytes' }],\n    outputs: [{ name: '', type: 'bytes', internalType: 'bytes' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'event',\n    name: 'Bundled',\n    inputs: [\n      {\n        name: 'recipient',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amountIn',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n      {\n        name: 'amountOut',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        indexed: false,\n        internalType: 'struct PoolKey',\n        components: bundlerPoolKeyComponents,\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'VestingCreated',\n    inputs: [\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'recipient',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'permissionlessClaim',\n        type: 'bool',\n        indexed: false,\n        internalType: 'bool',\n      },\n      {\n        name: 'totalAmount',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n      {\n        name: 'start',\n        type: 'uint64',\n        indexed: false,\n        internalType: 'uint64',\n      },\n      {\n        name: 'cliffDuration',\n        type: 'uint64',\n        indexed: false,\n        internalType: 'uint64',\n      },\n      {\n        name: 'vestingDuration',\n        type: 'uint64',\n        indexed: false,\n        internalType: 'uint64',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'VestingReleased',\n    inputs: [\n      {\n        name: 'asset',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'recipient',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'amount',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'error',\n    name: 'BundleQuote',\n    inputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      {\n        name: 'poolKey',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: bundlerPoolKeyComponents,\n      },\n      { name: 'governance', type: 'address', internalType: 'address' },\n      { name: 'timelock', type: 'address', internalType: 'address' },\n      { name: 'amountOut', type: 'uint128', internalType: 'uint128' },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'ExactInputNotFullySpent',\n    inputs: [\n      { name: 'expected', type: 'uint256', internalType: 'uint256' },\n      { name: 'actual', type: 'uint256', internalType: 'uint256' },\n    ],\n  },\n  { type: 'error', name: 'ExactInputAmountZero', inputs: [] },\n  { type: 'error', name: 'InvalidAddress', inputs: [] },\n  { type: 'error', name: 'InvalidNativeValue', inputs: [] },\n  { type: 'error', name: 'InvalidPool', inputs: [] },\n  { type: 'error', name: 'InvalidRecipient', inputs: [] },\n  { type: 'error', name: 'InvalidVestingSchedule', inputs: [] },\n  { type: 'error', name: 'NoClaimableAmount', inputs: [] },\n  { type: 'error', name: 'SenderNotPoolManager', inputs: [] },\n  { type: 'error', name: 'SenderNotRecipient', inputs: [] },\n  { type: 'error', name: 'SenderNotSelf', inputs: [] },\n  {\n    type: 'error',\n    name: 'SwapQuote',\n    inputs: [{ name: 'amountOut', type: 'uint128', internalType: 'uint128' }],\n  },\n  { type: 'error', name: 'UnexpectedSimulationSuccess', inputs: [] },\n  {\n    type: 'error',\n    name: 'VestingAlreadyExists',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n  },\n] as const;\n\nexport const poolManagerAbi = [\n  {\n    type: 'function',\n    name: 'swap',\n    inputs: [\n      {\n        name: 'key',\n        type: 'tuple',\n        internalType: 'struct PoolKey',\n        components: [\n          { name: 'currency0', type: 'address', internalType: 'Currency' },\n          { name: 'currency1', type: 'address', internalType: 'Currency' },\n          { name: 'fee', type: 'uint24', internalType: 'uint24' },\n          { name: 'tickSpacing', type: 'int24', internalType: 'int24' },\n          { name: 'hooks', type: 'address', internalType: 'contract IHooks' },\n        ],\n      },\n      {\n        name: 'params',\n        type: 'tuple',\n        internalType: 'struct IPoolManager.SwapParams',\n        components: [\n          { name: 'zeroForOne', type: 'bool', internalType: 'bool' },\n          { name: 'amountSpecified', type: 'int256', internalType: 'int256' },\n          {\n            name: 'sqrtPriceLimitX96',\n            type: 'uint160',\n            internalType: 'uint160',\n          },\n        ],\n      },\n      { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n    ],\n    outputs: [\n      { name: 'swapDelta', type: 'int256', internalType: 'BalanceDelta' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n] as const;\n\nexport const weth9Abi = [\n  {\n    type: 'function',\n    name: 'deposit',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'payable',\n  },\n  {\n    type: 'function',\n    name: 'withdraw',\n    inputs: [{ name: 'wad', type: 'uint256', internalType: 'uint256' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'approve',\n    inputs: [\n      { name: 'spender', type: 'address', internalType: 'address' },\n      { name: 'amount', type: 'uint256', internalType: 'uint256' },\n    ],\n    outputs: [{ name: '', type: 'bool', internalType: 'bool' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'balanceOf',\n    inputs: [{ name: 'owner', type: 'address', internalType: 'address' }],\n    outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const rehypeDopplerHookInitializerAbi = [\n  ...feesManagerAbi,\n  {\n    type: 'function',\n    name: 'INITIALIZER',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'claimAirlockOwnerFees',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [{ name: 'fees', type: 'int256', internalType: 'BalanceDelta' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getFeeDistributionInfo',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      {\n        name: 'assetFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'assetFeesToLpWad', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'numeraireFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToLpWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getFeeRoutingMode',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [{ name: '', type: 'uint8', internalType: 'enum FeeRoutingMode' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getFeeSchedule',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'startingTime', type: 'uint32', internalType: 'uint32' },\n      { name: 'startFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'endFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'lastFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'durationSeconds', type: 'uint32', internalType: 'uint32' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getHookFees',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'beneficiaryFees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'beneficiaryFees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'airlockOwnerFees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'airlockOwnerFees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'customFee', type: 'uint24', internalType: 'uint24' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPoolInfo',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      { name: 'buybackDst', type: 'address', internalType: 'address' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPosition',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'tickLower', type: 'int24', internalType: 'int24' },\n      { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n      { name: 'liquidity', type: 'uint128', internalType: 'uint128' },\n      { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'poolManager',\n    inputs: [],\n    outputs: [\n      { name: '', type: 'address', internalType: 'contract IPoolManager' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'bundler',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'quoter',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract Quoter' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'event',\n    name: 'AirlockOwnerFeesClaimed',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: true,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'airlockOwner',\n        type: 'address',\n        indexed: true,\n        internalType: 'address',\n      },\n      {\n        name: 'fees0',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n      {\n        name: 'fees1',\n        type: 'uint128',\n        indexed: false,\n        internalType: 'uint128',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'FeeBeneficiariesSet',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: true,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'beneficiaries',\n        type: 'tuple[]',\n        indexed: false,\n        internalType: 'struct BeneficiaryData[]',\n        components: [\n          {\n            name: 'beneficiary',\n            type: 'address',\n            internalType: 'address',\n          },\n          { name: 'shares', type: 'uint96', internalType: 'uint96' },\n        ],\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'FeeScheduleSet',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: true,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'startingTime',\n        type: 'uint32',\n        indexed: false,\n        internalType: 'uint32',\n      },\n      {\n        name: 'startFee',\n        type: 'uint24',\n        indexed: false,\n        internalType: 'uint24',\n      },\n      {\n        name: 'endFee',\n        type: 'uint24',\n        indexed: false,\n        internalType: 'uint24',\n      },\n      {\n        name: 'durationSeconds',\n        type: 'uint32',\n        indexed: false,\n        internalType: 'uint32',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'FeeUpdated',\n    inputs: [\n      {\n        name: 'poolId',\n        type: 'bytes32',\n        indexed: true,\n        internalType: 'PoolId',\n      },\n      {\n        name: 'fee',\n        type: 'uint24',\n        indexed: false,\n        internalType: 'uint24',\n      },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'function',\n    name: 'setFeeDistribution',\n    inputs: [\n      { name: 'poolId', type: 'bytes32', internalType: 'PoolId' },\n      {\n        name: 'assetFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'assetFeesToLpWad', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'numeraireFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToLpWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  { type: 'error', name: 'FeeBeneficiariesNotConfigured', inputs: [] },\n  {\n    type: 'error',\n    name: 'FeeBeneficiariesNotSupportedInDirectBuyback',\n    inputs: [],\n  },\n  { type: 'error', name: 'FeeDistributionMustAddUpToWAD', inputs: [] },\n  { type: 'error', name: 'SenderNotAuthorized', inputs: [] },\n  {\n    type: 'error',\n    name: 'FeeTooHigh',\n    inputs: [{ name: 'fee', type: 'uint24', internalType: 'uint24' }],\n  },\n  { type: 'error', name: 'InsufficientFeeCurrency', inputs: [] },\n  {\n    type: 'error',\n    name: 'InvalidDurationSeconds',\n    inputs: [\n      {\n        name: 'durationSeconds',\n        type: 'uint32',\n        internalType: 'uint32',\n      },\n    ],\n  },\n  {\n    type: 'error',\n    name: 'InvalidFeeRange',\n    inputs: [\n      { name: 'startFee', type: 'uint24', internalType: 'uint24' },\n      { name: 'endFee', type: 'uint24', internalType: 'uint24' },\n    ],\n  },\n  { type: 'error', name: 'InvalidProtocolOwnerBeneficiary', inputs: [] },\n  {\n    type: 'error',\n    name: 'InvalidProtocolOwnerShares',\n    inputs: [\n      { name: 'required', type: 'uint96', internalType: 'uint96' },\n      { name: 'provided', type: 'uint96', internalType: 'uint96' },\n    ],\n  },\n  { type: 'error', name: 'InvalidShares', inputs: [] },\n  { type: 'error', name: 'InvalidTotalShares', inputs: [] },\n  { type: 'error', name: 'PoolAlreadyInitialized', inputs: [] },\n  { type: 'error', name: 'Reentrancy', inputs: [] },\n  { type: 'error', name: 'SenderNotAirlockOwner', inputs: [] },\n  { type: 'error', name: 'SenderNotInitializer', inputs: [] },\n  { type: 'error', name: 'UnorderedBeneficiaries', inputs: [] },\n] as const;\n\n/** @deprecated Use rehypeDopplerHookInitializerAbi instead. */\nexport const rehypeDopplerHookAbi = rehypeDopplerHookInitializerAbi;\n\nexport const rehypeDopplerHookMigratorAbi = [\n  {\n    type: 'function',\n    name: 'MIGRATOR',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'claimAirlockOwnerFees',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n    ],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'collectFees',\n    inputs: [{ name: 'asset', type: 'address', internalType: 'address' }],\n    outputs: [{ name: 'fees', type: 'int256', internalType: 'BalanceDelta' }],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'getFeeDistributionInfo',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      {\n        name: 'assetFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'assetFeesToLpWad', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'numeraireFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToLpWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getFeeRoutingMode',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [{ name: '', type: 'uint8', internalType: 'enum FeeRoutingMode' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getHookFees',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'fees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'fees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'beneficiaryFees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'beneficiaryFees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'airlockOwnerFees0', type: 'uint128', internalType: 'uint128' },\n      { name: 'airlockOwnerFees1', type: 'uint128', internalType: 'uint128' },\n      { name: 'customFee', type: 'uint24', internalType: 'uint24' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPoolInfo',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'asset', type: 'address', internalType: 'address' },\n      { name: 'numeraire', type: 'address', internalType: 'address' },\n      { name: 'buybackDst', type: 'address', internalType: 'address' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPosition',\n    inputs: [{ name: 'poolId', type: 'bytes32', internalType: 'PoolId' }],\n    outputs: [\n      { name: 'tickLower', type: 'int24', internalType: 'int24' },\n      { name: 'tickUpper', type: 'int24', internalType: 'int24' },\n      { name: 'liquidity', type: 'uint128', internalType: 'uint128' },\n      { name: 'salt', type: 'bytes32', internalType: 'bytes32' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'poolManager',\n    inputs: [],\n    outputs: [\n      { name: '', type: 'address', internalType: 'contract IPoolManager' },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'quoter',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'contract Quoter' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'setFeeDistribution',\n    inputs: [\n      { name: 'poolId', type: 'bytes32', internalType: 'PoolId' },\n      {\n        name: 'assetFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'assetFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      { name: 'assetFeesToLpWad', type: 'uint256', internalType: 'uint256' },\n      {\n        name: 'numeraireFeesToAssetBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToNumeraireBuybackWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToBeneficiaryWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n      {\n        name: 'numeraireFeesToLpWad',\n        type: 'uint256',\n        internalType: 'uint256',\n      },\n    ],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  { type: 'error', name: 'FeeDistributionMustAddUpToWAD', inputs: [] },\n  { type: 'error', name: 'SenderNotAirlockOwner', inputs: [] },\n  { type: 'error', name: 'SenderNotAuthorized', inputs: [] },\n] as const;\n\n// Export bytecodes for CREATE2 address calculation\nexport {\n  DERC20Bytecode,\n  DERC2080Bytecode,\n  DopplerBytecode,\n  DopplerDN404Bytecode,\n  DopplerDN404BaseSepoliaBytecode,\n  OpeningAuctionBytecode,\n  StateViewBytecode,\n} from './bytecodes';\n","import {\n  type Address,\n  type Hash,\n  type Hex,\n  encodeAbiParameters,\n  encodePacked,\n  keccak256,\n  getAddress,\n  decodeAbiParameters,\n} from 'viem';\nimport {\n  DERC20Bytecode,\n  DERC2080Bytecode,\n  DopplerDN404Bytecode,\n  DopplerDN404BaseSepoliaBytecode,\n} from '../abis';\n\nconst DEFAULT_MAX_ITERATIONS = 1_000_000;\n\nexport type TokenVariant =\n  | 'standard'\n  | 'standard-v2'\n  | 'dopplerERC20V1'\n  | 'doppler404';\n\n// TokenFactory80 has the same deterministic CREATE2 address across all chains where it is deployed.\nconst TOKEN_FACTORY_80_ADDRESS =\n  '0xf0B5141dD9096254B2ca624dff26024f46087229' as const;\nconst BASE_SEPOLIA_DOPPLER404_FACTORY =\n  '0x98b0Aa2e0f134dbB3eb157b5646D387E6D55243a' as const;\n\nfunction isTokenFactory80(tokenFactory: Address): boolean {\n  return tokenFactory.toLowerCase() === TOKEN_FACTORY_80_ADDRESS.toLowerCase();\n}\n\nexport function getDopplerDN404Bytecode(tokenFactory: Address): Hex {\n  return tokenFactory.toLowerCase() ===\n    BASE_SEPOLIA_DOPPLER404_FACTORY.toLowerCase()\n    ? DopplerDN404BaseSepoliaBytecode\n    : DopplerDN404Bytecode;\n}\n\nexport interface TokenAddressHookConfig {\n  deployer: Address;\n  initCodeHash: Hash;\n  prefix?: string;\n  suffix?: string;\n}\n\nexport interface TokenAddressMiningParams {\n  /**\n   * Vanity prefix (hex). Keep as `''` (empty string) if you only want to mine a suffix.\n   * Note: this is required for backwards compatibility with older SDK versions.\n   */\n  prefix: string;\n  /** Vanity suffix (hex), useful as an identifier at the end of the address. */\n  suffix?: string;\n  tokenFactory: Address;\n  initialSupply: bigint;\n  recipient: Address;\n  owner: Address;\n  tokenData: Hex;\n  tokenVariant?: TokenVariant;\n  customBytecode?: Hex;\n  /**\n   * Implementation address for token templates deployed as Solady clones.\n   * Used by `standard-v2` and `dopplerERC20V1`.\n   */\n  v2Implementation?: Address;\n  maxIterations?: number;\n  startSalt?: bigint;\n  hook?: TokenAddressHookConfig;\n}\n\nexport interface TokenAddressMiningResult {\n  salt: Hash;\n  tokenAddress: Address;\n  iterations: number;\n  hookAddress?: Address;\n}\n\nconst STANDARD_TOKEN_DATA_ABI = [\n  { type: 'string' },\n  { type: 'string' },\n  { type: 'uint256' },\n  { type: 'uint256' },\n  { type: 'address[]' },\n  { type: 'uint256[]' },\n  { type: 'string' },\n] as const;\n\nconst STANDARD_TOKEN_V2_DATA_ABI = [\n  { type: 'string' },\n  { type: 'string' },\n  { type: 'uint256' },\n  {\n    type: 'tuple[]',\n    components: [\n      { type: 'uint64', name: 'cliff' },\n      { type: 'uint64', name: 'duration' },\n    ],\n  },\n  { type: 'address[]' },\n  { type: 'uint256[]' },\n  { type: 'uint256[]' },\n  { type: 'string' },\n] as const;\n\nconst DOPPLER_ERC20_V1_TOKEN_DATA_ABI = [\n  { type: 'string' },\n  { type: 'string' },\n  {\n    type: 'tuple[]',\n    components: [\n      { type: 'uint64', name: 'cliff' },\n      { type: 'uint64', name: 'duration' },\n    ],\n  },\n  { type: 'address[]' },\n  { type: 'uint256[]' },\n  { type: 'uint256[]' },\n  { type: 'string' },\n  { type: 'uint256' },\n  { type: 'uint48' },\n  { type: 'address' },\n  { type: 'address[]' },\n] as const;\n\nconst DOPPLER404_TOKEN_DATA_ABI = [\n  { type: 'string' },\n  { type: 'string' },\n  { type: 'string' },\n  { type: 'uint256' },\n] as const;\n\nfunction normalizeHexFragment(\n  value: string,\n  label: 'prefix' | 'suffix',\n): string {\n  const normalized = value.trim().toLowerCase().replace(/^0x/, '');\n  if (normalized.length === 0) {\n    throw new Error(\n      `TokenAddressMiner: ${label} must contain at least one hex character`,\n    );\n  }\n  if (normalized.length > 40) {\n    throw new Error(\n      `TokenAddressMiner: ${label} cannot exceed 40 hex characters`,\n    );\n  }\n  if (!/^[0-9a-f]+$/i.test(normalized)) {\n    throw new Error(`TokenAddressMiner: ${label} must be a hexadecimal string`);\n  }\n  return normalized;\n}\n\n/**\n * Helper to convert hex string to Uint8Array\n */\nfunction 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.slice(i * 2, i * 2 + 2), 16);\n  }\n  return bytes;\n}\n\n/**\n * Helper to convert Uint8Array to hex string\n */\nfunction 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 */\nfunction prepareCreate2Buffer(\n  deployer: Address,\n  initCodeHash: Hash,\n): Uint8Array {\n  const buffer = new Uint8Array(85);\n  buffer[0] = 0xff;\n  const deployerBytes = hexToBytes(deployer);\n  buffer.set(deployerBytes, 1);\n  const initCodeHashBytes = 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 */\nfunction 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 */\nfunction computeCreate2AddressFast(buffer: Uint8Array): string {\n  const hash = keccak256(bytesToHex(buffer) as Hex);\n  // Return last 40 hex chars (20 bytes) as lowercase address\n  return '0x' + hash.slice(-40).toLowerCase();\n}\n\nfunction computeSoladyCloneInitCodeHash(implementation: Address): Hash {\n  return keccak256(\n    `0x602c3d8160093d39f33d3d3d3d363d3d37363d73${implementation.slice(\n      2,\n    )}5af43d3d93803e602a57fd5bf3`,\n  ) as Hash;\n}\n\nfunction buildTokenInitHash(params: {\n  variant: TokenVariant;\n  tokenFactory: Address;\n  tokenData: Hex;\n  initialSupply: bigint;\n  recipient: Address;\n  owner: Address;\n  customBytecode?: Hex;\n  v2Implementation?: Address;\n}): Hash {\n  const {\n    variant,\n    tokenFactory,\n    tokenData,\n    initialSupply,\n    recipient,\n    owner,\n    customBytecode,\n    v2Implementation,\n  } = params;\n\n  if (variant === 'doppler404') {\n    const [name, symbol, baseURI, unit] = decodeAbiParameters(\n      DOPPLER404_TOKEN_DATA_ABI,\n      tokenData,\n    );\n\n    const initHashData = encodeAbiParameters(\n      [\n        { type: 'string' },\n        { type: 'string' },\n        { type: 'uint256' },\n        { type: 'address' },\n        { type: 'address' },\n        { type: 'string' },\n        { type: 'uint256' },\n      ],\n      [name, symbol, initialSupply, recipient, owner, baseURI, unit],\n    );\n\n    return keccak256(\n      encodePacked(\n        ['bytes', 'bytes'],\n        [customBytecode ?? getDopplerDN404Bytecode(tokenFactory), initHashData],\n      ),\n    ) as Hash;\n  }\n\n  if (variant === 'standard-v2') {\n    decodeAbiParameters(STANDARD_TOKEN_V2_DATA_ABI, tokenData);\n    if (!v2Implementation) {\n      throw new Error(\n        'TokenAddressMiner: v2Implementation is required for standard-v2 tokens',\n      );\n    }\n\n    return computeSoladyCloneInitCodeHash(v2Implementation);\n  }\n\n  if (variant === 'dopplerERC20V1') {\n    decodeAbiParameters(DOPPLER_ERC20_V1_TOKEN_DATA_ABI, tokenData);\n    // `v2Implementation` is the shared clone implementation input for both\n    // CloneDERC20VotesV2 and DopplerERC20V1 token factories.\n    if (!v2Implementation) {\n      throw new Error(\n        'TokenAddressMiner: v2Implementation is required for dopplerERC20V1 tokens',\n      );\n    }\n\n    return computeSoladyCloneInitCodeHash(v2Implementation);\n  }\n\n  const [\n    name,\n    symbol,\n    yearlyMintRate,\n    vestingDuration,\n    vestingRecipients,\n    vestingAmounts,\n    tokenURI,\n  ] = decodeAbiParameters(STANDARD_TOKEN_DATA_ABI, tokenData) as readonly [\n    string,\n    string,\n    bigint,\n    bigint,\n    readonly Address[],\n    readonly bigint[],\n    string,\n  ];\n\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      recipient,\n      owner,\n      yearlyMintRate,\n      vestingDuration,\n      Array.from(vestingRecipients),\n      Array.from(vestingAmounts),\n      tokenURI,\n    ],\n  );\n\n  const defaultBytecode = isTokenFactory80(tokenFactory)\n    ? (DERC2080Bytecode as Hex)\n    : (DERC20Bytecode as Hex);\n\n  return keccak256(\n    encodePacked(\n      ['bytes', 'bytes'],\n      [customBytecode ?? defaultBytecode, initHashData],\n    ),\n  ) as Hash;\n}\n\nexport function mineTokenAddress(\n  params: TokenAddressMiningParams,\n): TokenAddressMiningResult {\n  const {\n    prefix,\n    suffix,\n    tokenFactory,\n    initialSupply,\n    recipient,\n    owner,\n    tokenData,\n    tokenVariant = 'standard',\n    customBytecode,\n    maxIterations = DEFAULT_MAX_ITERATIONS,\n    startSalt = 0n,\n    hook,\n  } = params;\n\n  if (maxIterations <= 0 || !Number.isFinite(maxIterations)) {\n    throw new Error(\n      'TokenAddressMiner: maxIterations must be a positive finite number',\n    );\n  }\n  if (startSalt < 0n) {\n    throw new Error('TokenAddressMiner: startSalt cannot be negative');\n  }\n\n  const prefixTrimmed = prefix.trim();\n  const suffixTrimmed = suffix?.trim();\n\n  const normalizedPrefix =\n    prefixTrimmed.length === 0\n      ? undefined\n      : normalizeHexFragment(prefixTrimmed, 'prefix');\n  const normalizedSuffix =\n    !suffixTrimmed || suffixTrimmed.length === 0\n      ? undefined\n      : normalizeHexFragment(suffixTrimmed, 'suffix');\n\n  if (!normalizedPrefix && !normalizedSuffix) {\n    throw new Error('TokenAddressMiner: must provide prefix and/or suffix');\n  }\n\n  const tokenInitHash = buildTokenInitHash({\n    variant: tokenVariant,\n    tokenFactory,\n    tokenData,\n    initialSupply,\n    recipient,\n    owner,\n    customBytecode,\n    v2Implementation: params.v2Implementation,\n  });\n\n  const hookConfig = hook\n    ? {\n        deployer: hook.deployer,\n        initCodeHash: hook.initCodeHash,\n        prefix:\n          hook.prefix && hook.prefix.trim().length > 0\n            ? normalizeHexFragment(hook.prefix, 'prefix')\n            : undefined,\n        suffix:\n          hook.suffix && hook.suffix.trim().length > 0\n            ? normalizeHexFragment(hook.suffix, 'suffix')\n            : undefined,\n      }\n    : undefined;\n\n  const maxSalt = startSalt + BigInt(maxIterations);\n  let iterations = 0;\n\n  // Pre-allocate CREATE2 buffer with constant parts (optimization)\n  const tokenBuffer = prepareCreate2Buffer(tokenFactory, tokenInitHash);\n  const hookBuffer = hookConfig\n    ? prepareCreate2Buffer(hookConfig.deployer, hookConfig.initCodeHash)\n    : null;\n\n  for (let salt = startSalt; salt < maxSalt; salt++) {\n    // Update salt in pre-computed buffer (avoids string formatting)\n    updateSaltInBuffer(tokenBuffer, salt);\n\n    // Compute token address using fast method (no checksum)\n    const candidateRaw = computeCreate2AddressFast(tokenBuffer);\n    const candidateHex = candidateRaw.slice(2);\n    iterations++;\n\n    if (normalizedPrefix && !candidateHex.startsWith(normalizedPrefix))\n      continue;\n    if (normalizedSuffix && !candidateHex.endsWith(normalizedSuffix)) continue;\n\n    let hookAddressRaw: string | undefined;\n    if (hookBuffer) {\n      updateSaltInBuffer(hookBuffer, salt);\n      hookAddressRaw = computeCreate2AddressFast(hookBuffer);\n      const hookHex = hookAddressRaw.slice(2);\n      if (hookConfig?.prefix && !hookHex.startsWith(hookConfig.prefix))\n        continue;\n      if (hookConfig?.suffix && !hookHex.endsWith(hookConfig.suffix)) continue;\n    }\n\n    // Found a match! Convert to proper format for return\n    const saltHex = `0x${salt.toString(16).padStart(64, '0')}` as Hash;\n    return {\n      salt: saltHex,\n      tokenAddress: getAddress(candidateRaw) as Address,\n      iterations,\n      hookAddress: hookAddressRaw\n        ? (getAddress(hookAddressRaw) as Address)\n        : undefined,\n    };\n  }\n\n  const constraints: string[] = [];\n  if (normalizedPrefix) constraints.push(`prefix ${prefixTrimmed}`);\n  if (normalizedSuffix) constraints.push(`suffix ${suffixTrimmed}`);\n\n  throw new Error(\n    `TokenAddressMiner: could not find salt matching ${constraints.join(\n      ' and ',\n    )} within ${maxIterations} iterations`,\n  );\n}\n","import type { PublicClient, Address } from 'viem';\nimport { ADDRESSES, type SupportedChainId } from '../addresses';\nimport type { BeneficiaryData } from '../types';\n\nconst airlockAbi = [\n  {\n    type: 'function',\n    name: 'owner',\n    inputs: [],\n    outputs: [{ name: '', type: 'address', internalType: 'address' }],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport const getAirlockOwner = async (\n  publicClient: unknown,\n): Promise<Address> => {\n  const client = publicClient as PublicClient;\n  const chainId = client.chain?.id as SupportedChainId | undefined;\n  if (!chainId || !ADDRESSES[chainId]) {\n    throw new Error('Unsupported chain ID for airlock owner lookup');\n  }\n\n  const airlockAddress = ADDRESSES[chainId].airlock;\n\n  const owner = await client.readContract({\n    address: airlockAddress,\n    abi: airlockAbi,\n    functionName: 'owner',\n  });\n\n  if (!owner) throw new Error('Airlock owner not found');\n  return owner as Address;\n};\n\n// Default airlock beneficiary shares (5% = 0.05e18 WAD)\nexport const DEFAULT_AIRLOCK_BENEFICIARY_SHARES = BigInt(5e16); // 5% in WAD\n\nexport const createAirlockBeneficiary = (\n  owner: Address,\n  shares: bigint = DEFAULT_AIRLOCK_BENEFICIARY_SHARES,\n): BeneficiaryData => ({\n  beneficiary: owner,\n  shares,\n});\n\nexport const getAirlockBeneficiary = async (\n  publicClient: unknown,\n  shares: bigint = DEFAULT_AIRLOCK_BENEFICIARY_SHARES,\n): Promise<BeneficiaryData> => {\n  const owner = await getAirlockOwner(publicClient);\n  return createAirlockBeneficiary(owner, shares);\n};\n","/**\n * Decode a Uniswap V4 BalanceDelta (int256) value into separate int128 deltas.\n * The upper 128 bits represent amount0, the lower 128 bits represent amount1.\n */\nexport function decodeBalanceDelta(delta: bigint): {\n  amount0: bigint;\n  amount1: bigint;\n} {\n  const mask = (1n << 128n) - 1n;\n  const amount0 = BigInt.asIntN(128, delta >> 128n);\n  const amount1 = BigInt.asIntN(128, delta & mask);\n  return { amount0, amount1 };\n}\n","import { encodeAbiParameters, keccak256, type Address, type Hex } from 'viem';\nimport type { V4PoolKey } from '../types';\n\n/**\n * Computes the PoolId (bytes32) from a V4 PoolKey\n *\n * In Uniswap V4, a PoolId is computed as keccak256(abi.encode(poolKey))\n * where poolKey contains: currency0, currency1, fee, tickSpacing, hooks\n *\n * @param poolKey - The V4 pool key containing currency0, currency1, fee, tickSpacing, and hooks\n * @returns The computed PoolId as a bytes32 hex string\n */\nexport function computePoolId(poolKey: V4PoolKey): Hex {\n  // Encode the poolKey struct following Solidity's abi.encode rules\n  // PoolKey struct has 5 fields, each taking 32 bytes (0xa0 = 160 bytes total)\n  const encoded = encodeAbiParameters(\n    [\n      { name: 'currency0', type: 'address' },\n      { name: 'currency1', type: 'address' },\n      { name: 'fee', type: 'uint24' },\n      { name: 'tickSpacing', type: 'int24' },\n      { name: 'hooks', type: 'address' },\n    ],\n    [\n      poolKey.currency0,\n      poolKey.currency1,\n      poolKey.fee,\n      poolKey.tickSpacing,\n      poolKey.hooks,\n    ],\n  );\n\n  // Return keccak256 hash of the encoded poolKey\n  return keccak256(encoded);\n}\n\n/**\n * Normalizes a pool key value from various response shapes (tuple array or named fields)\n * into a canonical V4PoolKey object.\n *\n * This handles the different formats that contract reads may return:\n * - Named tuple: { currency0, currency1, fee, tickSpacing, hooks }\n * - Positional array: [currency0, currency1, fee, tickSpacing, hooks]\n */\nexport function normalizePoolKey(value: unknown): V4PoolKey {\n  if (!value) {\n    throw new Error('normalizePoolKey: value is null or undefined');\n  }\n\n  if (Array.isArray(value)) {\n    if (value.length < 5) {\n      throw new Error(\n        `normalizePoolKey: expected array of length >= 5, got ${value.length}`,\n      );\n    }\n    return {\n      currency0: value[0] as Address,\n      currency1: value[1] as Address,\n      fee: Number(value[2]),\n      tickSpacing: Number(value[3]),\n      hooks: value[4] as Address,\n    };\n  }\n\n  const obj = value as Record<string, unknown>;\n  if (\n    obj.currency0 === undefined ||\n    obj.currency1 === undefined ||\n    obj.fee === undefined ||\n    obj.tickSpacing === undefined ||\n    obj.hooks === undefined\n  ) {\n    throw new Error(\n      'normalizePoolKey: missing required fields (currency0, currency1, fee, tickSpacing, hooks)',\n    );\n  }\n\n  return {\n    currency0: obj.currency0 as Address,\n    currency1: obj.currency1 as Address,\n    fee: Number(obj.fee),\n    tickSpacing: Number(obj.tickSpacing),\n    hooks: obj.hooks as Address,\n  };\n}\n","import { Q96 } from './tickMath';\n\n/**\n * Compute the amount of token0 for a given liquidity and sqrt price range.\n * Mirrors Uniswap V3 SqrtPriceMath.getAmount0Delta (unsigned).\n *\n * amount0 = liquidity * (1/sqrtRatioA - 1/sqrtRatioB)\n *         = liquidity * (sqrtRatioB - sqrtRatioA) / (sqrtRatioA * sqrtRatioB) * Q96\n */\nexport function getAmount0ForLiquidity(\n  sqrtRatioAX96: bigint,\n  sqrtRatioBX96: bigint,\n  liquidity: bigint,\n): bigint {\n  let [lower, upper] = [sqrtRatioAX96, sqrtRatioBX96];\n  if (lower > upper) [lower, upper] = [upper, lower];\n\n  if (lower <= 0n) {\n    throw new Error('sqrtRatio must be positive');\n  }\n\n  return (liquidity * Q96 * (upper - lower)) / (lower * upper);\n}\n\n/**\n * Compute the amount of token1 for a given liquidity and sqrt price range.\n * Mirrors Uniswap V3 SqrtPriceMath.getAmount1Delta (unsigned).\n *\n * amount1 = liquidity * (sqrtRatioB - sqrtRatioA) / Q96\n */\nexport function getAmount1ForLiquidity(\n  sqrtRatioAX96: bigint,\n  sqrtRatioBX96: bigint,\n  liquidity: bigint,\n): bigint {\n  let [lower, upper] = [sqrtRatioAX96, sqrtRatioBX96];\n  if (lower > upper) [lower, upper] = [upper, lower];\n\n  return (liquidity * (upper - lower)) / Q96;\n}\n\n/**\n * Compute the maximum liquidity for a given amount of token0 and sqrt price range.\n * Inverse of getAmount0ForLiquidity.\n *\n * liquidity = amount0 * sqrtRatioA * sqrtRatioB / (Q96 * (sqrtRatioB - sqrtRatioA))\n */\nexport function getLiquidityForAmount0(\n  sqrtRatioAX96: bigint,\n  sqrtRatioBX96: bigint,\n  amount0: bigint,\n): bigint {\n  let [lower, upper] = [sqrtRatioAX96, sqrtRatioBX96];\n  if (lower > upper) [lower, upper] = [upper, lower];\n\n  const diff = upper - lower;\n  if (diff === 0n) return 0n;\n  if (lower <= 0n) {\n    throw new Error('sqrtRatio must be positive');\n  }\n\n  return (amount0 * lower * upper) / (Q96 * diff);\n}\n\n/**\n * Compute the maximum liquidity for a given amount of token1 and sqrt price range.\n * Inverse of getAmount1ForLiquidity.\n *\n * liquidity = amount1 * Q96 / (sqrtRatioB - sqrtRatioA)\n */\nexport function getLiquidityForAmount1(\n  sqrtRatioAX96: bigint,\n  sqrtRatioBX96: bigint,\n  amount1: bigint,\n): bigint {\n  let [lower, upper] = [sqrtRatioAX96, sqrtRatioBX96];\n  if (lower > upper) [lower, upper] = [upper, lower];\n\n  const diff = upper - lower;\n  if (diff === 0n) return 0n;\n\n  return (amount1 * Q96) / diff;\n}\n","import { MAX_UINT128 } from '../constants';\nimport {\n  getLiquidityForAmount0,\n  getLiquidityForAmount1,\n} from './liquidityMath';\nimport { getSqrtRatioAtTick, MAX_TICK, MIN_TICK } from './tickMath';\n\nexport type MulticurveMaxTickLiquidityParams = {\n  readonly tickLower: number;\n  readonly tickUpper: number;\n  readonly tickSpacing: number;\n  readonly numPositions: number;\n  readonly curveSupply: bigint;\n};\n\n/**\n * Return the highest upper tick at or below params.tickUpper that can be used\n * by the multicurve initializer without overflowing maxLiquidityPerTick.\n *\n * The public builders use this for \"max\" market-cap ranges and for factory\n * fallback curves. The candidate tick is stepped down on the tick grid because\n * the safety check depends on the exact generated position boundaries and on\n * cumulative liquidity at each boundary tick.\n */\nexport function getMaxLiquiditySafeMulticurveTickUpper(\n  params: MulticurveMaxTickLiquidityParams,\n): number {\n  if (params.tickUpper <= params.tickLower) {\n    throw new Error(\n      `Unable to find a uint128-safe multicurve max tick below ${params.tickUpper}`,\n    );\n  }\n\n  if (isCanonicalCurveLiquiditySafe(params)) return params.tickUpper;\n\n  for (\n    let candidate = params.tickUpper - params.tickSpacing;\n    candidate > params.tickLower;\n    candidate -= params.tickSpacing\n  ) {\n    if (isCanonicalCurveLiquiditySafe({ ...params, tickUpper: candidate })) {\n      return candidate;\n    }\n  }\n\n  throw new Error(\n    `Unable to find a uint128-safe multicurve max tick below ${params.tickUpper}`,\n  );\n}\n\nfunction isCanonicalCurveLiquiditySafe(\n  params: MulticurveMaxTickLiquidityParams,\n): boolean {\n  // Token ordering is known only after pool construction. Check the canonical\n  // shape and its mirrored token1 shape so the same market-cap config is safe\n  // regardless of whether the asset becomes token0 or token1.\n  return (\n    isAdjustedCurveLiquiditySafe({\n      ...params,\n      isToken0: true,\n    }) &&\n    isAdjustedCurveLiquiditySafe({\n      ...params,\n      tickLower: -params.tickUpper,\n      tickUpper: -params.tickLower,\n      isToken0: false,\n    })\n  );\n}\n\nfunction isAdjustedCurveLiquiditySafe(\n  params: MulticurveMaxTickLiquidityParams & { readonly isToken0: boolean },\n): boolean {\n  if (params.numPositions <= 0 || params.tickSpacing <= 0) {\n    throw new Error('Multicurve positions and tick spacing must be positive');\n  }\n\n  const amountPerPosition = params.curveSupply / BigInt(params.numPositions);\n  if (amountPerPosition <= 1n) return true;\n\n  const amount = amountPerPosition - 1n;\n  const maxLiquidityPerTick = getMaxLiquidityPerTick(params.tickSpacing);\n  const liquidityByTick = new Map<number, bigint>();\n  const farTick = params.isToken0 ? params.tickUpper : params.tickLower;\n  const closeTick = params.isToken0 ? params.tickLower : params.tickUpper;\n  const spread = params.tickUpper - params.tickLower;\n  const farSqrtPriceX96 = getSqrtRatioAtTick(farTick);\n\n  // The initializer splits curveSupply evenly across numPositions. Each\n  // position starts along the curve and terminates at the far tick, so overflow\n  // can happen either in a single position or in cumulative liquidity when\n  // multiple positions touch the same boundary tick.\n  for (let i = 0; i < params.numPositions; i++) {\n    const tickDelta = Number(\n      (BigInt(i) * BigInt(spread)) / BigInt(params.numPositions),\n    );\n    const unalignedTick = params.isToken0\n      ? closeTick + tickDelta\n      : closeTick - tickDelta;\n    const startingTick = alignMulticurveTick(\n      params.isToken0,\n      unalignedTick,\n      params.tickSpacing,\n    );\n\n    if (startingTick === farTick) continue;\n\n    const startingSqrtPriceX96 = getSqrtRatioAtTick(startingTick);\n    const liquidity = params.isToken0\n      ? getLiquidityForAmount0(startingSqrtPriceX96, farSqrtPriceX96, amount)\n      : getLiquidityForAmount1(farSqrtPriceX96, startingSqrtPriceX96, amount);\n\n    if (liquidity > maxLiquidityPerTick) return false;\n    const tickA = Math.min(farTick, startingTick);\n    const tickB = Math.max(farTick, startingTick);\n    if (\n      !addTickLiquidity(liquidityByTick, tickA, liquidity, maxLiquidityPerTick)\n    ) {\n      return false;\n    }\n    if (\n      !addTickLiquidity(liquidityByTick, tickB, liquidity, maxLiquidityPerTick)\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction getMaxLiquidityPerTick(tickSpacing: number): bigint {\n  // Mirrors Uniswap V3/V4 Tick.tickSpacingToMaxLiquidityPerTick: both bounds\n  // are truncated to the initialized tick grid before counting usable ticks.\n  const minTick = Math.trunc(MIN_TICK / tickSpacing) * tickSpacing;\n  const maxTick = Math.trunc(MAX_TICK / tickSpacing) * tickSpacing;\n  const numTicks = BigInt((maxTick - minTick) / tickSpacing + 1);\n  return MAX_UINT128 / numTicks;\n}\n\nfunction addTickLiquidity(\n  liquidityByTick: Map<number, bigint>,\n  tick: number,\n  liquidity: bigint,\n  maxLiquidityPerTick: bigint,\n): boolean {\n  const updatedLiquidity = (liquidityByTick.get(tick) ?? 0n) + liquidity;\n  if (updatedLiquidity > maxLiquidityPerTick) return false;\n  liquidityByTick.set(tick, updatedLiquidity);\n  return true;\n}\n\nfunction alignMulticurveTick(\n  isToken0: boolean,\n  tick: number,\n  tickSpacing: number,\n): number {\n  // Position starts are rounded outward from the close tick toward the far\n  // tick, matching how the initializer places token0 and token1 ranges.\n  if (isToken0) {\n    return tick < 0\n      ? Math.trunc((tick - tickSpacing + 1) / tickSpacing) * tickSpacing\n      : Math.trunc(tick / tickSpacing) * tickSpacing;\n  }\n\n  return tick < 0\n    ? Math.trunc(tick / tickSpacing) * tickSpacing\n    : Math.trunc((tick + tickSpacing - 1) / tickSpacing) * tickSpacing;\n}\n","/**\n * Compute optimal gamma parameter based on price range and time parameters\n * Gamma determines how much the price can move per epoch during the sale.\n */\nexport function computeOptimalGamma(\n  startTick: number,\n  endTick: number,\n  duration: number,\n  epochLength: number,\n  tickSpacing: number,\n): number {\n  // Calculate total number of epochs\n  const totalEpochs = duration / epochLength;\n  const tickDelta = Math.abs(endTick - startTick);\n  // Base per-epoch movement in ticks\n  let perEpochTicks = Math.ceil(tickDelta / totalEpochs);\n  // Quantize up to the nearest multiple of tickSpacing\n  const multiples = Math.ceil(perEpochTicks / tickSpacing);\n  let gamma = multiples * tickSpacing;\n  // Ensure minimum of one tickSpacing\n  gamma = Math.max(tickSpacing, gamma);\n  if (gamma % tickSpacing !== 0) {\n    throw new Error('Computed gamma must be divisible by tick spacing');\n  }\n  return gamma;\n}\n","/**\n * Extract the gas estimate from a simulated contract request.\n * Falls back to `estimateContractGas` when the simulation doesn't include a gas value.\n *\n * @param request  The request object returned by `simulateContract`\n * @param fallback A function returning a gas estimate (called only when request.gas is unavailable)\n */\nexport async function resolveGasEstimate(\n  request: unknown,\n  fallback: () => Promise<bigint>,\n): Promise<bigint> {\n  if (isGasEstimateRequest(request)) {\n    return request.gas;\n  }\n  return await fallback();\n}\n\nfunction isGasEstimateRequest(request: unknown): request is { gas: bigint } {\n  return (\n    typeof request === 'object' &&\n    request !== null &&\n    'gas' in request &&\n    typeof request.gas === 'bigint'\n  );\n}\n","import { Address } from 'viem';\n\n/**\n * Determine token ordering based on numeraire address.\n * Mining will find a salt such that token address is correctly ordered relative to numeraire.\n * For numeraires > halfMaxUint160, token must be token0 (smaller address)\n * For all other cases, token should be token1 (larger address)\n * @param numeraire - Address of numeraire token\n * @returns Whether base token address is expected to be generated as token0\n */\nexport function isToken0Expected(numeraire: Address): boolean {\n  const numeraireBigInt = BigInt(numeraire);\n  const halfMaxUint160 = 2n ** 159n - 1n;\n\n  if (numeraireBigInt === 0n) {\n    return false; // ETH paired, token will be > 0x0\n  } else if (numeraireBigInt > halfMaxUint160) {\n    return true; // Large numeraire, token will be < numeraire\n  } else {\n    return false; // Normal case, token will be > numeraire\n  }\n}\n","import { isAddress, zeroAddress, type Address } from 'viem';\nimport { WAD } from '../constants';\n\n/**\n * Sort beneficiaries by address (ascending) as required by the pool contract,\n * rejecting duplicate addresses up-front.\n *\n * The pool/migrator contracts enforce strictly ascending beneficiary addresses\n * and revert with `UnorderedBeneficiaries()` when two entries share an address.\n * Two equal addresses are not strictly ascending, so the transaction reverts and\n * the integrator only finds out after spending gas, with an opaque error.\n *\n * Catching the duplicate here — at the encode layer that every create/migration\n * path funnels through — surfaces a readable error before the transaction is\n * broadcast. Address comparison is case-insensitive, so the same address supplied\n * with different checksum casing is also caught.\n *\n * Generic over the beneficiary shape so it can be reused across the differently\n * typed beneficiary lists (pool initializer, streamable fees, doppler hook).\n */\nexport function sortBeneficiaries<T extends { beneficiary: Address }>(\n  beneficiaries: readonly T[],\n): T[] {\n  const sorted = [...beneficiaries].sort((a, b) => {\n    const aAddr = a.beneficiary.toLowerCase();\n    const bAddr = b.beneficiary.toLowerCase();\n    return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n  });\n\n  for (let i = 1; i < sorted.length; i++) {\n    if (\n      sorted[i].beneficiary.toLowerCase() ===\n      sorted[i - 1].beneficiary.toLowerCase()\n    ) {\n      throw new Error(\n        `Duplicate beneficiary address: ${sorted[i].beneficiary}. ` +\n          'Each beneficiary address must be unique — the contract requires ' +\n          'strictly ascending addresses and reverts with ' +\n          'UnorderedBeneficiaries() otherwise. Merge the entries into a ' +\n          'single beneficiary with the combined shares.',\n      );\n    }\n  }\n\n  return sorted;\n}\n\nexport function normalizeBeneficiaries<\n  T extends { beneficiary: Address; shares: bigint },\n>(beneficiaries: readonly T[], label: string): [T, ...T[]] {\n  const sorted = sortBeneficiaries(beneficiaries);\n  if (!isNonEmpty(sorted)) {\n    throw new Error(`${label} list must not be empty`);\n  }\n\n  let totalShares = 0n;\n\n  for (const beneficiary of sorted) {\n    if (!isAddress(beneficiary.beneficiary, { strict: false })) {\n      throw new Error(\n        `${label} address is invalid: ${beneficiary.beneficiary}`,\n      );\n    }\n    if (beneficiary.beneficiary.toLowerCase() === zeroAddress) {\n      throw new Error(`${label} address cannot be the zero address`);\n    }\n    if (beneficiary.shares <= 0n) {\n      throw new Error(`${label} shares must be positive`);\n    }\n    totalShares += beneficiary.shares;\n  }\n\n  if (totalShares !== WAD) {\n    throw new Error(\n      `${label} shares must sum to ${WAD} (100%), but got ${totalShares}`,\n    );\n  }\n\n  return sorted;\n}\n\nfunction isNonEmpty<T>(values: T[]): values is [T, ...T[]] {\n  return values.length > 0;\n}\n","import {\n  arbitrum,\n  base,\n  baseSepolia,\n  ink,\n  mainnet,\n  sepolia,\n  unichain,\n} from 'viem/chains';\nimport { CHAIN_IDS, type SupportedChainId } from './addresses';\n// Re-export SupportedChainId so consumers can import from this module\nexport { type SupportedChainId } from './addresses';\nimport type { Address, Hash, Hex, WalletClient } from 'viem';\n\nexport type SupportedChain =\n  | typeof mainnet\n  | typeof sepolia\n  | typeof arbitrum\n  | typeof base\n  | typeof baseSepolia\n  | typeof ink\n  | typeof unichain;\n// Use a wide type to avoid cross-package viem type identity issues when linking packages locally.\nexport type SupportedPublicClient = unknown;\n\n// Core configuration types\n// Token configuration\nexport interface StandardTokenConfig {\n  type: 'standard';\n  name: string;\n  symbol: string;\n  tokenURI: string;\n  yearlyMintRate?: bigint; // Optional yearly mint rate (in WAD, default: 2% = 0.02e18)\n}\n\nexport type DopplerERC20V1OnlyTokenConfigFields = {\n  maxBalanceLimit?: bigint;\n  balanceLimitEnd?: number;\n  controller?: Address;\n  excludedFromBalanceLimit?: Address[];\n};\n\nexport interface Doppler404TokenConfig {\n  type: 'doppler404';\n  name: string;\n  symbol: string;\n  baseURI: string;\n  // Optional base-unit threshold per NFT. Defaults to WAD (1e18), or one full token.\n  unit?: bigint;\n}\n\nexport type DopplerERC20V1TokenConfig = {\n  type: 'dopplerERC20V1';\n  name: string;\n  symbol: string;\n  tokenURI: string;\n  /**\n   * DopplerERC20V1 does not support yearly minting.\n   * Set `type: 'standard'` to configure `yearlyMintRate`.\n   */\n  yearlyMintRate?: never;\n} & DopplerERC20V1OnlyTokenConfigFields;\n\nexport type InferredDopplerERC20V1TokenConfig = {\n  type?: never;\n  name: string;\n  symbol: string;\n  tokenURI: string;\n  /**\n   * DopplerERC20V1 does not support yearly minting.\n   * Set `type: 'standard'` to configure `yearlyMintRate`.\n   */\n  yearlyMintRate?: never;\n} & DopplerERC20V1OnlyTokenConfigFields;\n\nexport type TokenConfig =\n  | StandardTokenConfig\n  | Doppler404TokenConfig\n  | DopplerERC20V1TokenConfig\n  | InferredDopplerERC20V1TokenConfig;\n\nexport interface SaleConfig {\n  initialSupply: bigint;\n  numTokensToSell: bigint;\n  numeraire: Address; // e.g., WETH address\n}\n\n// Static Auction Pool configuration\nexport interface StaticPoolConfig {\n  startTick: number;\n  endTick: number;\n  fee: number; // e.g., 3000 for 0.3%\n  // Optional parameters for lockable initializer\n  numPositions?: number; // Number of liquidity positions (default: based on tick range)\n  maxShareToBeSold?: bigint; // Maximum share of tokens to sell (in WAD, default: 1e18 = 100%)\n  beneficiaries?: BeneficiaryData[]; // Optional beneficiaries for fee streaming\n}\n\n// Dynamic Auction configuration\nexport interface DynamicAuctionConfig {\n  duration: number; // in seconds\n  epochLength: number; // in seconds\n  startTick: number;\n  endTick: number;\n  gamma?: number; // Optional, can be auto-calculated\n  minProceeds: bigint;\n  maxProceeds: bigint;\n  numPdSlugs?: number; // Price discovery slugs (optional)\n}\n\n// Opening Auction configuration\nexport interface OpeningAuctionConfig {\n  auctionDuration: number; // in seconds\n  minAcceptableTickToken0: number;\n  minAcceptableTickToken1: number;\n  incentiveShareBps: number;\n  tickSpacing: number;\n  fee: number; // e.g., 3000 for 0.3%\n  minLiquidity: bigint;\n  shareToAuctionBps: number;\n}\n\n// Doppler handoff configuration used by opening-auction initializer\nexport interface OpeningAuctionDopplerConfig {\n  minProceeds: bigint;\n  maxProceeds: bigint;\n  startTick: number;\n  endTick: number;\n  epochLength: number; // in seconds\n  duration: number; // in seconds\n  gamma?: number;\n  numPdSlugs?: number;\n  fee: number; // e.g., 10000 for 1%\n  tickSpacing: number;\n  // Optional time controls for deterministic simulations/builds\n  startTimeOffset?: number;\n  startingTime?: number;\n}\n\n// Vesting configuration\nexport interface VestingScheduleConfig {\n  duration: number; // in seconds\n  cliffDuration: number; // in seconds\n}\n\nexport interface VestingAllocationConfig {\n  recipient: Address;\n  amount: bigint;\n  schedule: VestingScheduleConfig;\n}\n\nexport type VestingConfig =\n  | {\n      duration: number; // in seconds\n      cliffDuration: number; // in seconds\n      recipients?: Address[]; // Optional array of recipient addresses (defaults to [userAddress] if not specified)\n      amounts?: bigint[]; // Optional array of vesting amounts per recipient (must match recipients length if provided)\n      allocations?: never;\n    }\n  | {\n      duration?: never;\n      cliffDuration?: never;\n      recipients?: never;\n      amounts?: never;\n      allocations: VestingAllocationConfig[];\n    };\n\n// Chains where no-op governance is enabled\nexport const NO_OP_ENABLED_CHAIN_IDS = [\n  CHAIN_IDS.MAINNET,\n  CHAIN_IDS.ETH_SEPOLIA,\n  CHAIN_IDS.ARBITRUM,\n  CHAIN_IDS.BASE,\n  CHAIN_IDS.BASE_SEPOLIA,\n  CHAIN_IDS.UNICHAIN,\n  CHAIN_IDS.UNICHAIN_SEPOLIA,\n  CHAIN_IDS.ROBINHOOD,\n  CHAIN_IDS.MONAD_TESTNET,\n  CHAIN_IDS.MONAD_MAINNET,\n] as const;\n\nexport type NoOpEnabledChainId = (typeof NO_OP_ENABLED_CHAIN_IDS)[number];\n\n/**\n * Check if a chain supports no-op governance\n */\nexport function isNoOpEnabledChain(\n  chainId: number,\n): chainId is NoOpEnabledChainId {\n  return (NO_OP_ENABLED_CHAIN_IDS as readonly number[]).includes(chainId);\n}\n\n// Chains where launchpad governance is enabled\nexport const LAUNCHPAD_ENABLED_CHAIN_IDS = [\n  CHAIN_IDS.MAINNET,\n  CHAIN_IDS.ARBITRUM,\n  CHAIN_IDS.BASE,\n  CHAIN_IDS.BASE_SEPOLIA,\n  CHAIN_IDS.ROBINHOOD,\n  CHAIN_IDS.MONAD_MAINNET,\n] as const;\n\nexport type LaunchpadEnabledChainId =\n  (typeof LAUNCHPAD_ENABLED_CHAIN_IDS)[number];\n\n/**\n * Check if a chain supports launchpad governance\n */\nexport function isLaunchpadEnabledChain(\n  chainId: number,\n): chainId is LaunchpadEnabledChainId {\n  return (LAUNCHPAD_ENABLED_CHAIN_IDS as readonly number[]).includes(chainId);\n}\n\n// Governance configuration (discriminated union)\nexport type GovernanceDefault = { type: 'default' };\nexport interface GovernanceCustom {\n  type: 'custom';\n  initialVotingDelay: number;\n  initialVotingPeriod: number;\n  initialProposalThreshold: bigint;\n}\nexport type GovernanceNoOp = { type: 'noOp' };\nexport interface GovernanceLaunchpad {\n  type: 'launchpad';\n  multisig: Address;\n}\n\nexport type GovernanceOption<C extends SupportedChainId> =\n  | GovernanceDefault\n  | GovernanceCustom\n  | (C extends NoOpEnabledChainId ? GovernanceNoOp : never)\n  | (C extends LaunchpadEnabledChainId ? GovernanceLaunchpad : never);\n\n// Unified beneficiary data used for fee streaming, lockable initializers, and migration configs\n// Uses shares in WAD format (1e18 = 100%) for consistency across all beneficiary configurations\nexport interface BeneficiaryData {\n  beneficiary: Address;\n  shares: bigint; // shares in WAD (1e18 = 100%)\n}\n\n// Pool status for lockable initializer\nexport enum LockablePoolStatus {\n  Uninitialized = 0,\n  Initialized = 1,\n  Locked = 2,\n  Exited = 3,\n}\n\n// Opening auction phase (hook-level)\nexport enum OpeningAuctionPhase {\n  NotStarted = 0,\n  Active = 1,\n  Closed = 2,\n  Settled = 3,\n}\n\n// Opening auction status (initializer-level)\nexport enum OpeningAuctionStatus {\n  Uninitialized = 0,\n  AuctionActive = 1,\n  DopplerActive = 2,\n  Exited = 3,\n}\n\n// Lockable pool state\nexport interface LockablePoolState {\n  asset: Address;\n  numeraire: Address;\n  tickLower: number;\n  tickUpper: number;\n  maxShareToBeSold: bigint;\n  totalTokensOnBondingCurve: bigint;\n  status: LockablePoolStatus;\n}\n\n// Multicurve pool state (V4 initializer)\nexport interface MulticurvePoolState {\n  asset: Address;\n  numeraire: Address;\n  fee: number;\n  tickSpacing: number;\n  status: LockablePoolStatus; // Reuses the same enum\n  poolKey: V4PoolKey;\n  farTick: number;\n}\n\n// Migration configuration (discriminated union)\nexport interface RehypeDopplerHookMigratorConfig {\n  // Optional hook address override. Defaults to chain rehypeDopplerHookMigrator.\n  hookAddress?: Address;\n  // Destination address for buyback tokens / beneficiary fee claims.\n  buybackDestination: Address;\n  // Custom swap fee in hundredths of a bip (1e6 = 100%).\n  customFee: number;\n  // Routing mode for buyback-designated fees. Defaults to DirectBuyback.\n  feeRoutingMode?:\n    | RehypeFeeRoutingMode\n    | 'directBuyback'\n    | 'routeToBeneficiaryFees';\n  // Current fee routing matrix API.\n  feeDistributionInfo?: RehypeFeeDistributionInfo;\n\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   * If feeDistributionInfo is omitted, legacy percentages are mirrored to both rows.\n   */\n  assetBuybackPercentWad?: bigint;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   */\n  numeraireBuybackPercentWad?: bigint;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   */\n  beneficiaryPercentWad?: bigint;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   */\n  lpPercentWad?: bigint;\n}\n\nexport interface DopplerHookMigratorConfig {\n  type: 'dopplerHookMigrator';\n  // Fee for fixed-fee pools, or initial LP fee when useDynamicFee=true.\n  fee: number;\n  // Use dynamic LP fees on the migrated V4 pool.\n  useDynamicFee?: boolean;\n  // Tick spacing for the migrated V4 pool.\n  tickSpacing: number;\n  // Fee lock duration in seconds.\n  lockDuration: number;\n  // Fee streaming beneficiaries (must be sorted and sum to WAD onchain).\n  beneficiaries: BeneficiaryData[];\n  // Generic hook configuration (raw initialization calldata).\n  hook?: {\n    hookAddress: Address;\n    onInitializationCalldata?: `0x${string}`;\n  };\n  // Ergonomic helper for RehypeDopplerHookMigrator initialization.\n  rehype?: RehypeDopplerHookMigratorConfig;\n  // Optional proceeds split paid out during migration.\n  proceedsSplit?: {\n    recipient: Address;\n    share: bigint;\n  };\n}\n\n/**\n * @deprecated Use DopplerHookMigratorConfig with\n * `type: 'dopplerHookMigrator'` instead.\n */\nexport type DopplerHookMigrationConfig = Omit<\n  DopplerHookMigratorConfig,\n  'type'\n> & {\n  type: 'dopplerHook';\n};\n\nexport interface ProceedsSplitConfig {\n  recipient: Address;\n  share: bigint;\n}\n\nexport interface StreamableFeesConfig {\n  lockDuration: number; // in seconds\n  beneficiaries: BeneficiaryData[]; // Uses shares in WAD (1e18 = 100%)\n}\n\nexport interface UniswapV2MigrationConfig {\n  type: 'uniswapV2';\n}\n\nexport interface UniswapV2SplitMigrationConfig {\n  type: 'uniswapV2Split';\n  // Optional proceeds split paid out during migration.\n  proceedsSplit?: ProceedsSplitConfig;\n}\n\nexport interface UniswapV4MigrationConfig {\n  type: 'uniswapV4';\n  fee: number;\n  tickSpacing: number;\n  // Configuration for fee streaming via StreamableFeesLocker (optional)\n  // When omitted, fees are not locked and beneficiaries are not configured\n  // This is useful when using noOp governance where lock duration is not meaningful\n  streamableFees?: StreamableFeesConfig;\n}\n\nexport interface UniswapV4SplitMigrationConfig {\n  type: 'uniswapV4Split';\n  fee: number;\n  tickSpacing: number;\n  // Required for split V4 migration because the migrator always configures\n  // locker beneficiaries and lock duration during initialization.\n  streamableFees: StreamableFeesConfig;\n  // Optional proceeds split paid out during migration.\n  proceedsSplit?: ProceedsSplitConfig;\n}\n\nexport type MigrationConfig =\n  | UniswapV2MigrationConfig // Basic migration to a new Uniswap v2 pool\n  | UniswapV2SplitMigrationConfig // V2 migration with proceeds split + TopUpDistributor support\n  | UniswapV4MigrationConfig\n  | UniswapV4SplitMigrationConfig\n  | DopplerHookMigratorConfig // Dynamic-only: migration via DopplerHookMigrator\n  | DopplerHookMigrationConfig // Deprecated DopplerHookMigrator discriminator\n  | { type: 'noOp' }; // No migration - used with lockable beneficiaries\n\n// Create Static Auction parameters\nexport interface CreateStaticAuctionParams<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  // Token configuration\n  token: TokenConfig;\n\n  // Sale configuration\n  sale: SaleConfig;\n\n  // Static Auction (Uniswap v3) Pool configuration\n  pool: StaticPoolConfig;\n\n  // Vesting configuration (optional)\n  vesting?: VestingConfig;\n\n  // Governance configuration (required). Use `{ type: 'noOp' }` where enabled,\n  // `{ type: 'default' }` for standard defaults, or `{ type: 'custom', ... }` to customize.\n  governance: GovernanceOption<C>;\n\n  // Explicit Migration Configuration\n  migration: MigrationConfig;\n\n  // Integrator details\n  integrator?: Address;\n  userAddress: Address;\n\n  // Optional address overrides for on-chain modules used during encoding/creation\n  modules?: ModuleAddressOverrides;\n\n  // Optional transaction gas limit override for the create() transaction\n  // If omitted, SDK will default to 13,500,000 gas for create()\n  gas?: bigint;\n}\n\n// Create Dynamic Auction parameters\nexport interface CreateDynamicAuctionParams<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  // Token configuration\n  token: TokenConfig;\n\n  // Sale configuration\n  sale: SaleConfig;\n\n  // Dynamic Auction (Uniswap v4 Hook) configuration\n  auction: DynamicAuctionConfig;\n\n  // Pool configuration\n  pool: {\n    fee: number; // e.g., 3000 for 0.3%\n    tickSpacing: number;\n  };\n\n  // Vesting configuration (optional)\n  vesting?: VestingConfig;\n\n  // Governance configuration (required). Use `{ type: 'noOp' }` where enabled,\n  // `{ type: 'default' }` for standard defaults, or `{ type: 'custom', ... }` to customize.\n  governance: GovernanceOption<C>;\n\n  // Explicit Migration Configuration\n  migration: MigrationConfig;\n\n  // Integrator details\n  integrator?: Address;\n  userAddress: Address;\n\n  // Time configuration (internal use)\n  startTimeOffset?: number;\n  blockTimestamp?: number; // Optional: use this block timestamp instead of fetching latest\n\n  // Optional transaction gas limit override for the create() transaction\n  // If omitted, SDK will default to 13,500,000 gas for create()\n  gas?: bigint;\n\n  // Optional address overrides for on-chain modules used during encoding/creation\n  modules?: ModuleAddressOverrides;\n}\n\n// Create Opening Auction parameters\nexport interface CreateOpeningAuctionParams<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  // Token configuration\n  token: TokenConfig;\n\n  // Sale configuration\n  sale: SaleConfig;\n\n  // Opening auction configuration\n  openingAuction: OpeningAuctionConfig;\n\n  // Doppler handoff configuration\n  doppler: OpeningAuctionDopplerConfig;\n\n  // Vesting configuration (optional)\n  vesting?: VestingConfig;\n\n  // Governance configuration (required). Use `{ type: 'noOp' }` where enabled,\n  // `{ type: 'default' }` for standard defaults, or `{ type: 'custom', ... }` to customize.\n  governance: GovernanceOption<C>;\n\n  // Explicit Migration Configuration\n  migration: MigrationConfig;\n\n  // Integrator details\n  integrator?: Address;\n  userAddress: Address;\n\n  // Optional timing controls for Doppler handoff start\n  startTimeOffset?: number;\n  startingTime?: number;\n\n  // Optional: use this block timestamp instead of fetching latest\n  blockTimestamp?: number;\n\n  // Optional transaction gas limit override for the create() transaction\n  // If omitted, SDK will default to 13,500,000 gas for create()\n  gas?: bigint;\n\n  // Optional address overrides for on-chain modules used during encoding/creation\n  modules?: ModuleAddressOverrides;\n}\n\n// Price range configuration for automatic tick calculation\nexport interface PriceRange {\n  startPrice: number;\n  endPrice: number;\n}\n\n// Tick range configuration\nexport interface TickRange {\n  startTick: number;\n  endTick: number;\n}\n\n// ============================================================================\n// Market Cap Configuration Types\n// ============================================================================\n\n/**\n * Market cap range in USD for price configurations.\n * Used to define start and end market caps for bonding curves.\n */\nexport interface MarketCapRange {\n  /** Starting market cap in USD (e.g., 100_000 for $100k) */\n  start: number;\n  /** Ending market cap in USD (e.g., 10_000_000 for $10M) */\n  end: number;\n}\n\n/**\n * Base configuration for market cap-based tick calculations.\n * Used by builder methods to convert market caps to ticks.\n */\nexport interface MarketCapConfig {\n  /** Target market cap range in USD */\n  marketCap: MarketCapRange;\n  /** Price of numeraire in USD (e.g., 3000 for ETH at $3000) */\n  numerairePrice: number;\n  /**\n   * Token supply override. If not provided, inferred from saleConfig.initialSupply.\n   * Must include decimals (e.g., parseEther('1000000000') for 1B tokens).\n   */\n  tokenSupply?: bigint;\n  /** Token decimals (default: 18) */\n  tokenDecimals?: number;\n  /** Numeraire decimals (default: 18) */\n  numeraireDecimals?: number;\n}\n\n/**\n * Market cap configuration for V3 Static Auctions.\n * Extends base config with V3-specific parameters.\n */\nexport interface StaticAuctionMarketCapConfig extends MarketCapConfig {\n  /** Fee tier in basis points (e.g., 10000 for 1%). Default: 10000 */\n  fee?: number;\n  /** Number of liquidity positions. Default: 15 */\n  numPositions?: number;\n  /** Maximum share of tokens to sell per position (WAD). Default: 35% */\n  maxShareToBeSold?: bigint;\n}\n\n/**\n * Market cap range for V4 Dynamic Auctions (Dutch auctions).\n * Uses start/min because price descends from start to minimum.\n */\nexport interface DynamicMarketCapRange {\n  /** Starting market cap in USD - auction begins here (e.g., 500_000 for $500k) */\n  start: number;\n  /** Minimum market cap in USD - floor price the auction descends to (e.g., 50_000 for $50k) */\n  min: number;\n}\n\n/**\n * Market cap configuration for V4 Dynamic Auctions.\n * Uses start/min (not start/end) because Dutch auctions descend from start to minimum.\n */\nexport interface DynamicAuctionMarketCapConfig {\n  /** Target market cap range (start = launch price, min = floor price) */\n  marketCap: DynamicMarketCapRange;\n  /** Price of numeraire in USD (e.g., 3000 for ETH at $3000) */\n  numerairePrice: number;\n  /**\n   * Token supply override. If not provided, inferred from saleConfig.initialSupply.\n   * Must include decimals (e.g., parseEther('1000000000') for 1B tokens).\n   */\n  tokenSupply?: bigint;\n  /** Token decimals (default: 18) */\n  tokenDecimals?: number;\n  /** Numeraire decimals (default: 18) */\n  numeraireDecimals?: number;\n  /**\n   * Pool fee in basis points. Default: 10000 (1%)\n   *\n   * V4 pools support any fee from 0 to 100,000 (10%).\n   * Standard tiers (100, 500, 3000, 10000) auto-derive tickSpacing.\n   * Custom fees require explicit tickSpacing parameter.\n   */\n  fee?: number;\n  /**\n   * Tick spacing for the pool. Required for custom fees.\n   *\n   * Must be <= 30 for Doppler pools (MAX_TICK_SPACING constraint).\n   * If not provided with a standard fee tier, defaults to 30.\n   */\n  tickSpacing?: number;\n  /** Minimum proceeds required for successful auction */\n  minProceeds: bigint;\n  /** Maximum proceeds cap for the auction */\n  maxProceeds: bigint;\n  /** Auction duration in seconds. Default: 7 days */\n  duration?: number;\n  /** Epoch length in seconds. Default: 3600 (1 hour) */\n  epochLength?: number;\n  /** Gamma (tick decay per epoch). Auto-calculated if not provided */\n  gamma?: number;\n  /** Number of price discovery slugs. Default: 5 */\n  numPdSlugs?: number;\n}\n\n/**\n * Result of market cap parameter validation.\n */\nexport interface MarketCapValidationResult {\n  /** Whether all parameters are within normal bounds */\n  valid: boolean;\n  /** Warning messages for unusual but technically valid values */\n  warnings: string[];\n}\n\n// ============================================================================\n// Market Cap Helper Function Parameter Types\n// ============================================================================\n\n/**\n * Parameters for converting market cap range to ticks for V3 Static Auctions.\n */\nexport interface StaticAuctionTickParams {\n  marketCapRange: MarketCapRange;\n  tokenSupply: bigint;\n  numerairePriceUSD: number;\n  tickSpacing: number;\n  tokenDecimals?: number;\n  numeraireDecimals?: number;\n}\n\n/**\n * Parameters for converting market cap range to ticks for V4 Dynamic Auctions.\n */\nexport interface DynamicAuctionTickParams {\n  marketCapRange: MarketCapRange;\n  tokenSupply: bigint;\n  numerairePriceUSD: number;\n  numeraire: Address;\n  tickSpacing: number;\n  tokenDecimals?: number;\n  numeraireDecimals?: number;\n}\n\n/**\n * Parameters for converting market cap range to ticks for V4 Multicurve pools.\n */\nexport interface MulticurveTickRangeParams {\n  marketCapLower: number;\n  marketCapUpper: number | 'max';\n  tokenSupply: bigint;\n  numerairePriceUSD: number;\n  tickSpacing: number;\n  tokenDecimals?: number;\n  numeraireDecimals?: number;\n}\n\n/**\n * Parameters for converting a single market cap to a tick for Multicurve.\n */\nexport interface MulticurveTickParams {\n  marketCapUSD: number;\n  tokenSupply: bigint;\n  numerairePriceUSD: number;\n  tickSpacing: number;\n  tokenDecimals?: number;\n  numeraireDecimals?: number;\n}\n\n/**\n * Parameters for converting a tick to market cap (reverse conversion).\n */\nexport interface TickToMarketCapParams {\n  tick: number;\n  tokenSupply: bigint;\n  numerairePriceUSD: number;\n  tokenDecimals?: number;\n  numeraireDecimals?: number;\n}\n\n// ============================================================================\n// New Multicurve Market Cap API (no tick math required)\n// ============================================================================\n\n/**\n * Curve configuration for Multicurve pools using market cap ranges.\n * Each curve defines a market cap range and liquidity distribution.\n */\nexport interface MulticurveMarketCapRangeCurve {\n  /** Market cap range for this curve */\n  marketCap: {\n    /** Start market cap in USD (for the first curve, this is the launch price) */\n    start: number;\n    /** End market cap in USD, or 'max' for the highest contract-safe terminal tick */\n    end: number | 'max';\n  };\n  /** Number of liquidity positions in this curve */\n  numPositions: number;\n  /** Share of total supply allocated to this curve (WAD, e.g., parseEther('0.3') = 30%) */\n  shares: bigint;\n}\n\n/**\n * Market cap-based configuration for Multicurve pools.\n * No tick math required - just specify market caps in USD.\n */\nexport interface MulticurveMarketCapCurvesConfig {\n  /** Price of numeraire in USD (e.g., 3000 for ETH at $3000) */\n  numerairePrice: number;\n  /**\n   * Array of curves defining market cap ranges and liquidity distribution.\n   * The first curve's marketCap.start is the launch price.\n   * Curves must be contiguous (no gaps allowed).\n   */\n  curves: MulticurveMarketCapRangeCurve[];\n  /** Token supply override */\n  tokenSupply?: bigint;\n  /** Token decimals (default: 18) */\n  tokenDecimals?: number;\n  /** Numeraire decimals (default: 18) */\n  numeraireDecimals?: number;\n  /** Fee tier (default: FEE_TIERS.LOW) */\n  fee?: number;\n  /** Tick spacing (derived from fee if not provided) */\n  tickSpacing?: number;\n  /** Optional beneficiaries for fee streaming */\n  beneficiaries?: BeneficiaryData[];\n}\n\n// Build configuration for static auctions (V3-style)\nexport interface StaticAuctionBuildConfig {\n  // Token details\n  name: string;\n  symbol: string;\n  totalSupply?: bigint; // default: 1 billion\n  numTokensToSell?: bigint; // default: 900 million\n  tokenURI: string;\n\n  // Time parameters\n  startTimeOffset?: number; // Optional - seconds to add to current block timestamp (default: 30)\n\n  // Price parameters - must provide either priceRange or tickRange\n  numeraire: Address; // Required for V3\n  tickRange?: TickRange;\n  priceRange?: PriceRange;\n  fee?: number; // default: 10000 (1%)\n\n  // Pool parameters (V3 specific)\n  numPositions?: number; // default: 15\n  maxShareToBeSold?: bigint; // default: 35% in WAD\n\n  // Vesting parameters\n  yearlyMintRate?: bigint; // default: 2%\n  vestingDuration?: bigint; // default: 1 year\n  recipients?: Address[]; // defaults to [userAddress]\n  amounts?: bigint[]; // defaults based on pre-mint calculation\n\n  // Migration configuration\n  migration: MigrationConfig;\n\n  // Other parameters\n  integrator?: Address;\n  useGovernance?: boolean; // default: true\n}\n\n// Build configuration for dynamic auctions (V4-style)\nexport interface DynamicAuctionBuildConfig {\n  // Token details\n  name: string;\n  symbol: string;\n  totalSupply: bigint;\n  numTokensToSell: bigint;\n  tokenURI: string;\n\n  // Time parameters\n  startTimeOffset?: number; // Optional - seconds to add to block timestamp (default: 30)\n  blockTimestamp?: number; // Optional - specific block timestamp to use (default: fetch latest)\n  duration?: number; // in seconds (default: 604800 = 7 days)\n  epochLength?: number; // in seconds (default: 3600)\n\n  // Price parameters - must provide either priceRange or tickRange\n  numeraire?: Address; // defaults to zero address\n  tickRange?: TickRange;\n  priceRange?: PriceRange;\n  tickSpacing: number;\n  gamma?: number; // auto-calculated if not provided\n  fee: number; // In basis points\n\n  // Sale parameters\n  minProceeds: bigint;\n  maxProceeds: bigint;\n  numPdSlugs?: number; // default: 5\n\n  // Vesting parameters\n  yearlyMintRate?: bigint; // default: 2%\n  vestingDuration: bigint;\n  recipients: Address[];\n  amounts: bigint[];\n\n  // Migration configuration\n  migration: MigrationConfig;\n\n  // Other parameters\n  integrator?: Address;\n  useGovernance?: boolean; // default: true\n}\n\n// SDK initialization configuration\nexport interface DopplerSDKConfig {\n  publicClient: SupportedPublicClient;\n  walletClient?: WalletClient;\n  chainId: number;\n}\n\n// Pool information types\nexport interface PoolInfo {\n  address: Address;\n  tokenAddress: Address;\n  numeraireAddress: Address;\n  fee: number;\n  liquidity: bigint;\n  sqrtPriceX96: bigint;\n}\n\nexport interface HookInfo {\n  hookAddress: Address;\n  tokenAddress: Address;\n  numeraireAddress: Address;\n  poolId: string;\n  currentEpoch: number;\n  totalProceeds: bigint;\n  totalTokensSold: bigint;\n  earlyExit: boolean;\n  insufficientProceeds: boolean;\n  startingTime: bigint;\n  endingTime: bigint;\n  epochLength: bigint;\n  minimumProceeds: bigint;\n  maximumProceeds: bigint;\n}\n\nexport interface OpeningAuctionState {\n  numeraire: Address;\n  auctionStartTime: bigint;\n  auctionEndTime: bigint;\n  auctionTokens: bigint;\n  dopplerTokens: bigint;\n  status: OpeningAuctionStatus;\n  openingAuctionHook: Address;\n  dopplerHook: Address;\n  openingAuctionPoolKey: V4PoolKey;\n  dopplerInitData: `0x${string}`;\n  isToken0: boolean;\n}\n\nexport interface OpeningAuctionCreateResult {\n  tokenAddress: Address;\n  openingAuctionHookAddress: Address;\n  transactionHash: string;\n  createParams: CreateParams;\n  minedSalt: `0x${string}`;\n}\n\nexport interface OpeningAuctionCompleteResult {\n  asset: Address;\n  dopplerHookAddress: Address;\n  transactionHash: string;\n  dopplerSalt: `0x${string}`;\n}\n\n// Quote result type\nexport interface QuoteResult {\n  amountOut: bigint;\n  priceImpact: number;\n  fee: bigint;\n  route: string[];\n}\n\n// Lockable Uniswap V3 Initializer encode params\nexport interface LockableV3InitializerParams {\n  fee: number;\n  tickLower: number;\n  tickUpper: number;\n  numPositions: number;\n  maxShareToBeSold: bigint;\n  beneficiaries: BeneficiaryData[];\n}\n\n// Multicurve curve configuration (mirrors solidity struct)\nexport interface MulticurveCurve {\n  tickLower: number; // int24\n  tickUpper: number; // int24\n  numPositions: number; // uint16\n  shares: bigint; // uint256 (WAD)\n}\n\nexport type MulticurveMarketCapPreset = 'low' | 'medium' | 'high';\n\nexport interface V4PoolKey {\n  currency0: Address;\n  currency1: Address;\n  fee: number;\n  tickSpacing: number;\n  hooks: Address;\n}\n\n// RehypeDopplerHook configuration for fee distribution and buyback\nexport interface RehypeFeeDistributionInfo {\n  assetFeesToAssetBuybackWad: bigint;\n  assetFeesToNumeraireBuybackWad: bigint;\n  assetFeesToBeneficiaryWad: bigint;\n  assetFeesToLpWad: bigint;\n  numeraireFeesToAssetBuybackWad: bigint;\n  numeraireFeesToNumeraireBuybackWad: bigint;\n  numeraireFeesToBeneficiaryWad: bigint;\n  numeraireFeesToLpWad: bigint;\n}\n\nexport enum RehypeFeeRoutingMode {\n  DirectBuyback = 0,\n  RouteToBeneficiaryFees = 1,\n}\n\ntype RehypeFeeRoutingModeInput =\n  | RehypeFeeRoutingMode\n  | 'directBuyback'\n  | 'routeToBeneficiaryFees';\n\ntype RehypeDopplerHookInitializerCommonConfig = {\n  hookAddress: Address;\n  startFee?: number;\n  endFee?: number;\n  durationSeconds?: number | bigint;\n  startingTime?: number | bigint | Date;\n  feeDistributionInfo?: RehypeFeeDistributionInfo;\n\n  /**\n   * @deprecated Use startFee/endFee instead. When provided alone, maps to startFee=endFee=customFee.\n   */\n  customFee?: number;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   * If feeDistributionInfo is omitted, legacy percentages are mirrored to both rows.\n   */\n  assetBuybackPercentWad?: bigint;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   */\n  numeraireBuybackPercentWad?: bigint;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   */\n  beneficiaryPercentWad?: bigint;\n  /**\n   * @deprecated Use feeDistributionInfo.* fields instead.\n   */\n  lpPercentWad?: bigint;\n\n  // Optional graduation calldata (called when pool graduates)\n  graduationCalldata?: `0x${string}`;\n\n  // Graduation threshold configuration (rehype-only)\n  // Market cap in USD at which pool can graduate. Requires numerairePrice (from withCurves() or explicit).\n  graduationMarketCap?: number;\n  // Price of numeraire in USD. Optional if using withCurves() (reuses that value). Required with poolConfig().\n  numerairePrice?: number;\n  // Direct tick value for graduation threshold. Use graduationMarketCap for USD-based config.\n  farTick?: number;\n};\n\ntype RehypeBuybackDestinationConfig = {\n  buybackDestination?: Address;\n  feeBeneficiaries?: never;\n  feeRoutingMode?: RehypeFeeRoutingModeInput;\n};\n\ntype RehypeFeeBeneficiariesConfig = {\n  buybackDestination?: Address;\n  feeBeneficiaries: [BeneficiaryData, ...BeneficiaryData[]];\n  feeRoutingMode?:\n    | RehypeFeeRoutingMode.RouteToBeneficiaryFees\n    | 'routeToBeneficiaryFees';\n};\n\n/**\n * Rehype fee distribution controller requirements:\n *\n * `buybackDestination` is encoded as the hook's `buybackDst`: it is the only\n * address authorized to call `setFeeDistribution` and also receives\n * direct-buyback proceeds and legacy empty-beneficiary fees. Configured\n * `feeBeneficiaries` control beneficiary fee recipients but do not grant that\n * authority.\n *\n * Every Rehype configuration requires an explicit fee distribution controller.\n * Direct factory callers must set `buybackDestination`. Builder callers may\n * instead use `withFeeDistributionController`. These options configure the\n * same on-chain field and cannot be used together.\n *\n * Governance configuration, governance factory results, fee beneficiaries,\n * and LP reinvestment do not determine or provide the controller.\n */\nexport type RehypeDopplerHookInitializerConfig =\n  RehypeDopplerHookInitializerCommonConfig &\n    (RehypeBuybackDestinationConfig | RehypeFeeBeneficiariesConfig);\n\n/** @deprecated Use RehypeDopplerHookInitializerConfig instead. */\nexport type RehypeDopplerHookConfig = RehypeDopplerHookInitializerConfig;\n\n// Decay fee schedule state for multicurve pools using a dynamic-fee hook\nexport interface MulticurveDecayFeeSchedule {\n  startingTime: number;\n  startFee: number;\n  endFee: number;\n  lastFee: number;\n  durationSeconds: number;\n}\n\nexport type MulticurveInitializerConfig =\n  | { type: 'dopplerHookInitializer' }\n  | {\n      /** @deprecated Use 'dopplerHookInitializer' instead. */\n      type: 'dopplerHook';\n    }\n  | { type: 'standard' }\n  | { type: 'scheduled'; startTime: number }\n  | {\n      type: 'decay';\n      startTime: number;\n      startFee: number;\n      durationSeconds: number;\n    }\n  | { type: 'rehype'; config: RehypeDopplerHookInitializerConfig };\n\n/**\n * Bundler custody schedule for a multicurve dev buy.\n *\n * Durations are seconds. A permissionless claim changes who may trigger the\n * claim, never the recipient.\n */\nexport interface MulticurveDevBuyVestingConfig {\n  permissionlessClaim: boolean;\n  vestingDuration: bigint;\n  cliffDuration: bigint;\n}\n\n/** Exact-input purchase executed atomically with multicurve market creation. */\nexport interface MulticurveDevBuyConfig {\n  exactAmountIn: bigint;\n  recipient: Address;\n  vesting: MulticurveDevBuyVestingConfig;\n}\n\n// Create Multicurve initializer parameters\nexport interface CreateMulticurveParams<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  // Token configuration\n  token: TokenConfig;\n\n  // Sale configuration\n  sale: SaleConfig;\n\n  // Pool configuration for multicurve initializer\n  pool: {\n    // For decay initializer mode, this is the terminal fee (endFee).\n    fee: number;\n    tickSpacing: number;\n    curves: MulticurveCurve[];\n    // Optional beneficiaries to lock the pool (fee collection only, no migration)\n    beneficiaries?: BeneficiaryData[];\n  };\n\n  // Preferred initializer configuration. Defaults to DopplerHookInitializer.\n  initializer?: MulticurveInitializerConfig;\n\n  /**\n   * @deprecated Use initializer: { type: 'scheduled', startTime } instead.\n   * Retained for backwards compatibility.\n   */\n  // Optional scheduled launch configuration\n  schedule?: {\n    startTime: number;\n  };\n\n  /**\n   * @deprecated Use initializer: { type: 'rehype', config } instead.\n   * Retained for backwards compatibility.\n   */\n  dopplerHook?: RehypeDopplerHookConfig;\n\n  // Vesting configuration (optional)\n  vesting?: VestingConfig;\n\n  /** Optional exact-input purchase executed atomically through Bundler. */\n  devBuy?: MulticurveDevBuyConfig;\n\n  // Governance configuration\n  governance: GovernanceOption<C>;\n\n  // Migration configuration (can be any supported migrator: V2, V3, or V4)\n  migration: MigrationConfig;\n\n  // Integrator details\n  integrator?: Address;\n  userAddress: Address;\n\n  // Optional deterministic salt for CREATE2 token address selection\n  salt?: Hex;\n\n  // Optional address overrides for on-chain modules used during encoding/creation\n  modules?: ModuleAddressOverrides;\n\n  // Optional transaction gas limit override for the create() transaction\n  gas?: bigint;\n}\n\n// Final Params object that gets passed as arg to create\nexport interface CreateParams {\n  initialSupply: bigint;\n  numTokensToSell: bigint;\n  numeraire: Address;\n  tokenFactory: Address;\n  tokenFactoryData: `0x${string}`;\n  governanceFactory: Address;\n  governanceFactoryData: `0x${string}`;\n  poolInitializer: Address;\n  poolInitializerData: `0x${string}`;\n  liquidityMigrator: Address;\n  liquidityMigratorData: `0x${string}`;\n  integrator: Address;\n  salt: `0x${string}`;\n}\n\nexport interface PrepareCreateMulticurveOptions {\n  account: Address;\n}\n\nexport type MulticurveCreateGasEstimate =\n  | { status: 'estimated'; gas: bigint }\n  | { status: 'unavailable' };\n\nexport interface MulticurveCreatePrediction {\n  tokenAddress: Address;\n  poolOrHookAddress: Address;\n  governanceAddress: Address;\n  timelockAddress: Address;\n  migrationPoolAddress?: Address;\n  poolKey: V4PoolKey;\n  poolId: Hex;\n  tokenIsCurrency0: boolean;\n}\n\nexport interface PreparedMulticurveTransaction {\n  to: Address;\n  data: Hex;\n  value: bigint;\n}\n\n/** Dev-buy details returned by preparation and contract simulation. */\nexport interface PreparedMulticurveDevBuy extends MulticurveDevBuyConfig {\n  bundler: Address;\n  simulatedAmountOut: bigint;\n}\n\nexport interface PreparedMulticurveCreate<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  chainId: C;\n  account: Address;\n  airlock: Address;\n  createParams: CreateParams;\n  prediction: MulticurveCreatePrediction;\n  transaction: PreparedMulticurveTransaction;\n  approvalTransaction?: PreparedMulticurveTransaction;\n  devBuy?: PreparedMulticurveDevBuy;\n  gasEstimate: MulticurveCreateGasEstimate;\n}\n\nexport interface SimulatedMulticurveCreate<\n  _C extends SupportedChainId = SupportedChainId,\n> {\n  createParams: CreateParams;\n  tokenAddress: Address;\n  poolId: Hex;\n  gasEstimate?: bigint;\n  devBuy?: PreparedMulticurveDevBuy;\n  execute: () => Promise<MulticurveCreateResult>;\n}\n\n/** Dev-buy details verified from the executed Bundler receipt. */\nexport interface MulticurveDevBuyResult extends MulticurveDevBuyConfig {\n  bundler: Address;\n  amountOut: bigint;\n}\n\nexport interface MulticurveCreateResult {\n  tokenAddress: Address;\n  poolId: Hex;\n  transactionHash: Hash;\n  approvalTransactionHash?: Hash;\n  devBuy?: MulticurveDevBuyResult;\n}\n\n// Optional per-call module address overrides. When provided, these take precedence\n// over chain defaults resolved via getAddresses(chainId).\nexport interface ModuleAddressOverrides {\n  // Core deployment & routing\n  airlock?: Address;\n  bundler?: Address;\n  tokenFactory?: Address;\n  dopplerERC20V1Factory?: Address;\n\n  // Initializers\n  v3Initializer?: Address;\n  lockableV3Initializer?: Address;\n  v4Initializer?: Address;\n  v4MulticurveInitializer?: Address;\n  v4ScheduledMulticurveInitializer?: Address;\n  v4DecayMulticurveInitializer?: Address;\n  openingAuctionInitializer?: Address;\n  openingAuctionPositionManager?: Address;\n  dopplerHookInitializer?: Address;\n  rehypeDopplerHookInitializer?: Address;\n\n  // DopplerHooks\n  /**\n   * @deprecated Use rehypeDopplerHookInitializer instead.\n   */\n  rehypeDopplerHook?: Address;\n\n  // Governance\n  governanceFactory?: Address;\n\n  // Dynamic auction infra\n  poolManager?: Address;\n  dopplerDeployer?: Address;\n\n  // Migrators\n  v2Migrator?: Address;\n  v2MigratorSplit?: Address;\n  v4Migrator?: Address;\n  v4MigratorSplit?: Address;\n  dopplerHookMigrator?: Address;\n  rehypeDopplerHookMigrator?: Address;\n  noOpMigrator?: Address;\n}\n","import { WAD } from '../constants';\nimport type {\n  RehypeDopplerHookInitializerConfig,\n  RehypeFeeDistributionInfo,\n} from '../types';\n\nexport function resolveRehypeFeeDistributionInfo(\n  config: RehypeDopplerHookInitializerConfig,\n): RehypeFeeDistributionInfo {\n  const feeDistributionInfo =\n    config.feeDistributionInfo ?? resolveLegacyFeeDistributionInfo(config);\n  validateFeeDistributionInfo(feeDistributionInfo);\n  return feeDistributionInfo;\n}\n\nfunction resolveLegacyFeeDistributionInfo(\n  config: RehypeDopplerHookInitializerConfig,\n): RehypeFeeDistributionInfo {\n  const assetBuyback = config.assetBuybackPercentWad;\n  const numeraireBuyback = config.numeraireBuybackPercentWad;\n  const beneficiary = config.beneficiaryPercentWad;\n  const lp = config.lpPercentWad;\n\n  if (\n    assetBuyback === undefined ||\n    numeraireBuyback === undefined ||\n    beneficiary === undefined ||\n    lp === undefined\n  ) {\n    throw new Error(\n      'Rehype feeDistributionInfo is required, or provide all deprecated legacy percentages.',\n    );\n  }\n\n  return {\n    assetFeesToAssetBuybackWad: assetBuyback,\n    assetFeesToNumeraireBuybackWad: numeraireBuyback,\n    assetFeesToBeneficiaryWad: beneficiary,\n    assetFeesToLpWad: lp,\n    numeraireFeesToAssetBuybackWad: assetBuyback,\n    numeraireFeesToNumeraireBuybackWad: numeraireBuyback,\n    numeraireFeesToBeneficiaryWad: beneficiary,\n    numeraireFeesToLpWad: lp,\n  };\n}\n\nfunction validateFeeDistributionInfo(\n  feeDistributionInfo: RehypeFeeDistributionInfo,\n): void {\n  if (\n    feeDistributionInfo.assetFeesToAssetBuybackWad < 0n ||\n    feeDistributionInfo.assetFeesToNumeraireBuybackWad < 0n ||\n    feeDistributionInfo.assetFeesToBeneficiaryWad < 0n ||\n    feeDistributionInfo.assetFeesToLpWad < 0n\n  ) {\n    throw new Error(\n      'Rehype asset fee distribution cannot contain negative components',\n    );\n  }\n\n  const assetRowTotal =\n    feeDistributionInfo.assetFeesToAssetBuybackWad +\n    feeDistributionInfo.assetFeesToNumeraireBuybackWad +\n    feeDistributionInfo.assetFeesToBeneficiaryWad +\n    feeDistributionInfo.assetFeesToLpWad;\n  if (assetRowTotal !== WAD) {\n    throw new Error(\n      `Rehype asset fee distribution must sum to ${WAD} (100%), but got ${assetRowTotal}`,\n    );\n  }\n\n  if (\n    feeDistributionInfo.numeraireFeesToAssetBuybackWad < 0n ||\n    feeDistributionInfo.numeraireFeesToNumeraireBuybackWad < 0n ||\n    feeDistributionInfo.numeraireFeesToBeneficiaryWad < 0n ||\n    feeDistributionInfo.numeraireFeesToLpWad < 0n\n  ) {\n    throw new Error(\n      'Rehype numeraire fee distribution cannot contain negative components',\n    );\n  }\n\n  const numeraireRowTotal =\n    feeDistributionInfo.numeraireFeesToAssetBuybackWad +\n    feeDistributionInfo.numeraireFeesToNumeraireBuybackWad +\n    feeDistributionInfo.numeraireFeesToBeneficiaryWad +\n    feeDistributionInfo.numeraireFeesToLpWad;\n  if (numeraireRowTotal !== WAD) {\n    throw new Error(\n      `Rehype numeraire fee distribution must sum to ${WAD} (100%), but got ${numeraireRowTotal}`,\n    );\n  }\n}\n","import type { Address, Hex } from 'viem';\nimport { isAddress } from 'viem';\nimport {\n  RehypeFeeRoutingMode,\n  type BeneficiaryData,\n  type RehypeDopplerHookInitializerConfig,\n  type RehypeFeeDistributionInfo,\n} from '../types';\nimport { DECAY_MAX_START_FEE, ZERO_ADDRESS } from '../constants';\nimport { normalizeBeneficiaries } from './beneficiaries';\nimport { resolveRehypeFeeDistributionInfo } from './rehypeFeeDistribution';\n\ntype NormalizedCommonConfig = {\n  hookAddress: Address;\n  startFee: number;\n  endFee: number;\n  durationSeconds: number;\n  startingTime: number;\n  feeDistributionInfo: RehypeFeeDistributionInfo;\n  graduationCalldata?: Hex;\n  graduationMarketCap?: number;\n  numerairePrice?: number;\n  farTick?: number;\n};\n\ntype NormalizedBuybackConfig = NormalizedCommonConfig & {\n  buybackDestination: Address;\n  feeBeneficiaries?: never;\n  feeRoutingMode: RehypeFeeRoutingMode;\n};\n\ntype NormalizedBeneficiaryConfig = NormalizedCommonConfig & {\n  buybackDestination: Address;\n  feeBeneficiaries: [BeneficiaryData, ...BeneficiaryData[]];\n  feeRoutingMode: RehypeFeeRoutingMode.RouteToBeneficiaryFees;\n};\n\nexport type NormalizedRehypeDopplerHookInitializerConfig =\n  | NormalizedBuybackConfig\n  | NormalizedBeneficiaryConfig;\n\n/**\n * Normalize a Rehype configuration after its fee distribution controller has\n * been configured. `buybackDestination` and `controllerOverride` configure the\n * same on-chain `buybackDst` field and cannot be used together.\n */\nexport function normalizeRehypeDopplerHookInitializerConfig(\n  config: RehypeDopplerHookInitializerConfig,\n  controllerOverride?: Address,\n): NormalizedRehypeDopplerHookInitializerConfig {\n  assertNonZeroAddress(config.hookAddress, 'Rehype hookAddress');\n\n  if (\n    config.buybackDestination !== undefined &&\n    controllerOverride !== undefined\n  ) {\n    throw new Error(\n      'Rehype buybackDestination and withFeeDistributionController are mutually exclusive',\n    );\n  }\n\n  const buybackDestination = config.buybackDestination ?? controllerOverride;\n  if (buybackDestination === undefined) {\n    throw new Error(\n      'Rehype requires buybackDestination or withFeeDistributionController',\n    );\n  }\n  assertNonZeroAddress(buybackDestination, 'Rehype buybackDestination');\n\n  const feeBeneficiaries = config.feeBeneficiaries;\n\n  const feeDistributionInfo = resolveRehypeFeeDistributionInfo(config);\n  const { startFee, endFee, durationSeconds, startingTime } =\n    normalizeFeeSchedule(config);\n  const feeRoutingMode =\n    feeBeneficiaries !== undefined\n      ? normalizeBeneficiaryFeeRoutingMode(config.feeRoutingMode)\n      : normalizeFeeRoutingMode(config.feeRoutingMode);\n  const common = {\n    hookAddress: config.hookAddress,\n    startFee,\n    endFee,\n    durationSeconds,\n    startingTime,\n    feeDistributionInfo,\n    graduationCalldata: config.graduationCalldata,\n    graduationMarketCap: config.graduationMarketCap,\n    numerairePrice: config.numerairePrice,\n    farTick: config.farTick,\n  };\n  if (feeBeneficiaries !== undefined) {\n    const normalizedBeneficiaries = normalizeBeneficiaries(\n      feeBeneficiaries,\n      'Rehype fee beneficiary',\n    );\n\n    return {\n      ...common,\n      buybackDestination,\n      feeBeneficiaries: normalizedBeneficiaries,\n      feeRoutingMode: RehypeFeeRoutingMode.RouteToBeneficiaryFees,\n    };\n  }\n\n  return {\n    ...common,\n    buybackDestination,\n    feeRoutingMode,\n  };\n}\n\nfunction assertNonZeroAddress(address: Address, label: string): void {\n  if (\n    !isAddress(address, { strict: false }) ||\n    address.toLowerCase() === ZERO_ADDRESS\n  ) {\n    throw new Error(`${label} must be a non-zero address`);\n  }\n}\n\nfunction normalizeFeeRoutingMode(\n  mode: RehypeDopplerHookInitializerConfig['feeRoutingMode'],\n): RehypeFeeRoutingMode {\n  if (mode === undefined || mode === RehypeFeeRoutingMode.DirectBuyback) {\n    return RehypeFeeRoutingMode.DirectBuyback;\n  }\n  if (mode === RehypeFeeRoutingMode.RouteToBeneficiaryFees) {\n    return RehypeFeeRoutingMode.RouteToBeneficiaryFees;\n  }\n  if (mode === 'directBuyback') {\n    return RehypeFeeRoutingMode.DirectBuyback;\n  }\n  if (mode === 'routeToBeneficiaryFees') {\n    return RehypeFeeRoutingMode.RouteToBeneficiaryFees;\n  }\n  throw new Error('Unsupported Rehype feeRoutingMode');\n}\n\nfunction normalizeBeneficiaryFeeRoutingMode(\n  mode: RehypeDopplerHookInitializerConfig['feeRoutingMode'],\n): RehypeFeeRoutingMode.RouteToBeneficiaryFees {\n  if (\n    mode === undefined ||\n    mode === RehypeFeeRoutingMode.RouteToBeneficiaryFees ||\n    mode === 'routeToBeneficiaryFees'\n  ) {\n    return RehypeFeeRoutingMode.RouteToBeneficiaryFees;\n  }\n  throw new Error(\n    'Rehype fee beneficiaries are incompatible with DirectBuyback routing',\n  );\n}\n\nfunction normalizeFeeSchedule(\n  config: RehypeDopplerHookInitializerConfig,\n): Pick<\n  NormalizedCommonConfig,\n  'startFee' | 'endFee' | 'durationSeconds' | 'startingTime'\n> {\n  const maxRehypeFee = DECAY_MAX_START_FEE;\n  const startFeeRaw = config.startFee ?? config.customFee;\n  if (startFeeRaw === undefined) {\n    throw new Error(\n      'Rehype startFee is required, or provide deprecated customFee.',\n    );\n  }\n\n  const startFee = Number(startFeeRaw);\n  const endFee = Number(config.endFee ?? startFee);\n  if (!Number.isInteger(startFee) || startFee < 0 || startFee > maxRehypeFee) {\n    throw new Error(\n      `Rehype startFee must be an integer between 0 and ${maxRehypeFee}`,\n    );\n  }\n  if (!Number.isInteger(endFee) || endFee < 0 || endFee > maxRehypeFee) {\n    throw new Error(\n      `Rehype endFee must be an integer between 0 and ${maxRehypeFee}`,\n    );\n  }\n  if (startFee < endFee) {\n    throw new Error(\n      `Rehype startFee (${startFee}) must be greater than or equal to endFee (${endFee})`,\n    );\n  }\n\n  const durationRaw =\n    config.durationSeconds ?? (startFee === endFee ? 0 : undefined);\n  if (durationRaw === undefined) {\n    throw new Error(\n      'Rehype durationSeconds must be provided when startFee is greater than endFee.',\n    );\n  }\n  const durationSeconds = normalizeUint32(\n    durationRaw,\n    'Rehype durationSeconds',\n  );\n  if (startFee > endFee && durationSeconds === 0) {\n    throw new Error(\n      'Rehype durationSeconds must be greater than 0 when startFee is greater than endFee.',\n    );\n  }\n\n  const startingTimeValue = config.startingTime;\n  const startingTime =\n    startingTimeValue === undefined\n      ? 0\n      : normalizeUint32(\n          startingTimeValue instanceof Date\n            ? Math.floor(startingTimeValue.getTime() / 1_000)\n            : startingTimeValue,\n          'Rehype startingTime',\n        );\n\n  return { startFee, endFee, durationSeconds, startingTime };\n}\n\nfunction normalizeUint32(value: number | bigint, label: string): number {\n  const normalized = Number(value);\n  if (!Number.isFinite(normalized) || !Number.isInteger(normalized)) {\n    throw new Error(`${label} must be an integer number of seconds`);\n  }\n  if (normalized < 0) {\n    throw new Error(`${label} cannot be negative`);\n  }\n  if (normalized > 0xffffffff) {\n    throw new Error(`${label} must fit within uint32`);\n  }\n  return normalized;\n}\n","import { encodeAbiParameters, type Address, type Hex } from 'viem';\nimport { ZERO_ADDRESS } from '../constants';\nimport type { NormalizedRehypeDopplerHookInitializerConfig } from './rehypeDopplerHookInitializer';\n\nexport function encodeRehypeDopplerHookInitializerData(\n  numeraire: Address,\n  config: NormalizedRehypeDopplerHookInitializerConfig,\n): Hex {\n  return encodeAbiParameters(rehypeInitializerDataAbi, [\n    {\n      numeraire,\n      buybackDst: config.buybackDestination ?? ZERO_ADDRESS,\n      startFee: config.startFee,\n      endFee: config.endFee,\n      durationSeconds: config.durationSeconds,\n      startingTime: config.startingTime,\n      feeRoutingMode: config.feeRoutingMode,\n      feeDistributionInfo: config.feeDistributionInfo,\n      feeBeneficiaries: config.feeBeneficiaries ?? [],\n    },\n  ]);\n}\n\nconst beneficiaryComponents = [\n  { name: 'beneficiary', type: 'address' },\n  { name: 'shares', type: 'uint96' },\n] as const;\n\nconst feeDistributionComponents = [\n  { name: 'assetFeesToAssetBuybackWad', type: 'uint256' },\n  { name: 'assetFeesToNumeraireBuybackWad', type: 'uint256' },\n  { name: 'assetFeesToBeneficiaryWad', type: 'uint256' },\n  { name: 'assetFeesToLpWad', type: 'uint256' },\n  { name: 'numeraireFeesToAssetBuybackWad', type: 'uint256' },\n  { name: 'numeraireFeesToNumeraireBuybackWad', type: 'uint256' },\n  { name: 'numeraireFeesToBeneficiaryWad', type: 'uint256' },\n  { name: 'numeraireFeesToLpWad', type: 'uint256' },\n] as const;\n\nconst rehypeInitializerDataAbi = [\n  {\n    type: 'tuple',\n    components: [\n      { name: 'numeraire', type: 'address' },\n      { name: 'buybackDst', type: 'address' },\n      { name: 'startFee', type: 'uint24' },\n      { name: 'endFee', type: 'uint24' },\n      { name: 'durationSeconds', type: 'uint32' },\n      { name: 'startingTime', type: 'uint32' },\n      { name: 'feeRoutingMode', type: 'uint8' },\n      {\n        name: 'feeDistributionInfo',\n        type: 'tuple',\n        components: feeDistributionComponents,\n      },\n      {\n        name: 'feeBeneficiaries',\n        type: 'tuple[]',\n        components: beneficiaryComponents,\n      },\n    ],\n  },\n] as const;\n","import { encodeAbiParameters, type Address, type Hex } from 'viem';\nimport {\n  RehypeFeeRoutingMode,\n  type RehypeDopplerHookMigratorConfig,\n  type RehypeFeeDistributionInfo,\n} from '../types';\nimport { WAD } from '../constants';\n\ntype NormalizedRehypeDopplerHookMigratorConfig = {\n  buybackDestination: Address;\n  customFee: number;\n  feeRoutingMode: RehypeFeeRoutingMode;\n  feeDistributionInfo: RehypeFeeDistributionInfo;\n};\n\nfunction normalizeRehypeFeeRoutingMode(\n  mode: RehypeDopplerHookMigratorConfig['feeRoutingMode'],\n): RehypeFeeRoutingMode {\n  if (mode === undefined || mode === RehypeFeeRoutingMode.DirectBuyback) {\n    return RehypeFeeRoutingMode.DirectBuyback;\n  }\n  if (mode === RehypeFeeRoutingMode.RouteToBeneficiaryFees) {\n    return RehypeFeeRoutingMode.RouteToBeneficiaryFees;\n  }\n  if (mode === 'directBuyback') {\n    return RehypeFeeRoutingMode.DirectBuyback;\n  }\n  if (mode === 'routeToBeneficiaryFees') {\n    return RehypeFeeRoutingMode.RouteToBeneficiaryFees;\n  }\n  throw new Error(\n    'Rehype feeRoutingMode must be DirectBuyback/directBuyback or RouteToBeneficiaryFees/routeToBeneficiaryFees',\n  );\n}\n\nfunction resolveRehypeFeeDistributionInfo(\n  config: RehypeDopplerHookMigratorConfig,\n): RehypeFeeDistributionInfo {\n  if (config.feeDistributionInfo) {\n    return config.feeDistributionInfo;\n  }\n\n  const assetBuyback = config.assetBuybackPercentWad;\n  const numeraireBuyback = config.numeraireBuybackPercentWad;\n  const beneficiary = config.beneficiaryPercentWad;\n  const lp = config.lpPercentWad;\n\n  if (\n    assetBuyback === undefined ||\n    numeraireBuyback === undefined ||\n    beneficiary === undefined ||\n    lp === undefined\n  ) {\n    throw new Error(\n      'Rehype feeDistributionInfo is required, or provide all deprecated legacy percentages.',\n    );\n  }\n\n  return {\n    assetFeesToAssetBuybackWad: assetBuyback,\n    assetFeesToNumeraireBuybackWad: numeraireBuyback,\n    assetFeesToBeneficiaryWad: beneficiary,\n    assetFeesToLpWad: lp,\n    numeraireFeesToAssetBuybackWad: assetBuyback,\n    numeraireFeesToNumeraireBuybackWad: numeraireBuyback,\n    numeraireFeesToBeneficiaryWad: beneficiary,\n    numeraireFeesToLpWad: lp,\n  };\n}\n\nfunction validateRehypeFeeDistributionInfo(\n  feeDistributionInfo: RehypeFeeDistributionInfo,\n): void {\n  const assetRowTotal =\n    feeDistributionInfo.assetFeesToAssetBuybackWad +\n    feeDistributionInfo.assetFeesToNumeraireBuybackWad +\n    feeDistributionInfo.assetFeesToBeneficiaryWad +\n    feeDistributionInfo.assetFeesToLpWad;\n  if (assetRowTotal !== WAD) {\n    throw new Error(\n      `Rehype asset fee distribution must sum to ${WAD} (100%), but got ${assetRowTotal}`,\n    );\n  }\n\n  const numeraireRowTotal =\n    feeDistributionInfo.numeraireFeesToAssetBuybackWad +\n    feeDistributionInfo.numeraireFeesToNumeraireBuybackWad +\n    feeDistributionInfo.numeraireFeesToBeneficiaryWad +\n    feeDistributionInfo.numeraireFeesToLpWad;\n  if (numeraireRowTotal !== WAD) {\n    throw new Error(\n      `Rehype numeraire fee distribution must sum to ${WAD} (100%), but got ${numeraireRowTotal}`,\n    );\n  }\n}\n\nexport function normalizeRehypeDopplerHookMigratorConfig(\n  config: RehypeDopplerHookMigratorConfig,\n): NormalizedRehypeDopplerHookMigratorConfig {\n  if (!Number.isInteger(config.customFee) || config.customFee < 0) {\n    throw new Error('Rehype customFee must be a non-negative integer');\n  }\n  if (config.customFee > 1_000_000) {\n    throw new Error('Rehype customFee must be <= 1000000 (100%)');\n  }\n\n  const feeDistributionInfo = resolveRehypeFeeDistributionInfo(config);\n  validateRehypeFeeDistributionInfo(feeDistributionInfo);\n\n  return {\n    buybackDestination: config.buybackDestination,\n    customFee: config.customFee,\n    feeRoutingMode: normalizeRehypeFeeRoutingMode(config.feeRoutingMode),\n    feeDistributionInfo,\n  };\n}\n\nexport function encodeRehypeDopplerHookMigratorCalldata(params: {\n  numeraire: Address;\n  config: RehypeDopplerHookMigratorConfig;\n}): Hex {\n  const normalized = normalizeRehypeDopplerHookMigratorConfig(params.config);\n\n  return encodeAbiParameters(\n    [\n      {\n        type: 'tuple',\n        components: [\n          { name: 'numeraire', type: 'address' },\n          { name: 'buybackDst', type: 'address' },\n          { name: 'customFee', type: 'uint24' },\n          { name: 'feeRoutingMode', type: 'uint8' },\n          {\n            name: 'feeDistributionInfo',\n            type: 'tuple',\n            components: [\n              { name: 'assetFeesToAssetBuybackWad', type: 'uint256' },\n              { name: 'assetFeesToNumeraireBuybackWad', type: 'uint256' },\n              { name: 'assetFeesToBeneficiaryWad', type: 'uint256' },\n              { name: 'assetFeesToLpWad', type: 'uint256' },\n              { name: 'numeraireFeesToAssetBuybackWad', type: 'uint256' },\n              { name: 'numeraireFeesToNumeraireBuybackWad', type: 'uint256' },\n              { name: 'numeraireFeesToBeneficiaryWad', type: 'uint256' },\n              { name: 'numeraireFeesToLpWad', type: 'uint256' },\n            ],\n          },\n        ],\n      },\n    ],\n    [\n      {\n        numeraire: params.numeraire,\n        buybackDst: normalized.buybackDestination,\n        customFee: normalized.customFee,\n        feeRoutingMode: normalized.feeRoutingMode,\n        feeDistributionInfo: normalized.feeDistributionInfo,\n      },\n    ],\n  );\n}\n","import {\n  decodeEventLog,\n  keccak256,\n  encodeAbiParameters,\n  type Address,\n  type Hash,\n  type Hex,\n  type TransactionReceipt,\n} from 'viem';\nimport { airlockAbi, bundlerAbi } from '../abis';\nimport type {\n  PreparedMulticurveCreate,\n  SupportedChainId,\n  V4PoolKey,\n} from '../types';\n\nexport interface ParseAirlockCreateReceiptParams {\n  receipt: TransactionReceipt;\n  expectedAirlock: Address;\n}\n\nexport interface AirlockCreateResult {\n  airlock: Address;\n  tokenAddress: Address;\n  numeraire: Address;\n  initializer: Address;\n  poolOrHookAddress: Address;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport type AirlockCreateReceiptErrorCode =\n  | 'RECEIPT_FAILED'\n  | 'WRONG_TRANSACTION_TARGET'\n  | 'WRONG_TRANSACTION_SENDER'\n  | 'MISSING_CREATE_EVENT'\n  | 'MULTIPLE_CREATE_EVENTS'\n  | 'TOKEN_MISMATCH'\n  | 'NUMERAIRE_MISMATCH'\n  | 'INITIALIZER_MISMATCH'\n  | 'POOL_OR_HOOK_MISMATCH'\n  | 'TRANSACTION_HASH_MISMATCH'\n  | 'TRANSACTION_INPUT_MISMATCH'\n  | 'TRANSACTION_VALUE_MISMATCH'\n  | 'MISSING_BUNDLED_EVENT'\n  | 'MULTIPLE_BUNDLED_EVENTS'\n  | 'BUNDLED_RECIPIENT_MISMATCH'\n  | 'BUNDLED_INPUT_MISMATCH'\n  | 'BUNDLED_POOL_KEY_MISMATCH'\n  | 'MISSING_VESTING_EVENT'\n  | 'MULTIPLE_VESTING_EVENTS'\n  | 'UNEXPECTED_VESTING_EVENT'\n  | 'VESTING_MISMATCH';\n\nexport class AirlockCreateReceiptError extends Error {\n  readonly code: AirlockCreateReceiptErrorCode;\n  readonly expected?: string | number;\n  readonly actual?: string | number | null;\n\n  constructor(\n    code: AirlockCreateReceiptErrorCode,\n    options: {\n      expected?: string | number;\n      actual?: string | number | null;\n    } = {},\n  ) {\n    super(`Airlock Create receipt verification failed: ${code}`);\n    this.name = 'AirlockCreateReceiptError';\n    this.code = code;\n    this.expected = options.expected;\n    this.actual = options.actual;\n  }\n}\n\ntype DecodedAirlockCreate = {\n  airlock: Address;\n  tokenAddress: Address;\n  numeraire: Address;\n  initializer: Address;\n  poolOrHookAddress: Address;\n  logIndex: number;\n};\n\nfunction addressesEqual(left: Address | null, right: Address): boolean {\n  return left?.toLowerCase() === right.toLowerCase();\n}\n\nfunction decodeAirlockCreateLogs(\n  receipt: TransactionReceipt,\n  expectedAirlock: Address,\n): DecodedAirlockCreate[] {\n  const matches: DecodedAirlockCreate[] = [];\n\n  for (const log of receipt.logs) {\n    if (!addressesEqual(log.address, expectedAirlock)) continue;\n\n    try {\n      const decoded = decodeEventLog({\n        abi: airlockAbi,\n        data: log.data,\n        topics: log.topics,\n        eventName: 'Create',\n      });\n      const args = decoded.args as {\n        asset: Address;\n        numeraire: Address;\n        initializer: Address;\n        poolOrHook: Address;\n      };\n      matches.push({\n        airlock: log.address,\n        tokenAddress: args.asset,\n        numeraire: args.numeraire,\n        initializer: args.initializer,\n        poolOrHookAddress: args.poolOrHook,\n        logIndex: log.logIndex,\n      });\n    } catch {\n      // Logs emitted by the expected contract but belonging to other events are\n      // intentionally ignored.\n    }\n  }\n\n  return matches;\n}\n\nexport function parseAirlockCreateReceipt({\n  receipt,\n  expectedAirlock,\n}: ParseAirlockCreateReceiptParams): AirlockCreateResult | null {\n  const matches = decodeAirlockCreateLogs(receipt, expectedAirlock);\n  if (matches.length === 0) return null;\n  if (matches.length > 1) {\n    throw new AirlockCreateReceiptError('MULTIPLE_CREATE_EVENTS', {\n      expected: 1,\n      actual: matches.length,\n    });\n  }\n\n  return {\n    ...matches[0],\n    transactionHash: receipt.transactionHash,\n    blockNumber: receipt.blockNumber,\n  };\n}\n\nexport interface PreparedMulticurveIdentity<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  chainId: C;\n  tokenAddress: Address;\n  poolOrHookAddress: Address;\n  governanceAddress: Address;\n  timelockAddress: Address;\n  migrationPoolAddress?: Address;\n  poolKey: V4PoolKey;\n  poolId: Hash;\n  tokenIsCurrency0: boolean;\n}\n\nexport interface VerifiedMulticurveDevBuy {\n  amountOut: bigint;\n}\n\nexport interface VerifiedMulticurveCreate<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  receiptIdentity: AirlockCreateResult;\n  preparedIdentity: PreparedMulticurveIdentity<C>;\n  devBuy?: VerifiedMulticurveDevBuy;\n}\n\nexport type PreparedCreateTransactionClient = {\n  getTransaction(parameters: { hash: Hash }): Promise<{\n    hash: Hash;\n    from: Address;\n    to: Address | null;\n    input: Hex;\n    value: bigint;\n  }>;\n};\n\nfunction assertAddressMatch(\n  code: AirlockCreateReceiptErrorCode,\n  expected: Address,\n  actual: Address | null,\n): void {\n  if (!addressesEqual(actual, expected)) {\n    throw new AirlockCreateReceiptError(code, { expected, actual });\n  }\n}\n\nfunction normalizePoolKey(value: unknown): V4PoolKey {\n  if (Array.isArray(value)) {\n    return {\n      currency0: value[0] as Address,\n      currency1: value[1] as Address,\n      fee: Number(value[2]),\n      tickSpacing: Number(value[3]),\n      hooks: value[4] as Address,\n    };\n  }\n  const poolKey = value as Record<string, unknown>;\n  return {\n    currency0: poolKey.currency0 as Address,\n    currency1: poolKey.currency1 as Address,\n    fee: Number(poolKey.fee),\n    tickSpacing: Number(poolKey.tickSpacing),\n    hooks: poolKey.hooks as Address,\n  };\n}\n\nfunction poolId(poolKey: V4PoolKey): Hash {\n  return keccak256(\n    encodeAbiParameters(\n      [\n        {\n          type: 'tuple',\n          components: [\n            { name: 'currency0', type: 'address' },\n            { name: 'currency1', type: 'address' },\n            { name: 'fee', type: 'uint24' },\n            { name: 'tickSpacing', type: 'int24' },\n            { name: 'hooks', type: 'address' },\n          ],\n        },\n      ],\n      [poolKey],\n    ),\n  );\n}\n\n/**\n * Verifies only facts available in a mined receipt: success, sender, target,\n * one matching Airlock Create event, and its emitted deployment identity.\n *\n * This synchronous check does not retrieve or verify the transaction input or\n * value. Prepared-only predictions remain separate from receipt-derived facts.\n */\nexport function verifyPreparedCreateReceipt<C extends SupportedChainId>({\n  prepared,\n  receipt,\n}: {\n  prepared: PreparedMulticurveCreate<C>;\n  receipt: TransactionReceipt;\n}): VerifiedMulticurveCreate<C> {\n  if (receipt.status !== 'success') {\n    throw new AirlockCreateReceiptError('RECEIPT_FAILED', {\n      expected: 'success',\n      actual: receipt.status,\n    });\n  }\n  assertAddressMatch(\n    'WRONG_TRANSACTION_TARGET',\n    prepared.transaction.to,\n    receipt.to,\n  );\n  assertAddressMatch(\n    'WRONG_TRANSACTION_SENDER',\n    prepared.account,\n    receipt.from,\n  );\n\n  const receiptIdentity = parseAirlockCreateReceipt({\n    receipt,\n    expectedAirlock: prepared.airlock,\n  });\n  if (!receiptIdentity) {\n    throw new AirlockCreateReceiptError('MISSING_CREATE_EVENT', {\n      expected: prepared.airlock,\n      actual: null,\n    });\n  }\n\n  assertAddressMatch(\n    'TOKEN_MISMATCH',\n    prepared.prediction.tokenAddress,\n    receiptIdentity.tokenAddress,\n  );\n  assertAddressMatch(\n    'NUMERAIRE_MISMATCH',\n    prepared.createParams.numeraire,\n    receiptIdentity.numeraire,\n  );\n  assertAddressMatch(\n    'INITIALIZER_MISMATCH',\n    prepared.createParams.poolInitializer,\n    receiptIdentity.initializer,\n  );\n  assertAddressMatch(\n    'POOL_OR_HOOK_MISMATCH',\n    prepared.prediction.poolOrHookAddress,\n    receiptIdentity.poolOrHookAddress,\n  );\n\n  let verifiedDevBuy: VerifiedMulticurveDevBuy | undefined;\n  if (prepared.devBuy) {\n    const bundledEvents: Array<{\n      recipient: Address;\n      amountIn: bigint;\n      amountOut: bigint;\n      poolKey: V4PoolKey;\n    }> = [];\n    const vestingEvents: Array<{\n      asset: Address;\n      recipient: Address;\n      permissionlessClaim: boolean;\n      totalAmount: bigint;\n      cliffDuration: bigint;\n      vestingDuration: bigint;\n    }> = [];\n    for (const log of receipt.logs) {\n      if (!addressesEqual(log.address, prepared.devBuy.bundler)) continue;\n      try {\n        const decoded = decodeEventLog({\n          abi: bundlerAbi,\n          data: log.data,\n          topics: log.topics,\n        });\n        if (decoded.eventName === 'Bundled') {\n          const args = decoded.args as {\n            recipient: Address;\n            amountIn: bigint;\n            amountOut: bigint;\n            poolKey: unknown;\n          };\n          bundledEvents.push({\n            recipient: args.recipient,\n            amountIn: args.amountIn,\n            amountOut: args.amountOut,\n            poolKey: normalizePoolKey(args.poolKey),\n          });\n        } else if (decoded.eventName === 'VestingCreated') {\n          const args = decoded.args as {\n            asset: Address;\n            recipient: Address;\n            permissionlessClaim: boolean;\n            totalAmount: bigint;\n            cliffDuration: bigint;\n            vestingDuration: bigint;\n          };\n          vestingEvents.push(args);\n        }\n      } catch {\n        // Ignore non-Bundler events emitted by the same contract.\n      }\n    }\n\n    if (bundledEvents.length === 0) {\n      throw new AirlockCreateReceiptError('MISSING_BUNDLED_EVENT');\n    }\n    if (bundledEvents.length > 1) {\n      throw new AirlockCreateReceiptError('MULTIPLE_BUNDLED_EVENTS', {\n        expected: 1,\n        actual: bundledEvents.length,\n      });\n    }\n    const bundled = bundledEvents[0];\n    if (!addressesEqual(bundled.recipient, prepared.devBuy.recipient)) {\n      throw new AirlockCreateReceiptError('BUNDLED_RECIPIENT_MISMATCH', {\n        expected: prepared.devBuy.recipient,\n        actual: bundled.recipient,\n      });\n    }\n    if (bundled.amountIn !== prepared.devBuy.exactAmountIn) {\n      throw new AirlockCreateReceiptError('BUNDLED_INPUT_MISMATCH', {\n        expected: prepared.devBuy.exactAmountIn.toString(),\n        actual: bundled.amountIn.toString(),\n      });\n    }\n    const bundledPoolId = poolId(bundled.poolKey);\n    if (\n      bundledPoolId.toLowerCase() !== prepared.prediction.poolId.toLowerCase()\n    ) {\n      throw new AirlockCreateReceiptError('BUNDLED_POOL_KEY_MISMATCH', {\n        expected: prepared.prediction.poolId,\n        actual: bundledPoolId,\n      });\n    }\n\n    if (prepared.devBuy.vesting.vestingDuration === 0n) {\n      if (vestingEvents.length !== 0) {\n        throw new AirlockCreateReceiptError('UNEXPECTED_VESTING_EVENT', {\n          expected: 0,\n          actual: vestingEvents.length,\n        });\n      }\n    } else {\n      if (vestingEvents.length === 0) {\n        throw new AirlockCreateReceiptError('MISSING_VESTING_EVENT');\n      }\n      if (vestingEvents.length > 1) {\n        throw new AirlockCreateReceiptError('MULTIPLE_VESTING_EVENTS', {\n          expected: 1,\n          actual: vestingEvents.length,\n        });\n      }\n      const vesting = vestingEvents[0];\n      if (\n        !addressesEqual(vesting.asset, prepared.prediction.tokenAddress) ||\n        !addressesEqual(vesting.recipient, prepared.devBuy.recipient) ||\n        vesting.totalAmount !== bundled.amountOut ||\n        vesting.permissionlessClaim !==\n          prepared.devBuy.vesting.permissionlessClaim ||\n        vesting.cliffDuration !== prepared.devBuy.vesting.cliffDuration ||\n        vesting.vestingDuration !== prepared.devBuy.vesting.vestingDuration\n      ) {\n        throw new AirlockCreateReceiptError('VESTING_MISMATCH');\n      }\n    }\n    verifiedDevBuy = { amountOut: bundled.amountOut };\n  }\n\n  return {\n    receiptIdentity,\n    preparedIdentity: {\n      chainId: prepared.chainId,\n      tokenAddress: prepared.prediction.tokenAddress,\n      poolOrHookAddress: prepared.prediction.poolOrHookAddress,\n      governanceAddress: prepared.prediction.governanceAddress,\n      timelockAddress: prepared.prediction.timelockAddress,\n      migrationPoolAddress: prepared.prediction.migrationPoolAddress,\n      poolKey: prepared.prediction.poolKey,\n      poolId: prepared.prediction.poolId,\n      tokenIsCurrency0: prepared.prediction.tokenIsCurrency0,\n    },\n    devBuy: verifiedDevBuy,\n  };\n}\n\n/**\n * Performs the receipt checks in {@link verifyPreparedCreateReceipt}, then\n * retrieves the mined transaction. Its hash must match the receipt, while its\n * sender, target, input, and value must match the prepared unsigned transaction.\n *\n * This stronger check requires one additional RPC request. It proves that the\n * prepared protocol call was mined, but does not turn simulation-only\n * predictions into receipt-derived facts.\n */\nexport async function verifyPreparedCreateExecution<\n  C extends SupportedChainId,\n>({\n  prepared,\n  receipt,\n  publicClient,\n}: {\n  prepared: PreparedMulticurveCreate<C>;\n  receipt: TransactionReceipt;\n  publicClient: PreparedCreateTransactionClient;\n}): Promise<VerifiedMulticurveCreate<C>> {\n  const verified = verifyPreparedCreateReceipt({ prepared, receipt });\n  const transaction = await publicClient.getTransaction({\n    hash: receipt.transactionHash,\n  });\n\n  if (\n    transaction.hash.toLowerCase() !== receipt.transactionHash.toLowerCase()\n  ) {\n    throw new AirlockCreateReceiptError('TRANSACTION_HASH_MISMATCH', {\n      expected: receipt.transactionHash,\n      actual: transaction.hash,\n    });\n  }\n  assertAddressMatch(\n    'WRONG_TRANSACTION_TARGET',\n    prepared.transaction.to,\n    transaction.to,\n  );\n  assertAddressMatch(\n    'WRONG_TRANSACTION_SENDER',\n    prepared.account,\n    transaction.from,\n  );\n  if (\n    transaction.input.toLowerCase() !== prepared.transaction.data.toLowerCase()\n  ) {\n    throw new AirlockCreateReceiptError('TRANSACTION_INPUT_MISMATCH', {\n      expected: keccak256(prepared.transaction.data),\n      actual: keccak256(transaction.input),\n    });\n  }\n  if (transaction.value !== prepared.transaction.value) {\n    throw new AirlockCreateReceiptError('TRANSACTION_VALUE_MISMATCH', {\n      expected: prepared.transaction.value.toString(),\n      actual: transaction.value.toString(),\n    });\n  }\n\n  return verified;\n}\n","/**\n * Market cap conversion utilities for token launches\n *\n * These utilities convert between market cap (USD) and Uniswap ticks\n * following the mathematical relationship:\n *\n *   Market Cap (USD) → Token Price (USD) → Ratio (numeraire/token) → Tick\n *\n * Based on reference implementation: plan/priceMultiCurve.py\n */\n\nimport type { Address } from 'viem';\nimport type {\n  MarketCapRange,\n  MarketCapValidationResult,\n  StaticAuctionTickParams,\n  DynamicAuctionTickParams,\n  MulticurveTickRangeParams,\n  MulticurveTickParams,\n  TickToMarketCapParams,\n} from '../types';\nimport { MIN_TICK, MAX_TICK } from './tickMath';\nimport { isToken0Expected } from './isToken0Expected';\n\n// Re-export types from types.ts for convenience\nexport type {\n  MarketCapRange,\n  MarketCapValidationResult,\n  StaticAuctionTickParams,\n  DynamicAuctionTickParams,\n  MulticurveTickRangeParams,\n  MulticurveTickParams,\n  TickToMarketCapParams,\n} from '../types';\n\nexport function getMaxTickRounded(tickSpacing: number): number {\n  return Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n}\n\n/**\n * Convert market cap to token price\n *\n * @param marketCapUSD - Market capitalization in USD\n * @param tokenSupply - Total token supply (as bigint with decimals, e.g., parseEther('1000000000'))\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Price of one token in USD\n *\n * @example\n * ```ts\n * // $1M market cap with 1B tokens (18 decimals)\n * const price = marketCapToTokenPrice(1_000_000, parseEther('1000000000'))\n * // Returns: 0.001 (each token is worth $0.001)\n * ```\n */\nexport function marketCapToTokenPrice(\n  marketCapUSD: number,\n  tokenSupply: bigint,\n  tokenDecimals: number = 18,\n): number {\n  if (marketCapUSD <= 0) {\n    throw new Error('Market cap must be positive');\n  }\n  if (tokenSupply <= 0n) {\n    throw new Error('Token supply must be positive');\n  }\n\n  // Convert supply from bigint with decimals to human-readable number\n  const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;\n  return marketCapUSD / supplyNum;\n}\n\n/**\n * Convert token price to price ratio (numeraire per token)\n *\n * @param tokenPriceUSD - Price of one token in USD\n * @param numerairePriceUSD - Price of numeraire (e.g., ETH) in USD\n * @param tokenDecimals - Token decimals (default: 18)\n * @param numeraireDecimals - Numeraire decimals (default: 18)\n * @returns Price ratio adjusted for decimals\n *\n * @example\n * ```ts\n * // Token at $0.001, ETH at $3000, both 18 decimals\n * const ratio = tokenPriceToRatio(0.001, 3000, 18, 18)\n * // Returns: 3,000,000 (3M ETH wei per token wei at this ratio)\n * ```\n */\nexport function tokenPriceToRatio(\n  tokenPriceUSD: number,\n  numerairePriceUSD: number,\n  tokenDecimals: number = 18,\n  numeraireDecimals: number = 18,\n): number {\n  if (tokenPriceUSD <= 0) {\n    throw new Error('Token price must be positive');\n  }\n  if (numerairePriceUSD <= 0) {\n    throw new Error('Numeraire price must be positive');\n  }\n\n  // How much numeraire per token (in USD terms first)\n  // numerairePriceUSD / tokenPriceUSD = numeraire units per token\n  const ratio = numerairePriceUSD / tokenPriceUSD;\n\n  // Adjust for decimal differences\n  // Formula: (numeraire / tokenPrice) * (10 ** (assetDecimals - numeraireDecimals))\n  const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);\n\n  return ratio * decimalAdjustment;\n}\n\n/**\n * Convert ratio to tick using Uniswap's formula: tick = log(ratio) / log(1.0001)\n *\n * @param ratio - Price ratio (must be positive)\n * @returns Raw tick value (before spacing adjustment)\n *\n * @example\n * ```ts\n * ratioToTick(1)       // Returns: 0\n * ratioToTick(1.0001)  // Returns: ~1\n * ratioToTick(Math.pow(1.0001, 1000)) // Returns: ~1000\n * ```\n */\nexport function ratioToTick(ratio: number): number {\n  if (ratio <= 0) {\n    throw new Error('Ratio must be positive');\n  }\n\n  // Uniswap tick formula: tick = log(price) / log(1.0001)\n  return Math.log(ratio) / Math.log(1.0001);\n}\n\n/**\n * Determine if the new token will be token1 in the Uniswap pair\n *\n * Uniswap orders tokens by address (token0 < token1 in hex comparison).\n * This affects how ticks are interpreted for price calculations.\n *\n * @param tokenAddress - Address of the new token\n * @param numeraireAddress - Address of the numeraire (e.g., WETH)\n * @returns true if token will be token1, false if token0\n *\n * @example\n * ```ts\n * isToken1('0xB000...', '0xA000...') // true (B > A)\n * isToken1('0xA000...', '0xB000...') // false (A < B)\n * ```\n */\nexport function isToken1(\n  tokenAddress: string,\n  numeraireAddress: string,\n): boolean {\n  return tokenAddress.toLowerCase() > numeraireAddress.toLowerCase();\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// CORE TICK COMPUTATION (Internal)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Core tick computation - NO sign manipulation.\n * Returns the raw mathematical tick for a given market cap.\n *\n * @internal Not exported - use auction-specific functions instead.\n */\nfunction _computeRawTick(\n  marketCapUSD: number,\n  tokenSupply: bigint,\n  numerairePriceUSD: number,\n  tokenDecimals: number,\n  numeraireDecimals: number,\n  tickSpacing: number,\n): number {\n  if (marketCapUSD <= 0) {\n    throw new Error('Market cap must be positive');\n  }\n\n  // Step 1: Market cap → token price\n  const tokenPrice = marketCapToTokenPrice(\n    marketCapUSD,\n    tokenSupply,\n    tokenDecimals,\n  );\n\n  // Step 2: Token price → ratio\n  const ratio = tokenPriceToRatio(\n    tokenPrice,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n  );\n\n  // Step 3: Ratio → raw tick\n  const rawTick = ratioToTick(ratio);\n\n  // Step 4: Align to tick spacing (floor division)\n  const alignedTick = Math.floor(rawTick / tickSpacing) * tickSpacing;\n\n  // Step 5: Bounds check\n  if (alignedTick < MIN_TICK || alignedTick > MAX_TICK) {\n    throw new Error(\n      `Calculated tick ${alignedTick} is out of bounds [${MIN_TICK}, ${MAX_TICK}]. ` +\n        `Market cap ${marketCapUSD.toLocaleString()} may be too extreme for the given parameters.`,\n    );\n  }\n\n  return alignedTick;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// AUCTION-SPECIFIC TICK FUNCTIONS\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Convert market cap range to ticks for V3 Static Auctions.\n *\n * V3 Static auctions ALWAYS use positive ticks with startTick < endTick.\n * This is because CREATE2 mining ensures token address > numeraire (token1).\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { startTick, endTick } - positive ticks, startTick < endTick\n *\n * @example\n * ```ts\n * const { startTick, endTick } = marketCapToTicksForStaticAuction({\n *   marketCapRange: { start: 100_000, end: 10_000_000 },\n *   tokenSupply: parseEther('1000000000'),\n *   numerairePriceUSD: 3000,\n *   tickSpacing: 60,\n * })\n * // Returns: { startTick: 120000, endTick: 170000 } (both positive)\n * ```\n */\nexport function marketCapToTicksForStaticAuction(\n  params: StaticAuctionTickParams,\n): { startTick: number; endTick: number } {\n  const {\n    marketCapRange,\n    tokenSupply,\n    numerairePriceUSD,\n    tickSpacing,\n    tokenDecimals = 18,\n    numeraireDecimals = 18,\n  } = params;\n\n  if (marketCapRange.start <= 0) {\n    throw new Error('Start market cap must be positive');\n  }\n  if (marketCapRange.end <= 0) {\n    throw new Error('End market cap must be positive');\n  }\n  if (marketCapRange.start >= marketCapRange.end) {\n    throw new Error('Start market cap must be less than end market cap');\n  }\n\n  // Compute raw ticks\n  const tickAtStart = _computeRawTick(\n    marketCapRange.start,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n    tickSpacing,\n  );\n  const tickAtEnd = _computeRawTick(\n    marketCapRange.end,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n    tickSpacing,\n  );\n\n  // V3 Static: Always positive ticks, startTick < endTick\n  // Take absolute value and ensure proper ordering\n  const startTick = Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n  const endTick = Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n  if (startTick === endTick) {\n    throw new Error(\n      `Market cap range ${marketCapRange.start.toLocaleString()} - ${marketCapRange.end.toLocaleString()} ` +\n        `resulted in same tick (${startTick}). Try a wider range or smaller tick spacing.`,\n    );\n  }\n\n  return { startTick, endTick };\n}\n\n/**\n * Convert market cap range to ticks for V4 Dynamic Auctions (Doppler).\n *\n * Dynamic auctions compute tick sign based on expected token ordering:\n * - Token1 (ETH numeraire): positive ticks, startTick < endTick\n * - Token0 (stablecoin numeraire): negative ticks, startTick > endTick\n *\n * Unlike Multicurve, Doppler contract does NOT auto-flip ticks.\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { startTick, endTick } with correct sign and ordering for Doppler contract\n *\n * @example\n * ```ts\n * // ETH numeraire (token1) - positive ticks\n * const eth = marketCapToTicksForDynamicAuction({\n *   marketCapRange: { start: 50_000, end: 500_000 },\n *   tokenSupply: parseEther('1000000000'),\n *   numerairePriceUSD: 3000,\n *   numeraire: WETH_ADDRESS,\n *   tickSpacing: 30,\n * })\n * // Returns: { startTick: 120000, endTick: 170000 } (positive, ascending)\n *\n * // USDC numeraire (token0) - negative ticks\n * const usdc = marketCapToTicksForDynamicAuction({\n *   marketCapRange: { start: 50_000, end: 500_000 },\n *   tokenSupply: parseEther('1000000000'),\n *   numerairePriceUSD: 1,\n *   numeraire: USDC_ADDRESS,\n *   tickSpacing: 30,\n *   tokenDecimals: 18,\n *   numeraireDecimals: 6,\n * })\n * // Returns: { startTick: -120000, endTick: -170000 } (negative, descending)\n * ```\n */\nexport function marketCapToTicksForDynamicAuction(\n  params: DynamicAuctionTickParams,\n): { startTick: number; endTick: number } {\n  const {\n    marketCapRange,\n    tokenSupply,\n    numerairePriceUSD,\n    numeraire,\n    tickSpacing,\n    tokenDecimals = 18,\n    numeraireDecimals = 18,\n  } = params;\n\n  if (marketCapRange.start <= 0 || marketCapRange.end <= 0) {\n    throw new Error('Market cap values must be positive');\n  }\n  if (marketCapRange.start >= marketCapRange.end) {\n    throw new Error('Start market cap must be less than end market cap');\n  }\n\n  // Compute raw ticks\n  const tickAtStart = _computeRawTick(\n    marketCapRange.start,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n    tickSpacing,\n  );\n  const tickAtEnd = _computeRawTick(\n    marketCapRange.end,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n    tickSpacing,\n  );\n\n  // Determine token ordering from numeraire address\n  const tokenIsToken0 = isToken0Expected(numeraire);\n\n  if (tokenIsToken0) {\n    // Token0 (stablecoin numeraire): negative ticks, startTick > endTick\n    const startTick = -Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n    const endTick = -Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n    if (startTick === endTick) {\n      throw new Error(\n        `Market cap range resulted in same tick (${startTick}). Try a wider range.`,\n      );\n    }\n\n    return { startTick, endTick }; // e.g., { -120000, -170000 }\n  } else {\n    // Token1 (ETH numeraire): positive ticks, startTick < endTick\n    const startTick = Math.min(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n    const endTick = Math.max(Math.abs(tickAtStart), Math.abs(tickAtEnd));\n\n    if (startTick === endTick) {\n      throw new Error(\n        `Market cap range resulted in same tick (${startTick}). Try a wider range.`,\n      );\n    }\n\n    return { startTick, endTick }; // e.g., { 120000, 170000 }\n  }\n}\n\n/**\n * Convert market cap range to ticks for V4 Multicurve pools.\n *\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n * The contract's adjustCurves() handles token ordering internally.\n *\n * @param params - Configuration object with market cap range and token parameters\n * @returns { tickLower, tickUpper } - tick range where tickLower < tickUpper\n *\n * @example\n * ```ts\n * const { tickLower, tickUpper } = marketCapToTicksForMulticurve({\n *   marketCapLower: 500_000,\n *   marketCapUpper: 5_000_000,\n *   tokenSupply: parseEther('1000000000'),\n *   numerairePriceUSD: 3000,\n *   tickSpacing: 60,\n * })\n * ```\n */\nexport function marketCapToTicksForMulticurve(\n  params: MulticurveTickRangeParams,\n): { tickLower: number; tickUpper: number } {\n  const {\n    marketCapLower,\n    marketCapUpper,\n    tokenSupply,\n    numerairePriceUSD,\n    tickSpacing,\n    tokenDecimals = 18,\n    numeraireDecimals = 18,\n  } = params;\n\n  if (marketCapLower <= 0) {\n    throw new Error('Lower market cap must be positive');\n  }\n  if (marketCapUpper !== 'max' && marketCapUpper <= 0) {\n    throw new Error('Upper market cap must be positive');\n  }\n  if (marketCapUpper !== 'max' && marketCapLower >= marketCapUpper) {\n    throw new Error('Lower market cap must be less than upper market cap');\n  }\n\n  // Compute raw ticks\n  const tickAtLower = -_computeRawTick(\n    marketCapLower,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n    tickSpacing,\n  );\n  const tickAtUpper =\n    marketCapUpper === 'max'\n      ? getMaxTickRounded(tickSpacing)\n      : -_computeRawTick(\n          marketCapUpper,\n          tokenSupply,\n          numerairePriceUSD,\n          tokenDecimals,\n          numeraireDecimals,\n          tickSpacing,\n        );\n\n  // Use natural tick ordering (lower market cap = lower tick value)\n  const tickLower = Math.min(tickAtLower, tickAtUpper);\n  const tickUpper = Math.max(tickAtLower, tickAtUpper);\n\n  if (tickLower === tickUpper) {\n    const upperLabel =\n      marketCapUpper === 'max' ? 'max' : `$${marketCapUpper.toLocaleString()}`;\n    throw new Error(\n      `Market cap range $${marketCapLower.toLocaleString()} - ${upperLabel} ` +\n        `resulted in same tick (${tickLower}). Try a wider range or smaller tick spacing.`,\n    );\n  }\n\n  return { tickLower, tickUpper };\n}\n\n/**\n * Convert a single market cap to a tick for Multicurve use cases.\n *\n * Used for farTick and pegTick calculations.\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n *\n * @param params - Configuration object with market cap and token parameters\n * @returns Tick value (sign depends on price ratio)\n *\n * @example\n * ```ts\n * const farTick = marketCapToTickForMulticurve({\n *   marketCapUSD: 50_000_000,\n *   tokenSupply: supply,\n *   numerairePriceUSD: 3000,\n *   tickSpacing: 60,\n * })\n * ```\n */\nexport function marketCapToTickForMulticurve(\n  params: MulticurveTickParams,\n): number {\n  const {\n    marketCapUSD,\n    tokenSupply,\n    numerairePriceUSD,\n    tickSpacing,\n    tokenDecimals = 18,\n    numeraireDecimals = 18,\n  } = params;\n\n  // Multicurve uses a canonical tick space where the contract's adjustCurves()\n  // resolves token ordering. This must match marketCapToTicksForMulticurve().\n  const rawTick = -_computeRawTick(\n    marketCapUSD,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals,\n    numeraireDecimals,\n    tickSpacing,\n  );\n\n  // Normalize -0 to 0\n  return rawTick === 0 ? 0 : rawTick;\n}\n\n/**\n * Apply curvature offsets to a peg tick for Multicurve positions.\n *\n * Tick sign depends on the underlying price ratio - can be positive or negative.\n * The contract's adjustCurves() handles token ordering internally.\n *\n * @example\n * ```ts\n * // Peg at 200000, curve extends 10000 ticks toward higher market cap\n * applyTickOffsets(200000, 0, 10000, WETH)\n * // Returns: { tickLower: 200000, tickUpper: 210000 }\n * ```\n */\nexport function applyTickOffsets(\n  pegTick: number,\n  offsetLower: number,\n  offsetUpper: number,\n  numeraire: Address,\n): { tickLower: number; tickUpper: number } {\n  void numeraire; // Kept for API compatibility\n  return {\n    tickLower: pegTick + offsetLower,\n    tickUpper: pegTick + offsetUpper,\n  };\n}\n\n/**\n * Validate market cap parameters and return warnings for unusual values\n *\n * This doesn't prevent execution but helps catch potential mistakes:\n * - Very small market caps (< $1,000)\n * - Very large market caps (> $1 trillion)\n * - Extreme token prices (< $0.000001 or > $1M)\n *\n * @param marketCap - Market cap value to validate\n * @param tokenSupply - Token supply (with decimals)\n * @param tokenDecimals - Token decimals (default: 18)\n * @returns Validation result with warnings array\n *\n * @example\n * ```ts\n * const result = validateMarketCapParameters(500, parseEther('1000000'))\n * if (result.warnings.length > 0) {\n *   console.warn('Warnings:', result.warnings)\n * }\n * ```\n */\nexport function validateMarketCapParameters(\n  marketCap: number,\n  tokenSupply: bigint,\n  tokenDecimals: number = 18,\n): MarketCapValidationResult {\n  const warnings: string[] = [];\n\n  // Check for unreasonably small market caps\n  if (marketCap < 1000) {\n    warnings.push(\n      `Market cap $${marketCap.toLocaleString()} is very small. Consider if this is intentional.`,\n    );\n  }\n\n  // Check for unreasonably large market caps\n  if (marketCap > 1_000_000_000_000) {\n    warnings.push(\n      `Market cap $${marketCap.toLocaleString()} is very large (> $1T). Verify this is correct.`,\n    );\n  }\n\n  // Calculate implied token price\n  const tokenPrice = marketCapToTokenPrice(\n    marketCap,\n    tokenSupply,\n    tokenDecimals,\n  );\n\n  // Check for extremely small token prices\n  if (tokenPrice < 0.000001) {\n    warnings.push(\n      `Implied token price $${tokenPrice.toExponential(2)} is very small. ` +\n        `This may cause precision issues.`,\n    );\n  }\n\n  // Check for extremely large token prices\n  if (tokenPrice > 1_000_000) {\n    warnings.push(\n      `Implied token price $${tokenPrice.toLocaleString()} is very large. ` +\n        `Verify your token supply and market cap values.`,\n    );\n  }\n\n  return {\n    valid: warnings.length === 0,\n    warnings,\n  };\n}\n\n/**\n * Calculate market cap from a tick (reverse conversion)\n *\n * Useful for displaying what market cap a given tick represents.\n * Works with ticks from any auction type (Static, Dynamic, Multicurve).\n *\n * @param params - Configuration object with tick and token parameters\n * @returns Market cap in USD\n *\n * @example\n * ```ts\n * // Works with negative ticks (Multicurve)\n * tickToMarketCap({\n *   tick: -156000,\n *   tokenSupply: supply,\n *   numerairePriceUSD: 3000,\n * })\n *\n * // Works with positive ticks (Static/Dynamic)\n * tickToMarketCap({\n *   tick: 156000,\n *   tokenSupply: supply,\n *   numerairePriceUSD: 3000,\n * })\n * ```\n */\nexport function tickToMarketCap(params: TickToMarketCapParams): number {\n  const {\n    tick,\n    tokenSupply,\n    numerairePriceUSD,\n    tokenDecimals = 18,\n    numeraireDecimals = 18,\n  } = params;\n\n  // Use absolute value since tick sign varies by auction type\n  // but the underlying ratio is always positive\n  const adjustedTick = Math.abs(tick);\n\n  // Tick → ratio (reverse of ratioToTick)\n  const ratio = Math.pow(1.0001, adjustedTick);\n\n  // Ratio → token price (reverse of tokenPriceToRatio)\n  // ratio = (numerairePriceUSD / tokenPriceUSD) * 10^(tokenDecimals - numeraireDecimals)\n  // tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment)\n  const decimalAdjustment = 10 ** (tokenDecimals - numeraireDecimals);\n  const tokenPriceUSD = numerairePriceUSD / (ratio / decimalAdjustment);\n\n  // Token price → market cap (reverse of marketCapToTokenPrice)\n  const supplyNum = Number(tokenSupply) / 10 ** tokenDecimals;\n  return tokenPriceUSD * supplyNum;\n}\n","import type { Address } from 'viem';\nimport {\n  DEFAULT_MULTICURVE_LOWER_TICKS,\n  DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES,\n  DEFAULT_MULTICURVE_NUM_POSITIONS,\n  DEFAULT_MULTICURVE_UPPER_TICKS,\n  FEE_TIERS,\n  MAX_UINT64,\n  MAX_UINT128,\n  MIN_BUNDLER_VESTING_DURATION,\n  TICK_SPACINGS,\n  WAD,\n  ZERO_ADDRESS,\n} from '../constants';\nimport { MAX_TICK, MIN_TICK } from '../utils';\nimport type {\n  Doppler404TokenConfig,\n  PriceRange,\n  TickRange,\n  MulticurveMarketCapPreset,\n  GovernanceOption,\n  MigrationConfig,\n  StandardTokenConfig,\n  TokenConfig,\n  MulticurveDevBuyConfig,\n} from '../types';\nimport type { SupportedChainId } from '../addresses';\n\n/** Optional Bundler custody schedule for a builder-configured dev buy. */\nexport type BuilderDevBuyVestingInput = {\n  permissionlessClaim?: boolean;\n  vestingDuration: bigint;\n  cliffDuration?: bigint;\n};\n\n/** Builder input for an exact-input multicurve dev buy. */\nexport type BuilderDevBuyInput = {\n  exactAmountIn: bigint;\n  recipient: Address;\n  vesting?: BuilderDevBuyVestingInput;\n};\n\nexport type BuilderVestingScheduleInput = {\n  duration?: bigint;\n  cliffDuration?: number;\n};\n\nexport type BuilderVestingAllocationInput = {\n  recipient: Address;\n  amount: bigint;\n  schedule: BuilderVestingScheduleInput;\n};\n\nexport type BuilderVestingInput =\n  | {\n      duration?: bigint;\n      cliffDuration?: number;\n      recipients?: Address[];\n      amounts?: bigint[];\n      allocations?: never;\n    }\n  | {\n      duration?: never;\n      cliffDuration?: never;\n      recipients?: never;\n      amounts?: never;\n      allocations: BuilderVestingAllocationInput[];\n    };\n\nexport function normalizeBuilderDevBuy(\n  params: BuilderDevBuyInput,\n): MulticurveDevBuyConfig {\n  if (params.exactAmountIn <= 0n || params.exactAmountIn > MAX_UINT128) {\n    throw new Error('Dev buy exactAmountIn must be in the uint128 range');\n  }\n  if (params.recipient.toLowerCase() === ZERO_ADDRESS) {\n    throw new Error('Dev buy recipient must not be the zero address');\n  }\n\n  const vestingDuration = params.vesting?.vestingDuration ?? 0n;\n  const cliffDuration = params.vesting?.cliffDuration ?? 0n;\n  if (vestingDuration < 0n || vestingDuration > MAX_UINT64) {\n    throw new Error('Dev buy vestingDuration must be in the uint64 range');\n  }\n  if (cliffDuration < 0n || cliffDuration > MAX_UINT64) {\n    throw new Error('Dev buy cliffDuration must be in the uint64 range');\n  }\n  if (params.vesting && vestingDuration === 0n) {\n    throw new Error(\n      'Dev buy vestingDuration must be greater than zero when vesting is configured',\n    );\n  }\n  if (\n    vestingDuration !== 0n &&\n    vestingDuration < MIN_BUNDLER_VESTING_DURATION\n  ) {\n    throw new Error('Dev buy vestingDuration must be at least 86400 seconds');\n  }\n  if (cliffDuration > vestingDuration) {\n    throw new Error('Dev buy cliffDuration must not exceed vestingDuration');\n  }\n\n  return {\n    exactAmountIn: params.exactAmountIn,\n    recipient: params.recipient,\n    vesting: {\n      permissionlessClaim: params.vesting?.permissionlessClaim ?? false,\n      vestingDuration,\n      cliffDuration,\n    },\n  };\n}\n\nexport function assertTokenConfigSupportsYearlyMintRate(\n  params: TokenConfig,\n): void {\n  if ('yearlyMintRate' in params && params.type !== 'standard') {\n    throw new Error(\n      \"yearlyMintRate is only supported with token type 'standard'; DopplerERC20V1 does not support yearly minting.\",\n    );\n  }\n}\n\nexport function normalizeBuilderTokenConfig(\n  params: TokenConfig,\n  defaultYearlyMintRate: bigint,\n): TokenConfig {\n  assertTokenConfigSupportsYearlyMintRate(params);\n  if (params.type === 'doppler404') {\n    const token = params as Doppler404TokenConfig;\n    return {\n      type: 'doppler404',\n      name: token.name,\n      symbol: token.symbol,\n      baseURI: token.baseURI,\n      unit: token.unit,\n    };\n  }\n\n  if (params.type === 'standard') {\n    const token = params as StandardTokenConfig;\n    return {\n      type: 'standard',\n      name: token.name,\n      symbol: token.symbol,\n      tokenURI: token.tokenURI,\n      yearlyMintRate: token.yearlyMintRate ?? defaultYearlyMintRate,\n    };\n  }\n\n  return {\n    type: 'dopplerERC20V1',\n    name: params.name,\n    symbol: params.symbol,\n    tokenURI: params.tokenURI,\n    maxBalanceLimit: params.maxBalanceLimit,\n    balanceLimitEnd: params.balanceLimitEnd,\n    controller: params.controller,\n    excludedFromBalanceLimit: params.excludedFromBalanceLimit,\n  };\n}\n\n// ============================================================================\n// Common Builder Interface\n// ============================================================================\n\n/**\n * Common interface shared by all auction builders.\n *\n * Defines the methods that all builders (Static, Dynamic, Multicurve) implement.\n * Useful for documentation and ensuring API consistency across builders.\n *\n * @template C - The chain ID type\n */\nexport interface BaseAuctionBuilder<C extends SupportedChainId> {\n  /** The chain ID this builder is configured for */\n  readonly chainId: C;\n\n  /**\n   * Configure the token to be created.\n   * Supports standard ERC20, DopplerERC20V1, or Doppler404 token types.\n   */\n  tokenConfig(params: TokenConfig): this;\n\n  /**\n   * Configure the token sale parameters.\n   * @param params.initialSupply - Total token supply to mint\n   * @param params.numTokensToSell - Number of tokens allocated for the bonding curve\n   * @param params.numeraire - The quote token address (e.g., WETH)\n   */\n  saleConfig(params: {\n    initialSupply: bigint;\n    numTokensToSell: bigint;\n    numeraire: Address;\n  }): this;\n\n  /**\n   * Configure token vesting for team/investor allocations.\n   * Pass undefined or omit to disable vesting.\n   */\n  withVesting(params?: BuilderVestingInput): this;\n\n  /**\n   * Configure governance for the token.\n   * @param params - Use { type: 'default' }, { type: 'noOp' }, { type: 'launchpad', multisig: '0x...' }, or { type: 'custom', ... }\n   */\n  withGovernance(params: GovernanceOption<C>): this;\n\n  /**\n   * Configure post-auction liquidity migration.\n   * @param migration - Migration target (uniswapV2, uniswapV4, dopplerHookMigrator, or noOp)\n   */\n  withMigration(migration: MigrationConfig): this;\n\n  /**\n   * Set the user address (token creator/owner).\n   * Required for build().\n   */\n  withUserAddress(address: Address): this;\n\n  /**\n   * Set the integrator address for fee attribution.\n   * Defaults to zero address if not provided.\n   */\n  withIntegrator(address?: Address): this;\n\n  /**\n   * Override the default gas limit for the create transaction.\n   */\n  withGasLimit(gas?: bigint): this;\n\n  // Module address overrides\n  withTokenFactory(address: Address): this;\n  withAirlock(address: Address): this;\n  withGovernanceFactory(address: Address): this;\n  withV2Migrator(address: Address): this;\n  withV2MigratorSplit(address: Address): this;\n  withV4Migrator(address: Address): this;\n  withV4MigratorSplit(address: Address): this;\n  withNoOpMigrator(address: Address): this;\n}\n\nconst MAX_SAFE_INTEGER_BIGINT = BigInt(Number.MAX_SAFE_INTEGER);\n\nexport function normalizeBuilderVestingScheduleDuration(\n  value: bigint | undefined,\n  fieldPath: string,\n): number {\n  const duration = value ?? 0n;\n  if (duration < 0n) {\n    throw new RangeError(`${fieldPath} cannot be negative`);\n  }\n  if (duration > MAX_SAFE_INTEGER_BIGINT) {\n    throw new RangeError(`${fieldPath} must be a safe integer`);\n  }\n  return Number(duration);\n}\n\nexport function normalizeBuilderVestingSchedule(\n  schedule: BuilderVestingScheduleInput,\n  fieldPath: string,\n): { duration: number; cliffDuration: number } {\n  return {\n    duration: normalizeBuilderVestingScheduleDuration(\n      schedule.duration,\n      `${fieldPath}.duration`,\n    ),\n    cliffDuration: schedule.cliffDuration ?? 0,\n  };\n}\n\nexport function computeTicks(\n  priceRange: PriceRange,\n  tickSpacing: number,\n): TickRange {\n  const startTick =\n    Math.floor(\n      Math.log(priceRange.startPrice) / Math.log(1.0001) / tickSpacing,\n    ) * tickSpacing;\n  const endTick =\n    Math.ceil(Math.log(priceRange.endPrice) / Math.log(1.0001) / tickSpacing) *\n    tickSpacing;\n  return { startTick, endTick };\n}\n\nexport const MARKET_CAP_PRESET_ORDER = [\n  'low',\n  'medium',\n  'high',\n] as const satisfies readonly MulticurveMarketCapPreset[];\n\nexport type MarketCapPresetConfig = {\n  tickLower: number;\n  tickUpper: number;\n  numPositions: number;\n  shares: bigint;\n};\n\nexport const MARKET_CAP_PRESETS: Record<\n  MulticurveMarketCapPreset,\n  MarketCapPresetConfig\n> = {\n  low: {\n    tickLower: DEFAULT_MULTICURVE_LOWER_TICKS[0],\n    tickUpper: DEFAULT_MULTICURVE_UPPER_TICKS[0],\n    numPositions: DEFAULT_MULTICURVE_NUM_POSITIONS[0],\n    shares: DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES[0],\n  },\n  medium: {\n    tickLower: DEFAULT_MULTICURVE_LOWER_TICKS[1],\n    tickUpper: DEFAULT_MULTICURVE_UPPER_TICKS[1],\n    numPositions: DEFAULT_MULTICURVE_NUM_POSITIONS[1],\n    shares: DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES[1],\n  },\n  high: {\n    tickLower: DEFAULT_MULTICURVE_LOWER_TICKS[2],\n    tickUpper: DEFAULT_MULTICURVE_UPPER_TICKS[2],\n    numPositions: DEFAULT_MULTICURVE_NUM_POSITIONS[2],\n    shares: DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES[2],\n  },\n};\n\nexport type MarketCapPresetOverrides = Partial<\n  Record<\n    MulticurveMarketCapPreset,\n    {\n      tickLower?: number;\n      tickUpper?: number;\n      numPositions?: number;\n      shares?: bigint;\n    }\n  >\n>;\n\n/**\n * Helper to build curves from market cap presets with optional filler curve\n */\nexport function buildCurvesFromPresets(params: {\n  fee?: number;\n  tickSpacing?: number;\n  presets?: MulticurveMarketCapPreset[];\n  overrides?: MarketCapPresetOverrides;\n}): { fee: number; tickSpacing: number; curves: MarketCapPresetConfig[] } {\n  const fee = params?.fee ?? FEE_TIERS.LOW;\n  const tickSpacing =\n    params?.tickSpacing ?? (TICK_SPACINGS as Record<number, number>)[fee];\n\n  if (tickSpacing === undefined) {\n    throw new Error(\n      'tickSpacing must be provided when using a custom fee tier',\n    );\n  }\n\n  const requestedPresets = params?.presets ?? [...MARKET_CAP_PRESET_ORDER];\n  const uniquePresets: MulticurveMarketCapPreset[] = [];\n  for (const preset of requestedPresets) {\n    if (!(preset in MARKET_CAP_PRESETS)) {\n      throw new Error(`Unsupported market cap preset: ${preset}`);\n    }\n    if (!uniquePresets.includes(preset)) {\n      uniquePresets.push(preset);\n    }\n  }\n\n  if (uniquePresets.length === 0) {\n    throw new Error('At least one market cap preset must be provided');\n  }\n\n  const presetCurves = uniquePresets.map((preset) => {\n    const base = MARKET_CAP_PRESETS[preset];\n    const override = params?.overrides?.[preset];\n    return {\n      tickLower: override?.tickLower ?? base.tickLower,\n      tickUpper: override?.tickUpper ?? base.tickUpper,\n      numPositions: override?.numPositions ?? base.numPositions,\n      shares: override?.shares ?? base.shares,\n    };\n  });\n\n  let totalShares = presetCurves.reduce((acc, curve) => {\n    if (curve.shares <= 0n) {\n      throw new Error('Preset shares must be greater than zero');\n    }\n    return acc + curve.shares;\n  }, 0n);\n\n  if (totalShares > WAD) {\n    throw new Error('Total preset shares cannot exceed 100% (1e18)');\n  }\n\n  const curves = [...presetCurves];\n\n  // Add filler curve if shares don't sum to 100%\n  if (totalShares < WAD) {\n    const remainder = WAD - totalShares;\n    const lastCurve = curves[curves.length - 1];\n    let fillerTickLower = lastCurve?.tickUpper ?? 0;\n    let fillerNumPositions = lastCurve?.numPositions ?? 1;\n\n    if (fillerNumPositions <= 0) {\n      fillerNumPositions = 1;\n    }\n\n    const minTickAllowed = Math.ceil(MIN_TICK / tickSpacing) * tickSpacing;\n    const rawMaxTick = Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n    const maxTickAllowed = rawMaxTick - tickSpacing;\n\n    fillerTickLower = Math.max(fillerTickLower, minTickAllowed);\n    let fillerTickUpper = fillerTickLower + fillerNumPositions * tickSpacing;\n\n    if (fillerTickUpper > maxTickAllowed) {\n      fillerTickUpper = maxTickAllowed;\n      fillerTickLower = Math.min(fillerTickLower, maxTickAllowed - tickSpacing);\n    }\n\n    if (fillerTickUpper <= fillerTickLower) {\n      fillerTickLower = Math.max(minTickAllowed, maxTickAllowed - tickSpacing);\n      fillerTickUpper = fillerTickLower + tickSpacing;\n    }\n\n    curves.push({\n      tickLower: fillerTickLower,\n      tickUpper: fillerTickUpper,\n      numPositions: fillerNumPositions,\n      shares: remainder,\n    });\n\n    totalShares = WAD;\n  }\n\n  if (totalShares !== WAD) {\n    throw new Error('Failed to normalize preset shares to 100%');\n  }\n\n  return { fee, tickSpacing, curves };\n}\n","import {\n  BaseError,\n  ContractFunctionRevertedError,\n  ExecutionRevertedError,\n  type Address,\n  type Hex,\n  type Hash,\n  type PublicClient,\n  type WalletClient,\n  type Account,\n  encodeAbiParameters,\n  encodeFunctionData,\n  encodePacked,\n  keccak256,\n  getAddress,\n  decodeEventLog,\n  decodeAbiParameters,\n  toHex,\n  erc20Abi,\n} from 'viem';\nimport type {\n  CreateStaticAuctionParams,\n  CreateDynamicAuctionParams,\n  CreateOpeningAuctionParams,\n  CreateMulticurveParams,\n  DopplerHookMigratorConfig,\n  DopplerHookMigrationConfig,\n  MigrationConfig,\n  SupportedPublicClient,\n  TokenConfig,\n  Doppler404TokenConfig,\n  DopplerERC20V1TokenConfig,\n  InferredDopplerERC20V1TokenConfig,\n  StandardTokenConfig,\n  SaleConfig,\n  VestingConfig,\n  SupportedChainId,\n  CreateParams,\n  V4PoolKey,\n  MulticurveCreateResult,\n  MulticurveDevBuyConfig,\n  PreparedMulticurveDevBuy,\n  SimulatedMulticurveCreate,\n  RehypeDopplerHookInitializerConfig,\n  OpeningAuctionState,\n  OpeningAuctionCreateResult,\n  OpeningAuctionCompleteResult,\n  GovernanceOption,\n  ProceedsSplitConfig,\n  StreamableFeesConfig,\n} from '../types';\nimport type {\n  MulticurveCreateGasEstimate,\n  MulticurveCreatePrediction,\n  PrepareCreateMulticurveOptions,\n  PreparedMulticurveCreate,\n} from '../types';\nimport type { ModuleAddressOverrides } from '../types';\nimport { assertTokenConfigSupportsYearlyMintRate } from '../builders/shared';\nimport { getAddresses } from '../addresses';\nimport {\n  ZERO_ADDRESS,\n  DEAD_ADDRESS,\n  WAD,\n  DEFAULT_PD_SLUGS,\n  FLAG_MASK,\n  DOPPLER_FLAGS,\n  OPENING_AUCTION_FLAGS,\n  DEFAULT_V3_NUM_POSITIONS,\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  OPENING_AUCTION_PHASE_SETTLED,\n  OPENING_AUCTION_STATUS_ACTIVE,\n  INT24_MIN,\n  INT24_MAX,\n  MAX_UINT64,\n  MAX_UINT128,\n  MIN_BUNDLER_VESTING_DURATION,\n} from '../constants';\nimport {\n  computeOptimalGamma,\n  encodeRehypeDopplerHookMigratorCalldata,\n  getMaxLiquiditySafeMulticurveTickUpper,\n  MIN_TICK,\n  MAX_TICK,\n  isToken0Expected,\n  sortBeneficiaries,\n  verifyPreparedCreateReceipt,\n  encodeRehypeDopplerHookInitializerData,\n  normalizeRehypeDopplerHookInitializerConfig,\n} from '../utils';\nimport { normalizeRehypeDopplerHookMigratorConfig } from '../utils/dopplerHookMigrator';\nimport {\n  airlockAbi,\n  bundlerAbi,\n  DERC20Bytecode,\n  DERC2080Bytecode,\n  DopplerBytecode,\n  OpeningAuctionBytecode,\n  v4MulticurveInitializerAbi,\n  openingAuctionAbi,\n  openingAuctionInitializerAbi,\n  rehypeDopplerHookInitializerAbi,\n} from '../abis';\nimport { getDopplerDN404Bytecode } from '../utils/tokenAddressMiner';\n\n// Type definition for the custom migration encoder function\nexport type MigrationEncoder = (config: MigrationConfig) => Hex;\n\nconst MAX_PROCEEDS_SPLIT_SHARE = WAD / 2n;\n\nfunction isDopplerHookMigratorConfig(\n  config: MigrationConfig,\n): config is DopplerHookMigratorConfig | DopplerHookMigrationConfig {\n  return config.type === 'dopplerHookMigrator' || config.type === 'dopplerHook';\n}\nconst DERC20_V1_MAX_PREMINT_WAD = (WAD * 8n) / 10n;\nconst ONE_MILLION = 1_000_000n;\n// Auto-mined completion can race with on-chain state changes; keep retries bounded.\nconst MAX_COMPLETION_ATTEMPTS = 3;\nconst UNISWAP_V2_PAIR_INIT_CODE_HASH =\n  '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' as const;\nconst UNISWAP_V3_POOL_INIT_CODE_HASH =\n  '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54' as const;\n\nconst erc20BalanceOfAbi = [\n  {\n    type: 'function',\n    name: 'balanceOf',\n    inputs: [{ type: 'address', name: 'account' }],\n    outputs: [{ type: 'uint256', name: '' }],\n    stateMutability: 'view',\n  },\n] as const;\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  | {\n      type: 'decay';\n      startTime: number;\n      startFee: number;\n      durationSeconds: number;\n    }\n  | {\n      type: 'dopplerHook';\n      hookConfig?: RehypeDopplerHookInitializerConfig;\n    };\n\ntype StandardTokenFactoryMode = 'legacy' | 'v2';\n\ntype InternalCreateGasEstimate =\n  | { status: 'estimated'; gas: bigint }\n  | { status: 'unavailable' }\n  | { status: 'reverted'; error: unknown };\ntype TokenFactoryVariant =\n  | 'standard'\n  | 'standard-v2'\n  | 'dopplerERC20V1'\n  | 'doppler404';\n\ntype LegacyStandardTokenFactoryData = {\n  kind: 'legacy';\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\ntype V2VestingSchedule = {\n  cliff: bigint;\n  duration: bigint;\n};\n\ntype V2StandardTokenFactoryData = {\n  kind: 'v2';\n  name: string;\n  symbol: string;\n  initialSupply: bigint;\n  airlock: Address;\n  yearlyMintRate: bigint;\n  schedules: V2VestingSchedule[];\n  beneficiaries: Address[];\n  scheduleIds: bigint[];\n  amounts: bigint[];\n  tokenURI: string;\n  implementation: Address;\n};\n\ntype StandardTokenFactoryData =\n  | LegacyStandardTokenFactoryData\n  | V2StandardTokenFactoryData;\n\ntype DopplerERC20V1TokenFactoryData = {\n  kind: 'dopplerERC20V1';\n  name: string;\n  symbol: string;\n  schedules: V2VestingSchedule[];\n  beneficiaries: Address[];\n  scheduleIds: bigint[];\n  amounts: bigint[];\n  tokenURI: string;\n  maxBalanceLimit: bigint;\n  balanceLimitEnd: number;\n  controller: Address;\n  excludedFromBalanceLimit: Address[];\n  implementation: Address;\n};\n\nconst DERC20_V2_MIN_VESTING_DURATION = 24 * 60 * 60;\nconst MAX_UINT48 = (1n << 48n) - 1n;\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  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  private hasCustomV2Schedules(vesting?: VestingConfig): boolean {\n    return (vesting?.allocations?.length ?? 0) > 0;\n  }\n\n  private usesDerc20V2Vesting(vesting?: VestingConfig): boolean {\n    if (!vesting) {\n      return false;\n    }\n\n    return (\n      this.hasCustomV2Schedules(vesting) || (vesting.cliffDuration ?? 0) > 0\n    );\n  }\n\n  private resolveVestingAllocations(args: {\n    sale: SaleConfig;\n    vesting?: VestingConfig;\n    userAddress: Address;\n  }): { recipients: Address[]; amounts: bigint[] } {\n    if (!args.vesting) {\n      return { recipients: [], amounts: [] };\n    }\n\n    if (args.vesting.allocations) {\n      return {\n        recipients: args.vesting.allocations.map(\n          (allocation) => allocation.recipient,\n        ),\n        amounts: args.vesting.allocations.map(\n          (allocation) => allocation.amount,\n        ),\n      };\n    }\n\n    if (args.vesting.recipients && args.vesting.amounts) {\n      return {\n        recipients: args.vesting.recipients,\n        amounts: args.vesting.amounts,\n      };\n    }\n\n    return {\n      recipients: [args.userAddress],\n      amounts: [args.sale.initialSupply - args.sale.numTokensToSell],\n    };\n  }\n\n  private validateDopplerERC20V1TokenFactoryData(args: {\n    sale: SaleConfig;\n    recipients: Address[];\n    amounts: bigint[];\n    schedules: V2VestingSchedule[];\n    scheduleIds: bigint[];\n  }): void {\n    if (\n      args.recipients.length !== args.amounts.length ||\n      args.recipients.length !== args.scheduleIds.length\n    ) {\n      throw new Error(\n        'token.vesting allocations, amounts, and scheduleIds arrays must ' +\n          'have the same length',\n      );\n    }\n\n    for (const [index, schedule] of args.schedules.entries()) {\n      if (\n        (schedule.duration !== 0n &&\n          schedule.duration < BigInt(DERC20_V2_MIN_VESTING_DURATION)) ||\n        schedule.cliff > schedule.duration\n      ) {\n        throw new Error(\n          `token.vesting schedules[${index}] must have duration 0 or ` +\n            `at least ${DERC20_V2_MIN_VESTING_DURATION} seconds, with cliff ` +\n            `less than or equal to duration`,\n        );\n      }\n    }\n\n    const premintCap =\n      (args.sale.initialSupply * DERC20_V1_MAX_PREMINT_WAD) / WAD;\n    const allocatedTotals = new Map<string, bigint>();\n    let totalVested = 0n;\n\n    for (const [index, beneficiary] of args.recipients.entries()) {\n      const amount = args.amounts[index];\n      const scheduleId = args.scheduleIds[index];\n\n      if (beneficiary === ZERO_ADDRESS) {\n        throw new Error(\n          `token.vesting allocations[${index}].beneficiary must not be the ` +\n            'zero address',\n        );\n      }\n\n      if (amount <= 0n) {\n        throw new Error(\n          `token.vesting allocations[${index}].amount must be greater than ` +\n            '0',\n        );\n      }\n\n      if (scheduleId >= BigInt(args.schedules.length)) {\n        throw new Error(\n          `token.vesting allocations[${index}].scheduleId must reference ` +\n            'an existing schedule',\n        );\n      }\n\n      const beneficiaryKey = beneficiary.toLowerCase();\n      const totalAllocated =\n        (allocatedTotals.get(beneficiaryKey) ?? 0n) + amount;\n      allocatedTotals.set(beneficiaryKey, totalAllocated);\n\n      if (totalAllocated > premintCap) {\n        throw new Error(\n          `token.vesting allocations[${index}] exceed the per-beneficiary ` +\n            'premint cap',\n        );\n      }\n\n      totalVested += amount;\n    }\n\n    if (totalVested > premintCap) {\n      throw new Error('token.vesting allocations exceed the total premint cap');\n    }\n\n    if (totalVested > args.sale.initialSupply) {\n      throw new Error('token.vesting allocations exceed sale.initialSupply');\n    }\n  }\n\n  private validateUint64LikeNumber(\n    value: number,\n    fieldPath: string,\n    options: { allowZero?: boolean } = {},\n  ): void {\n    const { allowZero = true } = options;\n    if (!Number.isFinite(value) || !Number.isInteger(value)) {\n      throw new Error(`${fieldPath} must be a finite integer`);\n    }\n    if (!Number.isSafeInteger(value)) {\n      throw new Error(`${fieldPath} must be a safe integer`);\n    }\n    if (value < 0) {\n      throw new Error(`${fieldPath} cannot be negative`);\n    }\n    if (!allowZero && value === 0) {\n      throw new Error(`${fieldPath} must be greater than zero`);\n    }\n    if (BigInt(value) > MAX_UINT64) {\n      throw new Error(`${fieldPath} must fit in uint64`);\n    }\n  }\n\n  private validateUint48LikeNumber(value: number, fieldPath: string): void {\n    if (!Number.isFinite(value) || !Number.isInteger(value)) {\n      throw new Error(`${fieldPath} must be a finite integer`);\n    }\n    if (!Number.isSafeInteger(value)) {\n      throw new Error(`${fieldPath} must be a safe integer`);\n    }\n    if (value < 0) {\n      throw new Error(`${fieldPath} cannot be negative`);\n    }\n    if (BigInt(value) > MAX_UINT48) {\n      throw new Error(`${fieldPath} must fit in uint48`);\n    }\n  }\n\n  private resolveDopplerERC20V1TokenFactoryData(args: {\n    token: DopplerERC20V1TokenConfig | InferredDopplerERC20V1TokenConfig;\n    sale: SaleConfig;\n    vesting?: VestingConfig;\n    userAddress: Address;\n    addresses: ReturnType<typeof getAddresses>;\n    modules?: ModuleAddressOverrides;\n    protocolBalanceLimitExclusions?: (Address | undefined)[];\n  }): DopplerERC20V1TokenFactoryData {\n    const implementation = args.addresses.dopplerERC20V1Implementation;\n    if (!implementation || implementation === ZERO_ADDRESS) {\n      throw new Error(\n        'DopplerERC20V1 implementation address not configured for this chain.',\n      );\n    }\n\n    const maxBalanceLimit = args.token.maxBalanceLimit ?? 0n;\n    const balanceLimitEnd = args.token.balanceLimitEnd ?? 0;\n    this.validateUint48LikeNumber(balanceLimitEnd, 'token.balanceLimitEnd');\n\n    const balanceLimitEnabled = maxBalanceLimit > 0n || balanceLimitEnd > 0;\n    if (\n      balanceLimitEnabled &&\n      (maxBalanceLimit === 0n || balanceLimitEnd === 0)\n    ) {\n      throw new Error(\n        'token.maxBalanceLimit and token.balanceLimitEnd must both be set when balance limiting is enabled',\n      );\n    }\n\n    if (balanceLimitEnabled && maxBalanceLimit >= args.sale.initialSupply) {\n      throw new Error(\n        'token.maxBalanceLimit must be below sale.initialSupply when balance limiting is enabled',\n      );\n    }\n\n    if (\n      balanceLimitEnabled &&\n      balanceLimitEnd <= Math.floor(Date.now() / 1000)\n    ) {\n      throw new Error(\n        'token.balanceLimitEnd must be in the future when balance limiting is enabled',\n      );\n    }\n\n    const { recipients, amounts } = this.resolveVestingAllocations(args);\n    const { schedules, scheduleIds } = this.resolveV2VestingSchedules({\n      vesting: args.vesting,\n      recipientCount: recipients.length,\n    });\n\n    this.validateDopplerERC20V1TokenFactoryData({\n      sale: args.sale,\n      recipients,\n      amounts,\n      schedules,\n      scheduleIds,\n    });\n\n    return {\n      kind: 'dopplerERC20V1',\n      name: args.token.name,\n      symbol: args.token.symbol,\n      schedules,\n      beneficiaries: recipients,\n      scheduleIds,\n      amounts,\n      tokenURI: args.token.tokenURI,\n      maxBalanceLimit,\n      balanceLimitEnd,\n      controller: args.token.controller ?? ZERO_ADDRESS,\n      excludedFromBalanceLimit: this.mergeDopplerERC20V1BalanceLimitExclusions(\n        args.token.excludedFromBalanceLimit,\n        balanceLimitEnabled ? args.protocolBalanceLimitExclusions : undefined,\n      ),\n      implementation,\n    };\n  }\n\n  private isDopplerERC20V1BalanceLimitActive(\n    tokenFactoryData: Pick<\n      DopplerERC20V1TokenFactoryData,\n      'maxBalanceLimit' | 'balanceLimitEnd'\n    >,\n  ): boolean {\n    return (\n      tokenFactoryData.maxBalanceLimit > 0n ||\n      tokenFactoryData.balanceLimitEnd > 0\n    );\n  }\n\n  private usesDefaultDopplerERC20V1Integration(\n    modules?: ModuleAddressOverrides,\n  ): boolean {\n    return !modules?.tokenFactory && !modules?.dopplerERC20V1Factory;\n  }\n\n  private resolveGovernanceBalanceLimitExclusions(\n    governance: GovernanceOption<C>,\n  ): Address[] {\n    if (governance.type === 'noOp') {\n      return [DEAD_ADDRESS];\n    }\n    if (governance.type === 'launchpad') {\n      return [governance.multisig];\n    }\n    return [];\n  }\n\n  private resolveGovernanceFactoryAddress(args: {\n    governance: GovernanceOption<C>;\n    modules?: ModuleAddressOverrides;\n    addresses: ReturnType<typeof getAddresses>;\n    noOpError: string;\n    launchpadError: string;\n    standardError: string;\n  }): Address {\n    if (args.governance.type === 'noOp') {\n      const resolved =\n        args.modules?.governanceFactory ??\n        args.addresses.noOpGovernanceFactory ??\n        ZERO_ADDRESS;\n      if (!resolved || resolved === ZERO_ADDRESS) {\n        throw new Error(args.noOpError);\n      }\n      return resolved;\n    }\n\n    if (args.governance.type === 'launchpad') {\n      const resolved =\n        args.modules?.governanceFactory ??\n        args.addresses.launchpadGovernanceFactory ??\n        ZERO_ADDRESS;\n      if (!resolved || resolved === ZERO_ADDRESS) {\n        throw new Error(args.launchpadError);\n      }\n      return resolved;\n    }\n\n    const resolved =\n      args.modules?.governanceFactory ?? args.addresses.governanceFactory;\n    if (!resolved || resolved === ZERO_ADDRESS) {\n      throw new Error(args.standardError);\n    }\n    return resolved;\n  }\n\n  private shouldAutoExcludeGovernanceTimelock(args: {\n    governance: GovernanceOption<C>;\n    governanceFactory: Address;\n    modules?: ModuleAddressOverrides;\n    addresses: ReturnType<typeof getAddresses>;\n  }): boolean {\n    if (\n      args.governance.type !== 'default' &&\n      args.governance.type !== 'custom'\n    ) {\n      return false;\n    }\n\n    if (args.modules?.governanceFactory) {\n      return false;\n    }\n\n    const noOpGovernanceFactory = args.addresses.noOpGovernanceFactory;\n    return (\n      !noOpGovernanceFactory ||\n      args.governanceFactory.toLowerCase() !==\n        noOpGovernanceFactory.toLowerCase()\n    );\n  }\n\n  private resolveMigrationLockerBalanceLimitExclusions(\n    migration: MigrationConfig,\n    addresses: ReturnType<typeof getAddresses>,\n  ): (Address | undefined)[] {\n    if (\n      (migration.type === 'uniswapV4' || migration.type === 'uniswapV4Split') &&\n      migration.streamableFees\n    ) {\n      return [addresses.streamableFeesLocker];\n    }\n\n    if (isDopplerHookMigratorConfig(migration)) {\n      return [\n        addresses.streamableFeesLockerV2 ?? addresses.streamableFeesLocker,\n      ];\n    }\n\n    return [];\n  }\n\n  private withDopplerERC20V1EncodedBalanceLimitExclusions(\n    tokenFactoryData: Hex,\n    exclusions: readonly (Address | undefined)[],\n  ): Hex {\n    const decoded = decodeAbiParameters(\n      [\n        { type: 'string' },\n        { type: 'string' },\n        {\n          type: 'tuple[]',\n          components: [\n            { type: 'uint64', name: 'cliff' },\n            { type: 'uint64', name: 'duration' },\n          ],\n        },\n        { type: 'address[]' },\n        { type: 'uint256[]' },\n        { type: 'uint256[]' },\n        { type: 'string' },\n        { type: 'uint256' },\n        { type: 'uint48' },\n        { type: 'address' },\n        { type: 'address[]' },\n      ],\n      tokenFactoryData,\n    ) as readonly [\n      string,\n      string,\n      readonly { cliff: bigint; duration: bigint }[],\n      readonly Address[],\n      readonly bigint[],\n      readonly bigint[],\n      string,\n      bigint,\n      number,\n      Address,\n      readonly Address[],\n    ];\n\n    if (decoded[7] === 0n && decoded[8] === 0) {\n      return tokenFactoryData;\n    }\n\n    return encodeAbiParameters(\n      [\n        { type: 'string' },\n        { type: 'string' },\n        {\n          type: 'tuple[]',\n          components: [\n            { type: 'uint64', name: 'cliff' },\n            { type: 'uint64', name: 'duration' },\n          ],\n        },\n        { type: 'address[]' },\n        { type: 'uint256[]' },\n        { type: 'uint256[]' },\n        { type: 'string' },\n        { type: 'uint256' },\n        { type: 'uint48' },\n        { type: 'address' },\n        { type: 'address[]' },\n      ],\n      [\n        decoded[0],\n        decoded[1],\n        decoded[2],\n        decoded[3],\n        decoded[4],\n        decoded[5],\n        decoded[6],\n        decoded[7],\n        decoded[8],\n        decoded[9],\n        this.mergeDopplerERC20V1BalanceLimitExclusions(decoded[10], exclusions),\n      ],\n    );\n  }\n\n  private withSimulationGovernanceTimelockExclusion(args: {\n    createParams: CreateParams;\n    simResult: readonly unknown[];\n    token: TokenConfig;\n    governance: GovernanceOption<C>;\n    modules?: ModuleAddressOverrides;\n    addresses: ReturnType<typeof getAddresses>;\n  }): CreateParams {\n    if (\n      !this.isDopplerERC20V1Token(args.token) ||\n      !this.usesDefaultDopplerERC20V1Integration(args.modules) ||\n      args.simResult.length < 4 ||\n      !this.shouldAutoExcludeGovernanceTimelock({\n        governance: args.governance,\n        governanceFactory: args.createParams.governanceFactory,\n        modules: args.modules,\n        addresses: args.addresses,\n      })\n    ) {\n      return args.createParams;\n    }\n\n    return {\n      ...args.createParams,\n      tokenFactoryData: this.withDopplerERC20V1EncodedBalanceLimitExclusions(\n        args.createParams.tokenFactoryData,\n        [args.simResult[3] as Address],\n      ),\n    };\n  }\n\n  private withDopplerERC20V1BalanceLimitExclusions(\n    tokenFactoryData: DopplerERC20V1TokenFactoryData,\n    exclusions: readonly (Address | undefined)[],\n  ): DopplerERC20V1TokenFactoryData {\n    if (!this.isDopplerERC20V1BalanceLimitActive(tokenFactoryData)) {\n      return { ...tokenFactoryData };\n    }\n\n    return {\n      ...tokenFactoryData,\n      excludedFromBalanceLimit: this.mergeDopplerERC20V1BalanceLimitExclusions(\n        tokenFactoryData.excludedFromBalanceLimit,\n        exclusions,\n      ),\n    };\n  }\n\n  private deriveCreate2Address(args: {\n    deployer: Address;\n    salt: Hex;\n    initCodeHash: Hash;\n  }): Address {\n    const hash = keccak256(\n      `0xff${args.deployer.slice(2)}${args.salt.slice(2)}${args.initCodeHash.slice(\n        2,\n      )}` as Hex,\n    );\n    return getAddress(`0x${hash.slice(-40)}`) as Address;\n  }\n\n  private predictDopplerERC20V1TokenAddress(args: {\n    tokenFactory: Address;\n    salt: Hex;\n    implementation: Address;\n  }): Address {\n    return this.deriveCreate2Address({\n      deployer: args.tokenFactory,\n      salt: args.salt,\n      initCodeHash: this.computeSoladyCloneInitCodeHash(args.implementation),\n    });\n  }\n\n  private computeUniswapV2PairAddress(args: {\n    factory: Address;\n    tokenA: Address;\n    tokenB: Address;\n  }): Address {\n    const [token0, token1] =\n      BigInt(args.tokenA) < BigInt(args.tokenB)\n        ? [args.tokenA, args.tokenB]\n        : [args.tokenB, args.tokenA];\n    const salt = keccak256(\n      encodePacked(['address', 'address'], [token0, token1]),\n    );\n    return this.deriveCreate2Address({\n      deployer: args.factory,\n      salt,\n      initCodeHash: UNISWAP_V2_PAIR_INIT_CODE_HASH,\n    });\n  }\n\n  private computeUniswapV3PoolAddress(args: {\n    factory: Address;\n    tokenA: Address;\n    tokenB: Address;\n    fee: number;\n  }): Address {\n    const [token0, token1] =\n      BigInt(args.tokenA) < BigInt(args.tokenB)\n        ? [args.tokenA, args.tokenB]\n        : [args.tokenB, args.tokenA];\n    const salt = keccak256(\n      encodeAbiParameters(\n        [{ type: 'address' }, { type: 'address' }, { type: 'uint24' }],\n        [token0, token1, args.fee],\n      ),\n    );\n    return this.deriveCreate2Address({\n      deployer: args.factory,\n      salt,\n      initCodeHash: UNISWAP_V3_POOL_INIT_CODE_HASH,\n    });\n  }\n\n  private resolveStaticV3PoolExclusion(args: {\n    addresses: ReturnType<typeof getAddresses>;\n    tokenAddress: Address;\n    numeraire: Address;\n    fee: number;\n  }): Address | undefined {\n    if (!args.addresses.uniswapV3Factory) {\n      return undefined;\n    }\n\n    return this.computeUniswapV3PoolAddress({\n      factory: args.addresses.uniswapV3Factory,\n      tokenA: args.tokenAddress,\n      tokenB: args.numeraire,\n      fee: args.fee,\n    });\n  }\n\n  private resolveUniswapV2MigrationPairExclusion(args: {\n    migration: MigrationConfig;\n    addresses: ReturnType<typeof getAddresses>;\n    tokenAddress: Address;\n    numeraire: Address;\n  }): Address | undefined {\n    if (\n      (args.migration.type !== 'uniswapV2' &&\n        args.migration.type !== 'uniswapV2Split') ||\n      !args.addresses.uniswapV2Factory\n    ) {\n      return undefined;\n    }\n\n    return this.computeUniswapV2PairAddress({\n      factory: args.addresses.uniswapV2Factory,\n      tokenA: args.tokenAddress,\n      tokenB: args.numeraire,\n    });\n  }\n\n  private mergeDopplerERC20V1BalanceLimitExclusions(\n    userExclusions: readonly Address[] | undefined,\n    protocolExclusions: readonly (Address | undefined)[] | undefined,\n  ): Address[] {\n    const exclusions: Address[] = [];\n    const seen = new Set<string>();\n\n    for (const address of [\n      ...(userExclusions ?? []),\n      ...(protocolExclusions ?? []),\n    ]) {\n      if (!address || address === ZERO_ADDRESS) {\n        continue;\n      }\n      const key = address.toLowerCase();\n      if (seen.has(key)) {\n        continue;\n      }\n      seen.add(key);\n      exclusions.push(address);\n    }\n\n    return exclusions;\n  }\n\n  private resolveV2VestingSchedules(args: {\n    vesting?: VestingConfig;\n    recipientCount: number;\n  }): {\n    schedules: V2VestingSchedule[];\n    scheduleIds: bigint[];\n  } {\n    if (!args.vesting) {\n      return { schedules: [], scheduleIds: [] };\n    }\n\n    if (!this.hasCustomV2Schedules(args.vesting)) {\n      return {\n        schedules: [\n          {\n            cliff: BigInt(args.vesting.cliffDuration ?? 0),\n            duration: BigInt(args.vesting.duration ?? 0),\n          },\n        ],\n        scheduleIds: Array.from({ length: args.recipientCount }, () => 0n),\n      };\n    }\n\n    const schedules: V2VestingSchedule[] = [];\n    const scheduleIds: bigint[] = [];\n    const scheduleIdsByKey = new Map<string, bigint>();\n\n    for (const allocation of args.vesting.allocations ?? []) {\n      const cliff = BigInt(allocation.schedule.cliffDuration ?? 0);\n      const duration = BigInt(allocation.schedule.duration ?? 0);\n      const key = `${cliff}:${duration}`;\n      let scheduleId = scheduleIdsByKey.get(key);\n      if (scheduleId === undefined) {\n        scheduleId = BigInt(schedules.length);\n        schedules.push({ cliff, duration });\n        scheduleIdsByKey.set(key, scheduleId);\n      }\n      scheduleIds.push(scheduleId);\n    }\n\n    return { schedules, scheduleIds };\n  }\n\n  private resolveStandardTokenFactoryMode(args: {\n    vesting?: VestingConfig;\n    tokenFactory: Address;\n    addresses: ReturnType<typeof getAddresses>;\n  }): StandardTokenFactoryMode {\n    if (this.usesDerc20V2Vesting(args.vesting)) {\n      return 'v2';\n    }\n\n    const v2Factory = args.addresses.derc20V2Factory;\n    if (\n      v2Factory &&\n      args.tokenFactory.toLowerCase() === v2Factory.toLowerCase()\n    ) {\n      return 'v2';\n    }\n\n    return 'legacy';\n  }\n\n  private assertStandardTokenFactoryCompatibility(args: {\n    token: TokenConfig;\n    vesting?: VestingConfig;\n    tokenFactory: Address;\n    addresses: ReturnType<typeof getAddresses>;\n  }): void {\n    if (\n      this.isDoppler404Token(args.token) ||\n      this.isDopplerERC20V1Token(args.token) ||\n      !this.usesDerc20V2Vesting(args.vesting)\n    ) {\n      return;\n    }\n\n    const v2Factory = args.addresses.derc20V2Factory;\n    if (!v2Factory || v2Factory === ZERO_ADDRESS) {\n      throw new Error(\n        'Cliff vesting requires the DERC20 V2 factory, but no V2 factory is configured for this chain.',\n      );\n    }\n\n    if (args.tokenFactory.toLowerCase() !== v2Factory.toLowerCase()) {\n      throw new Error(\n        'Cliff vesting requires the DERC20 V2 factory. Remove the tokenFactory override or point it at the chain DERC20 V2 factory.',\n      );\n    }\n  }\n\n  private assertDoppler404Compatibility(args: {\n    token: TokenConfig;\n    vesting?: VestingConfig;\n    configuredFactory?: Address;\n  }): void {\n    if (!this.isDoppler404Token(args.token)) {\n      return;\n    }\n\n    if (!args.configuredFactory || args.configuredFactory === ZERO_ADDRESS) {\n      throw new Error(\n        'Doppler404 factory address not configured for this chain',\n      );\n    }\n\n    if (args.vesting !== undefined) {\n      throw new Error('Doppler404 tokens do not support vesting');\n    }\n  }\n\n  private buildStandardTokenFactoryData(args: {\n    token: StandardTokenConfig;\n    sale: SaleConfig;\n    vesting?: VestingConfig;\n    userAddress: Address;\n    airlock: Address;\n    tokenFactory: Address;\n    addresses: ReturnType<typeof getAddresses>;\n  }): StandardTokenFactoryData {\n    const { recipients, amounts } = this.resolveVestingAllocations(args);\n    const yearlyMintRate =\n      args.token.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE;\n    const mode = this.resolveStandardTokenFactoryMode({\n      vesting: args.vesting,\n      tokenFactory: args.tokenFactory,\n      addresses: args.addresses,\n    });\n\n    if (mode === 'v2') {\n      const implementation = args.addresses.derc20V2Implementation;\n      if (!implementation || implementation === ZERO_ADDRESS) {\n        throw new Error(\n          'DERC20 V2 implementation address not configured for this chain.',\n        );\n      }\n\n      const { schedules, scheduleIds } = this.resolveV2VestingSchedules({\n        vesting: args.vesting,\n        recipientCount: recipients.length,\n      });\n\n      return {\n        kind: 'v2',\n        name: args.token.name,\n        symbol: args.token.symbol,\n        initialSupply: args.sale.initialSupply,\n        airlock: args.airlock,\n        yearlyMintRate,\n        schedules,\n        beneficiaries: recipients,\n        scheduleIds,\n        amounts,\n        tokenURI: args.token.tokenURI,\n        implementation,\n      };\n    }\n\n    return {\n      kind: 'legacy',\n      name: args.token.name,\n      symbol: args.token.symbol,\n      initialSupply: args.sale.initialSupply,\n      airlock: args.airlock,\n      yearlyMintRate,\n      vestingDuration: BigInt(args.vesting?.duration ?? 0),\n      recipients,\n      amounts,\n      tokenURI: args.token.tokenURI,\n    };\n  }\n\n  private encodeStandardTokenFactoryData(\n    tokenFactoryData: StandardTokenFactoryData,\n  ): Hex {\n    if (tokenFactoryData.kind === 'v2') {\n      return encodeAbiParameters(\n        [\n          { type: 'string' },\n          { type: 'string' },\n          { type: 'uint256' },\n          {\n            type: 'tuple[]',\n            components: [\n              { type: 'uint64', name: 'cliff' },\n              { type: 'uint64', name: 'duration' },\n            ],\n          },\n          { type: 'address[]' },\n          { type: 'uint256[]' },\n          { type: 'uint256[]' },\n          { type: 'string' },\n        ],\n        [\n          tokenFactoryData.name,\n          tokenFactoryData.symbol,\n          tokenFactoryData.yearlyMintRate,\n          tokenFactoryData.schedules.map((schedule) => ({\n            cliff: schedule.cliff,\n            duration: schedule.duration,\n          })),\n          tokenFactoryData.beneficiaries,\n          tokenFactoryData.scheduleIds,\n          tokenFactoryData.amounts,\n          tokenFactoryData.tokenURI,\n        ],\n      );\n    }\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        tokenFactoryData.name,\n        tokenFactoryData.symbol,\n        tokenFactoryData.yearlyMintRate,\n        tokenFactoryData.vestingDuration,\n        tokenFactoryData.recipients,\n        tokenFactoryData.amounts,\n        tokenFactoryData.tokenURI,\n      ],\n    );\n  }\n\n  private encodeDopplerERC20V1TokenFactoryData(\n    tokenFactoryData: DopplerERC20V1TokenFactoryData,\n  ): Hex {\n    return encodeAbiParameters(\n      [\n        { type: 'string' },\n        { type: 'string' },\n        {\n          type: 'tuple[]',\n          components: [\n            { type: 'uint64', name: 'cliff' },\n            { type: 'uint64', name: 'duration' },\n          ],\n        },\n        { type: 'address[]' },\n        { type: 'uint256[]' },\n        { type: 'uint256[]' },\n        { type: 'string' },\n        { type: 'uint256' },\n        { type: 'uint48' },\n        { type: 'address' },\n        { type: 'address[]' },\n      ],\n      [\n        tokenFactoryData.name,\n        tokenFactoryData.symbol,\n        tokenFactoryData.schedules.map((schedule) => ({\n          cliff: schedule.cliff,\n          duration: schedule.duration,\n        })),\n        tokenFactoryData.beneficiaries,\n        tokenFactoryData.scheduleIds,\n        tokenFactoryData.amounts,\n        tokenFactoryData.tokenURI,\n        tokenFactoryData.maxBalanceLimit,\n        tokenFactoryData.balanceLimitEnd,\n        tokenFactoryData.controller,\n        tokenFactoryData.excludedFromBalanceLimit,\n      ],\n    );\n  }\n\n  private computeSoladyCloneInitCodeHash(implementation: Address): Hash {\n    return keccak256(\n      `0x602c3d8160093d39f33d3d3d3d363d3d37363d73${implementation.slice(\n        2,\n      )}5af43d3d93803e602a57fd5bf3`,\n    );\n  }\n\n  private computeStandardTokenInitHash(\n    tokenFactoryData: StandardTokenFactoryData,\n    tokenFactory: Address,\n  ): Hash {\n    if (tokenFactoryData.kind === 'v2') {\n      return this.computeSoladyCloneInitCodeHash(\n        tokenFactoryData.implementation,\n      );\n    }\n\n    const initData = 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        tokenFactoryData.name,\n        tokenFactoryData.symbol,\n        tokenFactoryData.initialSupply,\n        tokenFactoryData.airlock,\n        tokenFactoryData.airlock,\n        tokenFactoryData.yearlyMintRate,\n        tokenFactoryData.vestingDuration,\n        tokenFactoryData.recipients,\n        tokenFactoryData.amounts,\n        tokenFactoryData.tokenURI,\n      ],\n    );\n\n    const isTokenFactory80 =\n      tokenFactory.toLowerCase() === TOKEN_FACTORY_80_ADDRESS;\n\n    return keccak256(\n      encodePacked(\n        ['bytes', 'bytes'],\n        [\n          isTokenFactory80\n            ? (DERC2080Bytecode as Hex)\n            : (DERC20Bytecode as Hex),\n          initData,\n        ],\n      ),\n    );\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    this.assertDoppler404Compatibility({\n      token: params.token,\n      vesting: params.vesting,\n      configuredFactory: addresses.doppler404Factory,\n    });\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) and reject duplicates as\n      // required by the contract\n      const sortedBeneficiaries = sortBeneficiaries(params.pool.beneficiaries!);\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      numeraire: params.sale.numeraire,\n      overrides: params.modules,\n    });\n\n    const resolvedTokenFactory: Address | undefined =\n      params.modules?.tokenFactory ??\n      (this.isDoppler404Token(params.token)\n        ? (addresses.doppler404Factory as Address | undefined)\n        : this.isDopplerERC20V1Token(params.token)\n          ? (params.modules?.dopplerERC20V1Factory ??\n            addresses.dopplerERC20V1Factory)\n          : this.usesDerc20V2Vesting(params.vesting)\n            ? addresses.derc20V2Factory\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    this.assertStandardTokenFactoryCompatibility({\n      token: params.token,\n      vesting: params.vesting,\n      tokenFactory: resolvedTokenFactory,\n      addresses,\n    });\n\n    const poolInitializerAddress: Address = (() => {\n      if (hasBeneficiaries) {\n        const lockableInitializer =\n          params.modules?.lockableV3Initializer ??\n          addresses.lockableV3Initializer;\n        if (!lockableInitializer || lockableInitializer === ZERO_ADDRESS) {\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      const standardInitializer =\n        params.modules?.v3Initializer ?? addresses.v3Initializer;\n      if (!standardInitializer || standardInitializer === ZERO_ADDRESS) {\n        throw new Error(\n          'UniswapV3Initializer address not configured on this chain. Use beneficiaries for lockable V3 support, provide an override via builder.withV3Initializer(...), or use a chain with standard V3 initializer support.',\n        );\n      }\n      return standardInitializer;\n    })();\n    const liquidityMigratorAddress = this.getMigratorAddress(\n      params.migration,\n      params.modules,\n    );\n    const includeProtocolBalanceLimitExclusions =\n      this.usesDefaultDopplerERC20V1Integration(params.modules);\n\n    // 3. Encode token parameters (standard vs Doppler404)\n    let tokenFactoryData: Hex | undefined = undefined;\n    let v1TokenFactoryData: DopplerERC20V1TokenFactoryData | undefined;\n    if (this.isDoppler404Token(params.token)) {\n      const token404 = params.token;\n      const baseURI = token404.baseURI;\n      const unit = token404.unit !== undefined ? BigInt(token404.unit) : WAD;\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 if (this.isDopplerERC20V1Token(params.token)) {\n      v1TokenFactoryData = this.resolveDopplerERC20V1TokenFactoryData({\n        token: params.token,\n        sale: params.sale,\n        vesting: params.vesting,\n        userAddress: params.userAddress,\n        addresses,\n        modules: params.modules,\n        protocolBalanceLimitExclusions: includeProtocolBalanceLimitExclusions\n          ? [\n              poolInitializerAddress,\n              liquidityMigratorAddress,\n              params.migration.type === 'uniswapV4'\n                ? (params.modules?.poolManager ?? addresses.poolManager)\n                : undefined,\n              ...this.resolveMigrationLockerBalanceLimitExclusions(\n                params.migration,\n                addresses,\n              ),\n              ...this.resolveGovernanceBalanceLimitExclusions(\n                params.governance,\n              ),\n            ]\n          : undefined,\n      });\n      tokenFactoryData =\n        this.encodeDopplerERC20V1TokenFactoryData(v1TokenFactoryData);\n    } else {\n      const standardTokenFactoryData = this.buildStandardTokenFactoryData({\n        token: params.token as StandardTokenConfig,\n        sale: params.sale,\n        vesting: params.vesting,\n        userAddress: params.userAddress,\n        airlock: params.modules?.airlock ?? addresses.airlock,\n        tokenFactory: resolvedTokenFactory,\n        addresses,\n      });\n      tokenFactoryData = this.encodeStandardTokenFactoryData(\n        standardTokenFactoryData,\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 = this.resolveGovernanceFactoryAddress({\n      governance: params.governance,\n      modules: params.modules,\n      addresses,\n      noOpError:\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      launchpadError:\n        'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n      standardError:\n        'Standard governance requested but governanceFactory is not deployed on this chain.',\n    });\n\n    if (!tokenFactoryData) {\n      throw new Error('Token factory data could not be resolved.');\n    }\n\n    // 5. Generate a unique salt\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: poolInitializerAddress,\n      poolInitializerData: poolInitializerData,\n      liquidityMigrator: liquidityMigratorAddress,\n      liquidityMigratorData: liquidityMigratorData,\n      integrator: params.integrator ?? ZERO_ADDRESS,\n    };\n\n    const minedCreateParams = await this.mineTokenOrder({\n      params,\n      baseCreateParams,\n      addresses,\n      v1TokenFactoryData,\n      includeProtocolBalanceLimitExclusions,\n    });\n\n    return minedCreateParams;\n  }\n\n  /**\n   * Simulate a static auction creation and return predicted addresses.\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      const bigTimestamp = BigInt(timestamp);\n      for (let i = 0; i < 8; i++) {\n        timestampBytes[i] = Number((bigTimestamp >> BigInt(i * 8)) & 0xffn);\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    v1TokenFactoryData?: DopplerERC20V1TokenFactoryData;\n    includeProtocolBalanceLimitExclusions?: boolean;\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      let createParams = { ...baseCreateParams, salt } as CreateParams;\n\n      if (\n        args.v1TokenFactoryData &&\n        args.includeProtocolBalanceLimitExclusions &&\n        this.isDopplerERC20V1BalanceLimitActive(args.v1TokenFactoryData)\n      ) {\n        const tokenAddress = this.predictDopplerERC20V1TokenAddress({\n          tokenFactory: baseCreateParams.tokenFactory,\n          salt,\n          implementation: args.v1TokenFactoryData.implementation,\n        });\n        const tokenFactoryData = this.withDopplerERC20V1BalanceLimitExclusions(\n          args.v1TokenFactoryData,\n          [\n            this.resolveStaticV3PoolExclusion({\n              addresses,\n              tokenAddress,\n              numeraire: params.sale.numeraire,\n              fee: params.pool.fee,\n            }),\n            this.resolveUniswapV2MigrationPairExclusion({\n              migration: params.migration,\n              addresses,\n              tokenAddress,\n              numeraire: params.sale.numeraire,\n            }),\n          ],\n        );\n        createParams = {\n          ...createParams,\n          tokenFactoryData:\n            this.encodeDopplerERC20V1TokenFactoryData(tokenFactoryData),\n        };\n      }\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      const isToken0 = BigInt(tokenAddress) < numeraireBigInt;\n      const wantToken0 = isToken0Expected(params.sale.numeraire);\n      if ((wantToken0 && isToken0) || (!wantToken0 && !isToken0)) {\n        return this.withSimulationGovernanceTimelockExclusion({\n          createParams,\n          simResult,\n          token: params.token,\n          governance: params.governance,\n          modules: params.modules,\n          addresses,\n        });\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    this.assertDoppler404Compatibility({\n      token: params.token,\n      vesting: params.vesting,\n      configuredFactory: addresses.doppler404Factory,\n    });\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    const resolvedTokenFactoryDyn: Address | undefined =\n      params.modules?.tokenFactory ??\n      (this.isDoppler404Token(params.token)\n        ? (addresses.doppler404Factory as Address | undefined)\n        : this.isDopplerERC20V1Token(params.token)\n          ? (params.modules?.dopplerERC20V1Factory ??\n            addresses.dopplerERC20V1Factory)\n          : this.usesDerc20V2Vesting(params.vesting)\n            ? addresses.derc20V2Factory\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    this.assertStandardTokenFactoryCompatibility({\n      token: params.token,\n      vesting: params.vesting,\n      tokenFactory: resolvedTokenFactoryDyn,\n      addresses,\n    });\n\n    const poolInitializerAddress =\n      params.modules?.v4Initializer ?? addresses.v4Initializer;\n    if (!poolInitializerAddress || poolInitializerAddress === ZERO_ADDRESS) {\n      throw new Error(\n        'UniswapV4Initializer address not configured on this chain. Provide an override via builder.withV4Initializer(...) or use a chain with dynamic auction support.',\n      );\n    }\n    const liquidityMigratorAddress = this.getMigratorAddress(\n      params.migration,\n      params.modules,\n    );\n    const includeProtocolBalanceLimitExclusions =\n      this.usesDefaultDopplerERC20V1Integration(params.modules);\n\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) : WAD,\n          };\n        })()\n      : this.isDopplerERC20V1Token(params.token)\n        ? this.resolveDopplerERC20V1TokenFactoryData({\n            token: params.token,\n            sale: params.sale,\n            vesting: params.vesting,\n            userAddress: params.userAddress,\n            addresses,\n            modules: params.modules,\n            protocolBalanceLimitExclusions:\n              includeProtocolBalanceLimitExclusions\n                ? [\n                    poolInitializerAddress,\n                    params.modules?.poolManager ?? addresses.poolManager,\n                    liquidityMigratorAddress,\n                    ...this.resolveMigrationLockerBalanceLimitExclusions(\n                      params.migration,\n                      addresses,\n                    ),\n                    ...this.resolveGovernanceBalanceLimitExclusions(\n                      params.governance,\n                    ),\n                  ]\n                : undefined,\n          })\n        : this.buildStandardTokenFactoryData({\n            token: params.token as StandardTokenConfig,\n            sale: params.sale,\n            vesting: params.vesting,\n            userAddress: params.userAddress,\n            airlock: params.modules?.airlock ?? addresses.airlock,\n            tokenFactory: resolvedTokenFactoryDyn,\n            addresses,\n          });\n\n    // 5. Mine hook address with appropriate flags\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: poolInitializerAddress,\n      poolInitializerData: dopplerData,\n      tokenVariant: this.isDoppler404Token(params.token)\n        ? 'doppler404'\n        : this.isDopplerERC20V1Token(params.token)\n          ? 'dopplerERC20V1'\n          : 'standard',\n      migration: params.migration,\n      addresses,\n      includeProtocolBalanceLimitExclusions,\n    });\n\n    // 6. Encode migration data\n    const liquidityMigratorData = this.encodeMigrationData(params.migration, {\n      numeraire: params.sale.numeraire,\n      overrides: params.modules,\n    });\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 = this.resolveGovernanceFactoryAddress({\n      governance: params.governance,\n      modules: params.modules,\n      addresses,\n      noOpError:\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      launchpadError:\n        'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n      standardError:\n        'Standard governance requested but governanceFactory is not deployed on this chain.',\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: poolInitializerAddress,\n      poolInitializerData: poolInitializerData,\n      liquidityMigrator: liquidityMigratorAddress,\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, 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    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    const createParamsWithTimelock =\n      this.withSimulationGovernanceTimelockExclusion({\n        createParams,\n        simResult,\n        token: params.token,\n        governance: params.governance,\n        modules: params.modules,\n        addresses,\n      });\n\n    return {\n      createParams: createParamsWithTimelock,\n      hookAddress,\n      tokenAddress,\n      poolId,\n      gasEstimate,\n      execute: () =>\n        this.createDynamicAuction(params, {\n          _createParams: createParamsWithTimelock,\n        }),\n    };\n  }\n\n  async encodeCreateOpeningAuctionParams(\n    params: CreateOpeningAuctionParams<C>,\n  ): Promise<{\n    createParams: CreateParams;\n    hookAddress: Address;\n    tokenAddress: Address;\n    minedSalt: Hash;\n  }> {\n    this.validateOpeningAuctionParams(params);\n    const addresses = getAddresses(this.chainId);\n    this.assertDoppler404Compatibility({\n      token: params.token,\n      vesting: params.vesting,\n      configuredFactory: addresses.doppler404Factory,\n    });\n\n    const openingAuctionInitializer =\n      this.resolveOpeningAuctionInitializerAddress(params.modules, addresses);\n\n    const [poolManagerForAuction, auctionDeployer] = await Promise.all([\n      (this.publicClient as PublicClient).readContract({\n        address: openingAuctionInitializer,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'poolManager',\n      }) as Promise<Address>,\n      (this.publicClient as PublicClient).readContract({\n        address: openingAuctionInitializer,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'auctionDeployer',\n      }) as Promise<Address>,\n    ]);\n\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    const startOffset =\n      params.startTimeOffset ?? params.doppler.startTimeOffset ?? 30;\n    const startTime =\n      params.startingTime ??\n      params.doppler.startingTime ??\n      blockTimestamp + startOffset;\n    const endTime = startTime + params.doppler.duration;\n\n    const isToken0 = isToken0Expected(params.sale.numeraire);\n    const gamma =\n      params.doppler.gamma ??\n      computeOptimalGamma(\n        params.doppler.startTick,\n        params.doppler.endTick,\n        params.doppler.duration,\n        params.doppler.epochLength,\n        params.doppler.tickSpacing,\n      );\n\n    const dopplerData = 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        params.doppler.minProceeds,\n        params.doppler.maxProceeds,\n        BigInt(startTime),\n        BigInt(endTime),\n        params.doppler.startTick,\n        params.doppler.endTick,\n        BigInt(params.doppler.epochLength),\n        gamma,\n        isToken0,\n        BigInt(params.doppler.numPdSlugs ?? DEFAULT_PD_SLUGS),\n        params.doppler.fee,\n        params.doppler.tickSpacing,\n      ],\n    );\n\n    const poolInitializerData = encodeAbiParameters(\n      [\n        {\n          type: 'tuple',\n          components: [\n            {\n              name: 'auctionConfig',\n              type: 'tuple',\n              components: [\n                { name: 'auctionDuration', type: 'uint256' },\n                { name: 'minAcceptableTickToken0', type: 'int24' },\n                { name: 'minAcceptableTickToken1', type: 'int24' },\n                { name: 'incentiveShareBps', type: 'uint256' },\n                { name: 'tickSpacing', type: 'int24' },\n                { name: 'fee', type: 'uint24' },\n                { name: 'minLiquidity', type: 'uint128' },\n                { name: 'shareToAuctionBps', type: 'uint256' },\n              ],\n            },\n            { name: 'dopplerData', type: 'bytes' },\n          ],\n        },\n      ],\n      [\n        {\n          auctionConfig: {\n            auctionDuration: BigInt(params.openingAuction.auctionDuration),\n            minAcceptableTickToken0:\n              params.openingAuction.minAcceptableTickToken0,\n            minAcceptableTickToken1:\n              params.openingAuction.minAcceptableTickToken1,\n            incentiveShareBps: BigInt(params.openingAuction.incentiveShareBps),\n            tickSpacing: params.openingAuction.tickSpacing,\n            fee: params.openingAuction.fee,\n            minLiquidity: params.openingAuction.minLiquidity,\n            shareToAuctionBps: BigInt(params.openingAuction.shareToAuctionBps),\n          },\n          dopplerData,\n        },\n      ],\n    );\n\n    const resolvedTokenFactory: Address | undefined =\n      params.modules?.tokenFactory ??\n      (this.isDoppler404Token(params.token)\n        ? (addresses.doppler404Factory as Address | undefined)\n        : this.isDopplerERC20V1Token(params.token)\n          ? (params.modules?.dopplerERC20V1Factory ??\n            addresses.dopplerERC20V1Factory)\n          : this.usesDerc20V2Vesting(params.vesting)\n            ? addresses.derc20V2Factory\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    this.assertStandardTokenFactoryCompatibility({\n      token: params.token,\n      vesting: params.vesting,\n      tokenFactory: resolvedTokenFactory,\n      addresses,\n    });\n\n    const liquidityMigratorAddress = this.getMigratorAddress(\n      params.migration,\n      params.modules,\n    );\n    const includeProtocolBalanceLimitExclusions =\n      this.usesDefaultDopplerERC20V1Integration(params.modules);\n\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) : WAD,\n          };\n        })()\n      : this.isDopplerERC20V1Token(params.token)\n        ? this.resolveDopplerERC20V1TokenFactoryData({\n            token: params.token,\n            sale: params.sale,\n            vesting: params.vesting,\n            userAddress: params.userAddress,\n            addresses,\n            modules: params.modules,\n            protocolBalanceLimitExclusions:\n              includeProtocolBalanceLimitExclusions\n                ? [\n                    openingAuctionInitializer,\n                    poolManagerForAuction,\n                    auctionDeployer,\n                    liquidityMigratorAddress,\n                    ...this.resolveMigrationLockerBalanceLimitExclusions(\n                      params.migration,\n                      addresses,\n                    ),\n                    ...this.resolveGovernanceBalanceLimitExclusions(\n                      params.governance,\n                    ),\n                  ]\n                : undefined,\n          })\n        : this.buildStandardTokenFactoryData({\n            token: params.token as StandardTokenConfig,\n            sale: params.sale,\n            vesting: params.vesting,\n            userAddress: params.userAddress,\n            airlock: params.modules?.airlock ?? addresses.airlock,\n            tokenFactory: resolvedTokenFactory,\n            addresses,\n          });\n\n    const auctionTokens =\n      (params.sale.numTokensToSell *\n        BigInt(params.openingAuction.shareToAuctionBps)) /\n      10_000n;\n    if (auctionTokens <= 0n) {\n      throw new Error('Opening auction token allocation rounds to zero');\n    }\n\n    const [salt, hookAddress, tokenAddress, encodedTokenFactoryData] =\n      this.mineOpeningAuctionHookAddress({\n        auctionDeployer,\n        openingAuctionInitializer,\n        poolManager: poolManagerForAuction,\n        auctionTokens,\n        openingAuctionConfig: params.openingAuction,\n        numeraire: params.sale.numeraire,\n        tokenFactory: resolvedTokenFactory,\n        tokenFactoryData,\n        airlock: params.modules?.airlock ?? addresses.airlock,\n        initialSupply: params.sale.initialSupply,\n        tokenVariant: this.isDoppler404Token(params.token)\n          ? 'doppler404'\n          : this.isDopplerERC20V1Token(params.token)\n            ? 'dopplerERC20V1'\n            : 'standard',\n        migration: params.migration,\n        addresses,\n        includeProtocolBalanceLimitExclusions,\n      });\n\n    const liquidityMigratorData = this.encodeMigrationData(params.migration, {\n      numeraire: params.sale.numeraire,\n      overrides: params.modules,\n    });\n\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    const governanceFactoryAddress = this.resolveGovernanceFactoryAddress({\n      governance: params.governance,\n      modules: params.modules,\n      addresses,\n      noOpError:\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      launchpadError:\n        'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n      standardError:\n        'Standard governance requested but governanceFactory is not deployed on this chain.',\n    });\n\n    if (!tokenFactoryData) {\n      throw new Error('Token factory data could not be 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: encodedTokenFactoryData,\n      governanceFactory: governanceFactoryAddress,\n      governanceFactoryData,\n      poolInitializer: openingAuctionInitializer,\n      poolInitializerData,\n      liquidityMigrator: liquidityMigratorAddress,\n      liquidityMigratorData,\n      integrator: params.integrator ?? ZERO_ADDRESS,\n      salt,\n    };\n\n    return {\n      createParams,\n      hookAddress,\n      tokenAddress,\n      minedSalt: salt,\n    };\n  }\n\n  async simulateCreateOpeningAuction(\n    params: CreateOpeningAuctionParams<C>,\n  ): Promise<{\n    createParams: CreateParams;\n    openingAuctionHookAddress: Address;\n    tokenAddress: Address;\n    minedSalt: Hash;\n    gasEstimate?: bigint;\n    execute: () => Promise<OpeningAuctionCreateResult>;\n  }> {\n    const { createParams, minedSalt } =\n      await this.encodeCreateOpeningAuctionParams(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 opening auction create');\n    }\n\n    const createParamsWithTimelock =\n      this.withSimulationGovernanceTimelockExclusion({\n        createParams,\n        simResult,\n        token: params.token,\n        governance: params.governance,\n        modules: params.modules,\n        addresses,\n      });\n\n    return {\n      createParams: createParamsWithTimelock,\n      openingAuctionHookAddress: simResult[1] as Address,\n      tokenAddress: simResult[0] as Address,\n      minedSalt,\n      gasEstimate,\n      execute: () =>\n        this.createOpeningAuction(params, {\n          _createParams: createParamsWithTimelock,\n          _minedSalt: minedSalt,\n        }),\n    };\n  }\n\n  async createOpeningAuction(\n    params: CreateOpeningAuctionParams<C>,\n    options?: { _createParams?: CreateParams; _minedSalt?: Hash },\n  ): Promise<OpeningAuctionCreateResult> {\n    const addresses = getAddresses(this.chainId);\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    let createParams = options?._createParams;\n    let minedSalt = options?._minedSalt;\n    if (!createParams || !minedSalt) {\n      const simulation = await this.simulateCreateOpeningAuction(params);\n      createParams = simulation.createParams;\n      minedSalt = simulation.minedSalt;\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    const receipt = await (\n      this.publicClient as PublicClient\n    ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n    const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n    if (!actualAddresses) {\n      throw new Error(\n        'Failed to extract addresses from Create event in transaction logs',\n      );\n    }\n\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 (\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        simulatedHook.toLowerCase() !==\n        actualAddresses.poolOrHookAddress.toLowerCase()\n      ) {\n        console.warn(\n          `[DopplerSDK] Simulation predicted opening hook ${simulatedHook} 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      openingAuctionHookAddress: actualAddresses.poolOrHookAddress,\n      transactionHash: hash,\n      createParams,\n      minedSalt,\n    };\n  }\n\n  async simulateCompleteOpeningAuction(args: {\n    asset: Address;\n    initializerAddress?: Address;\n    dopplerSalt?: Hash;\n    blockTimestamp?: number;\n  }): Promise<{\n    asset: Address;\n    dopplerSalt: Hash;\n    dopplerHookAddress: Address;\n    gasEstimate?: bigint;\n    execute: () => Promise<OpeningAuctionCompleteResult>;\n  }> {\n    const initializerAddress = args.initializerAddress\n      ? args.initializerAddress\n      : this.resolveOpeningAuctionInitializerAddress();\n\n    const autoMined = args.dopplerSalt === undefined;\n    const deterministic = args.blockTimestamp !== undefined;\n    const maxAttempts =\n      autoMined && !deterministic ? MAX_COMPLETION_ATTEMPTS : 1;\n\n    let startSalt: bigint | undefined;\n    let lastError: unknown;\n    for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n      const stateRaw = await (this.publicClient as PublicClient).readContract({\n        address: initializerAddress,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'getState',\n        args: [args.asset],\n      });\n      const state = this.normalizeOpeningAuctionState(stateRaw);\n\n      const phase = await (this.publicClient as PublicClient).readContract({\n        address: state.openingAuctionHook,\n        abi: openingAuctionAbi,\n        functionName: 'phase',\n      });\n      if (Number(phase) !== OPENING_AUCTION_PHASE_SETTLED) {\n        throw new Error(\n          'Opening auction is not settled yet. Run settleAuction() first, then simulate completion.',\n        );\n      }\n\n      const completion =\n        args.dopplerSalt !== undefined\n          ? {\n              dopplerSalt: args.dopplerSalt,\n              dopplerHookAddress: ZERO_ADDRESS,\n            }\n          : await this.mineDopplerCompletionSalt({\n              asset: args.asset,\n              initializerAddress,\n              state,\n              blockTimestamp: args.blockTimestamp,\n              startSalt,\n            });\n\n      try {\n        const { request } = await (\n          this.publicClient as PublicClient\n        ).simulateContract({\n          address: initializerAddress,\n          abi: openingAuctionInitializerAbi,\n          functionName: 'completeAuction',\n          args: [args.asset, completion.dopplerSalt],\n          account: this.walletClient?.account,\n        });\n\n        const gasEstimate =\n          request &&\n          typeof request === 'object' &&\n          'gas' in (request as Record<string, unknown>)\n            ? ((request as { gas?: bigint }).gas ?? undefined)\n            : undefined;\n\n        return {\n          asset: args.asset,\n          dopplerSalt: completion.dopplerSalt,\n          dopplerHookAddress: completion.dopplerHookAddress,\n          gasEstimate,\n          execute: () =>\n            this.completeOpeningAuction({\n              asset: args.asset,\n              initializerAddress,\n              ...(args.dopplerSalt !== undefined\n                ? { dopplerSalt: args.dopplerSalt }\n                : {}),\n              autoSettle: false,\n              blockTimestamp: args.blockTimestamp,\n            }),\n        };\n      } catch (err) {\n        lastError = err;\n        if (attempt >= maxAttempts) {\n          if (maxAttempts === 1) throw err;\n          break;\n        }\n        if (autoMined) startSalt = BigInt(completion.dopplerSalt) + 1n;\n      }\n    }\n\n    const lastMsg =\n      lastError instanceof Error ? lastError.message : String(lastError);\n    throw new Error(\n      `simulateCompleteOpeningAuction failed after ${maxAttempts} attempt${\n        maxAttempts === 1 ? '' : 's'\n      }: ${lastMsg}`,\n    );\n  }\n\n  async completeOpeningAuction(args: {\n    asset: Address;\n    initializerAddress?: Address;\n    dopplerSalt?: Hash;\n    autoSettle?: boolean;\n    blockTimestamp?: number;\n  }): Promise<OpeningAuctionCompleteResult> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const initializerAddress = args.initializerAddress\n      ? args.initializerAddress\n      : this.resolveOpeningAuctionInitializerAddress();\n\n    const stateRaw = await (this.publicClient as PublicClient).readContract({\n      address: initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'getState',\n      args: [args.asset],\n    });\n    const state = this.normalizeOpeningAuctionState(stateRaw);\n    if (state.status !== OPENING_AUCTION_STATUS_ACTIVE) {\n      throw new Error(\n        `Opening auction status is not active for ${args.asset}. Current status: ${state.status}.`,\n      );\n    }\n\n    const autoSettle = args.autoSettle ?? true;\n    const phase = await (this.publicClient as PublicClient).readContract({\n      address: state.openingAuctionHook,\n      abi: openingAuctionAbi,\n      functionName: 'phase',\n    });\n\n    if (autoSettle && Number(phase) !== OPENING_AUCTION_PHASE_SETTLED) {\n      const { request } = await (\n        this.publicClient as PublicClient\n      ).simulateContract({\n        address: state.openingAuctionHook,\n        abi: openingAuctionAbi,\n        functionName: 'settleAuction',\n        account: this.walletClient.account,\n      });\n      const settleTx = await this.walletClient.writeContract(request);\n      await (this.publicClient as PublicClient).waitForTransactionReceipt({\n        hash: settleTx,\n      });\n    }\n\n    const autoMined = args.dopplerSalt === undefined;\n    const deterministic = args.blockTimestamp !== undefined;\n    const maxAttempts =\n      autoMined && !deterministic ? MAX_COMPLETION_ATTEMPTS : 1;\n\n    let startSalt: bigint | undefined;\n    let lastError: unknown;\n    for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n      const stateRawAttempt = await (\n        this.publicClient as PublicClient\n      ).readContract({\n        address: initializerAddress,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'getState',\n        args: [args.asset],\n      });\n      const stateAttempt = this.normalizeOpeningAuctionState(stateRawAttempt);\n      if (stateAttempt.status !== OPENING_AUCTION_STATUS_ACTIVE) {\n        throw new Error(\n          `Opening auction status is not active for ${args.asset}. Current status: ${stateAttempt.status}.`,\n        );\n      }\n\n      const completion =\n        args.dopplerSalt !== undefined\n          ? {\n              dopplerSalt: args.dopplerSalt,\n              dopplerHookAddress: ZERO_ADDRESS,\n            }\n          : await this.mineDopplerCompletionSalt({\n              asset: args.asset,\n              initializerAddress,\n              state: stateAttempt,\n              blockTimestamp: args.blockTimestamp,\n              startSalt,\n            });\n\n      let request: unknown;\n      try {\n        ({ request } = await (\n          this.publicClient as PublicClient\n        ).simulateContract({\n          address: initializerAddress,\n          abi: openingAuctionInitializerAbi,\n          functionName: 'completeAuction',\n          args: [args.asset, completion.dopplerSalt],\n          account: this.walletClient.account,\n        }));\n      } catch (err) {\n        lastError = err;\n        if (attempt >= maxAttempts) {\n          if (maxAttempts === 1) throw err;\n          break;\n        }\n        if (autoMined) startSalt = BigInt(completion.dopplerSalt) + 1n;\n        continue;\n      }\n\n      const txHash = await this.walletClient.writeContract(request as any);\n      const receipt = await (\n        this.publicClient as PublicClient\n      ).waitForTransactionReceipt({\n        hash: txHash,\n        confirmations: 2,\n      });\n      if (receipt.status === 'reverted') {\n        const receiptError = new Error(\n          `completeAuction transaction reverted (hash: ${txHash})`,\n        );\n        lastError = receiptError;\n        if (attempt >= maxAttempts) {\n          if (maxAttempts === 1) throw receiptError;\n          break;\n        }\n        if (autoMined) startSalt = BigInt(completion.dopplerSalt) + 1n;\n        continue;\n      }\n\n      const dopplerHookAddress = await (\n        this.publicClient as PublicClient\n      ).readContract({\n        address: initializerAddress,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'getDopplerHook',\n        args: [args.asset],\n      });\n\n      const finalHookAddress =\n        dopplerHookAddress === ZERO_ADDRESS\n          ? completion.dopplerHookAddress\n          : dopplerHookAddress;\n\n      if (finalHookAddress === ZERO_ADDRESS) {\n        throw new Error(\n          'Unable to determine dopplerHookAddress after completeAuction. The on-chain getDopplerHook returned zero. Try calling getDopplerHook manually after the transaction confirms.',\n        );\n      }\n\n      return {\n        asset: args.asset,\n        dopplerHookAddress: finalHookAddress,\n        transactionHash: txHash,\n        dopplerSalt: completion.dopplerSalt,\n      };\n    }\n\n    const lastMsg =\n      lastError instanceof Error ? lastError.message : String(lastError);\n    throw new Error(\n      `completeOpeningAuction failed after ${maxAttempts} attempt${\n        maxAttempts === 1 ? '' : 's'\n      }: ${lastMsg}`,\n    );\n  }\n\n  async simulateRecoverOpeningAuctionIncentives(args: {\n    asset: Address;\n    initializerAddress?: Address;\n    account?: Address | Account;\n  }): Promise<{ request: unknown }> {\n    const initializerAddress = args.initializerAddress\n      ? args.initializerAddress\n      : this.resolveOpeningAuctionInitializerAddress();\n\n    const { request } = await (\n      this.publicClient as PublicClient\n    ).simulateContract({\n      address: initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'recoverOpeningAuctionIncentives',\n      args: [args.asset],\n      account: args.account ?? this.walletClient?.account,\n    });\n    return { request };\n  }\n\n  async recoverOpeningAuctionIncentives(args: {\n    asset: Address;\n    initializerAddress?: Address;\n  }): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n    const simulation = await this.simulateRecoverOpeningAuctionIncentives({\n      ...args,\n      account: this.walletClient.account,\n    });\n    return this.walletClient.writeContract(simulation.request as any);\n  }\n\n  async simulateSweepOpeningAuctionIncentives(args: {\n    asset: Address;\n    initializerAddress?: Address;\n    account?: Address | Account;\n  }): Promise<{ request: unknown }> {\n    const initializerAddress = args.initializerAddress\n      ? args.initializerAddress\n      : this.resolveOpeningAuctionInitializerAddress();\n\n    const { request } = await (\n      this.publicClient as PublicClient\n    ).simulateContract({\n      address: initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'sweepOpeningAuctionIncentives',\n      args: [args.asset],\n      account: args.account ?? this.walletClient?.account,\n    });\n    return { request };\n  }\n\n  async sweepOpeningAuctionIncentives(args: {\n    asset: Address;\n    initializerAddress?: Address;\n  }): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n    const simulation = await this.simulateSweepOpeningAuctionIncentives({\n      ...args,\n      account: this.walletClient.account,\n    });\n    return this.walletClient.writeContract(simulation.request as any);\n  }\n\n  private resolveOpeningAuctionInitializerAddress(\n    modules?: ModuleAddressOverrides,\n    chainAddresses?: ReturnType<typeof getAddresses>,\n  ): Address {\n    const addresses = chainAddresses ?? getAddresses(this.chainId);\n    const resolved =\n      modules?.openingAuctionInitializer ??\n      addresses.openingAuctionInitializer ??\n      ZERO_ADDRESS;\n    if (!resolved || resolved === ZERO_ADDRESS) {\n      throw new Error(\n        'OpeningAuctionInitializer address not configured. Provide modules.openingAuctionInitializer or configure chain addresses.',\n      );\n    }\n    return resolved;\n  }\n\n  private normalizeOpeningAuctionState(raw: unknown): OpeningAuctionState {\n    if (Array.isArray(raw)) {\n      const [\n        numeraire,\n        auctionStartTime,\n        auctionEndTime,\n        auctionTokens,\n        dopplerTokens,\n        status,\n        openingAuctionHook,\n        dopplerHook,\n        openingAuctionPoolKey,\n        dopplerInitData,\n        isToken0,\n      ] = raw as [\n        Address,\n        bigint,\n        bigint,\n        bigint,\n        bigint,\n        number,\n        Address,\n        Address,\n        unknown,\n        `0x${string}`,\n        boolean,\n      ];\n\n      return {\n        numeraire,\n        auctionStartTime,\n        auctionEndTime,\n        auctionTokens,\n        dopplerTokens,\n        status,\n        openingAuctionHook,\n        dopplerHook,\n        openingAuctionPoolKey: this.normalizePoolKey(openingAuctionPoolKey),\n        dopplerInitData,\n        isToken0,\n      };\n    }\n\n    const value = raw as Record<string, unknown>;\n    return {\n      numeraire: value.numeraire as Address,\n      auctionStartTime: value.auctionStartTime as bigint,\n      auctionEndTime: value.auctionEndTime as bigint,\n      auctionTokens: value.auctionTokens as bigint,\n      dopplerTokens: value.dopplerTokens as bigint,\n      status: Number(value.status),\n      openingAuctionHook: value.openingAuctionHook as Address,\n      dopplerHook: value.dopplerHook as Address,\n      openingAuctionPoolKey: this.normalizePoolKey(value.openingAuctionPoolKey),\n      dopplerInitData: value.dopplerInitData as `0x${string}`,\n      isToken0: Boolean(value.isToken0),\n    };\n  }\n\n  private decodeDopplerInitData(dopplerData: `0x${string}`): {\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    isToken0: boolean;\n    numPDSlugs: bigint;\n    lpFee: number;\n    tickSpacing: number;\n  } {\n    const decoded = decodeAbiParameters(\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      dopplerData,\n    );\n\n    return {\n      minimumProceeds: decoded[0],\n      maximumProceeds: decoded[1],\n      startingTime: decoded[2],\n      endingTime: decoded[3],\n      startingTick: Number(decoded[4]),\n      endingTick: Number(decoded[5]),\n      epochLength: decoded[6],\n      gamma: Number(decoded[7]),\n      isToken0: decoded[8],\n      numPDSlugs: decoded[9],\n      lpFee: Number(decoded[10]),\n      tickSpacing: Number(decoded[11]),\n    };\n  }\n\n  private encodeDopplerInitData(data: {\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    isToken0: boolean;\n    numPDSlugs: bigint;\n    lpFee: number;\n    tickSpacing: number;\n  }): Hex {\n    return 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        data.minimumProceeds,\n        data.maximumProceeds,\n        data.startingTime,\n        data.endingTime,\n        data.startingTick,\n        data.endingTick,\n        data.epochLength,\n        data.gamma,\n        data.isToken0,\n        data.numPDSlugs,\n        data.lpFee,\n        data.tickSpacing,\n      ],\n    );\n  }\n\n  private alignTickTowardZero(tick: number, tickSpacing: number): number {\n    return tick - (tick % tickSpacing);\n  }\n\n  private alignTickForDirection(\n    isToken0: boolean,\n    tick: number,\n    tickSpacing: number,\n  ): number {\n    if (isToken0) {\n      return tick < 0\n        ? Math.trunc((tick - tickSpacing + 1) / tickSpacing) * tickSpacing\n        : Math.trunc(tick / tickSpacing) * tickSpacing;\n    }\n\n    return tick < 0\n      ? Math.trunc(tick / tickSpacing) * tickSpacing\n      : Math.trunc((tick + tickSpacing - 1) / tickSpacing) * tickSpacing;\n  }\n\n  private async mineDopplerCompletionSalt(args: {\n    asset: Address;\n    initializerAddress: Address;\n    state: OpeningAuctionState;\n    blockTimestamp?: number;\n    startSalt?: bigint;\n  }): Promise<{ dopplerSalt: Hash; dopplerHookAddress: Address }> {\n    const [\n      phaseRaw,\n      clearingTickRaw,\n      incentiveTokensTotal,\n      totalIncentivesClaimed,\n    ] = await Promise.all([\n      (this.publicClient as PublicClient).readContract({\n        address: args.state.openingAuctionHook,\n        abi: openingAuctionAbi,\n        functionName: 'phase',\n      }),\n      (this.publicClient as PublicClient).readContract({\n        address: args.state.openingAuctionHook,\n        abi: openingAuctionAbi,\n        functionName: 'clearingTick',\n      }),\n      (this.publicClient as PublicClient).readContract({\n        address: args.state.openingAuctionHook,\n        abi: openingAuctionAbi,\n        functionName: 'incentiveTokensTotal',\n      }),\n      (this.publicClient as PublicClient).readContract({\n        address: args.state.openingAuctionHook,\n        abi: openingAuctionAbi,\n        functionName: 'totalIncentivesClaimed',\n      }),\n    ]);\n\n    if (Number(phaseRaw) !== OPENING_AUCTION_PHASE_SETTLED) {\n      throw new Error(\n        'Opening auction must be settled before completion mining',\n      );\n    }\n\n    const rawAssetBalance = await (\n      this.publicClient as PublicClient\n    ).readContract({\n      address: args.asset,\n      abi: erc20BalanceOfAbi,\n      functionName: 'balanceOf',\n      args: [args.state.openingAuctionHook],\n    });\n\n    const reservedIncentives =\n      totalIncentivesClaimed < incentiveTokensTotal\n        ? incentiveTokensTotal - totalIncentivesClaimed\n        : 0n;\n    const unsoldTokens =\n      rawAssetBalance > reservedIncentives\n        ? rawAssetBalance - reservedIncentives\n        : 0n;\n\n    const dopplerData = this.decodeDopplerInitData(args.state.dopplerInitData);\n    let alignedClearingTick = this.alignTickForDirection(\n      args.state.isToken0,\n      Number(clearingTickRaw),\n      dopplerData.tickSpacing,\n    );\n    const minAligned = this.alignTickTowardZero(\n      MIN_TICK,\n      dopplerData.tickSpacing,\n    );\n    const maxAligned = this.alignTickTowardZero(\n      MAX_TICK,\n      dopplerData.tickSpacing,\n    );\n    if (alignedClearingTick < minAligned) alignedClearingTick = minAligned;\n    if (alignedClearingTick > maxAligned) alignedClearingTick = maxAligned;\n\n    let blockTimestamp: number;\n    if (args.blockTimestamp !== undefined) {\n      blockTimestamp = args.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    const originalDuration = dopplerData.endingTime - dopplerData.startingTime;\n    let newStartingTime = dopplerData.startingTime;\n    let newEndingTime = dopplerData.endingTime;\n    if (BigInt(blockTimestamp) >= dopplerData.startingTime) {\n      newStartingTime = BigInt(blockTimestamp + 1);\n      newEndingTime = newStartingTime + originalDuration;\n    }\n\n    const modifiedDopplerData = this.encodeDopplerInitData({\n      ...dopplerData,\n      startingTime: newStartingTime,\n      endingTime: newEndingTime,\n      startingTick: alignedClearingTick,\n    });\n    const decodedModified = this.decodeDopplerInitData(\n      modifiedDopplerData as `0x${string}`,\n    );\n\n    const [poolManager, dopplerDeployer] = await Promise.all([\n      (this.publicClient as PublicClient).readContract({\n        address: args.initializerAddress,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'poolManager',\n      }) as Promise<Address>,\n      (this.publicClient as PublicClient).readContract({\n        address: args.initializerAddress,\n        abi: openingAuctionInitializerAbi,\n        functionName: 'dopplerDeployer',\n      }) as Promise<Address>,\n    ]);\n\n    let startSalt = args.startSalt ?? 0n;\n    while (startSalt < ONE_MILLION) {\n      const mined = this.mineDopplerHookSalt({\n        dopplerDeployer,\n        poolManager,\n        initializerAddress: args.initializerAddress,\n        unsoldTokens,\n        dopplerData: decodedModified,\n        startSalt,\n      });\n\n      const bytecode = await (this.publicClient as PublicClient).getBytecode({\n        address: mined.hookAddress,\n      });\n      if (!bytecode || bytecode === '0x') {\n        return {\n          dopplerSalt: mined.salt,\n          dopplerHookAddress: mined.hookAddress,\n        };\n      }\n      startSalt = BigInt(mined.salt) + 1n;\n    }\n\n    throw new Error('Could not find an unused Doppler completion salt');\n  }\n\n  private mineDopplerHookSalt(args: {\n    dopplerDeployer: Address;\n    poolManager: Address;\n    initializerAddress: Address;\n    unsoldTokens: bigint;\n    dopplerData: {\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      isToken0: boolean;\n      numPDSlugs: bigint;\n      lpFee: number;\n      tickSpacing: number;\n    };\n    startSalt?: bigint;\n  }): { salt: Hash; hookAddress: Address } {\n    const { dopplerData } = args;\n    const initHashData = 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        args.poolManager,\n        args.unsoldTokens,\n        dopplerData.minimumProceeds,\n        dopplerData.maximumProceeds,\n        dopplerData.startingTime,\n        dopplerData.endingTime,\n        dopplerData.startingTick,\n        dopplerData.endingTick,\n        dopplerData.epochLength,\n        dopplerData.gamma,\n        dopplerData.isToken0,\n        dopplerData.numPDSlugs,\n        args.initializerAddress,\n        dopplerData.lpFee,\n      ],\n    );\n\n    const initHash = keccak256(\n      encodePacked(['bytes', 'bytes'], [DopplerBytecode as Hex, initHashData]),\n    );\n    const hookBuffer = this.prepareCreate2Buffer(\n      args.dopplerDeployer,\n      initHash,\n    );\n\n    for (let salt = args.startSalt ?? 0n; salt < ONE_MILLION; salt++) {\n      this.updateSaltInBuffer(hookBuffer, salt);\n      const hookRaw = this.computeCreate2AddressFast(hookBuffer);\n      const hookBigInt = BigInt(hookRaw);\n      if ((hookBigInt & FLAG_MASK) !== DOPPLER_FLAGS) {\n        continue;\n      }\n\n      return {\n        salt: `0x${salt.toString(16).padStart(64, '0')}` as Hash,\n        hookAddress: getAddress(hookRaw) as Address,\n      };\n    }\n\n    throw new Error('Could not mine Doppler completion salt');\n  }\n\n  private mineOpeningAuctionHookAddress(params: {\n    auctionDeployer: Address;\n    openingAuctionInitializer: Address;\n    poolManager: Address;\n    auctionTokens: bigint;\n    openingAuctionConfig: CreateOpeningAuctionParams<C>['openingAuction'];\n    numeraire: Address;\n    tokenFactory: Address;\n    tokenFactoryData:\n      | {\n          name: string;\n          symbol: string;\n          baseURI: string;\n          unit?: bigint;\n        }\n      | DopplerERC20V1TokenFactoryData\n      | StandardTokenFactoryData;\n    airlock: Address;\n    initialSupply: bigint;\n    tokenVariant: TokenFactoryVariant;\n    migration?: MigrationConfig;\n    addresses?: ReturnType<typeof getAddresses>;\n    includeProtocolBalanceLimitExclusions?: boolean;\n  }): [Hash, Address, Address, Hex] {\n    const config = params.openingAuctionConfig;\n    const initHashData = encodeAbiParameters(\n      [\n        { type: 'address' },\n        { type: 'address' },\n        { type: 'uint256' },\n        {\n          type: 'tuple',\n          components: [\n            { type: 'uint256', name: 'auctionDuration' },\n            { type: 'int24', name: 'minAcceptableTickToken0' },\n            { type: 'int24', name: 'minAcceptableTickToken1' },\n            { type: 'uint256', name: 'incentiveShareBps' },\n            { type: 'int24', name: 'tickSpacing' },\n            { type: 'uint24', name: 'fee' },\n            { type: 'uint128', name: 'minLiquidity' },\n            { type: 'uint256', name: 'shareToAuctionBps' },\n          ],\n        },\n      ],\n      [\n        params.poolManager,\n        params.openingAuctionInitializer,\n        params.auctionTokens,\n        {\n          auctionDuration: BigInt(config.auctionDuration),\n          minAcceptableTickToken0: config.minAcceptableTickToken0,\n          minAcceptableTickToken1: config.minAcceptableTickToken1,\n          incentiveShareBps: BigInt(config.incentiveShareBps),\n          tickSpacing: config.tickSpacing,\n          fee: config.fee,\n          minLiquidity: config.minLiquidity,\n          shareToAuctionBps: BigInt(config.shareToAuctionBps),\n        },\n      ],\n    );\n\n    const hookInitHash = keccak256(\n      encodePacked(\n        ['bytes', 'bytes'],\n        [OpeningAuctionBytecode as Hex, initHashData],\n      ),\n    );\n\n    const encodedTokenFactoryData =\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 ?? WAD],\n            );\n          })()\n        : params.tokenVariant === 'dopplerERC20V1'\n          ? this.encodeDopplerERC20V1TokenFactoryData(\n              params.tokenFactoryData as DopplerERC20V1TokenFactoryData,\n            )\n          : this.encodeStandardTokenFactoryData(\n              params.tokenFactoryData as StandardTokenFactoryData,\n            );\n\n    let tokenInitHash: Hash;\n    if (params.tokenVariant === 'doppler404') {\n      const t = params.tokenFactoryData as {\n        name: string;\n        symbol: string;\n        baseURI: string;\n        unit?: bigint;\n      };\n      const initData = encodeAbiParameters(\n        [\n          { type: 'string' },\n          { type: 'string' },\n          { type: 'uint256' },\n          { type: 'address' },\n          { type: 'address' },\n          { type: 'string' },\n          { type: 'uint256' },\n        ],\n        [\n          t.name,\n          t.symbol,\n          params.initialSupply,\n          params.airlock,\n          params.airlock,\n          t.baseURI,\n          t.unit ?? WAD,\n        ],\n      );\n      tokenInitHash = keccak256(\n        encodePacked(\n          ['bytes', 'bytes'],\n          [\n            getDopplerDN404Bytecode(\n              params.addresses?.doppler404Factory ?? params.tokenFactory,\n            ),\n            initData,\n          ],\n        ),\n      );\n    } else if (params.tokenVariant === 'dopplerERC20V1') {\n      const tokenFactoryData =\n        params.tokenFactoryData as DopplerERC20V1TokenFactoryData;\n      tokenInitHash = this.computeSoladyCloneInitCodeHash(\n        tokenFactoryData.implementation,\n      );\n    } else {\n      tokenInitHash = this.computeStandardTokenInitHash(\n        params.tokenFactoryData as StandardTokenFactoryData,\n        params.tokenFactory,\n      );\n    }\n\n    const isToken0 = isToken0Expected(params.numeraire);\n    const numeraireBigInt = BigInt(params.numeraire);\n    const hookBuffer = this.prepareCreate2Buffer(\n      params.auctionDeployer,\n      hookInitHash,\n    );\n    const tokenBuffer = this.prepareCreate2Buffer(\n      params.tokenFactory,\n      tokenInitHash,\n    );\n\n    for (let salt = 0n; salt < ONE_MILLION; salt++) {\n      this.updateSaltInBuffer(hookBuffer, salt);\n      const hookRaw = this.computeCreate2AddressFast(hookBuffer);\n      if ((BigInt(hookRaw) & FLAG_MASK) !== OPENING_AUCTION_FLAGS) {\n        continue;\n      }\n\n      this.updateSaltInBuffer(tokenBuffer, salt);\n      const tokenRaw = this.computeCreate2AddressFast(tokenBuffer);\n      const tokenBigInt = BigInt(tokenRaw);\n      if (\n        (isToken0 && tokenBigInt < numeraireBigInt) ||\n        (!isToken0 && tokenBigInt > numeraireBigInt)\n      ) {\n        const hook = getAddress(hookRaw) as Address;\n        const v1TokenFactoryData =\n          params.tokenFactoryData as DopplerERC20V1TokenFactoryData;\n        const finalEncodedTokenFactoryData =\n          params.tokenVariant === 'dopplerERC20V1' &&\n          params.includeProtocolBalanceLimitExclusions &&\n          this.isDopplerERC20V1BalanceLimitActive(v1TokenFactoryData)\n            ? this.encodeDopplerERC20V1TokenFactoryData({\n                ...v1TokenFactoryData,\n                excludedFromBalanceLimit:\n                  this.mergeDopplerERC20V1BalanceLimitExclusions(\n                    v1TokenFactoryData.excludedFromBalanceLimit,\n                    [\n                      hook,\n                      params.migration && params.addresses\n                        ? this.resolveUniswapV2MigrationPairExclusion({\n                            migration: params.migration,\n                            addresses: params.addresses,\n                            tokenAddress: getAddress(tokenRaw) as Address,\n                            numeraire: params.numeraire,\n                          })\n                        : undefined,\n                    ],\n                  ),\n              })\n            : encodedTokenFactoryData;\n        return [\n          `0x${salt.toString(16).padStart(64, '0')}` as Hash,\n          hook,\n          getAddress(tokenRaw) as Address,\n          finalEncodedTokenFactoryData,\n        ];\n      }\n    }\n\n    throw new Error('Unable to mine opening auction salt');\n  }\n\n  private isCreateGasRevert(error: unknown): boolean {\n    if (\n      error instanceof ContractFunctionRevertedError ||\n      error instanceof ExecutionRevertedError\n    ) {\n      return true;\n    }\n    if (!(error instanceof BaseError)) return false;\n\n    return Boolean(\n      error.walk(\n        (cause) =>\n          cause instanceof ContractFunctionRevertedError ||\n          cause instanceof ExecutionRevertedError,\n      ),\n    );\n  }\n\n  private async resolveInternalCreateGasEstimate(args: {\n    request?: unknown;\n    address: Address;\n    createParams: CreateParams;\n    account?: Address | Account;\n  }): Promise<InternalCreateGasEstimate> {\n    const { request, address, createParams, account } = args;\n    let gasFromRequest: bigint | undefined;\n    if (\n      request &&\n      typeof request === 'object' &&\n      'gas' in request &&\n      typeof request.gas === 'bigint'\n    ) {\n      gasFromRequest = request.gas;\n    }\n\n    if (gasFromRequest !== undefined) {\n      return { status: 'estimated', gas: gasFromRequest };\n    }\n\n    try {\n      const gas = await (this.publicClient as PublicClient).estimateContractGas(\n        {\n          address,\n          abi: airlockAbi,\n          functionName: 'create',\n          args: [{ ...createParams }],\n          account,\n        },\n      );\n      return { status: 'estimated', gas };\n    } catch (error) {\n      return this.isCreateGasRevert(error)\n        ? { status: 'reverted', error }\n        : { status: 'unavailable' };\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 estimate = await this.resolveInternalCreateGasEstimate(args);\n    return estimate.status === 'estimated' ? estimate.gas : undefined;\n  }\n\n  private isDoppler404Token(\n    token: TokenConfig,\n  ): token is Doppler404TokenConfig {\n    return (token as Doppler404TokenConfig).type === 'doppler404';\n  }\n\n  private isDopplerERC20V1Token(\n    token: TokenConfig,\n  ): token is DopplerERC20V1TokenConfig | InferredDopplerERC20V1TokenConfig {\n    assertTokenConfigSupportsYearlyMintRate(token);\n    return token.type !== 'standard' && token.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(\n    config: MigrationConfig,\n    options?: {\n      numeraire?: Address;\n      overrides?: ModuleAddressOverrides;\n    },\n  ): Hex {\n    // Use custom encoder if available\n    if (this.customMigrationEncoder) {\n      return this.customMigrationEncoder(config);\n    }\n\n    if (\n      config.type === 'uniswapV2' &&\n      this.resolveUniswapV2Migrator(options?.overrides).isSplit\n    ) {\n      return encodeAbiParameters(\n        [{ type: 'address' }, { type: 'uint256' }],\n        [ZERO_ADDRESS, 0n],\n      );\n    }\n\n    switch (config.type) {\n      case 'uniswapV2':\n        // V2 migrator expects empty data\n        return '0x' as Hex;\n\n      case 'uniswapV2Split': {\n        const proceedsRecipient =\n          config.proceedsSplit?.recipient ?? ZERO_ADDRESS;\n        const proceedsShare = config.proceedsSplit?.share ?? 0n;\n\n        return encodeAbiParameters(\n          [{ type: 'address' }, { type: 'uint256' }],\n          [proceedsRecipient, proceedsShare],\n        );\n      }\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, sort by address ascending and reject duplicates (required by contract)\n        const beneficiaryData = sortBeneficiaries(streamableFees.beneficiaries);\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      case 'uniswapV4Split': {\n        const beneficiaryData = sortBeneficiaries(\n          config.streamableFees.beneficiaries,\n        );\n\n        const proceedsRecipient =\n          config.proceedsSplit?.recipient ?? ZERO_ADDRESS;\n        const proceedsShare = config.proceedsSplit?.share ?? 0n;\n\n        return encodeAbiParameters(\n          [\n            { type: 'uint24' },\n            { type: 'int24' },\n            { type: 'uint32' },\n            {\n              type: 'tuple[]',\n              components: [\n                { type: 'address', name: 'beneficiary' },\n                { type: 'uint96', name: 'shares' },\n              ],\n            },\n            { type: 'address' },\n            { type: 'uint256' },\n          ],\n          [\n            config.fee,\n            config.tickSpacing,\n            config.streamableFees.lockDuration,\n            beneficiaryData,\n            proceedsRecipient,\n            proceedsShare,\n          ],\n        );\n      }\n\n      case 'dopplerHook':\n      case 'dopplerHookMigrator': {\n        const dopplerHookMigratorConfig = config;\n\n        if (\n          dopplerHookMigratorConfig.hook &&\n          dopplerHookMigratorConfig.rehype\n        ) {\n          throw new Error(\n            'dopplerHookMigrator migration cannot set both hook and rehype config. Use exactly one hook mode.',\n          );\n        }\n\n        // Copy beneficiaries, sort by address ascending and reject duplicates (required by contract)\n        const beneficiaries = sortBeneficiaries(\n          dopplerHookMigratorConfig.beneficiaries,\n        );\n\n        let dopplerHookAddress: Address = ZERO_ADDRESS;\n        let onInitializationCalldata: Hex = '0x';\n\n        if (dopplerHookMigratorConfig.hook) {\n          dopplerHookAddress = dopplerHookMigratorConfig.hook.hookAddress;\n          onInitializationCalldata =\n            dopplerHookMigratorConfig.hook.onInitializationCalldata ?? '0x';\n        } else if (dopplerHookMigratorConfig.rehype) {\n          const addresses = getAddresses(this.chainId);\n          const resolvedRehypeHookAddress =\n            dopplerHookMigratorConfig.rehype.hookAddress ??\n            options?.overrides?.rehypeDopplerHookMigrator ??\n            addresses.rehypeDopplerHookMigrator;\n\n          if (!resolvedRehypeHookAddress) {\n            throw new Error(\n              'RehypeDopplerHookMigrator address not configured on this chain. Provide migration.rehype.hookAddress or override modules.rehypeDopplerHookMigrator.',\n            );\n          }\n\n          if (!options?.numeraire) {\n            throw new Error(\n              'numeraire is required to encode rehype dopplerHookMigrator migration data',\n            );\n          }\n\n          dopplerHookAddress = resolvedRehypeHookAddress;\n          onInitializationCalldata = encodeRehypeDopplerHookMigratorCalldata({\n            numeraire: options.numeraire,\n            config: dopplerHookMigratorConfig.rehype,\n          });\n        }\n\n        const proceedsRecipient =\n          dopplerHookMigratorConfig.proceedsSplit?.recipient ?? ZERO_ADDRESS;\n        const proceedsShare =\n          dopplerHookMigratorConfig.proceedsSplit?.share ?? 0n;\n\n        return encodeAbiParameters(\n          [\n            { type: 'uint24' },\n            { type: 'bool' },\n            { type: 'int24' },\n            { type: 'uint32' },\n            {\n              type: 'tuple[]',\n              components: [\n                { type: 'address', name: 'beneficiary' },\n                { type: 'uint96', name: 'shares' },\n              ],\n            },\n            { type: 'address' },\n            { type: 'bytes' },\n            { type: 'address' },\n            { type: 'uint256' },\n          ],\n          [\n            dopplerHookMigratorConfig.fee,\n            dopplerHookMigratorConfig.useDynamicFee ?? false,\n            dopplerHookMigratorConfig.tickSpacing,\n            dopplerHookMigratorConfig.lockDuration,\n            beneficiaries,\n            dopplerHookAddress,\n            onInitializationCalldata,\n            proceedsRecipient,\n            proceedsShare,\n          ],\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(value: number | bigint, label: string): number {\n    const normalized =\n      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 validateV4StreamableFeesConfig(\n    streamableFees: StreamableFeesConfig | undefined,\n    label: string,\n    required = false,\n  ): void {\n    if (!streamableFees) {\n      if (required) {\n        throw new Error(`${label} requires streamableFees configuration`);\n      }\n      return;\n    }\n\n    const beneficiaries = streamableFees.beneficiaries;\n    if (beneficiaries.length === 0) {\n      throw new Error(`At least one beneficiary is required for ${label}`);\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    for (const beneficiary of beneficiaries) {\n      if (beneficiary.shares <= 0n) {\n        throw new Error('Each beneficiary must have positive shares');\n      }\n    }\n\n    const lockDuration = Number(streamableFees.lockDuration);\n    if (!Number.isInteger(lockDuration) || lockDuration < 0) {\n      throw new Error(\n        `${label} lockDuration must be a non-negative integer number of seconds`,\n      );\n    }\n    if (lockDuration > 0xffffffff) {\n      throw new Error(`${label} lockDuration must fit within uint32`);\n    }\n  }\n\n  private validateProceedsSplitConfig(\n    proceedsSplit: ProceedsSplitConfig | undefined,\n    label: string,\n  ): void {\n    if (!proceedsSplit) return;\n\n    if (proceedsSplit.recipient === ZERO_ADDRESS) {\n      throw new Error(\n        `${label} proceeds split recipient cannot be zero address`,\n      );\n    }\n\n    if (proceedsSplit.share < 0n) {\n      throw new Error(`${label} proceeds split share cannot be negative`);\n    }\n\n    if (proceedsSplit.share > MAX_PROCEEDS_SPLIT_SHARE) {\n      throw new Error(\n        `${label} proceeds split share cannot exceed ${MAX_PROCEEDS_SPLIT_SHARE}`,\n      );\n    }\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 = { type: 'dopplerHook', hookConfig: legacyHook };\n      } else {\n        mode = { type: 'dopplerHook' };\n      }\n    } else {\n      switch (initializer.type) {\n        case 'dopplerHook':\n        case 'dopplerHookInitializer': {\n          if (hasLegacySchedule || hasLegacyHook) {\n            throw new Error(\n              \"Initializer type 'dopplerHookInitializer' cannot be combined with legacy schedule or RehypeDopplerHookInitializer configuration\",\n            );\n          }\n          mode = { type: 'dopplerHook' };\n          break;\n        }\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: 'dopplerHook', 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: 'dopplerHook' };\n      } else if (mode.type !== 'dopplerHook') {\n        throw new Error(\n          'modules.dopplerHookInitializer can only be used with the dopplerHookInitializer, 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      params.sale.numTokensToSell,\n    );\n\n    const addresses = getAddresses(this.chainId);\n    const resolvedBundler = params.devBuy\n      ? (params.modules?.bundler ?? addresses.bundler)\n      : undefined;\n    if (\n      params.devBuy &&\n      (!resolvedBundler || resolvedBundler === ZERO_ADDRESS)\n    ) {\n      throw new Error(\n        'Bundler address not configured on this chain. Override via builder.withBundler() or modules.bundler.',\n      );\n    }\n\n    // Pool initializer data: (fee, tickSpacing, farTick, curves[], beneficiaries[], dopplerHook, onInitializationCalldata, graduationCalldata)\n    const sortedBeneficiaries = sortBeneficiaries(\n      params.pool.beneficiaries ?? [],\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 === 'dopplerHook';\n    const normalizedRehypeHookConfig =\n      initializerMode.type === 'dopplerHook' && initializerMode.hookConfig\n        ? normalizeRehypeDopplerHookInitializerConfig(\n            initializerMode.hookConfig,\n          )\n        : undefined;\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 = normalizedRehypeHookConfig;\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        // Keep farTick strictly inside the global curve range so it remains\n        // reachable regardless of whether the mined token sorts as token0 or token1.\n        const allTickUppers = normalizedCurves.map((c) => c.tickUpper);\n        farTick = Math.max(...allTickUppers) - params.pool.tickSpacing;\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\n        onInitializationDopplerHookCalldata =\n          encodeRehypeDopplerHookInitializerData(\n            params.sale.numeraire,\n            hookConfig,\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    this.assertDoppler404Compatibility({\n      token: params.token,\n      vesting: params.vesting,\n      configuredFactory: addresses.doppler404Factory,\n    });\n\n    const resolvedTokenFactory: Address | undefined =\n      params.modules?.tokenFactory ??\n      (this.isDoppler404Token(params.token)\n        ? (addresses.doppler404Factory as Address | undefined)\n        : this.isDopplerERC20V1Token(params.token)\n          ? (params.modules?.dopplerERC20V1Factory ??\n            addresses.dopplerERC20V1Factory)\n          : this.usesDerc20V2Vesting(params.vesting)\n            ? addresses.derc20V2Factory\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    this.assertStandardTokenFactoryCompatibility({\n      token: params.token,\n      vesting: params.vesting,\n      tokenFactory: resolvedTokenFactory,\n      addresses,\n    });\n\n    // Token factory data (standard vs 404)\n    let tokenFactoryData: Hex | undefined = undefined;\n    if (this.isDoppler404Token(params.token)) {\n      const token404 = params.token;\n      const unit = token404.unit !== undefined ? BigInt(token404.unit) : WAD;\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 if (!this.isDopplerERC20V1Token(params.token)) {\n      const standardTokenFactoryData = this.buildStandardTokenFactoryData({\n        token: params.token as StandardTokenConfig,\n        sale: params.sale,\n        vesting: params.vesting,\n        userAddress: params.userAddress,\n        airlock: params.modules?.airlock ?? addresses.airlock,\n        tokenFactory: resolvedTokenFactory,\n        addresses,\n      });\n      tokenFactoryData = this.encodeStandardTokenFactoryData(\n        standardTokenFactoryData,\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 = params.salt ?? this.generateRandomSalt(params.userAddress);\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        numeraire: params.sale.numeraire,\n        overrides: params.modules,\n      });\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    if (this.isDopplerERC20V1Token(params.token)) {\n      const includeProtocolBalanceLimitExclusions =\n        this.usesDefaultDopplerERC20V1Integration(params.modules);\n      const resolvedV1TokenFactoryData =\n        this.resolveDopplerERC20V1TokenFactoryData({\n          token: params.token,\n          sale: params.sale,\n          vesting: params.vesting,\n          userAddress: params.userAddress,\n          addresses,\n          modules: params.modules,\n          protocolBalanceLimitExclusions: includeProtocolBalanceLimitExclusions\n            ? [\n                resolvedInitializer,\n                resolvedMigrator,\n                params.modules?.poolManager ?? addresses.poolManager,\n                ...this.resolveMigrationLockerBalanceLimitExclusions(\n                  params.migration,\n                  addresses,\n                ),\n                ...this.resolveGovernanceBalanceLimitExclusions(\n                  params.governance,\n                ),\n                ...(params.devBuy\n                  ? [\n                      params.devBuy.recipient,\n                      ...(params.devBuy.vesting.vestingDuration !== 0n &&\n                      resolvedBundler\n                        ? [resolvedBundler]\n                        : []),\n                    ]\n                  : []),\n              ]\n            : undefined,\n        });\n      const predictedTokenAddress = this.predictDopplerERC20V1TokenAddress({\n        tokenFactory: resolvedTokenFactory,\n        salt,\n        implementation: resolvedV1TokenFactoryData.implementation,\n      });\n      const finalV1TokenFactoryData = includeProtocolBalanceLimitExclusions\n        ? this.withDopplerERC20V1BalanceLimitExclusions(\n            resolvedV1TokenFactoryData,\n            [\n              this.resolveUniswapV2MigrationPairExclusion({\n                migration: params.migration,\n                addresses,\n                tokenAddress: predictedTokenAddress,\n                numeraire: params.sale.numeraire,\n              }),\n            ],\n          )\n        : resolvedV1TokenFactoryData;\n      tokenFactoryData = this.encodeDopplerERC20V1TokenFactoryData(\n        finalV1TokenFactoryData,\n      );\n    }\n\n    const governanceFactoryAddress = this.resolveGovernanceFactoryAddress({\n      governance: params.governance,\n      modules: params.modules,\n      addresses,\n      noOpError:\n        'No-op governance requested, but no-op governanceFactory is not configured on this chain.',\n      launchpadError:\n        'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain.',\n      standardError:\n        'Standard governance requested but governanceFactory is not deployed on this chain.',\n    });\n\n    if (!tokenFactoryData) {\n      throw new Error('Token factory data could not be 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  private resolveBundlerAddress(params: CreateMulticurveParams<C>): Address {\n    const bundler =\n      params.modules?.bundler ?? getAddresses(this.chainId).bundler;\n    if (!bundler || bundler === ZERO_ADDRESS) {\n      throw new Error(\n        'Bundler address not configured on this chain. Override via builder.withBundler() or modules.bundler.',\n      );\n    }\n    return bundler;\n  }\n\n  private async ensureDevBuyInitializerCompatibility(args: {\n    params: CreateMulticurveParams<C>;\n    bundler: Address;\n  }): Promise<void> {\n    const initializerMode = this.resolveMulticurveInitializerMode(args.params);\n    if (initializerMode.type !== 'dopplerHook') {\n      throw new Error(\n        'Dev buys require a DopplerHookInitializer or Rehype initializer',\n      );\n    }\n\n    const rehypeInitializer = initializerMode.hookConfig?.hookAddress;\n    if (!rehypeInitializer) return;\n\n    const configuredBundler = (await (\n      this.publicClient as PublicClient\n    ).readContract({\n      address: rehypeInitializer,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'bundler',\n    })) as Address;\n    if (configuredBundler.toLowerCase() !== args.bundler.toLowerCase()) {\n      throw new Error(\n        `Rehype initializer ${rehypeInitializer} is configured for Bundler ${configuredBundler}, not ${args.bundler}`,\n      );\n    }\n  }\n\n  private parseBundleSimulation(result: unknown): {\n    asset: Address;\n    poolKey: V4PoolKey;\n    governance: Address;\n    timelock: Address;\n    amountOut: bigint;\n  } {\n    const values = Array.isArray(result)\n      ? result\n      : result && typeof result === 'object'\n        ? [\n            (result as Record<string, unknown>).asset,\n            (result as Record<string, unknown>).poolKey,\n            (result as Record<string, unknown>).governance,\n            (result as Record<string, unknown>).timelock,\n            (result as Record<string, unknown>).amountOut,\n          ]\n        : [];\n    if (values.length < 5) {\n      throw new Error('Failed to simulate multicurve dev buy');\n    }\n    return {\n      asset: values[0] as Address,\n      poolKey: this.normalizePoolKey(values[1]),\n      governance: values[2] as Address,\n      timelock: values[3] as Address,\n      amountOut: values[4] as bigint,\n    };\n  }\n\n  private async resolveFinalMulticurveCreate(args: {\n    params: CreateMulticurveParams<C>;\n    simulationAccount?: Address | Account;\n    createParams?: CreateParams;\n  }) {\n    const { params, simulationAccount } = args;\n    const addresses = getAddresses(this.chainId);\n    const airlock = params.modules?.airlock ?? addresses.airlock;\n    const initialCreateParams =\n      args.createParams ?? this.encodeCreateMulticurveParams(params);\n\n    if (!params.devBuy) {\n      const initialSimulation = await (\n        this.publicClient as PublicClient\n      ).simulateContract({\n        address: airlock,\n        abi: airlockAbi,\n        functionName: 'create',\n        args: [{ ...initialCreateParams }],\n        account: simulationAccount,\n      });\n      const initialResult = initialSimulation.result as\n        | readonly unknown[]\n        | undefined;\n      if (\n        !initialResult ||\n        !Array.isArray(initialResult) ||\n        initialResult.length < 5\n      ) {\n        throw new Error('Failed to simulate multicurve create');\n      }\n\n      let createParams = initialCreateParams;\n      let request = initialSimulation.request;\n      let result = initialResult;\n      if (!args.createParams) {\n        const enrichedCreateParams =\n          this.withSimulationGovernanceTimelockExclusion({\n            createParams,\n            simResult: initialResult,\n            token: params.token,\n            governance: params.governance,\n            modules: params.modules,\n            addresses,\n          });\n        if (\n          enrichedCreateParams.tokenFactoryData !==\n          createParams.tokenFactoryData\n        ) {\n          createParams = enrichedCreateParams;\n          const finalSimulation = await (\n            this.publicClient as PublicClient\n          ).simulateContract({\n            address: airlock,\n            abi: airlockAbi,\n            functionName: 'create',\n            args: [{ ...createParams }],\n            account: simulationAccount,\n          });\n          const finalResult = finalSimulation.result as\n            | readonly unknown[]\n            | undefined;\n          if (\n            !finalResult ||\n            !Array.isArray(finalResult) ||\n            finalResult.length < 5\n          ) {\n            throw new Error('Failed to simulate enriched multicurve create');\n          }\n          request = finalSimulation.request;\n          result = finalResult;\n        }\n      }\n\n      const tokenAddress = result[0] as Address;\n      const poolIdentity = await this.computeMulticurvePoolIdentity(\n        params,\n        tokenAddress,\n      );\n      const prediction: MulticurveCreatePrediction = {\n        tokenAddress,\n        poolOrHookAddress: result[1] as Address,\n        governanceAddress: result[2] as Address,\n        timelockAddress: result[3] as Address,\n        migrationPoolAddress: result[4] as Address,\n        ...poolIdentity,\n      };\n      return { airlock, createParams, prediction, request };\n    }\n\n    this.validateMulticurveDevBuy(params.devBuy);\n    const bundler = this.resolveBundlerAddress(params);\n    await this.ensureDevBuyInitializerCompatibility({ params, bundler });\n\n    let createParams = initialCreateParams;\n    const initialBundleSimulation = await (\n      this.publicClient as PublicClient\n    ).simulateContract({\n      address: bundler,\n      abi: bundlerAbi,\n      functionName: 'simulateBundle',\n      args: [{ ...createParams }, params.devBuy.exactAmountIn],\n    });\n    let result = this.parseBundleSimulation(initialBundleSimulation.result);\n    if (!args.createParams) {\n      const enrichedCreateParams =\n        this.withSimulationGovernanceTimelockExclusion({\n          createParams,\n          simResult: [\n            result.asset,\n            result.poolKey.hooks,\n            result.governance,\n            result.timelock,\n            ZERO_ADDRESS,\n          ],\n          token: params.token,\n          governance: params.governance,\n          modules: params.modules,\n          addresses,\n        });\n      if (\n        enrichedCreateParams.tokenFactoryData !== createParams.tokenFactoryData\n      ) {\n        createParams = enrichedCreateParams;\n        const finalBundleSimulation = await (\n          this.publicClient as PublicClient\n        ).simulateContract({\n          address: bundler,\n          abi: bundlerAbi,\n          functionName: 'simulateBundle',\n          args: [{ ...createParams }, params.devBuy.exactAmountIn],\n        });\n        result = this.parseBundleSimulation(finalBundleSimulation.result);\n      }\n    }\n\n    const currency0 = result.poolKey.currency0.toLowerCase();\n    const currency1 = result.poolKey.currency1.toLowerCase();\n    const asset = result.asset.toLowerCase();\n    const numeraire = createParams.numeraire.toLowerCase();\n    if (\n      !(\n        (currency0 === asset && currency1 === numeraire) ||\n        (currency1 === asset && currency0 === numeraire)\n      )\n    ) {\n      throw new Error(\n        'Bundler simulation returned a pool key that does not contain the created asset and numeraire',\n      );\n    }\n    if (\n      result.poolKey.hooks.toLowerCase() !==\n      createParams.poolInitializer.toLowerCase()\n    ) {\n      throw new Error(\n        'Bundler simulation returned an unexpected pool initializer',\n      );\n    }\n\n    const prediction: MulticurveCreatePrediction = {\n      tokenAddress: result.asset,\n      poolOrHookAddress: result.asset,\n      governanceAddress: result.governance,\n      timelockAddress: result.timelock,\n      poolKey: result.poolKey,\n      poolId: this.computePoolId(result.poolKey) as Hex,\n      tokenIsCurrency0: currency0 === asset,\n    };\n    const devBuy: PreparedMulticurveDevBuy = {\n      ...params.devBuy,\n      vesting: { ...params.devBuy.vesting },\n      bundler,\n      simulatedAmountOut: result.amountOut,\n    };\n    return { airlock, bundler, createParams, prediction, devBuy };\n  }\n\n  private buildDevBuyTransaction(args: {\n    createParams: CreateParams;\n    devBuy: PreparedMulticurveDevBuy;\n  }): PreparedMulticurveCreate<C>['transaction'] {\n    return {\n      to: args.devBuy.bundler,\n      data: encodeFunctionData({\n        abi: bundlerAbi,\n        functionName: 'bundle',\n        args: [\n          { ...args.createParams },\n          { ...args.devBuy.vesting },\n          args.devBuy.exactAmountIn,\n          args.devBuy.recipient,\n        ],\n      }),\n      value:\n        args.createParams.numeraire === ZERO_ADDRESS\n          ? args.devBuy.exactAmountIn\n          : 0n,\n    };\n  }\n\n  private async readDevBuyAllowance(args: {\n    createParams: CreateParams;\n    account: Address;\n    bundler: Address;\n  }): Promise<bigint | undefined> {\n    if (args.createParams.numeraire === ZERO_ADDRESS) {\n      return undefined;\n    }\n    return (await (this.publicClient as PublicClient).readContract({\n      address: args.createParams.numeraire,\n      abi: erc20Abi,\n      functionName: 'allowance',\n      args: [args.account, args.bundler],\n    })) as bigint;\n  }\n\n  private async estimateDevBuyGas(args: {\n    createParams: CreateParams;\n    devBuy: PreparedMulticurveDevBuy;\n    account: Address | Account;\n  }): Promise<MulticurveCreateGasEstimate> {\n    try {\n      const gas = await (this.publicClient as PublicClient).estimateContractGas(\n        {\n          address: args.devBuy.bundler,\n          abi: bundlerAbi,\n          functionName: 'bundle',\n          args: [\n            { ...args.createParams },\n            { ...args.devBuy.vesting },\n            args.devBuy.exactAmountIn,\n            args.devBuy.recipient,\n          ],\n          account: args.account,\n          value:\n            args.createParams.numeraire === ZERO_ADDRESS\n              ? args.devBuy.exactAmountIn\n              : 0n,\n        },\n      );\n      return { status: 'estimated', gas };\n    } catch {\n      return { status: 'unavailable' };\n    }\n  }\n\n  async prepareCreateMulticurve(\n    params: CreateMulticurveParams<C>,\n    options: PrepareCreateMulticurveOptions,\n  ): Promise<PreparedMulticurveCreate<C>> {\n    const resolved = await this.resolveFinalMulticurveCreate({\n      params,\n      simulationAccount: options.account,\n    });\n    if (!resolved.devBuy) {\n      const internalGasEstimate = await this.resolveInternalCreateGasEstimate({\n        request: resolved.request,\n        address: resolved.airlock,\n        createParams: resolved.createParams,\n        account: options.account,\n      });\n      if (internalGasEstimate.status === 'reverted') {\n        throw internalGasEstimate.error;\n      }\n      return {\n        chainId: this.chainId,\n        account: options.account,\n        airlock: resolved.airlock,\n        createParams: resolved.createParams,\n        prediction: resolved.prediction,\n        transaction: {\n          to: resolved.airlock,\n          data: encodeFunctionData({\n            abi: airlockAbi,\n            functionName: 'create',\n            args: [{ ...resolved.createParams }],\n          }),\n          value: 0n,\n        },\n        gasEstimate: internalGasEstimate,\n      };\n    }\n\n    const allowance = await this.readDevBuyAllowance({\n      createParams: resolved.createParams,\n      account: options.account,\n      bundler: resolved.devBuy.bundler,\n    });\n    const approvalRequired =\n      allowance !== undefined && allowance < resolved.devBuy.exactAmountIn;\n    const approvalTransaction = approvalRequired\n      ? {\n          to: resolved.createParams.numeraire,\n          data: encodeFunctionData({\n            abi: erc20Abi,\n            functionName: 'approve',\n            args: [resolved.devBuy.bundler, resolved.devBuy.exactAmountIn],\n          }),\n          value: 0n,\n        }\n      : undefined;\n    const gasEstimate = approvalRequired\n      ? ({ status: 'unavailable' } as const)\n      : await this.estimateDevBuyGas({\n          createParams: resolved.createParams,\n          devBuy: resolved.devBuy,\n          account: options.account,\n        });\n    return {\n      chainId: this.chainId,\n      account: options.account,\n      airlock: resolved.airlock,\n      createParams: resolved.createParams,\n      prediction: resolved.prediction,\n      transaction: this.buildDevBuyTransaction({\n        createParams: resolved.createParams,\n        devBuy: resolved.devBuy,\n      }),\n      approvalTransaction,\n      devBuy: resolved.devBuy,\n      gasEstimate,\n    };\n  }\n\n  async simulateCreateMulticurve(\n    params: CreateMulticurveParams<C>,\n  ): Promise<SimulatedMulticurveCreate<C>> {\n    const paramsSnapshot = structuredClone(params);\n    const resolved = await this.resolveFinalMulticurveCreate({\n      params: paramsSnapshot,\n      simulationAccount: this.walletClient?.account,\n    });\n    const createParamsSnapshot = structuredClone(resolved.createParams);\n    let gasEstimate: bigint | undefined;\n    if (resolved.devBuy) {\n      const account = this.walletClient?.account ?? paramsSnapshot.userAddress;\n      const allowance = await this.readDevBuyAllowance({\n        createParams: resolved.createParams,\n        account:\n          typeof account === 'string' ? account : (account.address as Address),\n        bundler: resolved.devBuy.bundler,\n      });\n      if (\n        allowance === undefined ||\n        allowance >= resolved.devBuy.exactAmountIn\n      ) {\n        const estimate = await this.estimateDevBuyGas({\n          createParams: resolved.createParams,\n          devBuy: resolved.devBuy,\n          account,\n        });\n        gasEstimate =\n          estimate.status === 'estimated' ? estimate.gas : undefined;\n      }\n    } else {\n      gasEstimate = await this.resolveCreateGasEstimate({\n        request: resolved.request,\n        address: resolved.airlock,\n        createParams: resolved.createParams,\n        account: this.walletClient?.account ?? paramsSnapshot.userAddress,\n      });\n    }\n\n    return {\n      createParams: resolved.createParams,\n      tokenAddress: resolved.prediction.tokenAddress,\n      poolId: resolved.prediction.poolId,\n      gasEstimate,\n      devBuy: resolved.devBuy,\n      execute: () =>\n        this.createMulticurve(paramsSnapshot, {\n          _createParams: createParamsSnapshot,\n        }),\n    };\n  }\n\n  async createMulticurve(\n    params: CreateMulticurveParams<C>,\n    options?: { _createParams?: CreateParams },\n  ): Promise<MulticurveCreateResult> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const resolved = await this.resolveFinalMulticurveCreate({\n      params,\n      simulationAccount: this.walletClient.account,\n      createParams: options?._createParams,\n    });\n    let approvalTransactionHash: Hash | undefined;\n    let hash: Hash;\n\n    if (resolved.devBuy) {\n      const account = this.walletClient.account;\n      if (!account) {\n        throw new Error('Wallet account required for write operations');\n      }\n      const accountAddress =\n        typeof account === 'string' ? account : account.address;\n      const [allowance, balance] = await Promise.all([\n        this.readDevBuyAllowance({\n          createParams: resolved.createParams,\n          account: accountAddress,\n          bundler: resolved.devBuy.bundler,\n        }),\n        resolved.createParams.numeraire === ZERO_ADDRESS\n          ? undefined\n          : (this.publicClient as PublicClient).readContract({\n              address: resolved.createParams.numeraire,\n              abi: erc20Abi,\n              functionName: 'balanceOf',\n              args: [accountAddress],\n            }),\n      ]);\n      if (balance !== undefined && balance < resolved.devBuy.exactAmountIn) {\n        throw new Error(\n          `Insufficient ERC20 balance for dev buy: required ${resolved.devBuy.exactAmountIn}, available ${balance}`,\n        );\n      }\n      if (\n        allowance !== undefined &&\n        allowance < resolved.devBuy.exactAmountIn\n      ) {\n        const { request: approvalRequest, result: approvalSucceeded } = await (\n          this.publicClient as PublicClient\n        ).simulateContract({\n          address: resolved.createParams.numeraire,\n          abi: erc20Abi,\n          functionName: 'approve',\n          args: [resolved.devBuy.bundler, resolved.devBuy.exactAmountIn],\n          account,\n        });\n        if (approvalSucceeded !== true) {\n          throw new Error('Bundler approval simulation returned false');\n        }\n        approvalTransactionHash =\n          await this.walletClient.writeContract(approvalRequest);\n        const approvalReceipt = await (\n          this.publicClient as PublicClient\n        ).waitForTransactionReceipt({\n          hash: approvalTransactionHash,\n          confirmations: 2,\n        });\n        if (approvalReceipt.status !== 'success') {\n          throw new Error('Bundler approval transaction reverted');\n        }\n        const approvedAllowance = await this.readDevBuyAllowance({\n          createParams: resolved.createParams,\n          account: accountAddress,\n          bundler: resolved.devBuy.bundler,\n        });\n        if (\n          approvedAllowance === undefined ||\n          approvedAllowance < resolved.devBuy.exactAmountIn\n        ) {\n          throw new Error(\n            'Bundler approval transaction did not provide the required allowance',\n          );\n        }\n      }\n\n      const { request } = await (\n        this.publicClient as PublicClient\n      ).simulateContract({\n        address: resolved.devBuy.bundler,\n        abi: bundlerAbi,\n        functionName: 'bundle',\n        args: [\n          { ...resolved.createParams },\n          { ...resolved.devBuy.vesting },\n          resolved.devBuy.exactAmountIn,\n          resolved.devBuy.recipient,\n        ],\n        account,\n        value:\n          resolved.createParams.numeraire === ZERO_ADDRESS\n            ? resolved.devBuy.exactAmountIn\n            : 0n,\n      });\n      hash = await this.walletClient.writeContract(\n        params.gas === undefined ? request : { ...request, gas: params.gas },\n      );\n    } else {\n      const gasEstimate = await this.resolveCreateGasEstimate({\n        request: resolved.request,\n        address: resolved.airlock,\n        createParams: resolved.createParams,\n        account: this.walletClient.account,\n      });\n      const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n      hash = await this.walletClient.writeContract({\n        ...resolved.request,\n        gas,\n      });\n    }\n\n    const receipt = await (\n      this.publicClient as PublicClient\n    ).waitForTransactionReceipt({ hash, confirmations: 2 });\n    const account = this.walletClient.account;\n    if (!account) {\n      throw new Error('Wallet account required for receipt verification');\n    }\n    const accountAddress =\n      typeof account === 'string' ? account : account.address;\n    const transaction = resolved.devBuy\n      ? this.buildDevBuyTransaction({\n          createParams: resolved.createParams,\n          devBuy: resolved.devBuy,\n        })\n      : {\n          to: resolved.airlock,\n          data: encodeFunctionData({\n            abi: airlockAbi,\n            functionName: 'create',\n            args: [{ ...resolved.createParams }],\n          }),\n          value: 0n,\n        };\n    const prepared: PreparedMulticurveCreate<C> = {\n      chainId: this.chainId,\n      account: accountAddress,\n      airlock: resolved.airlock,\n      createParams: resolved.createParams,\n      prediction: resolved.prediction,\n      transaction,\n      devBuy: resolved.devBuy,\n      gasEstimate: { status: 'unavailable' },\n    };\n    const verified = verifyPreparedCreateReceipt({ prepared, receipt });\n    const baseResult = {\n      tokenAddress: verified.receiptIdentity.tokenAddress,\n      poolId: resolved.prediction.poolId,\n      transactionHash: hash,\n      approvalTransactionHash,\n    };\n    if (!resolved.devBuy) {\n      return baseResult;\n    }\n    if (!verified.devBuy) {\n      throw new Error(\n        'Bundler receipt verification did not return dev-buy data',\n      );\n    }\n    return {\n      ...baseResult,\n      devBuy: {\n        exactAmountIn: resolved.devBuy.exactAmountIn,\n        recipient: resolved.devBuy.recipient,\n        vesting: { ...resolved.devBuy.vesting },\n        bundler: resolved.devBuy.bundler,\n        amountOut: verified.devBuy.amountOut,\n      },\n    };\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    numTokensToSell: bigint,\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 fallbackNumPositions =\n      sanitizedCurves[sanitizedCurves.length - 1]?.numPositions ?? 1;\n    const fallbackTickUpper = getMaxLiquiditySafeMulticurveTickUpper({\n      tickLower: fallbackTickLower,\n      tickUpper: this.roundMaxTickDown(tickSpacing),\n      tickSpacing,\n      numPositions: fallbackNumPositions,\n      curveSupply: (numTokensToSell * missingShare) / WAD,\n    });\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: fallbackNumPositions,\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 validateVestingConfig(\n    sale: SaleConfig,\n    vesting?: VestingConfig,\n  ): void {\n    if (!vesting) {\n      return;\n    }\n\n    const cliffDuration = vesting.cliffDuration ?? 0;\n    const duration = vesting.duration ?? 0;\n    const hasCustomSchedules = this.hasCustomV2Schedules(vesting);\n\n    if (\n      hasCustomSchedules &&\n      (cliffDuration > 0 ||\n        duration > 0 ||\n        vesting.recipients !== undefined ||\n        vesting.amounts !== undefined)\n    ) {\n      throw new Error(\n        'Use vesting.allocations instead of top-level duration/cliffDuration/recipients/amounts when configuring per-beneficiary vesting',\n      );\n    }\n\n    const availableForVesting = sale.initialSupply - sale.numTokensToSell;\n\n    if (vesting.allocations) {\n      if (vesting.allocations.length === 0) {\n        throw new Error('Vesting allocations array cannot be empty');\n      }\n\n      const totalVested = vesting.allocations.reduce(\n        (sum, allocation) => sum + allocation.amount,\n        0n,\n      );\n      if (totalVested > availableForVesting) {\n        throw new Error(\n          `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n        );\n      }\n\n      for (const [index, allocation] of vesting.allocations.entries()) {\n        const scheduleCliff = allocation.schedule.cliffDuration ?? 0;\n        const scheduleDuration = allocation.schedule.duration ?? 0;\n\n        this.validateUint64LikeNumber(\n          scheduleCliff,\n          `Vesting allocations[${index}].schedule.cliffDuration`,\n        );\n        this.validateUint64LikeNumber(\n          scheduleDuration,\n          `Vesting allocations[${index}].schedule.duration`,\n        );\n        if (scheduleCliff > scheduleDuration) {\n          throw new Error(\n            `Vesting allocations[${index}].schedule.cliffDuration cannot exceed duration`,\n          );\n        }\n        if (\n          scheduleCliff > 0 &&\n          scheduleDuration > 0 &&\n          scheduleDuration < DERC20_V2_MIN_VESTING_DURATION\n        ) {\n          throw new Error(\n            `Vesting allocations[${index}].schedule.duration must be 0 or at least ${DERC20_V2_MIN_VESTING_DURATION} seconds when using cliffs`,\n          );\n        }\n      }\n\n      return;\n    }\n\n    if (vesting.recipients && vesting.amounts) {\n      if (vesting.recipients.length !== vesting.amounts.length) {\n        throw new Error(\n          'Vesting recipients and amounts arrays must have the same length',\n        );\n      }\n      if (vesting.recipients.length === 0) {\n        throw new Error('Vesting recipients array cannot be empty');\n      }\n\n      const totalVested = vesting.amounts.reduce((sum, amt) => sum + amt, 0n);\n      if (totalVested > availableForVesting) {\n        throw new Error(\n          `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n        );\n      }\n    } else {\n      const vestedAmount = sale.initialSupply - sale.numTokensToSell;\n      if (vestedAmount <= 0n) {\n        throw new Error('No tokens available for vesting');\n      }\n    }\n\n    if (cliffDuration < 0) {\n      throw new Error('Vesting cliff duration cannot be negative');\n    }\n    if (duration < 0) {\n      throw new Error('Vesting duration cannot be negative');\n    }\n    if (cliffDuration > duration) {\n      throw new Error('Vesting cliff duration cannot exceed vesting duration');\n    }\n    if (\n      cliffDuration > 0 &&\n      duration > 0 &&\n      duration < DERC20_V2_MIN_VESTING_DURATION\n    ) {\n      throw new Error(\n        `Vesting duration must be 0 or at least ${DERC20_V2_MIN_VESTING_DURATION} seconds when using cliffs`,\n      );\n    }\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    this.validateVestingConfig(params.sale, params.vesting);\n\n    // Validate migration config\n    if (isDopplerHookMigratorConfig(params.migration)) {\n      throw new Error(\n        'dopplerHookMigrator migration is only supported for dynamic auctions',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV2Split') {\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V2 split migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4Split') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 split migration',\n        true,\n      );\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V4 split migration',\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    this.validateVestingConfig(params.sale, params.vesting);\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 (params.migration.type === 'uniswapV2Split') {\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V2 split migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4Split') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 split migration',\n        true,\n      );\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V4 split migration',\n      );\n    }\n\n    if (isDopplerHookMigratorConfig(params.migration)) {\n      const migration = params.migration;\n\n      if (!Number.isInteger(migration.fee) || migration.fee < 0) {\n        throw new Error(\n          'DopplerHook migration fee must be a non-negative integer',\n        );\n      }\n      if (migration.fee > 150_000) {\n        throw new Error('DopplerHook migration fee must be <= 150000 (15%)');\n      }\n\n      if (\n        !Number.isInteger(migration.tickSpacing) ||\n        migration.tickSpacing <= 0\n      ) {\n        throw new Error(\n          'DopplerHook migration tickSpacing must be a positive integer',\n        );\n      }\n\n      if (migration.beneficiaries.length === 0) {\n        throw new Error(\n          'At least one beneficiary is required for dopplerHookMigrator migration',\n        );\n      }\n\n      const totalShares = migration.beneficiaries.reduce(\n        (sum, b) => sum + b.shares,\n        0n,\n      );\n      if (totalShares !== WAD) {\n        throw new Error(\n          `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n        );\n      }\n\n      const lockDuration = Number(migration.lockDuration);\n      if (!Number.isInteger(lockDuration) || lockDuration < 0) {\n        throw new Error(\n          'DopplerHook migration lockDuration must be a non-negative integer number of seconds',\n        );\n      }\n      if (lockDuration > 0xffffffff) {\n        throw new Error(\n          'DopplerHook migration lockDuration must fit within uint32',\n        );\n      }\n\n      if (migration.hook && migration.rehype) {\n        throw new Error(\n          'dopplerHookMigrator migration cannot set both hook and rehype config. Use exactly one hook mode.',\n        );\n      }\n\n      if (migration.rehype) {\n        normalizeRehypeDopplerHookMigratorConfig(migration.rehype);\n      }\n\n      this.validateProceedsSplitConfig(\n        migration.proceedsSplit,\n        'DopplerHook migration',\n      );\n    }\n  }\n\n  private validateOpeningAuctionParams(\n    params: CreateOpeningAuctionParams<C>,\n  ): void {\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    if (params.sale.initialSupply <= 0n) {\n      throw new Error('Initial supply must be positive');\n    }\n    if (params.sale.numTokensToSell <= 0n) {\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    if (params.openingAuction.shareToAuctionBps <= 0) {\n      throw new Error('openingAuction.shareToAuctionBps must be positive');\n    }\n    if (params.openingAuction.shareToAuctionBps > 10_000) {\n      throw new Error('openingAuction.shareToAuctionBps cannot exceed 10_000');\n    }\n    if (params.openingAuction.incentiveShareBps < 0) {\n      throw new Error('openingAuction.incentiveShareBps cannot be negative');\n    }\n    if (params.openingAuction.incentiveShareBps > 10_000) {\n      throw new Error('openingAuction.incentiveShareBps cannot exceed 10_000');\n    }\n    if (\n      params.openingAuction.incentiveShareBps +\n        params.openingAuction.shareToAuctionBps >\n      10_000\n    ) {\n      throw new Error(\n        'openingAuction.incentiveShareBps + shareToAuctionBps cannot exceed 10_000',\n      );\n    }\n    if (params.openingAuction.auctionDuration <= 0) {\n      throw new Error('openingAuction.auctionDuration must be positive');\n    }\n    if (params.openingAuction.tickSpacing <= 0) {\n      throw new Error('openingAuction.tickSpacing must be positive');\n    }\n    if (params.openingAuction.minLiquidity <= 0n) {\n      throw new Error('openingAuction.minLiquidity must be positive');\n    }\n\n    if (params.doppler.duration <= 0 || params.doppler.epochLength <= 0) {\n      throw new Error(\n        'doppler.duration and doppler.epochLength must be positive',\n      );\n    }\n    if (params.doppler.duration % params.doppler.epochLength !== 0) {\n      throw new Error(\n        'doppler.epochLength must divide doppler.duration evenly',\n      );\n    }\n    if (params.doppler.tickSpacing <= 0) {\n      throw new Error('doppler.tickSpacing must be positive');\n    }\n    if (params.doppler.tickSpacing > DOPPLER_MAX_TICK_SPACING) {\n      throw new Error(\n        `doppler.tickSpacing must be <= ${DOPPLER_MAX_TICK_SPACING}`,\n      );\n    }\n    if (params.openingAuction.tickSpacing % params.doppler.tickSpacing !== 0) {\n      throw new Error(\n        `openingAuction.tickSpacing (${params.openingAuction.tickSpacing}) must be divisible by doppler.tickSpacing (${params.doppler.tickSpacing})`,\n      );\n    }\n\n    if (\n      params.openingAuction.minAcceptableTickToken0 < INT24_MIN ||\n      params.openingAuction.minAcceptableTickToken0 > INT24_MAX\n    ) {\n      throw new Error(\n        `openingAuction.minAcceptableTickToken0 must be within int24 range (${INT24_MIN} to ${INT24_MAX})`,\n      );\n    }\n    if (\n      params.openingAuction.minAcceptableTickToken1 < INT24_MIN ||\n      params.openingAuction.minAcceptableTickToken1 > INT24_MAX\n    ) {\n      throw new Error(\n        `openingAuction.minAcceptableTickToken1 must be within int24 range (${INT24_MIN} to ${INT24_MAX})`,\n      );\n    }\n    if (\n      params.doppler.startTick < INT24_MIN ||\n      params.doppler.startTick > INT24_MAX\n    ) {\n      throw new Error(\n        `doppler.startTick must be within int24 range (${INT24_MIN} to ${INT24_MAX})`,\n      );\n    }\n    if (\n      params.doppler.endTick < INT24_MIN ||\n      params.doppler.endTick > INT24_MAX\n    ) {\n      throw new Error(\n        `doppler.endTick must be within int24 range (${INT24_MIN} to ${INT24_MAX})`,\n      );\n    }\n\n    const isToken0 = isToken0Expected(params.sale.numeraire);\n    if (isToken0 && params.doppler.startTick < params.doppler.endTick) {\n      throw new Error(\n        'doppler.startTick must be >= doppler.endTick when token is expected as currency0',\n      );\n    }\n    if (!isToken0 && params.doppler.startTick > params.doppler.endTick) {\n      throw new Error(\n        'doppler.startTick must be <= doppler.endTick when token is expected as currency1',\n      );\n    }\n\n    if (\n      params.doppler.gamma !== undefined &&\n      params.doppler.gamma % params.doppler.tickSpacing !== 0\n    ) {\n      throw new Error('doppler.gamma must be divisible by doppler.tickSpacing');\n    }\n\n    if (isDopplerHookMigratorConfig(params.migration)) {\n      throw new Error(\n        'dopplerHookMigrator migration type is not supported for opening auctions',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV2Split') {\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V2 split migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4Split') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 split migration',\n        true,\n      );\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V4 split migration',\n      );\n    }\n  }\n\n  private validateMulticurveDevBuy(devBuy: MulticurveDevBuyConfig): void {\n    if (devBuy.exactAmountIn <= 0n || devBuy.exactAmountIn > MAX_UINT128) {\n      throw new Error('Dev buy exactAmountIn must be in the uint128 range');\n    }\n    if (devBuy.recipient.toLowerCase() === ZERO_ADDRESS) {\n      throw new Error('Dev buy recipient must not be the zero address');\n    }\n    const { vestingDuration, cliffDuration } = devBuy.vesting;\n    if (\n      vestingDuration < 0n ||\n      vestingDuration > MAX_UINT64 ||\n      cliffDuration < 0n ||\n      cliffDuration > MAX_UINT64\n    ) {\n      throw new Error('Dev buy vesting durations must be in the uint64 range');\n    }\n    if (\n      vestingDuration !== 0n &&\n      vestingDuration < MIN_BUNDLER_VESTING_DURATION\n    ) {\n      throw new Error('Dev buy vestingDuration must be at least 86400 seconds');\n    }\n    if (cliffDuration > vestingDuration) {\n      throw new Error('Dev buy cliffDuration must not exceed vestingDuration');\n    }\n  }\n\n  /**\n   * Validate multicurve auction parameters\n   */\n  private validateMulticurveParams(params: CreateMulticurveParams<C>): void {\n    if (\n      params.salt !== undefined &&\n      (typeof params.salt !== 'string' ||\n        !/^0x[0-9a-fA-F]{64}$/.test(params.salt))\n    ) {\n      throw new Error('Multicurve salt must be exactly 32 bytes');\n    }\n\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    if (params.devBuy) {\n      this.validateMulticurveDevBuy(params.devBuy);\n      if (\n        this.resolveMulticurveInitializerMode(params).type !== 'dopplerHook'\n      ) {\n        throw new Error(\n          'Dev buys require a DopplerHookInitializer or Rehype initializer',\n        );\n      }\n    }\n\n    this.validateVestingConfig(params.sale, params.vesting);\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 (isDopplerHookMigratorConfig(params.migration)) {\n      throw new Error(\n        'dopplerHookMigrator migration is only supported for dynamic auctions',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV2Split') {\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V2 split migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 migration',\n      );\n    }\n\n    if (params.migration.type === 'uniswapV4Split') {\n      this.validateV4StreamableFeesConfig(\n        params.migration.streamableFees,\n        'V4 split migration',\n        true,\n      );\n      this.validateProceedsSplitConfig(\n        params.migration.proceedsSplit,\n        'V4 split migration',\n      );\n    }\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 resolveUniswapV2Migrator(overrides?: ModuleAddressOverrides): {\n    address: Address;\n    isSplit: boolean;\n  } {\n    const addresses = getAddresses(this.chainId);\n    const v2Address = overrides?.v2Migrator ?? addresses.v2Migrator;\n    if (v2Address && v2Address !== ZERO_ADDRESS) {\n      return { address: v2Address, isSplit: false };\n    }\n\n    const v2SplitAddress =\n      overrides?.v2MigratorSplit ?? addresses.v2MigratorSplit;\n    if (v2SplitAddress && v2SplitAddress !== ZERO_ADDRESS) {\n      return { address: v2SplitAddress, isSplit: true };\n    }\n\n    throw new Error(\n      'Neither UniswapV2Migrator nor UniswapV2MigratorSplit is deployed on this chain. Provide an override via modules.v2Migrator or modules.v2MigratorSplit.',\n    );\n  }\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 this.resolveUniswapV2Migrator(overrides).address;\n      case 'uniswapV2Split': {\n        const v2SplitAddress =\n          overrides?.v2MigratorSplit ?? addresses.v2MigratorSplit;\n        if (!v2SplitAddress || v2SplitAddress === ZERO_ADDRESS) {\n          throw new Error(\n            'UniswapV2MigratorSplit not deployed on this chain. Use uniswapV2 migration or provide override via modules.v2MigratorSplit.',\n          );\n        }\n        return v2SplitAddress;\n      }\n      case 'uniswapV4': {\n        const v4Address = overrides?.v4Migrator ?? addresses.v4Migrator;\n        if (!v4Address || v4Address === ZERO_ADDRESS) {\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 'uniswapV4Split': {\n        const v4SplitAddress =\n          overrides?.v4MigratorSplit ?? addresses.v4MigratorSplit;\n        if (!v4SplitAddress || v4SplitAddress === ZERO_ADDRESS) {\n          throw new Error(\n            'UniswapV4MigratorSplit not deployed on this chain. Use uniswapV4 migration or provide override via modules.v4MigratorSplit.',\n          );\n        }\n        return v4SplitAddress;\n      }\n      case 'dopplerHook':\n      case 'dopplerHookMigrator': {\n        const dopplerHookMigratorAddress =\n          overrides?.dopplerHookMigrator ?? addresses.dopplerHookMigrator;\n        if (\n          !dopplerHookMigratorAddress ||\n          dopplerHookMigratorAddress === ZERO_ADDRESS\n        ) {\n          throw new Error(\n            'DopplerHookMigrator not configured on this chain. Provide override via modules.dopplerHookMigrator or use a different migration type.',\n          );\n        }\n        return dopplerHookMigratorAddress;\n      }\n      case 'noOp': {\n        const noOpAddress = overrides?.noOpMigrator ?? addresses.noOpMigrator;\n        if (!noOpAddress || noOpAddress === ZERO_ADDRESS) {\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  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      | DopplerERC20V1TokenFactoryData\n      | StandardTokenFactoryData;\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?: TokenFactoryVariant;\n    migration?: MigrationConfig;\n    addresses?: ReturnType<typeof getAddresses>;\n    includeProtocolBalanceLimitExclusions?: boolean;\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 ?? WAD],\n            );\n          })()\n        : params.tokenVariant === 'dopplerERC20V1'\n          ? this.encodeDopplerERC20V1TokenFactoryData(\n              params.tokenFactoryData as DopplerERC20V1TokenFactoryData,\n            )\n          : this.encodeStandardTokenFactoryData(\n              params.tokenFactoryData as StandardTokenFactoryData,\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, unit } = params.tokenFactoryData as {\n        name: string;\n        symbol: string;\n        baseURI: string;\n        unit?: bigint;\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: 'string' },\n          { type: 'uint256' },\n        ],\n        [name, symbol, initialSupply, airlock, airlock, baseURI, unit ?? WAD],\n      );\n      tokenInitHash = keccak256(\n        encodePacked(\n          ['bytes', 'bytes'],\n          [\n            getDopplerDN404Bytecode(\n              params.addresses?.doppler404Factory ?? params.tokenFactory,\n            ),\n            initHashData,\n          ],\n        ),\n      );\n    } else if (params.tokenVariant === 'dopplerERC20V1') {\n      const tokenFactoryData =\n        params.tokenFactoryData as DopplerERC20V1TokenFactoryData;\n      tokenInitHash = this.computeSoladyCloneInitCodeHash(\n        tokenFactoryData.implementation,\n      );\n    } else {\n      const standardTokenFactoryData =\n        params.tokenFactoryData as StandardTokenFactoryData;\n      if (standardTokenFactoryData.kind === 'v2') {\n        tokenInitHash = this.computeStandardTokenInitHash(\n          standardTokenFactoryData,\n          params.tokenFactory,\n        );\n      } else {\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            standardTokenFactoryData.name,\n            standardTokenFactoryData.symbol,\n            standardTokenFactoryData.initialSupply,\n            standardTokenFactoryData.airlock,\n            standardTokenFactoryData.airlock,\n            standardTokenFactoryData.yearlyMintRate,\n            standardTokenFactoryData.vestingDuration,\n            standardTokenFactoryData.recipients,\n            standardTokenFactoryData.amounts,\n            standardTokenFactoryData.tokenURI,\n          ],\n        );\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\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          const v1TokenFactoryData =\n            params.tokenFactoryData as DopplerERC20V1TokenFactoryData;\n          const encodedTokenFactoryData =\n            params.tokenVariant === 'dopplerERC20V1' &&\n            params.includeProtocolBalanceLimitExclusions &&\n            this.isDopplerERC20V1BalanceLimitActive(v1TokenFactoryData)\n              ? this.encodeDopplerERC20V1TokenFactoryData({\n                  ...v1TokenFactoryData,\n                  excludedFromBalanceLimit:\n                    this.mergeDopplerERC20V1BalanceLimitExclusions(\n                      v1TokenFactoryData.excludedFromBalanceLimit,\n                      [\n                        hook,\n                        params.migration && params.addresses\n                          ? this.resolveUniswapV2MigrationPairExclusion({\n                              migration: params.migration,\n                              addresses: params.addresses,\n                              tokenAddress: token,\n                              numeraire: params.numeraire,\n                            })\n                          : undefined,\n                      ],\n                    ),\n                })\n              : tokenFactoryData;\n          return [\n            saltBytes,\n            hook,\n            token,\n            poolInitializerData,\n            encodedTokenFactoryData,\n          ];\n        }\n      }\n    }\n\n    throw new Error('AirlockMiner: could not find salt');\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 complete V4 multicurve pool identity from the same pool-key\n   * fields the initializer will register on-chain.\n   */\n  private async computeMulticurvePoolIdentity(\n    params: CreateMulticurveParams<C>,\n    tokenAddress: Address,\n  ): Promise<{\n    poolKey: V4PoolKey;\n    poolId: Hex;\n    tokenIsCurrency0: boolean;\n  }> {\n    const addresses = getAddresses(this.chainId);\n    const initializerMode = this.resolveMulticurveInitializerMode(params);\n    let hookAddress: Address;\n\n    if (initializerMode.type === 'dopplerHook') {\n      // DopplerHookInitializer pools are registered on Uniswap with the\n      // initializer itself as poolKey.hooks. The Rehype hook lives separately\n      // in the encoded init payload and is not part of the Uniswap pool key.\n      hookAddress =\n        params.modules?.dopplerHookInitializer ??\n        addresses.dopplerHookInitializer ??\n        ZERO_ADDRESS;\n      if (hookAddress === ZERO_ADDRESS) {\n        throw new Error('DopplerHookInitializer address not configured');\n      }\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      hookAddress = (await (this.publicClient as PublicClient).readContract({\n        address: initializerAddress,\n        abi: v4MulticurveInitializerAbi,\n        functionName: 'HOOK',\n      })) as Address;\n    }\n\n    const numeraire = params.sale.numeraire;\n    const tokenIsCurrency0 = BigInt(tokenAddress) < BigInt(numeraire);\n    const poolKey: V4PoolKey = {\n      currency0: tokenIsCurrency0 ? tokenAddress : numeraire,\n      currency1: tokenIsCurrency0 ? numeraire : tokenAddress,\n      fee:\n        initializerMode.type === 'decay' ||\n        (initializerMode.type === 'dopplerHook' && initializerMode.hookConfig)\n          ? DYNAMIC_FEE_FLAG\n          : params.pool.fee,\n      tickSpacing: params.pool.tickSpacing,\n      hooks: hookAddress,\n    };\n\n    return {\n      poolKey,\n      poolId: this.computePoolId(poolKey) as Hex,\n      tokenIsCurrency0,\n    };\n  }\n}\n","import { isAddress, isHex, type Address, type Hex } from 'viem';\nimport type { RehypeFeeDistributionInfo } from '../../types';\n\nexport interface DynamicHookState {\n  totalTokensSold: bigint;\n  totalProceeds: bigint;\n}\n\nexport interface RehypeFeeSchedule {\n  startingTime: number;\n  startFee: number;\n  endFee: number;\n  lastFee: number;\n  durationSeconds: number;\n}\n\nexport interface RehypeHookFees {\n  fees0: bigint;\n  fees1: bigint;\n  beneficiaryFees0: bigint;\n  beneficiaryFees1: bigint;\n  airlockOwnerFees0: bigint;\n  airlockOwnerFees1: bigint;\n  customFee: number;\n}\n\nexport interface RehypePoolInfo {\n  asset: Address;\n  numeraire: Address;\n  buybackDst: Address;\n}\n\nexport interface RehypePosition {\n  tickLower: number;\n  tickUpper: number;\n  liquidity: bigint;\n  salt: Hex;\n}\n\nexport function parseAirlockPoolOrHook(\n  rawAssetData: unknown,\n  context = 'Airlock getAssetData',\n): Address {\n  const rawPoolOrHook = readContractResultField(\n    rawAssetData,\n    ['poolOrHook', 'pool'],\n    5,\n    context,\n  );\n  return parseAddress(rawPoolOrHook, context, 'poolOrHook');\n}\n\nexport function parseAirlockLiquidityMigrator(\n  rawAssetData: unknown,\n  context = 'Airlock getAssetData',\n): Address {\n  const rawLiquidityMigrator = readContractResultField(\n    rawAssetData,\n    ['liquidityMigrator'],\n    3,\n    context,\n  );\n  return parseAddress(rawLiquidityMigrator, context, 'liquidityMigrator');\n}\n\nexport function normalizeDynamicHookState(\n  rawState: unknown,\n  context = 'DopplerHook state',\n): DynamicHookState {\n  return {\n    totalTokensSold: parseBigIntField(rawState, 'totalTokensSold', 2, context),\n    totalProceeds: parseBigIntField(rawState, 'totalProceeds', 3, context),\n  };\n}\n\nexport function normalizeRehypeFeeDistributionInfo(\n  rawInfo: unknown,\n  context = 'Rehype getFeeDistributionInfo',\n): RehypeFeeDistributionInfo {\n  return {\n    assetFeesToAssetBuybackWad: parseBigIntField(\n      rawInfo,\n      'assetFeesToAssetBuybackWad',\n      0,\n      context,\n    ),\n    assetFeesToNumeraireBuybackWad: parseBigIntField(\n      rawInfo,\n      'assetFeesToNumeraireBuybackWad',\n      1,\n      context,\n    ),\n    assetFeesToBeneficiaryWad: parseBigIntField(\n      rawInfo,\n      'assetFeesToBeneficiaryWad',\n      2,\n      context,\n    ),\n    assetFeesToLpWad: parseBigIntField(rawInfo, 'assetFeesToLpWad', 3, context),\n    numeraireFeesToAssetBuybackWad: parseBigIntField(\n      rawInfo,\n      'numeraireFeesToAssetBuybackWad',\n      4,\n      context,\n    ),\n    numeraireFeesToNumeraireBuybackWad: parseBigIntField(\n      rawInfo,\n      'numeraireFeesToNumeraireBuybackWad',\n      5,\n      context,\n    ),\n    numeraireFeesToBeneficiaryWad: parseBigIntField(\n      rawInfo,\n      'numeraireFeesToBeneficiaryWad',\n      6,\n      context,\n    ),\n    numeraireFeesToLpWad: parseBigIntField(\n      rawInfo,\n      'numeraireFeesToLpWad',\n      7,\n      context,\n    ),\n  };\n}\n\nexport function normalizeRehypeFeeSchedule(\n  rawSchedule: unknown,\n  context = 'Rehype getFeeSchedule',\n): RehypeFeeSchedule {\n  return {\n    startingTime: parseNumberField(rawSchedule, 'startingTime', 0, context),\n    startFee: parseNumberField(rawSchedule, 'startFee', 1, context),\n    endFee: parseNumberField(rawSchedule, 'endFee', 2, context),\n    lastFee: parseNumberField(rawSchedule, 'lastFee', 3, context),\n    durationSeconds: parseNumberField(\n      rawSchedule,\n      'durationSeconds',\n      4,\n      context,\n    ),\n  };\n}\n\nexport function normalizeRehypeHookFees(\n  rawFees: unknown,\n  context = 'Rehype getHookFees',\n): RehypeHookFees {\n  return {\n    fees0: parseBigIntField(rawFees, 'fees0', 0, context),\n    fees1: parseBigIntField(rawFees, 'fees1', 1, context),\n    beneficiaryFees0: parseBigIntField(rawFees, 'beneficiaryFees0', 2, context),\n    beneficiaryFees1: parseBigIntField(rawFees, 'beneficiaryFees1', 3, context),\n    airlockOwnerFees0: parseBigIntField(\n      rawFees,\n      'airlockOwnerFees0',\n      4,\n      context,\n    ),\n    airlockOwnerFees1: parseBigIntField(\n      rawFees,\n      'airlockOwnerFees1',\n      5,\n      context,\n    ),\n    customFee: parseNumberField(rawFees, 'customFee', 6, context),\n  };\n}\n\nexport function normalizeRehypePoolInfo(\n  rawInfo: unknown,\n  context = 'Rehype getPoolInfo',\n): RehypePoolInfo {\n  return {\n    asset: parseAddressField(rawInfo, 'asset', 0, context),\n    numeraire: parseAddressField(rawInfo, 'numeraire', 1, context),\n    buybackDst: parseAddressField(rawInfo, 'buybackDst', 2, context),\n  };\n}\n\nexport function normalizeRehypePosition(\n  rawPosition: unknown,\n  context = 'Rehype getPosition',\n): RehypePosition {\n  return {\n    tickLower: parseNumberField(rawPosition, 'tickLower', 0, context),\n    tickUpper: parseNumberField(rawPosition, 'tickUpper', 1, context),\n    liquidity: parseBigIntField(rawPosition, 'liquidity', 2, context),\n    salt: parseHexField(rawPosition, 'salt', 3, context),\n  };\n}\n\nfunction parseAddressField(\n  rawResult: unknown,\n  fieldName: string,\n  tupleIndex: number,\n  context: string,\n): Address {\n  const rawField = readContractResultField(\n    rawResult,\n    [fieldName],\n    tupleIndex,\n    context,\n  );\n  return parseAddress(rawField, context, fieldName);\n}\n\nfunction parseBigIntField(\n  rawResult: unknown,\n  fieldName: string,\n  tupleIndex: number,\n  context: string,\n): bigint {\n  const rawField = readContractResultField(\n    rawResult,\n    [fieldName],\n    tupleIndex,\n    context,\n  );\n\n  if (typeof rawField === 'bigint') {\n    return rawField;\n  }\n\n  if (typeof rawField === 'number' && Number.isSafeInteger(rawField)) {\n    return BigInt(rawField);\n  }\n\n  if (typeof rawField === 'string' && rawField.trim() !== '') {\n    try {\n      return BigInt(rawField);\n    } catch {\n      throw new Error(`${context}: ${fieldName} must be bigint-compatible`);\n    }\n  }\n\n  throw new Error(`${context}: ${fieldName} must be bigint-compatible`);\n}\n\nfunction parseNumberField(\n  rawResult: unknown,\n  fieldName: string,\n  tupleIndex: number,\n  context: string,\n): number {\n  const rawField = readContractResultField(\n    rawResult,\n    [fieldName],\n    tupleIndex,\n    context,\n  );\n  const numericField =\n    typeof rawField === 'bigint' || typeof rawField === 'number'\n      ? Number(rawField)\n      : Number.NaN;\n\n  if (!Number.isSafeInteger(numericField)) {\n    throw new Error(`${context}: ${fieldName} must be a safe integer`);\n  }\n\n  return numericField;\n}\n\nfunction parseHexField(\n  rawResult: unknown,\n  fieldName: string,\n  tupleIndex: number,\n  context: string,\n): Hex {\n  const rawField = readContractResultField(\n    rawResult,\n    [fieldName],\n    tupleIndex,\n    context,\n  );\n\n  if (typeof rawField === 'string' && isHex(rawField)) {\n    return rawField as Hex;\n  }\n\n  throw new Error(`${context}: ${fieldName} must be hex`);\n}\n\nfunction parseAddress(\n  rawField: unknown,\n  context: string,\n  fieldName: string,\n): Address {\n  if (typeof rawField === 'string' && isAddress(rawField, { strict: false })) {\n    return rawField as Address;\n  }\n\n  throw new Error(`${context}: ${fieldName} must be an address`);\n}\n\nfunction readContractResultField(\n  rawResult: unknown,\n  fieldNames: readonly string[],\n  tupleIndex: number,\n  context: string,\n): unknown {\n  if (Array.isArray(rawResult)) {\n    if (tupleIndex < rawResult.length && rawResult[tupleIndex] !== undefined) {\n      return rawResult[tupleIndex];\n    }\n    throw new Error(\n      `${context}: missing tuple field ${fieldNames.join('/')} at index ${tupleIndex}`,\n    );\n  }\n\n  if (isRecord(rawResult)) {\n    for (const fieldName of fieldNames) {\n      const rawField = rawResult[fieldName];\n      if (rawField !== undefined) {\n        return rawField;\n      }\n    }\n    throw new Error(`${context}: missing field ${fieldNames.join('/')}`);\n  }\n\n  throw new Error(`${context}: expected tuple or object result`);\n}\n\nfunction isRecord(rawResult: unknown): rawResult is Record<string, unknown> {\n  return typeof rawResult === 'object' && rawResult !== null;\n}\n","import { type Address, zeroAddress, type PublicClient } from 'viem';\nimport type { PoolInfo, SupportedPublicClient } from '../../types';\nimport { uniswapV3PoolAbi, airlockAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport {\n  parseAirlockLiquidityMigrator,\n  parseAirlockPoolOrHook,\n} from './contractResults';\n\n/**\n * StaticAuction class for interacting with static auctions (Uniswap V3 based)\n *\n * Static auctions use a fixed price range on Uniswap V3 for initial liquidity bootstrapping.\n * This is ideal for simple, predictable price discovery events.\n */\nexport class StaticAuction {\n  private client: SupportedPublicClient;\n  private poolAddress: Address;\n  private get rpc(): PublicClient {\n    return this.client as PublicClient;\n  }\n\n  constructor(client: SupportedPublicClient, poolAddress: Address) {\n    this.client = client;\n    this.poolAddress = poolAddress;\n  }\n\n  /**\n   * Get the pool address\n   */\n  getAddress(): Address {\n    return this.poolAddress;\n  }\n\n  /**\n   * Get current pool information\n   */\n  async getPoolInfo(): Promise<PoolInfo> {\n    // Fetch all pool data in parallel\n    const [slot0, liquidity, token0, token1, fee] = await Promise.all([\n      this.rpc.readContract({\n        address: this.poolAddress,\n        abi: uniswapV3PoolAbi,\n        functionName: 'slot0',\n      }),\n      this.rpc.readContract({\n        address: this.poolAddress,\n        abi: uniswapV3PoolAbi,\n        functionName: 'liquidity',\n      }),\n      this.rpc.readContract({\n        address: this.poolAddress,\n        abi: uniswapV3PoolAbi,\n        functionName: 'token0',\n      }),\n      this.rpc.readContract({\n        address: this.poolAddress,\n        abi: uniswapV3PoolAbi,\n        functionName: 'token1',\n      }),\n      this.rpc.readContract({\n        address: this.poolAddress,\n        abi: uniswapV3PoolAbi,\n        functionName: 'fee',\n      }),\n    ]);\n\n    // Determine which token is the auction token and which is numeraire\n    // This requires checking with the Airlock contract\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: [token0],\n    });\n    const isToken0AuctionToken = this.isRegisteredAirlockAsset(assetData);\n\n    return {\n      address: this.poolAddress,\n      tokenAddress: isToken0AuctionToken ? token0 : token1,\n      numeraireAddress: isToken0AuctionToken ? token1 : token0,\n      fee,\n      liquidity,\n      sqrtPriceX96: slot0[0], // First element is sqrtPriceX96\n    };\n  }\n\n  /**\n   * Get the token address for this auction\n   */\n  async getTokenAddress(): Promise<Address> {\n    const poolInfo = await this.getPoolInfo();\n    return poolInfo.tokenAddress;\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    const liquidityMigrator = parseAirlockLiquidityMigrator(assetData);\n    return liquidityMigrator === zeroAddress;\n  }\n\n  /**\n   * Get the current price in the pool\n   * Returns the price of token in terms of numeraire (token/numeraire)\n   */\n  async getCurrentPrice(): Promise<bigint> {\n    const poolInfo = await this.getPoolInfo();\n\n    const token0 = await this.rpc.readContract({\n      address: this.poolAddress,\n      abi: uniswapV3PoolAbi,\n      functionName: 'token0',\n    });\n\n    // Calculate price from sqrtPriceX96\n    // sqrtPriceX96 = sqrt(price) * 2^96\n    // price = (sqrtPriceX96 / 2^96)^2\n    const sqrtPriceX96 = poolInfo.sqrtPriceX96;\n    const Q96 = BigInt(2) ** BigInt(96);\n\n    // price0 = amount of token1 per token0\n    const sqrtPriceX96Squared = sqrtPriceX96 * sqrtPriceX96;\n    const Q96Squared = Q96 * Q96;\n    const price0 = sqrtPriceX96Squared / Q96Squared;\n\n    // Return price based on which token is the auction token\n    if (poolInfo.tokenAddress === token0) {\n      // Auction token is token0, return price in terms of token1 (numeraire)\n      return price0;\n    } else {\n      // Auction token is token1, return reciprocal price\n      // price1 = 1 / price0 (with precision handling)\n      return Q96Squared / price0;\n    }\n  }\n\n  /**\n   * Get total liquidity in the pool\n   */\n  async getTotalLiquidity(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.poolAddress,\n      abi: uniswapV3PoolAbi,\n      functionName: 'liquidity',\n    });\n  }\n\n  private isRegisteredAirlockAsset(assetData: unknown): boolean {\n    try {\n      return parseAirlockPoolOrHook(assetData) !== zeroAddress;\n    } catch {\n      return false;\n    }\n  }\n}\n","import { type Address, type PublicClient, type Hex, zeroAddress } from 'viem';\nimport type { HookInfo, SupportedPublicClient } from '../../types';\nimport { dopplerHookAbi, airlockAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport { computePoolId, normalizePoolKey } from '../../utils/poolKey';\nimport {\n  normalizeDynamicHookState,\n  parseAirlockLiquidityMigrator,\n  type DynamicHookState,\n} from './contractResults';\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 = normalizePoolKey(poolKeyRaw);\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 = computePoolId(poolKey);\n\n    return {\n      hookAddress: this.hookAddress,\n      tokenAddress,\n      numeraireAddress,\n      poolId,\n      currentEpoch,\n      totalProceeds: state.totalProceeds,\n      totalTokensSold: state.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 = normalizePoolKey(poolKeyRaw);\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 = normalizePoolKey(poolKeyRaw);\n    return 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    const liquidityMigrator = parseAirlockLiquidityMigrator(assetData);\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 [startingTick, endingTick, gamma, startingTime, epochLength] =\n      await Promise.all([\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.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  private async readHookState(): Promise<DynamicHookState> {\n    const rawState = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: dopplerHookAbi,\n      functionName: 'state',\n    });\n    return normalizeDynamicHookState(rawState);\n  }\n}\n","import {\n  BaseError,\n  ContractFunctionRevertedError,\n  decodeErrorResult,\n  type Address,\n  type Hex,\n  zeroAddress,\n} from 'viem';\nimport type { ChainAddresses } from '../../../addresses';\nimport {\n  dopplerHookInitializerAbi,\n  v4MulticurveInitializerAbi,\n} from '../../../abis';\nimport type { MulticurvePoolState, V4PoolKey } from '../../../types';\n\nexport interface InitializerDiscoveryResult {\n  initializerAddress: Address;\n  initializerKind: MulticurveInitializerKind;\n  dopplerHookAddress: Address;\n  state: MulticurvePoolState;\n}\n\nexport type InitializerDiscoveryClient = {\n  readContract(parameters: {\n    address: Address;\n    abi: typeof dopplerHookInitializerAbi | typeof v4MulticurveInitializerAbi;\n    functionName: 'getState';\n    args: readonly [Address];\n  }): Promise<unknown>;\n};\n\nexport type MulticurveInitializerKind = 'standard' | 'dopplerHook';\n\nexport type MulticurveInitializerCandidate = {\n  address: Address;\n  kind: MulticurveInitializerKind;\n};\n\ntype StructLike = Record<string, unknown> & {\n  readonly [index: number]: unknown;\n};\n\ninterface ParsedInitializerState {\n  numeraire: Address;\n  status: number;\n  poolKey: V4PoolKey;\n  farTick: number;\n  dopplerHookAddress: Address;\n}\n\nconst ABSENT_POOL_ERROR_ABI = [\n  { type: 'error', name: 'PoolNotFound', inputs: [] },\n  { type: 'error', name: 'PoolNotInitialized', inputs: [] },\n] as const;\n\nexport async function findMulticurveInitializerForPool({\n  client,\n  tokenAddress,\n  addresses,\n}: {\n  client: InitializerDiscoveryClient;\n  tokenAddress: Address;\n  addresses: ChainAddresses;\n}): Promise<InitializerDiscoveryResult> {\n  const initializersToTry = getMulticurveInitializerCandidates(addresses);\n\n  if (initializersToTry.length === 0) {\n    throw new Error(\n      'No V4 multicurve initializer addresses configured for this chain',\n    );\n  }\n\n  const triedInitializers: Address[] = [];\n  const failedInitializers: Error[] = [];\n\n  for (const initializer of initializersToTry) {\n    const { address: initializerAddress, kind } = initializer;\n    triedInitializers.push(initializerAddress);\n\n    let stateData: unknown;\n    try {\n      stateData = await client.readContract({\n        address: initializerAddress,\n        abi: getMulticurveInitializerAbi(kind),\n        functionName: 'getState',\n        args: [tokenAddress],\n      });\n    } catch (error) {\n      if (!isAbsentPoolReadFailure(error)) {\n        throw error;\n      }\n\n      const reason = error instanceof Error ? error.message : String(error);\n      failedInitializers.push(\n        new Error(`${initializerAddress} getState failed: ${reason}`),\n      );\n      continue;\n    }\n\n    const discoveryResult = parseMulticurveInitializerDiscoveryResult({\n      tokenAddress,\n      initializerAddress,\n      kind,\n      stateData,\n    });\n\n    if (isInitializedMulticurvePoolKey(discoveryResult.state.poolKey)) {\n      return discoveryResult;\n    }\n  }\n\n  const notFoundError = new Error(\n    `Pool not found for token ${tokenAddress}. ` +\n      `Tried initializers: ${triedInitializers.join(', ')}` +\n      (failedInitializers.length > 0\n        ? `. Failed initializers: ${failedInitializers\n            .map((error) => error.message)\n            .join(' | ')}`\n        : ''),\n  );\n\n  if (failedInitializers.length > 0) {\n    (notFoundError as Error & { cause?: AggregateError }).cause =\n      new AggregateError(\n        failedInitializers,\n        `Initializer discovery failed for token ${tokenAddress}`,\n      );\n  }\n\n  throw notFoundError;\n}\n\nexport function parseMulticurvePoolKey(rawPoolKey: unknown): V4PoolKey {\n  const poolKeyStruct = rawPoolKey as StructLike;\n  return {\n    currency0: (poolKeyStruct.currency0 ?? poolKeyStruct[0]) as Address,\n    currency1: (poolKeyStruct.currency1 ?? poolKeyStruct[1]) as Address,\n    fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),\n    tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),\n    hooks: (poolKeyStruct.hooks ?? poolKeyStruct[4]) as Address,\n  };\n}\n\nexport function getMulticurveInitializerCandidates(\n  addresses: ChainAddresses,\n): readonly MulticurveInitializerCandidate[] {\n  return [\n    {\n      address: addresses.v4MulticurveInitializer,\n      kind: 'standard' as const,\n    },\n    {\n      address: addresses.v4ScheduledMulticurveInitializer,\n      kind: 'standard' as const,\n    },\n    {\n      address: addresses.v4DecayMulticurveInitializer,\n      kind: 'standard' as const,\n    },\n    {\n      address: addresses.dopplerHookInitializer,\n      kind: 'dopplerHook' as const,\n    },\n  ].filter((entry): entry is MulticurveInitializerCandidate =>\n    Boolean(entry.address && entry.address !== zeroAddress),\n  );\n}\n\nexport function getMulticurveInitializerAbi(\n  kind: MulticurveInitializerKind,\n): typeof dopplerHookInitializerAbi | typeof v4MulticurveInitializerAbi {\n  return kind === 'dopplerHook'\n    ? dopplerHookInitializerAbi\n    : v4MulticurveInitializerAbi;\n}\n\nexport function parseMulticurveInitializerDiscoveryResult({\n  tokenAddress,\n  initializerAddress,\n  kind,\n  stateData,\n}: {\n  tokenAddress: Address;\n  initializerAddress: Address;\n  kind: MulticurveInitializerKind;\n  stateData: unknown;\n}): InitializerDiscoveryResult {\n  const parsedState =\n    kind === 'dopplerHook'\n      ? parseDopplerHookInitializerState(stateData)\n      : parseStandardInitializerState(stateData);\n\n  const { numeraire, status, poolKey, farTick, dopplerHookAddress } =\n    parsedState;\n  return {\n    initializerAddress,\n    initializerKind: kind,\n    dopplerHookAddress,\n    state: {\n      asset: tokenAddress,\n      numeraire,\n      fee: poolKey.fee,\n      tickSpacing: poolKey.tickSpacing,\n      status,\n      poolKey,\n      farTick: Number(farTick),\n    },\n  };\n}\n\nexport function isInitializedMulticurvePoolKey(poolKey: V4PoolKey): boolean {\n  return poolKey.hooks !== zeroAddress && poolKey.tickSpacing !== 0;\n}\n\nexport function isAbsentPoolRevertData(data: Hex): boolean {\n  if (data === '0x') {\n    return false;\n  }\n\n  try {\n    const decodedError = decodeErrorResult({\n      abi: ABSENT_POOL_ERROR_ABI,\n      data,\n    });\n    return (\n      decodedError.errorName === 'PoolNotFound' ||\n      decodedError.errorName === 'PoolNotInitialized'\n    );\n  } catch (error) {\n    if (error instanceof Error) {\n      return false;\n    }\n    throw error;\n  }\n}\n\nfunction parseStandardInitializerState(\n  stateData: unknown,\n): ParsedInitializerState {\n  const state = stateData as StructLike;\n  return {\n    numeraire: (state.numeraire ?? state[0]) as Address,\n    status: Number(state.status ?? state[1]),\n    poolKey: parseMulticurvePoolKey(state.poolKey ?? state[2]),\n    farTick: Number(state.farTick ?? state[3]),\n    dopplerHookAddress: zeroAddress,\n  };\n}\n\nfunction parseDopplerHookInitializerState(\n  stateData: unknown,\n): ParsedInitializerState {\n  const state = stateData as StructLike;\n  return {\n    numeraire: (state.numeraire ?? state[0]) as Address,\n    status: Number(state.status ?? state[4]),\n    poolKey: parseMulticurvePoolKey(state.poolKey ?? state[5]),\n    farTick: Number(state.farTick ?? state[6]),\n    dopplerHookAddress: (state.dopplerHook ?? state[2]) as Address,\n  };\n}\n\nfunction isAbsentPoolReadFailure(error: unknown): boolean {\n  if (!(error instanceof BaseError)) {\n    return false;\n  }\n\n  const revertedError = error.walk(\n    (cause) => cause instanceof ContractFunctionRevertedError,\n  );\n  if (!(revertedError instanceof ContractFunctionRevertedError)) {\n    return false;\n  }\n\n  return (\n    revertedError.data?.errorName === 'PoolNotFound' ||\n    revertedError.data?.errorName === 'PoolNotInitialized'\n  );\n}\n","import type { Address, Hash, Hex, PublicClient, WalletClient } from 'viem';\nimport { LockablePoolStatus, type MulticurvePoolState } from '../../../types';\nimport type { ChainAddresses } from '../../../addresses';\nimport {\n  dopplerHookInitializerAbi,\n  v4MulticurveInitializerAbi,\n} from '../../../abis';\nimport { computePoolId } from '../../../utils/poolKey';\n\nexport type MulticurveCollectedFees = {\n  fees0: bigint;\n  fees1: bigint;\n  transactionHash: Hash;\n};\n\ntype FeeCollectionClient = Pick<\n  PublicClient,\n  'simulateContract' | 'waitForTransactionReceipt'\n>;\n\nexport async function collectMulticurveFees({\n  client,\n  walletClient,\n  initializerAddress,\n  state,\n  addresses,\n}: {\n  client: FeeCollectionClient;\n  walletClient: WalletClient;\n  initializerAddress: Address;\n  state: MulticurvePoolState;\n  addresses: ChainAddresses;\n}): Promise<MulticurveCollectedFees> {\n  if (state.status === LockablePoolStatus.Locked) {\n    const poolId = computePoolId(state.poolKey);\n    const collectFeesAbi =\n      initializerAddress === addresses.dopplerHookInitializer\n        ? dopplerHookInitializerAbi\n        : v4MulticurveInitializerAbi;\n    return collectFeesFromContract({\n      client,\n      walletClient,\n      contractAddress: initializerAddress,\n      abi: collectFeesAbi,\n      poolId,\n    });\n  }\n\n  throw new Error('Multicurve pool is not locked or was migrated');\n}\n\nasync function collectFeesFromContract({\n  client,\n  walletClient,\n  contractAddress,\n  abi,\n  poolId,\n}: {\n  client: FeeCollectionClient;\n  walletClient: WalletClient;\n  contractAddress: Address;\n  abi: typeof dopplerHookInitializerAbi | typeof v4MulticurveInitializerAbi;\n  poolId: Hex;\n}): Promise<MulticurveCollectedFees> {\n  const { request, result } = await client.simulateContract({\n    address: contractAddress,\n    abi,\n    functionName: 'collectFees',\n    args: [poolId],\n    account: walletClient.account,\n  });\n\n  const hash = await walletClient.writeContract(request);\n\n  await client.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n  const [fees0, fees1] = result as readonly [bigint, bigint];\n\n  return {\n    fees0,\n    fees1,\n    transactionHash: hash,\n  };\n}\n","import {\n  BaseError,\n  ContractFunctionRevertedError,\n  ContractFunctionZeroDataError,\n  type PublicClient,\n} from 'viem';\nimport type {\n  MulticurveDecayFeeSchedule,\n  MulticurvePoolState,\n} from '../../../types';\nimport { decayMulticurveInitializerHookAbi } from '../../../abis';\nimport { DYNAMIC_FEE_FLAG } from '../../../constants';\nimport { computePoolId } from '../../../utils/poolKey';\n\nexport async function getMulticurveFeeSchedule(\n  client: Pick<PublicClient, 'readContract'>,\n  state: MulticurvePoolState,\n): Promise<MulticurveDecayFeeSchedule | null> {\n  if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {\n    return null;\n  }\n\n  const poolId = computePoolId(state.poolKey);\n  try {\n    const scheduleData = await client.readContract({\n      address: state.poolKey.hooks,\n      abi: decayMulticurveInitializerHookAbi,\n      functionName: 'getFeeScheduleOf',\n      args: [poolId],\n    });\n\n    return {\n      startingTime: Number(readStructField(scheduleData, 'startingTime', 0)),\n      startFee: Number(readStructField(scheduleData, 'startFee', 1)),\n      endFee: Number(readStructField(scheduleData, 'endFee', 2)),\n      lastFee: Number(readStructField(scheduleData, 'lastFee', 3)),\n      durationSeconds: Number(\n        readStructField(scheduleData, 'durationSeconds', 4),\n      ),\n    };\n  } catch (error) {\n    if (!isMissingFeeScheduleHook(error)) {\n      throw error;\n    }\n\n    throw new Error(\n      `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,\n      { cause: error },\n    );\n  }\n}\n\nfunction isMissingFeeScheduleHook(error: unknown): boolean {\n  if (!(error instanceof BaseError)) {\n    return false;\n  }\n\n  return Boolean(\n    error.walk(\n      (cause) =>\n        cause instanceof ContractFunctionZeroDataError ||\n        (cause instanceof ContractFunctionRevertedError &&\n          !cause.data &&\n          !cause.reason &&\n          !cause.signature),\n    ),\n  );\n}\n\nfunction readStructField(\n  value: unknown,\n  fieldName: string,\n  tupleIndex: number,\n): unknown {\n  if (Array.isArray(value)) {\n    return value[tupleIndex] ?? 0;\n  }\n\n  if (typeof value === 'object' && value !== null && fieldName in value) {\n    return value[fieldName as keyof typeof value] ?? 0;\n  }\n\n  return 0;\n}\n","import {\n  decodeFunctionResult,\n  encodeFunctionData,\n  multicall3Abi,\n  type Address,\n  type Hex,\n  zeroAddress,\n} from 'viem';\n\nexport type Aggregate3Call = {\n  target: Address;\n  allowFailure: boolean;\n  callData: Hex;\n};\n\nexport type Aggregate3Result = {\n  success: boolean;\n  returnData: Hex;\n};\n\nexport type Multicall3Client = {\n  chain?: {\n    contracts?: {\n      multicall3?: {\n        address?: Address;\n      };\n    };\n  };\n  call(request: { to: Address; data: Hex }): Promise<{ data?: Hex }>;\n};\n\nexport function getMulticall3Address(\n  client: Pick<Multicall3Client, 'chain'>,\n): Address {\n  const multicall3Address = client.chain?.contracts?.multicall3?.address;\n  if (!multicall3Address || multicall3Address === zeroAddress) {\n    throw new Error(\n      'Multicall3 address is not configured on this chain. ' +\n        'Configure the viem chain multicall3 contract before previewing pending fees.',\n    );\n  }\n\n  return multicall3Address;\n}\n\nexport async function callAggregate3(\n  client: Multicall3Client,\n  calls: readonly Aggregate3Call[],\n): Promise<readonly Aggregate3Result[]> {\n  const response = await client.call({\n    to: getMulticall3Address(client),\n    data: encodeFunctionData({\n      abi: multicall3Abi,\n      functionName: 'aggregate3',\n      args: [calls],\n    }),\n  });\n\n  if (!response.data) {\n    throw new Error('Multicall3 aggregate3 returned no data');\n  }\n\n  return decodeFunctionResult({\n    abi: multicall3Abi,\n    functionName: 'aggregate3',\n    data: response.data,\n  });\n}\n","import {\n  decodeFunctionResult,\n  encodeFunctionData,\n  type Address,\n  type Hex,\n} from 'viem';\nimport { feeClaimsInitializerAbi } from '../../../abis';\nimport { WAD } from '../../../constants';\nimport type {\n  Aggregate3Call,\n  Aggregate3Result,\n} from '../../../utils/multicall3';\n\nexport interface MulticurvePendingFees {\n  fees0: bigint;\n  fees1: bigint;\n}\n\nexport interface MulticurveTokenPendingFees extends MulticurvePendingFees {\n  tokenAddress: Address;\n}\n\ntype PendingFeeReadFunctionName =\n  | 'getShares'\n  | 'getCumulatedFees0'\n  | 'getCumulatedFees1'\n  | 'getLastCumulatedFees0'\n  | 'getLastCumulatedFees1';\n\ntype PendingFeeCallFunctionName = PendingFeeReadFunctionName | 'collectFees';\n\nconst PENDING_FEE_CALL_ORDER = [\n  'collectFees',\n  'getShares',\n  'getCumulatedFees0',\n  'getCumulatedFees1',\n  'getLastCumulatedFees0',\n  'getLastCumulatedFees1',\n] as const satisfies readonly PendingFeeCallFunctionName[];\n\nexport const PENDING_FEE_PREVIEW_CALL_COUNT = PENDING_FEE_CALL_ORDER.length;\n\nexport function createPendingFeePreviewCalls(\n  target: Address,\n  poolId: Hex,\n  beneficiary: Address,\n): readonly Aggregate3Call[] {\n  return PENDING_FEE_CALL_ORDER.map((functionName) => ({\n    target,\n    allowFailure: true,\n    callData: encodeFunctionData({\n      abi: feeClaimsInitializerAbi,\n      functionName,\n      args:\n        functionName === 'collectFees' ||\n        functionName === 'getCumulatedFees0' ||\n        functionName === 'getCumulatedFees1'\n          ? [poolId]\n          : [poolId, beneficiary],\n    }),\n  }));\n}\n\nexport function calculatePendingFees(\n  callResults: readonly Aggregate3Result[],\n): MulticurvePendingFees {\n  const preview = decodePendingFeePreview(callResults);\n\n  if (preview.cumulatedFees0 < preview.lastCumulatedFees0) {\n    throw new Error('Accumulated fees are below beneficiary checkpoint');\n  }\n\n  if (preview.cumulatedFees1 < preview.lastCumulatedFees1) {\n    throw new Error('Accumulated fees are below beneficiary checkpoint');\n  }\n\n  return {\n    fees0:\n      ((preview.cumulatedFees0 - preview.lastCumulatedFees0) * preview.shares) /\n      WAD,\n    fees1:\n      ((preview.cumulatedFees1 - preview.lastCumulatedFees1) * preview.shares) /\n      WAD,\n  };\n}\n\nfunction decodePendingFeePreview(callResults: readonly Aggregate3Result[]): {\n  shares: bigint;\n  cumulatedFees0: bigint;\n  cumulatedFees1: bigint;\n  lastCumulatedFees0: bigint;\n  lastCumulatedFees1: bigint;\n} {\n  if (callResults.length !== PENDING_FEE_CALL_ORDER.length) {\n    throw new Error('Multicall3 aggregate3 returned an incomplete pool result');\n  }\n\n  for (const [index, result] of callResults.entries()) {\n    const functionName = PENDING_FEE_CALL_ORDER[index];\n    if (!result.success) {\n      throw new Error(`${functionName} call failed`);\n    }\n\n    if (!result.returnData || result.returnData === '0x') {\n      throw new Error(`${functionName} returned no data`);\n    }\n  }\n\n  decodeFunctionResult({\n    abi: feeClaimsInitializerAbi,\n    functionName: 'collectFees',\n    data: callResults[0].returnData,\n  });\n\n  return {\n    shares: decodeUint256('getShares', callResults[1].returnData),\n    cumulatedFees0: decodeUint256(\n      'getCumulatedFees0',\n      callResults[2].returnData,\n    ),\n    cumulatedFees1: decodeUint256(\n      'getCumulatedFees1',\n      callResults[3].returnData,\n    ),\n    lastCumulatedFees0: decodeUint256(\n      'getLastCumulatedFees0',\n      callResults[4].returnData,\n    ),\n    lastCumulatedFees1: decodeUint256(\n      'getLastCumulatedFees1',\n      callResults[5].returnData,\n    ),\n  };\n}\n\nfunction decodeUint256(\n  functionName: PendingFeeReadFunctionName,\n  data: Hex,\n): bigint {\n  const value = decodeFunctionResult({\n    abi: feeClaimsInitializerAbi,\n    functionName,\n    data,\n  });\n\n  if (typeof value !== 'bigint') {\n    throw new Error(`${functionName} returned invalid data`);\n  }\n\n  return value;\n}\n","import { decodeFunctionResult, encodeFunctionData, type Address } from 'viem';\nimport { getAddresses, type SupportedChainId } from '../../../addresses';\nimport { LockablePoolStatus, type SupportedPublicClient } from '../../../types';\nimport { computePoolId } from '../../../utils/poolKey';\nimport {\n  callAggregate3,\n  type Aggregate3Call,\n  type Aggregate3Result,\n  type Multicall3Client,\n} from '../../../utils/multicall3';\nimport {\n  calculatePendingFees,\n  createPendingFeePreviewCalls,\n  PENDING_FEE_PREVIEW_CALL_COUNT,\n  type MulticurvePendingFees,\n  type MulticurveTokenPendingFees,\n} from './multicurvePendingFees';\nimport {\n  getMulticurveInitializerAbi,\n  getMulticurveInitializerCandidates,\n  isAbsentPoolRevertData,\n  isInitializedMulticurvePoolKey,\n  parseMulticurveInitializerDiscoveryResult,\n  type InitializerDiscoveryResult,\n  type MulticurveInitializerCandidate,\n} from './multicurveInitializerDiscovery';\n\nexport type MulticurvePendingFeesClient = Multicall3Client & {\n  getChainId(): Promise<number>;\n};\n\ntype DiscoveryCallContext = {\n  tokenAddress: Address;\n  initializer: MulticurveInitializerCandidate;\n};\n\nexport async function getPendingFeesForMulticurvePool({\n  client,\n  beneficiary,\n  poolContext,\n}: {\n  client: MulticurvePendingFeesClient;\n  beneficiary: Address;\n  poolContext: InitializerDiscoveryResult;\n}): Promise<MulticurvePendingFees> {\n  const pendingFees = await getPendingFeesForDiscoveredMulticurvePools({\n    client,\n    beneficiary,\n    poolContexts: [poolContext],\n  });\n  const poolPendingFees = pendingFees[0];\n  if (!poolPendingFees) {\n    throw new Error('Pending fee preview returned no pool result');\n  }\n\n  return {\n    fees0: poolPendingFees.fees0,\n    fees1: poolPendingFees.fees1,\n  };\n}\n\nexport async function getPendingFeesForMulticurveTokens({\n  client,\n  beneficiary,\n  tokenAddresses,\n}: {\n  client: SupportedPublicClient;\n  beneficiary: Address;\n  tokenAddresses: readonly Address[];\n}): Promise<readonly MulticurveTokenPendingFees[]> {\n  if (tokenAddresses.length === 0) {\n    return [];\n  }\n\n  const feeClient = client as MulticurvePendingFeesClient;\n  const poolContexts = await discoverMulticurveFeePoolContexts(\n    feeClient,\n    tokenAddresses,\n  );\n  return getPendingFeesForDiscoveredMulticurvePools({\n    client: feeClient,\n    beneficiary,\n    poolContexts,\n  });\n}\n\nexport async function discoverMulticurveFeePoolContexts(\n  client: MulticurvePendingFeesClient,\n  tokenAddresses: readonly Address[],\n): Promise<readonly InitializerDiscoveryResult[]> {\n  const chainId = await client.getChainId();\n  const addresses = getAddresses(chainId as SupportedChainId);\n  const initializers = getMulticurveInitializerCandidates(addresses);\n\n  if (initializers.length === 0) {\n    throw new Error(\n      'No V4 multicurve initializer addresses configured for this chain',\n    );\n  }\n\n  const discoveryContexts = createDiscoveryCallContexts(\n    tokenAddresses,\n    initializers,\n  );\n  const discoveryResults = await callAggregate3(\n    client,\n    createDiscoveryCalls(discoveryContexts),\n  );\n\n  if (discoveryResults.length !== discoveryContexts.length) {\n    throw new Error(\n      'Multicall3 aggregate3 returned an incomplete initializer discovery result',\n    );\n  }\n\n  return tokenAddresses.map((tokenAddress, tokenIndex) =>\n    findInitializedPoolForToken({\n      tokenAddress,\n      initializers,\n      discoveryResults: discoveryResults.slice(\n        tokenIndex * initializers.length,\n        (tokenIndex + 1) * initializers.length,\n      ),\n    }),\n  );\n}\n\nfunction createDiscoveryCallContexts(\n  tokenAddresses: readonly Address[],\n  initializers: readonly MulticurveInitializerCandidate[],\n): readonly DiscoveryCallContext[] {\n  return tokenAddresses.flatMap((tokenAddress) =>\n    initializers.map((initializer) => ({\n      tokenAddress,\n      initializer,\n    })),\n  );\n}\n\nfunction createDiscoveryCalls(\n  contexts: readonly DiscoveryCallContext[],\n): readonly Aggregate3Call[] {\n  return contexts.map(({ tokenAddress, initializer }) => ({\n    target: initializer.address,\n    allowFailure: true,\n    callData: encodeFunctionData({\n      abi: getMulticurveInitializerAbi(initializer.kind),\n      functionName: 'getState',\n      args: [tokenAddress],\n    }),\n  }));\n}\n\nfunction findInitializedPoolForToken({\n  tokenAddress,\n  initializers,\n  discoveryResults,\n}: {\n  tokenAddress: Address;\n  initializers: readonly MulticurveInitializerCandidate[];\n  discoveryResults: readonly Aggregate3Result[];\n}): InitializerDiscoveryResult {\n  for (const [index, result] of discoveryResults.entries()) {\n    const initializer = initializers[index];\n    if (!initializer) {\n      throw new Error(\n        'Multicall3 aggregate3 returned an incomplete initializer discovery result',\n      );\n    }\n\n    if (!result.success) {\n      if (isAbsentPoolRevertData(result.returnData)) {\n        continue;\n      }\n\n      throw new Error(\n        `${initializer.address} getState failed for token ${tokenAddress}`,\n      );\n    }\n\n    if (!result.returnData || result.returnData === '0x') {\n      throw new Error(\n        `${initializer.address} getState returned no data for token ${tokenAddress}`,\n      );\n    }\n\n    const discoveryResult = parseMulticurveInitializerDiscoveryResult({\n      tokenAddress,\n      initializerAddress: initializer.address,\n      kind: initializer.kind,\n      stateData: decodeFunctionResult({\n        abi: getMulticurveInitializerAbi(initializer.kind),\n        functionName: 'getState',\n        data: result.returnData,\n      }),\n    });\n\n    if (isInitializedMulticurvePoolKey(discoveryResult.state.poolKey)) {\n      assertPendingFeePreviewable(discoveryResult);\n      return discoveryResult;\n    }\n  }\n\n  throw new Error(\n    `Pool not found for token ${tokenAddress}. ` +\n      `Tried initializers: ${initializers\n        .map((initializer) => initializer.address)\n        .join(', ')}`,\n  );\n}\n\nfunction assertPendingFeePreviewable(\n  discoveryResult: InitializerDiscoveryResult,\n) {\n  const { asset, status } = discoveryResult.state;\n  if (status === LockablePoolStatus.Exited) {\n    throw new Error(\n      `Pending fee preview is only supported for initializer-side multicurve pools: ${asset}`,\n    );\n  }\n\n  if (status !== LockablePoolStatus.Locked) {\n    throw new Error(`Multicurve pool is not locked or was migrated: ${asset}`);\n  }\n}\n\nasync function getPendingFeesForDiscoveredMulticurvePools({\n  client,\n  beneficiary,\n  poolContexts,\n}: {\n  client: MulticurvePendingFeesClient;\n  beneficiary: Address;\n  poolContexts: readonly InitializerDiscoveryResult[];\n}): Promise<readonly MulticurveTokenPendingFees[]> {\n  for (const poolContext of poolContexts) {\n    assertPendingFeePreviewable(poolContext);\n  }\n\n  const previewCalls = poolContexts.flatMap(({ initializerAddress, state }) =>\n    createPendingFeePreviewCalls(\n      initializerAddress,\n      computePoolId(state.poolKey),\n      beneficiary,\n    ),\n  );\n  const previewResults = await callAggregate3(client, previewCalls);\n\n  return poolContexts.map(({ state }, index) => ({\n    tokenAddress: state.asset,\n    ...calculatePendingFees(\n      previewResults.slice(\n        index * PENDING_FEE_PREVIEW_CALL_COUNT,\n        (index + 1) * PENDING_FEE_PREVIEW_CALL_COUNT,\n      ),\n    ),\n  }));\n}\n","import {\n  type Address,\n  type PublicClient,\n  type WalletClient,\n  type Hash,\n} from 'viem';\nimport {\n  type MulticurveDecayFeeSchedule,\n  type MulticurvePoolState,\n  type SupportedPublicClient,\n} from '../../types';\nimport { getAddresses } from '../../addresses';\nimport type { SupportedChainId } from '../../addresses';\nimport type { MulticurvePendingFees } from './multicurve/multicurvePendingFees';\nimport {\n  findMulticurveInitializerForPool,\n  type InitializerDiscoveryClient,\n} from './multicurve/multicurveInitializerDiscovery';\nimport { collectMulticurveFees } from './multicurve/multicurveFeeCollection';\nimport { getMulticurveFeeSchedule } from './multicurve/multicurveFeeSchedule';\nimport {\n  getPendingFeesForMulticurvePool,\n  type MulticurvePendingFeesClient,\n} from './multicurve/multicurvePendingFeeReader';\nexport type { MulticurvePendingFees } from './multicurve/multicurvePendingFees';\n\n/**\n * MulticurvePool class for interacting with V4 multicurve pools\n *\n * Multicurve pools use the V4 multicurve initializer which supports:\n * - Multiple bonding curves with different price ranges\n * - Fee collection for configured beneficiaries\n * - No-migration lockable liquidity\n *\n * Note: V4 pools don't have their own contract addresses. The token address\n * is used as the lookup key to retrieve pool state from the initializer contract.\n *\n * Terminology: The contracts call the created token \"asset\" (paired against \"numeraire\", e.g., WETH).\n * We use \"tokenAddress\" in the SDK for consistency.\n */\nexport class MulticurvePool {\n  private client: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private tokenAddress: Address;\n  private get rpc(): PublicClient {\n    return this.client as PublicClient;\n  }\n\n  constructor(\n    client: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    tokenAddress: Address,\n  ) {\n    this.client = client;\n    this.walletClient = walletClient;\n    this.tokenAddress = tokenAddress;\n  }\n\n  /**\n   * Get the token address for this pool\n   * This is also the lookup key used to retrieve pool state from the initializer\n   * (Called \"asset\" in the contracts, but we use \"tokenAddress\" for SDK consistency)\n   */\n  getTokenAddress(): Address {\n    return this.tokenAddress;\n  }\n\n  /**\n   * Get current pool state from the multicurve initializer\n   *\n   * Automatically discovers which initializer (standard, scheduled, decay, or\n   * doppler-hook) contains the pool.\n   */\n  async getState(): Promise<MulticurvePoolState> {\n    const { state } = await this.findInitializerForPool();\n    return state;\n  }\n\n  /**\n   * Find which initializer contains this pool and return both the address and state.\n   *\n   * Tries v4MulticurveInitializer first (more common), then falls back to\n   * v4ScheduledMulticurveInitializer, v4DecayMulticurveInitializer, and\n   * dopplerHookInitializer if needed.\n   */\n  private async findInitializerForPool() {\n    const chainId = await this.rpc.getChainId();\n    const addresses = getAddresses(chainId as SupportedChainId);\n\n    return findMulticurveInitializerForPool({\n      client: this.rpc as InitializerDiscoveryClient,\n      tokenAddress: this.tokenAddress,\n      addresses,\n    });\n  }\n\n  /**\n   * Collect fees from a locked initializer-side pool.\n   *\n   * This function can be called by any account to pull pool fees into the\n   * initializer. If the caller is a configured beneficiary, their pending share\n   * is released as part of the same transaction.\n   *\n   * @returns Object containing the contract's collectFees return values and the transaction hash.\n   * The returned fee amounts are newly collected pool fees, not necessarily the caller's beneficiary payout.\n   */\n  async collectFees(): Promise<{\n    fees0: bigint;\n    fees1: bigint;\n    transactionHash: Hash;\n  }> {\n    const walletClient = this.walletClient;\n    if (!walletClient) {\n      throw new Error('Wallet client required to collect fees');\n    }\n\n    const chainId = await this.rpc.getChainId();\n    const addresses = getAddresses(chainId as SupportedChainId);\n\n    const { initializerAddress, state } = await this.findInitializerForPool();\n\n    return collectMulticurveFees({\n      client: this.rpc,\n      walletClient,\n      initializerAddress,\n      state,\n      addresses,\n    });\n  }\n\n  /**\n   * Preview pending fees for a beneficiary on an initializer-side multicurve pool.\n   */\n  async getPendingFees(beneficiary: Address): Promise<MulticurvePendingFees> {\n    return getPendingFeesForMulticurvePool({\n      client: this.rpc as MulticurvePendingFeesClient,\n      beneficiary,\n      poolContext: await this.findInitializerForPool(),\n    });\n  }\n\n  /**\n   * Get the numeraire address for this pool\n   */\n  async getNumeraireAddress(): Promise<Address> {\n    const state = await this.getState();\n    return state.numeraire;\n  }\n\n  /**\n   * Get the decay fee schedule for dynamic-fee multicurve pools.\n   *\n   * Returns `null` when the pool is not using dynamic fees.\n   */\n  async getFeeSchedule(): Promise<MulticurveDecayFeeSchedule | null> {\n    const { state } = await this.findInitializerForPool();\n    return getMulticurveFeeSchedule(this.rpc, state);\n  }\n}\n","import {\n  decodeFunctionResult,\n  encodeFunctionData,\n  zeroAddress,\n  type Address,\n  type Hex,\n} from 'viem';\nimport { feesManagerAbi } from '../../../abis';\nimport type { SupportedPublicClient } from '../../../types';\nimport { computePoolId } from '../../../utils/poolKey';\nimport {\n  callAggregate3,\n  type Aggregate3Call,\n  type Aggregate3Result,\n} from '../../../utils/multicall3';\nimport {\n  type InitializerDiscoveryResult,\n  parseMulticurvePoolKey,\n} from './multicurveInitializerDiscovery';\nimport {\n  discoverMulticurveFeePoolContexts,\n  type MulticurvePendingFeesClient,\n} from './multicurvePendingFeeReader';\nimport {\n  calculatePendingFees,\n  createPendingFeePreviewCalls,\n  PENDING_FEE_PREVIEW_CALL_COUNT,\n  type MulticurvePendingFees,\n} from './multicurvePendingFees';\n\nexport type RehypePendingFees =\n  | {\n      readonly mode: 'feesManager';\n      readonly fees0: bigint;\n      readonly fees1: bigint;\n    }\n  | {\n      readonly mode: 'unsupported';\n      readonly fees0: 0n;\n      readonly fees1: 0n;\n    }\n  | {\n      readonly mode: 'notConfigured';\n      readonly fees0: 0n;\n      readonly fees1: 0n;\n    };\n\nexport interface MulticurveTokenPendingFeeBreakdown {\n  readonly tokenAddress: Address;\n  readonly poolInitializerFees: MulticurvePendingFees;\n  readonly rehypeFees: RehypePendingFees;\n}\n\ntype PoolOnlyPreviewPlan = {\n  readonly kind: 'poolOnly';\n  readonly poolContext: InitializerDiscoveryResult;\n  readonly calls: readonly Aggregate3Call[];\n};\n\ntype RehypePreviewPlan = {\n  readonly kind: 'rehype';\n  readonly poolContext: InitializerDiscoveryResult;\n  readonly poolId: Hex;\n  readonly calls: readonly Aggregate3Call[];\n};\n\ntype PendingFeeBreakdownPreviewPlan = PoolOnlyPreviewPlan | RehypePreviewPlan;\n\nconst REHYPE_NOT_CONFIGURED = {\n  mode: 'notConfigured',\n  fees0: 0n,\n  fees1: 0n,\n} as const satisfies RehypePendingFees;\n\nconst REHYPE_UNSUPPORTED = {\n  mode: 'unsupported',\n  fees0: 0n,\n  fees1: 0n,\n} as const satisfies RehypePendingFees;\n\nexport async function getPendingFeeBreakdownForMulticurveTokens({\n  client,\n  beneficiary,\n  tokenAddresses,\n}: {\n  client: SupportedPublicClient;\n  beneficiary: Address;\n  tokenAddresses: readonly Address[];\n}): Promise<readonly MulticurveTokenPendingFeeBreakdown[]> {\n  if (tokenAddresses.length === 0) {\n    return [];\n  }\n\n  const feeClient = client as MulticurvePendingFeesClient;\n  const poolContexts = await discoverMulticurveFeePoolContexts(\n    feeClient,\n    tokenAddresses,\n  );\n  const plans = poolContexts.map((poolContext) =>\n    createPendingFeeBreakdownPreviewPlan(poolContext, beneficiary),\n  );\n  const calls = plans.flatMap(({ calls: planCalls }) => planCalls);\n  const results = await callAggregate3(feeClient, calls);\n\n  if (results.length !== calls.length) {\n    throw new Error(\n      'Multicall3 aggregate3 returned an incomplete pending fee breakdown result',\n    );\n  }\n\n  let resultOffset = 0;\n  return plans.map((plan) => {\n    const planResults = results.slice(\n      resultOffset,\n      resultOffset + plan.calls.length,\n    );\n    resultOffset += plan.calls.length;\n    return decodePendingFeeBreakdownPreview(plan, planResults);\n  });\n}\n\nfunction createPendingFeeBreakdownPreviewPlan(\n  poolContext: InitializerDiscoveryResult,\n  beneficiary: Address,\n): PendingFeeBreakdownPreviewPlan {\n  const poolId = computePoolId(poolContext.state.poolKey);\n  const poolCalls = createPendingFeePreviewCalls(\n    poolContext.initializerAddress,\n    poolId,\n    beneficiary,\n  );\n  if (\n    poolContext.initializerKind !== 'dopplerHook' ||\n    poolContext.dopplerHookAddress === zeroAddress\n  ) {\n    return {\n      kind: 'poolOnly',\n      poolContext,\n      calls: poolCalls,\n    };\n  }\n\n  return {\n    kind: 'rehype',\n    poolContext,\n    poolId,\n    calls: [\n      ...poolCalls,\n      createRehypeCapabilityProbe(poolContext.dopplerHookAddress, poolId),\n      ...createPendingFeePreviewCalls(\n        poolContext.dopplerHookAddress,\n        poolId,\n        beneficiary,\n      ),\n    ],\n  };\n}\n\nfunction createRehypeCapabilityProbe(\n  target: Address,\n  poolId: Hex,\n): Aggregate3Call {\n  return {\n    target,\n    allowFailure: true,\n    callData: encodeFunctionData({\n      abi: feesManagerAbi,\n      functionName: 'getPoolKey',\n      args: [poolId],\n    }),\n  };\n}\n\nfunction decodePendingFeeBreakdownPreview(\n  plan: PendingFeeBreakdownPreviewPlan,\n  results: readonly Aggregate3Result[],\n): MulticurveTokenPendingFeeBreakdown {\n  const poolInitializerFees = calculatePendingFees(\n    results.slice(0, PENDING_FEE_PREVIEW_CALL_COUNT),\n  );\n\n  return {\n    tokenAddress: plan.poolContext.state.asset,\n    poolInitializerFees,\n    rehypeFees:\n      plan.kind === 'poolOnly'\n        ? REHYPE_NOT_CONFIGURED\n        : decodeRehypePendingFees(plan, results),\n  };\n}\n\nfunction decodeRehypePendingFees(\n  plan: RehypePreviewPlan,\n  results: readonly Aggregate3Result[],\n): RehypePendingFees {\n  const capabilityResult = results[PENDING_FEE_PREVIEW_CALL_COUNT];\n  if (\n    !capabilityResult?.success ||\n    !capabilityResult.returnData ||\n    capabilityResult.returnData === '0x'\n  ) {\n    return REHYPE_UNSUPPORTED;\n  }\n\n  const poolKey = parseMulticurvePoolKey(\n    decodeFunctionResult({\n      abi: feesManagerAbi,\n      functionName: 'getPoolKey',\n      data: capabilityResult.returnData,\n    }),\n  );\n  if (poolKey.hooks === zeroAddress) {\n    return REHYPE_UNSUPPORTED;\n  }\n  if (computePoolId(poolKey) !== plan.poolId) {\n    throw new Error(\n      'Rehype FeesManager pool key does not match the discovered pool',\n    );\n  }\n\n  return {\n    mode: 'feesManager',\n    ...calculatePendingFees(\n      results.slice(\n        PENDING_FEE_PREVIEW_CALL_COUNT + 1,\n        PENDING_FEE_PREVIEW_CALL_COUNT * 2 + 1,\n      ),\n    ),\n  };\n}\n","import type { Address, WalletClient } from 'viem';\nimport type { SupportedPublicClient } from '../../types';\nimport {\n  getPendingFeeBreakdownForMulticurveTokens,\n  type MulticurveTokenPendingFeeBreakdown,\n  type RehypePendingFees,\n} from './multicurve/multicurvePendingFeeBreakdown';\nimport type { MulticurveTokenPendingFees } from './multicurve/multicurvePendingFees';\nimport { getPendingFeesForMulticurveTokens } from './multicurve/multicurvePendingFeeReader';\n\nexport interface MulticurveFeesOptions {\n  readonly tokenBatchSize?: number;\n}\n\nexport class MulticurveFees {\n  private readonly client: SupportedPublicClient;\n  private readonly tokenAddresses: readonly Address[];\n  private readonly options: MulticurveFeesOptions;\n\n  constructor(\n    client: SupportedPublicClient,\n    _walletClient: WalletClient | undefined,\n    tokenAddresses: readonly Address[],\n    options: MulticurveFeesOptions = {},\n  ) {\n    this.client = client;\n    this.tokenAddresses = [...tokenAddresses];\n    this.options = { ...options };\n  }\n\n  getPendingFees(\n    beneficiary: Address,\n  ): Promise<readonly MulticurveTokenPendingFees[]>;\n  getPendingFees(\n    beneficiary: Address,\n    options: MulticurveFeesOptions,\n  ): Promise<readonly MulticurveTokenPendingFees[]>;\n  getPendingFees(\n    beneficiary: Address,\n    tokenAddresses: readonly Address[],\n  ): Promise<readonly MulticurveTokenPendingFees[]>;\n  getPendingFees(\n    beneficiary: Address,\n    tokenAddresses: readonly Address[],\n    options: MulticurveFeesOptions,\n  ): Promise<readonly MulticurveTokenPendingFees[]>;\n  async getPendingFees(\n    beneficiary: Address,\n    tokenAddressesOrOptions?: readonly Address[] | MulticurveFeesOptions,\n    options?: MulticurveFeesOptions,\n  ): Promise<readonly MulticurveTokenPendingFees[]> {\n    const hasTokenAddressOverride = isTokenAddressList(tokenAddressesOrOptions);\n    const tokenAddresses = hasTokenAddressOverride\n      ? tokenAddressesOrOptions\n      : this.tokenAddresses;\n    const callOptions = hasTokenAddressOverride\n      ? options\n      : tokenAddressesOrOptions;\n    const tokenBatchSize = getTokenBatchSize(\n      callOptions?.tokenBatchSize ?? this.options.tokenBatchSize,\n    );\n\n    if (!tokenBatchSize || tokenAddresses.length <= tokenBatchSize) {\n      return getPendingFeesForMulticurveTokens({\n        client: this.client,\n        beneficiary,\n        tokenAddresses,\n      });\n    }\n\n    let pendingFees: readonly MulticurveTokenPendingFees[] = [];\n    for (\n      let index = 0;\n      index < tokenAddresses.length;\n      index += tokenBatchSize\n    ) {\n      const batchPendingFees = await getPendingFeesForMulticurveTokens({\n        client: this.client,\n        beneficiary,\n        tokenAddresses: tokenAddresses.slice(index, index + tokenBatchSize),\n      });\n      pendingFees = [...pendingFees, ...batchPendingFees];\n    }\n\n    return pendingFees;\n  }\n\n  getPendingFeeBreakdown(\n    beneficiary: Address,\n  ): Promise<readonly MulticurveTokenPendingFeeBreakdown[]>;\n  getPendingFeeBreakdown(\n    beneficiary: Address,\n    options: MulticurveFeesOptions,\n  ): Promise<readonly MulticurveTokenPendingFeeBreakdown[]>;\n  getPendingFeeBreakdown(\n    beneficiary: Address,\n    tokenAddresses: readonly Address[],\n  ): Promise<readonly MulticurveTokenPendingFeeBreakdown[]>;\n  getPendingFeeBreakdown(\n    beneficiary: Address,\n    tokenAddresses: readonly Address[],\n    options: MulticurveFeesOptions,\n  ): Promise<readonly MulticurveTokenPendingFeeBreakdown[]>;\n  async getPendingFeeBreakdown(\n    beneficiary: Address,\n    tokenAddressesOrOptions?: readonly Address[] | MulticurveFeesOptions,\n    options?: MulticurveFeesOptions,\n  ): Promise<readonly MulticurveTokenPendingFeeBreakdown[]> {\n    const hasTokenAddressOverride = isTokenAddressList(tokenAddressesOrOptions);\n    const tokenAddresses = hasTokenAddressOverride\n      ? tokenAddressesOrOptions\n      : this.tokenAddresses;\n    const callOptions = hasTokenAddressOverride\n      ? options\n      : tokenAddressesOrOptions;\n    const tokenBatchSize = getTokenBatchSize(\n      callOptions?.tokenBatchSize ?? this.options.tokenBatchSize,\n    );\n\n    if (!tokenBatchSize || tokenAddresses.length <= tokenBatchSize) {\n      return getPendingFeeBreakdownForMulticurveTokens({\n        client: this.client,\n        beneficiary,\n        tokenAddresses,\n      });\n    }\n\n    let pendingFees: readonly MulticurveTokenPendingFeeBreakdown[] = [];\n    for (\n      let index = 0;\n      index < tokenAddresses.length;\n      index += tokenBatchSize\n    ) {\n      const batchPendingFees = await getPendingFeeBreakdownForMulticurveTokens({\n        client: this.client,\n        beneficiary,\n        tokenAddresses: tokenAddresses.slice(index, index + tokenBatchSize),\n      });\n      pendingFees = [...pendingFees, ...batchPendingFees];\n    }\n\n    return pendingFees;\n  }\n}\n\nfunction isTokenAddressList(\n  value: readonly Address[] | MulticurveFeesOptions | undefined,\n): value is readonly Address[] {\n  return Array.isArray(value);\n}\n\nfunction getTokenBatchSize(tokenBatchSize: number | undefined) {\n  if (tokenBatchSize === undefined) {\n    return undefined;\n  }\n\n  if (!Number.isInteger(tokenBatchSize) || tokenBatchSize < 1) {\n    throw new Error('tokenBatchSize must be a positive integer');\n  }\n\n  return tokenBatchSize;\n}\n\nexport type {\n  MulticurveTokenPendingFeeBreakdown,\n  MulticurveTokenPendingFees,\n  MulticurveFeesOptions as MulticurvePendingFeesOptions,\n  RehypePendingFees,\n};\n","import type { Address, Hash, Hex, PublicClient, WalletClient } from 'viem';\nimport type {\n  RehypeFeeDistributionInfo,\n  SupportedPublicClient,\n} from '../../types';\nimport { feesManagerAbi, rehypeDopplerHookInitializerAbi } from '../../abis';\nimport { ZERO_ADDRESS } from '../../constants';\nimport { decodeBalanceDelta } from '../../utils';\nimport { callAggregate3 } from '../../utils/multicall3';\nimport {\n  normalizeRehypeFeeDistributionInfo,\n  normalizeRehypeFeeSchedule,\n  normalizeRehypeHookFees,\n  normalizeRehypePoolInfo,\n  type RehypeFeeSchedule,\n  type RehypeHookFees,\n  type RehypePoolInfo,\n} from './contractResults';\nimport {\n  calculatePendingFees,\n  createPendingFeePreviewCalls,\n  type MulticurvePendingFees,\n} from './multicurve/multicurvePendingFees';\n\nconst rehypeFeesManagerAbi = [\n  ...feesManagerAbi,\n  { type: 'error', name: 'FeeBeneficiariesNotConfigured', inputs: [] },\n] as const;\n\nexport class RehypeDopplerHookInitializer {\n  private readonly client: SupportedPublicClient;\n  private readonly walletClient?: WalletClient;\n  private readonly hookAddress: Address;\n\n  private get rpc(): PublicClient {\n    return this.client as PublicClient;\n  }\n\n  constructor(\n    client: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    hookAddress: Address,\n  ) {\n    this.client = client;\n    this.walletClient = walletClient;\n    this.hookAddress = hookAddress;\n  }\n\n  getAddress(): Address {\n    return this.hookAddress;\n  }\n\n  async collectFees(asset: Address): Promise<{\n    amount0: bigint;\n    amount1: bigint;\n    transactionHash: Hash;\n  }> {\n    const walletClient = this.requireWalletClient(\n      'Wallet client required to collect rehype fees',\n    );\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'collectFees',\n      args: [asset],\n      account: walletClient.account,\n    });\n    const hash = await walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n    const decoded = decodeBalanceDelta(result as bigint);\n    return { ...decoded, transactionHash: hash };\n  }\n\n  /**\n   * Collect fees and release the caller's pending beneficiary share.\n   *\n   * @returns The FeesManager `collectFees` return values and transaction hash.\n   * The fee amounts are newly collected pool fees, not necessarily the caller's\n   * beneficiary payout.\n   */\n  async claimFees(\n    poolId: Hex,\n    options?: { gas?: bigint },\n  ): Promise<{\n    fees0: bigint;\n    fees1: bigint;\n    transactionHash: Hash;\n  }> {\n    const walletClient = this.requireWalletClient(\n      'Wallet client required to claim rehype beneficiary fees',\n    );\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeFeesManagerAbi,\n      functionName: 'collectFees',\n      args: [poolId],\n      account: walletClient.account,\n    });\n    const hash = await walletClient.writeContract(\n      options?.gas === undefined ? request : { ...request, gas: options.gas },\n    );\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n    const [fees0, fees1] = result;\n    return { fees0, fees1, transactionHash: hash };\n  }\n\n  async getPendingFees(\n    poolId: Hex,\n    beneficiary: Address,\n  ): Promise<MulticurvePendingFees> {\n    const calls = createPendingFeePreviewCalls(\n      this.hookAddress,\n      poolId,\n      beneficiary,\n    );\n    return calculatePendingFees(await callAggregate3(this.rpc, calls));\n  }\n\n  async updateBeneficiary(\n    poolId: Hex,\n    newBeneficiary: Address,\n  ): Promise<{ transactionHash: Hash }> {\n    if (newBeneficiary.toLowerCase() === ZERO_ADDRESS) {\n      throw new Error(\n        'Rehype beneficiary cannot be updated to the zero address',\n      );\n    }\n    const walletClient = this.requireWalletClient(\n      'Wallet client required to update rehype beneficiary',\n    );\n    const { request } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: feesManagerAbi,\n      functionName: 'updateBeneficiary',\n      args: [poolId, newBeneficiary],\n      account: walletClient.account,\n    });\n    const hash = await walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n    return { transactionHash: hash };\n  }\n\n  async claimAirlockOwnerFees(asset: Address): Promise<{\n    fees0: bigint;\n    fees1: bigint;\n    transactionHash: Hash;\n  }> {\n    const walletClient = this.requireWalletClient(\n      'Wallet client required to claim rehype owner fees',\n    );\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'claimAirlockOwnerFees',\n      args: [asset],\n      account: walletClient.account,\n    });\n    const hash = await walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n    const [fees0, fees1] = result;\n    return { fees0, fees1, transactionHash: hash };\n  }\n\n  /**\n   * Replace a pool's complete fee distribution matrix.\n   *\n   * The connected wallet must be the pool's configured fee distribution\n   * controller (`buybackDst`). The asset-fee allocations and numeraire-fee\n   * allocations must each sum to WAD.\n   *\n   * @returns The confirmed transaction hash.\n   */\n  async setFeeDistribution(\n    poolId: Hex,\n    feeDistributionInfo: RehypeFeeDistributionInfo,\n  ): Promise<{ transactionHash: Hash }> {\n    const walletClient = this.requireWalletClient(\n      'Wallet client required to set rehype fee distribution',\n    );\n    const { request } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'setFeeDistribution',\n      args: [\n        poolId,\n        feeDistributionInfo.assetFeesToAssetBuybackWad,\n        feeDistributionInfo.assetFeesToNumeraireBuybackWad,\n        feeDistributionInfo.assetFeesToBeneficiaryWad,\n        feeDistributionInfo.assetFeesToLpWad,\n        feeDistributionInfo.numeraireFeesToAssetBuybackWad,\n        feeDistributionInfo.numeraireFeesToNumeraireBuybackWad,\n        feeDistributionInfo.numeraireFeesToBeneficiaryWad,\n        feeDistributionInfo.numeraireFeesToLpWad,\n      ],\n      account: walletClient.account,\n    });\n    const hash = await walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n    return { transactionHash: hash };\n  }\n\n  async getFeeDistributionInfo(\n    poolId: Hex,\n  ): Promise<RehypeFeeDistributionInfo> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'getFeeDistributionInfo',\n      args: [poolId],\n    });\n    return normalizeRehypeFeeDistributionInfo(result);\n  }\n\n  async getFeeRoutingMode(poolId: Hex): Promise<number> {\n    const mode = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'getFeeRoutingMode',\n      args: [poolId],\n    });\n    return Number(mode);\n  }\n\n  async getFeeSchedule(poolId: Hex): Promise<RehypeFeeSchedule> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'getFeeSchedule',\n      args: [poolId],\n    });\n    return normalizeRehypeFeeSchedule(result);\n  }\n\n  async getHookFees(poolId: Hex): Promise<RehypeHookFees> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'getHookFees',\n      args: [poolId],\n    });\n    return normalizeRehypeHookFees(result);\n  }\n\n  async getPoolInfo(poolId: Hex): Promise<RehypePoolInfo> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookInitializerAbi,\n      functionName: 'getPoolInfo',\n      args: [poolId],\n    });\n    return normalizeRehypePoolInfo(result);\n  }\n\n  private requireWalletClient(message: string): WalletClient {\n    if (!this.walletClient) {\n      throw new Error(message);\n    }\n    return this.walletClient;\n  }\n}\n","import { RehypeDopplerHookInitializer } from './RehypeDopplerHookInitializer';\n\n/** @deprecated Use RehypeDopplerHookInitializer instead. */\nexport const RehypeDopplerHook = RehypeDopplerHookInitializer;\n\n/** @deprecated Use RehypeDopplerHookInitializer instead. */\nexport type RehypeDopplerHook = RehypeDopplerHookInitializer;\n","import type { Address, Hash, Hex, PublicClient, WalletClient } from 'viem';\nimport type {\n  RehypeFeeDistributionInfo,\n  SupportedPublicClient,\n} from '../../types';\nimport { rehypeDopplerHookMigratorAbi } from '../../abis';\nimport { decodeBalanceDelta } from '../../utils';\nimport {\n  normalizeRehypeFeeDistributionInfo,\n  normalizeRehypeHookFees,\n  normalizeRehypePoolInfo,\n  normalizeRehypePosition,\n  type RehypeHookFees,\n  type RehypePoolInfo,\n  type RehypePosition,\n} from './contractResults';\n\nexport class RehypeDopplerHookMigrator {\n  private client: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private hookAddress: Address;\n  private get rpc(): PublicClient {\n    return this.client as PublicClient;\n  }\n\n  constructor(\n    client: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    hookAddress: Address,\n  ) {\n    this.client = client;\n    this.walletClient = walletClient;\n    this.hookAddress = hookAddress;\n  }\n\n  getAddress(): Address {\n    return this.hookAddress;\n  }\n\n  async collectFees(asset: Address): Promise<{\n    amount0: bigint;\n    amount1: bigint;\n    transactionHash: Hash;\n  }> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required to collect rehype fees');\n    }\n\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'collectFees',\n      args: [asset],\n      account: this.walletClient.account,\n    });\n\n    const hash = await this.walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n    const decoded = decodeBalanceDelta(result as bigint);\n    return {\n      amount0: decoded.amount0,\n      amount1: decoded.amount1,\n      transactionHash: hash,\n    };\n  }\n\n  async claimAirlockOwnerFees(asset: Address): Promise<{\n    fees0: bigint;\n    fees1: bigint;\n    transactionHash: Hash;\n  }> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required to claim rehype owner fees');\n    }\n\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'claimAirlockOwnerFees',\n      args: [asset],\n      account: this.walletClient.account,\n    });\n\n    const hash = await this.walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n    const [fees0, fees1] = result as readonly [bigint, bigint];\n    return { fees0, fees1, transactionHash: hash };\n  }\n\n  async setFeeDistribution(\n    poolId: Hex,\n    feeDistributionInfo: RehypeFeeDistributionInfo,\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required to set rehype fee distribution');\n    }\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'setFeeDistribution',\n      args: [\n        poolId,\n        feeDistributionInfo.assetFeesToAssetBuybackWad,\n        feeDistributionInfo.assetFeesToNumeraireBuybackWad,\n        feeDistributionInfo.assetFeesToBeneficiaryWad,\n        feeDistributionInfo.assetFeesToLpWad,\n        feeDistributionInfo.numeraireFeesToAssetBuybackWad,\n        feeDistributionInfo.numeraireFeesToNumeraireBuybackWad,\n        feeDistributionInfo.numeraireFeesToBeneficiaryWad,\n        feeDistributionInfo.numeraireFeesToLpWad,\n      ],\n      account: this.walletClient.account,\n    });\n\n    const hash = await this.walletClient.writeContract(request);\n    await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n    return hash;\n  }\n\n  async getFeeDistributionInfo(\n    poolId: Hex,\n  ): Promise<RehypeFeeDistributionInfo> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'getFeeDistributionInfo',\n      args: [poolId],\n    });\n\n    return normalizeRehypeFeeDistributionInfo(result);\n  }\n\n  async getFeeRoutingMode(poolId: Hex): Promise<number> {\n    const mode = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'getFeeRoutingMode',\n      args: [poolId],\n    });\n    return Number(mode);\n  }\n\n  async getHookFees(poolId: Hex): Promise<RehypeHookFees> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'getHookFees',\n      args: [poolId],\n    });\n\n    return normalizeRehypeHookFees(result);\n  }\n\n  async getPoolInfo(poolId: Hex): Promise<RehypePoolInfo> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'getPoolInfo',\n      args: [poolId],\n    });\n\n    return normalizeRehypePoolInfo(result);\n  }\n\n  async getPosition(poolId: Hex): Promise<RehypePosition> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: rehypeDopplerHookMigratorAbi,\n      functionName: 'getPosition',\n      args: [poolId],\n    });\n\n    return normalizeRehypePosition(result);\n  }\n}\n","import {\n  type Account,\n  type Address,\n  type Hash,\n  type Hex,\n  type PublicClient,\n  type WalletClient,\n  encodeAbiParameters,\n  encodePacked,\n  keccak256,\n  zeroHash,\n} from 'viem';\nimport { openingAuctionPositionManagerAbi } from '../../abis';\nimport type { SupportedPublicClient, V4PoolKey } from '../../types';\nimport { INT24_MIN, INT24_MAX } from '../../constants';\nimport { decodeBalanceDelta } from '../../utils';\nimport { resolveGasEstimate } from '../../utils/gasEstimate';\nimport { OpeningAuction } from './OpeningAuction';\n\nexport interface OpeningAuctionModifyLiquidityParams {\n  tickLower: number;\n  tickUpper: number;\n  liquidityDelta: bigint;\n  salt: Hash; // bytes32\n}\n\nexport interface OpeningAuctionModifyLiquiditySimulationResult {\n  request: unknown;\n  gasEstimate: bigint;\n  delta: bigint;\n  decoded: {\n    amount0: bigint;\n    amount1: bigint;\n  };\n}\n\nexport interface OpeningAuctionWithdrawFullBidSimulationResult {\n  positionId: bigint;\n  liquidity: bigint;\n  simulation: OpeningAuctionModifyLiquiditySimulationResult;\n}\n\nexport interface OpeningAuctionWithdrawFullBidResult {\n  positionId: bigint;\n  liquidity: bigint;\n  transactionHash: Hash;\n}\n\n/**\n * Minimal wrapper around the onchain OpeningAuctionPositionManager.\n *\n * This contract is the intended entrypoint for users to add/remove liquidity\n * during the OpeningAuction, enforcing that the owner encoded in `hookData`\n * matches `msg.sender` to prevent unauthorized removals.\n */\nexport class OpeningAuctionPositionManager {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private positionManagerAddress: Address;\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    positionManagerAddress: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.positionManagerAddress = positionManagerAddress;\n  }\n\n  getAddress(): Address {\n    return this.positionManagerAddress;\n  }\n\n  async getPoolManager(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.positionManagerAddress,\n      abi: openingAuctionPositionManagerAbi,\n      functionName: 'poolManager',\n    });\n  }\n\n  static encodeOwnerHookData(\n    owner: Address,\n    format: 'packed' | 'abi' = 'packed',\n  ): Hex {\n    // The hook accepts either 20-byte packed address or ABI-encoded address.\n    if (format === 'packed') return owner as unknown as Hex;\n    return encodeAbiParameters([{ type: 'address' }], [owner]);\n  }\n\n  static decodeDelta(delta: bigint): { amount0: bigint; amount1: bigint } {\n    return decodeBalanceDelta(delta);\n  }\n\n  static computePositionKey(args: {\n    owner: Address;\n    tickLower: number;\n    tickUpper: number;\n    salt: Hash;\n  }): Hash {\n    // Mirrors `keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))`.\n    return keccak256(\n      encodePacked(\n        ['address', 'int24', 'int24', 'bytes32'],\n        [args.owner, args.tickLower, args.tickUpper, args.salt],\n      ),\n    );\n  }\n\n  static buildSingleTickParams(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidityDelta: bigint;\n    salt?: Hash;\n  }): OpeningAuctionModifyLiquidityParams {\n    const { tickLower, tickUpper } =\n      OpeningAuctionPositionManager.validateSingleTick({\n        key: args.key,\n        tickLower: args.tickLower,\n      });\n\n    return {\n      tickLower,\n      tickUpper,\n      liquidityDelta: args.liquidityDelta,\n      salt: args.salt ?? zeroHash,\n    };\n  }\n\n  static validateSingleTick(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    tickUpper?: number;\n  }): { tickLower: number; tickUpper: number } {\n    if (!Number.isInteger(args.tickLower)) {\n      throw new Error('tickLower must be an integer int24');\n    }\n    if (args.tickLower < INT24_MIN || args.tickLower > INT24_MAX) {\n      throw new Error(\n        `tickLower out of int24 bounds (${INT24_MIN}..${INT24_MAX})`,\n      );\n    }\n    if (!Number.isInteger(args.key.tickSpacing) || args.key.tickSpacing <= 0) {\n      throw new Error('tickSpacing must be a positive integer');\n    }\n    if (args.tickLower % args.key.tickSpacing !== 0) {\n      throw new Error(\n        `tickLower (${args.tickLower}) must align to tickSpacing (${args.key.tickSpacing})`,\n      );\n    }\n\n    const tickUpper = args.tickUpper ?? args.tickLower + args.key.tickSpacing;\n    if (!Number.isInteger(tickUpper)) {\n      throw new Error('tickUpper must be an integer int24');\n    }\n    if (tickUpper < INT24_MIN || tickUpper > INT24_MAX) {\n      throw new Error(\n        `tickUpper out of int24 bounds (${INT24_MIN}..${INT24_MAX})`,\n      );\n    }\n    if (tickUpper - args.tickLower !== args.key.tickSpacing) {\n      throw new Error(\n        `single-tick bids require tickUpper - tickLower == tickSpacing (${args.key.tickSpacing})`,\n      );\n    }\n\n    return {\n      tickLower: args.tickLower,\n      tickUpper,\n    };\n  }\n\n  private static assertPositiveLiquidity(\n    liquidity: bigint,\n    operation: 'placeBid' | 'withdrawBid',\n  ): void {\n    if (liquidity <= 0n) {\n      throw new Error(`${operation} requires liquidity > 0`);\n    }\n  }\n\n  private async estimateModifyLiquidityGas(\n    args:\n      | {\n          key: V4PoolKey;\n          params: OpeningAuctionModifyLiquidityParams;\n          account?: Address | Account;\n        }\n      | {\n          key: V4PoolKey;\n          params: OpeningAuctionModifyLiquidityParams;\n          hookData: Hex;\n          account?: Address | Account;\n        },\n  ): Promise<bigint> {\n    if ('hookData' in args) {\n      return await this.rpc.estimateContractGas({\n        address: this.positionManagerAddress,\n        abi: openingAuctionPositionManagerAbi,\n        functionName: 'modifyLiquidity',\n        args: [args.key, args.params, args.hookData],\n        account: args.account ?? this.walletClient?.account,\n      } as any);\n    }\n\n    return await this.rpc.estimateContractGas({\n      address: this.positionManagerAddress,\n      abi: openingAuctionPositionManagerAbi,\n      functionName: 'modifyLiquidity',\n      args: [args.key, args.params],\n      account: args.account ?? this.walletClient?.account,\n    } as any);\n  }\n\n  async simulateModifyLiquidity(\n    key: V4PoolKey,\n    params: OpeningAuctionModifyLiquidityParams,\n    account?: Address | Account,\n  ): Promise<OpeningAuctionModifyLiquiditySimulationResult> {\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.positionManagerAddress,\n      abi: openingAuctionPositionManagerAbi,\n      functionName: 'modifyLiquidity',\n      args: [key, params],\n      account: account ?? this.walletClient?.account,\n    } as any);\n\n    const gasEstimate = await resolveGasEstimate(request, () =>\n      this.estimateModifyLiquidityGas({ key, params, account }),\n    );\n\n    const delta = result as unknown as bigint;\n    return {\n      request,\n      gasEstimate,\n      delta,\n      decoded: decodeBalanceDelta(delta),\n    };\n  }\n\n  async estimateModifyLiquidityGasWithoutHookData(\n    key: V4PoolKey,\n    params: OpeningAuctionModifyLiquidityParams,\n    account?: Address | Account,\n  ): Promise<bigint> {\n    return await this.estimateModifyLiquidityGas({ key, params, account });\n  }\n\n  async estimateModifyLiquidityGasWithHookData(\n    key: V4PoolKey,\n    params: OpeningAuctionModifyLiquidityParams,\n    hookData: Hex,\n    account?: Address | Account,\n  ): Promise<bigint> {\n    return await this.estimateModifyLiquidityGas({\n      key,\n      params,\n      hookData,\n      account,\n    });\n  }\n\n  async modifyLiquidity(\n    key: V4PoolKey,\n    params: OpeningAuctionModifyLiquidityParams,\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateModifyLiquidity(\n      key,\n      params,\n      this.walletClient.account,\n    );\n\n    return await this.walletClient.writeContract(request as any);\n  }\n\n  async simulateModifyLiquidityWithHookData(\n    key: V4PoolKey,\n    params: OpeningAuctionModifyLiquidityParams,\n    hookData: Hex,\n    account?: Address | Account,\n  ): Promise<OpeningAuctionModifyLiquiditySimulationResult> {\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.positionManagerAddress,\n      abi: openingAuctionPositionManagerAbi,\n      functionName: 'modifyLiquidity',\n      args: [key, params, hookData],\n      account: account ?? this.walletClient?.account,\n    } as any);\n\n    const gasEstimate = await resolveGasEstimate(request, () =>\n      this.estimateModifyLiquidityGas({ key, params, hookData, account }),\n    );\n\n    const delta = result as unknown as bigint;\n    return {\n      request,\n      gasEstimate,\n      delta,\n      decoded: decodeBalanceDelta(delta),\n    };\n  }\n\n  async modifyLiquidityWithHookData(\n    key: V4PoolKey,\n    params: OpeningAuctionModifyLiquidityParams,\n    hookData: Hex,\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateModifyLiquidityWithHookData(\n      key,\n      params,\n      hookData,\n      this.walletClient.account,\n    );\n\n    return await this.walletClient.writeContract(request as any);\n  }\n\n  async simulatePlaceBid(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidity: bigint;\n    salt?: Hash;\n    hookData?: Hex;\n    account?: Address | Account;\n  }): Promise<OpeningAuctionModifyLiquiditySimulationResult> {\n    OpeningAuctionPositionManager.assertPositiveLiquidity(\n      args.liquidity,\n      'placeBid',\n    );\n\n    const params = OpeningAuctionPositionManager.buildSingleTickParams({\n      key: args.key,\n      tickLower: args.tickLower,\n      liquidityDelta: args.liquidity,\n      salt: args.salt,\n    });\n\n    if (args.hookData) {\n      return this.simulateModifyLiquidityWithHookData(\n        args.key,\n        params,\n        args.hookData,\n        args.account,\n      );\n    }\n\n    return this.simulateModifyLiquidity(args.key, params, args.account);\n  }\n\n  async estimatePlaceBidGas(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidity: bigint;\n    salt?: Hash;\n    hookData?: Hex;\n    account?: Address | Account;\n  }): Promise<bigint> {\n    const simulation = await this.simulatePlaceBid(args);\n    return simulation.gasEstimate;\n  }\n\n  async placeBid(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidity: bigint;\n    salt?: Hash;\n    hookData?: Hex;\n  }): Promise<Hash> {\n    OpeningAuctionPositionManager.assertPositiveLiquidity(\n      args.liquidity,\n      'placeBid',\n    );\n\n    const params = OpeningAuctionPositionManager.buildSingleTickParams({\n      key: args.key,\n      tickLower: args.tickLower,\n      liquidityDelta: args.liquidity,\n      salt: args.salt,\n    });\n\n    if (args.hookData) {\n      return this.modifyLiquidityWithHookData(args.key, params, args.hookData);\n    }\n\n    return this.modifyLiquidity(args.key, params);\n  }\n\n  async simulateWithdrawBid(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidity: bigint;\n    salt?: Hash;\n    hookData?: Hex;\n    account?: Address | Account;\n  }): Promise<OpeningAuctionModifyLiquiditySimulationResult> {\n    OpeningAuctionPositionManager.assertPositiveLiquidity(\n      args.liquidity,\n      'withdrawBid',\n    );\n\n    const params = OpeningAuctionPositionManager.buildSingleTickParams({\n      key: args.key,\n      tickLower: args.tickLower,\n      liquidityDelta: -args.liquidity,\n      salt: args.salt,\n    });\n\n    if (args.hookData) {\n      return this.simulateModifyLiquidityWithHookData(\n        args.key,\n        params,\n        args.hookData,\n        args.account,\n      );\n    }\n\n    return this.simulateModifyLiquidity(args.key, params, args.account);\n  }\n\n  async estimateWithdrawBidGas(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidity: bigint;\n    salt?: Hash;\n    hookData?: Hex;\n    account?: Address | Account;\n  }): Promise<bigint> {\n    const simulation = await this.simulateWithdrawBid(args);\n    return simulation.gasEstimate;\n  }\n\n  async withdrawBid(args: {\n    key: V4PoolKey;\n    tickLower: number;\n    liquidity: bigint;\n    salt?: Hash;\n    hookData?: Hex;\n  }): Promise<Hash> {\n    OpeningAuctionPositionManager.assertPositiveLiquidity(\n      args.liquidity,\n      'withdrawBid',\n    );\n\n    const params = OpeningAuctionPositionManager.buildSingleTickParams({\n      key: args.key,\n      tickLower: args.tickLower,\n      liquidityDelta: -args.liquidity,\n      salt: args.salt,\n    });\n\n    if (args.hookData) {\n      return this.modifyLiquidityWithHookData(args.key, params, args.hookData);\n    }\n\n    return this.modifyLiquidity(args.key, params);\n  }\n\n  async simulateWithdrawFullBid(args: {\n    openingAuctionHookAddress: Address;\n    key: V4PoolKey;\n    tickLower: number;\n    salt?: Hash;\n    hookData?: Hex;\n    owner?: Address;\n    account?: Address | Account;\n  }): Promise<OpeningAuctionWithdrawFullBidSimulationResult> {\n    const opening = new OpeningAuction(\n      this.publicClient,\n      this.walletClient,\n      args.openingAuctionHookAddress,\n    );\n\n    const accountAddress =\n      typeof args.account === 'string'\n        ? args.account\n        : (args.account?.address ??\n          (typeof this.walletClient?.account === 'string'\n            ? this.walletClient.account\n            : this.walletClient?.account?.address));\n    const owner = args.owner ?? accountAddress;\n    if (!owner) {\n      throw new Error(\n        'owner (or account/walletClient) is required to resolve positionId',\n      );\n    }\n\n    const { tickLower, tickUpper } =\n      OpeningAuctionPositionManager.validateSingleTick({\n        key: args.key,\n        tickLower: args.tickLower,\n      });\n    const salt = args.salt ?? zeroHash;\n\n    const positionId = await opening.getPositionId({\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n    });\n\n    if (positionId === 0n) {\n      throw new Error('Position not found for the given (owner,ticks,salt)');\n    }\n\n    const position = await opening.getPosition(positionId);\n    const liquidity = position.liquidity;\n    if (liquidity === 0n) {\n      throw new Error('Position has zero liquidity');\n    }\n\n    const simulation = await this.simulateWithdrawBid({\n      key: args.key,\n      tickLower,\n      liquidity,\n      salt,\n      hookData: args.hookData,\n      account: args.account,\n    });\n\n    return { positionId, liquidity, simulation };\n  }\n\n  async withdrawFullBid(args: {\n    openingAuctionHookAddress: Address;\n    key: V4PoolKey;\n    tickLower: number;\n    salt?: Hash;\n    hookData?: Hex;\n    owner?: Address;\n  }): Promise<OpeningAuctionWithdrawFullBidResult> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const walletAccount = this.walletClient.account;\n    const walletAddress =\n      typeof walletAccount === 'string'\n        ? walletAccount\n        : walletAccount?.address;\n    if (!walletAddress) {\n      throw new Error('Wallet client must have an account configured');\n    }\n\n    const opening = new OpeningAuction(\n      this.publicClient,\n      this.walletClient,\n      args.openingAuctionHookAddress,\n    );\n    const owner = args.owner ?? walletAddress;\n    const { tickLower, tickUpper } =\n      OpeningAuctionPositionManager.validateSingleTick({\n        key: args.key,\n        tickLower: args.tickLower,\n      });\n    const salt = args.salt ?? zeroHash;\n\n    const positionId = await opening.getPositionId({\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n    });\n\n    if (positionId === 0n) {\n      throw new Error('Position not found for the given (owner,ticks,salt)');\n    }\n\n    const position = await opening.getPosition(positionId);\n    const liquidity = position.liquidity;\n    if (liquidity === 0n) {\n      throw new Error('Position has zero liquidity');\n    }\n\n    const transactionHash = await this.withdrawBid({\n      key: args.key,\n      tickLower,\n      liquidity,\n      salt,\n      hookData: args.hookData,\n    });\n\n    return { positionId, liquidity, transactionHash };\n  }\n}\n","import {\n  type Account,\n  type Address,\n  type Hash,\n  type PublicClient,\n  type WalletClient,\n  zeroAddress,\n  zeroHash,\n} from 'viem';\nimport type { SupportedPublicClient, V4PoolKey } from '../../types';\nimport { normalizePoolKey } from '../../utils/poolKey';\nimport { resolveGasEstimate } from '../../utils/gasEstimate';\nimport { OpeningAuctionPositionManager } from './OpeningAuctionPositionManager';\n\nconst openingAuctionEntityAbi = [\n  {\n    type: 'function',\n    name: 'positionManager',\n    inputs: [],\n    outputs: [{ type: 'address' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'phase',\n    inputs: [],\n    outputs: [{ type: 'uint8' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'auctionStartTime',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'auctionEndTime',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'incentivesClaimDeadline',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'clearingTick',\n    inputs: [],\n    outputs: [{ type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalTokensSold',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalProceeds',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalAuctionTokens',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'incentiveTokensTotal',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'totalIncentivesClaimed',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'cachedTotalWeightedTimeX128',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'positionHarvestedTimeX128',\n    inputs: [{ name: 'positionId', type: 'uint256' }],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'positions',\n    inputs: [{ name: 'positionId', type: 'uint256' }],\n    outputs: [\n      {\n        type: 'tuple',\n        components: [\n          { name: 'owner', type: 'address' },\n          { name: 'tickLower', type: 'int24' },\n          { name: 'tickUpper', type: 'int24' },\n          { name: 'liquidity', type: 'uint128' },\n          { name: 'rewardDebtX128', type: 'uint256' },\n          { name: 'hasClaimedIncentives', type: 'bool' },\n        ],\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isInRange',\n    inputs: [{ name: 'positionId', type: 'uint256' }],\n    outputs: [{ type: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'calculateIncentives',\n    inputs: [{ name: 'positionId', type: 'uint256' }],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'getPositionId',\n    inputs: [\n      { name: 'owner', type: 'address' },\n      { name: 'tickLower', type: 'int24' },\n      { name: 'tickUpper', type: 'int24' },\n      { name: 'salt', type: 'bytes32' },\n    ],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'positionKeyToId',\n    inputs: [{ name: 'positionKey', type: 'bytes32' }],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'settleAuction',\n    inputs: [],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'claimIncentives',\n    inputs: [{ name: 'positionId', type: 'uint256' }],\n    outputs: [],\n    stateMutability: 'nonpayable',\n  },\n  {\n    type: 'function',\n    name: 'estimatedClearingTick',\n    inputs: [],\n    outputs: [{ type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'liquidityAtTick',\n    inputs: [{ name: 'tick', type: 'int24' }],\n    outputs: [{ type: 'uint128' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'nextPositionId',\n    inputs: [],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'ownerPositions',\n    inputs: [\n      { name: 'owner', type: 'address' },\n      { name: 'index', type: 'uint256' },\n    ],\n    outputs: [{ type: 'uint256' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'isToken0',\n    inputs: [],\n    outputs: [{ type: 'bool' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'poolKey',\n    inputs: [],\n    outputs: [\n      {\n        type: 'tuple',\n        components: [\n          { name: 'currency0', type: 'address' },\n          { name: 'currency1', type: 'address' },\n          { name: 'fee', type: 'uint24' },\n          { name: 'tickSpacing', type: 'int24' },\n          { name: 'hooks', type: 'address' },\n        ],\n      },\n    ],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minLiquidity',\n    inputs: [],\n    outputs: [{ type: 'uint128' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minAcceptableTickToken0',\n    inputs: [],\n    outputs: [{ type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'function',\n    name: 'minAcceptableTickToken1',\n    inputs: [],\n    outputs: [{ type: 'int24' }],\n    stateMutability: 'view',\n  },\n  {\n    type: 'event',\n    name: 'AuctionSettled',\n    inputs: [\n      { name: 'clearingTick', type: 'int24', indexed: false },\n      { name: 'tokensSold', type: 'uint256', indexed: false },\n      { name: 'proceeds', type: 'uint256', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'BidPlaced',\n    inputs: [\n      { name: 'positionId', type: 'uint256', indexed: true },\n      { name: 'owner', type: 'address', indexed: true },\n      { name: 'tickLower', type: 'int24', indexed: false },\n      { name: 'liquidity', type: 'uint128', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'BidWithdrawn',\n    inputs: [{ name: 'positionId', type: 'uint256', indexed: true }],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'IncentivesClaimed',\n    inputs: [\n      { name: 'positionId', type: 'uint256', indexed: true },\n      { name: 'owner', type: 'address', indexed: true },\n      { name: 'amount', type: 'uint256', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'EstimatedClearingTickUpdated',\n    inputs: [\n      { name: 'newEstimatedClearingTick', type: 'int24', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'PhaseChanged',\n    inputs: [\n      { name: 'oldPhase', type: 'uint8', indexed: true },\n      { name: 'newPhase', type: 'uint8', indexed: true },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'AuctionStarted',\n    inputs: [\n      { name: 'auctionStartTime', type: 'uint256', indexed: false },\n      { name: 'auctionEndTime', type: 'uint256', indexed: false },\n      { name: 'totalAuctionTokens', type: 'uint256', indexed: false },\n      { name: 'incentiveTokensTotal', type: 'uint256', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TickEnteredRange',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true },\n      { name: 'liquidity', type: 'uint128', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TickExitedRange',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true },\n      { name: 'liquidity', type: 'uint128', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'LiquidityAddedToTick',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true },\n      { name: 'liquidityAdded', type: 'uint128', indexed: false },\n      { name: 'totalLiquidity', type: 'uint128', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'LiquidityRemovedFromTick',\n    inputs: [\n      { name: 'tick', type: 'int24', indexed: true },\n      { name: 'liquidityRemoved', type: 'uint128', indexed: false },\n      { name: 'remainingLiquidity', type: 'uint128', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'TimeHarvested',\n    inputs: [\n      { name: 'positionId', type: 'uint256', indexed: true },\n      { name: 'harvestedTimeX128', type: 'uint256', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'IncentivesRecovered',\n    inputs: [\n      { name: 'recipient', type: 'address', indexed: true },\n      { name: 'amount', type: 'uint256', indexed: false },\n    ],\n    anonymous: false,\n  },\n] as const;\n\nexport interface OpeningAuctionPosition {\n  owner: Address;\n  tickLower: number;\n  tickUpper: number;\n  liquidity: bigint;\n  rewardDebtX128: bigint;\n  hasClaimedIncentives: boolean;\n}\n\nexport interface OpeningAuctionSettlementData {\n  clearingTick: number;\n  totalTokensSold: bigint;\n  totalProceeds: bigint;\n  totalAuctionTokens: bigint;\n  incentiveTokensTotal: bigint;\n}\n\nexport interface OpeningAuctionIncentiveData {\n  incentiveTokensTotal: bigint;\n  totalIncentivesClaimed: bigint;\n  cachedTotalWeightedTimeX128: bigint;\n  incentivesClaimDeadline: bigint;\n}\n\nexport interface OpeningAuctionBidConstraints {\n  minLiquidity: bigint;\n  minAcceptableTickToken0: number;\n  minAcceptableTickToken1: number;\n}\n\nexport interface OpeningAuctionAuctionSettledEvent {\n  clearingTick: number;\n  tokensSold: bigint;\n  proceeds: bigint;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport interface OpeningAuctionWatchSettlementOptions {\n  fromBlock?: bigint;\n  poll?: boolean;\n  pollingInterval?: number;\n  strict?: boolean;\n  onError?: (error: Error) => void;\n  onSettled: (event: OpeningAuctionAuctionSettledEvent) => void;\n}\n\nimport {\n  INT24_MIN,\n  INT24_MAX,\n  OPENING_AUCTION_PHASE_NOT_STARTED,\n  OPENING_AUCTION_PHASE_SETTLED,\n} from '../../constants';\n\nexport class OpeningAuction {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private hookAddress: Address;\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    hookAddress: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.hookAddress = hookAddress;\n  }\n\n  getAddress(): Address {\n    return this.hookAddress;\n  }\n\n  async getPositionManager(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'positionManager',\n    });\n  }\n\n  async getPhase(): Promise<number> {\n    const phase = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'phase',\n    });\n    return Number(phase);\n  }\n\n  async getAuctionTimes(): Promise<{\n    auctionStartTime: bigint;\n    auctionEndTime: bigint;\n    incentivesClaimDeadline: bigint;\n  }> {\n    const [auctionStartTime, auctionEndTime, incentivesClaimDeadline] =\n      await Promise.all([\n        this.rpc.readContract({\n          address: this.hookAddress,\n          abi: openingAuctionEntityAbi,\n          functionName: 'auctionStartTime',\n        }),\n        this.rpc.readContract({\n          address: this.hookAddress,\n          abi: openingAuctionEntityAbi,\n          functionName: 'auctionEndTime',\n        }),\n        this.rpc.readContract({\n          address: this.hookAddress,\n          abi: openingAuctionEntityAbi,\n          functionName: 'incentivesClaimDeadline',\n        }),\n      ]);\n\n    return {\n      auctionStartTime,\n      auctionEndTime,\n      incentivesClaimDeadline,\n    };\n  }\n\n  async getSettlementData(): Promise<OpeningAuctionSettlementData> {\n    const [\n      clearingTick,\n      totalTokensSold,\n      totalProceeds,\n      totalAuctionTokens,\n      incentiveTokensTotal,\n    ] = await Promise.all([\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'clearingTick',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'totalTokensSold',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'totalProceeds',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'totalAuctionTokens',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'incentiveTokensTotal',\n      }),\n    ]);\n\n    return {\n      clearingTick: Number(clearingTick),\n      totalTokensSold,\n      totalProceeds,\n      totalAuctionTokens,\n      incentiveTokensTotal,\n    };\n  }\n\n  async getIncentiveData(): Promise<OpeningAuctionIncentiveData> {\n    const [\n      incentiveTokensTotal,\n      totalIncentivesClaimed,\n      cachedTotalWeightedTimeX128,\n      incentivesClaimDeadline,\n    ] = await Promise.all([\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'incentiveTokensTotal',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'totalIncentivesClaimed',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'cachedTotalWeightedTimeX128',\n      }),\n      this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'incentivesClaimDeadline',\n      }),\n    ]);\n\n    return {\n      incentiveTokensTotal,\n      totalIncentivesClaimed,\n      cachedTotalWeightedTimeX128,\n      incentivesClaimDeadline,\n    };\n  }\n\n  async getPositionHarvestedTime(positionId: bigint): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'positionHarvestedTimeX128',\n      args: [positionId],\n    });\n  }\n\n  async getPosition(positionId: bigint): Promise<OpeningAuctionPosition> {\n    const position = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'positions',\n      args: [positionId],\n    });\n\n    if (Array.isArray(position)) {\n      const [\n        owner,\n        tickLower,\n        tickUpper,\n        liquidity,\n        rewardDebtX128,\n        hasClaimedIncentives,\n      ] = position as unknown as readonly [\n        Address,\n        number | bigint,\n        number | bigint,\n        bigint,\n        bigint,\n        boolean,\n      ];\n\n      return {\n        owner,\n        tickLower: Number(tickLower),\n        tickUpper: Number(tickUpper),\n        liquidity,\n        rewardDebtX128,\n        hasClaimedIncentives,\n      };\n    }\n\n    const tuple = position as {\n      owner: Address;\n      tickLower: number;\n      tickUpper: number;\n      liquidity: bigint;\n      rewardDebtX128: bigint;\n      hasClaimedIncentives: boolean;\n    };\n\n    return {\n      owner: tuple.owner,\n      tickLower: Number(tuple.tickLower),\n      tickUpper: Number(tuple.tickUpper),\n      liquidity: tuple.liquidity,\n      rewardDebtX128: tuple.rewardDebtX128,\n      hasClaimedIncentives: tuple.hasClaimedIncentives,\n    };\n  }\n\n  async getEstimatedClearingTick(): Promise<number> {\n    const tick = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'estimatedClearingTick',\n    });\n    return Number(tick);\n  }\n\n  async getLiquidityAtTick(tick: number): Promise<bigint> {\n    if (!Number.isInteger(tick)) {\n      throw new Error('tick must be an integer');\n    }\n    if (tick < INT24_MIN || tick > INT24_MAX) {\n      throw new Error(`tick out of int24 bounds (${INT24_MIN}..${INT24_MAX})`);\n    }\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'liquidityAtTick',\n      args: [tick],\n    });\n  }\n\n  async getNextPositionId(): Promise<bigint> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'nextPositionId',\n    });\n    if (result === 0n) {\n      throw new Error(\n        'nextPositionId returned 0, which indicates malformed contract state',\n      );\n    }\n    return result;\n  }\n\n  async getOwnerPositionIdAt(owner: Address, index: bigint): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'ownerPositions',\n      args: [owner, index],\n    });\n  }\n\n  async getIsToken0(): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'isToken0',\n    });\n  }\n\n  async getPoolKey(): Promise<V4PoolKey> {\n    const result = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'poolKey',\n    });\n\n    return normalizePoolKey(result);\n  }\n\n  async getMinLiquidity(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'minLiquidity',\n    });\n  }\n\n  async getMinAcceptableTickToken0(): Promise<number> {\n    const tick = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'minAcceptableTickToken0',\n    });\n    return Number(tick);\n  }\n\n  async getMinAcceptableTickToken1(): Promise<number> {\n    const tick = await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'minAcceptableTickToken1',\n    });\n    return Number(tick);\n  }\n\n  async getBidConstraints(): Promise<OpeningAuctionBidConstraints> {\n    const [minLiquidity, minAcceptableTickToken0, minAcceptableTickToken1] =\n      await Promise.all([\n        this.getMinLiquidity(),\n        this.getMinAcceptableTickToken0(),\n        this.getMinAcceptableTickToken1(),\n      ]);\n\n    return {\n      minLiquidity,\n      minAcceptableTickToken0,\n      minAcceptableTickToken1,\n    };\n  }\n\n  /**\n   * Return position IDs owned by the given address with non-zero liquidity.\n   *\n   * Strategy:\n   * 1) Enumerate owner-indexed positions via `ownerPositions(owner, index)`.\n   * 2) Stop when the first out-of-bounds index is reached.\n   */\n  async getOwnerPositions(owner: Address): Promise<bigint[]> {\n    const ownerLower = owner.toLowerCase();\n    const indexedIds = await this.getOwnerPositionIdsIndexed(owner);\n    if (indexedIds.length === 0) {\n      return [];\n    }\n\n    const positions = await Promise.all(\n      indexedIds.map((positionId) => this.getPosition(positionId)),\n    );\n\n    return indexedIds.filter((positionId, i) => {\n      const pos = positions[i];\n      return pos.owner.toLowerCase() === ownerLower && pos.liquidity > 0n;\n    });\n  }\n\n  private async getOwnerPositionIdsIndexed(owner: Address): Promise<bigint[]> {\n    const MAX_INDEXED_SCAN = 10_000;\n    const BATCH = 50;\n    const ids: bigint[] = [];\n\n    for (let index = 0; index < MAX_INDEXED_SCAN; index += BATCH) {\n      const contracts = Array.from({ length: BATCH }, (_, i) => ({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'ownerPositions' as const,\n        args: [owner, BigInt(index + i)] as const,\n      }));\n\n      const results = await this.rpc.multicall({\n        contracts,\n        allowFailure: true,\n      });\n\n      let firstFailureOffset: number | null = null;\n      for (let i = 0; i < results.length; i++) {\n        const res = results[i];\n        if (res.status === 'success') {\n          if (firstFailureOffset !== null) {\n            throw new Error('ownerPositions indexed enumeration inconsistent');\n          }\n          const id = res.result as bigint;\n          if (id > 0n) ids.push(id);\n        } else if (firstFailureOffset === null) {\n          firstFailureOffset = i;\n        }\n      }\n\n      // Entire batch succeeded — keep scanning.\n      if (firstFailureOffset === null) {\n        continue;\n      }\n\n      // Hit end of list (or owner has no positions).\n      return ids;\n    }\n\n    return ids;\n  }\n\n  /**\n   * Return whether a position is in range.\n   *\n   * Prefers contract-native `isInRange` when available, and falls back to\n   * client-side reconstruction for compatibility.\n   */\n  async isInRange(positionId: bigint): Promise<boolean> {\n    try {\n      const nativeResult = await this.rpc.readContract({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'isInRange',\n        args: [positionId],\n      });\n\n      if (typeof nativeResult === 'boolean') {\n        return nativeResult;\n      }\n    } catch {\n      // fallback below\n    }\n\n    // Fallback: client-side reconstruction.\n    const [position, phase, _isToken0] = await Promise.all([\n      this.getPosition(positionId),\n      this.getPhase(),\n      this.getIsToken0(),\n    ]);\n\n    if (position.owner === zeroAddress) {\n      return false;\n    }\n\n    if (phase === OPENING_AUCTION_PHASE_NOT_STARTED) {\n      return false;\n    }\n\n    let refTick: number;\n    if (phase === OPENING_AUCTION_PHASE_SETTLED) {\n      const settlement = await this.getSettlementData();\n      refTick = settlement.clearingTick;\n    } else {\n      refTick = await this.getEstimatedClearingTick();\n    }\n\n    return refTick >= position.tickLower && refTick < position.tickUpper;\n  }\n\n  async calculateIncentives(positionId: bigint): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'calculateIncentives',\n      args: [positionId],\n    });\n  }\n\n  /**\n   * Compute position ID client-side using computePositionKey + positionKeyToId read.\n   */\n  async getPositionId(args: {\n    owner: Address;\n    tickLower: number;\n    tickUpper: number;\n    salt: Hash;\n  }): Promise<bigint> {\n    const positionKey = OpeningAuctionPositionManager.computePositionKey(args);\n    return await this.getPositionIdFromKey(positionKey);\n  }\n\n  async getPositionIdFromKey(positionKey: Hash): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'positionKeyToId',\n      args: [positionKey],\n    });\n  }\n\n  async estimateSettleAuctionGas(account?: Address | Account): Promise<bigint> {\n    const simulation = await this.simulateSettleAuction(account);\n    return simulation.gasEstimate;\n  }\n\n  async simulateSettleAuction(account?: Address | Account): Promise<{\n    request: unknown;\n    gasEstimate: bigint;\n  }> {\n    const resolvedAccount = account ?? this.walletClient?.account;\n    const { request } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'settleAuction',\n      account: resolvedAccount,\n    } as any);\n\n    const gasEstimate = await resolveGasEstimate(request, () =>\n      this.rpc.estimateContractGas({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'settleAuction',\n        account: resolvedAccount,\n      } as any),\n    );\n\n    return { request, gasEstimate };\n  }\n\n  async settleAuction(options?: { gas?: bigint }): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateSettleAuction(\n      this.walletClient.account,\n    );\n    return await this.walletClient.writeContract(\n      options?.gas\n        ? { ...(request as any), gas: options.gas }\n        : (request as any),\n    );\n  }\n\n  async estimateClaimIncentivesGas(\n    positionId: bigint,\n    account?: Address | Account,\n  ): Promise<bigint> {\n    const simulation = await this.simulateClaimIncentives(positionId, account);\n    return simulation.gasEstimate;\n  }\n\n  async simulateClaimIncentives(\n    positionId: bigint,\n    account?: Address | Account,\n  ): Promise<{\n    request: unknown;\n    gasEstimate: bigint;\n  }> {\n    const resolvedAccount = account ?? this.walletClient?.account;\n    const { request } = await this.rpc.simulateContract({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      functionName: 'claimIncentives',\n      args: [positionId],\n      account: resolvedAccount,\n    } as any);\n\n    const gasEstimate = await resolveGasEstimate(request, () =>\n      this.rpc.estimateContractGas({\n        address: this.hookAddress,\n        abi: openingAuctionEntityAbi,\n        functionName: 'claimIncentives',\n        args: [positionId],\n        account: resolvedAccount,\n      } as any),\n    );\n\n    return { request, gasEstimate };\n  }\n\n  async claimIncentives(\n    positionId: bigint,\n    options?: { gas?: bigint },\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateClaimIncentives(\n      positionId,\n      this.walletClient.account,\n    );\n    return await this.walletClient.writeContract(\n      options?.gas\n        ? { ...(request as any), gas: options.gas }\n        : (request as any),\n    );\n  }\n\n  async claimIncentivesByPositionKey(args: {\n    owner: Address;\n    tickLower: number;\n    tickUpper: number;\n    salt: Hash;\n  }): Promise<Hash> {\n    const positionId = await this.getPositionId(args);\n    if (positionId === 0n) {\n      throw new Error('Position not found for the given (owner,ticks,salt)');\n    }\n\n    return await this.claimIncentives(positionId);\n  }\n\n  watchAuctionSettled(\n    options: OpeningAuctionWatchSettlementOptions,\n  ): () => void {\n    return this.rpc.watchContractEvent({\n      address: this.hookAddress,\n      abi: openingAuctionEntityAbi,\n      eventName: 'AuctionSettled',\n      fromBlock: options.fromBlock,\n      poll: options.poll,\n      pollingInterval: options.pollingInterval,\n      strict: options.strict ?? false,\n      onError: options.onError,\n      onLogs: (logs: any[]) => {\n        for (const log of logs) {\n          const args = (log?.args ?? {}) as {\n            clearingTick?: number | bigint;\n            tokensSold?: bigint;\n            proceeds?: bigint;\n          };\n\n          options.onSettled({\n            clearingTick: Number(args.clearingTick ?? 0),\n            tokensSold: args.tokensSold ?? 0n,\n            proceeds: args.proceeds ?? 0n,\n            transactionHash: (log.transactionHash ?? zeroHash) as Hash,\n            blockNumber: (log.blockNumber ?? 0n) as bigint,\n            logIndex: Number(log.logIndex ?? 0),\n          });\n        }\n      },\n    } as any);\n  }\n}\n","import {\n  type Address,\n  type Hash,\n  type PublicClient,\n  type WalletClient,\n  type Account,\n} from 'viem';\nimport { openingAuctionInitializerAbi } from '../../abis';\nimport type { OpeningAuctionState, SupportedPublicClient } from '../../types';\nimport { normalizePoolKey } from '../../utils/poolKey';\n\nexport class OpeningAuctionLifecycle {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private initializerAddress: Address;\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    initializerAddress: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.initializerAddress = initializerAddress;\n  }\n\n  getAddress(): Address {\n    return this.initializerAddress;\n  }\n\n  async getState(asset: Address): Promise<OpeningAuctionState> {\n    const raw = await this.rpc.readContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'getState',\n      args: [asset],\n    });\n\n    if (Array.isArray(raw)) {\n      const [\n        numeraire,\n        auctionStartTime,\n        auctionEndTime,\n        auctionTokens,\n        dopplerTokens,\n        status,\n        openingAuctionHook,\n        dopplerHook,\n        openingAuctionPoolKey,\n        dopplerInitData,\n        isToken0,\n      ] = raw as unknown as [\n        Address,\n        bigint,\n        bigint,\n        bigint,\n        bigint,\n        number | bigint,\n        Address,\n        Address,\n        unknown,\n        `0x${string}`,\n        boolean,\n      ];\n\n      return {\n        numeraire,\n        auctionStartTime,\n        auctionEndTime,\n        auctionTokens,\n        dopplerTokens,\n        status: Number(status),\n        openingAuctionHook,\n        dopplerHook,\n        openingAuctionPoolKey: normalizePoolKey(openingAuctionPoolKey),\n        dopplerInitData,\n        isToken0,\n      };\n    }\n\n    const obj = raw as unknown as Record<string, unknown>;\n    return {\n      numeraire: obj.numeraire as Address,\n      auctionStartTime: obj.auctionStartTime as bigint,\n      auctionEndTime: obj.auctionEndTime as bigint,\n      auctionTokens: obj.auctionTokens as bigint,\n      dopplerTokens: obj.dopplerTokens as bigint,\n      status: Number(obj.status),\n      openingAuctionHook: obj.openingAuctionHook as Address,\n      dopplerHook: obj.dopplerHook as Address,\n      openingAuctionPoolKey: normalizePoolKey(obj.openingAuctionPoolKey),\n      dopplerInitData: obj.dopplerInitData as `0x${string}`,\n      isToken0: Boolean(obj.isToken0),\n    };\n  }\n\n  async getOpeningAuctionHook(asset: Address): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'getOpeningAuctionHook',\n      args: [asset],\n    });\n  }\n\n  async getDopplerHook(asset: Address): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'getDopplerHook',\n      args: [asset],\n    });\n  }\n\n  async getPositionManager(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'positionManager',\n      args: [],\n    });\n  }\n\n  async simulateCompleteAuction(\n    asset: Address,\n    dopplerSalt: `0x${string}`,\n    account?: Address | Account,\n  ): Promise<{ request: unknown }> {\n    const { request } = await this.rpc.simulateContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'completeAuction',\n      args: [asset, dopplerSalt],\n      account: account ?? this.walletClient?.account,\n    });\n    return { request };\n  }\n\n  async completeAuction(\n    asset: Address,\n    dopplerSalt: `0x${string}`,\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateCompleteAuction(\n      asset,\n      dopplerSalt,\n      this.walletClient.account,\n    );\n\n    return await this.walletClient.writeContract(request as any);\n  }\n\n  async simulateRecoverOpeningAuctionIncentives(\n    asset: Address,\n    account?: Address | Account,\n  ): Promise<{ request: unknown }> {\n    const { request } = await this.rpc.simulateContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'recoverOpeningAuctionIncentives',\n      args: [asset],\n      account: account ?? this.walletClient?.account,\n    });\n    return { request };\n  }\n\n  async recoverOpeningAuctionIncentives(asset: Address): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateRecoverOpeningAuctionIncentives(\n      asset,\n      this.walletClient.account,\n    );\n\n    return await this.walletClient.writeContract(request as any);\n  }\n\n  async simulateSweepOpeningAuctionIncentives(\n    asset: Address,\n    account?: Address | Account,\n  ): Promise<{ request: unknown }> {\n    const { request } = await this.rpc.simulateContract({\n      address: this.initializerAddress,\n      abi: openingAuctionInitializerAbi,\n      functionName: 'sweepOpeningAuctionIncentives',\n      args: [asset],\n      account: account ?? this.walletClient?.account,\n    });\n    return { request };\n  }\n\n  async sweepOpeningAuctionIncentives(asset: Address): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateSweepOpeningAuctionIncentives(\n      asset,\n      this.walletClient.account,\n    );\n\n    return await this.walletClient.writeContract(request as any);\n  }\n}\n","import {\n  type Account,\n  type Address,\n  type Hash,\n  type Hex,\n  type PublicClient,\n  type WalletClient,\n  zeroAddress,\n  zeroHash,\n} from 'viem';\nimport type { SupportedPublicClient, V4PoolKey } from '../../types';\nimport {\n  OPENING_AUCTION_PHASE_NOT_STARTED,\n  OPENING_AUCTION_PHASE_ACTIVE,\n  OPENING_AUCTION_PHASE_SETTLED,\n} from '../../constants';\nimport { getSqrtRatioAtTick } from '../../utils/tickMath';\nimport {\n  getLiquidityForAmount0,\n  getLiquidityForAmount1,\n} from '../../utils/liquidityMath';\nimport {\n  OpeningAuction,\n  type OpeningAuctionAuctionSettledEvent,\n  type OpeningAuctionPosition,\n  type OpeningAuctionWatchSettlementOptions,\n} from './OpeningAuction';\nimport {\n  OpeningAuctionPositionManager,\n  type OpeningAuctionModifyLiquiditySimulationResult,\n  type OpeningAuctionWithdrawFullBidResult,\n  type OpeningAuctionWithdrawFullBidSimulationResult,\n} from './OpeningAuctionPositionManager';\n\nexport interface OpeningAuctionBidManagerConfig {\n  openingAuctionHookAddress: Address;\n  openingAuctionPoolKey: V4PoolKey;\n  positionManagerAddress: Address;\n}\n\nexport interface OpeningAuctionBidArgs {\n  tickLower: number;\n  liquidity: bigint;\n  salt?: Hash;\n  owner?: Address;\n  hookData?: Hex;\n  account?: Address | Account;\n}\n\nexport interface OpeningAuctionWithdrawFullBidArgs {\n  tickLower: number;\n  salt?: Hash;\n  owner?: Address;\n  hookData?: Hex;\n  account?: Address | Account;\n}\n\nexport interface OpeningAuctionBidLookupArgs {\n  tickLower: number;\n  salt?: Hash;\n  owner?: Address;\n  account?: Address | Account;\n}\n\nexport interface OpeningAuctionBidSimulationResult extends OpeningAuctionModifyLiquiditySimulationResult {\n  tickLower: number;\n  tickUpper: number;\n  salt: Hash;\n}\n\nexport interface OpeningAuctionClaimIncentivesSimulationResult {\n  positionId: bigint;\n  request: unknown;\n  gasEstimate: bigint;\n}\n\nexport interface OpeningAuctionBidPositionInfo {\n  owner: Address;\n  tickLower: number;\n  tickUpper: number;\n  salt: Hash;\n  positionKey: Hash;\n  positionId: bigint;\n  position: OpeningAuctionPosition;\n  isInRange: boolean;\n  claimableIncentives: bigint;\n}\n\nexport interface OpeningAuctionBidStatus {\n  exists: boolean;\n  owner: Address;\n  tickLower: number;\n  tickUpper: number;\n  salt: Hash;\n  positionKey: Hash;\n  positionId: bigint;\n  liquidity: bigint;\n  isInRange: boolean;\n  claimableIncentives: bigint;\n  hasClaimedIncentives: boolean;\n  phase: number;\n  estimatedClearingTick: number;\n  wouldBeFilledAtEstimatedClearing: boolean;\n  isAboveEstimatedClearing: boolean;\n}\n\nexport interface OpeningAuctionWatchBidStatusOptions extends OpeningAuctionBidLookupArgs {\n  emitOnBegin?: boolean;\n  poll?: boolean;\n  pollingInterval?: number;\n  onError?: (error: Error) => void;\n  onStatusChange: (\n    status: OpeningAuctionBidStatus,\n    previousStatus: OpeningAuctionBidStatus | null,\n  ) => void;\n}\n\n// Owner-position types (without salt/positionKey since those are not stored on-chain)\nexport interface OpeningAuctionOwnerBidInfo {\n  positionId: bigint;\n  owner: Address;\n  tickLower: number;\n  tickUpper: number;\n  liquidity: bigint;\n  rewardDebtX128: bigint;\n  hasClaimedIncentives: boolean;\n  isInRange: boolean;\n  claimableIncentives: bigint;\n}\n\nexport interface OpeningAuctionOwnerBidStatus extends OpeningAuctionOwnerBidInfo {\n  phase: number;\n  estimatedClearingTick: number;\n  wouldBeFilledAtEstimatedClearing: boolean;\n  isAboveEstimatedClearing: boolean;\n}\n\n// Event watcher types\nexport interface OpeningAuctionBidPlacedEvent {\n  positionId: bigint;\n  owner: Address;\n  tickLower: number;\n  liquidity: bigint;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport interface OpeningAuctionBidWithdrawnEvent {\n  positionId: bigint;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport interface OpeningAuctionIncentivesClaimedEvent {\n  positionId: bigint;\n  owner: Address;\n  amount: bigint;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport interface OpeningAuctionPhaseChangedEvent {\n  oldPhase: number;\n  newPhase: number;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport interface OpeningAuctionEstimatedClearingTickUpdatedEvent {\n  newEstimatedClearingTick: number;\n  transactionHash: Hash;\n  blockNumber: bigint;\n  logIndex: number;\n}\n\nexport interface OpeningAuctionWatchBidPlacedOptions {\n  owner?: Address;\n  fromBlock?: bigint;\n  poll?: boolean;\n  pollingInterval?: number;\n  strict?: boolean;\n  onError?: (error: Error) => void;\n  onBidPlaced: (event: OpeningAuctionBidPlacedEvent) => void;\n}\n\nexport interface OpeningAuctionWatchBidWithdrawnOptions {\n  positionId?: bigint;\n  fromBlock?: bigint;\n  poll?: boolean;\n  pollingInterval?: number;\n  strict?: boolean;\n  onError?: (error: Error) => void;\n  onBidWithdrawn: (event: OpeningAuctionBidWithdrawnEvent) => void;\n}\n\nexport interface OpeningAuctionWatchIncentivesClaimedOptions {\n  owner?: Address;\n  positionId?: bigint;\n  fromBlock?: bigint;\n  poll?: boolean;\n  pollingInterval?: number;\n  strict?: boolean;\n  onError?: (error: Error) => void;\n  onIncentivesClaimed: (event: OpeningAuctionIncentivesClaimedEvent) => void;\n}\n\nexport interface OpeningAuctionWatchPhaseChangeOptions {\n  fromBlock?: bigint;\n  poll?: boolean;\n  pollingInterval?: number;\n  strict?: boolean;\n  onError?: (error: Error) => void;\n  onPhaseChanged: (event: OpeningAuctionPhaseChangedEvent) => void;\n}\n\nexport interface OpeningAuctionWatchEstimatedClearingTickOptions {\n  fromBlock?: bigint;\n  poll?: boolean;\n  pollingInterval?: number;\n  strict?: boolean;\n  onError?: (error: Error) => void;\n  onEstimatedClearingTickUpdated: (\n    event: OpeningAuctionEstimatedClearingTickUpdatedEvent,\n  ) => void;\n}\n\n// --- Phase 2b types ---\n\nexport interface OpeningAuctionMoveBidArgs {\n  fromTickLower: number;\n  toTickLower: number;\n  salt?: Hash;\n  owner?: Address;\n  account?: Address | Account;\n}\n\nexport interface OpeningAuctionMoveBidSimulationResult {\n  withdrawSimulation: OpeningAuctionBidSimulationResult;\n  placeSimulation: OpeningAuctionBidSimulationResult;\n  liquidity: bigint;\n}\n\nexport interface OpeningAuctionMoveBidResult {\n  withdrawTxHash: Hash;\n  placeTxHash: Hash;\n  liquidity: bigint;\n}\n\nexport interface OpeningAuctionBidQuote {\n  tickLower: number;\n  tickUpper: number;\n  liquidity: bigint;\n  amount0Delta: bigint;\n  amount1Delta: bigint;\n  tokenInAmount0: bigint;\n  tokenInAmount1: bigint;\n  estimatedClearingTick: number;\n  wouldBeFilledAtEstimatedClearing: boolean;\n  isAboveEstimatedClearing: boolean;\n  estimatedIncentiveShareBps: number | null;\n}\n\nexport interface OpeningAuctionClaimAllIncentivesPreview {\n  claimablePositions: Array<{\n    positionId: bigint;\n    claimableIncentives: bigint;\n  }>;\n  totalClaimable: bigint;\n  skippedPositions: Array<{\n    positionId: bigint;\n    reason: string;\n  }>;\n}\n\nexport interface OpeningAuctionClaimAllIncentivesResult {\n  results: Array<{\n    positionId: bigint;\n    transactionHash?: Hash;\n    error?: string;\n  }>;\n  totalClaimed: number;\n  totalFailed: number;\n}\n\nexport interface OpeningAuctionBidValidationResult {\n  valid: boolean;\n  errors: string[];\n  warnings: string[];\n  resolved: {\n    owner: Address;\n    tickLower: number;\n    tickUpper: number;\n    salt: Hash;\n  };\n  constraints: {\n    minLiquidity: bigint;\n    minAcceptableTickToken0: number;\n    minAcceptableTickToken1: number;\n    phase: number;\n    estimatedClearingTick: number;\n    isToken0: boolean;\n  };\n}\n\nexport interface OpeningAuctionQuoteFromTokenAmountArgs {\n  tickLower: number;\n  tokenAmount: bigint;\n  tokenIndex: 0 | 1;\n  salt?: Hash;\n  owner?: Address;\n  account?: Address | Account;\n}\n\nexport interface OpeningAuctionQuoteFromTokenAmountResult extends OpeningAuctionBidQuote {\n  tokenAmount: bigint;\n  tokenIndex: 0 | 1;\n}\n\n// ABI subset for event watchers (avoids importing full ABI)\nconst bidManagerEventAbi = [\n  {\n    type: 'event',\n    name: 'BidPlaced',\n    inputs: [\n      { name: 'positionId', type: 'uint256', indexed: true },\n      { name: 'owner', type: 'address', indexed: true },\n      { name: 'tickLower', type: 'int24', indexed: false },\n      { name: 'liquidity', type: 'uint128', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'BidWithdrawn',\n    inputs: [{ name: 'positionId', type: 'uint256', indexed: true }],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'IncentivesClaimed',\n    inputs: [\n      { name: 'positionId', type: 'uint256', indexed: true },\n      { name: 'owner', type: 'address', indexed: true },\n      { name: 'amount', type: 'uint256', indexed: false },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'PhaseChanged',\n    inputs: [\n      { name: 'oldPhase', type: 'uint8', indexed: true },\n      { name: 'newPhase', type: 'uint8', indexed: true },\n    ],\n    anonymous: false,\n  },\n  {\n    type: 'event',\n    name: 'EstimatedClearingTickUpdated',\n    inputs: [\n      { name: 'newEstimatedClearingTick', type: 'int24', indexed: false },\n    ],\n    anonymous: false,\n  },\n] as const;\n\nexport class OpeningAuctionBidManager {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private openingAuction: OpeningAuction;\n  private positionManager: OpeningAuctionPositionManager;\n  private openingAuctionPoolKey: V4PoolKey;\n  private openingAuctionHookAddress: Address;\n\n  // Memoized snapshot for reducing redundant reads within a single call context.\n  // Uses block number instead of wall-clock time for reliable cache invalidation.\n  private _snapshotCache: {\n    phase: number;\n    isToken0: boolean;\n    estimatedClearingTick: number;\n    blockNumber: bigint;\n  } | null = null;\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    config: OpeningAuctionBidManagerConfig,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.openingAuction = new OpeningAuction(\n      publicClient,\n      walletClient,\n      config.openingAuctionHookAddress,\n    );\n    this.positionManager = new OpeningAuctionPositionManager(\n      publicClient,\n      walletClient,\n      config.positionManagerAddress,\n    );\n    this.openingAuctionPoolKey = config.openingAuctionPoolKey;\n    this.openingAuctionHookAddress = config.openingAuctionHookAddress;\n  }\n\n  /**\n   * Construct an OpeningAuctionBidManager from just the hook address.\n   * Reads `poolKey` and `positionManager` from the hook contract.\n   */\n  static async fromHookAddress(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    openingAuctionHookAddress: Address,\n  ): Promise<OpeningAuctionBidManager> {\n    const openingAuction = new OpeningAuction(\n      publicClient,\n      walletClient,\n      openingAuctionHookAddress,\n    );\n\n    const [poolKey, positionManagerAddress] = await Promise.all([\n      openingAuction.getPoolKey(),\n      openingAuction.getPositionManager(),\n    ]);\n\n    return new OpeningAuctionBidManager(publicClient, walletClient, {\n      openingAuctionHookAddress,\n      openingAuctionPoolKey: poolKey,\n      positionManagerAddress,\n    });\n  }\n\n  getOpeningAuctionHookAddress(): Address {\n    return this.openingAuctionHookAddress;\n  }\n\n  getPositionManagerAddress(): Address {\n    return this.positionManager.getAddress();\n  }\n\n  getPoolKey(): V4PoolKey {\n    return this.openingAuctionPoolKey;\n  }\n\n  /**\n   * Preflight validation for a bid. Checks tick alignment, liquidity minimums,\n   * tick acceptability, and phase gating. Returns actionable errors/warnings.\n   */\n  async validateBid(\n    args: OpeningAuctionBidArgs,\n  ): Promise<OpeningAuctionBidValidationResult> {\n    const errors: string[] = [];\n    const warnings: string[] = [];\n\n    const owner = this.resolveOwner(args.owner, args.account);\n    const salt = args.salt ?? zeroHash;\n\n    // Validate tick alignment (this throws on failure, so catch)\n    let tickLower: number;\n    let tickUpper: number;\n    try {\n      const resolved = OpeningAuctionPositionManager.validateSingleTick({\n        key: this.openingAuctionPoolKey,\n        tickLower: args.tickLower,\n      });\n      tickLower = resolved.tickLower;\n      tickUpper = resolved.tickUpper;\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : String(error);\n      errors.push(`Tick validation failed: ${msg}`);\n      tickLower = args.tickLower;\n      tickUpper = args.tickLower + this.openingAuctionPoolKey.tickSpacing;\n    }\n\n    // Read constraints and auction state in parallel\n    const [constraints, phase, isToken0, estimatedClearingTick, blockNumber] =\n      await Promise.all([\n        this.openingAuction.getBidConstraints(),\n        this.openingAuction.getPhase(),\n        this.openingAuction.getIsToken0(),\n        this.openingAuction.getEstimatedClearingTick(),\n        this.rpc.getBlockNumber(),\n      ]);\n\n    const tickValidationPassed = errors.length === 0;\n\n    // Liquidity checks\n    if (args.liquidity <= 0n) {\n      errors.push('Liquidity must be greater than 0');\n    }\n    if (args.liquidity < constraints.minLiquidity) {\n      errors.push(\n        `Liquidity ${args.liquidity} is below minimum ${constraints.minLiquidity}`,\n      );\n    }\n\n    // Tick acceptability checks based on token side\n    if (isToken0) {\n      if (tickLower < constraints.minAcceptableTickToken0) {\n        errors.push(\n          `tickLower ${tickLower} is below minAcceptableTickToken0 ${constraints.minAcceptableTickToken0}`,\n        );\n      }\n    } else {\n      if (tickLower > constraints.minAcceptableTickToken1) {\n        errors.push(\n          `tickLower ${tickLower} is above minAcceptableTickToken1 ${constraints.minAcceptableTickToken1}`,\n        );\n      }\n    }\n\n    // Phase gating\n    if (phase === OPENING_AUCTION_PHASE_NOT_STARTED) {\n      errors.push('Auction has not started yet; bids cannot be placed');\n    }\n    if (phase === OPENING_AUCTION_PHASE_SETTLED) {\n      errors.push('Auction is already settled; new bids cannot be placed');\n    }\n\n    // Update snapshot cache only when tick validation succeeded to avoid\n    // storing snapshot data from malformed bid coordinates.\n    if (tickValidationPassed) {\n      this._snapshotCache = {\n        phase,\n        isToken0,\n        estimatedClearingTick,\n        blockNumber,\n      };\n    }\n\n    // Warning: bid above estimated clearing tick (low fill likelihood)\n    const isAboveEstimatedClearing = isToken0\n      ? tickLower > estimatedClearingTick\n      : tickLower < estimatedClearingTick;\n    if (isAboveEstimatedClearing && phase !== 0) {\n      warnings.push(\n        `Bid at tick ${tickLower} is above the estimated clearing tick ${estimatedClearingTick} (low fill likelihood)`,\n      );\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings,\n      resolved: { owner, tickLower, tickUpper, salt },\n      constraints: {\n        minLiquidity: constraints.minLiquidity,\n        minAcceptableTickToken0: constraints.minAcceptableTickToken0,\n        minAcceptableTickToken1: constraints.minAcceptableTickToken1,\n        phase,\n        estimatedClearingTick,\n        isToken0,\n      },\n    };\n  }\n\n  /**\n   * Reverse-quote: given a token amount, derive liquidity and return an enriched quote.\n   * The token amount must be specified on the auction token side\n   * (`tokenIndex` must match `openingAuction.isToken0()`).\n   */\n  async quoteFromTokenAmount(\n    args: OpeningAuctionQuoteFromTokenAmountArgs,\n  ): Promise<OpeningAuctionQuoteFromTokenAmountResult> {\n    if (args.tokenAmount <= 0n) {\n      throw new Error('tokenAmount must be greater than 0');\n    }\n\n    // Enforce token-side compatibility with the auction\n    const isToken0 = await this.openingAuction.getIsToken0();\n    const expectedTokenIndex = isToken0 ? 0 : 1;\n    if (args.tokenIndex !== expectedTokenIndex) {\n      throw new Error(\n        `Token index ${args.tokenIndex} does not match auction side (isToken0: ${isToken0})`,\n      );\n    }\n\n    const { tickLower, tickUpper } = this.resolveBidCoordinates({\n      tickLower: args.tickLower,\n      salt: args.salt,\n    });\n\n    const sqrtRatioAX96 = getSqrtRatioAtTick(tickLower);\n    const sqrtRatioBX96 = getSqrtRatioAtTick(tickUpper);\n\n    // Derive liquidity from token amount based on which token\n    let liquidity: bigint;\n    if (args.tokenIndex === 0) {\n      liquidity = getLiquidityForAmount0(\n        sqrtRatioAX96,\n        sqrtRatioBX96,\n        args.tokenAmount,\n      );\n    } else {\n      liquidity = getLiquidityForAmount1(\n        sqrtRatioAX96,\n        sqrtRatioBX96,\n        args.tokenAmount,\n      );\n    }\n\n    if (liquidity <= 0n) {\n      throw new Error(\n        'Derived liquidity is 0 for the given token amount and tick range',\n      );\n    }\n\n    const quote = await this.quoteBid({\n      tickLower: args.tickLower,\n      liquidity,\n      salt: args.salt,\n      owner: args.owner,\n      account: args.account,\n    });\n\n    return {\n      ...quote,\n      tokenAmount: args.tokenAmount,\n      tokenIndex: args.tokenIndex,\n    };\n  }\n\n  async estimatePlaceBidGas(args: OpeningAuctionBidArgs): Promise<bigint> {\n    await this.assertValidBid(args);\n    const simulation = await this.simulatePlaceBid(args);\n    return simulation.gasEstimate;\n  }\n\n  async simulatePlaceBid(\n    args: OpeningAuctionBidArgs,\n  ): Promise<OpeningAuctionBidSimulationResult> {\n    await this.assertValidBid(args);\n    const { tickLower, tickUpper, salt } = this.resolveBidCoordinates(args);\n    const owner = this.resolveOwnerOrUndefined(args.owner, args.account);\n    const hookData = this.resolveHookData(args.hookData, owner, args.account);\n\n    const simulation = await this.positionManager.simulatePlaceBid({\n      key: this.openingAuctionPoolKey,\n      tickLower,\n      liquidity: args.liquidity,\n      salt,\n      hookData,\n      account: args.account,\n    });\n\n    return {\n      ...simulation,\n      tickLower,\n      tickUpper,\n      salt,\n    };\n  }\n\n  async placeBid(\n    args: Omit<OpeningAuctionBidArgs, 'account'>,\n    options?: { gas?: bigint },\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    await this.assertValidBid({\n      ...args,\n      account: this.walletClient.account,\n    });\n\n    const simulation = await this.simulatePlaceBid({\n      ...args,\n      account: this.walletClient.account,\n    });\n\n    const txHash = await this.walletClient.writeContract(\n      options?.gas\n        ? { ...(simulation.request as any), gas: options.gas }\n        : (simulation.request as any),\n    );\n\n    this.invalidateSnapshot();\n    return txHash;\n  }\n\n  async estimateWithdrawBidGas(args: OpeningAuctionBidArgs): Promise<bigint> {\n    const simulation = await this.simulateWithdrawBid(args);\n    return simulation.gasEstimate;\n  }\n\n  async simulateWithdrawBid(\n    args: OpeningAuctionBidArgs,\n  ): Promise<OpeningAuctionBidSimulationResult> {\n    this.assertPositiveLiquidity(args.liquidity, 'withdrawBid');\n\n    const { tickLower, tickUpper, salt } = this.resolveBidCoordinates(args);\n    const owner = this.resolveOwnerOrUndefined(args.owner, args.account);\n    const hookData = this.resolveHookData(args.hookData, owner, args.account);\n\n    const simulation = await this.positionManager.simulateWithdrawBid({\n      key: this.openingAuctionPoolKey,\n      tickLower,\n      liquidity: args.liquidity,\n      salt,\n      hookData,\n      account: args.account,\n    });\n\n    return {\n      ...simulation,\n      tickLower,\n      tickUpper,\n      salt,\n    };\n  }\n\n  async withdrawBid(\n    args: Omit<OpeningAuctionBidArgs, 'account'>,\n    options?: { gas?: bigint },\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const simulation = await this.simulateWithdrawBid({\n      ...args,\n      account: this.walletClient.account,\n    });\n\n    const txHash = await this.walletClient.writeContract(\n      options?.gas\n        ? { ...(simulation.request as any), gas: options.gas }\n        : (simulation.request as any),\n    );\n\n    this.invalidateSnapshot();\n    return txHash;\n  }\n\n  async simulateWithdrawFullBid(\n    args: OpeningAuctionWithdrawFullBidArgs,\n  ): Promise<OpeningAuctionWithdrawFullBidSimulationResult> {\n    const owner = this.resolveOwner(args.owner, args.account);\n    const hookData = this.resolveHookData(args.hookData, owner, args.account);\n\n    return await this.positionManager.simulateWithdrawFullBid({\n      openingAuctionHookAddress: this.openingAuctionHookAddress,\n      key: this.openingAuctionPoolKey,\n      tickLower: args.tickLower,\n      salt: args.salt,\n      hookData,\n      owner,\n      account: args.account,\n    });\n  }\n\n  async withdrawFullBid(\n    args: Omit<OpeningAuctionWithdrawFullBidArgs, 'account'>,\n    options?: { gas?: bigint },\n  ): Promise<OpeningAuctionWithdrawFullBidResult> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const simulation = await this.simulateWithdrawFullBid({\n      ...args,\n      account: this.walletClient.account,\n    });\n\n    const transactionHash = await this.walletClient.writeContract(\n      options?.gas\n        ? { ...(simulation.simulation.request as any), gas: options.gas }\n        : (simulation.simulation.request as any),\n    );\n\n    this.invalidateSnapshot();\n\n    return {\n      positionId: simulation.positionId,\n      liquidity: simulation.liquidity,\n      transactionHash,\n    };\n  }\n\n  async getPositionInfo(\n    args: OpeningAuctionBidLookupArgs,\n  ): Promise<OpeningAuctionBidPositionInfo | null> {\n    const owner = this.resolveOwner(args.owner, args.account);\n    const { tickLower, tickUpper, salt } = this.resolveBidCoordinates(args);\n\n    const positionId = await this.openingAuction.getPositionId({\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n    });\n    if (positionId === 0n) {\n      return null;\n    }\n\n    const [position, isInRange, claimableIncentives] = await Promise.all([\n      this.openingAuction.getPosition(positionId),\n      this.openingAuction.isInRange(positionId),\n      this.openingAuction.calculateIncentives(positionId),\n    ]);\n\n    const positionKey = OpeningAuctionPositionManager.computePositionKey({\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n    });\n\n    return {\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n      positionKey,\n      positionId,\n      position,\n      isInRange,\n      claimableIncentives,\n    };\n  }\n\n  async getBidStatus(\n    args: OpeningAuctionBidLookupArgs,\n  ): Promise<OpeningAuctionBidStatus> {\n    const owner = this.resolveOwner(args.owner, args.account);\n    const { tickLower, tickUpper, salt } = this.resolveBidCoordinates(args);\n\n    const [snapshot, positionInfo] = await Promise.all([\n      this.getAuctionSnapshot(),\n      this.getPositionInfo({\n        owner,\n        tickLower,\n        salt,\n        account: args.account,\n      }),\n    ]);\n\n    const { phase, isToken0, estimatedClearingTick } = snapshot;\n\n    const positionKey = OpeningAuctionPositionManager.computePositionKey({\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n    });\n\n    if (!positionInfo) {\n      return {\n        exists: false,\n        owner,\n        tickLower,\n        tickUpper,\n        salt,\n        positionKey,\n        positionId: 0n,\n        liquidity: 0n,\n        isInRange: false,\n        claimableIncentives: 0n,\n        hasClaimedIncentives: false,\n        phase,\n        estimatedClearingTick,\n        wouldBeFilledAtEstimatedClearing: false,\n        isAboveEstimatedClearing: false,\n      };\n    }\n\n    const wouldBeFilledAtEstimatedClearing = isToken0\n      ? estimatedClearingTick < tickUpper\n      : estimatedClearingTick >= tickLower;\n\n    const isAboveEstimatedClearing = isToken0\n      ? tickLower > estimatedClearingTick\n      : tickLower < estimatedClearingTick;\n\n    return {\n      exists: true,\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n      positionKey,\n      positionId: positionInfo.positionId,\n      liquidity: positionInfo.position.liquidity,\n      isInRange: positionInfo.isInRange,\n      claimableIncentives: positionInfo.claimableIncentives,\n      hasClaimedIncentives: positionInfo.position.hasClaimedIncentives,\n      phase,\n      estimatedClearingTick,\n      wouldBeFilledAtEstimatedClearing,\n      isAboveEstimatedClearing,\n    };\n  }\n\n  /**\n   * Enumerate all bids for a given owner with enriched info.\n   */\n  async getOwnerBids(args?: {\n    owner?: Address;\n    account?: Address | Account;\n  }): Promise<OpeningAuctionOwnerBidInfo[]> {\n    const owner = this.resolveOwner(args?.owner, args?.account);\n    const positionIds = await this.openingAuction.getOwnerPositions(owner);\n\n    if (positionIds.length === 0) {\n      return [];\n    }\n\n    return await this.getMultiplePositionInfos(positionIds);\n  }\n\n  /**\n   * Batch fetch position info for multiple position IDs.\n   */\n  async getMultiplePositionInfos(\n    positionIds: bigint[],\n  ): Promise<OpeningAuctionOwnerBidInfo[]> {\n    if (positionIds.length === 0) {\n      return [];\n    }\n\n    const results = await Promise.all(\n      positionIds.map(async (positionId) => {\n        const [position, isInRange, claimableIncentives] = await Promise.all([\n          this.openingAuction.getPosition(positionId),\n          this.openingAuction.isInRange(positionId),\n          this.openingAuction.calculateIncentives(positionId),\n        ]);\n\n        return {\n          positionId,\n          owner: position.owner,\n          tickLower: position.tickLower,\n          tickUpper: position.tickUpper,\n          liquidity: position.liquidity,\n          rewardDebtX128: position.rewardDebtX128,\n          hasClaimedIncentives: position.hasClaimedIncentives,\n          isInRange,\n          claimableIncentives,\n        };\n      }),\n    );\n\n    return results.sort((a, b) =>\n      a.positionId < b.positionId ? -1 : a.positionId > b.positionId ? 1 : 0,\n    );\n  }\n\n  /**\n   * Batch status for all owner positions including clearing tick info.\n   */\n  async getOwnerBidStatuses(args?: {\n    owner?: Address;\n    account?: Address | Account;\n  }): Promise<OpeningAuctionOwnerBidStatus[]> {\n    const owner = this.resolveOwner(args?.owner, args?.account);\n\n    const [bids, snapshot] = await Promise.all([\n      this.getOwnerBids({ owner }),\n      this.getAuctionSnapshot(),\n    ]);\n\n    const { phase, isToken0, estimatedClearingTick } = snapshot;\n\n    return bids.map((bid) => {\n      const wouldBeFilledAtEstimatedClearing = isToken0\n        ? estimatedClearingTick < bid.tickUpper\n        : estimatedClearingTick >= bid.tickLower;\n\n      const isAboveEstimatedClearing = isToken0\n        ? bid.tickLower > estimatedClearingTick\n        : bid.tickLower < estimatedClearingTick;\n\n      return {\n        ...bid,\n        phase,\n        estimatedClearingTick,\n        wouldBeFilledAtEstimatedClearing,\n        isAboveEstimatedClearing,\n      };\n    });\n  }\n\n  /**\n   * Read liquidity across a tick range.\n   */\n  async getTickLiquidityDistribution(args: {\n    startTick: number;\n    endTick: number;\n    step?: number;\n  }): Promise<Array<{ tick: number; liquidity: bigint }>> {\n    const step = args.step ?? this.openingAuctionPoolKey.tickSpacing;\n    if (!Number.isInteger(step) || step <= 0) {\n      throw new Error('step must be a positive integer');\n    }\n\n    const { startTick, endTick } = args;\n    if (!Number.isInteger(startTick) || !Number.isInteger(endTick)) {\n      throw new Error('startTick and endTick must be integers');\n    }\n    if (startTick > endTick) {\n      throw new Error('startTick must be <= endTick');\n    }\n\n    const tickSpacing = this.openingAuctionPoolKey.tickSpacing;\n    if (startTick % tickSpacing !== 0) {\n      throw new Error(\n        `startTick (${startTick}) must be aligned to tickSpacing (${tickSpacing})`,\n      );\n    }\n    if (endTick % tickSpacing !== 0) {\n      throw new Error(\n        `endTick (${endTick}) must be aligned to tickSpacing (${tickSpacing})`,\n      );\n    }\n    if (step % tickSpacing !== 0) {\n      throw new Error(\n        `step (${step}) must be a multiple of tickSpacing (${tickSpacing})`,\n      );\n    }\n\n    const ticks: number[] = [];\n    for (let t = startTick; t <= endTick; t += step) {\n      ticks.push(t);\n    }\n\n    if (ticks.length > 1000) {\n      throw new Error('Tick range too large (max 1000 ticks per query)');\n    }\n\n    const liquidities = await Promise.all(\n      ticks.map((tick) => this.openingAuction.getLiquidityAtTick(tick)),\n    );\n\n    return ticks.map((tick, i) => ({ tick, liquidity: liquidities[i] }));\n  }\n\n  // --- Incentives ---\n\n  async estimateClaimIncentivesGas(\n    args: OpeningAuctionBidLookupArgs,\n  ): Promise<bigint> {\n    const simulation = await this.simulateClaimIncentives(args);\n    return simulation.gasEstimate;\n  }\n\n  async simulateClaimIncentives(\n    args: OpeningAuctionBidLookupArgs,\n  ): Promise<OpeningAuctionClaimIncentivesSimulationResult> {\n    const owner = this.resolveOwner(args.owner, args.account);\n    const { tickLower, tickUpper, salt } = this.resolveBidCoordinates(args);\n\n    const positionId = await this.openingAuction.getPositionId({\n      owner,\n      tickLower,\n      tickUpper,\n      salt,\n    });\n    if (positionId === 0n) {\n      throw new Error('Position not found for the given (owner,ticks,salt)');\n    }\n\n    const simulation = await this.openingAuction.simulateClaimIncentives(\n      positionId,\n      args.account,\n    );\n\n    return {\n      positionId,\n      request: simulation.request,\n      gasEstimate: simulation.gasEstimate,\n    };\n  }\n\n  async claimIncentives(\n    args: Omit<OpeningAuctionBidLookupArgs, 'account'>,\n    options?: { gas?: bigint },\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const simulation = await this.simulateClaimIncentives({\n      ...args,\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas\n        ? { ...(simulation.request as any), gas: options.gas }\n        : (simulation.request as any),\n    );\n  }\n\n  // --- Phase 2b: increaseBid / decreaseBid ---\n\n  async simulateIncreaseBid(\n    args: OpeningAuctionBidArgs,\n  ): Promise<OpeningAuctionBidSimulationResult> {\n    return this.simulatePlaceBid(args);\n  }\n\n  async estimateIncreaseBidGas(args: OpeningAuctionBidArgs): Promise<bigint> {\n    return this.estimatePlaceBidGas(args);\n  }\n\n  async increaseBid(\n    args: Omit<OpeningAuctionBidArgs, 'account'>,\n    options?: { gas?: bigint },\n  ): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    await this.assertValidBid({\n      ...args,\n      account: this.walletClient.account,\n    });\n\n    return this.placeBid(args, options);\n  }\n\n  async simulateDecreaseBid(\n    args: OpeningAuctionBidArgs,\n  ): Promise<OpeningAuctionBidSimulationResult> {\n    const phase = await this.openingAuction.getPhase();\n    if (phase === OPENING_AUCTION_PHASE_ACTIVE) {\n      throw new Error(\n        'Cannot decrease bid during active auction phase. Only full withdrawal is allowed during active auction.',\n      );\n    }\n    return this.simulateWithdrawBid(args);\n  }\n\n  async estimateDecreaseBidGas(args: OpeningAuctionBidArgs): Promise<bigint> {\n    const phase = await this.openingAuction.getPhase();\n    if (phase === OPENING_AUCTION_PHASE_ACTIVE) {\n      throw new Error(\n        'Cannot decrease bid during active auction phase. Only full withdrawal is allowed during active auction.',\n      );\n    }\n    return this.estimateWithdrawBidGas(args);\n  }\n\n  async decreaseBid(\n    args: Omit<OpeningAuctionBidArgs, 'account'>,\n    options?: { gas?: bigint },\n  ): Promise<Hash> {\n    const phase = await this.openingAuction.getPhase();\n    if (phase === OPENING_AUCTION_PHASE_ACTIVE) {\n      throw new Error(\n        'Cannot decrease bid during active auction phase. Only full withdrawal is allowed during active auction.',\n      );\n    }\n    return this.withdrawBid(args, options);\n  }\n\n  // --- Phase 2b: moveBid ---\n\n  /**\n   * Simulate both legs of a move (withdraw + place) without executing.\n   * Use this to pre-validate before calling `moveBid`. See `moveBid` for\n   * non-atomic semantics and partial-completion recovery guidance.\n   */\n  async simulateMoveBid(\n    args: OpeningAuctionMoveBidArgs,\n  ): Promise<OpeningAuctionMoveBidSimulationResult> {\n    if (args.fromTickLower === args.toTickLower) {\n      throw new Error('fromTickLower and toTickLower must be different');\n    }\n\n    const owner = this.resolveOwner(args.owner, args.account);\n    const { tickLower: fromTickLower, tickUpper: fromTickUpper } =\n      this.resolveBidCoordinates({\n        tickLower: args.fromTickLower,\n        salt: args.salt,\n      });\n    const salt = args.salt ?? zeroHash;\n\n    const positionId = await this.openingAuction.getPositionId({\n      owner,\n      tickLower: fromTickLower,\n      tickUpper: fromTickUpper,\n      salt,\n    });\n\n    if (positionId === 0n) {\n      throw new Error(\n        'Source position not found for the given (owner,ticks,salt)',\n      );\n    }\n\n    const position = await this.openingAuction.getPosition(positionId);\n    if (position.liquidity === 0n) {\n      throw new Error('Source position has zero liquidity');\n    }\n\n    const liquidity = position.liquidity;\n\n    // Validate the place leg before simulating\n    await this.assertValidBid({\n      tickLower: args.toTickLower,\n      liquidity,\n      salt: args.salt,\n      owner: args.owner,\n      account: args.account,\n    });\n\n    const withdrawSimulation = await this.simulateWithdrawBid({\n      tickLower: args.fromTickLower,\n      liquidity,\n      salt: args.salt,\n      owner: args.owner,\n      account: args.account,\n    });\n\n    const placeSimulation = await this.simulatePlaceBid({\n      tickLower: args.toTickLower,\n      liquidity,\n      salt: args.salt,\n      owner: args.owner,\n      account: args.account,\n    });\n\n    return { withdrawSimulation, placeSimulation, liquidity };\n  }\n\n  /**\n   * Move a bid from one tick to another by withdrawing and re-placing.\n   *\n   * **Non-atomic**: This executes two separate transactions (withdraw then place).\n   * If the withdraw succeeds but the place fails (e.g. due to gas, slippage, or\n   * auction state change), the bid will be in a withdrawn state with funds returned\n   * to the caller. To recover, retry with `placeBid` at the desired tick using the\n   * same liquidity amount. Use `simulateMoveBid` first to pre-validate both legs.\n   */\n  async moveBid(\n    args: Omit<OpeningAuctionMoveBidArgs, 'account'>,\n    options?: { gasWithdraw?: bigint; gasPlace?: bigint },\n  ): Promise<OpeningAuctionMoveBidResult> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    if (args.fromTickLower === args.toTickLower) {\n      throw new Error('fromTickLower and toTickLower must be different');\n    }\n\n    const owner = this.resolveOwner(args.owner, this.walletClient.account);\n    const { tickLower: fromTickLower, tickUpper: fromTickUpper } =\n      this.resolveBidCoordinates({\n        tickLower: args.fromTickLower,\n        salt: args.salt,\n      });\n    const salt = args.salt ?? zeroHash;\n\n    const positionId = await this.openingAuction.getPositionId({\n      owner,\n      tickLower: fromTickLower,\n      tickUpper: fromTickUpper,\n      salt,\n    });\n\n    if (positionId === 0n) {\n      throw new Error(\n        'Source position not found for the given (owner,ticks,salt)',\n      );\n    }\n\n    const position = await this.openingAuction.getPosition(positionId);\n    if (position.liquidity === 0n) {\n      throw new Error('Source position has zero liquidity');\n    }\n\n    const liquidity = position.liquidity;\n\n    // Validate the place leg before executing either transaction\n    await this.assertValidBid({\n      tickLower: args.toTickLower,\n      liquidity,\n      salt: args.salt,\n      owner: args.owner,\n      account: this.walletClient.account,\n    });\n\n    // Execute withdraw\n    const withdrawTxHash = await this.withdrawBid(\n      {\n        tickLower: args.fromTickLower,\n        liquidity,\n        salt: args.salt,\n        owner: args.owner,\n      },\n      options?.gasWithdraw ? { gas: options.gasWithdraw } : undefined,\n    );\n\n    // Execute place at new tick\n    let placeTxHash: Hash;\n    try {\n      placeTxHash = await this.placeBid(\n        {\n          tickLower: args.toTickLower,\n          liquidity,\n          salt: args.salt,\n          owner: args.owner,\n        },\n        options?.gasPlace ? { gas: options.gasPlace } : undefined,\n      );\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      throw new Error(\n        `moveBid: withdraw succeeded (tx: ${withdrawTxHash}) but place at tick ${args.toTickLower} failed: ${message}. ` +\n          `Retry with placeBid({ tickLower: ${args.toTickLower}, liquidity: ${liquidity}, salt: \"${salt}\" }) to recover.`,\n      );\n    }\n\n    this.invalidateSnapshot();\n\n    return { withdrawTxHash, placeTxHash, liquidity };\n  }\n\n  // --- Phase 2b: quoteBid ---\n\n  async quoteBid(args: OpeningAuctionBidArgs): Promise<OpeningAuctionBidQuote> {\n    const { tickLower, tickUpper } = this.resolveBidCoordinates(args);\n\n    const [simulation, estimatedClearingTick, isToken0] = await Promise.all([\n      this.simulatePlaceBid(args),\n      this.openingAuction.getEstimatedClearingTick(),\n      this.openingAuction.getIsToken0(),\n    ]);\n\n    const amount0Delta = simulation.decoded.amount0;\n    const amount1Delta = simulation.decoded.amount1;\n    const tokenInAmount0 = amount0Delta < 0n ? -amount0Delta : 0n;\n    const tokenInAmount1 = amount1Delta < 0n ? -amount1Delta : 0n;\n\n    const wouldBeFilledAtEstimatedClearing = isToken0\n      ? estimatedClearingTick < tickUpper\n      : estimatedClearingTick >= tickLower;\n\n    const isAboveEstimatedClearing = isToken0\n      ? tickLower > estimatedClearingTick\n      : tickLower < estimatedClearingTick;\n\n    // Rough incentive share estimate: position liquidity / (position liquidity + existing liquidity at tick)\n    // Returns null when liquidity data is unavailable so callers can distinguish \"unknown\" from \"zero\".\n    let estimatedIncentiveShareBps: number | null = null;\n    try {\n      const existingLiquidity =\n        await this.openingAuction.getLiquidityAtTick(tickLower);\n      const totalLiquidity = existingLiquidity + args.liquidity;\n      if (totalLiquidity > 0n) {\n        estimatedIncentiveShareBps = Number(\n          (args.liquidity * 10000n) / totalLiquidity,\n        );\n      } else {\n        estimatedIncentiveShareBps = 0;\n      }\n    } catch {\n      // Liquidity read failed — leave as null to signal unknown\n    }\n\n    return {\n      tickLower,\n      tickUpper,\n      liquidity: args.liquidity,\n      amount0Delta,\n      amount1Delta,\n      tokenInAmount0,\n      tokenInAmount1,\n      estimatedClearingTick,\n      wouldBeFilledAtEstimatedClearing,\n      isAboveEstimatedClearing,\n      estimatedIncentiveShareBps,\n    };\n  }\n\n  // --- Phase 2b: claimAllIncentives ---\n\n  async simulateClaimAllIncentives(args?: {\n    owner?: Address;\n    account?: Address | Account;\n  }): Promise<OpeningAuctionClaimAllIncentivesPreview> {\n    const owner = this.resolveOwner(args?.owner, args?.account);\n    const bids = await this.getOwnerBids({ owner });\n\n    const claimablePositions: Array<{\n      positionId: bigint;\n      claimableIncentives: bigint;\n    }> = [];\n    const skippedPositions: Array<{ positionId: bigint; reason: string }> = [];\n\n    for (const bid of bids) {\n      if (bid.hasClaimedIncentives) {\n        skippedPositions.push({\n          positionId: bid.positionId,\n          reason: 'already claimed',\n        });\n        continue;\n      }\n      if (bid.claimableIncentives === 0n) {\n        skippedPositions.push({\n          positionId: bid.positionId,\n          reason: 'zero claimable',\n        });\n        continue;\n      }\n      if (!bid.isInRange) {\n        skippedPositions.push({\n          positionId: bid.positionId,\n          reason: 'not in range',\n        });\n        continue;\n      }\n      claimablePositions.push({\n        positionId: bid.positionId,\n        claimableIncentives: bid.claimableIncentives,\n      });\n    }\n\n    const totalClaimable = claimablePositions.reduce(\n      (acc, p) => acc + p.claimableIncentives,\n      0n,\n    );\n\n    return { claimablePositions, totalClaimable, skippedPositions };\n  }\n\n  async claimAllIncentives(args?: {\n    owner?: Address;\n    account?: Address | Account;\n    continueOnError?: boolean;\n  }): Promise<OpeningAuctionClaimAllIncentivesResult> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const preview = await this.simulateClaimAllIncentives({\n      owner: args?.owner,\n      account: args?.account ?? this.walletClient.account,\n    });\n\n    const results: OpeningAuctionClaimAllIncentivesResult['results'] = [];\n    let totalClaimed = 0;\n    let totalFailed = 0;\n\n    for (const { positionId } of preview.claimablePositions) {\n      try {\n        const { request } = await this.openingAuction.simulateClaimIncentives(\n          positionId,\n          this.walletClient.account,\n        );\n\n        const transactionHash = await this.walletClient.writeContract(\n          request as any,\n        );\n        results.push({ positionId, transactionHash });\n        totalClaimed++;\n      } catch (error) {\n        const errorMessage =\n          error instanceof Error ? error.message : String(error);\n        results.push({ positionId, error: errorMessage });\n        totalFailed++;\n\n        if (!args?.continueOnError) {\n          break;\n        }\n      }\n    }\n\n    return { results, totalClaimed, totalFailed };\n  }\n\n  // --- Settlement ---\n\n  async estimateSettleAuctionGas(account?: Address | Account): Promise<bigint> {\n    return await this.openingAuction.estimateSettleAuctionGas(account);\n  }\n\n  async simulateSettleAuction(account?: Address | Account): Promise<{\n    request: unknown;\n    gasEstimate: bigint;\n  }> {\n    return await this.openingAuction.simulateSettleAuction(account);\n  }\n\n  async settleAuction(options?: { gas?: bigint }): Promise<Hash> {\n    return await this.openingAuction.settleAuction(options);\n  }\n\n  // --- Event Watchers ---\n\n  watchAuctionSettlement(\n    options: OpeningAuctionWatchSettlementOptions,\n  ): () => void {\n    return this.openingAuction.watchAuctionSettled(options);\n  }\n\n  watchBidStatus(options: OpeningAuctionWatchBidStatusOptions): () => void {\n    let stopped = false;\n    let polling = false;\n    let previousStatus: OpeningAuctionBidStatus | null = null;\n\n    const pollStatus = async (): Promise<void> => {\n      if (stopped || polling) {\n        return;\n      }\n      polling = true;\n\n      try {\n        const nextStatus = await this.getBidStatus(options);\n        if (\n          previousStatus === null ||\n          OpeningAuctionBidManager.hasStatusChanged(previousStatus, nextStatus)\n        ) {\n          options.onStatusChange(nextStatus, previousStatus);\n          previousStatus = nextStatus;\n        }\n      } catch (error) {\n        options.onError?.(error as Error);\n      } finally {\n        polling = false;\n      }\n    };\n\n    const unwatch = this.rpc.watchBlockNumber({\n      emitOnBegin: options.emitOnBegin ?? true,\n      poll: options.poll ? true : undefined,\n      pollingInterval: options.pollingInterval,\n      onBlockNumber: () => {\n        void pollStatus();\n      },\n      onError: (error) => options.onError?.(error as Error),\n    });\n\n    return () => {\n      stopped = true;\n      unwatch();\n    };\n  }\n\n  watchBidPlaced(options: OpeningAuctionWatchBidPlacedOptions): () => void {\n    const args: any = {};\n    if (options.owner) {\n      args.owner = options.owner;\n    }\n\n    return this.rpc.watchContractEvent({\n      address: this.openingAuctionHookAddress,\n      abi: bidManagerEventAbi,\n      eventName: 'BidPlaced',\n      args: Object.keys(args).length > 0 ? args : undefined,\n      fromBlock: options.fromBlock,\n      poll: options.poll,\n      pollingInterval: options.pollingInterval,\n      strict: options.strict ?? false,\n      onError: options.onError,\n      onLogs: (logs: any[]) => {\n        for (const log of logs) {\n          const logArgs = (log?.args ?? {}) as {\n            positionId?: bigint;\n            owner?: Address;\n            tickLower?: number | bigint;\n            liquidity?: bigint;\n          };\n\n          options.onBidPlaced({\n            positionId: logArgs.positionId ?? 0n,\n            owner: logArgs.owner ?? zeroAddress,\n            tickLower: Number(logArgs.tickLower ?? 0),\n            liquidity: logArgs.liquidity ?? 0n,\n            transactionHash: (log.transactionHash ?? zeroHash) as Hash,\n            blockNumber: (log.blockNumber ?? 0n) as bigint,\n            logIndex: Number(log.logIndex ?? 0),\n          });\n        }\n      },\n    } as any);\n  }\n\n  watchBidWithdrawn(\n    options: OpeningAuctionWatchBidWithdrawnOptions,\n  ): () => void {\n    const args: any = {};\n    if (options.positionId !== undefined) {\n      args.positionId = options.positionId;\n    }\n\n    return this.rpc.watchContractEvent({\n      address: this.openingAuctionHookAddress,\n      abi: bidManagerEventAbi,\n      eventName: 'BidWithdrawn',\n      args: Object.keys(args).length > 0 ? args : undefined,\n      fromBlock: options.fromBlock,\n      poll: options.poll,\n      pollingInterval: options.pollingInterval,\n      strict: options.strict ?? false,\n      onError: options.onError,\n      onLogs: (logs: any[]) => {\n        for (const log of logs) {\n          const logArgs = (log?.args ?? {}) as {\n            positionId?: bigint;\n          };\n\n          options.onBidWithdrawn({\n            positionId: logArgs.positionId ?? 0n,\n            transactionHash: (log.transactionHash ?? zeroHash) as Hash,\n            blockNumber: (log.blockNumber ?? 0n) as bigint,\n            logIndex: Number(log.logIndex ?? 0),\n          });\n        }\n      },\n    } as any);\n  }\n\n  watchIncentivesClaimed(\n    options: OpeningAuctionWatchIncentivesClaimedOptions,\n  ): () => void {\n    const args: any = {};\n    if (options.owner) {\n      args.owner = options.owner;\n    }\n    if (options.positionId !== undefined) {\n      args.positionId = options.positionId;\n    }\n\n    return this.rpc.watchContractEvent({\n      address: this.openingAuctionHookAddress,\n      abi: bidManagerEventAbi,\n      eventName: 'IncentivesClaimed',\n      args: Object.keys(args).length > 0 ? args : undefined,\n      fromBlock: options.fromBlock,\n      poll: options.poll,\n      pollingInterval: options.pollingInterval,\n      strict: options.strict ?? false,\n      onError: options.onError,\n      onLogs: (logs: any[]) => {\n        for (const log of logs) {\n          const logArgs = (log?.args ?? {}) as {\n            positionId?: bigint;\n            owner?: Address;\n            amount?: bigint;\n          };\n\n          options.onIncentivesClaimed({\n            positionId: logArgs.positionId ?? 0n,\n            owner: logArgs.owner ?? zeroAddress,\n            amount: logArgs.amount ?? 0n,\n            transactionHash: (log.transactionHash ?? zeroHash) as Hash,\n            blockNumber: (log.blockNumber ?? 0n) as bigint,\n            logIndex: Number(log.logIndex ?? 0),\n          });\n        }\n      },\n    } as any);\n  }\n\n  watchPhaseChange(options: OpeningAuctionWatchPhaseChangeOptions): () => void {\n    return this.rpc.watchContractEvent({\n      address: this.openingAuctionHookAddress,\n      abi: bidManagerEventAbi,\n      eventName: 'PhaseChanged',\n      fromBlock: options.fromBlock,\n      poll: options.poll,\n      pollingInterval: options.pollingInterval,\n      strict: options.strict ?? false,\n      onError: options.onError,\n      onLogs: (logs: any[]) => {\n        for (const log of logs) {\n          const logArgs = (log?.args ?? {}) as {\n            oldPhase?: number | bigint;\n            newPhase?: number | bigint;\n          };\n\n          options.onPhaseChanged({\n            oldPhase: Number(logArgs.oldPhase ?? 0),\n            newPhase: Number(logArgs.newPhase ?? 0),\n            transactionHash: (log.transactionHash ?? zeroHash) as Hash,\n            blockNumber: (log.blockNumber ?? 0n) as bigint,\n            logIndex: Number(log.logIndex ?? 0),\n          });\n        }\n      },\n    } as any);\n  }\n\n  watchEstimatedClearingTick(\n    options: OpeningAuctionWatchEstimatedClearingTickOptions,\n  ): () => void {\n    return this.rpc.watchContractEvent({\n      address: this.openingAuctionHookAddress,\n      abi: bidManagerEventAbi,\n      eventName: 'EstimatedClearingTickUpdated',\n      fromBlock: options.fromBlock,\n      poll: options.poll,\n      pollingInterval: options.pollingInterval,\n      strict: options.strict ?? false,\n      onError: options.onError,\n      onLogs: (logs: any[]) => {\n        for (const log of logs) {\n          const logArgs = (log?.args ?? {}) as {\n            newEstimatedClearingTick?: number | bigint;\n          };\n\n          options.onEstimatedClearingTickUpdated({\n            newEstimatedClearingTick: Number(\n              logArgs.newEstimatedClearingTick ?? 0,\n            ),\n            transactionHash: (log.transactionHash ?? zeroHash) as Hash,\n            blockNumber: (log.blockNumber ?? 0n) as bigint,\n            logIndex: Number(log.logIndex ?? 0),\n          });\n        }\n      },\n    } as any);\n  }\n\n  // --- Private helpers ---\n\n  /**\n   * Preflight guard: runs validateBid and throws if any errors are found.\n   */\n  private async assertValidBid(args: OpeningAuctionBidArgs): Promise<void> {\n    const result = await this.validateBid(args);\n    if (!result.valid) {\n      throw new Error(`Invalid bid: ${result.errors.join(', ')}`);\n    }\n  }\n\n  /**\n   * Returns a memoized auction snapshot (phase, isToken0, estimatedClearingTick).\n   * Cached per block number to reduce redundant reads within composite operations.\n   */\n  private async getAuctionSnapshot(): Promise<{\n    phase: number;\n    isToken0: boolean;\n    estimatedClearingTick: number;\n  }> {\n    const currentBlock = await this.rpc.getBlockNumber();\n\n    if (\n      this._snapshotCache &&\n      this._snapshotCache.blockNumber >= currentBlock\n    ) {\n      return this._snapshotCache;\n    }\n\n    const [phase, isToken0, estimatedClearingTick] = await Promise.all([\n      this.openingAuction.getPhase(),\n      this.openingAuction.getIsToken0(),\n      this.openingAuction.getEstimatedClearingTick(),\n    ]);\n\n    this._snapshotCache = {\n      phase,\n      isToken0,\n      estimatedClearingTick,\n      blockNumber: currentBlock,\n    };\n\n    return this._snapshotCache;\n  }\n\n  /**\n   * Invalidate the memoized snapshot (useful after write operations).\n   */\n  invalidateSnapshot(): void {\n    this._snapshotCache = null;\n  }\n\n  private resolveBidCoordinates(args: { tickLower: number; salt?: Hash }): {\n    tickLower: number;\n    tickUpper: number;\n    salt: Hash;\n  } {\n    const { tickLower, tickUpper } =\n      OpeningAuctionPositionManager.validateSingleTick({\n        key: this.openingAuctionPoolKey,\n        tickLower: args.tickLower,\n      });\n\n    return {\n      tickLower,\n      tickUpper,\n      salt: args.salt ?? zeroHash,\n    };\n  }\n\n  private resolveOwner(owner?: Address, account?: Address | Account): Address {\n    const resolvedOwner = this.resolveOwnerOrUndefined(owner, account);\n    if (!resolvedOwner) {\n      throw new Error(\n        'owner (or account/walletClient) is required for bid resolution',\n      );\n    }\n    return resolvedOwner;\n  }\n\n  private resolveOwnerOrUndefined(\n    owner?: Address,\n    account?: Address | Account,\n  ): Address | undefined {\n    return (\n      owner ??\n      this.accountToAddress(account) ??\n      this.accountToAddress(\n        this.walletClient?.account as Address | Account | undefined,\n      )\n    );\n  }\n\n  private resolveHookData(\n    hookData: Hex | undefined,\n    owner: Address | undefined,\n    account?: Address | Account,\n  ): Hex {\n    if (hookData) {\n      return hookData;\n    }\n\n    const resolvedOwner = owner ?? this.resolveOwner(undefined, account);\n    return OpeningAuctionPositionManager.encodeOwnerHookData(\n      resolvedOwner,\n      'packed',\n    );\n  }\n\n  private accountToAddress(account?: Address | Account): Address | undefined {\n    if (!account) {\n      return undefined;\n    }\n    return typeof account === 'string' ? account : account.address;\n  }\n\n  private assertPositiveLiquidity(\n    liquidity: bigint,\n    operation: 'withdrawBid',\n  ): void {\n    if (liquidity <= 0n) {\n      throw new Error(`${operation} requires liquidity > 0`);\n    }\n  }\n\n  private static hasStatusChanged(\n    previous: OpeningAuctionBidStatus,\n    next: OpeningAuctionBidStatus,\n  ): boolean {\n    return (\n      previous.exists !== next.exists ||\n      previous.positionId !== next.positionId ||\n      previous.liquidity !== next.liquidity ||\n      previous.isInRange !== next.isInRange ||\n      previous.claimableIncentives !== next.claimableIncentives ||\n      previous.hasClaimedIncentives !== next.hasClaimedIncentives ||\n      previous.phase !== next.phase ||\n      previous.estimatedClearingTick !== next.estimatedClearingTick ||\n      previous.wouldBeFilledAtEstimatedClearing !==\n        next.wouldBeFilledAtEstimatedClearing ||\n      previous.isAboveEstimatedClearing !== next.isAboveEstimatedClearing\n    );\n  }\n}\n\nexport type {\n  OpeningAuctionAuctionSettledEvent,\n  OpeningAuctionWatchSettlementOptions,\n};\n","import {\n  type Address,\n  decodeAbiParameters,\n  type Hex,\n  type PublicClient,\n} from 'viem';\nimport { quoterV2Abi, uniswapV2Router02Abi, v4QuoterAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport type { SupportedPublicClient } from '../../types';\n\n/**\n * Unified Quoter for getting price quotes across Uniswap V2, V3, and V4\n *\n * This class provides a unified interface for price discovery across all\n * supported Uniswap versions, abstracting away the differences between\n * V2 router, V3 quoter, and V4 quoter contracts.\n */\nexport class Quoter {\n  private publicClient: SupportedPublicClient;\n  private chainId: number;\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(publicClient: SupportedPublicClient, chainId: number) {\n    this.publicClient = publicClient;\n    this.chainId = chainId;\n  }\n\n  /**\n   * Get a price quote for swapping an exact amount of input tokens on Uniswap V3\n   * @param params Parameters for the quote\n   * @returns Quote result including output amount and price impact\n   */\n  async quoteExactInputV3(params: {\n    tokenIn: Address;\n    tokenOut: Address;\n    amountIn: bigint;\n    fee: number;\n    sqrtPriceLimitX96?: bigint;\n  }): Promise<{\n    amountOut: bigint;\n    sqrtPriceX96After: bigint;\n    initializedTicksCrossed: number;\n    gasEstimate: bigint;\n  }> {\n    const addresses = getAddresses(this.chainId);\n\n    try {\n      const { result } = await this.rpc.simulateContract({\n        address: addresses.v3Quoter,\n        abi: quoterV2Abi,\n        functionName: 'quoteExactInputSingle',\n        args: [\n          {\n            tokenIn: params.tokenIn,\n            tokenOut: params.tokenOut,\n            amountIn: params.amountIn,\n            fee: params.fee,\n            sqrtPriceLimitX96: params.sqrtPriceLimitX96 ?? BigInt(0),\n          },\n        ],\n      });\n      return {\n        amountOut: result[0],\n        sqrtPriceX96After: result[1],\n        initializedTicksCrossed: result[2],\n        gasEstimate: result[3],\n      };\n    } catch (err: unknown) {\n      const revertData: Hex | undefined =\n        (err as { cause?: { data?: Hex }; data?: Hex })?.cause?.data ||\n        (err as { data?: Hex }).data;\n      if (\n        revertData &&\n        typeof revertData === 'string' &&\n        revertData.startsWith('0x')\n      ) {\n        try {\n          // Uniswap V3 QuoterV2 encodes (uint256 amount, uint160 sqrtPriceX96After, int24 tickAfter)\n          const [amount, sqrtPriceX96After] = decodeAbiParameters(\n            [{ type: 'uint256' }, { type: 'uint160' }, { type: 'int24' }],\n            revertData as Hex,\n          ) as unknown as [bigint, bigint, number];\n          return {\n            amountOut: amount,\n            sqrtPriceX96After,\n            initializedTicksCrossed: 0,\n            gasEstimate: 0n,\n          };\n        } catch {\n          // fall through\n        }\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Get a price quote for receiving an exact amount of output tokens on Uniswap V3\n   * @param params Parameters for the quote\n   * @returns Quote result including required input amount\n   */\n  async quoteExactOutputV3(params: {\n    tokenIn: Address;\n    tokenOut: Address;\n    amountOut: bigint;\n    fee: number;\n    sqrtPriceLimitX96?: bigint;\n  }): Promise<{\n    amountIn: bigint;\n    sqrtPriceX96After: bigint;\n    initializedTicksCrossed: number;\n    gasEstimate: bigint;\n  }> {\n    const addresses = getAddresses(this.chainId);\n\n    try {\n      const { result } = await this.rpc.simulateContract({\n        address: addresses.v3Quoter,\n        abi: quoterV2Abi,\n        functionName: 'quoteExactOutputSingle',\n        args: [\n          {\n            tokenIn: params.tokenIn,\n            tokenOut: params.tokenOut,\n            amount: params.amountOut,\n            fee: params.fee,\n            sqrtPriceLimitX96: params.sqrtPriceLimitX96 ?? BigInt(0),\n          },\n        ],\n      });\n      return {\n        amountIn: result[0],\n        sqrtPriceX96After: result[1],\n        initializedTicksCrossed: result[2],\n        gasEstimate: result[3],\n      };\n    } catch (err: unknown) {\n      const revertData: Hex | undefined =\n        (err as { cause?: { data?: Hex }; data?: Hex })?.cause?.data ||\n        (err as { data?: Hex }).data;\n      if (\n        revertData &&\n        typeof revertData === 'string' &&\n        revertData.startsWith('0x')\n      ) {\n        try {\n          // Uniswap V3 QuoterV2 encodes (uint256 amount, uint160 sqrtPriceX96After, int24 tickAfter)\n          const [amount, sqrtPriceX96After] = decodeAbiParameters(\n            [{ type: 'uint256' }, { type: 'uint160' }, { type: 'int24' }],\n            revertData as Hex,\n          ) as unknown as [bigint, bigint, number];\n          return {\n            amountIn: amount,\n            sqrtPriceX96After,\n            initializedTicksCrossed: 0,\n            gasEstimate: 0n,\n          };\n        } catch {\n          // fall through\n        }\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Get a price quote for swapping an exact amount of input tokens on Uniswap V2\n   * @param params Parameters for the quote\n   * @returns Array of amounts for each step in the path\n   */\n  async quoteExactInputV2(params: {\n    amountIn: bigint;\n    path: Address[];\n  }): Promise<bigint[]> {\n    const addresses = getAddresses(this.chainId);\n\n    if (!addresses.univ2Router02) {\n      throw new Error('Uniswap V2 Router not available on this chain');\n    }\n\n    const result = await this.rpc.readContract({\n      address: addresses.univ2Router02,\n      abi: uniswapV2Router02Abi,\n      functionName: 'getAmountsOut',\n      args: [params.amountIn, params.path],\n    });\n\n    return [...result]; // Convert readonly array to mutable array\n  }\n\n  /**\n   * Get a price quote for receiving an exact amount of output tokens on Uniswap V2\n   * @param params Parameters for the quote\n   * @returns Array of amounts for each step in the path\n   */\n  async quoteExactOutputV2(params: {\n    amountOut: bigint;\n    path: Address[];\n  }): Promise<bigint[]> {\n    const addresses = getAddresses(this.chainId);\n\n    if (!addresses.univ2Router02) {\n      throw new Error('Uniswap V2 Router not available on this chain');\n    }\n\n    const result = await this.rpc.readContract({\n      address: addresses.univ2Router02,\n      abi: uniswapV2Router02Abi,\n      functionName: 'getAmountsIn',\n      args: [params.amountOut, params.path],\n    });\n\n    return [...result]; // Convert readonly array to mutable array\n  }\n\n  /**\n   * Get a price quote for swapping an exact amount of input tokens on Uniswap V4\n   * @param params Parameters for the quote\n   * @returns Quote result for V4 pools\n   */\n  async quoteExactInputV4(params: {\n    poolKey: {\n      currency0: Address;\n      currency1: Address;\n      fee: number;\n      tickSpacing: number;\n      hooks: Address;\n    };\n    zeroForOne: boolean;\n    exactAmount: bigint;\n    hookData?: string;\n  }): Promise<{\n    amountOut: bigint;\n    gasEstimate: bigint;\n  }> {\n    const addresses = getAddresses(this.chainId);\n\n    const quoterAddress = addresses.uniswapV4Quoter;\n\n    if (!quoterAddress) {\n      throw new Error('No V4 quoter available on this chain');\n    }\n\n    const { result } = await this.rpc.simulateContract({\n      address: quoterAddress,\n      abi: v4QuoterAbi,\n      functionName: 'quoteExactInputSingle',\n      args: [\n        {\n          poolKey: params.poolKey,\n          zeroForOne: params.zeroForOne,\n          exactAmount: params.exactAmount,\n          hookData: (params.hookData ?? '0x') as `0x${string}`,\n        },\n      ],\n    });\n\n    return {\n      amountOut: result[0],\n      gasEstimate: result[1],\n    };\n  }\n\n  /**\n   * Get a price quote for receiving an exact amount of output tokens on Uniswap V4\n   * @param params Parameters for the quote\n   * @returns Quote result for V4 pools\n   */\n  async quoteExactOutputV4(params: {\n    poolKey: {\n      currency0: Address;\n      currency1: Address;\n      fee: number;\n      tickSpacing: number;\n      hooks: Address;\n    };\n    zeroForOne: boolean;\n    exactAmount: bigint;\n    hookData?: string;\n  }): Promise<{\n    amountIn: bigint;\n    gasEstimate: bigint;\n  }> {\n    const addresses = getAddresses(this.chainId);\n\n    const quoterAddress = addresses.uniswapV4Quoter;\n\n    if (!quoterAddress) {\n      throw new Error('Uniswap V4 Quoter address not available on this chain');\n    }\n\n    const { result } = await this.rpc.simulateContract({\n      address: quoterAddress,\n      abi: v4QuoterAbi,\n      functionName: 'quoteExactOutputSingle',\n      args: [\n        {\n          poolKey: params.poolKey,\n          zeroForOne: params.zeroForOne,\n          exactAmount: params.exactAmount,\n          hookData: (params.hookData ?? '0x') as `0x${string}`,\n        },\n      ],\n    });\n\n    return {\n      amountIn: result[0],\n      gasEstimate: result[1],\n    };\n  }\n\n  /**\n   * Quote a single exact-input trade using the Uniswap V4 Quoter (not Lens)\n   * @param params Parameters for the quote\n   */\n  async quoteExactInputV4Quoter(params: {\n    poolKey: {\n      currency0: Address;\n      currency1: Address;\n      fee: number;\n      tickSpacing: number;\n      hooks: Address;\n    };\n    zeroForOne: boolean;\n    exactAmount: bigint;\n    hookData?: string;\n  }): Promise<{\n    amountOut: bigint;\n    gasEstimate: bigint;\n  }> {\n    const addresses = getAddresses(this.chainId);\n    const quoterAddress = addresses.uniswapV4Quoter;\n\n    if (!quoterAddress) {\n      throw new Error('Uniswap V4 Quoter address not available on this chain');\n    }\n\n    const { result } = await this.rpc.simulateContract({\n      address: quoterAddress,\n      abi: v4QuoterAbi,\n      functionName: 'quoteExactInputSingle',\n      args: [\n        {\n          poolKey: params.poolKey,\n          zeroForOne: params.zeroForOne,\n          exactAmount: params.exactAmount,\n          hookData: (params.hookData ?? '0x') as `0x${string}`,\n        },\n      ],\n    });\n\n    return {\n      amountOut: result[0],\n      gasEstimate: result[1],\n    };\n  }\n\n  /**\n   * Quote a single exact-output trade using the Uniswap V4 Quoter (not Lens)\n   * @param params Parameters for the quote\n   */\n  async quoteExactOutputV4Quoter(params: {\n    poolKey: {\n      currency0: Address;\n      currency1: Address;\n      fee: number;\n      tickSpacing: number;\n      hooks: Address;\n    };\n    zeroForOne: boolean;\n    exactAmount: bigint;\n    hookData?: string;\n  }): Promise<{\n    amountIn: bigint;\n    gasEstimate: bigint;\n  }> {\n    const addresses = getAddresses(this.chainId);\n    const quoterAddress = addresses.uniswapV4Quoter;\n\n    if (!quoterAddress) {\n      throw new Error('Uniswap V4 Quoter address not available on this chain');\n    }\n\n    const { result } = await this.rpc.simulateContract({\n      address: quoterAddress,\n      abi: v4QuoterAbi,\n      functionName: 'quoteExactOutputSingle',\n      args: [\n        {\n          poolKey: params.poolKey,\n          zeroForOne: params.zeroForOne,\n          exactAmount: params.exactAmount,\n          hookData: (params.hookData ?? '0x') as `0x${string}`,\n        },\n      ],\n    });\n\n    return {\n      amountIn: result[0],\n      gasEstimate: result[1],\n    };\n  }\n}\n","import { type Address, type WalletClient, type PublicClient } from 'viem';\nimport { derc20Abi } from '../../../abis';\nimport { SupportedPublicClient } from '../../../types';\n\n/**\n * A class providing read and write access to a DERC20 token contract.\n * Enables querying standard ERC20 token properties along with custom vesting\n * and minting-related state information.\n */\nexport class Derc20 {\n  protected publicClient: SupportedPublicClient;\n  protected walletClient?: WalletClient;\n  protected address: Address;\n  protected get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  protected static splitSignature(signature: `0x${string}`): {\n    v: number;\n    r: `0x${string}`;\n    s: `0x${string}`;\n  } {\n    const sig = signature.toLowerCase() as `0x${string}`;\n    const r = `0x${sig.slice(2, 66)}` as `0x${string}`;\n    const s = `0x${sig.slice(66, 130)}` as `0x${string}`;\n    let v = parseInt(sig.slice(130, 132), 16);\n    if (v < 27) v += 27;\n    return { v, r, s };\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    address: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.address = address;\n  }\n\n  /** Get the human-readable name of the token */\n  async getName(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'name',\n    });\n  }\n\n  /** Get the symbol/ticker of the token */\n  async getSymbol(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'symbol',\n    });\n  }\n\n  /** Get the number of decimals used for token divisions */\n  async getDecimals(): Promise<number> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'decimals',\n    });\n  }\n\n  /** Get the token URI for the token */\n  async getTokenURI(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'tokenURI',\n    });\n  }\n\n  // -------------------------\n  // Governance (Votes) reads\n  // -------------------------\n\n  /** Get the current delegate for an account */\n  async getDelegates(account: Address): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'delegates',\n      args: [account],\n    });\n  }\n\n  /** Get current voting power for an account */\n  async getVotes(account: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'getVotes',\n      args: [account],\n    });\n  }\n\n  /** Get historical voting power at a given timepoint (block) */\n  async getPastVotes(account: Address, timepoint: bigint): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'getPastVotes',\n      args: [account, timepoint],\n    });\n  }\n\n  /**\n   * Get the allowance granted by an owner to a spender\n   * @param owner - The address that granted the allowance\n   * @param spender - The address that can spend the tokens\n   */\n  async getAllowance(owner: Address, spender: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'allowance',\n      args: [owner, spender],\n    });\n  }\n\n  /**\n   * Get the token balance of a specific account\n   * @param account - Address to check balance for\n   */\n  async getBalanceOf(account: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'balanceOf',\n      args: [account],\n    });\n  }\n\n  /** Get the total supply of tokens in circulation */\n  async getTotalSupply(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'totalSupply',\n    });\n  }\n\n  /** Get the duration (in seconds) of the vesting period */\n  async getVestingDuration(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'vestingDuration',\n    });\n  }\n\n  /** Get the timestamp when vesting begins */\n  async getVestingStart(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'vestingStart',\n    });\n  }\n\n  /** Get the total amount of tokens allocated for vesting */\n  async getVestedTotalAmount(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'vestedTotalAmount',\n    });\n  }\n\n  /** Get the amount of vested tokens available for a specific address */\n  async getAvailableVestedAmount(account: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'computeAvailableVestedAmount',\n      args: [account],\n    });\n  }\n\n  /** Get the current annual mint rate in tokens per year */\n  async getYearlyMintRate(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'yearlyMintRate',\n    });\n  }\n\n  /** Get the pool address for the token */\n  async getPool(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'pool',\n    });\n  }\n\n  /** Check if the liquidity pool is unlocked */\n  async getIsPoolUnlocked(): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'isPoolUnlocked',\n    });\n  }\n\n  /** Get the timestamp when token minting begins */\n  async getCurrentYearStart(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'currentYearStart',\n    });\n  }\n\n  /** Get the timestamp of the last mint */\n  async getLastMintTimestamp(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'lastMintTimestamp',\n    });\n  }\n\n  /**\n   * Get detailed vesting information for a specific account\n   * @param account - Address to retrieve vesting data for\n   * @returns Object containing totalAmount and releasedAmount\n   */\n  async getVestingData(account: Address): Promise<{\n    totalAmount: bigint;\n    releasedAmount: bigint;\n  }> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'getVestingDataOf',\n      args: [account],\n    });\n\n    return {\n      totalAmount: result[0],\n      releasedAmount: result[1],\n    };\n  }\n\n  // Write methods (require wallet client)\n\n  /**\n   * Approve a spender to transfer tokens on behalf of the owner\n   * @param spender - Address that will be able to spend the tokens\n   * @param value - Amount of tokens to approve\n   * @returns Transaction hash\n   */\n  async approve(\n    spender: Address,\n    value: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'approve',\n      args: [spender, value],\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  /**\n   * Delegate governance votes to an address\n   */\n  async delegate(\n    delegatee: Address,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'delegate',\n      args: [delegatee],\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  /**\n   * Delegate governance votes using an EIP-712 signature (gasless path)\n   * Note: Caller signs typed data; a relayer or the caller submits the tx.\n   */\n  async delegateBySig(\n    delegatee: Address,\n    expiry: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const acct = this.walletClient.account as unknown;\n    let accountAddress: Address;\n    if (typeof acct === 'string') {\n      accountAddress = acct as Address;\n    } else if (acct && typeof acct === 'object' && 'address' in acct) {\n      accountAddress = (acct as { address: Address }).address;\n    } else {\n      throw new Error('Invalid wallet account');\n    }\n    const [nonce, name] = await Promise.all([\n      this.rpc.readContract({\n        address: this.address,\n        abi: derc20Abi,\n        functionName: 'nonces',\n        args: [accountAddress],\n      }),\n      this.getName(),\n    ]);\n    const chainId =\n      (this.rpc.chain?.id as number | undefined) ??\n      (await this.rpc.getChainId());\n\n    const domain = {\n      name,\n      version: '1',\n      chainId,\n      verifyingContract: this.address,\n    } as const;\n\n    const types = {\n      Delegation: [\n        { name: 'delegatee', type: 'address' },\n        { name: 'nonce', type: 'uint256' },\n        { name: 'expiry', type: 'uint256' },\n      ],\n    } as const;\n\n    const message = { delegatee, nonce, expiry } as const;\n\n    const signature = await this.walletClient.signTypedData({\n      domain,\n      types,\n      primaryType: 'Delegation',\n      message,\n      account: accountAddress,\n    });\n\n    const { v, r, s } = Derc20.splitSignature(signature);\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'delegateBySig',\n      args: [delegatee, nonce, expiry, v, r, s],\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  /**\n   * Release all currently available vested tokens to the caller\n   */\n  async release(options?: { gas?: bigint }): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: derc20Abi,\n      functionName: 'release',\n      args: [],\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n}\n","import type { Address } from 'viem';\nimport { derc20V2Abi } from '../../../abis';\nimport { Derc20 } from './Derc20';\n\nexport class Derc20V2 extends Derc20 {\n  async getVestingScheduleCount(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'vestingScheduleCount',\n    });\n  }\n\n  async getVestingSchedule(scheduleId: bigint): Promise<{\n    cliffDuration: bigint;\n    duration: bigint;\n  }> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'vestingSchedules',\n      args: [scheduleId],\n    });\n\n    return {\n      cliffDuration: BigInt(result[0]),\n      duration: BigInt(result[1]),\n    };\n  }\n\n  async getScheduleIdsOf(beneficiary: Address): Promise<bigint[]> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'getScheduleIdsOf',\n      args: [beneficiary],\n    });\n    return Array.from(result);\n  }\n\n  async getTotalAllocatedOf(beneficiary: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'totalAllocatedOf',\n      args: [beneficiary],\n    });\n  }\n\n  async getAvailableVestedAmountForSchedule(\n    beneficiary: Address,\n    scheduleId: bigint,\n  ): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'computeAvailableVestedAmount',\n      args: [beneficiary, scheduleId],\n    });\n  }\n\n  async getVestingDataForSchedule(\n    beneficiary: Address,\n    scheduleId: bigint,\n  ): Promise<{\n    totalAmount: bigint;\n    releasedAmount: bigint;\n  }> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'vestingOf',\n      args: [beneficiary, scheduleId],\n    });\n\n    return {\n      totalAmount: result[0],\n      releasedAmount: result[1],\n    };\n  }\n\n  async releaseSchedule(\n    scheduleId: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'release',\n      args: [scheduleId],\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  async releaseFor(\n    beneficiary: Address,\n    scheduleId?: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    if (scheduleId === undefined) {\n      const { request } = await this.rpc.simulateContract({\n        address: this.address,\n        abi: derc20V2Abi,\n        functionName: 'releaseFor',\n        args: [beneficiary],\n        account: this.walletClient.account,\n      });\n\n      return await this.walletClient.writeContract(\n        options?.gas ? { ...request, gas: options.gas } : request,\n      );\n    }\n\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: derc20V2Abi,\n      functionName: 'releaseFor',\n      args: [beneficiary, scheduleId],\n      account: this.walletClient.account,\n    });\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n}\n","import {\n  type Address,\n  type Hex,\n  type WalletClient,\n  type PublicClient,\n} from 'viem';\nimport { dopplerERC20V1Abi } from '../../../abis';\nimport { SupportedPublicClient } from '../../../types';\n\nconst availableVestedAmountAbi = [\n  {\n    type: 'function',\n    name: 'computeAvailableVestedAmount',\n    inputs: [{ name: 'beneficiary', type: 'address', internalType: 'address' }],\n    outputs: [{ name: 'total', type: 'uint256', internalType: 'uint256' }],\n    stateMutability: 'view',\n  },\n] as const;\n\nexport class DopplerERC20V1 {\n  protected publicClient: SupportedPublicClient;\n  protected walletClient?: WalletClient;\n  protected address: Address;\n  protected get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  protected static splitSignature(signature: Hex): {\n    v: number;\n    r: Hex;\n    s: Hex;\n  } {\n    const sig = signature.toLowerCase() as Hex;\n    const r = `0x${sig.slice(2, 66)}` as Hex;\n    const s = `0x${sig.slice(66, 130)}` as Hex;\n    let v = parseInt(sig.slice(130, 132), 16);\n    if (v < 27) v += 27;\n    return { v, r, s };\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    address: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.address = address;\n  }\n\n  async getName(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'name',\n    });\n  }\n\n  async getSymbol(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'symbol',\n    });\n  }\n\n  async getDecimals(): Promise<number> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'decimals',\n    });\n  }\n\n  async getTokenURI(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'tokenURI',\n    });\n  }\n\n  async getBalanceOf(account: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'balanceOf',\n      args: [account],\n    });\n  }\n\n  async getTotalSupply(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'totalSupply',\n    });\n  }\n\n  async getAllowance(owner: Address, spender: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'allowance',\n      args: [owner, spender],\n    });\n  }\n\n  async getNonce(owner: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'nonces',\n      args: [owner],\n    });\n  }\n\n  async getDomainSeparator(): Promise<Hex> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'DOMAIN_SEPARATOR',\n    });\n  }\n\n  async getDelegates(account: Address): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'delegates',\n      args: [account],\n    });\n  }\n\n  async getVotes(account: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'getVotes',\n      args: [account],\n    });\n  }\n\n  async getPastVotes(account: Address, timepoint: bigint): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'getPastVotes',\n      args: [account, timepoint],\n    });\n  }\n\n  async getVotesTotalSupply(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'getVotesTotalSupply',\n    });\n  }\n\n  async getPastVotesTotalSupply(timepoint: bigint): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'getPastVotesTotalSupply',\n      args: [timepoint],\n    });\n  }\n\n  async getClock(): Promise<number> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'clock',\n    });\n    return Number(result);\n  }\n\n  async getClockMode(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'CLOCK_MODE',\n    });\n  }\n\n  async getCheckpointCount(account: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'checkpointCount',\n      args: [account],\n    });\n  }\n\n  async getCheckpointAt(\n    account: Address,\n    index: bigint,\n  ): Promise<{ checkpointClock: number; checkpointValue: bigint }> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'checkpointAt',\n      args: [account, index],\n    });\n\n    return {\n      checkpointClock: Number(result[0]),\n      checkpointValue: result[1],\n    };\n  }\n\n  async getOwner(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'owner',\n    });\n  }\n\n  async getOwnershipHandoverExpiresAt(pendingOwner: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'ownershipHandoverExpiresAt',\n      args: [pendingOwner],\n    });\n  }\n\n  async getPool(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'pool',\n    });\n  }\n\n  async isPoolLocked(): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'isPoolLocked',\n    });\n  }\n\n  async getVestingStart(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'vestingStart',\n    });\n  }\n\n  async getVestedTotalAmount(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'vestedTotalAmount',\n    });\n  }\n\n  async getVestingScheduleCount(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'vestingScheduleCount',\n    });\n  }\n\n  async getVestingSchedule(scheduleId: bigint): Promise<{\n    cliffDuration: bigint;\n    duration: bigint;\n  }> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'vestingSchedules',\n      args: [scheduleId],\n    });\n\n    return {\n      cliffDuration: BigInt(result[0]),\n      duration: BigInt(result[1]),\n    };\n  }\n\n  async getScheduleIdsOf(beneficiary: Address): Promise<bigint[]> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'getScheduleIdsOf',\n      args: [beneficiary],\n    });\n    return Array.from(result);\n  }\n\n  async getTotalAllocatedOf(beneficiary: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'totalAllocatedOf',\n      args: [beneficiary],\n    });\n  }\n\n  async getAvailableVestedAmountForSchedule(\n    beneficiary: Address,\n    scheduleId: bigint,\n  ): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'computeAvailableVestedAmount',\n      args: [beneficiary, scheduleId],\n    });\n  }\n\n  async getAvailableVestedAmount(beneficiary: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: availableVestedAmountAbi,\n      functionName: 'computeAvailableVestedAmount',\n      args: [beneficiary],\n    });\n  }\n\n  async getVestingDataForSchedule(\n    beneficiary: Address,\n    scheduleId: bigint,\n  ): Promise<{\n    totalAmount: bigint;\n    releasedAmount: bigint;\n  }> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'vestingOf',\n      args: [beneficiary, scheduleId],\n    });\n\n    return {\n      totalAmount: result[0],\n      releasedAmount: result[1],\n    };\n  }\n\n  async getMaxBalanceLimit(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'maxBalanceLimit',\n    });\n  }\n\n  async getBalanceLimitEnd(): Promise<number> {\n    const result = await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'balanceLimitEnd',\n    });\n    return Number(result);\n  }\n\n  async isBalanceLimitActive(): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'isBalanceLimitActive',\n    });\n  }\n\n  async getController(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'controller',\n    });\n  }\n\n  async isExcludedFromBalanceLimit(account: Address): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName: 'isExcludedFromBalanceLimit',\n      args: [account],\n    });\n  }\n\n  async approve(\n    spender: Address,\n    value: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('approve', [spender, value], options);\n  }\n\n  async permit(\n    owner: Address,\n    spender: Address,\n    value: bigint,\n    deadline: bigint,\n    signature: Hex,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`>;\n  async permit(\n    owner: Address,\n    spender: Address,\n    value: bigint,\n    deadline: bigint,\n    v: number,\n    r: Hex,\n    s: Hex,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`>;\n  async permit(\n    owner: Address,\n    spender: Address,\n    value: bigint,\n    deadline: bigint,\n    signatureOrV: Hex | number,\n    rOrOptions?: Hex | { gas?: bigint },\n    s?: Hex,\n    maybeOptions?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    const {\n      v,\n      r,\n      s: signatureS,\n    } = typeof signatureOrV === 'number'\n      ? { v: signatureOrV, r: rOrOptions as Hex, s: s as Hex }\n      : DopplerERC20V1.splitSignature(signatureOrV);\n    const options =\n      typeof signatureOrV === 'number'\n        ? maybeOptions\n        : (rOrOptions as { gas?: bigint } | undefined);\n\n    return await this.write(\n      'permit',\n      [owner, spender, value, deadline, v, r, signatureS],\n      options,\n    );\n  }\n\n  async transfer(\n    to: Address,\n    value: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('transfer', [to, value], options);\n  }\n\n  async transferFrom(\n    from: Address,\n    to: Address,\n    value: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('transferFrom', [from, to, value], options);\n  }\n\n  async delegate(\n    delegatee: Address,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('delegate', [delegatee], options);\n  }\n\n  async delegateBySig(\n    delegatee: Address,\n    expiry: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const accountAddress = this.getWalletAccountAddress();\n    const [nonce, name] = await Promise.all([\n      this.getNonce(accountAddress),\n      this.getName(),\n    ]);\n    const chainId =\n      (this.rpc.chain?.id as number | undefined) ??\n      (await this.rpc.getChainId());\n\n    const signature = await this.signTypedData({\n      domain: {\n        name,\n        version: '1',\n        chainId,\n        verifyingContract: this.address,\n      },\n      types: {\n        Delegation: [\n          { name: 'delegatee', type: 'address' },\n          { name: 'nonce', type: 'uint256' },\n          { name: 'expiry', type: 'uint256' },\n        ],\n      },\n      primaryType: 'Delegation',\n      message: { delegatee, nonce, expiry },\n      account: accountAddress,\n    });\n\n    const { v, r, s } = DopplerERC20V1.splitSignature(signature);\n    return await this.write(\n      'delegateBySig',\n      [delegatee, nonce, expiry, v, r, s],\n      options,\n    );\n  }\n\n  async transferOwnership(\n    newOwner: Address,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('transferOwnership', [newOwner], options);\n  }\n\n  async renounceOwnership(options?: { gas?: bigint }): Promise<`0x${string}`> {\n    return await this.write('renounceOwnership', [], options);\n  }\n\n  async requestOwnershipHandover(options?: {\n    gas?: bigint;\n  }): Promise<`0x${string}`> {\n    return await this.write('requestOwnershipHandover', [], options);\n  }\n\n  async cancelOwnershipHandover(options?: {\n    gas?: bigint;\n  }): Promise<`0x${string}`> {\n    return await this.write('cancelOwnershipHandover', [], options);\n  }\n\n  async completeOwnershipHandover(\n    pendingOwner: Address,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write(\n      'completeOwnershipHandover',\n      [pendingOwner],\n      options,\n    );\n  }\n\n  async lockPool(\n    pool: Address,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('lockPool', [pool], options);\n  }\n\n  async unlockPool(options?: { gas?: bigint }): Promise<`0x${string}`> {\n    return await this.write('unlockPool', [], options);\n  }\n\n  async burn(\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('burn', [amount], options);\n  }\n\n  async release(\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('release', [amount], options);\n  }\n\n  async releaseSchedule(\n    scheduleId: bigint,\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('release', [scheduleId, amount], options);\n  }\n\n  async releaseFor(\n    beneficiary: Address,\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`>;\n  async releaseFor(\n    beneficiary: Address,\n    scheduleId: bigint,\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`>;\n  async releaseFor(\n    beneficiary: Address,\n    amountOrScheduleId: bigint,\n    amountOrOptions?: bigint | { gas?: bigint },\n    maybeOptions?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    const hasSchedule = typeof amountOrOptions === 'bigint';\n    const args = hasSchedule\n      ? [beneficiary, amountOrScheduleId, amountOrOptions]\n      : [beneficiary, amountOrScheduleId];\n    const options = hasSchedule ? maybeOptions : amountOrOptions;\n    return await this.write('releaseFor', args, options);\n  }\n\n  async disableBalanceLimit(options?: {\n    gas?: bigint;\n  }): Promise<`0x${string}`> {\n    return await this.write('disableBalanceLimit', [], options);\n  }\n\n  async updateTokenURI(\n    tokenURI: string,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    return await this.write('updateTokenURI', [tokenURI], options);\n  }\n\n  private getWalletAccountAddress(): Address {\n    const account = this.walletClient?.account as unknown;\n    if (typeof account === 'string') return account as Address;\n    if (account && typeof account === 'object' && 'address' in account) {\n      return (account as { address: Address }).address;\n    }\n    throw new Error('Invalid wallet account');\n  }\n\n  private async signTypedData(parameters: unknown): Promise<Hex> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const signTypedData = this.walletClient.signTypedData as unknown as (\n      parameters: unknown,\n    ) => Promise<Hex>;\n    return await signTypedData(parameters);\n  }\n\n  private async write(\n    functionName: string,\n    args: readonly unknown[],\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const simulateContract = this.rpc.simulateContract as unknown as (\n      parameters: unknown,\n    ) => Promise<{ request: Record<string, unknown> }>;\n    const writeContract = this.walletClient.writeContract as unknown as (\n      parameters: unknown,\n    ) => Promise<`0x${string}`>;\n\n    const { request } = await simulateContract({\n      address: this.address,\n      abi: dopplerERC20V1Abi,\n      functionName,\n      args,\n      account: this.walletClient.account,\n    });\n\n    return await writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n}\n","import type { Address, PublicClient, WalletClient } from 'viem';\nimport { dopplerDN404Abi } from '../../../abis';\nimport type { SupportedPublicClient } from '../../../types';\n\nexport class DopplerDN404 {\n  private readonly publicClient: SupportedPublicClient;\n  private readonly walletClient?: WalletClient;\n  private readonly address: Address;\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    address: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.address = address;\n  }\n\n  getAddress(): Address {\n    return this.address;\n  }\n\n  async getName(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'name',\n    });\n  }\n\n  async getSymbol(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'symbol',\n    });\n  }\n\n  async getDecimals(): Promise<number> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'decimals',\n    });\n  }\n\n  async getTotalSupply(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'totalSupply',\n    });\n  }\n\n  async getBalanceOf(owner: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'balanceOf',\n      args: [owner],\n    });\n  }\n\n  async getAllowance(owner: Address, spender: Address): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'allowance',\n      args: [owner, spender],\n    });\n  }\n\n  async getUnit(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'unit',\n    });\n  }\n\n  async getBaseURI(): Promise<string> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'baseURI',\n    });\n  }\n\n  async getMirrorERC721(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'mirrorERC721',\n    });\n  }\n\n  async getTotalNFTSupply(): Promise<bigint> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'totalNFTSupply',\n    });\n  }\n\n  async getSkipNFT(owner: Address): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'getSkipNFT',\n      args: [owner],\n    });\n  }\n\n  async getPool(): Promise<Address> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'pool',\n    });\n  }\n\n  async getIsPoolUnlocked(): Promise<boolean> {\n    return await this.rpc.readContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'isPoolUnlocked',\n    });\n  }\n\n  async approve(\n    spender: Address,\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    const walletClient = this.getWalletClient();\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'approve',\n      args: [spender, amount],\n      account: walletClient.account,\n    });\n    return await walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  async transfer(\n    to: Address,\n    amount: bigint,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    const walletClient = this.getWalletClient();\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'transfer',\n      args: [to, amount],\n      account: walletClient.account,\n    });\n    return await walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  async setSkipNFT(\n    skipNFT: boolean,\n    options?: { gas?: bigint },\n  ): Promise<`0x${string}`> {\n    const walletClient = this.getWalletClient();\n    const { request } = await this.rpc.simulateContract({\n      address: this.address,\n      abi: dopplerDN404Abi,\n      functionName: 'setSkipNFT',\n      args: [skipNFT],\n      account: walletClient.account,\n    });\n    return await walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n\n  private getWalletClient(): WalletClient {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n    return this.walletClient;\n  }\n}\n","import { type Address, zeroAddress, type PublicClient } from 'viem';\nimport { SupportedPublicClient } from '../../../types';\n\n/**\n * A class providing read-only access to Ethereum (ETH) token information and balances.\n *\n * @remarks\n * This class implements a consistent interface with other token implementations (like DERC20)\n * but handles ETH-specific behavior such as:\n * - Hardcoded token metadata (name, symbol, decimals)\n * - Simulating unlimited allowance for ETH transfers\n * - Querying native ETH balances through viem\n */\nexport class Eth {\n  private publicClient: SupportedPublicClient;\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  /** Static ETH address identifier (zero address) */\n  static readonly address = zeroAddress;\n\n  constructor(publicClient: SupportedPublicClient) {\n    this.publicClient = publicClient;\n  }\n\n  /**\n   * Get the human-readable name of the token\n   * @returns Promise resolving to \"Ether\" (hardcoded ETH name)\n   */\n  async getName(): Promise<string> {\n    return 'Ether';\n  }\n\n  /**\n   * Get the ticker symbol of the token\n   * @returns Promise resolving to \"ETH\" (hardcoded ETH symbol)\n   */\n  async getSymbol(): Promise<string> {\n    return 'ETH';\n  }\n\n  /**\n   * Get the number of decimal places used by the token\n   * @returns Promise resolving to 18 (standard ETH decimals)\n   */\n  async getDecimals(): Promise<number> {\n    return 18;\n  }\n\n  /**\n   * Get the allowance granted to a spender (always returns maximum value)\n   * @returns Promise resolving to 2^256 - 1 (simulates unlimited ETH allowance)\n   *\n   * @remarks\n   * ETH doesn't have an allowance mechanism, so this returns max uint256 value\n   * to represent unlimited approval in systems expecting ERC20-like interfaces\n   */\n  async getAllowance(): Promise<bigint> {\n    return 2n ** 256n - 1n;\n  }\n\n  /**\n   * Get the ETH balance of a specified account\n   * @param account - Address of the account to query\n   * @returns Promise resolving to the account's ETH balance in wei\n   */\n  async getBalanceOf(account: Address): Promise<bigint> {\n    return await this.rpc.getBalance({\n      address: account,\n    });\n  }\n}\n","import {\n  encodeFunctionData,\n  type Account,\n  type Address,\n  type Hash,\n  type Hex,\n  type PublicClient,\n  type WalletClient,\n} from 'viem';\nimport { topUpDistributorAbi } from '../abis';\nimport { ZERO_ADDRESS } from '../constants';\nimport type { SupportedPublicClient } from '../types';\n\nexport interface TopUpParams {\n  asset: Address;\n  numeraire: Address;\n  amount: bigint;\n}\n\nexport interface TopUpTransaction {\n  to: Address;\n  data: Hex;\n  value?: bigint;\n}\n\nexport interface TopUpSimulationResult {\n  request: Parameters<WalletClient['writeContract']>[0];\n}\n\nexport class TopUpDistributor {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private topUpDistributorAddress: Address;\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    topUpDistributorAddress: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.topUpDistributorAddress = topUpDistributorAddress;\n  }\n\n  getAddress(): Address {\n    return this.topUpDistributorAddress;\n  }\n\n  buildTopUpTransaction(params: TopUpParams): TopUpTransaction {\n    const tx = {\n      to: this.topUpDistributorAddress,\n      data: encodeFunctionData({\n        abi: topUpDistributorAbi,\n        functionName: 'topUp',\n        args: [params.asset, params.numeraire, params.amount],\n      }),\n    };\n\n    if (params.numeraire === ZERO_ADDRESS) {\n      return { ...tx, value: params.amount };\n    }\n\n    return tx;\n  }\n\n  async simulateTopUp(\n    params: TopUpParams,\n    account?: Address | Account,\n  ): Promise<TopUpSimulationResult> {\n    const { request } = await this.rpc.simulateContract({\n      address: this.topUpDistributorAddress,\n      abi: topUpDistributorAbi,\n      functionName: 'topUp',\n      args: [params.asset, params.numeraire, params.amount],\n      account: account ?? this.walletClient?.account,\n      ...(params.numeraire === ZERO_ADDRESS ? { value: params.amount } : {}),\n    });\n\n    return {\n      request: request as Parameters<WalletClient['writeContract']>[0],\n    };\n  }\n\n  async topUp(params: TopUpParams, options?: { gas?: bigint }): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateTopUp(\n      params,\n      this.walletClient.account,\n    );\n\n    return await this.walletClient.writeContract(\n      options?.gas ? { ...request, gas: options.gas } : request,\n    );\n  }\n}\n","import type { Account, Address, Hash, PublicClient, WalletClient } from 'viem';\nimport { bundlerAbi } from '../abis';\nimport type { SupportedPublicClient } from '../types';\n\n/**\n * A token position held by Bundler for linear vesting.\n *\n * All timestamps and durations are expressed in seconds. Claims always pay the\n * recorded `recipient`; `permissionlessClaim` only controls who may trigger\n * the claim.\n */\nexport interface BundlerVestingPosition {\n  recipient: Address;\n  permissionlessClaim: boolean;\n  start: bigint;\n  cliffDuration: bigint;\n  vestingDuration: bigint;\n  totalAmount: bigint;\n  claimedAmount: bigint;\n}\n\n/** Result of simulating a Bundler vesting claim. */\nexport interface BundlerClaimSimulation {\n  amount: bigint;\n  request: Parameters<WalletClient['writeContract']>[0];\n}\n\n/**\n * Client for reading and claiming token positions held by a Bundler contract.\n */\nexport class Bundler {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  private bundlerAddress: Address;\n\n  constructor(\n    publicClient: SupportedPublicClient,\n    walletClient: WalletClient | undefined,\n    bundlerAddress: Address,\n  ) {\n    this.publicClient = publicClient;\n    this.walletClient = walletClient;\n    this.bundlerAddress = bundlerAddress;\n  }\n\n  private get rpc(): PublicClient {\n    return this.publicClient as PublicClient;\n  }\n\n  /** Returns the Bundler contract address used by this client. */\n  getAddress(): Address {\n    return this.bundlerAddress;\n  }\n\n  /**\n   * Reads the vesting position for an asset.\n   *\n   * @param asset Token whose Bundler position should be read.\n   */\n  async getVesting(asset: Address): Promise<BundlerVestingPosition> {\n    const result = await this.rpc.readContract({\n      address: this.bundlerAddress,\n      abi: bundlerAbi,\n      functionName: 'vestingOf',\n      args: [asset],\n    });\n    const values = result as readonly [\n      Address,\n      boolean,\n      bigint,\n      bigint,\n      bigint,\n      bigint,\n      bigint,\n    ];\n\n    return {\n      recipient: values[0],\n      permissionlessClaim: values[1],\n      start: values[2],\n      cliffDuration: values[3],\n      vestingDuration: values[4],\n      totalAmount: values[5],\n      claimedAmount: values[6],\n    };\n  }\n\n  /**\n   * Returns the amount currently claimable for an asset.\n   *\n   * @param asset Token whose claimable amount should be read.\n   */\n  async getClaimable(asset: Address): Promise<bigint> {\n    return (await this.rpc.readContract({\n      address: this.bundlerAddress,\n      abi: bundlerAbi,\n      functionName: 'claimable',\n      args: [asset],\n    })) as bigint;\n  }\n\n  /**\n   * Simulates a claim and returns both the claimable amount and write request.\n   *\n   * The caller defaults to the configured wallet account. Pass `account` when\n   * using a read-only SDK instance. For restricted positions, the caller must\n   * be the recorded recipient.\n   *\n   * @param asset Token to claim.\n   * @param account Account that will trigger the claim.\n   */\n  async simulateClaim(\n    asset: Address,\n    account?: Address | Account,\n  ): Promise<BundlerClaimSimulation> {\n    const resolvedAccount = account ?? this.walletClient?.account;\n    if (!resolvedAccount) {\n      throw new Error(\n        'An account is required to simulate a Bundler vesting claim',\n      );\n    }\n\n    const { request, result } = await this.rpc.simulateContract({\n      address: this.bundlerAddress,\n      abi: bundlerAbi,\n      functionName: 'claim',\n      args: [asset],\n      account: resolvedAccount,\n    });\n\n    return {\n      amount: result as bigint,\n      request: request as Parameters<WalletClient['writeContract']>[0],\n    };\n  }\n\n  /**\n   * Claims the currently vested amount to the position's recorded recipient.\n   *\n   * Requires a configured wallet client. Permissionless callers may trigger a\n   * claim but cannot redirect its proceeds.\n   *\n   * @param asset Token to claim.\n   * @param options Optional transaction gas override.\n   * @returns Submitted transaction hash.\n   */\n  async claim(asset: Address, options?: { gas?: bigint }): Promise<Hash> {\n    if (!this.walletClient) {\n      throw new Error('Wallet client required for write operations');\n    }\n\n    const { request } = await this.simulateClaim(\n      asset,\n      this.walletClient.account,\n    );\n    return await this.walletClient.writeContract(\n      options?.gas === undefined ? request : { ...request, gas: options.gas },\n    );\n  }\n}\n","import type { Address } from 'viem';\nimport {\n  DEFAULT_V3_END_TICK,\n  DEFAULT_V3_FEE,\n  DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n  DEFAULT_V3_NUM_POSITIONS,\n  DEFAULT_V3_START_TICK,\n  DEFAULT_V3_VESTING_DURATION,\n  DEFAULT_V3_YEARLY_MINT_RATE,\n  TICK_SPACINGS,\n  V3_FEE_TIERS,\n  ZERO_ADDRESS,\n} from '../constants';\nimport {\n  marketCapToTicksForStaticAuction,\n  validateMarketCapParameters,\n} from '../utils';\nimport {\n  isNoOpEnabledChain,\n  isLaunchpadEnabledChain,\n  type CreateStaticAuctionParams,\n  type GovernanceOption,\n  type MigrationConfig,\n  type PriceRange,\n  type VestingConfig,\n  type TokenConfig,\n  type StaticAuctionMarketCapConfig,\n  type ModuleAddressOverrides,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport {\n  computeTicks,\n  normalizeBuilderTokenConfig,\n  normalizeBuilderVestingSchedule,\n  type BaseAuctionBuilder,\n  type BuilderVestingInput,\n} from './shared';\n\nexport class StaticAuctionBuilder<\n  C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n  private token?: TokenConfig;\n  private sale?: CreateStaticAuctionParams<C>['sale'];\n  private pool?: CreateStaticAuctionParams<C>['pool'];\n  private beneficiaries?: { beneficiary: Address; shares: bigint }[];\n  private vesting?: VestingConfig;\n  private governance?: GovernanceOption<C>;\n  private migration?: MigrationConfig;\n  private integrator?: Address;\n  private userAddress?: Address;\n  private moduleAddresses?: ModuleAddressOverrides;\n  private gasLimit?: bigint;\n  // Deferred market cap config - converted to pool in build()\n  private marketCapConfig?: {\n    marketCap: { start: number; end: number };\n    numerairePrice: number;\n    tokenSupply?: bigint;\n    tokenDecimals?: number;\n    numeraireDecimals?: number;\n    fee?: number;\n    numPositions?: number;\n    maxShareToBeSold?: bigint;\n  };\n  public chainId: C;\n\n  constructor(chainId: C) {\n    this.chainId = chainId;\n  }\n\n  static forChain<C extends SupportedChainId>(\n    chainId: C,\n  ): StaticAuctionBuilder<C> {\n    return new StaticAuctionBuilder(chainId);\n  }\n\n  tokenConfig(params: TokenConfig): this {\n    this.token = normalizeBuilderTokenConfig(\n      params,\n      DEFAULT_V3_YEARLY_MINT_RATE,\n    );\n    return this;\n  }\n\n  saleConfig(params: {\n    initialSupply: bigint;\n    numTokensToSell: bigint;\n    numeraire: Address;\n  }): this {\n    this.sale = {\n      initialSupply: params.initialSupply,\n      numTokensToSell: params.numTokensToSell,\n      numeraire: params.numeraire,\n    };\n    return this;\n  }\n\n  /**\n   * Provide pool ticks directly.\n   *\n   * Note: Static Auctions use Uniswap V3, which only supports 4 fee tiers:\n   * 100 (0.01%), 500 (0.05%), 3000 (0.3%), 10000 (1%).\n   * For custom fees, use Dynamic or Multicurve auctions (V4).\n   */\n  poolByTicks(params: {\n    startTick?: number;\n    endTick?: number;\n    fee?: number;\n    numPositions?: number;\n    maxShareToBeSold?: bigint;\n  }): this {\n    // Mutual exclusion: cannot use poolByTicks() after withMarketCapRange()\n    if (this.marketCapConfig) {\n      throw new Error(\n        'Cannot use poolByTicks() after withMarketCapRange(). ' +\n          'Use withMarketCapRange() for market cap-based configuration, ' +\n          'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n      );\n    }\n\n    const fee = params.fee ?? DEFAULT_V3_FEE;\n\n    // Validate fee is a V3-supported tier\n    if (!(V3_FEE_TIERS as readonly number[]).includes(fee)) {\n      throw new Error(\n        `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n          `Got: ${fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n      );\n    }\n\n    const startTick = params.startTick ?? DEFAULT_V3_START_TICK;\n    const endTick = params.endTick ?? DEFAULT_V3_END_TICK;\n    this.pool = {\n      startTick,\n      endTick,\n      fee,\n      numPositions: params.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n      maxShareToBeSold:\n        params.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n    };\n    return this;\n  }\n\n  /**\n   * @deprecated Use withMarketCapRange() instead for more intuitive market cap configuration\n   */\n  poolByPriceRange(params: {\n    priceRange: PriceRange;\n    fee?: number;\n    numPositions?: number;\n    maxShareToBeSold?: bigint;\n  }): this {\n    // Mutual exclusion: cannot use poolByPriceRange() after withMarketCapRange()\n    if (this.marketCapConfig) {\n      throw new Error(\n        'Cannot use poolByPriceRange() after withMarketCapRange(). ' +\n          'Use withMarketCapRange() for market cap-based configuration, ' +\n          'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n      );\n    }\n\n    const fee = params.fee ?? DEFAULT_V3_FEE;\n    const tickSpacing =\n      fee === 100\n        ? TICK_SPACINGS[100]\n        : fee === 500\n          ? TICK_SPACINGS[500]\n          : fee === 3000\n            ? TICK_SPACINGS[3000]\n            : TICK_SPACINGS[10000];\n    const ticks = computeTicks(params.priceRange, tickSpacing);\n    return this.poolByTicks({\n      startTick: ticks.startTick,\n      endTick: ticks.endTick,\n      fee,\n      numPositions: params.numPositions,\n      maxShareToBeSold: params.maxShareToBeSold,\n    });\n  }\n\n  /**\n   * Configure pool using target market cap range.\n   * Converts market cap values (in USD) to Uniswap ticks.\n   *\n   * @param params - Market cap configuration\n   * @returns Builder instance for chaining\n   *\n   * @example\n   * ```ts\n   * builder\n   *   .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n   *   .withMarketCapRange({\n   *     marketCap: { start: 100_000, end: 10_000_000 }, // $100k to $10M\n   *     numerairePrice: 3000, // ETH = $3000\n   *   })\n   * ```\n   */\n  withMarketCapRange(params: StaticAuctionMarketCapConfig): this {\n    // Mutual exclusion: cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange()\n    if (this.pool) {\n      throw new Error(\n        'Cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange(). ' +\n          'Use withMarketCapRange() for market cap-based configuration, ' +\n          'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n      );\n    }\n\n    // Basic validation that doesn't require saleConfig\n    if (params.numerairePrice <= 0) {\n      throw new Error('numerairePrice must be greater than 0');\n    }\n    if (params.marketCap.start <= 0 || params.marketCap.end <= 0) {\n      throw new Error('marketCap values must be greater than 0');\n    }\n    if (params.marketCap.start >= params.marketCap.end) {\n      throw new Error('marketCap.start must be less than marketCap.end');\n    }\n\n    // Validate fee is a V3-supported tier (if provided)\n    if (params.fee !== undefined) {\n      if (!(V3_FEE_TIERS as readonly number[]).includes(params.fee)) {\n        throw new Error(\n          `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n            `Got: ${params.fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n        );\n      }\n    }\n\n    // Store config for deferred conversion in build()\n    this.marketCapConfig = {\n      marketCap: params.marketCap,\n      numerairePrice: params.numerairePrice,\n      tokenSupply: params.tokenSupply,\n      tokenDecimals: params.tokenDecimals,\n      numeraireDecimals: params.numeraireDecimals,\n      fee: params.fee,\n      numPositions: params.numPositions,\n      maxShareToBeSold: params.maxShareToBeSold,\n    };\n\n    return this;\n  }\n\n  /**\n   * Configure beneficiaries for fee streaming on locked V3 pools.\n   *\n   * When beneficiaries are provided, the pool enters a \"Locked\" state where:\n   * - Fees are collected and distributed to beneficiaries according to their shares\n   * - Liquidity cannot be exited/migrated (pool stays locked permanently)\n   * - Anyone can call collectFees() to distribute accumulated fees\n   *\n   * IMPORTANT:\n   * - Shares must sum to exactly WAD (1e18 = 100%)\n   * - Protocol owner (Airlock.owner()) must be included with at least 5% shares\n   * - Beneficiaries will be automatically sorted by address (ascending)\n   * - Use withMigration({ type: 'noOp' }) when using beneficiaries\n   *\n   * @example\n   * ```typescript\n   * builder.withBeneficiaries([\n   *   { beneficiary: protocolOwner, shares: parseEther('0.05') },  // 5% (minimum required)\n   *   { beneficiary: teamWallet, shares: parseEther('0.45') },     // 45%\n   *   { beneficiary: daoTreasury, shares: parseEther('0.50') },    // 50%\n   * ])\n   * ```\n   */\n  withBeneficiaries(\n    beneficiaries: { beneficiary: Address; shares: bigint }[],\n  ): this {\n    // Sort beneficiaries by address (ascending) as required by the contract\n    this.beneficiaries = [...beneficiaries].sort((a, b) => {\n      const aAddr = a.beneficiary.toLowerCase();\n      const bAddr = b.beneficiary.toLowerCase();\n      return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n    });\n    return this;\n  }\n\n  withVesting(params?: BuilderVestingInput): this {\n    if (!params) {\n      this.vesting = undefined;\n      return this;\n    }\n    if (params.allocations) {\n      this.vesting = {\n        allocations: params.allocations.map((allocation, index) => ({\n          recipient: allocation.recipient,\n          amount: allocation.amount,\n          schedule: normalizeBuilderVestingSchedule(\n            allocation.schedule,\n            `Vesting allocations[${index}].schedule`,\n          ),\n        })),\n      };\n      return this;\n    }\n\n    this.vesting = {\n      duration: Number(params.duration ?? DEFAULT_V3_VESTING_DURATION),\n      cliffDuration: params.cliffDuration ?? 0,\n      recipients: params.recipients,\n      amounts: params.amounts,\n    };\n    return this;\n  }\n\n  withGovernance(params: GovernanceOption<C>): this {\n    this.governance = params;\n    return this;\n  }\n\n  withMigration(migration: MigrationConfig): this {\n    this.migration = migration;\n    return this;\n  }\n\n  withUserAddress(address: Address): this {\n    this.userAddress = address;\n    return this;\n  }\n\n  withIntegrator(address?: Address): this {\n    this.integrator = address ?? ZERO_ADDRESS;\n    return this;\n  }\n\n  withGasLimit(gas?: bigint): this {\n    this.gasLimit = gas;\n    return this;\n  }\n\n  // Address override helpers\n  private overrideModule<K extends keyof ModuleAddressOverrides>(\n    key: K,\n    address: NonNullable<ModuleAddressOverrides[K]>,\n  ): this {\n    this.moduleAddresses = {\n      ...this.moduleAddresses,\n      [key]: address,\n    } as ModuleAddressOverrides;\n    return this;\n  }\n\n  withTokenFactory(address: Address): this {\n    return this.overrideModule('tokenFactory', address);\n  }\n\n  withAirlock(address: Address): this {\n    return this.overrideModule('airlock', address);\n  }\n\n  withV3Initializer(address: Address): this {\n    return this.overrideModule('v3Initializer', address);\n  }\n\n  withGovernanceFactory(address: Address): this {\n    return this.overrideModule('governanceFactory', address);\n  }\n\n  withV2Migrator(address: Address): this {\n    return this.overrideModule('v2Migrator', address);\n  }\n\n  withV2MigratorSplit(address: Address): this {\n    return this.overrideModule('v2MigratorSplit', address);\n  }\n\n  withV4Migrator(address: Address): this {\n    return this.overrideModule('v4Migrator', address);\n  }\n\n  withV4MigratorSplit(address: Address): this {\n    return this.overrideModule('v4MigratorSplit', address);\n  }\n\n  withNoOpMigrator(address: Address): this {\n    return this.overrideModule('noOpMigrator', address);\n  }\n\n  build(): CreateStaticAuctionParams<C> {\n    if (!this.token) throw new Error('tokenConfig is required');\n    if (!this.sale) throw new Error('saleConfig is required');\n    if (!this.migration) throw new Error('migration configuration is required');\n    if (!this.userAddress) throw new Error('userAddress is required');\n\n    // Convert deferred market cap config to pool if set\n    if (this.marketCapConfig && !this.pool) {\n      const config = this.marketCapConfig;\n\n      // Get token supply from config or saleConfig\n      const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n      if (!tokenSupply) {\n        throw new Error(\n          'tokenSupply must be provided (either via saleConfig() or withMarketCapRange() params)',\n        );\n      }\n\n      // Determine fee and tick spacing\n      const fee = config.fee ?? DEFAULT_V3_FEE;\n      const tickSpacing =\n        fee === 100\n          ? TICK_SPACINGS[100]\n          : fee === 500\n            ? TICK_SPACINGS[500]\n            : fee === 3000\n              ? TICK_SPACINGS[3000]\n              : TICK_SPACINGS[10000];\n\n      // Validate market cap parameters\n      const startValidation = validateMarketCapParameters(\n        config.marketCap.start,\n        tokenSupply,\n        config.tokenDecimals,\n      );\n      const endValidation = validateMarketCapParameters(\n        config.marketCap.end,\n        tokenSupply,\n        config.tokenDecimals,\n      );\n\n      // Log warnings if any\n      const allWarnings = [\n        ...startValidation.warnings,\n        ...endValidation.warnings,\n      ];\n      if (allWarnings.length > 0) {\n        console.warn('Market cap validation warnings:');\n        allWarnings.forEach((w) => console.warn(`  - ${w}`));\n      }\n\n      // Convert market cap range to ticks for V3 Static auction\n      const { startTick, endTick } = marketCapToTicksForStaticAuction({\n        marketCapRange: config.marketCap,\n        tokenSupply,\n        numerairePriceUSD: config.numerairePrice,\n        tickSpacing,\n        tokenDecimals: config.tokenDecimals ?? 18,\n        numeraireDecimals: config.numeraireDecimals ?? 18,\n      });\n\n      // Set pool config\n      this.pool = {\n        startTick,\n        endTick,\n        fee,\n        numPositions: config.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n        maxShareToBeSold:\n          config.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n      };\n    }\n\n    if (!this.pool) throw new Error('pool configuration is required');\n\n    // Default governance: noOp on supported chains, default on others (e.g., Ink)\n    const governance =\n      this.governance ??\n      (isNoOpEnabledChain(this.chainId)\n        ? { type: 'noOp' as const }\n        : { type: 'default' as const });\n\n    if (\n      governance.type === 'launchpad' &&\n      !isLaunchpadEnabledChain(this.chainId)\n    ) {\n      throw new Error(\n        `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n      );\n    }\n\n    // Merge beneficiaries into pool config if provided\n    const poolWithBeneficiaries = this.beneficiaries\n      ? { ...this.pool, beneficiaries: this.beneficiaries }\n      : this.pool;\n\n    // Validate noOp migration requires beneficiaries\n    // NoOpMigrator is designed for locked pools with beneficiaries. Without beneficiaries,\n    // the pool status is \"Initialized\" (not \"Locked\"), meaning exitLiquidity() can be called.\n    // But NoOpMigrator.migrate() always reverts, so the entire graduation transaction fails\n    // and liquidity becomes trapped.\n    if (this.migration.type === 'noOp') {\n      const hasBeneficiaries =\n        poolWithBeneficiaries.beneficiaries &&\n        poolWithBeneficiaries.beneficiaries.length > 0;\n      if (!hasBeneficiaries) {\n        throw new Error(\n          'noOp migration requires beneficiaries. Without beneficiaries, the pool would be stuck after reaching ' +\n            'graduation - exitLiquidity() succeeds but NoOpMigrator.migrate() always reverts, causing the entire ' +\n            'transaction to fail. Either add beneficiaries via withBeneficiaries() or use a different migration type (uniswapV2, uniswapV4).',\n        );\n      }\n    }\n\n    return {\n      token: this.token,\n      sale: this.sale,\n      pool: poolWithBeneficiaries,\n      vesting: this.vesting,\n      governance: governance as GovernanceOption<C>,\n      migration: this.migration,\n      integrator: this.integrator ?? ZERO_ADDRESS,\n      userAddress: this.userAddress,\n      modules: this.moduleAddresses,\n      gas: this.gasLimit,\n    };\n  }\n}\n","import type { Address } from 'viem';\nimport {\n  DEFAULT_AUCTION_DURATION,\n  DEFAULT_EPOCH_LENGTH,\n  DEFAULT_V4_YEARLY_MINT_RATE,\n  DOPPLER_MAX_TICK_SPACING,\n  FEE_TIERS,\n  V4_MAX_FEE,\n  ZERO_ADDRESS,\n} from '../constants';\nimport {\n  computeOptimalGamma,\n  marketCapToTicksForDynamicAuction,\n  validateMarketCapParameters,\n} from '../utils';\nimport {\n  isNoOpEnabledChain,\n  isLaunchpadEnabledChain,\n  type CreateDynamicAuctionParams,\n  type GovernanceOption,\n  type MigrationConfig,\n  type PriceRange,\n  type VestingConfig,\n  type TokenConfig,\n  type DynamicAuctionMarketCapConfig,\n  type ModuleAddressOverrides,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport {\n  computeTicks,\n  normalizeBuilderTokenConfig,\n  normalizeBuilderVestingSchedule,\n  type BaseAuctionBuilder,\n  type BuilderVestingInput,\n} from './shared';\n\nexport class DynamicAuctionBuilder<\n  C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n  private token?: TokenConfig;\n  private sale?: CreateDynamicAuctionParams<C>['sale'];\n  private auction?: CreateDynamicAuctionParams<C>['auction'];\n  private pool?: CreateDynamicAuctionParams<C>['pool'];\n  private vesting?: VestingConfig;\n  private governance?: GovernanceOption<C>;\n  private migration?: MigrationConfig;\n  private integrator?: Address;\n  private userAddress?: Address;\n  private startTimeOffset?: number;\n  private blockTimestamp?: number;\n  private moduleAddresses?: ModuleAddressOverrides;\n  private gasLimit?: bigint;\n  // Deferred market cap config - converted to pool and auction in build()\n  private marketCapConfig?: {\n    marketCap: { start: number; min: number };\n    numerairePrice: number;\n    tokenSupply?: bigint;\n    tokenDecimals?: number;\n    numeraireDecimals?: number;\n    fee?: number;\n    tickSpacing?: number;\n    minProceeds: bigint;\n    maxProceeds: bigint;\n    duration?: number;\n    epochLength?: number;\n    gamma?: number;\n    numPdSlugs?: number;\n  };\n  public chainId: C;\n\n  constructor(chainId: C) {\n    this.chainId = chainId;\n  }\n\n  static forChain<C extends SupportedChainId>(\n    chainId: C,\n  ): DynamicAuctionBuilder<C> {\n    return new DynamicAuctionBuilder(chainId);\n  }\n\n  tokenConfig(params: TokenConfig): this {\n    this.token = normalizeBuilderTokenConfig(\n      params,\n      DEFAULT_V4_YEARLY_MINT_RATE,\n    );\n    return this;\n  }\n\n  saleConfig(params: {\n    initialSupply: bigint;\n    numTokensToSell: bigint;\n    numeraire?: Address;\n  }): this {\n    this.sale = {\n      initialSupply: params.initialSupply,\n      numTokensToSell: params.numTokensToSell,\n      numeraire: params.numeraire ?? ZERO_ADDRESS,\n    };\n    return this;\n  }\n\n  poolConfig(params: { fee: number; tickSpacing: number }): this {\n    // Mutual exclusion: cannot use poolConfig() after withMarketCapRange()\n    if (this.marketCapConfig) {\n      throw new Error(\n        'Cannot use poolConfig() after withMarketCapRange(). ' +\n          'Use withMarketCapRange() for market cap-based configuration, ' +\n          'or poolConfig() + auctionByTicks() for manual tick configuration.',\n      );\n    }\n\n    // Validate tick spacing against Doppler contract constraint\n    if (params.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.tickSpacing}. ` +\n          `Use a smaller tickSpacing, or use withMarketCapRange() which handles this automatically.`,\n      );\n    }\n\n    this.pool = { fee: params.fee, tickSpacing: params.tickSpacing };\n    return this;\n  }\n\n  // Provide ticks directly\n  auctionByTicks(params: {\n    startTick: number;\n    endTick: number;\n    minProceeds: bigint;\n    maxProceeds: bigint;\n    duration?: number;\n    epochLength?: number;\n    gamma?: number;\n    numPdSlugs?: number;\n  }): this {\n    const duration = params.duration ?? DEFAULT_AUCTION_DURATION;\n    const epochLength = params.epochLength ?? DEFAULT_EPOCH_LENGTH;\n    const gamma =\n      params.gamma ??\n      (this.pool\n        ? computeOptimalGamma(\n            params.startTick,\n            params.endTick,\n            duration,\n            epochLength,\n            this.pool.tickSpacing,\n          )\n        : undefined);\n    this.auction = {\n      duration,\n      epochLength,\n      startTick: params.startTick,\n      endTick: params.endTick,\n      gamma,\n      minProceeds: params.minProceeds,\n      maxProceeds: params.maxProceeds,\n      numPdSlugs: params.numPdSlugs,\n    };\n    return this;\n  }\n\n  /**\n   * @deprecated Use withMarketCapRange() instead for more intuitive market cap configuration\n   */\n  auctionByPriceRange(params: {\n    priceRange: PriceRange;\n    minProceeds: bigint;\n    maxProceeds: bigint;\n    duration?: number;\n    epochLength?: number;\n    gamma?: number;\n    tickSpacing?: number; // optional; will use pool.tickSpacing if not provided\n    numPdSlugs?: number;\n  }): this {\n    const tickSpacing = params.tickSpacing ?? this.pool?.tickSpacing;\n    if (!tickSpacing) {\n      throw new Error(\n        'tickSpacing is required (set poolConfig first or pass tickSpacing)',\n      );\n    }\n    const ticks = computeTicks(params.priceRange, tickSpacing);\n    return this.auctionByTicks({\n      startTick: ticks.startTick,\n      endTick: ticks.endTick,\n      minProceeds: params.minProceeds,\n      maxProceeds: params.maxProceeds,\n      duration: params.duration,\n      epochLength: params.epochLength,\n      gamma: params.gamma,\n      numPdSlugs: params.numPdSlugs,\n    });\n  }\n\n  /**\n   * Configure auction using target market cap range.\n   * Converts market cap values (in USD) to Uniswap ticks.\n   *\n   * V4 pools support custom fees (0-100,000). Standard fee tiers auto-derive\n   * tickSpacing; custom fees require explicit tickSpacing (max: 30).\n   *\n   * @param params - Market cap configuration with auction parameters\n   * @returns Builder instance for chaining\n   *\n   * @example Standard fee tier (auto tickSpacing)\n   * ```ts\n   * builder\n   *   .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n   *   .withMarketCapRange({\n   *     marketCap: { start: 500_000, min: 50_000 },\n   *     numerairePrice: 3000,\n   *     minProceeds: parseEther('10'),\n   *     maxProceeds: parseEther('1000'),\n   *     fee: 10000, // Standard tier, tickSpacing auto = 30\n   *   })\n   * ```\n   *\n   * @example Custom fee (requires explicit tickSpacing)\n   * ```ts\n   * builder\n   *   .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n   *   .withMarketCapRange({\n   *     marketCap: { start: 500_000, min: 50_000 },\n   *     numerairePrice: 3000,\n   *     minProceeds: parseEther('10'),\n   *     maxProceeds: parseEther('1000'),\n   *     fee: 2500,      // Custom 0.25% fee\n   *     tickSpacing: 10, // Required for custom fees\n   *   })\n   * ```\n   */\n  withMarketCapRange(params: DynamicAuctionMarketCapConfig): this {\n    // Mutual exclusion: cannot use withMarketCapRange() after poolConfig()\n    if (this.pool) {\n      throw new Error(\n        'Cannot use withMarketCapRange() after poolConfig(). ' +\n          'Use withMarketCapRange() for market cap-based configuration, ' +\n          'or poolConfig() + auctionByTicks() for manual tick configuration.',\n      );\n    }\n\n    // Basic validation that doesn't require saleConfig\n    if (params.numerairePrice <= 0) {\n      throw new Error('numerairePrice must be greater than 0');\n    }\n    if (params.marketCap.start <= 0 || params.marketCap.min <= 0) {\n      throw new Error('marketCap values must be greater than 0');\n    }\n    if (params.marketCap.min >= params.marketCap.start) {\n      throw new Error('marketCap.min must be less than marketCap.start');\n    }\n\n    // Validate fee if provided\n    if (params.fee !== undefined && params.fee > V4_MAX_FEE) {\n      throw new Error(\n        `Fee ${params.fee} exceeds maximum allowed for V4 pools (${V4_MAX_FEE} = 10%). ` +\n          `Use a fee between 0 and ${V4_MAX_FEE}.`,\n      );\n    }\n\n    // Validate tickSpacing if provided\n    if (\n      params.tickSpacing !== undefined &&\n      params.tickSpacing > DOPPLER_MAX_TICK_SPACING\n    ) {\n      throw new Error(\n        `tickSpacing ${params.tickSpacing} exceeds maximum allowed for Doppler pools (${DOPPLER_MAX_TICK_SPACING}). ` +\n          `Use tickSpacing <= ${DOPPLER_MAX_TICK_SPACING}.`,\n      );\n    }\n\n    // Store config for deferred conversion in build()\n    this.marketCapConfig = {\n      marketCap: params.marketCap,\n      numerairePrice: params.numerairePrice,\n      tokenSupply: params.tokenSupply,\n      tokenDecimals: params.tokenDecimals,\n      numeraireDecimals: params.numeraireDecimals,\n      fee: params.fee,\n      tickSpacing: params.tickSpacing,\n      minProceeds: params.minProceeds,\n      maxProceeds: params.maxProceeds,\n      duration: params.duration,\n      epochLength: params.epochLength,\n      gamma: params.gamma,\n      numPdSlugs: params.numPdSlugs,\n    };\n\n    return this;\n  }\n\n  withVesting(params?: BuilderVestingInput): this {\n    if (!params) {\n      this.vesting = undefined;\n      return this;\n    }\n    if (params.allocations) {\n      this.vesting = {\n        allocations: params.allocations.map((allocation, index) => ({\n          recipient: allocation.recipient,\n          amount: allocation.amount,\n          schedule: normalizeBuilderVestingSchedule(\n            allocation.schedule,\n            `Vesting allocations[${index}].schedule`,\n          ),\n        })),\n      };\n      return this;\n    }\n\n    this.vesting = {\n      duration: Number(params.duration ?? 0n),\n      cliffDuration: params.cliffDuration ?? 0,\n      recipients: params.recipients,\n      amounts: params.amounts,\n    };\n    return this;\n  }\n\n  withGovernance(params: GovernanceOption<C>): this {\n    this.governance = params;\n    return this;\n  }\n\n  withMigration(migration: MigrationConfig): this {\n    this.migration = migration;\n    return this;\n  }\n\n  withUserAddress(address: Address): this {\n    this.userAddress = address;\n    return this;\n  }\n\n  withIntegrator(address?: Address): this {\n    this.integrator = address ?? ZERO_ADDRESS;\n    return this;\n  }\n\n  withGasLimit(gas?: bigint): this {\n    this.gasLimit = gas;\n    return this;\n  }\n\n  withTime(params?: {\n    startTimeOffset?: number;\n    blockTimestamp?: number;\n  }): this {\n    if (!params) {\n      this.startTimeOffset = undefined;\n      this.blockTimestamp = undefined;\n      return this;\n    }\n    this.startTimeOffset = params.startTimeOffset;\n    this.blockTimestamp = params.blockTimestamp;\n    return this;\n  }\n\n  // Address override helpers\n  private overrideModule<K extends keyof ModuleAddressOverrides>(\n    key: K,\n    address: NonNullable<ModuleAddressOverrides[K]>,\n  ): this {\n    this.moduleAddresses = {\n      ...this.moduleAddresses,\n      [key]: address,\n    } as ModuleAddressOverrides;\n    return this;\n  }\n\n  withTokenFactory(address: Address): this {\n    return this.overrideModule('tokenFactory', address);\n  }\n\n  withAirlock(address: Address): this {\n    return this.overrideModule('airlock', address);\n  }\n\n  withV4Initializer(address: Address): this {\n    return this.overrideModule('v4Initializer', address);\n  }\n\n  withPoolManager(address: Address): this {\n    return this.overrideModule('poolManager', address);\n  }\n\n  withDopplerDeployer(address: Address): this {\n    return this.overrideModule('dopplerDeployer', address);\n  }\n\n  withGovernanceFactory(address: Address): this {\n    return this.overrideModule('governanceFactory', address);\n  }\n\n  withV2Migrator(address: Address): this {\n    return this.overrideModule('v2Migrator', address);\n  }\n\n  withV2MigratorSplit(address: Address): this {\n    return this.overrideModule('v2MigratorSplit', address);\n  }\n\n  withV4Migrator(address: Address): this {\n    return this.overrideModule('v4Migrator', address);\n  }\n\n  withV4MigratorSplit(address: Address): this {\n    return this.overrideModule('v4MigratorSplit', address);\n  }\n\n  withDopplerHookMigrator(address: Address): this {\n    return this.overrideModule('dopplerHookMigrator', address);\n  }\n\n  withRehypeDopplerHookMigrator(address: Address): this {\n    return this.overrideModule('rehypeDopplerHookMigrator', address);\n  }\n\n  withNoOpMigrator(address: Address): this {\n    return this.overrideModule('noOpMigrator', address);\n  }\n\n  build(): CreateDynamicAuctionParams<C> {\n    if (!this.token) throw new Error('tokenConfig is required');\n    if (!this.sale) throw new Error('saleConfig is required');\n    if (!this.migration) throw new Error('migration configuration is required');\n    if (!this.userAddress) throw new Error('userAddress is required');\n\n    // Convert deferred market cap config to pool and auction if set\n    if (this.marketCapConfig && !this.pool) {\n      const config = this.marketCapConfig;\n\n      // Get token supply from config or saleConfig\n      const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n      if (!tokenSupply) {\n        throw new Error(\n          'tokenSupply must be provided (either via saleConfig() or withMarketCapRange() params)',\n        );\n      }\n\n      // Derive fee and tickSpacing\n      const fee = config.fee ?? FEE_TIERS.HIGH;\n      const tickSpacing = config.tickSpacing ?? DOPPLER_MAX_TICK_SPACING;\n\n      // Set pool config\n      this.pool = { fee, tickSpacing };\n\n      // Validate market cap parameters\n      const startValidation = validateMarketCapParameters(\n        config.marketCap.start,\n        tokenSupply,\n        config.tokenDecimals,\n      );\n      const minValidation = validateMarketCapParameters(\n        config.marketCap.min,\n        tokenSupply,\n        config.tokenDecimals,\n      );\n\n      const allWarnings = [\n        ...startValidation.warnings,\n        ...minValidation.warnings,\n      ];\n      if (allWarnings.length > 0) {\n        console.warn('Market cap validation warnings:');\n        allWarnings.forEach((w) => console.warn(`  - ${w}`));\n      }\n\n      // Convert market cap range to ticks for V4 Dynamic auction\n      const { startTick, endTick } = marketCapToTicksForDynamicAuction({\n        marketCapRange: {\n          start: config.marketCap.min,\n          end: config.marketCap.start,\n        },\n        tokenSupply,\n        numerairePriceUSD: config.numerairePrice,\n        numeraire: this.sale.numeraire,\n        tickSpacing,\n        tokenDecimals: config.tokenDecimals ?? 18,\n        numeraireDecimals: config.numeraireDecimals ?? 18,\n      });\n\n      // Set auction config\n      const duration = config.duration ?? DEFAULT_AUCTION_DURATION;\n      const epochLength = config.epochLength ?? DEFAULT_EPOCH_LENGTH;\n      const gamma =\n        config.gamma ??\n        computeOptimalGamma(\n          startTick,\n          endTick,\n          duration,\n          epochLength,\n          tickSpacing,\n        );\n\n      this.auction = {\n        duration,\n        epochLength,\n        startTick,\n        endTick,\n        gamma,\n        minProceeds: config.minProceeds,\n        maxProceeds: config.maxProceeds,\n        numPdSlugs: config.numPdSlugs,\n      };\n    }\n\n    if (!this.pool) throw new Error('poolConfig is required');\n    if (!this.auction) throw new Error('auction configuration is required');\n\n    // Validate noOp migration is not supported for dynamic auctions\n    if (this.migration.type === 'noOp') {\n      throw new Error(\n        'noOp migration is not supported for dynamic auctions. ' +\n          'Use uniswapV2, uniswapV4, or dopplerHookMigrator migration instead.',\n      );\n    }\n\n    // Default governance: noOp on supported chains, default on others (e.g., Ink)\n    const governance =\n      this.governance ??\n      (isNoOpEnabledChain(this.chainId)\n        ? { type: 'noOp' as const }\n        : { type: 'default' as const });\n\n    if (\n      governance.type === 'launchpad' &&\n      !isLaunchpadEnabledChain(this.chainId)\n    ) {\n      throw new Error(\n        `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n      );\n    }\n\n    // Ensure gamma is set and valid\n    let { gamma } = this.auction;\n    if (gamma === undefined) {\n      gamma = computeOptimalGamma(\n        this.auction.startTick,\n        this.auction.endTick,\n        this.auction.duration,\n        this.auction.epochLength,\n        this.pool.tickSpacing,\n      );\n    }\n\n    const auction = { ...this.auction, gamma };\n\n    return {\n      token: this.token,\n      sale: this.sale,\n      auction,\n      pool: this.pool,\n      vesting: this.vesting,\n      governance: governance as GovernanceOption<C>,\n      migration: this.migration,\n      integrator: this.integrator ?? ZERO_ADDRESS,\n      userAddress: this.userAddress,\n      startTimeOffset: this.startTimeOffset,\n      blockTimestamp: this.blockTimestamp,\n      modules: this.moduleAddresses,\n      gas: this.gasLimit,\n    };\n  }\n}\n","import type { Address, Hex } from 'viem';\nimport {\n  DEFAULT_V3_YEARLY_MINT_RATE,\n  DECAY_MAX_START_FEE,\n  FEE_TIERS,\n  TICK_SPACINGS,\n  V4_MAX_FEE,\n  WAD,\n  ZERO_ADDRESS,\n} from '../constants';\n\nimport {\n  marketCapToTicksForMulticurve,\n  marketCapToTickForMulticurve,\n  validateMarketCapParameters,\n  getMaxLiquiditySafeMulticurveTickUpper,\n  normalizeRehypeDopplerHookInitializerConfig,\n} from '../utils';\nimport {\n  isNoOpEnabledChain,\n  isLaunchpadEnabledChain,\n  type CreateMulticurveParams,\n  type GovernanceOption,\n  type MigrationConfig,\n  type VestingConfig,\n  type TokenConfig,\n  type MulticurveMarketCapCurvesConfig,\n  type MulticurveMarketCapPreset,\n  type ModuleAddressOverrides,\n  type RehypeDopplerHookConfig,\n  type RehypeDopplerHookInitializerConfig,\n  type MulticurveInitializerConfig,\n  type MulticurveDevBuyConfig,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport {\n  type BaseAuctionBuilder,\n  type BuilderVestingInput,\n  type BuilderDevBuyInput,\n  type MarketCapPresetOverrides,\n  buildCurvesFromPresets,\n  normalizeBuilderTokenConfig,\n  normalizeBuilderVestingSchedule,\n  normalizeBuilderDevBuy,\n} from './shared';\n\nexport class MulticurveBuilder<\n  C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n  private token?: TokenConfig;\n  private sale?: CreateMulticurveParams<C>['sale'];\n  private pool?: CreateMulticurveParams<C>['pool'];\n  private initializer?: CreateMulticurveParams<C>['initializer'];\n  private schedule?: CreateMulticurveParams<C>['schedule'];\n  private dopplerHook?: RehypeDopplerHookInitializerConfig;\n  private vesting?: VestingConfig;\n  private devBuy?: MulticurveDevBuyConfig;\n  private governance?: GovernanceOption<C>;\n  private migration?: MigrationConfig;\n  private integrator?: Address;\n  private userAddress?: Address;\n  private salt?: Hex;\n  private moduleAddresses?: ModuleAddressOverrides;\n  private gasLimit?: bigint;\n  private feeDistributionControllerAddress?: Address;\n  // Stored from withCurves() for graduationMarketCap conversion in build()\n  private numerairePrice?: number;\n  private tokenDecimals?: number;\n  private numeraireDecimals?: number;\n  // Deferred curves config - converted to pool in build()\n  private curvesConfig?: {\n    numerairePrice: number;\n    curves: Array<{\n      marketCap: { start: number; end: number | 'max' };\n      numPositions: number;\n      shares: bigint;\n    }>;\n    tokenSupply?: bigint;\n    tokenDecimals?: number;\n    numeraireDecimals?: number;\n    fee?: number;\n    tickSpacing?: number;\n    beneficiaries?: { beneficiary: Address; shares: bigint }[];\n  };\n  public chainId: C;\n\n  constructor(chainId: C) {\n    this.chainId = chainId;\n  }\n\n  static forChain<C extends SupportedChainId>(\n    chainId: C,\n  ): MulticurveBuilder<C> {\n    return new MulticurveBuilder(chainId);\n  }\n\n  tokenConfig(params: TokenConfig): this {\n    this.token = normalizeBuilderTokenConfig(\n      params,\n      DEFAULT_V3_YEARLY_MINT_RATE,\n    );\n    return this;\n  }\n\n  saleConfig(params: {\n    initialSupply: bigint;\n    numTokensToSell: bigint;\n    numeraire: Address;\n  }): this {\n    this.sale = {\n      initialSupply: params.initialSupply,\n      numTokensToSell: params.numTokensToSell,\n      numeraire: params.numeraire,\n    };\n    return this;\n  }\n\n  poolConfig(params: {\n    fee: number;\n    tickSpacing: number;\n    curves: {\n      tickLower: number;\n      tickUpper: number;\n      numPositions: number;\n      shares: bigint;\n    }[];\n    beneficiaries?: { beneficiary: Address; shares: bigint }[];\n  }): this {\n    // Mutual exclusion: cannot use poolConfig() after withCurves()\n    if (this.curvesConfig) {\n      throw new Error(\n        'Cannot use poolConfig() after withCurves(). ' +\n          'Use withCurves() for market cap-based configuration, ' +\n          'or poolConfig() for manual tick configuration.',\n      );\n    }\n\n    const sortedBeneficiaries = params.beneficiaries\n      ? [...params.beneficiaries].sort((a, b) => {\n          const aAddr = a.beneficiary.toLowerCase();\n          const bAddr = b.beneficiary.toLowerCase();\n          return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n        })\n      : undefined;\n\n    this.pool = {\n      fee: params.fee,\n      tickSpacing: params.tickSpacing,\n      curves: params.curves,\n      beneficiaries: sortedBeneficiaries,\n    };\n    return this;\n  }\n\n  withMarketCapPresets(params?: {\n    fee?: number;\n    tickSpacing?: number;\n    presets?: MulticurveMarketCapPreset[];\n    overrides?: MarketCapPresetOverrides;\n    beneficiaries?: { beneficiary: Address; shares: bigint }[];\n  }): this {\n    // Mutual exclusion: cannot use withMarketCapPresets() after withCurves()\n    if (this.curvesConfig) {\n      throw new Error(\n        'Cannot use withMarketCapPresets() after withCurves(). ' +\n          'Use withCurves() for market cap-based configuration, ' +\n          'or withMarketCapPresets() for preset-based configuration.',\n      );\n    }\n\n    const { fee, tickSpacing, curves } = buildCurvesFromPresets({\n      fee: params?.fee,\n      tickSpacing: params?.tickSpacing,\n      presets: params?.presets,\n      overrides: params?.overrides,\n    });\n\n    return this.poolConfig({\n      fee,\n      tickSpacing,\n      curves,\n      beneficiaries: params?.beneficiaries,\n    });\n  }\n\n  /**\n   * Configure multicurve using market cap ranges (no tick math required).\n   *\n   * This is the recommended way to configure multicurve pools. Simply specify\n   * market cap ranges in USD for each curve.\n   *\n   * Curves can be provided in any order - they will be automatically sorted\n   * by market cap (ascending) before validation and processing. Curves must\n   * be contiguous or overlapping (no gaps allowed).\n   *\n   * V4 pools support custom fees (0-100,000). Standard fee tiers auto-derive\n   * tickSpacing; custom fees require explicit tickSpacing parameter.\n   *\n   * @param params - Market cap configuration with curves defined by market cap ranges\n   * @returns Builder instance for chaining\n   *\n   * @example Standard fee tier\n   * ```ts\n   * builder\n   *   .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n   *   .withCurves({\n   *     numerairePrice: 3000,\n   *     curves: [...],\n   *     fee: 500, // Standard tier, tickSpacing auto-derived\n   *   })\n   * ```\n   *\n   * @example Custom fee\n   * ```ts\n   * builder\n   *   .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n   *   .withCurves({\n   *     numerairePrice: 3000,\n   *     curves: [...],\n   *     fee: 2500,      // Custom 0.25% fee\n   *     tickSpacing: 10, // Required for custom fees\n   *   })\n   * ```\n   */\n  withCurves(params: MulticurveMarketCapCurvesConfig): this {\n    // Mutual exclusion: cannot use withCurves() after poolConfig()/withMarketCapPresets()\n    if (this.pool) {\n      throw new Error(\n        'Cannot use withCurves() after poolConfig()/withMarketCapPresets(). ' +\n          'Use withCurves() for market cap-based configuration, ' +\n          'or poolConfig() for manual tick configuration.',\n      );\n    }\n\n    // Validate numerairePrice\n    if (params.numerairePrice <= 0) {\n      throw new Error('numerairePrice must be greater than 0');\n    }\n\n    // Validate curves array\n    if (!params.curves || params.curves.length === 0) {\n      throw new Error('curves array must contain at least one curve');\n    }\n\n    // Validate each curve (basic validation that doesn't require saleConfig)\n    for (let i = 0; i < params.curves.length; i++) {\n      const curve = params.curves[i];\n      this.validateCurveRange(\n        curve.marketCap.start,\n        curve.marketCap.end,\n        curve.numPositions,\n        curve.shares,\n        `curves[${i}]`,\n      );\n    }\n\n    // Sort curves by market cap (start, then end) for deterministic ordering\n    const sortedCurves = this.sortCurvesByMarketCap(params.curves);\n\n    // Validate curve contiguity (no gaps allowed, overlaps OK)\n    this.validateCurveContiguity(sortedCurves);\n\n    // Validate total shares sum to exactly WAD\n    const totalShares = sortedCurves.reduce((sum, c) => sum + c.shares, 0n);\n    if (totalShares !== WAD) {\n      throw new Error(\n        `Total curve shares must equal 100% (${WAD}). Got ${totalShares} (${Number((totalShares * 10000n) / WAD) / 100}%)`,\n      );\n    }\n\n    // Validate fee if provided\n    if (params.fee !== undefined && params.fee < 0) {\n      throw new Error(`Curve fee cannot be negative (got ${params.fee})`);\n    }\n    if (params.fee !== undefined && params.fee > V4_MAX_FEE) {\n      throw new Error(\n        `Fee ${params.fee} exceeds maximum allowed for V4 pools (${V4_MAX_FEE} = 10%). ` +\n          `Use a fee between 0 and ${V4_MAX_FEE}.`,\n      );\n    }\n\n    // Store for later use in build() (graduationMarketCap conversion)\n    this.numerairePrice = params.numerairePrice;\n    this.tokenDecimals = params.tokenDecimals;\n    this.numeraireDecimals = params.numeraireDecimals;\n\n    // Store config for deferred conversion in build()\n    this.curvesConfig = {\n      numerairePrice: params.numerairePrice,\n      curves: sortedCurves,\n      tokenSupply: params.tokenSupply,\n      tokenDecimals: params.tokenDecimals,\n      numeraireDecimals: params.numeraireDecimals,\n      fee: params.fee,\n      tickSpacing: params.tickSpacing,\n      beneficiaries: params.beneficiaries,\n    };\n\n    return this;\n  }\n\n  /**\n   * Sort curves by market cap (start, then end) for deterministic ordering\n   */\n  private sortCurvesByMarketCap<\n    T extends { marketCap: { start: number; end: number | 'max' } },\n  >(curves: T[]): T[] {\n    return [...curves].sort((a, b) => {\n      const startDiff = a.marketCap.start - b.marketCap.start;\n      if (startDiff !== 0) return startDiff;\n      const aEnd = a.marketCap.end === 'max' ? Infinity : a.marketCap.end;\n      const bEnd = b.marketCap.end === 'max' ? Infinity : b.marketCap.end;\n      return aEnd - bEnd;\n    });\n  }\n\n  private validateCurveRange(\n    startMarketCap: number,\n    endMarketCap: number | 'max',\n    numPositions: number,\n    shares: bigint,\n    label: string,\n  ): void {\n    if (startMarketCap <= 0) {\n      throw new Error(`${label}: marketCap.start must be greater than 0`);\n    }\n    if (endMarketCap !== 'max' && endMarketCap <= 0) {\n      throw new Error(`${label}: marketCap.end must be greater than 0`);\n    }\n    if (endMarketCap !== 'max' && startMarketCap >= endMarketCap) {\n      throw new Error(\n        `${label}: startMarketCap ($${startMarketCap.toLocaleString()}) must be less than endMarketCap ($${endMarketCap.toLocaleString()})`,\n      );\n    }\n    if (numPositions <= 0) {\n      throw new Error(`${label}: numPositions must be greater than 0`);\n    }\n    if (shares <= 0n) {\n      throw new Error(`${label}: shares must be greater than 0`);\n    }\n  }\n\n  private validateCurveContiguity(\n    sortedCurves: { marketCap: { start: number; end: number | 'max' } }[],\n  ): void {\n    if (sortedCurves.length <= 1) {\n      return;\n    }\n\n    for (let i = 1; i < sortedCurves.length; i++) {\n      const prevCurve = sortedCurves[i - 1];\n      const currCurve = sortedCurves[i];\n      const prevEnd =\n        prevCurve.marketCap.end === 'max' ? Infinity : prevCurve.marketCap.end;\n      const prevEndLabel =\n        prevCurve.marketCap.end === 'max'\n          ? 'max'\n          : `$${prevCurve.marketCap.end.toLocaleString()}`;\n      const currEndLabel =\n        currCurve.marketCap.end === 'max'\n          ? 'max'\n          : `$${currCurve.marketCap.end.toLocaleString()}`;\n\n      if (currCurve.marketCap.start > prevEnd) {\n        throw new Error(\n          `Gap detected between market cap ranges: ` +\n            `$${prevCurve.marketCap.start.toLocaleString()}-${prevEndLabel} ` +\n            `and $${currCurve.marketCap.start.toLocaleString()}-${currEndLabel}. ` +\n            `Curves must be contiguous or overlapping.`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Configure a RehypeDopplerHookInitializer for the pool.\n   *\n   * When configured, the hook will be initialized with the pool and will handle:\n   * - Custom swap fees\n   * - Fee distribution to beneficiaries, LPs, and buyback destinations\n   *\n   * IMPORTANT:\n   * - The hook address must be whitelisted in the DopplerHookInitializer\n   * - Fee distribution percentages must sum to exactly WAD (1e18 = 100%)\n   *\n   * @example\n   * ```typescript\n   * builder.withRehypeDopplerHookInitializer({\n   *   hookAddress: '0x...',\n   *   buybackDestination: '0x...',\n   *   startFee: 3000, // 0.3%\n   *   endFee: 3000,\n   *   durationSeconds: 0,\n   *   feeDistributionInfo: {\n   *     assetFeesToAssetBuybackWad: parseEther('0.2'),\n   *     assetFeesToNumeraireBuybackWad: parseEther('0.2'),\n   *     assetFeesToBeneficiaryWad: parseEther('0.3'),\n   *     assetFeesToLpWad: parseEther('0.3'),\n   *     numeraireFeesToAssetBuybackWad: parseEther('0.2'),\n   *     numeraireFeesToNumeraireBuybackWad: parseEther('0.2'),\n   *     numeraireFeesToBeneficiaryWad: parseEther('0.3'),\n   *     numeraireFeesToLpWad: parseEther('0.3'),\n   *   },\n   * })\n   * ```\n   */\n  withRehypeDopplerHookInitializer(\n    params: RehypeDopplerHookInitializerConfig,\n  ): this {\n    this.assertCanSetInitializer('rehype');\n\n    // Validate mutual exclusivity of graduation threshold options\n    if (\n      params.graduationMarketCap !== undefined &&\n      params.farTick !== undefined\n    ) {\n      throw new Error(\n        'Cannot specify both graduationMarketCap and farTick. Use one or the other.',\n      );\n    }\n\n    if (\n      params.buybackDestination !== undefined &&\n      this.feeDistributionControllerAddress !== undefined\n    ) {\n      throw new Error(\n        'Rehype buybackDestination and withFeeDistributionController are mutually exclusive',\n      );\n    }\n\n    // Validate immediately when the controller is already known. Otherwise,\n    // build() validates after withFeeDistributionController() can be chained.\n    if (\n      params.buybackDestination !== undefined ||\n      this.feeDistributionControllerAddress !== undefined\n    ) {\n      normalizeRehypeDopplerHookInitializerConfig(\n        params,\n        this.feeDistributionControllerAddress,\n      );\n    }\n\n    this.dopplerHook = params;\n    this.initializer = { type: 'rehype', config: params };\n    return this;\n  }\n\n  /** @deprecated Use withRehypeDopplerHookInitializer instead. */\n  withRehypeDopplerHook(params: RehypeDopplerHookConfig): this {\n    return this.withRehypeDopplerHookInitializer(params);\n  }\n\n  withVesting(params?: BuilderVestingInput): this {\n    if (!params) {\n      this.vesting = undefined;\n      return this;\n    }\n    if (params.allocations) {\n      this.vesting = {\n        allocations: params.allocations.map((allocation, index) => ({\n          recipient: allocation.recipient,\n          amount: allocation.amount,\n          schedule: normalizeBuilderVestingSchedule(\n            allocation.schedule,\n            `Vesting allocations[${index}].schedule`,\n          ),\n        })),\n      };\n      return this;\n    }\n\n    this.vesting = {\n      duration: Number(params.duration ?? 0n),\n      cliffDuration: params.cliffDuration ?? 0,\n      recipients: params.recipients,\n      amounts: params.amounts,\n    };\n    return this;\n  }\n\n  /**\n   * Configures an exact-input purchase executed atomically with market creation.\n   *\n   * Omit `vesting` for direct delivery to `recipient`; when present, Bundler\n   * holds the output and releases it under that schedule. This is independent\n   * from `withVesting`, which configures token allocation vesting. Passing\n   * `undefined` clears the dev buy.\n   */\n  withDevBuy(params?: BuilderDevBuyInput): this {\n    this.devBuy = params ? normalizeBuilderDevBuy(params) : undefined;\n    return this;\n  }\n\n  private parseStartTimeSeconds(\n    value: number | bigint | Date,\n    label: string,\n  ): number {\n    let startTimeSeconds: number;\n    if (value instanceof Date) {\n      startTimeSeconds = Math.floor(value.getTime() / 1000);\n    } else if (typeof value === 'bigint') {\n      startTimeSeconds = Number(value);\n    } else {\n      startTimeSeconds = Number(value);\n    }\n\n    if (\n      !Number.isFinite(startTimeSeconds) ||\n      !Number.isInteger(startTimeSeconds)\n    ) {\n      throw new Error(\n        `${label} must be an integer number of seconds since Unix epoch`,\n      );\n    }\n\n    if (startTimeSeconds < 0) {\n      throw new Error(`${label} cannot be negative`);\n    }\n\n    const UINT32_MAX = 0xffffffff;\n    if (startTimeSeconds > UINT32_MAX) {\n      throw new Error(\n        `${label} must fit within uint32 (seconds since Unix epoch up to year 2106)`,\n      );\n    }\n\n    return startTimeSeconds;\n  }\n\n  private assertCanSetInitializer(\n    nextType: MulticurveInitializerConfig['type'],\n  ): void {\n    const currentType = this.initializer?.type;\n    if (\n      currentType === undefined ||\n      currentType === nextType ||\n      (currentType === 'dopplerHookInitializer' && nextType === 'rehype')\n    ) {\n      return;\n    }\n    throw new Error(\n      `Cannot set multicurve initializer to '${nextType}' because it is already configured as '${currentType}'`,\n    );\n  }\n\n  /**\n   * Configure decay multicurve initializer settings.\n   *\n   * The pool's terminal fee is always taken from `poolConfig().fee`.\n   * `startFee` must be greater than or equal to that terminal fee.\n   * `startTime` is optional and defaults to `0` when omitted.\n   */\n  withDecay(params?: {\n    startTime?: number | bigint | Date;\n    startFee: number;\n    durationSeconds: number | bigint;\n  }): this {\n    if (!params) {\n      if (this.initializer?.type === 'decay') {\n        this.initializer = undefined;\n      }\n      return this;\n    }\n\n    this.assertCanSetInitializer('decay');\n\n    const startTime =\n      params.startTime === undefined\n        ? 0\n        : this.parseStartTimeSeconds(params.startTime, 'Decay startTime');\n    const startFee = Number(params.startFee);\n    const durationSeconds = Number(params.durationSeconds);\n\n    if (!Number.isFinite(startFee) || !Number.isInteger(startFee)) {\n      throw new Error('Decay startFee must be an integer');\n    }\n    if (startFee < 0 || startFee > DECAY_MAX_START_FEE) {\n      throw new Error(\n        `Decay startFee must be between 0 and ${DECAY_MAX_START_FEE} (80%)`,\n      );\n    }\n    if (\n      !Number.isFinite(durationSeconds) ||\n      !Number.isInteger(durationSeconds)\n    ) {\n      throw new Error('Decay durationSeconds must be an integer');\n    }\n    if (durationSeconds < 0) {\n      throw new Error('Decay durationSeconds cannot be negative');\n    }\n    const UINT32_MAX = 0xffffffff;\n    if (durationSeconds > UINT32_MAX) {\n      throw new Error('Decay durationSeconds must fit within uint32');\n    }\n\n    this.schedule = undefined;\n    this.initializer = {\n      type: 'decay',\n      startTime,\n      startFee,\n      durationSeconds,\n    };\n    return this;\n  }\n\n  withSchedule(params?: { startTime: number | bigint | Date }): this {\n    if (!params) {\n      if (this.initializer?.type === 'scheduled') {\n        this.initializer = undefined;\n      }\n      this.schedule = undefined;\n      return this;\n    }\n\n    this.assertCanSetInitializer('scheduled');\n    const startTimeSeconds = this.parseStartTimeSeconds(\n      params.startTime,\n      'Schedule startTime',\n    );\n    this.schedule = { startTime: startTimeSeconds };\n    this.initializer = { type: 'scheduled', startTime: startTimeSeconds };\n    return this;\n  }\n\n  withGovernance(params: GovernanceOption<C>): this {\n    this.governance = params;\n    return this;\n  }\n\n  /**\n   * Configure the address authorized to update a Rehype pool's fee\n   * distribution matrix.\n   *\n   * This sets the on-chain `buybackDst`, which also receives direct-buyback\n   * proceeds and legacy empty-beneficiary fees. Every Rehype initializer\n   * requires either this method or `buybackDestination`; they configure the\n   * same field and cannot be used together.\n   */\n  withFeeDistributionController(address: Address): this {\n    if (this.dopplerHook?.buybackDestination !== undefined) {\n      throw new Error(\n        'Rehype buybackDestination and withFeeDistributionController are mutually exclusive',\n      );\n    }\n    this.feeDistributionControllerAddress = address;\n    return this;\n  }\n\n  withMigration(migration: MigrationConfig): this {\n    this.migration = migration;\n    return this;\n  }\n\n  withUserAddress(address: Address): this {\n    this.userAddress = address;\n    return this;\n  }\n\n  withIntegrator(address?: Address): this {\n    this.integrator = address ?? ZERO_ADDRESS;\n    return this;\n  }\n\n  withSalt(salt?: Hex): this {\n    this.salt = salt;\n    return this;\n  }\n\n  withGasLimit(gas?: bigint): this {\n    this.gasLimit = gas;\n    return this;\n  }\n\n  private overrideModule<K extends keyof ModuleAddressOverrides>(\n    key: K,\n    address: NonNullable<ModuleAddressOverrides[K]>,\n  ): this {\n    this.moduleAddresses = {\n      ...this.moduleAddresses,\n      [key]: address,\n    } as ModuleAddressOverrides;\n    return this;\n  }\n\n  withTokenFactory(address: Address): this {\n    return this.overrideModule('tokenFactory', address);\n  }\n  withAirlock(address: Address): this {\n    return this.overrideModule('airlock', address);\n  }\n  withBundler(address: Address): this {\n    return this.overrideModule('bundler', address);\n  }\n  withV4MulticurveInitializer(address: Address): this {\n    this.assertCanSetInitializer('standard');\n    this.initializer = { type: 'standard' };\n    return this.overrideModule('v4MulticurveInitializer', address);\n  }\n  withV4ScheduledMulticurveInitializer(address: Address): this {\n    return this.overrideModule('v4ScheduledMulticurveInitializer', address);\n  }\n  withV4DecayMulticurveInitializer(address: Address): this {\n    return this.overrideModule('v4DecayMulticurveInitializer', address);\n  }\n  withGovernanceFactory(address: Address): this {\n    return this.overrideModule('governanceFactory', address);\n  }\n  withV2Migrator(address: Address): this {\n    return this.overrideModule('v2Migrator', address);\n  }\n\n  withV2MigratorSplit(address: Address): this {\n    return this.overrideModule('v2MigratorSplit', address);\n  }\n\n  withV4Migrator(address: Address): this {\n    return this.overrideModule('v4Migrator', address);\n  }\n  withV4MigratorSplit(address: Address): this {\n    return this.overrideModule('v4MigratorSplit', address);\n  }\n  withNoOpMigrator(address: Address): this {\n    return this.overrideModule('noOpMigrator', address);\n  }\n  withDopplerHookInitializer(address: Address): this {\n    if (this.initializer?.type !== 'rehype') {\n      this.assertCanSetInitializer('dopplerHookInitializer');\n      this.initializer = { type: 'dopplerHookInitializer' };\n    }\n    return this.overrideModule('dopplerHookInitializer', address);\n  }\n\n  build(): CreateMulticurveParams<C> {\n    if (!this.token) throw new Error('tokenConfig is required');\n    if (!this.sale) throw new Error('saleConfig is required');\n    if (!this.migration) throw new Error('migration configuration is required');\n    if (!this.userAddress) throw new Error('userAddress is required');\n\n    // Convert deferred curves config to pool if set\n    if (this.curvesConfig && !this.pool) {\n      const config = this.curvesConfig;\n\n      // Get token supply from config or saleConfig\n      const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n      if (!tokenSupply) {\n        throw new Error(\n          'tokenSupply must be provided (either via saleConfig() or withCurves() params)',\n        );\n      }\n\n      // Get fee and tick spacing\n      const fee = config.fee ?? FEE_TIERS.MEDIUM;\n      const tickSpacing =\n        config.tickSpacing ?? (TICK_SPACINGS as Record<number, number>)[fee];\n\n      if (tickSpacing === undefined) {\n        throw new Error(\n          `Custom fee ${fee} requires explicit tickSpacing. ` +\n            `Standard fees (100, 500, 3000, 10000) auto-derive tickSpacing.`,\n        );\n      }\n\n      // Validate first curve market caps (the launch price)\n      const firstCurve = config.curves[0];\n      const startValidation = validateMarketCapParameters(\n        firstCurve.marketCap.start,\n        tokenSupply,\n        config.tokenDecimals,\n      );\n      const endValidation =\n        firstCurve.marketCap.end === 'max'\n          ? { valid: true, warnings: [] }\n          : validateMarketCapParameters(\n              firstCurve.marketCap.end,\n              tokenSupply,\n              config.tokenDecimals,\n            );\n      const allWarnings = [\n        ...startValidation.warnings,\n        ...endValidation.warnings,\n      ];\n      if (allWarnings.length > 0) {\n        console.warn('First curve market cap validation warnings:');\n        allWarnings.forEach((w) => console.warn(`  - ${w}`));\n      }\n\n      // Convert all curves to ticks\n      const curves: {\n        tickLower: number;\n        tickUpper: number;\n        numPositions: number;\n        shares: bigint;\n      }[] = [];\n\n      for (const curve of config.curves) {\n        const curveTicks = marketCapToTicksForMulticurve({\n          marketCapLower: curve.marketCap.start,\n          marketCapUpper: curve.marketCap.end,\n          tokenSupply,\n          numerairePriceUSD: config.numerairePrice,\n          tickSpacing,\n          tokenDecimals: config.tokenDecimals ?? 18,\n          numeraireDecimals: config.numeraireDecimals ?? 18,\n        });\n        const curveSupply = (this.sale.numTokensToSell * curve.shares) / WAD;\n        const tickUpper =\n          curve.marketCap.end === 'max'\n            ? getMaxLiquiditySafeMulticurveTickUpper({\n                ...curveTicks,\n                tickSpacing,\n                numPositions: curve.numPositions,\n                curveSupply,\n              })\n            : curveTicks.tickUpper;\n\n        curves.push({\n          tickLower: curveTicks.tickLower,\n          tickUpper,\n          numPositions: curve.numPositions,\n          shares: curve.shares,\n        });\n      }\n\n      // Sort beneficiaries by address if provided\n      const sortedBeneficiaries = config.beneficiaries\n        ? [...config.beneficiaries].sort((a, b) => {\n            const aAddr = a.beneficiary.toLowerCase();\n            const bAddr = b.beneficiary.toLowerCase();\n            return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n          })\n        : undefined;\n\n      // Set pool config\n      this.pool = {\n        fee,\n        tickSpacing,\n        curves,\n        beneficiaries: sortedBeneficiaries,\n      };\n    }\n\n    if (!this.pool) throw new Error('poolConfig is required');\n\n    // Validate noOp migration requires beneficiaries\n    // NoOpMigrator is designed for locked pools with beneficiaries. Without beneficiaries,\n    // the pool status is \"Initialized\" (not \"Locked\"), meaning exitLiquidity() can be called.\n    // But NoOpMigrator.migrate() always reverts, so the entire graduation transaction fails\n    // and liquidity becomes trapped.\n    if (this.migration.type === 'noOp') {\n      const hasBeneficiaries =\n        this.pool.beneficiaries && this.pool.beneficiaries.length > 0;\n      if (!hasBeneficiaries) {\n        throw new Error(\n          'noOp migration requires beneficiaries. Without beneficiaries, the pool would be stuck after reaching ' +\n            'graduation - exitLiquidity() succeeds but NoOpMigrator.migrate() always reverts, causing the entire ' +\n            'transaction to fail. Either add beneficiaries or use a different migration type (uniswapV2, uniswapV4).',\n        );\n      }\n    }\n\n    if (\n      this.feeDistributionControllerAddress !== undefined &&\n      this.dopplerHook === undefined\n    ) {\n      throw new Error(\n        'withFeeDistributionController requires a Rehype initializer configuration',\n      );\n    }\n\n    // Default governance: noOp on supported chains, default on others (e.g., Ink)\n    const governance =\n      this.governance ??\n      (isNoOpEnabledChain(this.chainId)\n        ? { type: 'noOp' as const }\n        : { type: 'default' as const });\n\n    if (\n      governance.type === 'launchpad' &&\n      !isLaunchpadEnabledChain(this.chainId)\n    ) {\n      throw new Error(\n        `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n      );\n    }\n\n    // Resolve the on-chain buybackDst only after governance is known.\n    let dopplerHook = this.dopplerHook;\n    if (dopplerHook) {\n      dopplerHook = normalizeRehypeDopplerHookInitializerConfig(\n        dopplerHook,\n        this.feeDistributionControllerAddress,\n      );\n    }\n\n    // Convert graduationMarketCap to farTick if using rehype\n    if (dopplerHook?.graduationMarketCap !== undefined) {\n      // Use numerairePrice from: 1) explicit in dopplerHook, 2) stored from withCurves()\n      const numerairePrice = dopplerHook.numerairePrice ?? this.numerairePrice;\n\n      if (!numerairePrice) {\n        throw new Error(\n          'graduationMarketCap requires numerairePrice. ' +\n            'Either use withCurves() (which provides numerairePrice), ' +\n            'or pass numerairePrice explicitly in withRehypeDopplerHookInitializer().',\n        );\n      }\n\n      if (dopplerHook.graduationMarketCap <= 0) {\n        throw new Error('graduationMarketCap must be greater than 0');\n      }\n\n      const farTick = marketCapToTickForMulticurve({\n        marketCapUSD: dopplerHook.graduationMarketCap,\n        tokenSupply: this.sale.initialSupply,\n        numerairePriceUSD: numerairePrice,\n        tickSpacing: this.pool.tickSpacing,\n        tokenDecimals: this.tokenDecimals ?? 18,\n        numeraireDecimals: this.numeraireDecimals ?? 18,\n      });\n\n      // Validate farTick is within curve boundaries\n      const allTickUppers = this.pool.curves.map((c) => c.tickUpper);\n      const allTickLowers = this.pool.curves.map((c) => c.tickLower);\n      const maxTickUpper = Math.max(...allTickUppers);\n      const minTickLower = Math.min(...allTickLowers);\n\n      if (farTick < minTickLower) {\n        throw new Error(\n          `graduationMarketCap converts to tick ${farTick}, which is below the lowest curve tick (${minTickLower})`,\n        );\n      }\n      if (farTick > maxTickUpper) {\n        throw new Error(\n          `graduationMarketCap converts to tick ${farTick}, which is above the highest curve tick (${maxTickUpper})`,\n        );\n      }\n\n      // Store computed farTick on dopplerHook for encoding\n      dopplerHook = { ...dopplerHook, farTick };\n    }\n\n    const initializer: MulticurveInitializerConfig =\n      this.initializer?.type === 'rehype' && dopplerHook\n        ? { type: 'rehype', config: dopplerHook }\n        : (this.initializer ??\n          (dopplerHook\n            ? { type: 'rehype', config: dopplerHook }\n            : this.schedule\n              ? { type: 'scheduled', startTime: this.schedule.startTime }\n              : { type: 'dopplerHookInitializer' }));\n\n    if (initializer.type === 'scheduled' && dopplerHook) {\n      throw new Error(\n        'Cannot combine scheduled multicurve with rehype initializer. Use exactly one initializer mode.',\n      );\n    }\n    if (initializer.type === 'decay' && dopplerHook) {\n      throw new Error(\n        'Cannot combine decay multicurve with rehype initializer. Use exactly one initializer mode.',\n      );\n    }\n    if (initializer.type === 'decay') {\n      const startFee = Number(initializer.startFee);\n      const terminalFee = Number(this.pool.fee);\n\n      if (startFee < terminalFee) {\n        throw new Error(\n          `Decay startFee (${startFee}) must be greater than or equal to terminal pool fee (${terminalFee})`,\n        );\n      }\n\n      if (startFee > terminalFee && initializer.durationSeconds <= 0) {\n        throw new Error(\n          'Decay durationSeconds must be greater than 0 when startFee is greater than pool.fee',\n        );\n      }\n    }\n\n    if (\n      this.devBuy &&\n      initializer.type !== 'dopplerHookInitializer' &&\n      initializer.type !== 'dopplerHook' &&\n      initializer.type !== 'rehype'\n    ) {\n      throw new Error(\n        `Dev buys require a DopplerHookInitializer or Rehype initializer; '${initializer.type}' is not supported`,\n      );\n    }\n\n    const schedule =\n      initializer.type === 'scheduled'\n        ? { startTime: initializer.startTime }\n        : undefined;\n    dopplerHook =\n      initializer.type === 'rehype' ? initializer.config : undefined;\n\n    return {\n      token: this.token,\n      sale: this.sale,\n      pool: this.pool,\n      initializer,\n      schedule,\n      dopplerHook,\n      vesting: this.vesting,\n      devBuy: this.devBuy\n        ? {\n            ...this.devBuy,\n            vesting: { ...this.devBuy.vesting },\n          }\n        : undefined,\n      governance: governance as GovernanceOption<C>,\n      migration: this.migration,\n      integrator: this.integrator ?? ZERO_ADDRESS,\n      userAddress: this.userAddress,\n      salt: this.salt,\n      modules: this.moduleAddresses,\n      gas: this.gasLimit,\n    };\n  }\n}\n","import type { Address } from 'viem';\nimport {\n  BASIS_POINTS,\n  DEFAULT_AUCTION_DURATION,\n  DEFAULT_EPOCH_LENGTH,\n  DEFAULT_PD_SLUGS,\n  DEFAULT_V4_YEARLY_MINT_RATE,\n  DOPPLER_MAX_TICK_SPACING,\n  FEE_TIERS,\n  INT24_MIN,\n  INT24_MAX,\n  V4_MAX_FEE,\n  ZERO_ADDRESS,\n} from '../constants';\nimport { computeOptimalGamma, isToken0Expected } from '../utils';\nimport {\n  isLaunchpadEnabledChain,\n  isNoOpEnabledChain,\n  type GovernanceOption,\n  type MigrationConfig,\n  type ModuleAddressOverrides,\n  type TokenConfig,\n  type VestingConfig,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport {\n  normalizeBuilderTokenConfig,\n  normalizeBuilderVestingSchedule,\n  type BaseAuctionBuilder,\n  type BuilderVestingInput,\n} from './shared';\n\nexport interface OpeningAuctionConfig {\n  auctionDuration: number;\n  minAcceptableTickToken0: number;\n  minAcceptableTickToken1: number;\n  incentiveShareBps: number;\n  tickSpacing: number;\n  fee: number;\n  minLiquidity: bigint;\n  shareToAuctionBps: number;\n}\n\nexport interface OpeningAuctionDopplerConfig {\n  minProceeds: bigint;\n  maxProceeds: bigint;\n  startTick: number;\n  endTick: number;\n  epochLength?: number;\n  duration?: number;\n  gamma?: number;\n  numPdSlugs?: number;\n  fee?: number;\n  tickSpacing?: number;\n}\n\nexport interface ResolvedOpeningAuctionDopplerConfig {\n  minProceeds: bigint;\n  maxProceeds: bigint;\n  startTick: number;\n  endTick: number;\n  epochLength: number;\n  duration: number;\n  gamma: number;\n  numPdSlugs?: number;\n  fee: number;\n  tickSpacing: number;\n}\n\nexport type OpeningAuctionModuleAddressOverrides = ModuleAddressOverrides & {\n  openingAuctionInitializer?: Address;\n  openingAuctionPositionManager?: Address;\n};\n\nexport interface CreateOpeningAuctionParams<\n  C extends SupportedChainId = SupportedChainId,\n> {\n  token: TokenConfig;\n  sale: {\n    initialSupply: bigint;\n    numTokensToSell: bigint;\n    numeraire: Address;\n  };\n  openingAuction: OpeningAuctionConfig;\n  doppler: ResolvedOpeningAuctionDopplerConfig;\n  vesting?: VestingConfig;\n  governance: GovernanceOption<C>;\n  migration: MigrationConfig;\n  integrator?: Address;\n  userAddress: Address;\n  startTimeOffset?: number;\n  startingTime?: number;\n  blockTimestamp?: number;\n  modules?: OpeningAuctionModuleAddressOverrides;\n  gas?: bigint;\n}\n\nexport class OpeningAuctionBuilder<\n  C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n  private token?: TokenConfig;\n  private sale?: CreateOpeningAuctionParams<C>['sale'];\n  private openingAuction?: OpeningAuctionConfig;\n  private doppler?: OpeningAuctionDopplerConfig;\n  private vesting?: VestingConfig;\n  private governance?: GovernanceOption<C>;\n  private migration?: MigrationConfig;\n  private integrator?: Address;\n  private userAddress?: Address;\n  private startTimeOffset?: number;\n  private startingTime?: number;\n  private blockTimestamp?: number;\n  private moduleAddresses?: OpeningAuctionModuleAddressOverrides;\n  private gasLimit?: bigint;\n  public chainId: C;\n\n  constructor(chainId: C) {\n    this.chainId = chainId;\n  }\n\n  static forChain<C extends SupportedChainId>(\n    chainId: C,\n  ): OpeningAuctionBuilder<C> {\n    return new OpeningAuctionBuilder(chainId);\n  }\n\n  tokenConfig(params: TokenConfig): this {\n    this.token = normalizeBuilderTokenConfig(\n      params,\n      DEFAULT_V4_YEARLY_MINT_RATE,\n    );\n    return this;\n  }\n\n  saleConfig(params: {\n    initialSupply: bigint;\n    numTokensToSell: bigint;\n    numeraire: Address;\n  }): this {\n    this.sale = {\n      initialSupply: params.initialSupply,\n      numTokensToSell: params.numTokensToSell,\n      numeraire: params.numeraire,\n    };\n    return this;\n  }\n\n  openingAuctionConfig(params: OpeningAuctionConfig): this {\n    this.openingAuction = { ...params };\n    return this;\n  }\n\n  dopplerConfig(params: OpeningAuctionDopplerConfig): this {\n    this.doppler = { ...params };\n    return this;\n  }\n\n  withVesting(params?: BuilderVestingInput): this {\n    if (!params) {\n      this.vesting = undefined;\n      return this;\n    }\n    if (params.allocations) {\n      this.vesting = {\n        allocations: params.allocations.map((allocation, index) => ({\n          recipient: allocation.recipient,\n          amount: allocation.amount,\n          schedule: normalizeBuilderVestingSchedule(\n            allocation.schedule,\n            `Vesting allocations[${index}].schedule`,\n          ),\n        })),\n      };\n      return this;\n    }\n\n    this.vesting = {\n      duration: Number(params.duration ?? 0n),\n      cliffDuration: params.cliffDuration ?? 0,\n      recipients: params.recipients,\n      amounts: params.amounts,\n    };\n    return this;\n  }\n\n  withGovernance(params: GovernanceOption<C>): this {\n    this.governance = params;\n    return this;\n  }\n\n  withMigration(migration: MigrationConfig): this {\n    this.migration = migration;\n    return this;\n  }\n\n  withUserAddress(address: Address): this {\n    this.userAddress = address;\n    return this;\n  }\n\n  withIntegrator(address?: Address): this {\n    this.integrator = address ?? ZERO_ADDRESS;\n    return this;\n  }\n\n  withGasLimit(gas?: bigint): this {\n    this.gasLimit = gas;\n    return this;\n  }\n\n  withTime(params?: {\n    startTimeOffset?: number;\n    startingTime?: number | bigint | Date;\n    blockTimestamp?: number;\n  }): this {\n    if (!params) {\n      this.startTimeOffset = undefined;\n      this.startingTime = undefined;\n      this.blockTimestamp = undefined;\n      return this;\n    }\n\n    const hasStartTimeOffset = params.startTimeOffset !== undefined;\n    const hasStartingTime = params.startingTime !== undefined;\n    if (hasStartTimeOffset && hasStartingTime) {\n      throw new Error(\n        'withTime() accepts either startTimeOffset or startingTime, not both',\n      );\n    }\n\n    if (hasStartTimeOffset) {\n      const startTimeOffset = Number(params.startTimeOffset);\n      if (\n        !Number.isFinite(startTimeOffset) ||\n        !Number.isInteger(startTimeOffset) ||\n        startTimeOffset < 0\n      ) {\n        throw new Error('startTimeOffset must be a non-negative integer');\n      }\n      this.startTimeOffset = startTimeOffset;\n      this.startingTime = undefined;\n    } else if (hasStartingTime) {\n      const startingTimeSeconds = this.normalizeTimestamp(params.startingTime!);\n      this.startingTime = startingTimeSeconds;\n      this.startTimeOffset = undefined;\n    } else {\n      this.startTimeOffset = undefined;\n      this.startingTime = undefined;\n    }\n\n    if (params.blockTimestamp !== undefined) {\n      const blockTimestamp = Number(params.blockTimestamp);\n      if (\n        !Number.isFinite(blockTimestamp) ||\n        !Number.isInteger(blockTimestamp) ||\n        blockTimestamp < 0\n      ) {\n        throw new Error('blockTimestamp must be a non-negative integer');\n      }\n      this.blockTimestamp = blockTimestamp;\n    } else {\n      this.blockTimestamp = undefined;\n    }\n\n    return this;\n  }\n\n  private normalizeTimestamp(value: number | bigint | Date): number {\n    let seconds: number;\n    if (value instanceof Date) {\n      seconds = Math.floor(value.getTime() / 1000);\n    } else if (typeof value === 'bigint') {\n      seconds = Number(value);\n    } else {\n      seconds = Number(value);\n    }\n\n    if (!Number.isFinite(seconds) || !Number.isInteger(seconds)) {\n      throw new Error(\n        'startingTime must be an integer number of seconds since Unix epoch',\n      );\n    }\n    if (seconds < 0) {\n      throw new Error('startingTime cannot be negative');\n    }\n\n    const UINT32_MAX = 0xffffffff;\n    if (seconds > UINT32_MAX) {\n      throw new Error(\n        'startingTime must fit within uint32 (seconds since Unix epoch up to year 2106)',\n      );\n    }\n\n    return seconds;\n  }\n\n  private overrideModule<K extends keyof OpeningAuctionModuleAddressOverrides>(\n    key: K,\n    address: NonNullable<OpeningAuctionModuleAddressOverrides[K]>,\n  ): this {\n    this.moduleAddresses = {\n      ...this.moduleAddresses,\n      [key]: address,\n    };\n    return this;\n  }\n\n  withTokenFactory(address: Address): this {\n    return this.overrideModule('tokenFactory', address);\n  }\n\n  withAirlock(address: Address): this {\n    return this.overrideModule('airlock', address);\n  }\n\n  withPoolManager(address: Address): this {\n    return this.overrideModule('poolManager', address);\n  }\n\n  withDopplerDeployer(address: Address): this {\n    return this.overrideModule('dopplerDeployer', address);\n  }\n\n  withGovernanceFactory(address: Address): this {\n    return this.overrideModule('governanceFactory', address);\n  }\n\n  withV2Migrator(address: Address): this {\n    return this.overrideModule('v2Migrator', address);\n  }\n\n  withV2MigratorSplit(address: Address): this {\n    return this.overrideModule('v2MigratorSplit', address);\n  }\n\n  withV4Migrator(address: Address): this {\n    return this.overrideModule('v4Migrator', address);\n  }\n\n  withV4MigratorSplit(address: Address): this {\n    return this.overrideModule('v4MigratorSplit', address);\n  }\n\n  withNoOpMigrator(address: Address): this {\n    return this.overrideModule('noOpMigrator', address);\n  }\n\n  withOpeningAuctionInitializer(address: Address): this {\n    return this.overrideModule('openingAuctionInitializer', address);\n  }\n\n  withOpeningAuctionPositionManager(address: Address): this {\n    return this.overrideModule('openingAuctionPositionManager', address);\n  }\n\n  private validatePositiveInteger(value: number, label: string): void {\n    if (!Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {\n      throw new Error(`${label} must be a positive integer`);\n    }\n  }\n\n  build(): CreateOpeningAuctionParams<C> {\n    if (!this.token) throw new Error('tokenConfig is required');\n    if (!this.sale) throw new Error('saleConfig is required');\n    if (!this.openingAuction)\n      throw new Error('openingAuctionConfig is required');\n    if (!this.doppler) throw new Error('dopplerConfig is required');\n    if (!this.migration) throw new Error('migration configuration is required');\n    if (!this.userAddress) throw new Error('userAddress is required');\n\n    if (!this.token.name || this.token.name.trim().length === 0) {\n      throw new Error('Token name is required');\n    }\n    if (!this.token.symbol || this.token.symbol.trim().length === 0) {\n      throw new Error('Token symbol is required');\n    }\n\n    if (this.sale.initialSupply <= 0n) {\n      throw new Error('Initial supply must be positive');\n    }\n    if (this.sale.numTokensToSell <= 0n) {\n      throw new Error('Number of tokens to sell must be positive');\n    }\n    if (this.sale.numTokensToSell > this.sale.initialSupply) {\n      throw new Error('Cannot sell more tokens than initial supply');\n    }\n\n    this.validatePositiveInteger(\n      this.openingAuction.auctionDuration,\n      'openingAuction.auctionDuration',\n    );\n    this.validatePositiveInteger(\n      this.openingAuction.tickSpacing,\n      'openingAuction.tickSpacing',\n    );\n    if (\n      !Number.isInteger(this.openingAuction.fee) ||\n      this.openingAuction.fee < 0 ||\n      this.openingAuction.fee > V4_MAX_FEE\n    ) {\n      throw new Error(\n        `openingAuction.fee must be an integer between 0 and ${V4_MAX_FEE}`,\n      );\n    }\n    if (\n      !Number.isInteger(this.openingAuction.shareToAuctionBps) ||\n      this.openingAuction.shareToAuctionBps <= 0 ||\n      this.openingAuction.shareToAuctionBps > BASIS_POINTS\n    ) {\n      throw new Error(\n        `openingAuction.shareToAuctionBps must be in (0, ${BASIS_POINTS}]`,\n      );\n    }\n    if (\n      !Number.isInteger(this.openingAuction.incentiveShareBps) ||\n      this.openingAuction.incentiveShareBps < 0 ||\n      this.openingAuction.incentiveShareBps > BASIS_POINTS\n    ) {\n      throw new Error(\n        `openingAuction.incentiveShareBps must be between 0 and ${BASIS_POINTS}`,\n      );\n    }\n    if (this.openingAuction.minLiquidity <= 0n) {\n      throw new Error('openingAuction.minLiquidity must be positive');\n    }\n    if (\n      this.openingAuction.minAcceptableTickToken0 < INT24_MIN ||\n      this.openingAuction.minAcceptableTickToken0 > INT24_MAX\n    ) {\n      throw new Error(\n        `openingAuction.minAcceptableTickToken0 must be within int24 range (${INT24_MIN} to ${INT24_MAX})`,\n      );\n    }\n    if (\n      this.openingAuction.minAcceptableTickToken1 < INT24_MIN ||\n      this.openingAuction.minAcceptableTickToken1 > INT24_MAX\n    ) {\n      throw new Error(\n        `openingAuction.minAcceptableTickToken1 must be within int24 range (${INT24_MIN} to ${INT24_MAX})`,\n      );\n    }\n\n    const duration = this.doppler.duration ?? DEFAULT_AUCTION_DURATION;\n    const epochLength = this.doppler.epochLength ?? DEFAULT_EPOCH_LENGTH;\n    const fee = this.doppler.fee ?? FEE_TIERS.HIGH;\n    const tickSpacing = this.doppler.tickSpacing ?? DOPPLER_MAX_TICK_SPACING;\n\n    this.validatePositiveInteger(duration, 'doppler.duration');\n    this.validatePositiveInteger(epochLength, 'doppler.epochLength');\n    this.validatePositiveInteger(tickSpacing, 'doppler.tickSpacing');\n\n    if (tickSpacing > DOPPLER_MAX_TICK_SPACING) {\n      throw new Error(\n        `doppler.tickSpacing must be <= ${DOPPLER_MAX_TICK_SPACING}. Got ${tickSpacing}.`,\n      );\n    }\n    if (duration % epochLength !== 0) {\n      throw new Error(\n        'doppler.epochLength must divide doppler.duration evenly',\n      );\n    }\n    if (!Number.isInteger(fee) || fee < 0 || fee > V4_MAX_FEE) {\n      throw new Error(\n        `doppler.fee must be an integer between 0 and ${V4_MAX_FEE}`,\n      );\n    }\n\n    if (this.doppler.minProceeds < 0n) {\n      throw new Error('doppler.minProceeds must be non-negative');\n    }\n    if (this.doppler.maxProceeds < this.doppler.minProceeds) {\n      throw new Error(\n        'doppler.maxProceeds must be greater than or equal to doppler.minProceeds',\n      );\n    }\n\n    if (this.openingAuction.tickSpacing % tickSpacing !== 0) {\n      throw new Error(\n        `openingAuction.tickSpacing (${this.openingAuction.tickSpacing}) must be divisible by doppler.tickSpacing (${tickSpacing})`,\n      );\n    }\n\n    const isToken0 = isToken0Expected(this.sale.numeraire);\n    if (isToken0 && this.doppler.startTick < this.doppler.endTick) {\n      throw new Error(\n        'doppler.startTick must be greater than or equal to doppler.endTick when token is expected to be currency0',\n      );\n    }\n    if (!isToken0 && this.doppler.startTick > this.doppler.endTick) {\n      throw new Error(\n        'doppler.startTick must be less than or equal to doppler.endTick when token is expected to be currency1',\n      );\n    }\n\n    let gamma = this.doppler.gamma;\n    if (gamma !== undefined) {\n      this.validatePositiveInteger(gamma, 'doppler.gamma');\n      if (gamma % tickSpacing !== 0) {\n        throw new Error(\n          'doppler.gamma must be divisible by doppler.tickSpacing',\n        );\n      }\n    } else {\n      gamma = computeOptimalGamma(\n        this.doppler.startTick,\n        this.doppler.endTick,\n        duration,\n        epochLength,\n        tickSpacing,\n      );\n    }\n\n    const auctionTokens =\n      (this.sale.numTokensToSell *\n        BigInt(this.openingAuction.shareToAuctionBps)) /\n      BigInt(BASIS_POINTS);\n    if (auctionTokens <= 0n) {\n      throw new Error(\n        'openingAuction.shareToAuctionBps yields zero auction tokens for the configured sale',\n      );\n    }\n\n    // Default governance: noOp on supported chains, default on others (e.g., Ink)\n    const governance =\n      this.governance ??\n      (isNoOpEnabledChain(this.chainId)\n        ? { type: 'noOp' as const }\n        : { type: 'default' as const });\n\n    if (\n      governance.type === 'launchpad' &&\n      !isLaunchpadEnabledChain(this.chainId)\n    ) {\n      throw new Error(\n        `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n      );\n    }\n\n    return {\n      token: this.token,\n      sale: this.sale,\n      openingAuction: this.openingAuction,\n      doppler: {\n        minProceeds: this.doppler.minProceeds,\n        maxProceeds: this.doppler.maxProceeds,\n        startTick: this.doppler.startTick,\n        endTick: this.doppler.endTick,\n        epochLength,\n        duration,\n        gamma,\n        numPdSlugs: this.doppler.numPdSlugs ?? DEFAULT_PD_SLUGS,\n        fee,\n        tickSpacing,\n      },\n      vesting: this.vesting,\n      governance: governance as GovernanceOption<C>,\n      migration: this.migration,\n      integrator: this.integrator ?? ZERO_ADDRESS,\n      userAddress: this.userAddress,\n      startTimeOffset: this.startTimeOffset,\n      startingTime: this.startingTime,\n      blockTimestamp: this.blockTimestamp,\n      modules: this.moduleAddresses,\n      gas: this.gasLimit,\n    };\n  }\n}\n","import type { Address, WalletClient } from 'viem';\nimport type {\n  BeneficiaryData,\n  DopplerSDKConfig,\n  HookInfo,\n  PoolInfo,\n  SupportedPublicClient,\n  V4PoolKey,\n} from './types';\nimport { getAddresses, type SupportedChainId } from './addresses';\nimport { DopplerFactory } from './entities/DopplerFactory';\nimport {\n  StaticAuction,\n  DynamicAuction,\n  MulticurvePool,\n  RehypeDopplerHookInitializer,\n  RehypeDopplerHook,\n  RehypeDopplerHookMigrator,\n  OpeningAuction,\n  OpeningAuctionLifecycle,\n  OpeningAuctionBidManager,\n  OpeningAuctionPositionManager,\n} from './entities/auction';\nimport { Quoter } from './entities/quoter';\nimport {\n  Derc20,\n  Derc20V2,\n  DopplerDN404,\n  DopplerERC20V1,\n} from './entities/token';\nimport { TopUpDistributor } from './entities/TopUpDistributor';\nimport { Bundler } from './entities/Bundler';\nimport {\n  StaticAuctionBuilder,\n  DynamicAuctionBuilder,\n  MulticurveBuilder,\n  OpeningAuctionBuilder,\n} from './builders';\nimport { ZERO_ADDRESS } from './constants';\nimport {\n  DEFAULT_AIRLOCK_BENEFICIARY_SHARES,\n  getAirlockBeneficiary,\n  getAirlockOwner as fetchAirlockOwner,\n} from './utils/airlock';\n\nexport class DopplerSDK<C extends SupportedChainId = SupportedChainId> {\n  private publicClient: SupportedPublicClient;\n  private walletClient?: WalletClient;\n  public chainId: C;\n  private _factory?: DopplerFactory<C>;\n  private _quoter?: Quoter;\n  private _topUpDistributor?: TopUpDistributor;\n  private _bundler?: Bundler;\n\n  constructor(config: DopplerSDKConfig) {\n    this.publicClient = config.publicClient;\n    this.walletClient = config.walletClient;\n    this.chainId = config.chainId as unknown as C;\n  }\n\n  /**\n   * Get the factory instance for creating auctions\n   */\n  get factory(): DopplerFactory<C> {\n    if (!this._factory) {\n      this._factory = new DopplerFactory(\n        this.publicClient,\n        this.walletClient,\n        this.chainId,\n      );\n    }\n    return this._factory;\n  }\n\n  /**\n   * Get the quoter instance for price queries\n   */\n  get quoter(): Quoter {\n    if (!this._quoter) {\n      this._quoter = new Quoter(this.publicClient, this.chainId);\n    }\n    return this._quoter;\n  }\n\n  /**\n   * Get the configured TopUpDistributor instance for split-migrator top-ups.\n   */\n  get topUpDistributor(): TopUpDistributor {\n    if (!this._topUpDistributor) {\n      this._topUpDistributor = this.getTopUpDistributor();\n    }\n    return this._topUpDistributor;\n  }\n\n  /**\n   * Get a TopUpDistributor instance using the chain default or an explicit override.\n   */\n  getTopUpDistributor(topUpDistributorAddress?: Address): TopUpDistributor {\n    const resolvedTopUpDistributor =\n      topUpDistributorAddress ?? getAddresses(this.chainId).topUpDistributor;\n\n    if (\n      !resolvedTopUpDistributor ||\n      resolvedTopUpDistributor === ZERO_ADDRESS\n    ) {\n      throw new Error(\n        'TopUpDistributor address is not configured on this chain. ' +\n          'Pass topUpDistributorAddress to getTopUpDistributor().',\n      );\n    }\n\n    return new TopUpDistributor(\n      this.publicClient,\n      this.walletClient,\n      resolvedTopUpDistributor,\n    );\n  }\n\n  /**\n   * Gets the Bundler client configured for this chain.\n   *\n   * Throws when the chain has no Bundler deployment. Use `getBundler(address)`\n   * for custom deployments.\n   */\n  get bundler(): Bundler {\n    if (!this._bundler) {\n      this._bundler = this.getBundler();\n    }\n    return this._bundler;\n  }\n\n  /**\n   * Creates a Bundler client using the chain default or an explicit address.\n   *\n   * Read methods work without a wallet client; claims require one.\n   *\n   * @param bundlerAddress Optional custom Bundler deployment.\n   */\n  getBundler(bundlerAddress?: Address): Bundler {\n    const resolvedBundler =\n      bundlerAddress ?? getAddresses(this.chainId).bundler;\n    if (!resolvedBundler || resolvedBundler === ZERO_ADDRESS) {\n      throw new Error(\n        'Bundler address is not configured on this chain. Pass bundlerAddress to getBundler().',\n      );\n    }\n    return new Bundler(this.publicClient, this.walletClient, resolvedBundler);\n  }\n\n  /**\n   * Get a StaticAuction instance for interacting with a static auction pool\n   * @param poolAddress The address of the Uniswap V3 pool\n   */\n  async getStaticAuction(poolAddress: Address): Promise<StaticAuction> {\n    return new StaticAuction(this.publicClient, poolAddress);\n  }\n\n  /**\n   * Get a DynamicAuction instance for interacting with a dynamic auction hook\n   * @param hookAddress The address of the Uniswap V4 hook\n   */\n  async getDynamicAuction(hookAddress: Address): Promise<DynamicAuction> {\n    return new DynamicAuction(this.publicClient, hookAddress);\n  }\n\n  /**\n   * Get a RehypeDopplerHookInitializer instance.\n   * @param hookAddress The address of the RehypeDopplerHookInitializer\n   */\n  async getRehypeDopplerHookInitializer(\n    hookAddress: Address,\n  ): Promise<RehypeDopplerHookInitializer> {\n    return new RehypeDopplerHookInitializer(\n      this.publicClient,\n      this.walletClient,\n      hookAddress,\n    );\n  }\n\n  /** @deprecated Use getRehypeDopplerHookInitializer instead. */\n  async getRehypeDopplerHook(hookAddress: Address): Promise<RehypeDopplerHook> {\n    return this.getRehypeDopplerHookInitializer(hookAddress);\n  }\n\n  /**\n   * Get a RehypeDopplerHookMigrator instance for interacting with migrator-side rehype hook state.\n   * @param hookAddress The address of the RehypeDopplerHookMigrator\n   */\n  async getRehypeDopplerHookMigrator(\n    hookAddress: Address,\n  ): Promise<RehypeDopplerHookMigrator> {\n    return new RehypeDopplerHookMigrator(\n      this.publicClient,\n      this.walletClient,\n      hookAddress,\n    );\n  }\n\n  /**\n   * Get an OpeningAuction instance for interacting with an opening auction hook.\n   * @param hookAddress The address of the opening auction hook\n   */\n  async getOpeningAuction(hookAddress: Address): Promise<OpeningAuction> {\n    return new OpeningAuction(\n      this.publicClient,\n      this.walletClient,\n      hookAddress,\n    );\n  }\n\n  /**\n   * Get an OpeningAuctionLifecycle instance for interacting with opening-auction completion flows.\n   * @param initializerAddress Optional OpeningAuctionInitializer override address\n   */\n  async getOpeningAuctionLifecycle(\n    initializerAddress?: Address,\n  ): Promise<OpeningAuctionLifecycle> {\n    const chainAddresses = getAddresses(this.chainId);\n    const resolvedInitializer =\n      initializerAddress ??\n      chainAddresses.openingAuctionInitializer ??\n      ZERO_ADDRESS;\n\n    if (resolvedInitializer === ZERO_ADDRESS) {\n      throw new Error(\n        'OpeningAuctionInitializer address is not configured on this chain. ' +\n          'Pass initializerAddress to getOpeningAuctionLifecycle(), or override it via builder.withOpeningAuctionInitializer().',\n      );\n    }\n\n    return new OpeningAuctionLifecycle(\n      this.publicClient,\n      this.walletClient,\n      resolvedInitializer,\n    );\n  }\n\n  /**\n   * Get an OpeningAuctionPositionManager instance for placing/withdrawing opening-auction bids.\n   * @param positionManagerAddress Optional OpeningAuctionPositionManager override address\n   */\n  async getOpeningAuctionPositionManager(\n    positionManagerAddress?: Address,\n  ): Promise<OpeningAuctionPositionManager> {\n    const chainAddresses = getAddresses(this.chainId);\n    const resolvedPositionManager =\n      positionManagerAddress ??\n      chainAddresses.openingAuctionPositionManager ??\n      ZERO_ADDRESS;\n\n    if (resolvedPositionManager === ZERO_ADDRESS) {\n      throw new Error(\n        'OpeningAuctionPositionManager address is not configured on this chain. ' +\n          'Pass positionManagerAddress to getOpeningAuctionPositionManager(), or resolve it from the initializer via OpeningAuctionLifecycle.getPositionManager().',\n      );\n    }\n\n    return new OpeningAuctionPositionManager(\n      this.publicClient,\n      this.walletClient,\n      resolvedPositionManager,\n    );\n  }\n\n  /**\n   * Get a context-bound OpeningAuctionBidManager for placing/withdrawing bids, status reads, and incentive claims.\n   * @param args.openingAuctionHookAddress Opening auction hook address\n   * @param args.openingAuctionPoolKey Opening auction pool key from OpeningAuctionLifecycle.getState(asset)\n   * @param args.positionManagerAddress Optional OpeningAuctionPositionManager override\n   */\n  async getOpeningAuctionBidManager(args: {\n    openingAuctionHookAddress: Address;\n    openingAuctionPoolKey: V4PoolKey;\n    positionManagerAddress?: Address;\n  }): Promise<OpeningAuctionBidManager> {\n    const positionManager = await this.getOpeningAuctionPositionManager(\n      args.positionManagerAddress,\n    );\n\n    return new OpeningAuctionBidManager(this.publicClient, this.walletClient, {\n      openingAuctionHookAddress: args.openingAuctionHookAddress,\n      openingAuctionPoolKey: args.openingAuctionPoolKey,\n      positionManagerAddress: positionManager.getAddress(),\n    });\n  }\n\n  /**\n   * Get a MulticurvePool instance for interacting with a V4 multicurve pool\n   * @param tokenAddress The address of the token created by the auction (called \"asset\" in contracts; V4 pools don't have addresses, so the token is used as the lookup key)\n   */\n  async getMulticurvePool(tokenAddress: Address): Promise<MulticurvePool> {\n    return new MulticurvePool(\n      this.publicClient,\n      this.walletClient,\n      tokenAddress,\n    );\n  }\n\n  /**\n   * Get a DERC20 token instance for interacting with a token\n   * @param tokenAddress The address of the DERC20 token\n   */\n  getDerc20(tokenAddress: Address): Derc20 {\n    return new Derc20(this.publicClient, this.walletClient, tokenAddress);\n  }\n\n  /**\n   * Get a DERC20 V2 token instance for interacting with cliffed / multi-schedule vesting tokens\n   * @param tokenAddress The address of the DERC20 V2 token\n   */\n  getDerc20V2(tokenAddress: Address): Derc20V2 {\n    return new Derc20V2(this.publicClient, this.walletClient, tokenAddress);\n  }\n\n  /**\n   * Get a DopplerERC20V1 token instance for schedule vesting and balance-limit controls.\n   * @param tokenAddress The address of the DopplerERC20V1 token\n   */\n  getDopplerERC20V1(tokenAddress: Address): DopplerERC20V1 {\n    return new DopplerERC20V1(\n      this.publicClient,\n      this.walletClient,\n      tokenAddress,\n    );\n  }\n\n  /**\n   * Get a Doppler DN404 token instance for hybrid ERC-20/ERC-721 interaction.\n   * @param tokenAddress The address of the Doppler DN404 token\n   */\n  getDopplerDN404(tokenAddress: Address): DopplerDN404 {\n    return new DopplerDN404(this.publicClient, this.walletClient, tokenAddress);\n  }\n\n  /**\n   * Get information about a static auction pool\n   * @param poolAddress The address of the pool\n   */\n  async getPoolInfo(poolAddress: Address): Promise<PoolInfo> {\n    const auction = new StaticAuction(this.publicClient, poolAddress);\n    return auction.getPoolInfo();\n  }\n\n  /**\n   * Get information about a dynamic auction hook\n   * @param hookAddress The address of the hook\n   */\n  async getHookInfo(hookAddress: Address): Promise<HookInfo> {\n    const auction = new DynamicAuction(this.publicClient, hookAddress);\n    return auction.getHookInfo();\n  }\n\n  /**\n   * Create a new static auction builder\n   */\n  buildStaticAuction(): StaticAuctionBuilder<C> {\n    return new StaticAuctionBuilder(this.chainId);\n  }\n\n  /**\n   * Create a new dynamic auction builder\n   */\n  buildDynamicAuction(): DynamicAuctionBuilder<C> {\n    return new DynamicAuctionBuilder(this.chainId);\n  }\n\n  /**\n   * Create a new multicurve (V4 initializer) auction builder\n   */\n  buildMulticurveAuction(): MulticurveBuilder<C> {\n    return new MulticurveBuilder(this.chainId);\n  }\n\n  /**\n   * Create a new opening auction builder\n   */\n  buildOpeningAuction(): OpeningAuctionBuilder<C> {\n    return new OpeningAuctionBuilder(this.chainId);\n  }\n\n  /**\n   * Get the current chain ID\n   */\n  getChainId(): C {\n    return this.chainId;\n  }\n\n  /**\n   * Get the underlying clients\n   */\n  getClients(): {\n    publicClient: SupportedPublicClient;\n    walletClient?: WalletClient;\n  } {\n    return {\n      publicClient: this.publicClient,\n      walletClient: this.walletClient,\n    };\n  }\n\n  /**\n   * Get the airlock owner address for the configured chain\n   */\n  async getAirlockOwner(): Promise<Address> {\n    return fetchAirlockOwner(this.publicClient);\n  }\n\n  /**\n   * Convenience helper for building the airlock beneficiary entry with the default 5% (0.05e18 WAD shares)\n   */\n  async getAirlockBeneficiary(\n    shares: bigint = DEFAULT_AIRLOCK_BENEFICIARY_SHARES,\n  ): Promise<BeneficiaryData> {\n    return getAirlockBeneficiary(this.publicClient, shares);\n  }\n}\n","export const VERSION = '1.0.0';\n\n// Export the main SDK class\nexport { DopplerSDK } from './DopplerSDK';\n\n// Export factory and auction classes\nexport { DopplerFactory } from './entities/DopplerFactory';\nexport type { MigrationEncoder } from './entities/DopplerFactory';\nexport { TopUpDistributor } from './entities/TopUpDistributor';\nexport type {\n  TopUpParams,\n  TopUpSimulationResult,\n  TopUpTransaction,\n} from './entities/TopUpDistributor';\nexport { Bundler } from './entities/Bundler';\nexport type {\n  BundlerClaimSimulation,\n  BundlerVestingPosition,\n} from './entities/Bundler';\nexport {\n  StaticAuction,\n  DynamicAuction,\n  MulticurvePool,\n  MulticurveFees,\n  RehypeDopplerHookInitializer,\n  RehypeDopplerHook,\n  RehypeDopplerHookMigrator,\n  OpeningAuction,\n  OpeningAuctionLifecycle,\n  OpeningAuctionBidManager,\n  OpeningAuctionPositionManager,\n} from './entities/auction';\nexport type {\n  MulticurveFeesOptions,\n  MulticurvePendingFees,\n  MulticurvePendingFeesOptions,\n  MulticurveTokenPendingFeeBreakdown,\n  MulticurveTokenPendingFees,\n  RehypePendingFees,\n} from './entities/auction';\n\n// Export quoter\nexport { Quoter } from './entities/quoter';\n\n// Export token entities\nexport {\n  Derc20,\n  Derc20V2,\n  DopplerDN404,\n  DopplerERC20V1,\n  Eth,\n} from './entities/token';\n\n// Export builders and common interface\nexport {\n  StaticAuctionBuilder,\n  DynamicAuctionBuilder,\n  MulticurveBuilder,\n  OpeningAuctionBuilder,\n} from './builders';\nexport type { BaseAuctionBuilder } from './builders/shared';\nexport type {\n  BuilderDevBuyInput,\n  BuilderDevBuyVestingInput,\n} from './builders/shared';\nexport type {\n  OpeningAuctionConfig,\n  OpeningAuctionDopplerConfig,\n  ResolvedOpeningAuctionDopplerConfig,\n  CreateOpeningAuctionParams,\n  OpeningAuctionModuleAddressOverrides,\n} from './builders/OpeningAuctionBuilder';\nexport type {\n  OpeningAuctionBidManagerConfig,\n  OpeningAuctionBidArgs,\n  OpeningAuctionWithdrawFullBidArgs,\n  OpeningAuctionBidLookupArgs,\n  OpeningAuctionBidSimulationResult,\n  OpeningAuctionClaimIncentivesSimulationResult,\n  OpeningAuctionBidPositionInfo,\n  OpeningAuctionBidStatus,\n  OpeningAuctionWatchBidStatusOptions,\n  OpeningAuctionAuctionSettledEvent,\n  OpeningAuctionWatchSettlementOptions,\n  OpeningAuctionOwnerBidInfo,\n  OpeningAuctionOwnerBidStatus,\n  OpeningAuctionBidPlacedEvent,\n  OpeningAuctionBidWithdrawnEvent,\n  OpeningAuctionIncentivesClaimedEvent,\n  OpeningAuctionPhaseChangedEvent,\n  OpeningAuctionEstimatedClearingTickUpdatedEvent,\n  OpeningAuctionWatchBidPlacedOptions,\n  OpeningAuctionWatchBidWithdrawnOptions,\n  OpeningAuctionWatchIncentivesClaimedOptions,\n  OpeningAuctionWatchPhaseChangeOptions,\n  OpeningAuctionWatchEstimatedClearingTickOptions,\n  OpeningAuctionMoveBidArgs,\n  OpeningAuctionMoveBidSimulationResult,\n  OpeningAuctionMoveBidResult,\n  OpeningAuctionBidQuote,\n  OpeningAuctionClaimAllIncentivesPreview,\n  OpeningAuctionClaimAllIncentivesResult,\n  OpeningAuctionBidValidationResult,\n  OpeningAuctionQuoteFromTokenAmountArgs,\n  OpeningAuctionQuoteFromTokenAmountResult,\n} from './entities/auction/OpeningAuctionBidManager';\nexport type {\n  OpeningAuctionBidConstraints,\n  OpeningAuctionPosition,\n  OpeningAuctionSettlementData,\n  OpeningAuctionIncentiveData,\n} from './entities/auction/OpeningAuction';\nexport type {\n  OpeningAuctionModifyLiquidityParams,\n  OpeningAuctionModifyLiquiditySimulationResult,\n  OpeningAuctionWithdrawFullBidSimulationResult,\n  OpeningAuctionWithdrawFullBidResult,\n} from './entities/auction/OpeningAuctionPositionManager';\n\n// Export all types\nexport type {\n  // Core types\n  TokenConfig,\n  DopplerERC20V1TokenConfig,\n  SaleConfig,\n  StaticPoolConfig,\n  DynamicAuctionConfig,\n  VestingConfig,\n  VestingAllocationConfig,\n  VestingScheduleConfig,\n  MigrationConfig,\n  ProceedsSplitConfig,\n  StreamableFeesConfig,\n  UniswapV2MigrationConfig,\n  UniswapV2SplitMigrationConfig,\n  UniswapV4MigrationConfig,\n  UniswapV4SplitMigrationConfig,\n  DopplerHookMigratorConfig,\n  DopplerHookMigrationConfig,\n  BeneficiaryData,\n\n  // Lockable initializer types\n  LockablePoolState,\n  LockableV3InitializerParams,\n  MulticurvePoolState,\n  MulticurveMarketCapPreset,\n\n  // DopplerHook types\n  RehypeDopplerHookInitializerConfig,\n  RehypeDopplerHookConfig,\n  RehypeFeeDistributionInfo,\n  RehypeDopplerHookMigratorConfig,\n  MulticurveInitializerConfig,\n  MulticurveDecayFeeSchedule,\n\n  // Parameter types\n  CreateStaticAuctionParams,\n  CreateDynamicAuctionParams,\n  CreateMulticurveParams,\n  V4PoolKey,\n  MulticurveDevBuyVestingConfig,\n  MulticurveDevBuyConfig,\n  PreparedMulticurveTransaction,\n  PreparedMulticurveDevBuy,\n  SimulatedMulticurveCreate,\n  MulticurveDevBuyResult,\n  MulticurveCreateResult,\n  OpeningAuctionState,\n  OpeningAuctionCreateResult,\n  OpeningAuctionCompleteResult,\n  PrepareCreateMulticurveOptions,\n  MulticurveCreateGasEstimate,\n  MulticurveCreatePrediction,\n  PreparedMulticurveCreate,\n  ModuleAddressOverrides,\n  // Configuration types\n  DopplerSDKConfig,\n\n  // Information types\n  PoolInfo,\n  HookInfo,\n  QuoteResult,\n\n  // Chain/public client helper types\n  SupportedPublicClient,\n  SupportedChain,\n\n  // Governance helper types\n  NoOpEnabledChainId,\n  LaunchpadEnabledChainId,\n  GovernanceOption,\n  GovernanceLaunchpad,\n\n  // Market cap configuration types\n  MarketCapRange,\n  DynamicMarketCapRange,\n  MarketCapConfig,\n  StaticAuctionMarketCapConfig,\n  DynamicAuctionMarketCapConfig,\n  MulticurveMarketCapRangeCurve,\n  MulticurveMarketCapCurvesConfig,\n  MarketCapValidationResult,\n\n  // Internal create() param shape (advanced)\n  CreateParams,\n} from './types';\n\n// Export runtime governance helpers (not types)\nexport {\n  NO_OP_ENABLED_CHAIN_IDS,\n  isNoOpEnabledChain,\n  LAUNCHPAD_ENABLED_CHAIN_IDS,\n  isLaunchpadEnabledChain,\n} from './types';\n\n// Export enums\nexport { LockablePoolStatus } from './types';\nexport { RehypeFeeRoutingMode } from './types';\nexport { OpeningAuctionStatus, OpeningAuctionPhase } from './types';\n\n// Export addresses and utilities\nexport {\n  ADDRESSES,\n  CHAIN_IDS,\n  getAddresses,\n  SUPPORTED_CHAIN_IDS,\n  isSupportedChainId,\n} from './addresses';\nexport type {\n  SupportedChainId,\n  ChainAddresses,\n  SupportedChainKey,\n} from './addresses';\n\n// Export constants (excluding MIN_SQRT_RATIO and MAX_SQRT_RATIO to avoid conflicts)\nexport {\n  WAD,\n  DEAD_ADDRESS,\n  ZERO_ADDRESS,\n  FEE_TIERS,\n  TICK_SPACINGS,\n  SECONDS_PER_DAY,\n  SECONDS_PER_YEAR,\n  DEFAULT_EPOCH_LENGTH,\n  DEFAULT_AUCTION_DURATION,\n  DEFAULT_LOCK_DURATION,\n  DEFAULT_PD_SLUGS,\n  DAY_SECONDS,\n  DEFAULT_V3_START_TICK,\n  DEFAULT_V3_END_TICK,\n  DEFAULT_V3_NUM_POSITIONS,\n  DEFAULT_V3_FEE,\n  DEFAULT_V3_INITIAL_VOTING_DELAY,\n  DEFAULT_V3_INITIAL_VOTING_PERIOD,\n  DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n  DEFAULT_V3_VESTING_DURATION,\n  DEFAULT_V3_INITIAL_SUPPLY,\n  DEFAULT_V3_NUM_TOKENS_TO_SELL,\n  DEFAULT_V3_YEARLY_MINT_RATE,\n  DEFAULT_V3_PRE_MINT,\n  DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n  DEFAULT_V4_INITIAL_VOTING_DELAY,\n  DEFAULT_V4_INITIAL_VOTING_PERIOD,\n  DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n  DEFAULT_V4_YEARLY_MINT_RATE,\n  DEFAULT_MULTICURVE_LOWER_TICKS,\n  DEFAULT_MULTICURVE_UPPER_TICKS,\n  DEFAULT_MULTICURVE_NUM_POSITIONS,\n  DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES,\n  BASIS_POINTS,\n  FLAG_MASK,\n  DOPPLER_FLAGS,\n  OPENING_AUCTION_FLAGS,\n  OPENING_AUCTION_PHASE_NOT_STARTED,\n  OPENING_AUCTION_PHASE_ACTIVE,\n  OPENING_AUCTION_PHASE_CLOSED,\n  OPENING_AUCTION_PHASE_SETTLED,\n  OPENING_AUCTION_STATUS_UNINITIALIZED,\n  OPENING_AUCTION_STATUS_ACTIVE,\n  OPENING_AUCTION_STATUS_DOPPLER_ACTIVE,\n  OPENING_AUCTION_STATUS_EXITED,\n  INT24_MIN,\n  INT24_MAX,\n  DYNAMIC_FEE_FLAG,\n  FEE_AMOUNT_MASK,\n  DOPPLER_MAX_TICK_SPACING,\n  DEFAULT_OPENING_AUCTION_DURATION,\n  DEFAULT_OPENING_AUCTION_FEE,\n  DEFAULT_OPENING_AUCTION_MIN_ACCEPTABLE_TICK_TOKEN0,\n  DEFAULT_OPENING_AUCTION_MIN_ACCEPTABLE_TICK_TOKEN1,\n  DEFAULT_OPENING_AUCTION_MIN_LIQUIDITY,\n  DEFAULT_OPENING_AUCTION_INCENTIVE_SHARE_BPS,\n  DEFAULT_OPENING_AUCTION_SHARE_TO_AUCTION_BPS,\n  DEFAULT_OPENING_DOPPLER_DURATION,\n  DEFAULT_OPENING_DOPPLER_EPOCH_LENGTH,\n  DEFAULT_OPENING_DOPPLER_NUM_PD_SLUGS,\n  DEFAULT_OPENING_DOPPLER_FEE,\n  DEFAULT_OPENING_DOPPLER_TICK_SPACING,\n  VALID_FEE_TIERS,\n  V3_FEE_TIERS,\n  V4_MAX_FEE,\n  DECAY_MAX_START_FEE,\n  type FeeTier,\n} from './constants';\n\n// Export utility functions (includes MIN_SQRT_RATIO and MAX_SQRT_RATIO from tickMath)\nexport * from './utils';\n\n// Export ABIs\nexport * from './abis';\n"]}