@whetstone-research/doppler-sdk 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/evm/deployments.generated.ts","../../src/evm/addresses.ts","../../src/evm/types.ts","../../src/evm/constants.ts","../../src/evm/utils/tickMath.ts","../../src/evm/utils/priceHelpers.ts","../../src/evm/abis/bytecodes/doppler.ts","../../src/evm/abis/bytecodes/dopplerDN404.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/computeOptimalGamma.ts","../../src/evm/utils/gasEstimate.ts","../../src/evm/utils/isToken0Expected.ts","../../src/evm/utils/dopplerHookMigrator.ts","../../src/evm/utils/marketCapHelpers.ts","../../src/evm/entities/DopplerFactory.ts","../../src/evm/entities/auction/StaticAuction.ts","../../src/evm/entities/auction/DynamicAuction.ts","../../src/evm/entities/auction/MulticurvePool.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/eth/Eth.ts","../../src/evm/builders/shared.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":["LockablePoolStatus","OpeningAuctionPhase","OpeningAuctionStatus","RehypeFeeRoutingMode","ZERO_ADDRESS","parseEther","formatEther","keccak256","name","symbol","decodeAbiParameters","initHashData","encodeAbiParameters","encodePacked","getAddress","airlockAbi","TOKEN_FACTORY_80_ADDRESS","isTokenFactory80","resolved","decoded","decodeEventLog","toHex","fallbackCurve","zeroAddress","Q96","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 CloneDERC20VotesV2: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n CloneDERC20VotesV2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n CloneERC20: '0x215b2cE3Dd8D110394e94A868580D61a77aDEc4A',\n CloneERC20Factory: '0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e',\n CloneERC20Votes: '0xA8d0E8036D3fAE21C7Af075ad41942Bc1f807CDF',\n CloneERC20VotesFactory: '0x5A92bFfbc01ea0396A9c7D4154d36d4EAF2e483E',\n DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n GovernanceFactory: '0x9F309D79BEe3E8b2f56FaCF74b7195Df176c8F61',\n NoOpGovernanceFactory: '0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638',\n NoOpMigrator: '0x233A71A7bB928b1357A1Ebf454298320989Ca5B5',\n Quoter: '0xB524401A6655A6176ba8aBD8FA3d4a547e1D0424',\n RehypeDopplerHook: '0x3Ec4798A9B11e8243A8Db99687f7A23597B96623',\n RehypeDopplerHookInitializer: '0x6AB5aE3191c914dE8437431091776Fc90f314bE4',\n RehypeDopplerHookMigrator: '0x82d5E22911fbbCB8d3e45812d74eE6203c5824e0',\n StreamableFeesLocker: '0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6',\n StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n TimelockFactory: '0x9fd40af2baAfAF03513f091444e821c0d5b06ea0',\n TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n UniswapV2Locker: '0xA366D94eDA7abEc16bfa5619A855a6208bE3aEE9',\n UniswapV2Migrator: '0x765875bff87614cE0581ee73B9fa663B71F3DfF2',\n UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n UniswapV4Migrator: '0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5',\n UniswapV4MigratorHook: '0x4053D4fa966cbdCC20Ec62070aC8814De8bEE500',\n UniswapV4ScheduledMulticurveInitializer:\n '0xF84378C9F39e0FF267f3101c88773359c5393876',\n UniswapV4ScheduledMulticurveInitializerHook:\n '0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0',\n },\n '130': {\n Airlock: '0x77EbfBAE15AD200758E9E2E61597c0B07d731254',\n Bundler: '0x91231cDdD8d6C86Df602070a3081478e074b97b7',\n DopplerDeployer: '0x0d2f38d807bfAd5C18e430516e10ab560D300caF',\n DopplerLensQuoter: '0x82Ac010C67f70BACf7655cd8948a4AD92A173CAC',\n GovernanceFactory: '0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE',\n LockableUniswapV3Initializer: '0xA3C847eAb58eAa9cbc215C785c9cfBc19CDABD5f',\n NoOpGovernanceFactory: '0x3AD727ee0FBBb8Ee0920933FdB96F23fD56f1299',\n NoOpMigrator: '0x917da361072ce968acD810BbfC9B64079426ebf0',\n StreamableFeesLocker: '0x6ddfED58D238Ca3195E49d8ac3d4cEa6386E5C33',\n TokenFactory: '0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3',\n TokenFactory80: '0xf0B5141dD9096254B2ca624dff26024f46087229',\n UniswapV2Migrator: '0xf6023127f6E937091D5B605680056A6D27524bad',\n UniswapV3Initializer: '0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec',\n UniswapV4Initializer: '0x4B0EC16Eb40318Ca5A4346f20F04A2285C19675B',\n UniswapV4Migrator: '0x49F3fBB2dFF7f3d03B622e3b2a6d3F2E6fdB2a5A',\n UniswapV4MigratorHook: '0x53C050d3B09C80024138165520Bd7c078D9e2000',\n },\n '143': {\n Airlock: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n Bundler: '0xC99b485499f78995C6F1640dbB1413c57f8BA684',\n CloneDERC20VotesV2: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n CloneDERC20VotesV2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n DopplerHookInitializer: '0xAA096F558f3d4c9226De77E7Cc05f18E180B2544',\n DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n GovernanceFactory: '0xFAafdE6a5b658684cC5eb0C5c2c755B00A246F45',\n LaunchpadGovernanceFactory: '0x5FBe931dc4B923A7abe4c47aD68d5bF9Eda5B76D',\n LockableUniswapV3Initializer: '0x8b4C7DB9121FC885689C0A50D5a1429F15AEc2a0',\n NoOpGovernanceFactory: '0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9',\n NoOpMigrator: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731',\n Quoter: '0x525B6c00E1d32677ccaEC5cF07E3045c0FE7102d',\n RehypeDopplerHook: '0x97cAD5684FB7Cc2bEd9a9b5eBfba67138F4f2503',\n RehypeDopplerHookMigrator: '0xd199E7836e91654c0475a90E0C1d0e402bB84372',\n StreamableFeesLocker: '0x63f8C8F9beFaab2FaCD7Ece0b0242f78B920Ee90',\n StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n TimelockFactory: '0x44610355465c1F5914C8B8ea0E7c887CC67459b2',\n TokenFactory: '0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5',\n TokenFactory80: '0xf0B5141dD9096254B2ca624dff26024f46087229',\n TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n UniswapV2Locker: '0x08Ab3f5D1177511C438a15b3bd5d8b172b6f715F',\n UniswapV2Migrator: '0x136191B46478cAB023cbC01a36160C4Aad81677a',\n UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n UniswapV4Migrator: '0x44bf742e57cd8cF23ABbc8dab2c44e2a3228356E',\n UniswapV4MigratorHook: '0x3E4c689BBf33b37106eBC13Db8aa5BF13a25e500',\n UniswapV4ScheduledMulticurveInitializer:\n '0xCe3099B2F07029b086E5e92a1573C5f5A3071783',\n UniswapV4ScheduledMulticurveInitializerHook:\n '0x580ca49389d83b019d07E17e99454f2F218e2dc0',\n },\n '1301': {\n Airlock: '0x0d2f38d807bfAd5C18e430516e10ab560D300caF',\n AirlockMultisigTestnet: '0x0abCf819FD57C9f0141628410fFC273405E44426',\n Bundler: '0xED344444633B965cd148F8fFCE3765938A179094',\n DopplerDeployer: '0x77B5F559EE9cf3bfcf2fFf5731a84332D8eECAC9',\n DopplerLensQuoter: '0x917da361072ce968acD810BbfC9B64079426ebf0',\n GovernanceFactory: '0x4225C632b62622Bd7B0A3eC9745C0a866Ff94F6F',\n LockableUniswapV3Initializer: '0x9dFb775dB7b005d9Dc77DA84D8b2e42C281D0344',\n NoOpGovernanceFactory: '0x7E5D336A6E9e453c9f02E5102CC039E015Fd8fb8',\n NoOpMigrator: '0x193F48A45B6025dDeD10bc4BaeEF65c833696387',\n StreamableFeesLocker: '0x1728E8B3282502f275949109331E070b819B38eA',\n TokenFactory: '0x82Ac010C67f70BACf7655cd8948a4AD92A173CAC',\n TokenFactory80: '0xf0B5141dD9096254B2ca624dff26024f46087229',\n UniswapV2Migrator: '0x620e3fec244e913d73f2163623b62d02DB69638B',\n UniswapV3Initializer: '0xE0dC4012AC9C868F09c6e4b20d66ED46D6F258d0',\n UniswapV4Initializer: '0x70d20cd48791E527036491dc464C8Dc58351Dd93',\n UniswapV4Migrator: '0xb6D69eAA98E657bEEFF7ca4452768e6f707aa6b1',\n UniswapV4MigratorHook: '0xFB0671Ec46190b09255776d2D77744fa101Ba500',\n UniswapV4MulticurveInitializer:\n '0xac7939F1B4079d55A7fA4DFA314Ac0173A77bA40',\n UniswapV4MulticurveInitializerHook:\n '0x11b55A121a38FDab8FAF16f9f1A4f124E3f42d40',\n UniswapV4ScheduledMulticurveInitializer:\n '0xF84378C9F39e0FF267f3101c88773359c5393876',\n UniswapV4ScheduledMulticurveInitializerHook:\n '0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0',\n },\n '4326': {\n Airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA',\n NoOpGovernanceFactory: '0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638',\n NoOpMigrator: '0x233A71A7bB928b1357A1Ebf454298320989Ca5B5',\n },\n '4801': {\n Airlock: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731',\n GovernanceFactory: '0x136191B46478cAB023cbC01a36160C4Aad81677a',\n TokenFactory: '0x5FBe931dc4B923A7abe4c47aD68d5bF9Eda5B76D',\n UniswapV2Migrator: '0x8b4C7DB9121FC885689C0A50D5a1429F15AEc2a0',\n UniswapV3Initializer: '0x9916Ec1c1E0462F6F8f7514e414F06bf001Ac82A',\n WETH: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n },\n '6343': {\n Airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA',\n NoOpGovernanceFactory: '0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638',\n NoOpMigrator: '0x233A71A7bB928b1357A1Ebf454298320989Ca5B5',\n },\n '8453': {\n Airlock: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n Bundler: '0x136191B46478cAB023cbC01a36160C4Aad81677a',\n CloneDERC20VotesV2: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n CloneDERC20VotesV2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n DecayMulticurveInitializer: '0xD59cE43E53D69F190E15d9822Fb4540dCcc91178',\n DecayMulticurveInitializerHook:\n '0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0',\n DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n DopplerLensQuoter: '0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3',\n GovernanceFactory: '0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B',\n LaunchpadGovernanceFactory: '0x40Bcb4dDA3BcF7dba30C5d10c31EE2791ed9ddCa',\n LockableUniswapV3Initializer: '0xE0dC4012AC9C868F09c6e4b20d66ED46D6F258d0',\n NoOpGovernanceFactory: '0x3AD727ee0FBBb8Ee0920933FdB96F23fD56f1299',\n NoOpMigrator: '0x6ddfED58D238Ca3195E49d8ac3d4cEa6386E5C33',\n Quoter: '0xB524401A6655A6176ba8aBD8FA3d4a547e1D0424',\n RehypeDopplerHook: '0x3Ec4798A9B11e8243A8Db99687f7A23597B96623',\n RehypeDopplerHookInitializer: '0x6AB5aE3191c914dE8437431091776Fc90f314bE4',\n RehypeDopplerHookMigrator: '0x82d5E22911fbbCB8d3e45812d74eE6203c5824e0',\n StreamableFeesLocker: '0x0A00775D71a42cd33D62780003035e7F5b47bD3A',\n StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n TokenFactory: '0x4225C632b62622Bd7B0A3eC9745C0a866Ff94F6F',\n TokenFactory80: '0xf0B5141dD9096254B2ca624dff26024f46087229',\n TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n UniswapV2Migrator: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731',\n UniswapV3Initializer: '0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5',\n UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n UniswapV4Migrator: '0xd3B4cF7FD24381e90A4F012fC6c5976b87B9B3cE',\n UniswapV4MigratorHook: '0xD6FECFF347c6203A41874e8D77dE669B54e7A500',\n UniswapV4MulticurveInitializer:\n '0x65dE470Da664A5be139A5D812bE5FDa0d76CC951',\n UniswapV4MulticurveInitializerHook:\n '0x892D3C2B4ABEAAF67d52A7B29783E2161B7CaD40',\n UniswapV4ScheduledMulticurveInitializer:\n '0xA36715dA46Ddf4A769f3290f49AF58bF8132ED8E',\n UniswapV4ScheduledMulticurveInitializerHook:\n '0x3e342a06f9592459D75721d6956B570F02eF2Dc0',\n },\n '10143': {\n Airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA',\n AirlockMultisigTestnet: '0x0abCf819FD57C9f0141628410fFC273405E44426',\n Bundler: '0xf6023127f6E937091D5B605680056A6D27524bad',\n DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n DopplerLensQuoter: '0x2F2BAcd46d3F5c9EE052Ab392b73711dB89129DB',\n GovernanceFactory: '0x014E1c0bd34f3B10546E554CB33B3293fECDD056',\n LockableUniswapV3Initializer: '0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE',\n NoOpGovernanceFactory: '0x094D926A969B3024ca46D2186BF13FD5CDBA9CE2',\n NoOpMigrator: '0x5CadB034267751a364dDD4d321C99E07A307f915',\n StreamableFeesLocker: '0x0d2f38d807bfAd5C18e430516e10ab560D300caF',\n TimelockFactory: '0xB544F6fFF61F601F638C3930F6Aec4bbD7DA42b9',\n TokenFactory: '0x8AF018e28c273826e6b2d5a99e81c8fB63729b07',\n TokenFactory80: '0xf0B5141dD9096254B2ca624dff26024f46087229',\n UniswapV2Locker: '0xfF3e891F2C1389eF638F9b0576003590aeEe1844',\n UniswapV2Migrator: '0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3',\n UniswapV3Initializer: '0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec',\n UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n UniswapV4Migrator: '0x4B0EC16Eb40318Ca5A4346f20F04A2285C19675B',\n UniswapV4MigratorHook: '0x76E1f507592d9856B48482c599732d129eD6a500',\n UniswapV4MulticurveInitializer:\n '0xA3C847eAb58eAa9cbc215C785c9cfBc19CDABD5f',\n UniswapV4MulticurveInitializerHook:\n '0xFaF16d11737E6552156DD328cD26C530e1da2D40',\n WETH: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n },\n '57073': {\n Airlock: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n Bundler: '0x136191B46478cAB023cbC01a36160C4Aad81677a',\n DopplerDeployer: '0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B',\n DopplerLensQuoter: '0x8AF018e28c273826e6b2d5a99e81c8fB63729b07',\n GovernanceFactory: '0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9',\n TokenFactory: '0xFAafdE6a5b658684cC5eb0C5c2c755B00A246F45',\n UniswapV2Migrator: '0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731',\n UniswapV3Initializer: '0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5',\n UniswapV4Initializer: '0x014E1c0bd34f3B10546E554CB33B3293fECDD056',\n },\n '84532': {\n Airlock: '0x3411306Ce66c9469BFF1535BA955503c4Bde1C6e',\n AirlockMultisigTestnet: '0x0abCf819FD57C9f0141628410fFC273405E44426',\n BasicMultisig: '0x6f645FA08B7eadAD620CEC85634204b1d7A46DC2',\n Bundler: '0xab7BACB0d5C2C10152f92D34e07F530EB3CB0Fb1',\n CloneDERC20VotesV2: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n CloneDERC20VotesV2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n CloneERC20: '0xE7F1Cc50CCa68975eD6E56Ee4b0Aaf171D02732A',\n CloneERC20Factory: '0xbf4Ca4D527c9760A884df31292f72E9AcA503045',\n CloneERC20Votes: '0x52831E40151a79FE2e74549b0974d44A10Ac30aD',\n CloneERC20VotesFactory: '0x9a497a9fB78e49984B9d260abA1F4AD6321D4D92',\n DecayMulticurveInitializer: '0xD59cE43E53D69F190E15d9822Fb4540dCcc91178',\n DecayMulticurveInitializerHook:\n '0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0',\n DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n DopplerLensQuoter: '0x4a8d81Db741248a36D9eb3bc6eF648Bf798B47a7',\n GovernanceFactory: '0x9dBFaaDC8c0cB2c34bA698DD9426555336992e20',\n LockableUniswapV3Initializer: '0x16AdA5Be50C3c2D94Af5fEae6b539C40A78Ad53c',\n MulticurveLibrary: '0x32238a39ba5aF060EFbfAda59979B639E0945fE0',\n NoOpGovernanceFactory: '0x7bD798fafC99A3b17E261F8308A8C11B56935ea1',\n NoOpMigrator: '0xF11066abbd329ac4bBA39455340539322C222eb0',\n Quoter: '0xB524401A6655A6176ba8aBD8FA3d4a547e1D0424',\n RehypeDopplerHook: '0x3Ec4798A9B11e8243A8Db99687f7A23597B96623',\n RehypeDopplerHookInitializer: '0x6AB5aE3191c914dE8437431091776Fc90f314bE4',\n RehypeDopplerHookMigrator: '0x82d5E22911fbbCB8d3e45812d74eE6203c5824e0',\n StreamableFeesLocker: '0x3345E557c5C0b474bE1eb4693264008B8562Aa9c',\n TeamGovernanceFactory: '0x8aF3001ED75F86f4Dd910577ECa9C5dB7CEa765c',\n TokenFactory: '0x9D8fd79B2a59c5d91ccBd79c3AEb4de56451Bb02',\n TokenFactory80: '0xf0B5141dD9096254B2ca624dff26024f46087229',\n TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n UniswapV2Locker: '0x78500ab9297aD87b1f6A0329e6af226F73886a5D',\n UniswapV2Migrator: '0x04a898f3722c38F9Def707bD17DC78920EFA977C',\n UniswapV2MigratorSplit: '0x935D94FcbBbA9BE1184953BF0B93E4D844cd0335',\n UniswapV3Initializer: '0x4C3062B9ccFdbCB10353F57C1B59a29d4c5CFa47',\n UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n UniswapV4Migrator: '0xEEe0eCCb54398ce371CAACBCEf076d3Ed597DDb3',\n UniswapV4MigratorHook: '0x127cAAAd598Ffa97577940b0a5c3b6150019E500',\n UniswapV4MigratorSplit: '0xC647fED0746cc14fBF645aEDa15CC40B18505490',\n UniswapV4MigratorSplitHook: '0x20e03085adBcfCB840De898F37617ABD08da2500',\n UniswapV4MulticurveInitializer:\n '0x1718405E58c61425cDc0083262bC9f72198F5232',\n UniswapV4MulticurveInitializerHook:\n '0x6a1061FC558dDe1E6fD0eFd641b370d435b56d40',\n UniswapV4ScheduledMulticurveInitializer:\n '0xF84378C9F39e0FF267f3101c88773359c5393876',\n UniswapV4ScheduledMulticurveInitializerHook:\n '0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0',\n WETH: '0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12',\n },\n '11155111': {\n Airlock: '0xDe3599a2eC440B296373a983C85C365DA55d9dFA',\n AirlockMultisigTestnet: '0x0abCf819FD57C9f0141628410fFC273405E44426',\n CloneDERC20VotesV2: '0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7',\n CloneDERC20VotesV2Factory: '0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1',\n CloneERC20: '0x215b2cE3Dd8D110394e94A868580D61a77aDEc4A',\n CloneERC20Factory: '0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e',\n CloneERC20Votes: '0xA8d0E8036D3fAE21C7Af075ad41942Bc1f807CDF',\n CloneERC20VotesFactory: '0x5A92bFfbc01ea0396A9c7D4154d36d4EAF2e483E',\n DecayMulticurveInitializer: '0xD59cE43E53D69F190E15d9822Fb4540dCcc91178',\n DecayMulticurveInitializerHook:\n '0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0',\n DopplerDeployer: '0xb35469ee64A87Afd19B31615094fE3962d73e421',\n DopplerHookInitializer: '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544',\n DopplerHookMigrator: '0x1E40b0875DDa35f41E15cFB475403859B8c860c4',\n GovernanceFactory: '0x9F309D79BEe3E8b2f56FaCF74b7195Df176c8F61',\n NoOpGovernanceFactory: '0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638',\n NoOpMigrator: '0x233A71A7bB928b1357A1Ebf454298320989Ca5B5',\n Quoter: '0xB524401A6655A6176ba8aBD8FA3d4a547e1D0424',\n RehypeDopplerHook: '0x3Ec4798A9B11e8243A8Db99687f7A23597B96623',\n RehypeDopplerHookInitializer: '0x6AB5aE3191c914dE8437431091776Fc90f314bE4',\n RehypeDopplerHookMigrator: '0x82d5E22911fbbCB8d3e45812d74eE6203c5824e0',\n StreamableFeesLocker: '0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6',\n StreamableFeesLockerV2: '0xcE3212e6536F33cD6fbFEE265224131353Ca3D47',\n TimelockFactory: '0x9fd40af2baAfAF03513f091444e821c0d5b06ea0',\n TopUpDistributor: '0x435312320C0330B1999746753551CdFbD83aD814',\n UniswapV2Locker: '0xA366D94eDA7abEc16bfa5619A855a6208bE3aEE9',\n UniswapV2Migrator: '0x765875bff87614cE0581ee73B9fa663B71F3DfF2',\n UniswapV4Initializer: '0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad',\n UniswapV4Migrator: '0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5',\n UniswapV4MigratorHook: '0x4053D4fa966cbdCC20Ec62070aC8814De8bEE500',\n UniswapV4ScheduledMulticurveInitializer:\n '0xF84378C9F39e0FF267f3101c88773359c5393876',\n UniswapV4ScheduledMulticurveInitializerHook:\n '0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0',\n },\n} as const;\n","import { Address } from 'viem';\nimport { GENERATED_DOPPLER_DEPLOYMENTS } from './deployments.generated';\n\n// Chain IDs\nexport const CHAIN_IDS = {\n MAINNET: 1,\n ETH_SEPOLIA: 11155111,\n BASE: 8453,\n BASE_SEPOLIA: 84532,\n INK: 57073,\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\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 v4Migrator: 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\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\n// Not yet deployed placeholder\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Address;\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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n .CloneERC20Factory as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.MAINNET,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.MAINNET,\n 'CloneDERC20VotesV2',\n ),\n v3Initializer: ZERO_ADDRESS,\n v3Quoter: ZERO_ADDRESS,\n v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n .UniswapV4Initializer as Address,\n v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.MAINNET\n ].UniswapV4ScheduledMulticurveInitializer 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n .UniswapV2Migrator as Address,\n v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n .UniswapV4Migrator 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: ZERO_ADDRESS,\n noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n .NoOpGovernanceFactory as Address,\n streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET]\n .StreamableFeesLocker as Address,\n universalRouter: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af' as Address,\n permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .Airlock as Address,\n tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .CloneERC20Factory as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.ETH_SEPOLIA,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.ETH_SEPOLIA,\n 'CloneDERC20VotesV2',\n ),\n v3Initializer: ZERO_ADDRESS,\n v3Quoter: ZERO_ADDRESS,\n v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .UniswapV4Initializer as Address,\n v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.ETH_SEPOLIA\n ].UniswapV4ScheduledMulticurveInitializer as Address,\n dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .DopplerHookInitializer as Address,\n rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(\n CHAIN_IDS.ETH_SEPOLIA,\n ),\n rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(\n CHAIN_IDS.ETH_SEPOLIA,\n ),\n dopplerLens: ZERO_ADDRESS,\n dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .DopplerDeployer as Address,\n poolManager: '0xE03A1074c86CFeDd5C142C4F04F1a1536e203543' as Address,\n v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .UniswapV2Migrator as Address,\n v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .UniswapV4Migrator as Address,\n dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .DopplerHookMigrator as Address,\n rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.ETH_SEPOLIA\n ].RehypeDopplerHookMigrator as Address,\n noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .NoOpMigrator as Address,\n governanceFactory: ZERO_ADDRESS,\n noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .NoOpGovernanceFactory as Address,\n streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA]\n .StreamableFeesLocker 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.BASE]: {\n airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].Airlock as Address,\n tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .TokenFactory80 as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.BASE,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.BASE,\n 'CloneDERC20VotesV2',\n ),\n v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .UniswapV3Initializer 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .UniswapV4MulticurveInitializer as Address, // From Doppler multicurve deployments (Base mainnet)\n v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.BASE\n ].UniswapV4ScheduledMulticurveInitializer as Address, // From Doppler scheduled multicurve deployments (Base mainnet)\n v4DecayMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .DecayMulticurveInitializer 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:\n '0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123' as Address,\n rehypeDopplerHook: '0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123' as Address,\n dopplerHookInitializer:\n '0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544' as Address,\n v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .UniswapV2Migrator as Address,\n v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .UniswapV4Migrator 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: '0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9' as Address,\n noOpGovernanceFactory:\n '0xe7dfbd5b0a2c3b4464653a9becdc489229ef090e' as Address,\n launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .LaunchpadGovernanceFactory as Address,\n streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE]\n .StreamableFeesLocker as Address,\n universalRouter: '0x6ff5693b99212da76ad316178a184ab56d299b43' as Address,\n univ2Router02: '0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24' as Address,\n permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].Bundler as Address,\n weth: '0x4200000000000000000000000000000000000006' 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n .TokenFactory80 as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.BASE_SEPOLIA,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.BASE_SEPOLIA,\n 'CloneDERC20VotesV2',\n ),\n doppler404Factory: '0xdd8cea2890f1b3498436f19ec8da8fecc2cb7af7' as Address,\n v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n .UniswapV3Initializer 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: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.BASE_SEPOLIA\n ].UniswapV4MulticurveInitializer as Address,\n v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.BASE_SEPOLIA\n ].UniswapV4ScheduledMulticurveInitializer as Address, // From Doppler scheduled multicurve deployments (Base Sepolia)\n v4DecayMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.BASE_SEPOLIA\n ].DecayMulticurveInitializer 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n .UniswapV2Migrator as Address,\n v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n .UniswapV4Migrator 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n .UniswapV4MigratorHook 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:\n '0x916b8987e4ad325c10d58ed8dc2036a6ff5eb228' as Address,\n streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA]\n .StreamableFeesLocker as Address,\n universalRouter: '0x492E6456D9528771018DeB9E87ef7750EF184104' as Address,\n univ2Router02: '0x1689E7B1F10000AE47eBfE339a4f69dECd19F602' as Address,\n permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n bundler: '0x69DB7c20cDdA49Bed2bFb21e16Fa218330C50661' as Address,\n weth: '0x4200000000000000000000000000000000000006' as Address,\n uniswapV4Quoter: '0x4A6513c898fe1B2d0E78d3b0e0A4a151589B1cBa' as Address,\n },\n [CHAIN_IDS.INK]: {\n airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].Airlock as Address,\n tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK]\n .TokenFactory as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.INK,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.INK,\n 'CloneDERC20VotesV2',\n ),\n v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK]\n .UniswapV3Initializer as Address,\n v3Quoter: '0x96b572D2d880cf2Fa2563651BD23ADE6f5516652' as Address,\n v4Initializer: '0xC99b485499f78995C6F1640dbB1413c57f8BA684' as Address,\n dopplerLens: '0x3972c00f7ed4885e145823eb7c655375d275a1c5' as Address,\n dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK]\n .DopplerDeployer as Address,\n poolManager: '0x360e68faccca8ca495c1b759fd9eee466db9fb32' as Address,\n v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK]\n .UniswapV2Migrator as Address,\n v4Migrator: ZERO_ADDRESS,\n governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK]\n .GovernanceFactory 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 bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].Bundler as Address,\n weth: '0x4200000000000000000000000000000000000006' as Address,\n uniswapV4Quoter: '0x3972c00f7ed4885e145823eb7c655375d275a1c5' as Address,\n },\n [CHAIN_IDS.UNICHAIN]: {\n airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .Airlock as Address,\n tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .TokenFactory as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.UNICHAIN,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.UNICHAIN,\n 'CloneDERC20VotesV2',\n ),\n v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .UniswapV3Initializer 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .UniswapV2Migrator as Address,\n v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .UniswapV4Migrator as Address,\n noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .NoOpMigrator as Address,\n governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .GovernanceFactory as Address,\n noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .NoOpGovernanceFactory as Address,\n streamableFeesLocker: ZERO_ADDRESS, // Not yet deployed\n universalRouter: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3' as Address,\n univ2Router02: '0x284f11109359a7e1306c3e447ef14d38400063ff' as Address,\n permit2: '0x000000000022D473030F116dDEE9F6B43aC78BA3' as Address,\n bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN]\n .Bundler 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA]\n .TokenFactory 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA]\n .UniswapV2Migrator as Address,\n v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA]\n .UniswapV4Migrator as Address,\n noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA]\n .NoOpMigrator as Address,\n governanceFactory: '0x1E4332EEfAE9e4967C2D186f7b2d439D778e81cC' as Address,\n noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.UNICHAIN_SEPOLIA\n ].NoOpGovernanceFactory 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 bundler: '0x63f8C8F9beFaab2FaCD7Ece0b0242f78B920Ee90' as Address,\n weth: '0x4200000000000000000000000000000000000006' as Address,\n uniswapV4Quoter: '0x56dcd40a3f2d466f48e7f48bdbe5cc9b92ae4472' as Address,\n },\n [CHAIN_IDS.MONAD_TESTNET]: {\n airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .Airlock as Address,\n tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .TokenFactory80 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .UniswapV3Initializer as Address,\n v3Quoter: ZERO_ADDRESS,\n v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .UniswapV4Initializer as Address,\n dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .DopplerLensQuoter as Address,\n dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .DopplerDeployer as Address,\n poolManager: '0xe93882f395B0b24180855c68Ab19B2d78573ceBc' as Address,\n v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .UniswapV2Migrator as Address,\n v4Migrator: '0xBEd386a1Fc62B6598c9b8d2BF634471B6Fe75EB7' as Address,\n noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .NoOpMigrator as Address,\n governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .GovernanceFactory as Address,\n noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.MONAD_TESTNET\n ].NoOpGovernanceFactory 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 bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET]\n .Bundler 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: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n .TokenFactory80 as Address,\n derc20V2Factory: getGeneratedAddress(\n CHAIN_IDS.MONAD_MAINNET,\n 'CloneDERC20VotesV2Factory',\n ),\n derc20V2Implementation: getGeneratedAddress(\n CHAIN_IDS.MONAD_MAINNET,\n 'CloneDERC20VotesV2',\n ),\n v3Initializer: ZERO_ADDRESS,\n v3Quoter: '0x66266174564170519409d8853898f065c719536b' as Address,\n v4Initializer: ZERO_ADDRESS,\n dopplerLens: ZERO_ADDRESS,\n dopplerDeployer: ZERO_ADDRESS,\n poolManager: '0x188d586ddcf52439676ca21a244753fa19f9ea8e' as Address,\n v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET]\n .UniswapV2Migrator as Address,\n v4Migrator: ZERO_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 v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[\n CHAIN_IDS.MONAD_MAINNET\n ].UniswapV4ScheduledMulticurveInitializer 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: ZERO_ADDRESS, // Not yet deployed\n universalRouter: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3' as Address,\n univ2Router02: ZERO_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","import {\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, WalletClient } from 'viem';\n\nexport type SupportedChain =\n | typeof mainnet\n | typeof sepolia\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 (discriminated union)\nexport interface StandardTokenConfig {\n type?: 'standard'; // default behavior (backwards compatible)\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 interface Doppler404TokenConfig {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n // Optional unit for DN404 factory (uint256). Defaults to 1000 when omitted.\n unit?: bigint;\n}\n\nexport type TokenConfig = StandardTokenConfig | Doppler404TokenConfig;\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 VestingConfig {\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}\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.BASE,\n CHAIN_IDS.BASE_SEPOLIA,\n CHAIN_IDS.UNICHAIN,\n CHAIN_IDS.UNICHAIN_SEPOLIA,\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.BASE,\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 DopplerHookMigrationConfig {\n type: 'dopplerHook';\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\nexport type MigrationConfig =\n | { type: 'uniswapV2' } // Basic migration to a new Uniswap v2 pool\n | {\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?: {\n lockDuration: number; // in seconds\n beneficiaries: BeneficiaryData[]; // Uses shares in WAD (1e18 = 100%)\n };\n }\n | DopplerHookMigrationConfig // Dynamic-only: migration via DopplerHookMigrator\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 MAX_TICK rounded to tick spacing */\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\nexport interface MulticurveBundleExactOutResult {\n asset: Address;\n poolKey: V4PoolKey;\n amountIn: bigint;\n gasEstimate: bigint;\n}\n\nexport interface MulticurveBundleExactInResult {\n asset: Address;\n poolKey: V4PoolKey;\n amountOut: bigint;\n gasEstimate: bigint;\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\n// Initializer-side RehypeDopplerHook configuration.\n// Supports both the current API and deprecated legacy fields for compatibility.\nexport interface RehypeDopplerHookConfig {\n // The hook contract address (must be whitelisted in the initializer)\n hookAddress: Address;\n // Destination address for buyback tokens / beneficiary fee claims\n buybackDestination: Address;\n\n // Current fee schedule API\n startFee?: number;\n endFee?: number;\n durationSeconds?: number | bigint;\n startingTime?: number | bigint | Date;\n feeRoutingMode?:\n | RehypeFeeRoutingMode\n | 'directBuyback'\n | 'routeToBeneficiaryFees';\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\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: 'standard' }\n | { type: 'scheduled'; startTime: number }\n | {\n type: 'decay';\n startTime: number;\n startFee: number;\n durationSeconds: number;\n }\n | { type: 'rehype'; config: RehypeDopplerHookConfig };\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 { type: 'standard' }.\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 // 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 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\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 tokenFactory?: 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 v4Migrator?: Address;\n dopplerHookMigrator?: Address;\n rehypeDopplerHookMigrator?: Address;\n noOpMigrator?: Address;\n}\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;\n\n// =============================================================================\n// Fee Tiers - V3 vs V4 Distinction\n// =============================================================================\n//\n// Uniswap V3 (Static Auctions): Fees are COUPLED to tick spacings. Only 4 tiers allowed.\n// Uniswap V4 (Dynamic/Multicurve): Fees are DECOUPLED. Any fee 0-100,000 is valid.\n//\n// The standard fee tiers below are recognized by both V3 and V4, but V4 pools\n// can use ANY fee value as long as you provide an explicit tickSpacing.\n\n/** Standard fee tiers recognized by both Uniswap V3 and V4 */\nexport const FEE_TIERS = {\n LOWEST: 100, // 0.01%\n LOW: 500, // 0.05%\n MEDIUM: 3000, // 0.30%\n HIGH: 10000, // 1.00%\n} as const;\n\n/** Valid fee tier values (100, 500, 3000, 10000) */\nexport type FeeTier = (typeof FEE_TIERS)[keyof typeof FEE_TIERS];\n\n/**\n * Standard fee tiers - REQUIRED for V3 (Static Auctions).\n * V4 pools can use custom fees but these are the recommended defaults.\n */\nexport const VALID_FEE_TIERS: readonly FeeTier[] = [\n 100, 500, 3000, 10000,\n] as const;\n\n/**\n * V3 fee tiers - These are the ONLY valid fees for Uniswap V3 pools.\n * Static Auctions use V3 and must use one of these tiers.\n */\nexport const V3_FEE_TIERS = VALID_FEE_TIERS;\n\n/**\n * Maximum LP fee for V4 pools (from DopplerHookInitializer.sol).\n * V4 pools can use any fee from 0 to this value.\n * @see DopplerHookInitializer.sol line 171: `uint24 constant MAX_LP_FEE = 100_000`\n */\nexport const V4_MAX_FEE = 100_000; // 10%\n\n/**\n * Maximum allowed start fee for decay multicurve schedules.\n * This is intentionally higher than V4_MAX_FEE to support anti-sniping launches.\n * 800_000 = 80%\n */\nexport const DECAY_MAX_START_FEE = 800_000; // 80%\n\n// Tick spacings for different fee tiers (standard Uniswap V3 mapping)\n// In V4, tickSpacing is independent of fee - you can use any combination\nexport const TICK_SPACINGS = {\n 100: 1,\n 500: 10,\n 3000: 60,\n 10000: 200,\n} as const;\n\n/**\n * Maximum tick spacing allowed by Doppler.sol for dynamic (Dutch) auctions.\n * @see Doppler.sol line 159: `int24 constant MAX_TICK_SPACING = 30`\n */\nexport const DOPPLER_MAX_TICK_SPACING = 30;\n\n// Time constants\nexport const SECONDS_PER_DAY = 86400;\nexport const SECONDS_PER_YEAR = 365 * SECONDS_PER_DAY;\n\n// Default values\nexport const DEFAULT_EPOCH_LENGTH = 43200; // 12 hours in seconds (matching V4 SDK)\nexport const DEFAULT_AUCTION_DURATION = 7 * SECONDS_PER_DAY; // 7 days\nexport const DEFAULT_LOCK_DURATION = SECONDS_PER_YEAR; // 1 year\nexport const DEFAULT_PD_SLUGS = 5; // Default price discovery slugs\nexport const DAY_SECONDS = SECONDS_PER_DAY; // Alias for consistency\n\n// Default gas limit to fall back on when create() simulations do not return a value\nexport const DEFAULT_CREATE_GAS_LIMIT = 13_500_000n;\n\n// V3 Default parameters\nexport const DEFAULT_V3_START_TICK = 175000;\nexport const DEFAULT_V3_END_TICK = 225000;\nexport const DEFAULT_V3_NUM_POSITIONS = 15;\nexport const DEFAULT_V3_FEE = 10000; // 1% fee tier\nexport const DEFAULT_V3_INITIAL_VOTING_DELAY = 172800; // 2 days\nexport const DEFAULT_V3_INITIAL_VOTING_PERIOD = 1209600; // 14 days\nexport const DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD = 0n;\nexport const DEFAULT_V3_VESTING_DURATION = BigInt(SECONDS_PER_YEAR);\nexport const DEFAULT_V3_INITIAL_SUPPLY = parseEther('1000000000'); // 1 billion tokens\nexport const DEFAULT_V3_NUM_TOKENS_TO_SELL = parseEther('900000000'); // 900 million tokens\nexport const DEFAULT_V3_YEARLY_MINT_RATE = parseEther('0.02'); // 2% yearly mint rate\nexport const DEFAULT_V3_PRE_MINT = parseEther('9000000'); // 9 million tokens (0.9%)\nexport const DEFAULT_V3_MAX_SHARE_TO_BE_SOLD = parseEther('0.35'); // 35%\n\n// V4 Default parameters\nexport const DEFAULT_V4_INITIAL_VOTING_DELAY = 7200; // 2 hours\nexport const DEFAULT_V4_INITIAL_VOTING_PERIOD = 50400; // 14 hours\nexport const DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD = 0n;\nexport const DEFAULT_V4_YEARLY_MINT_RATE = parseEther('0.02'); // 2% yearly mint rate\n\n// 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 ($7.5k -> $30k), MEDIUM ($50k -> $150k), HIGH ($250k -> $750k)\n// Calculated for 1B token supply, $4500 numeraire (e.g., WETH on Base)\nexport const DEFAULT_MULTICURVE_LOWER_TICKS = [\n -202_100, -183_100, -167_000,\n] as const;\nexport const DEFAULT_MULTICURVE_UPPER_TICKS = [\n -188_200, -172_100, -156_000,\n] as const;\nexport const DEFAULT_MULTICURVE_NUM_POSITIONS = [11, 11, 11] as const;\nexport const DEFAULT_MULTICURVE_MAX_SUPPLY_SHARES = [\n parseEther('0.05'), // 5% for LOW tier\n parseEther('0.125'), // 12.5% for MEDIUM tier\n parseEther('0.2'), // 20% for HIGH tier\n] as const;\n\n// Price bounds\nexport const MIN_SQRT_RATIO = 4295128739n;\nexport const MAX_SQRT_RATIO =\n 1461446703485210103287273052203988822378723970342n;\n\n// Basis points\nexport const BASIS_POINTS = 10000;\n\n// V4 Hook Flags for Doppler\nexport const FLAG_MASK = BigInt(0x3fff);\nexport const DOPPLER_FLAGS = BigInt(\n (1 << 13) | // BEFORE_INITIALIZE_FLAG\n (1 << 12) | // AFTER_INITIALIZE_FLAG\n (1 << 11) | // BEFORE_ADD_LIQUIDITY_FLAG\n (1 << 7) | // BEFORE_SWAP_FLAG\n (1 << 6) | // AFTER_SWAP_FLAG\n (1 << 5), // BEFORE_DONATE_FLAG\n);\n\n// V4 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","/**\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 default '0x60a06040523461057b57604051601f615c0338819003918201601f19168301916001600160401b0383118484101761057f578084926101c09460405283398101031261057b5780516001600160a01b038116810361057b5760208201516040830151906060840151608085015160a08601519061007e60c088016105b3565b9161008b60e089016105b3565b91610100890151946100a06101208b016105b3565b976101408b0151978815988915810361057b576101608d01516101808e01516001600160a01b0381169e919d91908f0361057b576101a001519062ffffff821680920361057b576080525f6101a06100f6610593565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201525f6101a0610154610593565b6001815260016020820152600160408201528260608201528260808201528260a0820152600160c0820152600160e082015260016101008201528261012082015282610140820152826101608201528261018082015201526120003016151560011480159061056a575b8015610559575b801561054c575b801561053f575b8015610532575b8015610522575b8015610512575b8015610502575b80156104f6575b80156104ea575b80156104de575b80156104d2575b80156104c6575b6104b35762ffffff1960165416176016558442116104a4578660020b8860020b91818303610463575b5050508484101561045457838503858111610440578a60020b5f811380159061042b575b61041c578915610408578982066103f9578c156103eb57600f8d116103eb578484116103dc5761029861029d928b81046017558b6105c1565b610658565b628000008110156103cf5762ffffff19601854169062ffffff1617601855600d55600e55600f5560105560115562ffffff6012549160181b65ffffff0000001692169065ffffffffffff1916171760125560135562ffffff63ff000000601454921560181b1692169063ffffffff1916171760145560155560018060a01b0319600c541617600c5560405161552f90816106d48239608051818181601c01528181610205015281816102a80152818161045c0152818161050c0152818161098701528181610a1e01528181610af501528181610b9201528181610c5a01528181610e8301528181610f3a0152818161103d015281816110b201528181611d2c01528181611de40152818161217801528181613b8301528181613c4d01528181613fe9015281816140f40152614be40152f35b6335278d125f526004601cfd5b638cc99b7b60e01b5f5260045ffd5b6287e39960e61b5f5260045ffd5b6388ac089760e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6312469eb560e11b5f5260045ffd5b5061043a81610298848d6105c1565b1561025f565b634e487b7160e01b5f52601160045260245ffd5b63536a71af60e01b5f5260045ffd5b8061049b575b610483578a9182610491575b5050610483575f808061023b565b6264847d60e41b5f5260045ffd5b1390505f80610475565b50808212610469565b632ca4094f60e21b5f5260045ffd5b630732d7b560e51b5f523060045260245ffd5b50600130161515610212565b5060023016151561020b565b50600430161515610204565b506008301615156101fd565b506010301615156101f6565b50602030161515600114156101ef565b50604030161515600114156101e8565b50608030161515600114156101e1565b50610100301615156101da565b50610200301615156101d3565b50610400301615156101cc565b5061080030161515600114156101c5565b5061100030161515600114156101be565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051906101c082016001600160401b0381118382101761057f57604052565b51908160020b820361057b57565b90670de0b6b3a76400008202905f19670de0b6b3a764000084099282808510940393808503948584111561057b571461065157670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b808202905f1983820990828083109203918083039283670de0b6b3a7640000111561057b57146106c2577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a76400009150049056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b6393c866c160e01b5f5260045ffd5b5f905f3560e01c908163182148ef146111155750806318cb1700146110f357806321d0ee701461109f578063259982e51461102a578063392e53cd1461100857806339518b5e14610feb578063514ea4bf14610f96578063575e24b414610ee357806357d775f814610ec65780636c2bbe7e14610e705780636c47a6c314610e535780636fe7e6eb14610c19578063897479cb14610bfb57806390ebab0a14610bdd57806391dd734614610b5e5780639ce110d714610b355780639f063efc14610ade578063a4dee15514610ab9578063b137392914610a98578063b356603014610a74578063b47b2fb1146109c6578063b6a8b0fa14610970578063c19d93fb14610921578063c4e833ce146107b6578063c70dfb4f14610795578063ce5494bb146104cb578063d0c52e21146104a9578063d65b4cb91461048b578063dc4c90d314610446578063dc98354e14610276578063dcf93f3214610250578063e1b4af69146101ee5763ee4644300361000f57346101eb57806003193601126101eb576020600d54604051908152f35b80fd5b50346101eb57600490610200366112dc565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303925061024491505057630a85dc2960e01b8152fd5b63570c108560e11b8152fd5b50346101eb57806003193601126101eb57602060ff60145460181c166040519015158152f35b50346101eb5760e03660031901126101eb5761029061116b565b5060a03660231901126101eb576102a561128e565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036104375760085460ff81166104295760ff19166001176008556001600160a01b03602435908116908181036104255750600980546001600160a01b0319169190911790556044356001600160a01b038116908181036104255750600a80546001600160a01b03191691909117905560643562ffffff8116810361042157600a5461035a612061565b60b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b19161717600a5560a43560018060a01b03811680910361042157600b80546001600160a01b031916919091179055601e6103b5612061565b60020b136104125760145460020b6103cb612061565b60020b9081156103fe570760020b6103ef57604051636e4c1aa760e11b8152602090f35b6312469eb560e11b8152600490fd5b634e487b7160e01b83526012600452602483fd5b63013840ad60e51b8152600490fd5b5080fd5b8280fd5b62dc149f60e41b8252600482fd5b63570c108560e11b8152600490fd5b50346101eb57806003193601126101eb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101eb57806003193601126101eb576020600f54604051908152f35b50346101eb57806003193601126101eb5760ff60209154166040519015158152f35b50346101eb5760203660031901126101eb576104e561116b565b600c546001600160a01b031633036107865760ff825460081c161580610765575b610756577f000000000000000000000000000000000000000000000000000000000000000061059d8361057561058360405161054181611333565b610549611f3d565b815260018060a01b03871660208201528360408201526001606082015260405192839160208301611f8a565b03601f1981018352826113b4565b604051809381926348c8949160e01b8352600483016112b2565b0381836001600160a01b0387165af190811561074b57916105d785926105e2959460e09791610729575b50602080825183010191016114d8565b600695919554613282565b9161064160018060a01b0360095416926106306105fe856145cf565b948761061f8761061760018060a01b03600a54166145cf565b9a8b94614611565b600a546001600160a01b0316614611565b60a061063a611f3d565b2090614754565b5050600954600a5492976001600160a01b039182169791909316946106879250610678906001600160801b03608086901d16611472565b926001600160801b0316611472565b906001600160801b0381111561071a57506001600160801b03915b506001600160801b0381111561070b57506001600160801b03935b604080516001600160a01b0397909716875260208701919091526001600160801b03608085811d821692880192909252918216606087015285019190915290811660a08401521660c0820152f35b6001600160801b0316936106bd565b6001600160801b0316916106a2565b61074591503d8086833e61073d81836113b4565b810190611fcb565b5f6105c7565b6040513d86823e3d90fd5b63051a2a5560e51b8252600482fd5b50600454600e5411158061077a575b15610506565b50601154421015610774565b638341a67960e01b8252600482fd5b50346101eb57806003193601126101eb57602060125460020b604051908152f35b50346101eb57806003193601126101eb576020816101c0926101a06040516107dd81611362565b82815282858201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201528060405161083b81611362565b60018152838101600181526040820160018152606083018481526080840185815260a0850186815260c08601906001825260e087019260018452610100880194600186526101208901968a88526101408a01988b8a526101a06101608c019b8d8d5261018081019d8e52019c8d526040519d8e916001835251151591015251151560408d015251151560608c015251151560808b015251151560a08a015251151560c089015251151560e08801525115156101008701525115156101208601525115156101408501525115156101608401525115156101808301525115156101a0820152f35b50346101eb57806003193601126101eb5760c064ffffffffff600154166002546003546004546005549160065493604051958652602086015260408501526060840152608083015260a0820152f35b50346101eb57600490610982366112dc565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506102449150505763567d91d160e01b8152fd5b50346101eb576101603660031901126101eb576109e161116b565b5060a03660231901126101eb5760603660c31901126101eb57610144356001600160401b03811161042157610a1a903690600401611195565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610437576040610a5a610124356140d7565b82516001600160e01b03199092168252600f0b6020820152f35b50346101eb57806003193601126101eb57602060125460181c60020b604051908152f35b50346101eb57806003193601126101eb57602060145460020b604051908152f35b50346101eb57806003193601126101eb5760ff6020915460081c166040519015158152f35b50346101eb57600490610af036611225565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506102449250505057630a85dc2960e01b8152fd5b50346101eb57806003193601126101eb57600c546040516001600160a01b039091168152602090f35b50346101eb5760203660031901126101eb576004356001600160401b03811161042157610b8f903690600401611195565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361043757610bd9610bcd848461168f565b604051918291826112b2565b0390f35b50346101eb57806003193601126101eb576020601554604051908152f35b50346101eb57806003193601126101eb576020600e54604051908152f35b5034610e4057610100366003190112610e4057610c3461116b565b60a0366023190112610e4057610c4861128e565b5060e435908160020b809203610e40577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169133839003610e445762ffffff6016541691833b15610e4057604051635275965160e01b815292602435906001600160a01b038216808303610e40576004860152604435946001600160a01b038616808703610e4057602482015260643562ffffff8116808203610e40576044830152608435918260020b808403610e4057606482015260a435936001600160a01b038516808603610e4057608483015260a48201525f8160c481838d5af18015610e3557610e07575b509488979461057594610da6948a9994610dc29960405196610d5a88611333565b60405194610d678661137e565b85526020850152604084015260608301526080820152835260018060a01b03166020830152604082015285606082015260405192839160208301611f8a565b6040519485809481936348c8949160e01b8352600483016112b2565b03925af18015610dfc57610de3575b604051636fe7e6eb60e01b8152602090f35b610df6913d8091833e61073d81836113b4565b5f610dd1565b6040513d84823e3d90fd5b610da69399509461057594610e245f610dc299949a959b986113b4565b5f9a94509450949791969095610d39565b6040513d5f823e3d90fd5b5f80fd5b63570c108560e11b5f5260045ffd5b34610e40575f366003190112610e40576020601154604051908152f35b34610e4057610e7e36611225565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039350610e449250505057630a85dc2960e01b5f5260045ffd5b34610e40575f366003190112610e40576020601354604051908152f35b34610e4057610140366003190112610e4057610efd61116b565b5060a0366023190112610e405760603660c3190112610e4057610124356001600160401b038111610e4057610f36903690600401611195565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610e4457606062ffffff610f766120bd565b906040939293519363ffffffff60e01b1684526020840152166040820152f35b34610e40576020366003190112610e40576004355f526007602052608060405f205460ff604051918060020b83528060181c60020b6020840152600180851b038160301c16604084015260b01c166060820152f35b34610e40575f366003190112610e40576020601054604051908152f35b34610e40575f366003190112610e4057602060ff600854166040519015158152f35b34610e4057611038366111c2565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039050610e4457306001600160a01b03909116036110905760405163259982e560e01b8152602090f35b636d1ed89b60e01b5f5260045ffd5b34610e40576110ad366111c2565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039150610e44905057630a85dc2960e01b5f5260045ffd5b34610e40575f366003190112610e4057602062ffffff60165416604051908152f35b34610e40575f366003190112610e4057600954600a54600b546001600160a01b039283168452818316602085015260a082811c62ffffff16604086015260b89290921c60020b6060850152909116608083015290f35b600435906001600160a01b0382168203610e4057565b35906001600160a01b0382168203610e4057565b9181601f84011215610e40578235916001600160401b038311610e405760208381860195010111610e4057565b90610160600319830112610e40576004356001600160a01b0381168103610e40579160a0602319820112610e4057602491608060c319830112610e405760c49161014435906001600160401b038211610e405761122191600401611195565b9091565b906101a0600319830112610e40576004356001600160a01b0381168103610e40579160a0602319820112610e4057602491608060c319830112610e405760c4916101443591610164359161018435906001600160401b038211610e405761122191600401611195565b60c435906001600160a01b0382168203610e4057565b35908160020b8203610e4057565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b610120600319820112610e40576004356001600160a01b0381168103610e40579160a0602319830112610e405760249160c4359160e4359161010435906001600160401b038211610e405761122191600401611195565b608081019081106001600160401b0382111761134e57604052565b634e487b7160e01b5f52604160045260245ffd5b6101c081019081106001600160401b0382111761134e57604052565b60a081019081106001600160401b0382111761134e57604052565b606081019081106001600160401b0382111761134e57604052565b601f909101601f19168101906001600160401b0382119082101761134e57604052565b359062ffffff82168203610e4057565b91908260a0910312610e40576040516113ff8161137e565b608061144b81839561141081611181565b855261141e60208201611181565b602086015261142f604082016113d7565b6040860152611440606082016112a4565b606086015201611181565b910152565b600201908160021161145e57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161145e57565b9060405161148c81611333565b9154600281810b8452601882901c900b6020840152603081901c6001600160801b0316604084015260b01c60ff166060830152565b600f0b60016001607f1b0319811461145e575f0390565b9190826040910312610e40576020825192015190565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b9061016092611542836060936114ee565b805160020b60a0840152602081015160020b60c0840152604081015160e084015201516101008201526101406101208201525f6101408201520190565b6001600160a01b03918216815291166020820152604081019190915260600190565b9190820391821161145e57565b6001600160401b03811161134e5760051b60200190565b906115cf826115ae565b6115dc60405191826113b4565b82815280926115ed601f19916115ae565b01905f5b8281106115fd57505050565b60209060405161160c81611333565b5f81525f838201525f60408201525f6060820152828285010152016115f1565b8051156116395760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156116395760400190565b80518210156116395760209160051b010190565b9081549060181b65ffffff000000169065ffffff0000001916179055565b919082015f61010084830312610e40576116b5604051926116af84611333565b856113e7565b938483526116c560a08201611181565b80602085015260e06116d960c084016112a4565b92836040870152013580151594858203610e40576060015260018060a01b03169060020b92611c4e5750600164ffffffffff1981541617600155606084019261173c845160020b61173761172c85614ef6565b60125460020b61209f565b614f2e565b6014549060ff8260181c165f14611c3b5761175a9160020b9061209f565b945b61176584613378565b61176e85613378565b956040519561177c87611399565b808752602087018181526118d8604089019a888c526118d0600d54956117a06136a5565b956118088c6118036117fa6117db6117d26117c96117c46117bf61480d565b614ea2565b6136c3565b60135490614e80565b60105490614ebe565b6117f46117eb60105480936115a1565b916011546115a1565b90615033565b600d5490615113565b6136d4565b8c929083811315611c2c5761186b9293508981115f14611c275750885b928d60185460020b835160020b8082135f14611c1f5750905b50818a5260145460181c60ff1615611c105761185f9150895160020b61209f565b905b5160020b90614f2e565b60020b60208701525b855160020b966020870197885160020b14155f14611c055760ff60145460181c166118c5836118a68a5160020b613378565b8b516001600160801b039491906118bf9060020b613378565b91614fcc565b1660408801526115a1565b90848861374b565b996118eb6118e68c51611450565b6115c5565b985160020b915160020b9060018060801b03905116906040519261190e84611333565b8352602083015260408201526001606082015261192a8861162c565b526119348761162c565b50805160020b915160020b90604060018060801b0391015116906040519261195b84611333565b835260208301526040820152600260608201526119778661164d565b526119818561164d565b50835b8751811015611a3457611997818961165d565b515160020b60206119a8838b61165d565b51015160020b6001600160801b0360406119c2858d61165d565b51015116836003019182600311611a2057611a1992600195949260ff92604051946119ec86611333565b855260208501526040840152166060820152611a0783611450565b90611a12828b61165d565b528861165d565b5001611984565b634e487b7160e01b89526011600452602489fd5b50611a429293969585613a82565b611a4b8261162c565b516001855260076020526040852090805162ffffff198354169062ffffff16178255611a7e602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055611ac58261164d565b516002855260076020526040852090805162ffffff198354169062ffffff16178255611af8602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055835b8351811015611be557611b53611b4d82611450565b8461165d565b518160030180600311611bd1579060019291875260076020526040872090805162ffffff198354169062ffffff16178255611b95602082015160020b83611671565b604081015190825490606060ff60b01b91015160b01b16918560301b8660b01b039060301b16908560301b8660b81b0319161717905501611b38565b634e487b7160e01b87526011600452602487fd5b509291505060405190611bf96020836113b4565b81525f36602083013790565b8b60408801526115a1565b611c199161335b565b90611861565b90509061183e565b611825565b50508087526020870152611874565b611c489160020b9061335b565b9461175c565b925f9250829160015b6015546003018060031161145e57811015611ddc57805f526007602052611c8060405f2061147f565b60408101516001600160801b031680611c9e575b5050600101611c57565b611d279160409160ff6014999598995460181c1691825f14611dce57805160020b925b15611db95760ff6060611ce3611cde602085015160020b95613263565b6114c1565b9201511691845193611cf485611333565b60020b845260020b6020840152600f0b838301526060820152815180938192632d35e7ed60e11b83528c60048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192611d7e925f905f92611d86575b50611d789192613282565b96613282565b93905f611c94565b611d789250611dac915060403d8111611db2575b611da481836113b4565b8101906114d8565b91611d6d565b503d611d9a565b60ff6060611ce3611cde845160020b95613263565b602081015160020b92611cc1565b5091929390947f000000000000000000000000000000000000000000000000000000000000000091611e1860018060a01b0383511630856132c4565b926020830192611e3260018060a01b0385511630846132c4565b945f8113611ed6575b5050848413611e6a575b5050505050604051916020830152604082015260408152611e676060826113b4565b90565b91516001600160a01b039283169216823b15611ed25791611ea6939185809460405196879586948593630b0d9c0960e01b85526004850161157f565b03925af18015610dfc57611ebd575b808080611e45565b611ec88280926113b4565b6101eb5780611eb5565b8480fd5b90516001600160a01b0383811692911690823b15610e4057611f1392855f809460405196879586948593630b0d9c0960e01b85526004850161157f565b03925af18015610e3557611f28575b80611e3b565b611f359195505f906113b4565b5f935f611f22565b60405190611f4a8261137e565b6009546001600160a01b039081168352600a54808216602085015260a081901c62ffffff16604085015260b81c60020b6060840152600b54166080830152565b91909160e06060610100830194611fa28482516114ee565b60208101516001600160a01b031660a0850152604081015160020b60c085015201511515910152565b602081830312610e40578051906001600160401b038211610e40570181601f82011215610e40578051906001600160401b03821161134e576040519261201b601f8401601f1916602001856113b4565b82845260208383010111610e4057815f9260208093018386015e8301015290565b600f91820b910b019060016001607f1b0319821260016001607f1b0383131761145e57565b6084358060020b8103610e405790565b60020b627fffff19811461145e575f0390565b60020b60010190627fffff8213627fffff1983121761145e57565b9060020b9060020b0190627fffff198212627fffff83131761145e57565b5f80549160ff8360081c16613254576010544210613245576120dd61480d565b64ffffffffff600154161015613234575f9260115442101580613229575b612e7e575b509060ff5f5416155f14612e105761211661480d565b9060015461212b64ffffffffff8216846115a1565b64ffffffffff1990911664ffffffffff84161760015560035460025f526007602052946121645f8051602061550383398151915261147f565b9461219c60a06121753660246113e7565b207f0000000000000000000000000000000000000000000000000000000000000000614754565b505050946121a986614841565b608435978860020b90818a14159283610e40578a6121c691614f2e565b905f916121d68d600554906136d4565b5f198a0194908a861161145e575f8f966121f26121f791613a72565b614fac565b80971115911280612e09575b15612cac575050506122249192505160020b9161221e615332565b90614ebe565b955b60018111612c165750612262908a60055561225c670de0b6b3a764000061224f89600254614ebe565b9880612c0d575b05614ef6565b9061209f565b90612c09578761227191614f2e565b9061228d8861173761172c670de0b6b3a76400005f9905614ef6565b9760145460ff8160181c165f14612bf6576122ab9060020b8a61209f565b955b8960ff60145460181c16809b811580612be6575b15612baa57505050612ba6576122d7908361209f565b945b6122e283613378565b986122ec87613378565b908b15612b9d5715612aea5760016123058c8c84615420565b91818060a01b038c1690828060a01b0316038060ff1d9081011891818060801b031661233183826150ca565b928260601b9109151516015b975b60155461234e6118e682611450565b9060018a52600760205261236460408b2061147f565b61236d8361162c565b526123778261162c565b5060028a52600760205261238d60408b2061147f565b6123968361164d565b526123a08261164d565b50895b818110612aa25750506123c1906123bb3660246113e7565b90614afa565b5060145460181c60ff1699908a156129fc576044356001600160a01b03811681036129f857612402906123f3906145cf565b6001600160801b038316611472565b6006549061241a906001600160801b038316906115a1565b916024356001600160a01b03811681036129f4579e6118e69f936124728e969461245d8c9561244b89879a506145cf565b9060801d6001600160801b0316611472565b60809190911d6001600160801b0316906115a1565b9e5b61247f3660246113e7565b906124886136a5565b958361299457505050505060020b80825260208201528260408201525b604081018051909c6125ab916125a391612591916001600160801b031615612985575b6124d33660246113e7565b906124fa6124df6136a5565b976118036117fa6117db6117d26117c96117c46117bf61480d565b88808213156129715750818111156129685750612555815b928d606060185460020b920191825160020b8082135f146129605750905b60020b90818b5260ff60145460181c165f14611c105761185f91508a5160020b61209f565b60020b60208801525b865160020b976020880198895160020b14155f14612956575060ff60145460181c166118c5836118a68a5160020b613378565b878561259e3660246113e7565b61374b565b9e8f51611450565b9b6020825160020b92015160020b9060018060801b0390511690604051926125d284611333565b835260208301526040820152600160608201526125ee8c61162c565b526125f88b61162c565b50805160020b915160020b90604060018060801b0391015116906040519261261f84611333565b8352602083015260408201526002606082015261263b8a61164d565b526126458961164d565b50875b8b518110156126f9578b602061266d83612662818561165d565b515160020b9361165d565b51015160020b8d60406126878560018060801b039361165d565b510151168360030191826003116126e5579260ff6126de938f9360019796604051946126b286611333565b8552602085015260408401521660608201526126d76126d085611450565b809361165d565b528c61165d565b5001612648565b634e487b7160e01b8d52601160045260248dfd5b50612719919293949596999a979a6127123660246113e7565b918a613a82565b6127228761162c565b5160018a52600760205260408a2090805162ffffff198354169062ffffff16178255612755602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b1617905561279c8761164d565b5160028a52600760205260408a2090805162ffffff198354169062ffffff161782556127cf602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055885b6015548110156128fc578651811061285957806003018060031161284557906001918b5260076020528a60408120555b0161280f565b634e487b7160e01b8b52601160045260248bfd5b61286b61286582611450565b8961165d565b5181600301806003116128e85790600192918c52600760205260408c2090805162ffffff198354169062ffffff161782556128ad602082015160020b83611671565b604081015190825490606060ff60b01b91015160b01b16918560301b8660b01b039060301b16908560301b8660b81b0319161717905561283f565b634e487b7160e01b8c52601160045260248cfd5b5090919295507f223157ec47d7bd04fa3ed10c0a8adb38faf97b51ec856a777425a2e39253bd739450608093966040519360020b845260020b602084015260020b60408301526060820152a15b6315d7892d60e21b929190565b60408801526115a1565b905090612530565b61255590612512565b9250508b60020b808852602088015261255e565b602085015160020b85526124c8565b838111156129ad5750506129a89450614ca4565b6124a5565b92509350506129e991508c60020b84528960020b60208501526129cf8d613378565b6001600160801b0393906129e28c613378565b9115614fcc565b1660408201526124a5565b8c80fd5b8a80fd5b6024356001600160a01b03811681036129f857612a2f90612a1c906145cf565b608083901d6001600160801b0316611472565b60065490612a4b90608083901d6001600160801b0316906115a1565b916044356001600160a01b03811681036129f4579e6118e69f93612a9c8e9694612a8b8c95612a7c89879a506145cf565b906001600160801b0316611472565b6001600160801b03909116906115a1565b9e612474565b80600301806003116128e857906001918c526007602052612ae360408d20612ad2612acc84611450565b9161147f565b612adc828861165d565b528561165d565b50016123a3565b612af58b8b836153dd565b8a826001600160a01b0380831690821611612b92575b506001600160a01b038316918215612b865760601b600160601b600160e01b0316926001600160a01b03828116929190910316612b4982828661527d565b938215612b725709612b63575b808206151591040161233d565b906001019081612b56575b8880fd5b634e487b7160e01b8c52601260045260248cfd5b62bfc9218b526004601cfd5b8c935090505f612b0b565b5050869761233f565b8680fd5b91989392509081612bd5575b50612bc2575b506122d9565b612bce9196508361335b565b945f612bbc565b905060020b8460020b13155f612bb6565b508060020b8760020b12156122c1565b612c039060020b8a61335b565b956122ad565b8580fd5b89600255612256565b612c1f906136ec565b5f198101818111611a20576121f2612c3691613a72565b808c10612c44575b50612226565b612c59612c52989298615332565b918d615033565b670de0b6b3a76400000390670de0b6b3a76400008211612c9857612c8a612c919392670de0b6b3a764000092614e80565b0590614ebe565b955f612c3e565b634e487b7160e01b8a52601160045260248afd5b9192909115612d0957505083612b6e578a612cc691614f2e565b91612cd2612c52615332565b670de0b6b3a76400000390670de0b6b3a76400008211612c9857612c8a612d039392670de0b6b3a764000092614e80565b95612226565b93509350975050612d2f60125460020b670de0b6b3a76400006002540560020b9061209f565b60185460020b5f9381135f14612dfe57905b6014549260ff8460181c1692835f14612deb57612d61915160020b61209f565b915b829985610e4057612db394612d7b8e612dab96614f2e565b938315612dd857612d8f9160020b9061209f565b915b15612dc3578160020b8160020b135f14612dbc575061335b565b60020b614e5c565b955f9695612226565b905061335b565b8160020b8160020b125f14612dbc575061335b565b612de59160020b9061335b565b91612d91565b612df8915160020b61335b565b91612d63565b505f92508990612d41565b5080612203565b915060ff60145460181c168080612e67575b8115612e47575b50612e38576240000090612949565b63016ccb0760e01b5f5260045ffd5b90501580612e56575b5f612e29565b5060c4358015158114612e50575f80fd5b905060c43580159081158103610e40575090612e22565b600454600e54111561321a5760019060ff1916175f557fe8775e4a58023f399765c3455b45eebcc45ad6b99607a1163f02e1318430970c5f80a1612ed3612ecb60a06121753660246113e7565b505050614841565b601554612ee26118e682611450565b60015f52600760205290612f025f805160206154e383398151915261147f565b612f0b8361162c565b52612f158261162c565b5060025f526007602052612f355f8051602061550383398151915261147f565b612f3e8361164d565b52612f488261164d565b505f5b8181106131e9575050612f63906123bb3660246113e7565b5060145460181c60ff1690811561319e576044356001600160a01b0381168103610e4057612fce918491612fb8906001600160801b0390612fa3906145cf565b16600f0b60018060801b0392600f0b9061203c565b165b60035490612fc93660246113e7565b614ca4565b90604080519290612fdf81856113b4565b60018452601f19015f5b81811061316f575050805160020b6020820191825160020b90604060018060801b0391015116906040519261301d84611333565b835260208301526040820152600160608201526130398461162c565b526130438361162c565b505160020b901561314657608435928360020b8403610e405761308061307a613075613093948761309898509061209f565b613378565b91613378565b9061308c3660246113e7565b9184613a82565b61162c565b5160015f52600760205260405f2090805162ffffff198354169062ffffff161782556130cb602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b161790555f5b6015546001810180911161145e5781101561313f578061312c600192611450565b5f5260076020525f60408120550161310b565b505f612100565b608435928360020b8403610e405761308061307a6130756130939461225c886130989950612071565b60209060405161317e81611333565b5f81525f838201525f60408201525f606082015282828801015201612fe9565b6024356001600160a01b0381168103610e4057612fce9184916131e3906001600160801b03906131cd906145cf565b6001600160801b039360801d9116600f0b61203c565b16612fba565b80600301908160031161145e576001915f52600760205261321360405f20612ad2612acc84611450565b5001612f4b565b631ed9bcf960e01b5f5260045ffd5b5060ff8116156120fb565b6315d7892d60e21b92505f91508190565b630fc95b4360e01b5f5260045ffd5b636fce6c3960e01b5f5260045ffd5b6001607f1b81101561327557600f0b90565b6335278d125f526004601cfd5b6132a5906132978360801d8260801d01614ed9565b92600f0b90600f0b01614ed9565b60018060801b03169060801b1790565b90816020910312610e40575190565b6001600160a01b039182165f9081529282166020908152604093849020935163789add5560e11b815260048101949094529183916024918391165afa908115610e35575f91613311575090565b90506020813d602011613338575b8161332c602093836113b4565b81010312610e40575190565b3d915061331f565b60020b5f190190627fffff198212627fffff83131761145e57565b600291820b910b0390627fffff198212627fffff83131761145e57565b60020b908160ff1d82810118620d89e881116136925763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b189160028116613676575b6004811661365a575b6008811661363e575b60108116613622575b60208116613606575b604081166135ea575b608081166135ce575b61010081166135b2575b6102008116613596575b610400811661357a575b610800811661355e575b6110008116613542575b6120008116613526575b614000811661350a575b61800081166134ee575b6201000081166134d2575b6202000081166134b7575b62040000811661349c575b6208000016613483575b5f1261347b575b0160201c90565b5f1904613474565b6b048a170391f7dc42444e8fa290910260801c9061346d565b6d2216e584f5fa1ea926041bedfe9890920260801c91613463565b916e5d6af8dedb81196699c329225ee6040260801c91613458565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c9161344d565b916f31be135f97d08fd981231505542fcfa60260801c91613442565b916f70d869a156d2a1b890bb3df62baf32f70260801c91613438565b916fa9f746462d870fdf8a65dc1f90e061e50260801c9161342e565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91613424565b916fe7159475a2c29b7443b29c7fa6e889d90260801c9161341a565b916ff3392b0822b70005940c7a398e4b70f30260801c91613410565b916ff987a7253ac413176f2b074cf7815e540260801c91613406565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c916133fc565b916ffe5dee046a99a2a811c461f1969c30530260801c916133f2565b916fff2ea16466c96a3843ec78b326b528610260801c916133e9565b916fff973b41fa98c081472e6896dfb254c00260801c916133e0565b916fffcb9843d60f6159c9db58835c9266440260801c916133d7565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c916133ce565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c916133c5565b916ffff97272373d413259a46990580e213a0260801c916133bc565b826345c3193d60e11b5f5260045260245ffd5b604051906136b282611399565b5f6040838281528260208201520152565b905f19820191821360011661145e57565b81810392915f13801582851316918412161761145e57565b801561145e575f190190565b60020b9060020b90811561371a57627fffff1981145f1983141661145e570590565b634e487b7160e01b5f52601260045260245ffd5b8181029291811591840414171561145e57565b811561371a570490565b9291909161375761480d565b613764601354809261372e565b906137726010548093611472565b9060115492838311613a46575b61378761480d565b6001810180911161145e576137a49261379f9161372e565b611472565b91808311613a3e575b50808214613a01576137e06137cf6137e6936117f46117eb60105480936115a1565b916117f46117eb60105480936115a1565b906115a1565b936015549384805b6139c0575b5061380a6020613814920194855160020b9061335b565b8560020b906136f8565b918461384b60ff60145460181c1694855f1461398657606085015160020b90818160020b125f1461397f57505b97600d5490615113565b9180613857838561372e565b1161396f575050925b5160020b9461386e856115ae565b9561387c60405197886113b4565b858752601f1961388b876115ae565b015f5b8181106139585750505f905b8682106138ab575050505050505090565b6138b5828961165d565b519060020b905260016138e76138d9846138cf858c61165d565b515160020b61209f565b606086015160020b90614f2e565b9160206138f4828b61165d565b51018360020b9052613939878a613932602061392786613921613917828761165d565b515160020b613378565b9461165d565b51015160020b613378565b9089614fcc565b6040613945838c61165d565b510190838060801b03169052019061389a565b6020906139636136a5565b82828c0101520161388e565b6139799250613741565b92613860565b9050613841565b60608501613997815160020b612071565b60020b8260020b125f146139ad57505b976117fa565b6139bb91505160020b612071565b6139a7565b945f19860186811161145e576139d590615001565b6139de87615001565b036139fb576139ef6139f5916136ec565b956136ec565b806137ee565b946137f3565b505050505050604051613a156020826113b4565b5f81525f805b818110613a2757505090565b602090613a326136a5565b82828601015201613a1b565b91505f6137ad565b83925061377f565b805115158252602080820151908301526040908101516001600160a01b0316910152565b600160ff1b811461145e575f0390565b9392916001600160a01b039182169116818103613f83575b50505f915f5b8451811015613c0d576001600160801b036040613abd838861165d565b51015116613ace575b600101613aa0565b613b7e90604060ff60145460181c16805f14613bf557613aee838961165d565b515160020b905b15613be1576020613b06848a61165d565b51015160020b5b613b2c6001600160801b0384613b23878d61165d565b51015116613263565b60ff6060613b3a878d61165d565b5101511691845193613b4b85611333565b60020b845260020b6020840152600f0b838301526060820152815180948192632d35e7ed60e11b83528860048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192613bc4575b509050613ac6565b613bdb9060403d8111611db257611da481836113b4565b50613bbc565b613beb838961165d565b515160020b613b0d565b6020613c01848a61165d565b51015160020b90613af5565b509190928051905f19820191821161145e57602091613c2b9161165d565b5101516018549060181b65ffffff000000169065ffffff0000001916176018557f0000000000000000000000000000000000000000000000000000000000000000613c8060018060a01b0385511630836132c4565b906020850194613c9a60018060a01b0387511630846132c4565b925f8113613f1c575b848413613ea7575b848112613db4575b5050828212613cc4575b5050509050565b84516001600160a01b039081169591169190823b15613db05760405195632961046560e21b87526004870152838660248183875af195861561074b57849596613d93575b505160209291613d2d916001600160a01b0316908390613d2790613a72565b91614611565b600460405180958193630476982d60e21b83525af1908115613d875750613d58575b80808392613cbd565b613d799060203d602011613d80575b613d7181836113b4565b8101906132b5565b505f613d4f565b503d613d67565b604051903d90823e3d90fd5b84613da29195929394956113b4565b613db057908392915f613d08565b8380fd5b81516001600160a01b03848116939116833b15612ba65760405190632961046560e21b82526004820152868160248183885af18015613e9c57908791613e87575b505080516001600160a01b031680613e73575b50516001600160a01b0316613e6957613e22602091613a72565b915b600460405180948193630476982d60e21b83525af1801561074b57613e4a575b80613cb3565b613e629060203d602011613d8057613d7181836113b4565b505f613e44565b5060208491613e24565b613e819084613d2785613a72565b5f613e08565b81613e91916113b4565b612c0957855f613df5565b6040513d89823e3d90fd5b86516001600160a01b038481169116813b15612ba65785613ee392889283604051809681958294630b0d9c0960e01b845230906004850161157f565b03925af18015613f1157908691613efc575b5050613cab565b81613f06916113b4565b611ed257845f613ef5565b6040513d88823e3d90fd5b81516001600160a01b03908116908416803b15610e4057825f91613f599383604051809681958294630b0d9c0960e01b845230906004850161157f565b03925af18015610e3557613f6e575b50613ca3565b613f7b9195505f906113b4565b5f935f613f68565b60405191613f9083611399565b81108252600160208301526040820152613fc860405191633cf3645360e21b8352613fbe60048401856114ee565b60a4830190613a4e565b6101206101048201525f610124820152602081610144815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610e355761401c575b80613a9a565b6140349060203d602011613d8057613d7181836113b4565b505f614016565b6101409290916140c391906001600160a01b0361405782611181565b1684526001600160a01b0361406e60208301611181565b16602085015262ffffff614084604083016113d7565b166040850152614096606082016112a4565b60020b60608501526001600160a01b03906140b390608001611181565b16608084015260a0830190613a4e565b6101206101008201525f6101208201520190565b60ff5f54166145c1576141299060a06140f13660246113e7565b207f00000000000000000000000000000000000000000000000000000000000000009061411e8183614754565b949290969150614841565b60145460181c60ff1680156145ae5760185460181c60020b8260020b135b60015f5260076020525f805160206154e38339815191525460020b9082156145a257818460020b12905b156144c05750505050906141ea91602060ff60145460181c16805f146144ac576141a561307560185460181c60020b612084565b604051916141b283611399565b151582526001838301526001600160a01b031660408083019190915251633cf3645360e21b815294859182919060246004840161403b565b03815f6001600160a01b0386165af18015610e3557614479575b61420e9250614754565b50509050925b60c435908115158203610e405762ffffff91610fff9182911561447057165b169116620f42408183020491010360ff60145460181c165f146143c757608082901d5f600f82900b1261438257600354614276916001600160801b031690611472565b6003555b600f82900b5f81126143285750505f805160206154c3833981519152916142ad60609260018060801b03166004546115a1565b6004555b600454600f548110156142e4575b600354906040519260020b835260208301526040820152a163b47b2fb160e01b905f90565b61010061ff00195f5416175f557f628a470bfdde264ef77cd19acfbfca22b3e4413adaf5837ec9fbc0043e35793f602061431c61480d565b604051908152a16142bf565b62ffffff919250614338906114c1565b9116620f42400391620f4240831161145e575f805160206154c38339815191529260609261437a91614372916001600160801b031661518e565b600454611472565b6004556142b1565b61438b906114c1565b62ffffff8216620f42400390620f4240821161145e576143bf916143b7916001600160801b031661518e565b6003546115a1565b60035561427a565b90600f81900b5f811261443357506003546143ec906001600160801b03831690611472565b6003555b60801d905f600f83900b1261442557505f805160206154c38339815191529161437a60609260018060801b03166004546115a1565b9061433862ffffff916114c1565b61443c906114c1565b62ffffff8316620f42400390620f4240821161145e57614468916143b7916001600160801b031661518e565b6003556143f0565b600c1c16614233565b6020833d6020116144a4575b81614492602093836113b4565b81010312610e405761420e9250614204565b3d9150614485565b6141a561307560185460181c60020b613340565b97949392976144d3575b50505050614214565b614534949750906144f0602092825f146145995761307590613340565b604051916144fd83611399565b1582526001838301526001600160a01b031660408083019190915251633cf3645360e21b815294859182919060246004840161403b565b03815f6001600160a01b0386165af18015610e3557614566575b6145589250614754565b50509050925f8080806144ca565b6020833d602011614591575b8161457f602093836113b4565b81010312610e4057614558925061454e565b3d9150614572565b61307590612084565b818460020b1390614171565b60185460181c60020b8260020b12614147565b5063b47b2fb160e01b905f90565b6001600160a01b0316806145e257504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115610e35575f91613311575090565b9091906001600160a01b038116908161469f5750505f80808093855af1156146365750565b6040516390bfb86560e01b81526001600160a01b0390911660048201525f602482018190526080604483015260a03d601f01601f191690810160648401523d6084840152903d9060a484013e808201600460a482015260c4633d2cec6f60e21b91015260e40190fd5b60205f604481949682604095865198899363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d116001855114161716928281528260208201520152156146f05750565b6040516390bfb86560e01b8152600481019190915263a9059cbb60e01b602482015260806044820152601f3d01601f191660a0810160648301523d60848301523d5f60a484013e808201600460a482015260c4633c9fd93960e21b91015260e40190fd5b919060209060405182810191825260066040820152604081526147786060826113b4565b519020604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa918215610e35575f926147d9575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d602011614805575b816147f5602093836113b4565b81010312610e405751905f6147b1565b3d91506147e8565b60105480421061483b5761482461482d91426115a1565b60135490613741565b6001810180911161145e5790565b50600190565b73fffd8963efd1fc6a506488495d951d51639616826401000276a21982016001600160a01b031611614ada57602081901b600160201b600160c01b0316808015610e4057693627a301d71055774c859160ff8260018060801b031060071b83811c60018060401b031060061b1783811c63ffffffff1060051b1783811c61ffff1060041b1783811c821060031b177b01c1818141808140018080c0814100004181408140c0c100414140c160221b6f8421084210842108cc6318c6db6d54be85831c1c601f161a17169160808310155f14614ace5750607e1982011c5b800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c80029081607f1c8260ff1c1c80029283607f1c8460ff1c1c80029485607f1c8660ff1c1c80029687607f1c8860ff1c1c80029889607f1c8a60ff1c1c80029a8b607f1c8c60ff1c1c80029c8d80607f1c9060ff1c1c600160321b90800260cd1c169d600160331b9060cc1c169c600160341b9060cb1c169b600160351b9060ca1c169a600160361b9060c91c1699600160371b9060c81c1698600160381b9060c71c1697600160391b9060c61c16966001603a1b9060c51c16956001603b1b9060c41c16946001603c1b9060c31c16936001603d1b9060c21c16926001603e1b9060c11c16916001603f1b9060c01c1690607f190160401b1717171717171717171717171717026fdb2df09e81959a81455e260799a0632f6f028f6481ab7f045a5af012a19d003aa919820160801d60020b910160801d60020b918282145f14614aaa5750905090565b6001600160a01b0390811690614abf84613378565b1611614ac9575090565b905090565b905081607f031b61491e565b6318521d4960e21b5f9081526001600160a01b0391909116600452602490fd5b91905f905f905f5b8551811015614c8d576001600160801b036040614b1f838961165d565b51015116614b30575b600101614b02565b9192614bdf604060ff60145460181c16805f14614c7557614b51868a61165d565b515160020b905b15614c61576020614b69878b61165d565b51015160020b5b8960ff6060614b9b8a6139216001600160801b0389614b8f848961165d565b51015116600f0b6114c1565b5101511691845193614bac85611333565b60020b845260020b6020840152600f0b838301526060820152815180938192632d35e7ed60e11b83528760048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192614c36925f905f92614c3e575b50614c309192613282565b95613282565b929050614b28565b614c309250614c5b915060403d8111611db257611da481836113b4565b91614c25565b614c6b868a61165d565b515160020b614b70565b6020614c81878b61165d565b51015160020b90614b58565b505091909250614c9f82600654613282565b600655565b9093929193614cb16136a5565b9480614e0457505f5b6001600160a01b031680614cde5750505060020b80835260208301525f6040830152565b919250614de991614d9090606090614d829060b56001600160881b03821160071b82811c6001600160481b031060061b1782811c64ffffffffff1060051b1782811c62ffffff1060041b17600181811c9290921b9083901c62010000010260121c80830401811c80830401811c80830401811c80830401811c80830401811c80830401811c80830401901c908190048111900360301b6001600160a01b0316614841565b940193845160020b90614f2e565b92614dd1602087019460020b9182865260ff60145460181c1692835f14614df15750614dc690865160020b905160020b9061335b565b60020b808852613378565b93516001600160801b0394906129e29060020b613378565b166040830152565b614dff915160020b9061209f565b614dc6565b8160ff60145460181c165f14614e3d5750600654614e3891614e329160801d6001600160801b0316906115a1565b826152fd565b614cba565b600654614e3892614e57916001600160801b0316906115a1565b6152fd565b90670de0b6b3a7640000820291808305670de0b6b3a7640000149015171561145e57565b81810292915f8212600160ff1b82141661145e57818405149015171561145e57565b9060018201915f60018412911290801582169115161761145e57565b9190915f838201938412911290801582169115161761145e57565b9081600f0b918203614ee757565b6393dafdf160e01b5f5260045ffd5b80628000000160181c15614f11576335278d125f526004601cfd5b60020b90565b9060020b9060020b02908160020b91820361145e57565b9060ff60145460181c165f14614f7a575f8260020b125f14614f6d57614f6881614f63614f5e82611e679661335b565b612084565b6136f8565b614f17565b614f6881611e67936136f8565b5f8260020b125f14614f9357614f6881611e67936136f8565b614f6881614f63614fa782611e679661209f565b613340565b6117fa6117db6117d26117c96117c4611e6795614fc761480d565b614ebe565b90929091908015614ffb575f19810190811161145e57915b15614ff257611e6792615420565b611e67926153dd565b91614fe4565b61501c6150136150259261379f61480d565b6013549061372e565b60105490611472565b601154808211614ac9575090565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610e4057146150c357670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b81810291905f1982820991838084109303928084039384600160601b1115610e40571461510a57600160601b910990828211900360a01b910360601c1790565b50505060601c90565b808202905f1983820990828083109203918083039283670de0b6b3a76400001115610e40571461517d577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a764000091500490565b808202905f1983820990828083109203918083039283620f42401115610e4057146151ee577fde8f6cefed634549b62c77574f722e1ac57e23f24d8fd5cb790fb65668c2613993620f4240910990828211900360fa1b910360061c170290565b5050620f424091500490565b90606082901b905f19600160601b840992828085109403938085039485841115610e4057146150c3578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f1981850993838086109503948086039586851115610e4057146152f5579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b90615307916151fa565b6001600160a01b03811161532d57600160a01b811015613275576001600160a01b031690565b505f90565b615378612dab615348612ecb60a0612175611f3d565b60145460181c60ff16156153ac5760125460020b808260020b135f146153a557505b60125460181c60020b61335b565b61538a614824601154601054906115a1565b90811561371a57600160ff1b81145f1983141661145e570590565b905061536a565b60125460020b808260020b125f146153a5575061536a565b6001600160a01b03918216908216039190821161145e57565b611e67926154159290916001600160a01b038083169082161161541a575b6001600160a01b039161540e91906153c4565b16906151fa565b615474565b906153fb565b611e6792615415929091906001600160a01b038082169083161161546e575b6154676154586001600160a01b038381169085166150ca565b926001600160a01b03926153c4565b169161527d565b9061543f565b6001600160801b0381169190820361548857565b60405162461bcd60e51b81526020600482015260126024820152716c6971756964697479206f766572666c6f7760701b6044820152606490fdfe27db09392d7d230eb65a11bd84925fb8da90df8a067ca8a4fc2933b4f637262bb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828b7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96da164736f6c634300081a000a' as const;\n","export default '0x608060405234610444576130dd8038038061001981610754565b928339810160c0828203126104445781516001600160401b0381116104445781610044918401610779565b60208301519092906001600160401b0381116104445782610066918301610779565b92604082015190610079606084016107ca565b92610086608082016107ca565b60a08201519095906001600160401b038111610444576100a69201610779565b936001600160a01b03168015610741575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a38051906001600160401b03821161047a5760015490600182811c92168015610737575b602083101461055f5781601f8493116106c9575b50602090601f8311600114610663575f92610658575b50508160011b915f199060031b1c1916176001555b83516001600160401b03811161047a57600254600181811c9116801561064e575b602082101461055f57601f81116105eb575b50602094601f8211600114610588579481929394955f9261057d575b50508160011b915f199060031b1c1916176002555b82516001600160401b03811161047a57600354600181811c91168015610573575b602082101461055f57601f81116104fc575b506020601f821160011461049957819293945f9261048e575b50508160011b915f199060031b1c1916176003555b604051610bec808201906001600160401b0382118383101761047a5760209183916124f183393381520301905ff0801561046f5768a20d6e21d0e5255309546001600160a01b03918216911661046257801561045557630f4599e55f523360205260205f6024601c82855af160015f5114161561044857678da5cb5b6cef16e65f5260208060046018305afa601f3d1160205160601b151016610435575b68a20d6e21d0e5255308805463ffffffff60201b191664010000000017905568a20d6e21d0e525530980546001600160a01b0319169190911790558061030b575b604051611cf190816108008239f35b6001600160a01b03821691821561042857670de0b6b3a7640000820463fffffffe108260601c1761041b5768a20d6e21d0e525530880546001600160a01b031660a084901b6001600160a01b0319169081179091556103ae929061036e836107de565b80546001600160a01b031690911790555f90815283907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602082a36107de565b906bff00000000000000000000008254918260581c9060015f527fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d642039360205fa2600260ff821691161560011b1860011760581b16906bff000000000000000000000019161790555f806102fc565b63e5cfe9575f526004601cfd5b63ea553b345f526004601cfd5b5f806004601c82855af16102bb575b5f80fd5b63d125259c5f526004601cfd5b6339a84a7b5f526004601cfd5b63ead4d2e45f526004601cfd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b015190505f80610208565b601f1982169060035f52805f20915f5b8181106104e4575095836001959697106104cc575b505050811b0160035561021d565b01515f1960f88460031b161c191690555f80806104be565b9192602060018192868b0151815501940192016104a9565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c81019160208410610555575b601f0160051c01905b81811061054a57506101ef565b5f815560010161053d565b9091508190610534565b634e487b7160e01b5f52602260045260245ffd5b90607f16906101dd565b015190505f806101a7565b601f1982169560025f52805f20915f5b8881106105d3575083600195969798106105bb575b505050811b016002556101bc565b01515f1960f88460031b161c191690555f80806105ad565b91926020600181928685015181550194019201610598565b60025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f830160051c81019160208410610644575b601f0160051c01905b818110610639575061018b565b5f815560010161062c565b9091508190610623565b90607f1690610179565b015190505f80610143565b60015f9081528281209350601f198516905b8181106106b15750908460019594939210610699575b505050811b01600155610158565b01515f1960f88460031b161c191690555f808061068b565b92936020600181928786015181550195019301610675565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c8101916020851061072d575b90601f859493920160051c01905b81811061071f575061012d565b5f8155849350600101610712565b9091508190610704565b91607f1691610119565b631e4fbdf760e01b5f525f60045260245ffd5b6040519190601f01601f191682016001600160401b0381118382101761047a57604052565b81601f82011215610444578051906001600160401b03821161047a576107a8601f8301601f1916602001610754565b928284526020838301011161044457815f9260208093018386015e8301015290565b51906001600160a01b038216820361044457565b6001600160a01b03165f90815268a20d6e21d0e5255313602052604090209056fe6080806040526004361015610667575b50361561065c575f3560e01c63e5eb36c881146103d25763f6916ddd811461038f576362fb246d811461036b57632d8a746e81146103325763c016aa52811461031f5763d10b6e0c811461022f576327ef549581146102145763f5b100ea81146101ef5763e2c7928181146101d45763cb30b46081146100a95763b7a94eb8146100a057633c10b94e5f526004601cfd5b60015f5260205ff35b60206040510160405260606003546100c081610f14565b6100e4575b50605f601f198201915f6020825180930101526020835201601f191690f35b905060405190608082019160a081016040525f8352600a600435935b5f19019360308282060185530492831561011c57600a90610100565b9250608083601f19810192030181526040519283915f9061013c85610f14565b94600181169081156101b45750600114610173575b61016d9450518092825e015f815203601f198101835282610f4c565b816100c5565b905060035f5260205f20935f5b818110610198575061016d9450830160200190610151565b8554602082890181019190915260019096019587955001610180565b602092935061016d96915060ff1916828601528015150284010190610151565b63ffffffff68a20d6e21d0e52553085460801c165f5260205ff35b63ffffffff6102086004356001600160a01b0316610f83565b5460801c165f5260205ff35b6001600160a01b03610227600435611adf565b165f5260205ff35b68a20d6e21d0e5255309546001600160a01b03163303610312576001600160a01b036044358116906024359060043581169061028061027b5f19600160201b861086020160011b611b18565b611a54565b5416928381036102ef575b505f82815268a20d6e21d0e525530c60209081526040822080546001600160a01b0319166001600160a01b03851617905568a20d6e21d0e525530d60601b600885901c018054600160ff90961695861b191693151590941b92909217909255918152f35b6102f99084611097565b5415610305578361028b565b63cfb3b9425f526004601cfd5b63ce5a776b5f526004601cfd5b6001600160a01b03610227600435611ab6565b6004356001600160a01b0361034682611ab6565b161561035e576001600160a01b039061022790611ab6565b63ceea21b65f526004601cfd5b6103856001600160a01b0360243581169060043516611097565b5415155f5260205ff35b68a20d6e21d0e5255309546001600160a01b031633036103125760243515156103c86001600160a01b0360043581169060443516611097565b5560015f5260205ff35b68a20d6e21d0e5255309546001600160a01b031633819003610312576001600160a01b036024358116916004358216916044359160643590911690841561064f5715610642576001600160a01b0361043a61027b600160201b851085025f190160011b611b18565b54168303610635578281036105fc575b5061045482610f83565b9061045e84610f83565b90825460a01c9283670de0b6b3a7640000116105ef576105989361049690670de0b6b3a763ffff19016001600160601b031682611a70565b82546104b89060a01c670de0b6b3a7640000016001600160601b031684611a70565b6104c182611b58565b6105be575b60016104f56104d487610fa4565b926104ef63ffffffff5f1981845460801c1601168092611a93565b83611b3c565b610517816105095f198701851b8501611b18565b9463ffffffff861690611b97565b63ffffffff5f19911601811b019060e08260031c685106b710e87292a98960611b019260051b1682549182821c1863ffffffff16901b1890556105928563ffffffff845460801c169361057363ffffffff600187011682611a93565b61058d61057f83610fa4565b8663ffffffff871691611b97565b611bbf565b90611c4f565b670de0b6b3a76400005f525f80516020611cc583398151915260205fa360015f5260205ff35b6105c782611b76565b5f82815268a20d6e21d0e525530c6020526040902080546001600160a01b03191690556104c6565b63f4d678b85f526004601cfd5b6106068184611097565b5461044a576001600160a01b0361061c83611adf565b1603610628578361044a565b6359c896be5f526004601cfd5b63a11481005f526004601cfd5b6340739bf05f526004601cfd5b63ea553b345f526004601cfd5b3461066357005b5f80fd5b5f3560e01c90816306fdde0314610e1c57508063095ea7b314610d7b57806310aa0ebb14610d5657806316f0115b14610d2e57806318160ddd14610d06578063207d063614610cc357806323b872dd14610c1d578063274e430b14610bf05780632a6a935d14610b7e578063313ce56714610b635780634ef41efc14610b3357806355f804b3146109c757806370a0823114610998578063715018a61461095457806389026538146109275780638da5cb5b1461090057806395d89b4114610826578063a9059cbb146107f5578063dd62ed3e146107c15763f2fde38b1461074f575f61000f565b3461066357602036600319011261066357610768610ee8565b610770611053565b6001600160a01b031680156107ae575f80546001600160a01b03198116831782556001600160a01b0316905f80516020611ca58339815191529080a3005b631e4fbdf760e01b5f525f60045260245ffd5b346106635760403660031901126106635760206107ed6107df610ee8565b6107e7610efe565b90610fed565b604051908152f35b346106635760403660031901126106635761081b610811610ee8565b60243590336110b5565b602060405160018152f35b34610663575f366003190112610663576040515f60025461084681610f14565b80845290600181169081156108dc575060011461087e575b61087a8361086e81850382610f4c565b60405191829182610ebe565b0390f35b60025f9081527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b8082106108c25750909150810160200161086e61085e565b9192600181602092548385880101520191019092916108aa565b60ff191660208086019190915291151560051b8401909101915061086e905061085e565b34610663575f366003190112610663575f546040516001600160a01b039091168152602090f35b34610663575f3660031901126106635761093f611053565b6004805460ff60a01b1916600160a01b179055005b34610663575f3660031901126106635761096c611053565b5f80546001600160a01b0319811682556001600160a01b03165f80516020611ca58339815191528280a3005b346106635760203660031901126106635760206109bb6109b6610ee8565b610f83565b5460a01c604051908152f35b34610663576020366003190112610663576004356001600160401b03811161066357366023820112156106635760048101356001600160401b03811161066357366024828401011161066357610a1b611053565b610a26600354610f14565b601f8111610ad0575b505f601f8211600114610a6b5781925f92610a5d575b50508160011b915f199060031b1c1916176003555f80f35b602492500101358280610a45565b601f1982169260035f5260205f20915f5b858110610ab557508360019510610a99575b505050811b01600355005b01602401355f19600384901b60f8161c19169055828080610a8e565b90926020600181926024878701013581550194019101610a7c565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c81019160208410610b29575b601f0160051c01905b818110610b1e5750610a2f565b5f8155600101610b11565b9091508190610b08565b34610663575f3660031901126106635768a20d6e21d0e5255309546040516001600160a01b039091168152602090f35b34610663575f36600319011261066357602060405160128152f35b3461066357602036600319011261066357600435801580158092036106635761081b91610baa33610f83565b91825460581c915f52337fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d642039360205fa2600260ff83169216151860011b1860011790611036565b34610663576020366003190112610663576020610c13610c0e610ee8565b610fc5565b6040519015158152f35b3461066357606036600319011261066357610c36610ee8565b610c3e610efe565b60443590610c4c3384611079565b926e22d473030f116ddee9f6b43ac78ba3331480610cac575b15610ca4575f19935b60018501610c82575b5061081b93506110b5565b848411610c97578361081b9503905584610c77565b6313be252b5f526004601cfd5b835493610c6e565b506004610cb882610f83565b5460581c1615610c65565b3461066357602036600319011261066357610cdc610ee8565b610ce4611053565b600480546001600160a81b0319166001600160a01b0392909216919091179055005b34610663575f36600319011261066357602068a20d6e21d0e52553085460a01c604051908152f35b34610663575f366003190112610663576004546040516001600160a01b039091168152602090f35b34610663575f36600319011261066357602060ff60045460a01c166040519015158152f35b3461066357604036600319011261066357610d94610ee8565b6001600160a01b03811690602435908190610dc6906e22d473030f116ddee9f6b43ac78ba38514610dfa575b33611079565b555f52337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa3602060405160018152f35b610e17610e0633610f83565b600460ff825460581c161790611036565b610dc0565b34610663575f366003190112610663575f600154610e3981610f14565b80845290600181169081156108dc5750600114610e605761087a8361086e81850382610f4c565b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b808210610ea45750909150810160200161086e61085e565b919260018160209254838588010152019101909291610e8c565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361066357565b602435906001600160a01b038216820361066357565b90600182811c92168015610f42575b6020831014610f2e57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610f23565b601f909101601f19168101906001600160401b03821190821017610f6f57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b03165f90815268a20d6e21d0e52553136020526040902090565b6001600160a01b03165f90815268a20d6e21d0e52553106020526040902090565b90610fcf82610f83565b5460581c916001600284161515931615610fe65750565b3b15159150565b906001600160a01b0381166e22d473030f116ddee9f6b43ac78ba31461101b575b61101791611079565b5490565b600461102683610f83565b5460581c1661100e5750505f1990565b805460ff60581b191660589290921b60ff60581b16919091179055565b5f546001600160a01b0316330361106657565b63118cdaa760e01b5f523360045260245ffd5b9060285260145268a20d6e21d0e525530f5f5260485f20905f602852565b9060285260145268a20d6e21d0e525530b5f5260485f20905f602852565b6004549092906001600160a01b03838116908216149081611a45575b50611a36576001600160a01b0382161561064f576110ee83610f83565b6110f783610f83565b68a20d6e21d0e5255309546001600160a01b031615610642576040519161018083016001600160401b03811184821017610f6f576040525f83525f60208401525f60808401525f60a08401525f60c08401525f60e08401525f6101008401525f6101208401525f6101408401525f610160840152805463ffffffff8160801c16604085015263ffffffff835460801c1660608501528060a01c85116105ef5760a01c8490036111af6001600160601b03821683611a70565b825460a01c8501906111ca6001600160601b03831685611a70565b670de0b6b3a76400006040860151910480820391110284526111eb86610fc5565b156119ee575b506117e9565b68a20d6e21d0e52553085463ffffffff60208501518551928382848360801c1601038060808901528360801b9060801b16908360801b191617928368a20d6e21d0e52553085501916040519260c060a085019180835260051b850101604052836040015260c0830183528261016087015260601c1661012085015283516116c9575b5050602082015161135e575b506101408101518061131a575b506101600151806112c8575b505f9081526001600160a01b0391821692909116905f80516020611cc583398151915290602090a3565b600160206040828060a01b0368a20d6e21d0e5255309541693015192603f19840193849163263c69d6835283601f198301525f825160051b6044019260231901915af19151141615610663575f61129e565b600160205f9281838060a01b0368a20d6e21d0e5255309541691015190815160051b60840190607f19830195869360631901915af19151141615610663575f611292565b9194610160829492015160208360601b91015261137a82610fa4565b9463ffffffff61138a8486611bbf565b1660e086015268a20d6e21d0e5255308549263ffffffff670de0b6b3a76400008560a01c049460201c1684811190811502176101008701526113e460608701519563ffffffff602089015188018060c08b01521690611a93565b63ffffffff68a20d6e21d0e52553085460401c169760015b1561166a575b6101208701515f9063ffffffff8b81169116146114b8576114b363ffffffff60018c01169a60e0641fffffffe0631fffffff8360031c1668a20d6e21d0e525531160601b01549260051b16161c63ffffffff165b8060081c685106b710e87292a98760611b0160018260ff161b801982541617905561148863ffffffff82168a8d611b97565b6114a863ffffffff60e08c01511663ffffffff60018c019b169083611c4f565b6101608a0151611c8e565b6113fc565b949798939291906101008801515b63ffffffff6114da5f19830160011b611b18565b1615611646575f19906001810160081c685106b710e87292a98760611b018054196001830160ff1690811c901b80156115ce575b80611524575b50505089811190811502176114c6565b600180939450811901167e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405601f6101e07a1412563212c14164235266736f7425221143267a4524367526767760fc7b2aaaaaaaba69a69a6db6db6db2cb2cb2ce739ce73def7bdeffffffff860260f81c161b60f71c1692831c63d76453e004161a179082685106b710e87292a98760611b03190160081b17910181108a8211175f03175f8080611514565b506001909c9895929c9a9794919a9693965b01805419685106b710e87292a98760611b60088e901c018211811761160857506001906115e0565b9c9295989c9a9194979a969396808d60081c685106b710e87292a98760611b018311611635575b5061150e565b508c1960ff1690811b901c8061162f565b6114b3909a999691929394959a6001810188811190811502176101008b0152611456565b60c0870151860361140257945094925094509468a20d6e21d0e52553085463ffffffff60201b61010084015160201b169163ffffffff60401b9060401b1690600160201b600160601b031916171768a20d6e21d0e5255308555f611285565b602060018860609a9699959a989497981b179101526116e782610fa4565b9461170760408801519563ffffffff895188038060a08c01521690611a93565b60015b156117d0575b5f945f1901946117208688611b3c565b63ffffffff8116905f1982018060021c685106b710e87292a98960611b019060c082549160061b1681811c60018060401b0316901b189055611767826101608c0151611c8e565b600160ff62ffffff8360081c16685106b710e87292a98760611b0192161b19815416905561179481611b58565b61179f575b5061170a565b6117a881611b76565b5f90815268a20d6e21d0e525530c6020526040812080546001600160a01b0319169055611799565b60a0870151850361171057935093509390945f80611279565b9194604086979294970151948651976020880151898110818b18028a1899888b108b8a180289146119df578a8918898c10028918908190038a52900360208901526001600160a01b03838116908316146119bd576040805163144027d3818301526001600160a01b03858116606080840191909152908516608083015260a08201528a8918898c1002891860c0820181815260059190911b820160e0908101909352602082015290810181526101408901526118a483610fa4565b956118ae83610fa4565b9763ffffffff6118be8584611bbf565b1660e08b015260608a01519a81811090821802188a019560015b15611977575b878b6119228163ffffffff808f8f9061191660e0928461190d5f9b5f1960408701510190816040880152611b3c565b16988991611b97565b01511691169083611c4f565b6101408c01516020815183815201905261193b81611b58565b611946575b506118d8565b61194f81611b76565b5f90815268a20d6e21d0e525530c6020526040812080546001600160a01b0319169055611940565b9960010199868b036118de579398955093986119a492975063ffffffff9196508060608701521683611a93565b6119b863ffffffff60408501511682611a93565b6111f7565b94929786819895939897929710908218021860608401510160608401526111f7565b505094929750945094916111f7565b670de0b6b3a7640000906001600160a01b0388811690881614611a23575b04606084015180820391110260208401525f6111f1565b6040850151855190036060860152611a0c565b632e13674560e01b5f5260045ffd5b60ff915060a01c16155f6110d1565b63ffffffff165f5268a20d6e21d0e525530a60205260405f2090565b80546001600160a01b031660a09290921b6001600160a01b031916919091179055565b805463ffffffff60801b191660809290921b63ffffffff60801b16919091179055565b6001600160a01b0390611ada9061027b90600160201b8110025f190160011b611b18565b541690565b6001600160a01b03611af082611ab6565b161561035e575f90815268a20d6e21d0e525530c60205260409020546001600160a01b031690565b60e08160031c685106b710e87292a98960611b01549160051b161c63ffffffff1690565b60e0908260031c9060601b01549160051b161c63ffffffff1690565b8060081c68a20d6e21d0e525530d60601b01549060ff161c60011690565b60018160081c68a20d6e21d0e525530d60601b019160ff161b198154169055565b60e0909291928360031c9060601b019260051b1682549182821c1863ffffffff16901b189055565b805460601c63ffffffff1692918315611bd6575050565b68a20d6e21d0e5255308805463ffffffff19811663ffffffff918216600101918216908117909255835463ffffffff60601b191660609190911b63ffffffff60601b16179092559092508290611c2b82611a54565b80546001600160a01b0319166001600160a01b039092169190911790551561066357565b5f1901908160021c685106b710e87292a98960611b019260c084549360061b169163ffffffff169060201b1782821c1860018060401b0316901b189055565b9060209082519060081b8284015117815201905256fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c634300081a000a608034607857601f610bec38819003918201601f19168301916001600160401b03831184841017607c57808492602094604052833981010312607857516001600160a01b03811690819003607857683602298b8c10b0123180546001600160a01b031916919091179055604051610b5b90816100918239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60808060405260043610156101c5575b5036156101ba575f3560e01c63263c69d681146101405763144027d381146100cf57630f4599e51461004857633c10b94e5f526004601cfd5b683602298b8c10b01231546001600160a01b0316806100ab575b50683602298b8c10b01230546001600160a01b03811661009e576001600160a01b0319163317683602298b8c10b012305560015f908152602090f35b63bf656a465f526004601cfd5b6004356001600160a01b0316036100c2575f610062565b63c59ec47a5f526004601cfd5b683602298b8c10b01230546001600160a01b03163303610133576004356024359060443591602483810193600481013560051b0101925b8381036101165760015f5260205ff35b803582845f80516020610b2f8339815191525f80a4602001610106565b63363cb3125f526004601cfd5b683602298b8c10b01230546001600160a01b0316330361013357600435602481810191600481013560051b0101905b81810361017f5760015f5260205ff35b8035600881901c6001600160581b03169060018116801560609290921c91820291025f80516020610b2f8339815191525f80a460200161016f565b346101c157005b5f80fd5b5f3560e01c90816301ffc9a71461098a5750806306fdde031461091f578063081812fc146108c8578063095ea7b31461084657806318160ddd146107fa57806323b872dd146107e6578063243598791461078f57806342842e0e1461071c5780636352211e146106ed5780636cef16e61461062157806370a08231146105c45780638da5cb5b1461059457806395d89b411461052957806397e5311c146104fd578063a22cb46514610471578063b88d4fde14610387578063c87b56dd1461030b5763e985e9c514610297575f61000f565b346101c15760403660031901126101c1576102b06109fe565b60205f6044601c6102bf610a14565b6102c7610ad0565b604080516362fb246d87526001600160a01b039889168852979092169091525afa601f3d1116156103035760405260205f516040519015158152f35b3d5f823e3d90fd5b346101c15760203660031901126101c15760043561032881610afa565b505f806024601c610337610ad0565b6040519563cb30b46085526020525afa15610303576103839060205f803e60205f51823e805160205f5101602083013e6040815182015f602082015201604052604051918291826109d4565b0390f35b60803660031901126101c15761039b6109fe565b6103a3610a14565b60443591606435916001600160401b0383116101c157366023840112156101c1576004830135926001600160401b0384116101c15736602485830101116101c1576103ef858385610a64565b813b6103f757005b83602094602460a49360405198899763150b7a028952338a8a015260018060a01b0316604089015260608801526080808801528260a08801520160c086013701905f601c8401915af115610463575b5163757a42ff60e11b0161045657005b63d1a57ed65f526004601cfd5b3d15610446573d5f823e3d90fd5b346101c15760403660031901126101c15761048a6109fe565b6024358015158091036101c15760205f6064601c826104a7610ad0565b9660018060a01b0316966040519663f6916ddd8352888752604052336060525af160015f511416156103035750337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206040a3005b346101c1575f3660031901126101c1576020610517610ad0565b6040516001600160a01b039091168152f35b346101c1575f3660031901126101c157610541610ad0565b5f806024601c604051946395d89b418452836020525afa15610303576103839060205f803e60205f51823e805160205f5101602083013e6040815182015f602082015201604052604051918291826109d4565b346101c1575f3660031901126101c157683602298b8c10b01232546040516001600160a01b039091168152602090f35b346101c15760203660031901126101c1576001600160a01b036105e56109fe565b1660205f6044601c6105f5610ad0565b6040519563f5b100ea85528552836040525afa601f3d1116156103035760405260205f51604051908152f35b346101c1575f3660031901126101c157610639610ad0565b683602298b8c10b012325460205f6004601c60018060a01b03851695638da5cb5b84525afa9081601f3d1116600c5160601c0291156106d6575b506001600160a01b031690818103610691575b602060405160018152f35b683602298b8c10b0123280546001600160a01b031916831790557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a38080610686565b60601b6001600160601b0319166101c15782610673565b346101c15760203660031901126101c15760206001600160a01b03610713600435610afa565b16604051908152f35b61072536610a2a565b91610731838383610a64565b813b61073957005b60a460209260405194859363150b7a028552338686015260018060a01b0316604085015260608401526080808401525f60a08401525f3681375f601c8401915af115610463575163757a42ff60e11b0161045657005b346101c15760203660031901126101c1576107a8610ad0565b60205f6044601c6040519463c016aa5284526004358552836040525afa601f3d1116156103035760408190525f516001600160a01b03168152602090f35b6107f86107f236610a2a565b91610a64565b005b346101c1575f3660031901126101c157610812610ad0565b60205f6044601c6040519463e2c792818452838552836040525afa601f3d1116156103035760405260205f51604051908152f35b60403660031901126101c15761085a6109fe565b60243590610866610ad0565b9060018060a01b03169060205f6064601c6040519463d10b6e0c8452868552876040523360605234905af1601f3d1116156103035750600c5160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a4005b346101c15760203660031901126101c1576108e1610ad0565b60205f6044601c604051946327ef549584526004358552836040525afa601f3d1116156103035760408190525f516001600160a01b03168152602090f35b346101c1575f3660031901126101c157610937610ad0565b5f806024601c604051946306fdde038452836020525afa15610303576103839060205f803e60205f51823e805160205f5101602083013e6040815182015f602082015201604052604051918291826109d4565b346101c15760203660031901126101c157600435906001600160e01b0319821682036101c15760209160e01c635b5e139f8114906301ffc9a76380ac58cd82149114171715158152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101c157565b602435906001600160a01b03821682036101c157565b60609060031901126101c1576004356001600160a01b03811681036101c157906024356001600160a01b03811681036101c1579060443590565b9060846020610a71610ad0565b6040805163e5eb36c881526001600160a01b03968716848201819052959096169086018190526060860187905233608087015294928391601c83019034905af16001825114161561030357505f80516020610b2f8339815191525f80a4565b683602298b8c10b01230546001600160a01b0316908115610aed57565b635b2a47ae5f526004601cfd5b60205f6044601c610b09610ad0565b60405195632d8a746e85528552836040525afa601f3d111615610303576040525f519056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c634300081a000a';\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","// Core contract ABIs needed for static and dynamic auctions\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: [\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 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 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\n// Minimal Bundler ABI used for atomic create + swap flows (\"bundle\")\n// Matches the V3 Bundler contract interface used in prior SDKs\nexport const bundlerAbi = [\n {\n type: 'function',\n name: 'bundle',\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 { name: 'commands', type: 'bytes', internalType: 'bytes' },\n { name: 'inputs', type: 'bytes[]', internalType: 'bytes[]' },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'simulateBundleExactIn',\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 name: 'params',\n type: 'tuple',\n internalType: 'struct IQuoterV2.QuoteExactInputSingleParams',\n components: [\n { name: 'tokenIn', type: 'address', internalType: 'address' },\n { name: 'tokenOut', type: 'address', internalType: 'address' },\n { name: 'amountIn', type: 'uint256', internalType: 'uint256' },\n { name: 'fee', type: 'uint24', internalType: 'uint24' },\n {\n name: 'sqrtPriceLimitX96',\n type: 'uint160',\n internalType: 'uint160',\n },\n ],\n },\n ],\n outputs: [{ name: 'amountOut', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'simulateBundleExactOut',\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 name: 'params',\n type: 'tuple',\n internalType: 'struct IQuoterV2.QuoteExactOutputSingleParams',\n components: [\n { name: 'tokenIn', type: 'address', internalType: 'address' },\n { name: 'tokenOut', type: 'address', internalType: 'address' },\n { name: 'amount', type: 'uint256', internalType: 'uint256' },\n { name: 'fee', type: 'uint24', internalType: 'uint24' },\n {\n name: 'sqrtPriceLimitX96',\n type: 'uint160',\n internalType: 'uint160',\n },\n ],\n },\n ],\n outputs: [{ name: 'amountIn', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'simulateMulticurveBundleExactOut',\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 { name: 'exactAmountOut', type: 'uint128', internalType: 'uint128' },\n { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n ],\n outputs: [\n { name: 'asset', type: 'address', internalType: 'address' },\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: 'amountIn', type: 'uint256', internalType: 'uint256' },\n { name: 'gasEstimate', type: 'uint256', internalType: 'uint256' },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'simulateMulticurveBundleExactIn',\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 { name: 'exactAmountIn', type: 'uint128', internalType: 'uint128' },\n { name: 'hookData', type: 'bytes', internalType: 'bytes' },\n ],\n outputs: [\n { name: 'asset', type: 'address', internalType: 'address' },\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: 'amountOut', type: 'uint256', internalType: 'uint256' },\n { name: 'gasEstimate', type: 'uint256', internalType: 'uint256' },\n ],\n stateMutability: 'nonpayable',\n },\n { type: 'error', name: 'InvalidAddresses', inputs: [] },\n { type: 'error', name: 'InvalidBundleData', inputs: [] },\n { type: 'error', name: 'InvalidOutputToken', inputs: [] },\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 rehypeDopplerHookAbi = [\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: 'quoter',\n inputs: [],\n outputs: [{ name: '', type: 'address', internalType: 'contract Quoter' }],\n stateMutability: 'view',\n },\n { type: 'error', name: 'FeeDistributionMustAddUpToWAD', inputs: [] },\n { type: 'error', name: 'SenderNotAirlockOwner', inputs: [] },\n { type: 'error', name: 'SenderNotInitializer', inputs: [] },\n] as const;\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 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} from '../abis';\n\nconst DEFAULT_MAX_ITERATIONS = 1_000_000;\n\nexport type TokenVariant = 'standard' | 'standard-v2' | '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;\n\nfunction isTokenFactory80(tokenFactory: Address): boolean {\n return tokenFactory.toLowerCase() === TOKEN_FACTORY_80_ADDRESS.toLowerCase();\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 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 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.substr(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] = decodeAbiParameters(\n DOPPLER404_TOKEN_DATA_ABI,\n tokenData,\n ) as readonly [string, string, string, bigint | undefined];\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 ],\n [name, symbol, initialSupply, recipient, owner, baseURI],\n );\n\n return keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [customBytecode ?? (DopplerDN404Bytecode as Hex), 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 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","/**\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 (typeof (request as any)?.gas === 'bigint') {\n return (request as any).gas as bigint;\n }\n return await fallback();\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 { 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","/**\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 {\n type Address,\n type Hex,\n type Hash,\n type PublicClient,\n type WalletClient,\n type Account,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n getAddress,\n decodeEventLog,\n decodeAbiParameters,\n toHex,\n} from 'viem';\nimport type {\n CreateStaticAuctionParams,\n CreateDynamicAuctionParams,\n CreateOpeningAuctionParams,\n CreateMulticurveParams,\n DopplerHookMigrationConfig,\n MigrationConfig,\n SupportedPublicClient,\n TokenConfig,\n Doppler404TokenConfig,\n StandardTokenConfig,\n SaleConfig,\n VestingConfig,\n SupportedChainId,\n CreateParams,\n MulticurveBundleExactInResult,\n MulticurveBundleExactOutResult,\n V4PoolKey,\n RehypeFeeDistributionInfo,\n RehypeDopplerHookConfig,\n OpeningAuctionState,\n OpeningAuctionCreateResult,\n OpeningAuctionCompleteResult,\n} from '../types';\nimport { RehypeFeeRoutingMode } from '../types';\nimport type { ModuleAddressOverrides } from '../types';\nimport { getAddresses } from '../addresses';\nimport {\n ZERO_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} from '../constants';\nimport {\n computeOptimalGamma,\n encodeRehypeDopplerHookMigratorCalldata,\n MIN_TICK,\n MAX_TICK,\n isToken0Expected,\n} from '../utils';\nimport { normalizeRehypeDopplerHookMigratorConfig } from '../utils/dopplerHookMigrator';\nimport {\n airlockAbi,\n bundlerAbi,\n DERC20Bytecode,\n DERC2080Bytecode,\n DopplerBytecode,\n DopplerDN404Bytecode,\n OpeningAuctionBytecode,\n v4MulticurveInitializerAbi,\n openingAuctionAbi,\n openingAuctionInitializerAbi,\n} from '../abis';\n\n// Type definition for the custom migration encoder function\nexport type MigrationEncoder = (config: MigrationConfig) => Hex;\n\nconst MAX_UINT128 = (1n << 128n) - 1n;\nconst MAX_PROCEEDS_SPLIT_SHARE = WAD / 2n;\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;\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 | { type: 'rehype'; hookConfig?: RehypeDopplerHookConfig };\n\ntype NormalizedRehypeHookConfig = {\n hookAddress: Address;\n buybackDestination: Address;\n startFee: number;\n endFee: number;\n durationSeconds: number;\n startingTime: number;\n feeRoutingMode: RehypeFeeRoutingMode;\n feeDistributionInfo: RehypeFeeDistributionInfo;\n graduationCalldata?: `0x${string}`;\n farTick?: number;\n};\n\ntype StandardTokenFactoryMode = 'legacy' | 'v2';\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\nconst DERC20_V2_MIN_VESTING_DURATION = 24 * 60 * 60;\n\nexport class DopplerFactory<C extends SupportedChainId = SupportedChainId> {\n private publicClient: SupportedPublicClient;\n private walletClient?: WalletClient;\n private chainId: C;\n private customMigrationEncoder?: MigrationEncoder;\n\n private multicurveBundlerSupport = new Map<Address, boolean>();\n\n constructor(\n publicClient: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n chainId: C,\n ) {\n this.publicClient = publicClient;\n this.walletClient = walletClient;\n this.chainId = chainId;\n }\n\n private usesDerc20V2Vesting(vesting?: VestingConfig): boolean {\n return (vesting?.cliffDuration ?? 0) > 0;\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.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 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.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 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 =\n args.vesting === undefined\n ? []\n : [\n {\n cliff: BigInt(args.vesting.cliffDuration ?? 0),\n duration: BigInt(args.vesting.duration ?? 0),\n },\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: recipients.map(() => 0n),\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 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\n // Check if beneficiaries are provided - this determines which initializer to use\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n // 1. Encode pool initializer data\n // Standard V3 initializer expects InitData struct WITHOUT beneficiaries (5 fields)\n // Lockable V3 initializer expects InitData struct WITH beneficiaries (6 fields)\n let poolInitializerData: Hex;\n\n if (hasBeneficiaries) {\n // Sort beneficiaries by address (ascending) as required by the contract\n const sortedBeneficiaries = params.pool\n .beneficiaries!.slice()\n .sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n });\n\n // Lockable V3 initializer encoding (6 fields including beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n {\n type: 'tuple[]',\n name: 'beneficiaries',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n beneficiaries: sortedBeneficiaries.map((b) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n })),\n },\n ],\n );\n } else {\n // Standard V3 initializer encoding (5 fields, no beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n },\n ],\n );\n }\n\n // 2. Encode migration data based on MigrationConfig\n const liquidityMigratorData = this.encodeMigrationData(params.migration, {\n 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.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 // 3. Encode token parameters (standard vs Doppler404)\n let tokenFactoryData: Hex;\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) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [params.token.name, params.token.symbol, baseURI, unit],\n );\n } else {\n const 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: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 5. Generate a unique salt\n // Build the base CreateParams for the V3-style ABI; salt will be mined below\n const baseCreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData: tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: (() => {\n if (hasBeneficiaries) {\n const lockableInitializer =\n params.modules?.lockableV3Initializer ??\n addresses.lockableV3Initializer;\n if (!lockableInitializer) {\n throw new Error(\n 'Lockable V3 initializer address not configured on this chain. Required when using beneficiaries.',\n );\n }\n return lockableInitializer;\n }\n return params.modules?.v3Initializer ?? addresses.v3Initializer;\n })(),\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n };\n\n const minedCreateParams = await this.mineTokenOrder({\n params,\n baseCreateParams,\n addresses,\n });\n\n return minedCreateParams;\n }\n\n /**\n * Simulate a static auction creation and return predicted addresses.\n * Useful for pre-buy flows (bundle) to know the token/pool before sending.\n */\n async simulateCreateStaticAuction(\n params: CreateStaticAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n asset: Address;\n pool: Address;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }>;\n }> {\n const createParams = await this.encodeCreateStaticAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate static auction create');\n }\n\n return {\n createParams,\n asset: simResult[0] as Address,\n pool: simResult[1] as Address,\n gasEstimate,\n execute: () =>\n this.createStaticAuction(params, { _createParams: createParams }),\n };\n }\n\n /**\n * Create a new static auction (using Uniswap V3 for initial liquidity)\n * @param params Configuration for the static auction\n * @returns The address of the created pool and token\n */\n async createStaticAuction(\n params: CreateStaticAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }> {\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateStaticAuction(params)).createParams;\n\n const addresses = getAddresses(this.chainId);\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedPool = simResult[1] as Address;\n if (\n simulatedToken.toLowerCase() !==\n actualAddresses.tokenAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualAddresses.tokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (\n simulatedPool.toLowerCase() !==\n actualAddresses.poolOrHookAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted pool ${simulatedPool} but actual is ${actualAddresses.poolOrHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n return {\n tokenAddress: actualAddresses.tokenAddress,\n poolAddress: actualAddresses.poolOrHookAddress,\n transactionHash: hash,\n };\n }\n\n /**\n * Generate a random salt based on user address\n */\n private generateRandomSalt(account: Address): Hex {\n // Use crypto.getRandomValues for secure random generation\n const array = new Uint8Array(32);\n\n // Try to use crypto API if available (Node.js or browser)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n // Fallback: use timestamp and account for deterministic generation\n const timestamp = Date.now();\n const timestampBytes = new Uint8Array(8);\n 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 }): Promise<CreateParams> {\n const { params, baseCreateParams, addresses } = args;\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n if (!airlockAddress || airlockAddress === ZERO_ADDRESS) {\n throw new Error(\n 'Airlock address not configured. Provide an explicit address via modules.airlock or ensure chain config includes a valid airlock.',\n );\n }\n\n const accountForSimulation =\n this.walletClient?.account ?? params.userAddress;\n const numeraireBigInt = BigInt(params.sale.numeraire);\n\n let attempt = 0n;\n const maxAttempts = 256n;\n let salt = this.generateRandomSalt(params.userAddress);\n\n while (attempt < maxAttempts) {\n const createParams = { ...baseCreateParams, salt } as CreateParams;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: accountForSimulation,\n });\n\n const simResult = result as readonly unknown[] | undefined;\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error(\n 'Failed to simulate static auction create while mining token ordering',\n );\n }\n\n const tokenAddress = simResult[0] as Address;\n const isToken0 = BigInt(tokenAddress) < numeraireBigInt;\n const wantToken0 = isToken0Expected(params.sale.numeraire);\n if ((wantToken0 && isToken0) || (!wantToken0 && !isToken0)) {\n return createParams;\n }\n\n attempt += 1n;\n const incrementedAccount = toHex(\n BigInt(params.userAddress) + attempt,\n ) as Address;\n salt = this.generateRandomSalt(incrementedAccount);\n }\n\n throw new Error(\n 'Token mining exceeded iteration limit while trying to force token order. Try again or provide a different user address.',\n );\n }\n\n async encodeCreateDynamicAuctionParams(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n }> {\n // Validate parameters\n this.validateDynamicAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // 1. Calculate gamma if not provided\n const gamma =\n params.auction.gamma ??\n computeOptimalGamma(\n params.auction.startTick,\n params.auction.endTick,\n params.auction.duration,\n params.auction.epochLength,\n params.pool.tickSpacing,\n );\n\n // 2. Prepare time parameters\n // Use provided block timestamp or fetch the latest\n let blockTimestamp: number;\n if (params.blockTimestamp !== undefined) {\n blockTimestamp = params.blockTimestamp;\n } else {\n const latestBlock = await (this.publicClient as PublicClient).getBlock({\n blockTag: 'latest',\n });\n blockTimestamp = Number(\n (latestBlock as { timestamp: bigint | number }).timestamp,\n );\n }\n\n // Use startTimeOffset if provided, otherwise default to 30 seconds\n const startTimeOffset = params.startTimeOffset ?? 30;\n const startTime = blockTimestamp + startTimeOffset;\n const endTime = blockTimestamp + params.auction.duration + startTimeOffset;\n\n // 3. Prepare hook initialization data\n const dopplerData = {\n minimumProceeds: params.auction.minProceeds,\n maximumProceeds: params.auction.maxProceeds,\n startingTime: BigInt(startTime),\n endingTime: BigInt(endTime),\n startingTick: params.auction.startTick,\n endingTick: params.auction.endTick,\n epochLength: BigInt(params.auction.epochLength),\n gamma,\n isToken0: false, // Will be determined during mining\n numPDSlugs: BigInt(params.auction.numPdSlugs ?? DEFAULT_PD_SLUGS),\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n };\n\n // 4. Prepare token parameters (standard vs Doppler404)\n if (this.isDoppler404Token(params.token)) {\n if (\n !addresses.doppler404Factory ||\n addresses.doppler404Factory === ZERO_ADDRESS\n ) {\n throw new Error(\n 'Doppler404 factory address not configured for this chain',\n );\n }\n }\n\n const resolvedTokenFactoryDyn: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\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 tokenFactoryData = this.isDoppler404Token(params.token)\n ? (() => {\n const t = params.token as Doppler404TokenConfig;\n return {\n name: t.name,\n symbol: t.symbol,\n baseURI: t.baseURI,\n unit: t.unit !== undefined ? BigInt(t.unit) : 1000n,\n };\n })()\n : 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: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: dopplerData,\n tokenVariant: this.isDoppler404Token(params.token)\n ? 'doppler404'\n : 'standard',\n });\n\n // 6. Encode migration data\n const liquidityMigratorData = this.encodeMigrationData(params.migration, {\n 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: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 8. Build the complete CreateParams for the V4-style ABI\n const createParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: encodedTokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt: salt,\n };\n\n return { createParams, hookAddress, tokenAddress };\n }\n\n /**\n * Create a new dynamic auction (using Uniswap V4 hook for gradual Dutch auction)\n * @param params Configuration for the dynamic auction\n * @returns The address of the created hook and token\n */\n async createDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }> {\n const addresses = getAddresses(this.chainId);\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n let createParams: CreateParams;\n\n if (options?._createParams) {\n createParams = options._createParams;\n } else {\n const simulation = await this.simulateCreateDynamicAuction(params);\n createParams = simulation.createParams;\n }\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, 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 return {\n createParams,\n hookAddress,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createDynamicAuction(params, { _createParams: createParams }),\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\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 if (this.isDoppler404Token(params.token)) {\n if (\n !addresses.doppler404Factory ||\n addresses.doppler404Factory === ZERO_ADDRESS\n ) {\n throw new Error(\n 'Doppler404 factory address not configured for this chain',\n );\n }\n }\n\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\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 tokenFactoryData = this.isDoppler404Token(params.token)\n ? (() => {\n const t = params.token as Doppler404TokenConfig;\n return {\n name: t.name,\n symbol: t.symbol,\n baseURI: t.baseURI,\n unit: t.unit !== undefined ? BigInt(t.unit) : 1000n,\n };\n })()\n : 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 : 'standard',\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: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n 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: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\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 return {\n createParams,\n openingAuctionHookAddress: simResult[1] as Address,\n tokenAddress: simResult[0] as Address,\n minedSalt,\n gasEstimate,\n execute: () =>\n this.createOpeningAuction(params, {\n _createParams: createParams,\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 | StandardTokenFactoryData;\n airlock: Address;\n initialSupply: bigint;\n tokenVariant: 'standard' | 'doppler404';\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 ?? 1000n],\n );\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 };\n const initData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'string' },\n ],\n [\n t.name,\n t.symbol,\n params.initialSupply,\n params.airlock,\n params.airlock,\n t.baseURI,\n ],\n );\n tokenInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerDN404Bytecode as Hex, initData],\n ),\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 return [\n `0x${salt.toString(16).padStart(64, '0')}` as Hash,\n getAddress(hookRaw) as Address,\n getAddress(tokenRaw) as Address,\n encodedTokenFactoryData,\n ];\n }\n }\n\n throw new Error('Unable to mine opening auction salt');\n }\n\n private async resolveCreateGasEstimate(args: {\n request?: unknown;\n address: Address;\n createParams: CreateParams;\n account?: Address | Account;\n }): Promise<bigint | undefined> {\n const { request, address, createParams, account } = args;\n const gasFromRequest =\n request &&\n typeof request === 'object' &&\n 'gas' in (request as Record<string, unknown>)\n ? (request as { gas?: bigint }).gas\n : undefined;\n\n if (gasFromRequest) {\n return gasFromRequest;\n }\n\n try {\n const estimated = await (\n this.publicClient as PublicClient\n ).estimateContractGas({\n address,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account,\n });\n return estimated;\n } catch {\n return undefined;\n }\n }\n\n private isDoppler404Token(\n token: TokenConfig,\n ): token is Doppler404TokenConfig {\n return (token as Doppler404TokenConfig).type === 'doppler404';\n }\n\n /**\n * Encode migration data based on the MigrationConfig\n * This replaces the manual encoding methods from the old SDKs\n */\n private encodeMigrationData(\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 switch (config.type) {\n case 'uniswapV2':\n // V2 migrator expects empty data\n return '0x' as Hex;\n\n case 'noOp':\n // NoOp migrator expects empty data\n return '0x' as Hex;\n\n case 'uniswapV4':\n // Encode V4 migration data with optional streamable fees config\n // When streamableFees is omitted, mirror legacy SDK behaviour by emitting an empty payload\n const streamableFees = config.streamableFees;\n if (!streamableFees) {\n // Default V4 migrator behaviour: no additional payload required\n return '0x';\n }\n\n // Copy beneficiaries and sort by address in ascending order (required by contract)\n const beneficiaryData = [...streamableFees.beneficiaries].sort(\n (a, b) => {\n const addrA = a.beneficiary.toLowerCase();\n const addrB = b.beneficiary.toLowerCase();\n return addrA < addrB ? -1 : addrA > addrB ? 1 : 0;\n },\n );\n\n // Note: The contract will validate that the airlock owner gets at least 5%\n // If not present, the SDK user should add it manually\n\n return encodeAbiParameters(\n [\n { type: 'uint24' }, // fee\n { type: 'int24' }, // tickSpacing\n { type: 'uint32' }, // lockDuration (0 if no streamableFees)\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n [\n config.fee,\n config.tickSpacing,\n streamableFees.lockDuration,\n beneficiaryData,\n ],\n );\n\n case 'dopplerHook': {\n const dopplerHookConfig = config as DopplerHookMigrationConfig;\n\n if (dopplerHookConfig.hook && dopplerHookConfig.rehype) {\n throw new Error(\n 'dopplerHook migration cannot set both hook and rehype config. Use exactly one hook mode.',\n );\n }\n\n // Copy beneficiaries and sort by address in ascending order (required by contract)\n const beneficiaries = [...dopplerHookConfig.beneficiaries].sort(\n (a, b) => {\n const addrA = a.beneficiary.toLowerCase();\n const addrB = b.beneficiary.toLowerCase();\n return addrA < addrB ? -1 : addrA > addrB ? 1 : 0;\n },\n );\n\n let dopplerHookAddress: Address = ZERO_ADDRESS;\n let onInitializationCalldata: Hex = '0x';\n\n if (dopplerHookConfig.hook) {\n dopplerHookAddress = dopplerHookConfig.hook.hookAddress;\n onInitializationCalldata =\n dopplerHookConfig.hook.onInitializationCalldata ?? '0x';\n } else if (dopplerHookConfig.rehype) {\n const addresses = getAddresses(this.chainId);\n const resolvedRehypeHookAddress =\n dopplerHookConfig.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 dopplerHook migration data',\n );\n }\n\n dopplerHookAddress = resolvedRehypeHookAddress;\n onInitializationCalldata = encodeRehypeDopplerHookMigratorCalldata({\n numeraire: options.numeraire,\n config: dopplerHookConfig.rehype,\n });\n }\n\n const proceedsRecipient =\n dopplerHookConfig.proceedsSplit?.recipient ?? ZERO_ADDRESS;\n const proceedsShare = dopplerHookConfig.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 dopplerHookConfig.fee,\n dopplerHookConfig.useDynamicFee ?? false,\n dopplerHookConfig.tickSpacing,\n dopplerHookConfig.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 normalizeRehypeStartingTime(\n value: RehypeDopplerHookConfig['startingTime'],\n label: string,\n ): number {\n if (value === undefined) return 0;\n if (value instanceof Date) {\n return this.normalizeUint32(Math.floor(value.getTime() / 1000), label);\n }\n return this.normalizeUint32(value, label);\n }\n\n private normalizeRehypeFeeRoutingMode(\n mode: RehypeDopplerHookConfig['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\n private resolveRehypeFeeDistributionInfo(\n config: RehypeDopplerHookConfig,\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\n private 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\n private normalizeRehypeHookConfig(\n config: RehypeDopplerHookConfig,\n ): NormalizedRehypeHookConfig {\n const MAX_REHYPE_FEE = 1_000_000;\n\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 const endFeeRaw = config.endFee ?? startFeeRaw;\n\n const startFee = Number(startFeeRaw);\n const endFee = Number(endFeeRaw);\n\n if (\n !Number.isInteger(startFee) ||\n startFee < 0 ||\n startFee > MAX_REHYPE_FEE\n ) {\n throw new Error(\n `Rehype startFee must be an integer between 0 and ${MAX_REHYPE_FEE}`,\n );\n }\n if (!Number.isInteger(endFee) || endFee < 0 || endFee > MAX_REHYPE_FEE) {\n throw new Error(\n `Rehype endFee must be an integer between 0 and ${MAX_REHYPE_FEE}`,\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\n const durationSeconds = this.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 startingTime = this.normalizeRehypeStartingTime(\n config.startingTime,\n 'Rehype startingTime',\n );\n const feeRoutingMode = this.normalizeRehypeFeeRoutingMode(\n config.feeRoutingMode,\n );\n const feeDistributionInfo = this.resolveRehypeFeeDistributionInfo(config);\n this.validateRehypeFeeDistributionInfo(feeDistributionInfo);\n\n return {\n hookAddress: config.hookAddress,\n buybackDestination: config.buybackDestination,\n startFee,\n endFee,\n durationSeconds,\n startingTime,\n feeRoutingMode,\n feeDistributionInfo,\n graduationCalldata: config.graduationCalldata,\n farTick: config.farTick,\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 = {\n type: 'rehype',\n hookConfig: legacyHook,\n };\n } else {\n mode = { type: 'standard' };\n }\n } else {\n switch (initializer.type) {\n case 'standard': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'standard' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n mode = { type: 'standard' };\n break;\n }\n case 'scheduled': {\n if (hasLegacyHook) {\n throw new Error(\n \"Initializer type 'scheduled' cannot be combined with dopplerHook\",\n );\n }\n const normalizedStart = this.normalizeUint32(\n initializer.startTime,\n 'Scheduled multicurve startTime',\n );\n if (hasLegacySchedule) {\n const legacyStart = this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n );\n if (legacyStart !== normalizedStart) {\n throw new Error(\n 'Conflicting scheduled start times provided via initializer and schedule',\n );\n }\n }\n mode = { type: 'scheduled', startTime: normalizedStart };\n break;\n }\n case 'decay': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'decay' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n const startTime = this.normalizeUint32(\n initializer.startTime,\n 'Decay multicurve startTime',\n );\n const startFee = Number(initializer.startFee);\n const durationSeconds = this.normalizeUint32(\n initializer.durationSeconds,\n 'Decay multicurve durationSeconds',\n );\n const endFee = Number(params.pool.fee);\n if (!Number.isInteger(startFee)) {\n throw new Error('Decay multicurve startFee must be an integer');\n }\n if (startFee < 0 || startFee > DECAY_MAX_START_FEE) {\n throw new Error(\n `Decay multicurve startFee must be between 0 and ${DECAY_MAX_START_FEE}`,\n );\n }\n if (!Number.isInteger(endFee) || endFee < 0 || endFee > V4_MAX_FEE) {\n throw new Error(\n `Multicurve pool fee must be between 0 and ${V4_MAX_FEE}`,\n );\n }\n if (startFee < endFee) {\n throw new Error(\n `Decay multicurve startFee (${startFee}) must be greater than or equal to terminal pool fee (${endFee})`,\n );\n }\n if (startFee > endFee && durationSeconds <= 0) {\n throw new Error(\n 'Decay multicurve durationSeconds must be greater than 0 when startFee is greater than terminal pool fee',\n );\n }\n mode = {\n type: 'decay',\n startTime,\n startFee,\n durationSeconds,\n };\n break;\n }\n case 'rehype': {\n if (hasLegacySchedule) {\n throw new Error(\n \"Initializer type 'rehype' cannot be combined with schedule\",\n );\n }\n mode = { type: 'rehype', hookConfig: initializer.config };\n break;\n }\n default: {\n const exhaustive: never = initializer;\n throw new Error(\n `Unsupported multicurve initializer type: ${(exhaustive as { type?: string })?.type ?? 'unknown'}`,\n );\n }\n }\n }\n\n // Backwards-compatible behavior: an explicit dopplerHookInitializer override\n // selects the DopplerHookInitializer path even without hook config.\n if (params.modules?.dopplerHookInitializer !== undefined) {\n if (mode.type === 'standard') {\n mode = { type: 'rehype' };\n } else if (mode.type !== 'rehype') {\n throw new Error(\n 'modules.dopplerHookInitializer can only be used with the rehype or standard multicurve initializer mode',\n );\n }\n }\n\n return mode;\n }\n\n encodeCreateMulticurveParams(\n params: CreateMulticurveParams<C>,\n ): CreateParams {\n // Validate parameters\n this.validateMulticurveParams(params);\n\n // Basic validation\n if (!params.pool || params.pool.curves.length === 0) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n const normalizedCurves = this.normalizeMulticurveCurves(\n params.pool.curves,\n params.pool.tickSpacing,\n );\n\n const addresses = getAddresses(this.chainId);\n\n // Pool initializer data: (fee, tickSpacing, farTick, curves[], beneficiaries[], dopplerHook, onInitializationCalldata, graduationCalldata)\n const sortedBeneficiaries = (params.pool.beneficiaries ?? [])\n .slice()\n .sort(\n (\n a: NonNullable<typeof params.pool.beneficiaries>[number],\n b: NonNullable<typeof params.pool.beneficiaries>[number],\n ) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n },\n );\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n const useScheduledInitializer = initializerMode.type === 'scheduled';\n const useDecayInitializer = initializerMode.type === 'decay';\n const useDopplerHookInitializer = initializerMode.type === 'rehype';\n const normalizedRehypeHookConfig =\n initializerMode.type === 'rehype' && initializerMode.hookConfig\n ? this.normalizeRehypeHookConfig(initializerMode.hookConfig)\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 const 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 ];\n\n const rehypeInitDataComponents = [\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\n onInitializationDopplerHookCalldata = encodeAbiParameters(\n [{ type: 'tuple', components: rehypeInitDataComponents }],\n [\n {\n numeraire: params.sale.numeraire,\n buybackDst: hookConfig.buybackDestination,\n startFee: hookConfig.startFee,\n endFee: hookConfig.endFee,\n durationSeconds: hookConfig.durationSeconds,\n startingTime: hookConfig.startingTime,\n feeRoutingMode: hookConfig.feeRoutingMode,\n feeDistributionInfo: hookConfig.feeDistributionInfo,\n },\n ],\n );\n graduationDopplerHookCalldata = hookConfig.graduationCalldata ?? '0x';\n }\n\n const dopplerHookTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'farTick', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'dopplerHook', type: 'address' },\n { name: 'onInitializationDopplerHookCalldata', type: 'bytes' },\n { name: 'graduationDopplerHookCalldata', type: 'bytes' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: dopplerHookTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n farTick,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n dopplerHook: dopplerHookAddress,\n onInitializationDopplerHookCalldata,\n graduationDopplerHookCalldata,\n },\n ],\n );\n } else if (useDecayInitializer) {\n // DecayMulticurveInitializer format (7 fields)\n const decayTupleComponents = [\n { name: 'startFee', type: 'uint24' },\n { name: 'fee', type: 'uint24' },\n { name: 'durationSeconds', type: 'uint32' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n if (initializerMode.type !== 'decay') {\n throw new Error('Invalid multicurve initializer state for decay mode');\n }\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: decayTupleComponents }],\n [\n {\n startFee: initializerMode.startFee,\n fee: params.pool.fee,\n durationSeconds: initializerMode.durationSeconds,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else if (useScheduledInitializer) {\n // UniswapV4ScheduledMulticurveInitializer format (5 fields)\n if (initializerMode.type !== 'scheduled') {\n throw new Error(\n 'Invalid multicurve initializer state for scheduled mode',\n );\n }\n const scheduledTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: scheduledTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else {\n // UniswapV4MulticurveInitializer format (4 fields - basic)\n const basicTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: basicTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n },\n ],\n );\n }\n\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\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;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [token404.name, token404.symbol, token404.baseURI, unit],\n );\n } else {\n const 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 = 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 const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n const createParams: CreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData,\n poolInitializer: resolvedInitializer,\n poolInitializerData,\n liquidityMigrator: resolvedMigrator,\n liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt,\n };\n\n return createParams;\n }\n\n async simulateCreateMulticurve(params: CreateMulticurveParams<C>): Promise<{\n createParams: CreateParams;\n tokenAddress: Address;\n poolId: Hex;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n tokenAddress: Address;\n poolId: Hex;\n transactionHash: string;\n }>;\n }> {\n const addresses = getAddresses(this.chainId);\n const createParams = this.encodeCreateMulticurveParams(params);\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate multicurve create');\n }\n\n // simResult[0] is \"asset\" in contract terminology, we call it tokenAddress for SDK consistency\n const tokenAddress = simResult[0] as Address;\n const poolId = await this.computeMulticurvePoolId(params, tokenAddress);\n\n return {\n createParams,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createMulticurve(params, { _createParams: createParams }),\n };\n }\n\n async createMulticurve(\n params: CreateMulticurveParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{ tokenAddress: Address; poolId: Hex; transactionHash: string }> {\n const addresses = getAddresses(this.chainId);\n if (!this.walletClient)\n throw new Error('Wallet client required for write operations');\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateMulticurve(params)).createParams;\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({ ...request, gas });\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract token address from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n\n // Warn if simulation predicted different address (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 1) {\n const simulatedToken = simResult[0] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Compute poolId from the PoolKey using actual token address\n const poolId = await this.computeMulticurvePoolId(\n params,\n actualTokenAddress,\n );\n\n return { tokenAddress: actualTokenAddress, poolId, transactionHash: hash };\n }\n\n /**\n * Normalize user-provided multicurve positions and ensure they satisfy SDK constraints\n */\n private normalizeMulticurveCurves(\n curves: CreateMulticurveParams['pool']['curves'],\n tickSpacing: number,\n ): CreateMulticurveParams['pool']['curves'] {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n if (!curves.length) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n let totalShares = 0n;\n let mostPositiveTickUpper: number | undefined;\n\n const sanitizedCurves = curves.map((curve) => {\n const sanitized = { ...curve };\n\n if (\n !Number.isFinite(sanitized.tickLower) ||\n !Number.isFinite(sanitized.tickUpper)\n ) {\n throw new Error('Multicurve ticks must be finite numbers');\n }\n if (sanitized.tickLower >= sanitized.tickUpper) {\n throw new Error(\n 'Multicurve curve tickLower must be less than tickUpper',\n );\n }\n if (\n !Number.isInteger(sanitized.numPositions) ||\n sanitized.numPositions <= 0\n ) {\n throw new Error(\n 'Multicurve curve numPositions must be a positive integer',\n );\n }\n if (sanitized.shares <= 0n) {\n throw new Error('Multicurve curve shares must be positive');\n }\n\n totalShares += sanitized.shares;\n if (totalShares > WAD) {\n throw new Error('Total multicurve shares cannot exceed 100% (1e18)');\n }\n\n if (\n mostPositiveTickUpper === undefined ||\n sanitized.tickUpper > mostPositiveTickUpper\n ) {\n mostPositiveTickUpper = sanitized.tickUpper;\n }\n\n return sanitized;\n });\n\n if (totalShares === WAD) {\n return sanitizedCurves;\n }\n\n const missingShare = WAD - totalShares;\n if (missingShare <= 0n) {\n return sanitizedCurves;\n }\n\n const fallbackTickLower = mostPositiveTickUpper;\n if (fallbackTickLower === undefined) {\n throw new Error('Unable to determine fallback multicurve tick range');\n }\n\n const fallbackTickUpper = this.roundMaxTickDown(tickSpacing);\n\n // Guard: if fallback range is invalid, step back by tickSpacing\n if (fallbackTickLower >= fallbackTickUpper) {\n // Cannot extend beyond max tick — adjust fallback to use a valid range\n const adjustedLower = fallbackTickUpper - tickSpacing;\n if (adjustedLower < fallbackTickLower) {\n // No room for fallback curve — return sanitized curves without fallback\n return sanitizedCurves;\n }\n // Otherwise use adjusted range\n const fallbackCurve = {\n tickLower: adjustedLower,\n tickUpper: fallbackTickUpper,\n numPositions:\n sanitizedCurves[sanitizedCurves.length - 1]?.numPositions ?? 1,\n shares: missingShare,\n };\n return [...sanitizedCurves, fallbackCurve];\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:\n sanitizedCurves[sanitizedCurves.length - 1]?.numPositions ?? 1,\n shares: missingShare,\n };\n\n return [...sanitizedCurves, fallbackCurve];\n }\n\n private roundMaxTickDown(tickSpacing: number): number {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n const rounded = Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n return rounded;\n }\n\n private 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\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 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 const availableForVesting = sale.initialSupply - sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n return;\n }\n\n const vestedAmount = sale.initialSupply - sale.numTokensToSell;\n if (vestedAmount <= 0n) {\n throw new Error('No tokens available for vesting');\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 this.validateVestingConfig(params.sale, params.vesting);\n\n // Validate migration config\n if (params.migration.type === 'dopplerHook') {\n throw new Error(\n 'dopplerHook migration is only supported for dynamic auctions',\n );\n }\n\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n\n // Validate pool beneficiaries for V3 locked pools\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n\n // Validate each beneficiary has positive shares\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n }\n\n /**\n * Validate dynamic auction parameters\n */\n private validateDynamicAuctionParams(\n params: CreateDynamicAuctionParams,\n ): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n const isToken0 = isToken0Expected(params.sale.numeraire);\n if (isToken0 && params.auction.startTick <= params.auction.endTick) {\n throw new Error(\n 'Start tick must be greater than end tick if base token is currency0',\n );\n }\n if (!isToken0 && params.auction.startTick >= params.auction.endTick) {\n throw new Error(\n 'Start tick must be less than end tick if base token is currency1',\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n 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 (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n\n if (params.migration.type === 'dopplerHook') {\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 dopplerHook 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 'dopplerHook 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 if (migration.proceedsSplit) {\n if (migration.proceedsSplit.recipient === ZERO_ADDRESS) {\n throw new Error(\n 'DopplerHook proceeds split recipient cannot be zero address',\n );\n }\n\n if (migration.proceedsSplit.share < 0n) {\n throw new Error(\n 'DopplerHook proceeds split share cannot be negative',\n );\n }\n\n if (migration.proceedsSplit.share > MAX_PROCEEDS_SPLIT_SHARE) {\n throw new Error(\n `DopplerHook proceeds split share cannot exceed ${MAX_PROCEEDS_SPLIT_SHARE}`,\n );\n }\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 (params.migration.type === 'dopplerHook') {\n throw new Error(\n 'dopplerHook migration type is not supported for opening auctions',\n );\n }\n }\n\n /**\n * Validate multicurve auction parameters\n */\n private validateMulticurveParams(params: CreateMulticurveParams<C>): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate initializer mode / compatibility and mode-specific constraints.\n this.resolveMulticurveInitializerMode(params);\n\n 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 (params.migration.type === 'dopplerHook') {\n throw new Error(\n 'dopplerHook migration is only supported for dynamic auctions',\n );\n }\n\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Get the Bundler contract address for the current chain\n * Used to perform atomic create + swap (\"bundle\") flows for static auctions\n */\n private getBundlerAddress(): Address {\n const addresses = getAddresses(this.chainId);\n const addr = addresses.bundler;\n if (!addr || addr === ZERO_ADDRESS) {\n throw new Error('Bundler address not configured for this chain');\n }\n return addr;\n }\n\n /**\n * Get the appropriate migrator address based on migration config\n * Allows override via ModuleAddressOverrides when provided in params.\n */\n private getMigratorAddress(\n config: MigrationConfig,\n overrides?: ModuleAddressOverrides,\n ): Address {\n const addresses = getAddresses(this.chainId);\n\n switch (config.type) {\n case 'uniswapV2':\n return overrides?.v2Migrator ?? addresses.v2Migrator;\n case 'uniswapV4': {\n const v4Address = overrides?.v4Migrator ?? addresses.v4Migrator;\n if (v4Address === '0x0000000000000000000000000000000000000000') {\n throw new Error(\n 'UniswapV4Migrator not deployed on this chain. Use uniswapV2 migration or provide override via modules.v4Migrator.',\n );\n }\n return v4Address;\n }\n case 'dopplerHook': {\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) {\n throw new Error(\n 'NoOpMigrator not configured on this chain. Provide override via modules.noOpMigrator or update chain config.',\n );\n }\n return noOpAddress;\n }\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n // computeTicks moved to builders. No longer needed here.\n // computeOptimalGamma moved to utils.\n\n // -----------------------------\n // Bundler helpers (Static/V3)\n // -----------------------------\n\n /**\n * Simulate a bundle with exact input on Uniswap V3 as part of create\n * Returns the expected output amount for the provided exact input.\n */\n async simulateBundleExactInput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactIn',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n /**\n * Simulate a bundle with exact output on Uniswap V3 as part of create\n * Returns the required input amount for the provided exact output.\n */\n async simulateBundleExactOutput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amount: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactOut',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amount: params.amount,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n // Bundler helpers (Multicurve/V4)\n async simulateMulticurveBundleExactOut(\n createParams: CreateParams,\n params?: {\n exactAmountOut?: bigint;\n },\n ): Promise<MulticurveBundleExactOutResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n const exactAmountOut = params?.exactAmountOut ?? 0n;\n this.ensureUint128(exactAmountOut, 'exactAmountOut', { allowZero: true });\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactOut',\n args: [{ ...createParams }, exactAmountOut, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountIn: amount,\n gasEstimate,\n };\n }\n\n async simulateMulticurveBundleExactIn(\n createParams: CreateParams,\n params: {\n exactAmountIn: bigint;\n },\n ): Promise<MulticurveBundleExactInResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n if (params.exactAmountIn === undefined) {\n throw new Error(\n 'exactAmountIn is required for multicurve bundle simulations',\n );\n }\n const exactAmountIn = params.exactAmountIn;\n this.ensureUint128(exactAmountIn, 'exactAmountIn');\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactIn',\n args: [{ ...createParams }, exactAmountIn, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountOut: amount,\n gasEstimate,\n };\n }\n\n /**\n * Execute an atomic create + swap bundle through the Bundler\n * commands/inputs are Universal Router encoded values (e.g., from doppler-router)\n */\n async bundle(\n createParams: CreateParams,\n commands: Hex,\n inputs: Hex[],\n options?: { gas?: bigint; value?: bigint },\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const bundler = this.getBundlerAddress();\n const { request } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'bundle',\n args: [{ ...createParams }, commands, inputs],\n account: this.walletClient.account,\n value: options?.value ?? 0n,\n });\n const gas = options?.gas ?? undefined;\n const tx = await this.walletClient.writeContract(\n gas ? { ...request, gas } : request,\n );\n return tx;\n }\n\n private ensureUint128(\n value: bigint,\n paramName: string,\n options: { allowZero?: boolean } = {},\n ): void {\n const { allowZero = false } = options;\n if (value < 0n) {\n throw new Error(`${paramName} cannot be negative`);\n }\n if (!allowZero && value === 0n) {\n throw new Error(`${paramName} must be greater than zero`);\n }\n if (value > MAX_UINT128) {\n throw new Error(`${paramName} exceeds uint128 range`);\n }\n }\n\n private parseMulticurveBundleResult(result: unknown): {\n asset: Address;\n poolKey: V4PoolKey;\n amount: bigint;\n gasEstimate: bigint;\n } {\n let asset: Address | undefined;\n let poolKeyRaw: unknown;\n let amount: bigint | undefined;\n let gasEstimate: bigint | undefined;\n\n if (Array.isArray(result)) {\n if (result.length < 4) {\n throw new Error('Unexpected multicurve bundle simulation result shape');\n }\n asset = result[0] as Address;\n poolKeyRaw = result[1];\n amount = result[2] as bigint;\n gasEstimate = result[3] as bigint;\n } else if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n asset = obj.asset as Address | undefined;\n poolKeyRaw = obj.poolKey;\n amount = (obj.amountIn ?? obj.amountOut ?? obj.amount) as\n | bigint\n | undefined;\n gasEstimate = obj.gasEstimate as bigint | undefined;\n } else {\n throw new Error('Unexpected multicurve bundle simulation result format');\n }\n\n if (\n asset === undefined ||\n poolKeyRaw === undefined ||\n amount === undefined ||\n gasEstimate === undefined\n ) {\n throw new Error('Incomplete multicurve bundle simulation result');\n }\n\n return {\n asset,\n poolKey: this.normalizePoolKey(poolKeyRaw),\n amount,\n gasEstimate,\n };\n }\n\n private normalizePoolKey(value: any): V4PoolKey {\n if (Array.isArray(value)) {\n const [currency0, currency1, feeRaw, tickSpacingRaw, hooks] = value as [\n Address,\n Address,\n number | bigint,\n number | bigint,\n Address,\n ];\n const feeValue = Number(feeRaw);\n const tickSpacingValue = Number(tickSpacingRaw);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n if (value && typeof value === 'object') {\n const { currency0, currency1, fee, tickSpacing, hooks } = value as Record<\n string,\n unknown\n >;\n const feeValue = Number(fee);\n const tickSpacingValue = Number(tickSpacing);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n throw new Error(\n 'Unable to normalize PoolKey from multicurve bundle simulation result',\n );\n }\n /**\n * Mines a salt and hook address with the appropriate flags\n *\n * This method iterates through possible salt values to find a combination that:\n * - Produces a hook address with required Doppler flags\n * - Maintains proper token ordering relative to numeraire\n * - Ensures deterministic deployment addresses\n *\n * @param params - Parameters for hook address mining\n * @returns Tuple of [salt, hook address, token address, pool data, token data]\n * @throws {Error} If no valid salt can be found within the search limit\n * @private\n */\n private mineHookAddress(params: {\n airlock: Address;\n poolManager: Address;\n deployer: Address;\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n tokenFactory: Address;\n tokenFactoryData:\n | {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n }\n | 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?: 'standard' | 'doppler404';\n }): [Hash, Address, Address, Hex, Hex] {\n const isToken0 = isToken0Expected(params.numeraire);\n\n const {\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n numPDSlugs,\n fee,\n tickSpacing,\n } = params.poolInitializerData;\n\n const poolInitializerData = encodeAbiParameters(\n [\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'uint24' },\n { type: 'int24' },\n ],\n [\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n fee,\n tickSpacing,\n ],\n );\n\n const { poolManager, numTokensToSell, poolInitializer } = params;\n\n const hookInitHashData = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'uint24' },\n ],\n [\n poolManager,\n numTokensToSell,\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n poolInitializer,\n fee,\n ],\n );\n\n const hookInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerBytecode as Hex, hookInitHashData],\n ),\n );\n\n const tokenFactoryData =\n params.tokenVariant === 'doppler404'\n ? (() => {\n const t = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [t.name, t.symbol, t.baseURI, t.unit ?? 1000n],\n );\n })()\n : 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 } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n const { airlock, initialSupply } = params;\n // DN404 constructor: (name, symbol, initialSupply, recipient, owner, baseURI)\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'string' },\n ],\n [name, symbol, initialSupply, airlock, airlock, baseURI],\n );\n tokenInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerDN404Bytecode as Hex, initHashData],\n ),\n );\n } else {\n const 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 return [\n saltBytes,\n hook,\n token,\n poolInitializerData,\n tokenFactoryData,\n ];\n }\n }\n }\n\n throw new Error('AirlockMiner: could not find salt');\n }\n\n /**\n * Helper to convert hex string to Uint8Array\n * @private\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);\n }\n return bytes;\n }\n\n /**\n * Helper to convert Uint8Array to hex string\n * @private\n */\n private bytesToHex(bytes: Uint8Array): string {\n return (\n '0x' +\n Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n );\n }\n\n /**\n * Pre-compute CREATE2 buffer with constant prefix for fast mining\n * Buffer layout: 0xff (1 byte) + deployer (20 bytes) + salt (32 bytes) + initCodeHash (32 bytes) = 85 bytes\n * @private\n */\n private prepareCreate2Buffer(\n deployer: Address,\n initCodeHash: Hash,\n ): Uint8Array {\n const buffer = new Uint8Array(85);\n buffer[0] = 0xff;\n const deployerBytes = this.hexToBytes(deployer);\n buffer.set(deployerBytes, 1);\n const initCodeHashBytes = this.hexToBytes(initCodeHash);\n buffer.set(initCodeHashBytes, 53); // 1 + 20 + 32 = 53\n return buffer;\n }\n\n /**\n * Update salt in pre-computed CREATE2 buffer (bytes 21-52)\n * Uses direct byte manipulation instead of string conversion\n * @private\n */\n private updateSaltInBuffer(buffer: Uint8Array, salt: bigint): void {\n // Salt is 32 bytes, positioned at offset 21 (after 0xff + 20-byte deployer)\n // Clear salt region first\n for (let i = 21; i < 53; i++) {\n buffer[i] = 0;\n }\n // Write salt bytes from right to left (big-endian)\n let remaining = salt;\n for (let i = 52; remaining > 0n && i >= 21; i--) {\n buffer[i] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n }\n\n /**\n * Compute CREATE2 address from pre-computed buffer (fast version for mining)\n * Returns raw lowercase address without checksum for comparison\n * @private\n */\n private computeCreate2AddressFast(buffer: Uint8Array): string {\n const hash = keccak256(this.bytesToHex(buffer) as Hex);\n // Return last 40 hex chars (20 bytes) as lowercase address\n return '0x' + hash.slice(-40).toLowerCase();\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Compute the V4 poolId for a multicurve pool from the same pool-key fields\n * the initializer will register on-chain.\n */\n private async computeMulticurvePoolId(\n params: CreateMulticurveParams<C>,\n tokenAddress: Address,\n ): Promise<Hex> {\n const addresses = getAddresses(this.chainId);\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n let hookAddress: Address;\n if (initializerMode.type === 'rehype') {\n // 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 // Standard/scheduled/decay initializers expose HOOK() directly.\n hookAddress = (await (this.publicClient as PublicClient).readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'HOOK',\n })) as Address;\n }\n\n // Construct the pool key and compute poolId\n const numeraire = params.sale.numeraire;\n const currency0 = tokenAddress < numeraire ? tokenAddress : numeraire;\n const currency1 = tokenAddress < numeraire ? numeraire : tokenAddress;\n const fee =\n initializerMode.type === 'decay' ||\n (initializerMode.type === 'rehype' && initializerMode.hookConfig)\n ? DYNAMIC_FEE_FLAG\n : params.pool.fee;\n\n return this.computePoolId({\n currency0,\n currency1,\n fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n }) as Hex;\n }\n\n private async ensureMulticurveBundlerSupport(\n bundler: Address,\n ): Promise<void> {\n if (this.multicurveBundlerSupport.get(bundler)) {\n return;\n }\n\n const client = this.publicClient as PublicClient;\n if (!client || typeof client.getBytecode !== 'function') {\n // If we cannot check support, optimistically assume true.\n this.multicurveBundlerSupport.set(bundler, true);\n return;\n }\n\n const bytecode = await client.getBytecode({ address: bundler });\n const supports = Boolean(\n bytecode &&\n MULTICURVE_BUNDLER_SELECTORS.every((selector) =>\n bytecode.includes(selector.slice(2)),\n ),\n );\n\n if (!supports) {\n throw new Error(\n `Bundler at ${bundler} does not support multicurve bundling. Ensure the Doppler Bundler has been upgraded and update chain addresses.`,\n );\n }\n\n this.multicurveBundlerSupport.set(bundler, true);\n }\n}\n\nconst MULTICURVE_BUNDLER_SELECTORS = ['0xe2e9faa1', '0x07087b06'] as const;\n","import { type Address, zeroAddress, type PublicClient } from 'viem';\nimport type { PoolInfo, SupportedPublicClient } from '../../types';\nimport { uniswapV3PoolAbi, airlockAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\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 // Determine whether token0 is the auction token.\n // Handle both tuple and object return shapes from getAssetData.\n // Tuple (legacy): [numeraire, timelock, governance, liquidityMigrator, poolInitializer, pool, ...]\n // Object (unified): { poolOrHook, liquidityMigrator, numeraire, ... }\n let poolOrHook0: any;\n if (Array.isArray(assetData)) {\n poolOrHook0 = assetData[5];\n } else if (assetData && typeof assetData === 'object') {\n poolOrHook0 = (assetData as any).poolOrHook ?? (assetData as any).pool;\n }\n const isToken0AuctionToken = poolOrHook0 && poolOrHook0 !== zeroAddress;\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 // Check if the asset is graduated (liquidityMigrator is zero)\n const liquidityMigrator = Array.isArray(assetData)\n ? (assetData as any)[3]\n : (assetData as any)?.liquidityMigrator;\n return liquidityMigrator === zeroAddress;\n }\n\n /**\n * Get the current 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 // Get token ordering\n const [token0] = await Promise.all([\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 ]);\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","import {\n type Address,\n type PublicClient,\n type Hex,\n keccak256,\n encodeAbiParameters,\n zeroAddress,\n} from 'viem';\nimport type { HookInfo, SupportedPublicClient } from '../../types';\nimport { dopplerHookAbi, airlockAbi } from '../../abis';\nimport { getAddresses } from '../../addresses';\n\n/**\n * DynamicAuction class for interacting with dynamic auctions (Uniswap V4 hook based)\n *\n * Dynamic auctions use a Uniswap V4 hook to create a gradual Dutch auction\n * where the price moves dynamically over time according to set parameters.\n */\nexport class DynamicAuction {\n private client: SupportedPublicClient;\n private hookAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(client: SupportedPublicClient, hookAddress: Address) {\n this.client = client;\n this.hookAddress = hookAddress;\n }\n\n /**\n * Wait for a transaction to be confirmed and the contract to be ready for reads\n * @param hash - Transaction hash to wait for\n * @param confirmations - Number of block confirmations to wait for (default: 2)\n */\n async waitForDeployment(hash: Hex, confirmations: number = 2): Promise<void> {\n await this.rpc.waitForTransactionReceipt({ hash, confirmations });\n }\n\n /**\n * Get the hook address\n */\n getAddress(): Address {\n return this.hookAddress;\n }\n\n /**\n * Get current hook information\n */\n async getHookInfo(): Promise<HookInfo> {\n // Fetch all hook data in parallel\n const [\n state,\n earlyExit,\n insufficientProceeds,\n poolKeyRaw,\n startingTime,\n endingTime,\n epochLength,\n minimumProceeds,\n maximumProceeds,\n ] = await Promise.all([\n this.readHookState(),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'earlyExit',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'insufficientProceeds',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'endingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'minimumProceeds',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'maximumProceeds',\n }),\n ]);\n\n // Calculate current epoch\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n const currentEpoch =\n epochLength > 0n ? Number(elapsedTime / epochLength) : 0;\n\n // Determine token addresses from poolKey\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n const isToken0 = poolKey.currency0 !== zeroAddress;\n const tokenAddress = isToken0 ? poolKey.currency0 : poolKey.currency1;\n const numeraireAddress = isToken0 ? poolKey.currency1 : poolKey.currency0;\n\n // Compute pool ID\n const poolId = this.computePoolId(poolKey);\n\n return {\n hookAddress: this.hookAddress,\n tokenAddress,\n numeraireAddress,\n poolId,\n currentEpoch,\n totalProceeds: (state as any).totalProceeds,\n totalTokensSold: (state as any).totalTokensSold,\n earlyExit,\n insufficientProceeds,\n startingTime,\n endingTime,\n epochLength,\n minimumProceeds,\n maximumProceeds,\n };\n }\n\n /**\n * Get the token address for this auction\n */\n async getTokenAddress(): Promise<Address> {\n const poolKeyRaw = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n });\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n\n const isToken0 = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'isToken0',\n });\n\n return isToken0 ? poolKey.currency0 : poolKey.currency1;\n }\n\n /**\n * Get the pool ID for this auction\n */\n async getPoolId(): Promise<string> {\n const poolKeyRaw = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'poolKey',\n });\n const poolKey = this.normalizePoolKey(poolKeyRaw as any);\n return this.computePoolId(poolKey);\n }\n\n /**\n * Check if the auction has graduated (ready for migration)\n */\n async hasGraduated(): Promise<boolean> {\n const tokenAddress = await this.getTokenAddress();\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId);\n\n const assetData = await this.rpc.readContract({\n address: addresses.airlock,\n abi: airlockAbi,\n functionName: 'getAssetData',\n args: [tokenAddress],\n });\n // Check if the asset is graduated (liquidityMigrator is zero)\n const liquidityMigrator = Array.isArray(assetData)\n ? (assetData as any)[3]\n : (assetData as any)?.liquidityMigrator;\n return liquidityMigrator === zeroAddress;\n }\n\n /**\n * Get the current epoch\n */\n async getCurrentEpoch(): Promise<number> {\n const [startingTime, epochLength] = await Promise.all([\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n ]);\n\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n\n return Number(elapsedTime / epochLength);\n }\n\n /**\n * Get the current price in the auction\n * Returns the current tick based on the epoch and gamma parameters\n */\n async getCurrentPrice(): Promise<bigint> {\n const [_state, startingTick, endingTick, gamma, startingTime, epochLength] =\n await Promise.all([\n this.readHookState(),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTick',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'endingTick',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'gamma',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'startingTime',\n }),\n this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'epochLength',\n }),\n ]);\n\n // Calculate current epoch\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const elapsedTime =\n currentTime > startingTime ? currentTime - startingTime : BigInt(0);\n const currentEpoch =\n epochLength > 0n ? Number(elapsedTime / epochLength) : 0;\n\n // Calculate current tick based on the auction progression\n // The tick moves from startingTick towards endingTick based on epochs and gamma\n const direction = endingTick > startingTick ? 1 : -1;\n const tickMovement = Math.floor(currentEpoch * gamma * direction);\n const currentTick = Math.floor(startingTick + tickMovement);\n\n // Convert tick to price\n // price = 1.0001^tick\n // For simplicity, returning the tick as bigint for now\n // In production, you'd convert this to actual price using TickMath\n return BigInt(currentTick);\n }\n\n /**\n * Get total proceeds collected so far\n */\n async getTotalProceeds(): Promise<bigint> {\n const state = await this.readHookState();\n\n return (state as any).totalProceeds;\n }\n\n /**\n * Check if the auction ended early due to max proceeds\n */\n async hasEndedEarly(): Promise<boolean> {\n return await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'earlyExit',\n });\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Read hook state with backward-compatible decoding.\n * Falls back to legacy state() ABI if the latest ABI fails to decode.\n */\n private async readHookState(): Promise<any> {\n const result: any = await this.rpc.readContract({\n address: this.hookAddress,\n abi: dopplerHookAbi,\n functionName: 'state',\n });\n if (Array.isArray(result)) {\n const [\n lastEpoch,\n tickAccumulator,\n totalTokensSold,\n totalProceeds,\n totalTokensSoldLastEpoch,\n feesAccrued,\n ] = result as any[];\n return {\n lastEpoch,\n tickAccumulator,\n totalTokensSold,\n totalProceeds,\n totalTokensSoldLastEpoch,\n feesAccrued,\n };\n }\n return result;\n }\n\n private normalizePoolKey(value: any): {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n } {\n if (Array.isArray(value)) {\n const [currency0, currency1, fee, tickSpacing, hooks] = value as [\n Address,\n Address,\n number,\n number,\n Address,\n ];\n return { currency0, currency1, fee, tickSpacing, hooks };\n }\n return value as any;\n }\n}\n","import {\n type Address,\n type PublicClient,\n type WalletClient,\n type Hash,\n type Hex,\n zeroAddress,\n} from 'viem';\nimport {\n LockablePoolStatus,\n type MulticurveDecayFeeSchedule,\n type MulticurvePoolState,\n type SupportedPublicClient,\n type V4PoolKey,\n} from '../../types';\nimport {\n decayMulticurveInitializerHookAbi,\n dopplerHookInitializerAbi,\n v4MulticurveInitializerAbi,\n v4MulticurveMigratorAbi,\n streamableFeesLockerAbi,\n} from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport type { SupportedChainId } from '../../addresses';\nimport { DYNAMIC_FEE_FLAG } from '../../constants';\nimport { computePoolId } from '../../utils/poolKey';\n\n/** Result from finding which initializer contains the pool */\ninterface InitializerDiscoveryResult {\n initializerAddress: Address;\n state: MulticurvePoolState;\n}\n\ninterface ParsedInitializerState {\n numeraire: Address;\n status: number;\n poolKey: V4PoolKey;\n farTick: number;\n}\n\n/**\n * MulticurvePool class for interacting with V4 multicurve pools\n *\n * Multicurve pools use the V4 multicurve initializer which supports:\n * - Multiple bonding curves with different price ranges\n * - Fee collection for configured beneficiaries\n * - No-migration lockable liquidity\n *\n * Note: V4 pools don't have their own contract addresses. The token address\n * is used as the lookup key to retrieve pool state from the initializer contract.\n *\n * Terminology: The contracts call the created token \"asset\" (paired against \"numeraire\", e.g., WETH).\n * We use \"tokenAddress\" in the SDK for consistency.\n */\nexport class MulticurvePool {\n private client: SupportedPublicClient;\n private walletClient?: WalletClient;\n private tokenAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(\n client: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n tokenAddress: Address,\n ) {\n this.client = client;\n this.walletClient = walletClient;\n this.tokenAddress = tokenAddress;\n }\n\n /**\n * Get the token address for this pool\n * This is also the lookup key used to retrieve pool state from the initializer\n * (Called \"asset\" in the contracts, but we use \"tokenAddress\" for SDK consistency)\n */\n getTokenAddress(): Address {\n return this.tokenAddress;\n }\n\n /**\n * Get current pool state from the multicurve initializer\n *\n * Automatically discovers which initializer (standard, scheduled, 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(): Promise<InitializerDiscoveryResult> {\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n const initializersToTry = [\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(\n (\n entry,\n ): entry is { address: Address; kind: 'standard' | 'dopplerHook' } =>\n entry.address !== undefined && entry.address !== zeroAddress,\n );\n\n if (initializersToTry.length === 0) {\n throw new Error(\n 'No V4 multicurve initializer addresses configured for this chain',\n );\n }\n\n const triedInitializers: Address[] = [];\n\n for (const initializer of initializersToTry) {\n const { address: initializerAddress, kind } = initializer;\n triedInitializers.push(initializerAddress);\n\n const stateData = await this.rpc.readContract({\n address: initializerAddress,\n abi:\n kind === 'dopplerHook'\n ? dopplerHookInitializerAbi\n : v4MulticurveInitializerAbi,\n functionName: 'getState',\n args: [this.tokenAddress],\n });\n\n const parsedState =\n kind === 'dopplerHook'\n ? this.parseDopplerHookInitializerState(stateData)\n : this.parseStandardInitializerState(stateData);\n const { numeraire, status, poolKey, farTick } = parsedState;\n\n // Check if pool exists in this initializer\n // A non-existent pool will have zeroed hooks and tickSpacing\n if (poolKey.hooks !== zeroAddress && poolKey.tickSpacing !== 0) {\n const state: MulticurvePoolState = {\n asset: this.tokenAddress,\n numeraire,\n fee: poolKey.fee,\n tickSpacing: poolKey.tickSpacing,\n status,\n poolKey,\n farTick: Number(farTick),\n };\n return { initializerAddress, state };\n }\n }\n\n // Pool not found in any initializer\n throw new Error(\n `Pool not found for token ${this.tokenAddress}. ` +\n `Tried initializers: ${triedInitializers.join(', ')}`,\n );\n }\n\n /**\n * Collect fees from the pool and distribute to beneficiaries\n *\n * This function can be called by any beneficiary to trigger fee collection\n * and distribution. Fees are automatically distributed according to the\n * configured beneficiary shares.\n *\n * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash\n */\n async collectFees(): Promise<{\n fees0: bigint;\n fees1: bigint;\n transactionHash: Hash;\n }> {\n if (!this.walletClient) {\n throw new Error('Wallet client required to collect fees');\n }\n\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Discover which initializer has this pool and get state in one call\n const { initializerAddress, state } = await this.findInitializerForPool();\n\n if (state.status === LockablePoolStatus.Locked) {\n const poolId = computePoolId(state.poolKey);\n const collectFeesAbi =\n initializerAddress === addresses.dopplerHookInitializer\n ? dopplerHookInitializerAbi\n : v4MulticurveInitializerAbi;\n return this.collectFeesFromContract(\n initializerAddress,\n collectFeesAbi,\n poolId,\n );\n }\n\n if (state.status === LockablePoolStatus.Exited) {\n if (!addresses.v4Migrator) {\n throw new Error(\n 'V4 multicurve migrator address not configured for this chain',\n );\n }\n\n const assetData = await this.rpc.readContract({\n address: addresses.v4Migrator,\n abi: v4MulticurveMigratorAbi,\n functionName: 'getAssetData',\n args: [state.poolKey.currency0, state.poolKey.currency1],\n });\n\n const migratorPoolKey = this.parsePoolKey(\n (assetData as any).poolKey ?? (assetData as any)[1],\n );\n const poolId = computePoolId(migratorPoolKey);\n\n const beneficiaries =\n (assetData as any).beneficiaries ?? (assetData as any)[4] ?? [];\n if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {\n throw new Error(\n 'Migrated multicurve pool has no beneficiaries configured',\n );\n }\n\n const lockerAddress = await this.resolveLockerAddress(\n addresses.v4Migrator,\n addresses.streamableFeesLocker,\n );\n\n const streamData = await this.rpc.readContract({\n address: lockerAddress,\n abi: streamableFeesLockerAbi,\n functionName: 'streams',\n args: [poolId],\n });\n\n const startDate = Number(\n (streamData as any).startDate ?? (streamData as any)[2] ?? 0,\n );\n if (startDate === 0) {\n throw new Error('Migrated multicurve stream not initialized');\n }\n\n return this.collectFeesFromContract(\n lockerAddress,\n streamableFeesLockerAbi,\n poolId,\n );\n }\n\n throw new Error('Multicurve pool is not locked or migrated');\n }\n\n /**\n * Get the numeraire address for this pool\n */\n async getNumeraireAddress(): Promise<Address> {\n const state = await this.getState();\n return state.numeraire;\n }\n\n /**\n * Get the decay fee schedule for dynamic-fee multicurve pools.\n *\n * Returns `null` when the pool is not using dynamic fees.\n */\n async getFeeSchedule(): Promise<MulticurveDecayFeeSchedule | null> {\n const { state } = await this.findInitializerForPool();\n if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {\n return null;\n }\n\n const poolId = computePoolId(state.poolKey);\n try {\n const scheduleData = await this.rpc.readContract({\n address: state.poolKey.hooks,\n abi: decayMulticurveInitializerHookAbi,\n functionName: 'getFeeScheduleOf',\n args: [poolId],\n });\n\n const scheduleStruct = scheduleData as any;\n return {\n startingTime: Number(\n scheduleStruct.startingTime ?? scheduleStruct[0] ?? 0,\n ),\n startFee: Number(scheduleStruct.startFee ?? scheduleStruct[1] ?? 0),\n endFee: Number(scheduleStruct.endFee ?? scheduleStruct[2] ?? 0),\n lastFee: Number(scheduleStruct.lastFee ?? scheduleStruct[3] ?? 0),\n durationSeconds: Number(\n scheduleStruct.durationSeconds ?? scheduleStruct[4] ?? 0,\n ),\n };\n } catch {\n throw new Error(\n `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,\n );\n }\n }\n\n private parsePoolKey(rawPoolKey: unknown): V4PoolKey {\n const poolKeyStruct = rawPoolKey as any;\n return {\n currency0: (poolKeyStruct.currency0 ?? poolKeyStruct[0]) as Address,\n currency1: (poolKeyStruct.currency1 ?? poolKeyStruct[1]) as Address,\n fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),\n tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),\n hooks: (poolKeyStruct.hooks ?? poolKeyStruct[4]) as Address,\n };\n }\n\n private parseStandardInitializerState(\n stateData: unknown,\n ): ParsedInitializerState {\n const state = stateData as any;\n return {\n numeraire: (state.numeraire ?? state[0]) as Address,\n status: Number(state.status ?? state[1]),\n poolKey: this.parsePoolKey(state.poolKey ?? state[2]),\n farTick: Number(state.farTick ?? state[3]),\n };\n }\n\n private parseDopplerHookInitializerState(\n stateData: unknown,\n ): ParsedInitializerState {\n const state = stateData as any;\n return {\n numeraire: (state.numeraire ?? state[0]) as Address,\n status: Number(state.status ?? state[4]),\n poolKey: this.parsePoolKey(state.poolKey ?? state[5]),\n farTick: Number(state.farTick ?? state[6]),\n };\n }\n\n private async resolveLockerAddress(\n migratorAddress: Address,\n configuredLocker?: Address,\n ): Promise<Address> {\n if (configuredLocker) {\n return configuredLocker;\n }\n\n const lockerAddress = await this.rpc.readContract({\n address: migratorAddress,\n abi: v4MulticurveMigratorAbi,\n functionName: 'locker',\n args: [],\n });\n\n return lockerAddress as Address;\n }\n\n private async collectFeesFromContract(\n contractAddress: Address,\n abi:\n | typeof dopplerHookInitializerAbi\n | typeof v4MulticurveInitializerAbi\n | typeof streamableFeesLockerAbi,\n poolId: Hex,\n ): Promise<{ fees0: bigint; fees1: bigint; transactionHash: Hash }> {\n const { request, result } = await this.rpc.simulateContract({\n address: contractAddress,\n abi,\n functionName: 'collectFees',\n args: [poolId],\n account: this.walletClient!.account,\n });\n\n const hash = await this.walletClient!.writeContract(request);\n\n await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n const [fees0, fees1] = result as readonly [bigint, bigint];\n\n return {\n fees0,\n fees1,\n transactionHash: hash,\n };\n }\n}\n","import type { Address, Hash, Hex, PublicClient, WalletClient } from 'viem';\nimport type { SupportedPublicClient } from '../../types';\nimport { rehypeDopplerHookAbi } from '../../abis';\nimport { decodeBalanceDelta } from '../../utils';\n\nexport class RehypeDopplerHook {\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: rehypeDopplerHookAbi,\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: rehypeDopplerHookAbi,\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 getFeeDistributionInfo(poolId: Hex): Promise<{\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 const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookAbi,\n functionName: 'getFeeDistributionInfo',\n args: [poolId],\n });\n\n const info = result as any;\n return {\n assetFeesToAssetBuybackWad: BigInt(\n info.assetFeesToAssetBuybackWad ?? info[0],\n ),\n assetFeesToNumeraireBuybackWad: BigInt(\n info.assetFeesToNumeraireBuybackWad ?? info[1],\n ),\n assetFeesToBeneficiaryWad: BigInt(\n info.assetFeesToBeneficiaryWad ?? info[2],\n ),\n assetFeesToLpWad: BigInt(info.assetFeesToLpWad ?? info[3]),\n numeraireFeesToAssetBuybackWad: BigInt(\n info.numeraireFeesToAssetBuybackWad ?? info[4],\n ),\n numeraireFeesToNumeraireBuybackWad: BigInt(\n info.numeraireFeesToNumeraireBuybackWad ?? info[5],\n ),\n numeraireFeesToBeneficiaryWad: BigInt(\n info.numeraireFeesToBeneficiaryWad ?? info[6],\n ),\n numeraireFeesToLpWad: BigInt(info.numeraireFeesToLpWad ?? info[7]),\n };\n }\n\n async getFeeRoutingMode(poolId: Hex): Promise<number> {\n const mode = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookAbi,\n functionName: 'getFeeRoutingMode',\n args: [poolId],\n });\n return Number(mode);\n }\n\n async getFeeSchedule(poolId: Hex): Promise<{\n startingTime: number;\n startFee: number;\n endFee: number;\n lastFee: number;\n durationSeconds: number;\n }> {\n const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookAbi,\n functionName: 'getFeeSchedule',\n args: [poolId],\n });\n\n const schedule = result as any;\n return {\n startingTime: Number(schedule.startingTime ?? schedule[0] ?? 0),\n startFee: Number(schedule.startFee ?? schedule[1] ?? 0),\n endFee: Number(schedule.endFee ?? schedule[2] ?? 0),\n lastFee: Number(schedule.lastFee ?? schedule[3] ?? 0),\n durationSeconds: Number(schedule.durationSeconds ?? schedule[4] ?? 0),\n };\n }\n\n async getHookFees(poolId: Hex): Promise<{\n fees0: bigint;\n fees1: bigint;\n beneficiaryFees0: bigint;\n beneficiaryFees1: bigint;\n airlockOwnerFees0: bigint;\n airlockOwnerFees1: bigint;\n customFee: number;\n }> {\n const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookAbi,\n functionName: 'getHookFees',\n args: [poolId],\n });\n\n const fees = result as any;\n return {\n fees0: BigInt(fees.fees0 ?? fees[0] ?? 0),\n fees1: BigInt(fees.fees1 ?? fees[1] ?? 0),\n beneficiaryFees0: BigInt(fees.beneficiaryFees0 ?? fees[2] ?? 0),\n beneficiaryFees1: BigInt(fees.beneficiaryFees1 ?? fees[3] ?? 0),\n airlockOwnerFees0: BigInt(fees.airlockOwnerFees0 ?? fees[4] ?? 0),\n airlockOwnerFees1: BigInt(fees.airlockOwnerFees1 ?? fees[5] ?? 0),\n customFee: Number(fees.customFee ?? fees[6] ?? 0),\n };\n }\n\n async getPoolInfo(poolId: Hex): Promise<{\n asset: Address;\n numeraire: Address;\n buybackDst: Address;\n }> {\n const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookAbi,\n functionName: 'getPoolInfo',\n args: [poolId],\n });\n\n const info = result as any;\n return {\n asset: (info.asset ?? info[0]) as Address,\n numeraire: (info.numeraire ?? info[1]) as Address,\n buybackDst: (info.buybackDst ?? info[2]) as Address,\n };\n }\n}\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';\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 const info = result as any;\n return {\n assetFeesToAssetBuybackWad: BigInt(\n info.assetFeesToAssetBuybackWad ?? info[0],\n ),\n assetFeesToNumeraireBuybackWad: BigInt(\n info.assetFeesToNumeraireBuybackWad ?? info[1],\n ),\n assetFeesToBeneficiaryWad: BigInt(\n info.assetFeesToBeneficiaryWad ?? info[2],\n ),\n assetFeesToLpWad: BigInt(info.assetFeesToLpWad ?? info[3]),\n numeraireFeesToAssetBuybackWad: BigInt(\n info.numeraireFeesToAssetBuybackWad ?? info[4],\n ),\n numeraireFeesToNumeraireBuybackWad: BigInt(\n info.numeraireFeesToNumeraireBuybackWad ?? info[5],\n ),\n numeraireFeesToBeneficiaryWad: BigInt(\n info.numeraireFeesToBeneficiaryWad ?? info[6],\n ),\n numeraireFeesToLpWad: BigInt(info.numeraireFeesToLpWad ?? info[7]),\n };\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<{\n fees0: bigint;\n fees1: bigint;\n beneficiaryFees0: bigint;\n beneficiaryFees1: bigint;\n airlockOwnerFees0: bigint;\n airlockOwnerFees1: bigint;\n customFee: number;\n }> {\n const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookMigratorAbi,\n functionName: 'getHookFees',\n args: [poolId],\n });\n\n const fees = result as any;\n return {\n fees0: BigInt(fees.fees0 ?? fees[0] ?? 0),\n fees1: BigInt(fees.fees1 ?? fees[1] ?? 0),\n beneficiaryFees0: BigInt(fees.beneficiaryFees0 ?? fees[2] ?? 0),\n beneficiaryFees1: BigInt(fees.beneficiaryFees1 ?? fees[3] ?? 0),\n airlockOwnerFees0: BigInt(fees.airlockOwnerFees0 ?? fees[4] ?? 0),\n airlockOwnerFees1: BigInt(fees.airlockOwnerFees1 ?? fees[5] ?? 0),\n customFee: Number(fees.customFee ?? fees[6] ?? 0),\n };\n }\n\n async getPoolInfo(poolId: Hex): Promise<{\n asset: Address;\n numeraire: Address;\n buybackDst: Address;\n }> {\n const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookMigratorAbi,\n functionName: 'getPoolInfo',\n args: [poolId],\n });\n\n const info = result as any;\n return {\n asset: (info.asset ?? info[0]) as Address,\n numeraire: (info.numeraire ?? info[1]) as Address,\n buybackDst: (info.buybackDst ?? info[2]) as Address,\n };\n }\n\n async getPosition(poolId: Hex): Promise<{\n tickLower: number;\n tickUpper: number;\n liquidity: bigint;\n salt: Hex;\n }> {\n const result = await this.rpc.readContract({\n address: this.hookAddress,\n abi: rehypeDopplerHookMigratorAbi,\n functionName: 'getPosition',\n args: [poolId],\n });\n\n const position = result as any;\n return {\n tickLower: Number(position.tickLower ?? position[0] ?? 0),\n tickUpper: Number(position.tickUpper ?? position[1] ?? 0),\n liquidity: BigInt(position.liquidity ?? position[2] ?? 0),\n salt: (position.salt ?? position[3]) as Hex,\n };\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 { 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 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 TICK_SPACINGS,\n WAD,\n} from '../constants';\nimport { MAX_TICK, MIN_TICK } from '../utils';\nimport type {\n PriceRange,\n TickRange,\n MulticurveMarketCapPreset,\n GovernanceOption,\n MigrationConfig,\n} from '../types';\nimport type { SupportedChainId } from '../addresses';\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 or Doppler404 token types.\n */\n tokenConfig(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this;\n\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?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): 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, dopplerHook, 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 withV4Migrator(address: Address): this;\n withNoOpMigrator(address: Address): this;\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 type { Address } from 'viem';\nimport {\n DEFAULT_V3_END_TICK,\n DEFAULT_V3_FEE,\n DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n DEFAULT_V3_NUM_POSITIONS,\n DEFAULT_V3_START_TICK,\n DEFAULT_V3_VESTING_DURATION,\n DEFAULT_V3_YEARLY_MINT_RATE,\n TICK_SPACINGS,\n V3_FEE_TIERS,\n ZERO_ADDRESS,\n} from '../constants';\nimport {\n marketCapToTicksForStaticAuction,\n validateMarketCapParameters,\n} from '../utils';\nimport {\n isNoOpEnabledChain,\n isLaunchpadEnabledChain,\n type CreateStaticAuctionParams,\n type GovernanceOption,\n type MigrationConfig,\n type PriceRange,\n type VestingConfig,\n type TokenConfig,\n type StaticAuctionMarketCapConfig,\n type ModuleAddressOverrides,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport { computeTicks, type BaseAuctionBuilder } from './shared';\n\nexport class StaticAuctionBuilder<\n C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n private token?: TokenConfig;\n private sale?: CreateStaticAuctionParams<C>['sale'];\n private pool?: CreateStaticAuctionParams<C>['pool'];\n private beneficiaries?: { beneficiary: Address; shares: bigint }[];\n private vesting?: VestingConfig;\n private governance?: GovernanceOption<C>;\n private migration?: MigrationConfig;\n private integrator?: Address;\n private userAddress?: Address;\n private moduleAddresses?: ModuleAddressOverrides;\n private gasLimit?: bigint;\n // Deferred market cap config - converted to pool in build()\n private marketCapConfig?: {\n marketCap: { start: number; end: number };\n numerairePrice: number;\n tokenSupply?: bigint;\n tokenDecimals?: number;\n numeraireDecimals?: number;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n };\n public chainId: C;\n\n constructor(chainId: C) {\n this.chainId = chainId;\n }\n\n static forChain<C extends SupportedChainId>(\n chainId: C,\n ): StaticAuctionBuilder<C> {\n return new StaticAuctionBuilder(chainId);\n }\n\n tokenConfig(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire,\n };\n return this;\n }\n\n /**\n * Provide pool ticks directly.\n *\n * Note: Static Auctions use Uniswap V3, which only supports 4 fee tiers:\n * 100 (0.01%), 500 (0.05%), 3000 (0.3%), 10000 (1%).\n * For custom fees, use Dynamic or Multicurve auctions (V4).\n */\n poolByTicks(params: {\n startTick?: number;\n endTick?: number;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n }): this {\n // Mutual exclusion: cannot use poolByTicks() after withMarketCapRange()\n if (this.marketCapConfig) {\n throw new Error(\n 'Cannot use poolByTicks() after withMarketCapRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n const fee = params.fee ?? DEFAULT_V3_FEE;\n\n // Validate fee is a V3-supported tier\n if (!(V3_FEE_TIERS as readonly number[]).includes(fee)) {\n throw new Error(\n `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n `Got: ${fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n );\n }\n\n const startTick = params.startTick ?? DEFAULT_V3_START_TICK;\n const endTick = params.endTick ?? DEFAULT_V3_END_TICK;\n this.pool = {\n startTick,\n endTick,\n fee,\n numPositions: params.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n };\n return this;\n }\n\n /**\n * @deprecated Use withMarketCapRange() instead for more intuitive market cap configuration\n */\n poolByPriceRange(params: {\n priceRange: PriceRange;\n fee?: number;\n numPositions?: number;\n maxShareToBeSold?: bigint;\n }): this {\n // Mutual exclusion: cannot use poolByPriceRange() after withMarketCapRange()\n if (this.marketCapConfig) {\n throw new Error(\n 'Cannot use poolByPriceRange() after withMarketCapRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n const fee = params.fee ?? DEFAULT_V3_FEE;\n const tickSpacing =\n fee === 100\n ? TICK_SPACINGS[100]\n : fee === 500\n ? TICK_SPACINGS[500]\n : fee === 3000\n ? TICK_SPACINGS[3000]\n : TICK_SPACINGS[10000];\n const ticks = computeTicks(params.priceRange, tickSpacing);\n return this.poolByTicks({\n startTick: ticks.startTick,\n endTick: ticks.endTick,\n fee,\n numPositions: params.numPositions,\n maxShareToBeSold: params.maxShareToBeSold,\n });\n }\n\n /**\n * Configure pool using target market cap range.\n * Converts market cap values (in USD) to Uniswap ticks.\n *\n * @param params - Market cap configuration\n * @returns Builder instance for chaining\n *\n * @example\n * ```ts\n * builder\n * .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n * .withMarketCapRange({\n * marketCap: { start: 100_000, end: 10_000_000 }, // $100k to $10M\n * numerairePrice: 3000, // ETH = $3000\n * })\n * ```\n */\n withMarketCapRange(params: StaticAuctionMarketCapConfig): this {\n // Mutual exclusion: cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange()\n if (this.pool) {\n throw new Error(\n 'Cannot use withMarketCapRange() after poolByTicks()/poolByPriceRange(). ' +\n 'Use withMarketCapRange() for market cap-based configuration, ' +\n 'or poolByTicks()/poolByPriceRange() for manual tick configuration.',\n );\n }\n\n // Basic validation that doesn't require saleConfig\n if (params.numerairePrice <= 0) {\n throw new Error('numerairePrice must be greater than 0');\n }\n if (params.marketCap.start <= 0 || params.marketCap.end <= 0) {\n throw new Error('marketCap values must be greater than 0');\n }\n if (params.marketCap.start >= params.marketCap.end) {\n throw new Error('marketCap.start must be less than marketCap.end');\n }\n\n // Validate fee is a V3-supported tier (if provided)\n if (params.fee !== undefined) {\n if (!(V3_FEE_TIERS as readonly number[]).includes(params.fee)) {\n throw new Error(\n `Static auctions (Uniswap V3) require standard fee tiers: ${V3_FEE_TIERS.join(', ')}. ` +\n `Got: ${params.fee}. For custom fees, use Dynamic or Multicurve auctions (Uniswap V4).`,\n );\n }\n }\n\n // Store config for deferred conversion in build()\n this.marketCapConfig = {\n marketCap: params.marketCap,\n numerairePrice: params.numerairePrice,\n tokenSupply: params.tokenSupply,\n tokenDecimals: params.tokenDecimals,\n numeraireDecimals: params.numeraireDecimals,\n fee: params.fee,\n numPositions: params.numPositions,\n maxShareToBeSold: params.maxShareToBeSold,\n };\n\n return this;\n }\n\n /**\n * Configure beneficiaries for fee streaming on locked V3 pools.\n *\n * When beneficiaries are provided, the pool enters a \"Locked\" state where:\n * - Fees are collected and distributed to beneficiaries according to their shares\n * - Liquidity cannot be exited/migrated (pool stays locked permanently)\n * - Anyone can call collectFees() to distribute accumulated fees\n *\n * IMPORTANT:\n * - Shares must sum to exactly WAD (1e18 = 100%)\n * - Protocol owner (Airlock.owner()) must be included with at least 5% shares\n * - Beneficiaries will be automatically sorted by address (ascending)\n * - Use withMigration({ type: 'noOp' }) when using beneficiaries\n *\n * @example\n * ```typescript\n * builder.withBeneficiaries([\n * { beneficiary: protocolOwner, shares: parseEther('0.05') }, // 5% (minimum required)\n * { beneficiary: teamWallet, shares: parseEther('0.45') }, // 45%\n * { beneficiary: daoTreasury, shares: parseEther('0.50') }, // 50%\n * ])\n * ```\n */\n withBeneficiaries(\n beneficiaries: { beneficiary: Address; shares: bigint }[],\n ): this {\n // Sort beneficiaries by address (ascending) as required by the contract\n this.beneficiaries = [...beneficiaries].sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n });\n return this;\n }\n\n withVesting(params?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? DEFAULT_V3_VESTING_DURATION),\n cliffDuration: params.cliffDuration ?? 0,\n recipients: params.recipients,\n amounts: params.amounts,\n };\n return this;\n }\n\n withGovernance(params: GovernanceOption<C>): this {\n this.governance = params;\n return this;\n }\n\n withMigration(migration: MigrationConfig): this {\n this.migration = migration;\n return this;\n }\n\n withUserAddress(address: Address): this {\n this.userAddress = address;\n return this;\n }\n\n withIntegrator(address?: Address): this {\n this.integrator = address ?? ZERO_ADDRESS;\n return this;\n }\n\n withGasLimit(gas?: bigint): this {\n this.gasLimit = gas;\n return this;\n }\n\n // Address override helpers\n private overrideModule<K extends keyof ModuleAddressOverrides>(\n key: K,\n address: NonNullable<ModuleAddressOverrides[K]>,\n ): this {\n this.moduleAddresses = {\n ...this.moduleAddresses,\n [key]: address,\n } as ModuleAddressOverrides;\n return this;\n }\n\n withTokenFactory(address: Address): this {\n return this.overrideModule('tokenFactory', address);\n }\n\n withAirlock(address: Address): this {\n return this.overrideModule('airlock', address);\n }\n\n withV3Initializer(address: Address): this {\n return this.overrideModule('v3Initializer', address);\n }\n\n withGovernanceFactory(address: Address): this {\n return this.overrideModule('governanceFactory', address);\n }\n\n withV2Migrator(address: Address): this {\n return this.overrideModule('v2Migrator', address);\n }\n\n withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', address);\n }\n\n withNoOpMigrator(address: Address): this {\n return this.overrideModule('noOpMigrator', address);\n }\n\n build(): CreateStaticAuctionParams<C> {\n if (!this.token) throw new Error('tokenConfig is required');\n if (!this.sale) throw new Error('saleConfig is required');\n if (!this.migration) throw new Error('migration configuration is required');\n if (!this.userAddress) throw new Error('userAddress is required');\n\n // Convert deferred market cap config to pool if set\n if (this.marketCapConfig && !this.pool) {\n const config = this.marketCapConfig;\n\n // Get token supply from config or saleConfig\n const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n if (!tokenSupply) {\n throw new Error(\n 'tokenSupply must be provided (either via saleConfig() or withMarketCapRange() params)',\n );\n }\n\n // Determine fee and tick spacing\n const fee = config.fee ?? DEFAULT_V3_FEE;\n const tickSpacing =\n fee === 100\n ? TICK_SPACINGS[100]\n : fee === 500\n ? TICK_SPACINGS[500]\n : fee === 3000\n ? TICK_SPACINGS[3000]\n : TICK_SPACINGS[10000];\n\n // Validate market cap parameters\n const startValidation = validateMarketCapParameters(\n config.marketCap.start,\n tokenSupply,\n config.tokenDecimals,\n );\n const endValidation = validateMarketCapParameters(\n config.marketCap.end,\n tokenSupply,\n config.tokenDecimals,\n );\n\n // Log warnings if any\n const allWarnings = [\n ...startValidation.warnings,\n ...endValidation.warnings,\n ];\n if (allWarnings.length > 0) {\n console.warn('Market cap validation warnings:');\n allWarnings.forEach((w) => console.warn(` - ${w}`));\n }\n\n // Convert market cap range to ticks for V3 Static auction\n const { startTick, endTick } = marketCapToTicksForStaticAuction({\n marketCapRange: config.marketCap,\n tokenSupply,\n numerairePriceUSD: config.numerairePrice,\n tickSpacing,\n tokenDecimals: config.tokenDecimals ?? 18,\n numeraireDecimals: config.numeraireDecimals ?? 18,\n });\n\n // Set pool config\n this.pool = {\n startTick,\n endTick,\n fee,\n numPositions: config.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n config.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n };\n }\n\n if (!this.pool) throw new Error('pool configuration is required');\n\n // Default governance: noOp on supported chains, default on others (e.g., Ink)\n const governance =\n this.governance ??\n (isNoOpEnabledChain(this.chainId)\n ? { type: 'noOp' as const }\n : { type: 'default' as const });\n\n if (\n governance.type === 'launchpad' &&\n !isLaunchpadEnabledChain(this.chainId)\n ) {\n throw new Error(\n `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n );\n }\n\n // Merge beneficiaries into pool config if provided\n const poolWithBeneficiaries = this.beneficiaries\n ? { ...this.pool, beneficiaries: this.beneficiaries }\n : this.pool;\n\n // Validate noOp migration requires beneficiaries\n // NoOpMigrator is designed for locked pools with beneficiaries. Without beneficiaries,\n // the pool status is \"Initialized\" (not \"Locked\"), meaning exitLiquidity() can be called.\n // But NoOpMigrator.migrate() always reverts, so the entire graduation transaction fails\n // and liquidity becomes trapped.\n if (this.migration.type === 'noOp') {\n const hasBeneficiaries =\n poolWithBeneficiaries.beneficiaries &&\n poolWithBeneficiaries.beneficiaries.length > 0;\n if (!hasBeneficiaries) {\n throw new Error(\n 'noOp migration requires beneficiaries. Without beneficiaries, the pool would be stuck after reaching ' +\n 'graduation - exitLiquidity() succeeds but NoOpMigrator.migrate() always reverts, causing the entire ' +\n 'transaction to fail. Either add beneficiaries via withBeneficiaries() or use a different migration type (uniswapV2, uniswapV4).',\n );\n }\n }\n\n return {\n token: this.token,\n sale: this.sale,\n pool: poolWithBeneficiaries,\n vesting: this.vesting,\n governance: governance as GovernanceOption<C>,\n migration: this.migration,\n integrator: this.integrator ?? ZERO_ADDRESS,\n userAddress: this.userAddress,\n modules: this.moduleAddresses,\n gas: this.gasLimit,\n };\n }\n}\n","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 { computeTicks, type BaseAuctionBuilder } 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(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire?: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire ?? 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?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? 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 withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', 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 dopplerHook 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 } 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} from '../utils';\nimport {\n isNoOpEnabledChain,\n isLaunchpadEnabledChain,\n RehypeFeeRoutingMode,\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 MulticurveInitializerConfig,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport {\n type BaseAuctionBuilder,\n type MarketCapPresetOverrides,\n buildCurvesFromPresets,\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?: RehypeDopplerHookConfig;\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 // 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(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire,\n };\n return this;\n }\n\n 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 RehypeDopplerHook 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.withRehypeDopplerHook({\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 withRehypeDopplerHook(params: RehypeDopplerHookConfig): this {\n this.assertCanSetInitializer('rehype');\n\n const feeDistributionInfo = this.resolveRehypeFeeDistributionInfo(params);\n this.validateRehypeDistribution(feeDistributionInfo);\n\n const { startFee, endFee, durationSeconds, startingTime, feeRoutingMode } =\n this.resolveRehypeFeeSchedule(params);\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 const normalizedParams: RehypeDopplerHookConfig = {\n ...params,\n startFee,\n endFee,\n durationSeconds,\n startingTime,\n feeRoutingMode,\n feeDistributionInfo,\n };\n\n this.dopplerHook = normalizedParams;\n this.initializer = { type: 'rehype', config: normalizedParams };\n return this;\n }\n\n private parseUint32Value(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(`${label} must be an integer number of seconds`);\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(`${label} must fit within uint32`);\n }\n return normalized;\n }\n\n private normalizeRehypeFeeRoutingMode(\n mode: RehypeDopplerHookConfig['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\n private resolveRehypeFeeDistributionInfo(\n params: RehypeDopplerHookConfig,\n ): NonNullable<RehypeDopplerHookConfig['feeDistributionInfo']> {\n if (params.feeDistributionInfo) {\n return params.feeDistributionInfo;\n }\n\n const assetBuyback = params.assetBuybackPercentWad;\n const numeraireBuyback = params.numeraireBuybackPercentWad;\n const beneficiary = params.beneficiaryPercentWad;\n const lp = params.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\n private validateRehypeDistribution(\n feeDistributionInfo: NonNullable<\n RehypeDopplerHookConfig['feeDistributionInfo']\n >,\n ): void {\n const assetRowTotal =\n feeDistributionInfo.assetFeesToAssetBuybackWad +\n feeDistributionInfo.assetFeesToNumeraireBuybackWad +\n feeDistributionInfo.assetFeesToBeneficiaryWad +\n feeDistributionInfo.assetFeesToLpWad;\n\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\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\n private resolveRehypeFeeSchedule(params: RehypeDopplerHookConfig): {\n startFee: number;\n endFee: number;\n durationSeconds: number;\n startingTime: number;\n feeRoutingMode: RehypeFeeRoutingMode;\n } {\n const MAX_REHYPE_FEE = 1_000_000;\n\n const startFeeRaw = params.startFee ?? params.customFee;\n if (startFeeRaw === undefined) {\n throw new Error(\n 'Rehype startFee is required, or provide deprecated customFee.',\n );\n }\n\n const endFeeRaw = params.endFee ?? startFeeRaw;\n const startFee = Number(startFeeRaw);\n const endFee = Number(endFeeRaw);\n\n if (\n !Number.isInteger(startFee) ||\n startFee < 0 ||\n startFee > MAX_REHYPE_FEE\n ) {\n throw new Error(\n `Rehype startFee must be an integer between 0 and ${MAX_REHYPE_FEE}`,\n );\n }\n if (!Number.isInteger(endFee) || endFee < 0 || endFee > MAX_REHYPE_FEE) {\n throw new Error(\n `Rehype endFee must be an integer between 0 and ${MAX_REHYPE_FEE}`,\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 params.durationSeconds ?? (startFee === endFee ? 0 : undefined);\n\n if (durationRaw === undefined) {\n throw new Error(\n 'Rehype durationSeconds must be provided when startFee is greater than endFee.',\n );\n }\n\n const durationSeconds = this.parseUint32Value(\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 startingTime =\n params.startingTime === undefined\n ? 0\n : this.parseStartTimeSeconds(\n params.startingTime,\n 'Rehype startingTime',\n );\n\n const feeRoutingMode = this.normalizeRehypeFeeRoutingMode(\n params.feeRoutingMode,\n );\n\n return {\n startFee,\n endFee,\n durationSeconds,\n startingTime,\n feeRoutingMode,\n };\n }\n\n withVesting(params?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? 0n),\n cliffDuration: params.cliffDuration ?? 0,\n recipients: params.recipients,\n amounts: params.amounts,\n };\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 === 'standard' ||\n currentType === nextType\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 = { type: 'standard' };\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 = { type: 'standard' };\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 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 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 withV4MulticurveInitializer(address: Address): this {\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 withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', address);\n }\n withNoOpMigrator(address: Address): this {\n return this.overrideModule('noOpMigrator', address);\n }\n withDopplerHookInitializer(address: Address): this {\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\n curves.push({\n tickLower: curveTicks.tickLower,\n tickUpper: curveTicks.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 // Convert graduationMarketCap to farTick if using rehype\n let dopplerHook = this.dopplerHook;\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 withRehypeDopplerHook().',\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 =\n this.initializer ??\n (dopplerHook\n ? { type: 'rehype', config: dopplerHook }\n : this.schedule\n ? { type: 'scheduled', startTime: this.schedule.startTime }\n : { type: 'standard' });\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 const schedule =\n initializer.type === 'scheduled'\n ? { startTime: initializer.startTime }\n : undefined;\n dopplerHook =\n initializer.type === 'rehype' ? initializer.config : undefined;\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 pool: this.pool,\n initializer,\n schedule,\n dopplerHook,\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 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 { type BaseAuctionBuilder } 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(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire,\n };\n return this;\n }\n\n 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?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? 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 withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', address);\n }\n\n withNoOpMigrator(address: Address): this {\n return this.overrideModule('noOpMigrator', address);\n }\n\n 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 RehypeDopplerHook,\n RehypeDopplerHookMigrator,\n OpeningAuction,\n OpeningAuctionLifecycle,\n OpeningAuctionBidManager,\n OpeningAuctionPositionManager,\n} from './entities/auction';\nimport { Quoter } from './entities/quoter';\nimport { Derc20, Derc20V2 } from './entities/token';\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\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 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 RehypeDopplerHook instance for interacting with initializer-side rehype hook state.\n * @param hookAddress The address of the RehypeDopplerHookInitializer\n */\n async getRehypeDopplerHook(hookAddress: Address): Promise<RehypeDopplerHook> {\n return new RehypeDopplerHook(\n this.publicClient,\n this.walletClient,\n hookAddress,\n );\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 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 {\n StaticAuction,\n DynamicAuction,\n MulticurvePool,\n RehypeDopplerHook,\n RehypeDopplerHookMigrator,\n OpeningAuction,\n OpeningAuctionLifecycle,\n OpeningAuctionBidManager,\n OpeningAuctionPositionManager,\n} from './entities/auction';\n\n// Export quoter\nexport { Quoter } from './entities/quoter';\n\n// Export token entities\nexport { Derc20, Derc20V2, Eth } 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 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 SaleConfig,\n StaticPoolConfig,\n DynamicAuctionConfig,\n VestingConfig,\n MigrationConfig,\n DopplerHookMigrationConfig,\n BeneficiaryData,\n\n // Lockable initializer types\n LockablePoolState,\n LockableV3InitializerParams,\n MulticurvePoolState,\n MulticurveMarketCapPreset,\n\n // DopplerHook types (e.g., RehypeDopplerHook)\n RehypeDopplerHookConfig,\n RehypeFeeDistributionInfo,\n RehypeDopplerHookMigratorConfig,\n MulticurveInitializerConfig,\n MulticurveDecayFeeSchedule,\n\n // Parameter types\n CreateStaticAuctionParams,\n CreateDynamicAuctionParams,\n CreateMulticurveParams,\n V4PoolKey,\n MulticurveBundleExactOutResult,\n MulticurveBundleExactInResult,\n OpeningAuctionState,\n OpeningAuctionCreateResult,\n OpeningAuctionCompleteResult,\n\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// Also export module override type for advanced usage\nexport type { ModuleAddressOverrides } 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"]}