@whetstone-research/doppler-sdk 1.0.35 → 1.0.37

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.
@@ -7,12 +7,7 @@ var viem = require('viem');
7
7
  var GENERATED_DOPPLER_DEPLOYMENTS = {
8
8
  "1": {
9
9
  Airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
10
- CloneDERC20VotesV2: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
11
- CloneDERC20VotesV2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
12
- CloneERC20: "0x215b2cE3Dd8D110394e94A868580D61a77aDEc4A",
13
- CloneERC20Factory: "0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e",
14
- CloneERC20Votes: "0xA8d0E8036D3fAE21C7Af075ad41942Bc1f807CDF",
15
- CloneERC20VotesFactory: "0x5A92bFfbc01ea0396A9c7D4154d36d4EAF2e483E",
10
+ Bundler: "0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c",
16
11
  DopplerCreateXDeployer: "0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83",
17
12
  DopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
18
13
  DopplerERC20V1: "0xDB7B520bb5C3a2C5d4871198081911359f93be87",
@@ -24,48 +19,19 @@ var GENERATED_DOPPLER_DEPLOYMENTS = {
24
19
  LockableUniswapV3Initializer: "0xA2E0435225D52a8B950122752978007D758056d7",
25
20
  NoOpGovernanceFactory: "0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638",
26
21
  NoOpMigrator: "0x233A71A7bB928b1357A1Ebf454298320989Ca5B5",
27
- Quoter: "0x076838736F90Cd1d30dED756A3B89E576BE972F8",
28
- RehypeDopplerHook: "0x3Ec4798A9B11e8243A8Db99687f7A23597B96623",
29
- RehypeDopplerHookInitializer: "0x9982538F41f2ae29ddb9d3D9307010052984FDbB",
30
- RehypeDopplerHookMigrator: "0x975f9d1939cf6e4A3c9D99f9d41e6411CF4dA23b",
31
- StreamableFeesLocker: "0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6",
22
+ Quoter: "0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D",
23
+ RehypeDopplerHookInitializer: "0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215",
24
+ RehypeDopplerHookMigrator: "0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B",
32
25
  StreamableFeesLockerV2: "0xcE3212e6536F33cD6fbFEE265224131353Ca3D47",
33
26
  TimelockFactory: "0x9fd40af2baAfAF03513f091444e821c0d5b06ea0",
34
27
  TopUpDistributor: "0x435312320C0330B1999746753551CdFbD83aD814",
35
28
  UniswapV2Locker: "0x06731e30df4B0209ED19C39Ba8eD253e17b0E495",
36
- UniswapV2Migrator: "0x765875bff87614cE0581ee73B9fa663B71F3DfF2",
37
29
  UniswapV2MigratorSplit: "0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3",
38
- UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
39
- UniswapV4Migrator: "0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5",
40
- UniswapV4MigratorHook: "0x4053D4fa966cbdCC20Ec62070aC8814De8bEE500",
41
- UniswapV4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
42
- UniswapV4MigratorSplitHook: "0x103aB8804e66bC272840940CBa0ad34729c4e500",
43
- UniswapV4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
44
- UniswapV4ScheduledMulticurveInitializerHook: "0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0"
45
- },
46
- "130": {
47
- Airlock: "0x77EbfBAE15AD200758E9E2E61597c0B07d731254",
48
- Bundler: "0x91231cDdD8d6C86Df602070a3081478e074b97b7",
49
- DopplerDeployer: "0x0d2f38d807bfAd5C18e430516e10ab560D300caF",
50
- DopplerLensQuoter: "0x82Ac010C67f70BACf7655cd8948a4AD92A173CAC",
51
- GovernanceFactory: "0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE",
52
- LockableUniswapV3Initializer: "0xA3C847eAb58eAa9cbc215C785c9cfBc19CDABD5f",
53
- NoOpGovernanceFactory: "0x3AD727ee0FBBb8Ee0920933FdB96F23fD56f1299",
54
- NoOpMigrator: "0x917da361072ce968acD810BbfC9B64079426ebf0",
55
- StreamableFeesLocker: "0x6ddfED58D238Ca3195E49d8ac3d4cEa6386E5C33",
56
- TokenFactory: "0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3",
57
- TokenFactory80: "0xf0B5141dD9096254B2ca624dff26024f46087229",
58
- UniswapV2Migrator: "0xf6023127f6E937091D5B605680056A6D27524bad",
59
- UniswapV3Initializer: "0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec",
60
- UniswapV4Initializer: "0x4B0EC16Eb40318Ca5A4346f20F04A2285C19675B",
61
- UniswapV4Migrator: "0x49F3fBB2dFF7f3d03B622e3b2a6d3F2E6fdB2a5A",
62
- UniswapV4MigratorHook: "0x53C050d3B09C80024138165520Bd7c078D9e2000"
30
+ UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad"
63
31
  },
64
32
  "143": {
65
33
  Airlock: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12",
66
- Bundler: "0xC99b485499f78995C6F1640dbB1413c57f8BA684",
67
- CloneDERC20VotesV2: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
68
- CloneDERC20VotesV2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
34
+ Bundler: "0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c",
69
35
  DopplerCreateXDeployer: "0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83",
70
36
  DopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
71
37
  DopplerERC20V1: "0xDB7B520bb5C3a2C5d4871198081911359f93be87",
@@ -77,58 +43,19 @@ var GENERATED_DOPPLER_DEPLOYMENTS = {
77
43
  LockableUniswapV3Initializer: "0x8b4C7DB9121FC885689C0A50D5a1429F15AEc2a0",
78
44
  NoOpGovernanceFactory: "0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9",
79
45
  NoOpMigrator: "0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731",
80
- Quoter: "0x076838736F90Cd1d30dED756A3B89E576BE972F8",
81
- RehypeDopplerHook: "0x97cAD5684FB7Cc2bEd9a9b5eBfba67138F4f2503",
82
- RehypeDopplerHookInitializer: "0x9982538F41f2ae29ddb9d3D9307010052984FDbB",
83
- RehypeDopplerHookMigrator: "0x975f9d1939cf6e4A3c9D99f9d41e6411CF4dA23b",
84
- StreamableFeesLocker: "0x63f8C8F9beFaab2FaCD7Ece0b0242f78B920Ee90",
46
+ Quoter: "0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D",
47
+ RehypeDopplerHookInitializer: "0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215",
48
+ RehypeDopplerHookMigrator: "0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B",
85
49
  StreamableFeesLockerV2: "0xcE3212e6536F33cD6fbFEE265224131353Ca3D47",
86
50
  TimelockFactory: "0x44610355465c1F5914C8B8ea0E7c887CC67459b2",
87
- TokenFactory: "0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5",
88
- TokenFactory80: "0xf0B5141dD9096254B2ca624dff26024f46087229",
89
51
  TopUpDistributor: "0x435312320C0330B1999746753551CdFbD83aD814",
90
52
  UniswapV2Locker: "0x06731e30df4B0209ED19C39Ba8eD253e17b0E495",
91
- UniswapV2Migrator: "0x136191B46478cAB023cbC01a36160C4Aad81677a",
92
53
  UniswapV2MigratorSplit: "0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3",
93
- UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
94
- UniswapV4Migrator: "0x44bf742e57cd8cF23ABbc8dab2c44e2a3228356E",
95
- UniswapV4MigratorHook: "0x3E4c689BBf33b37106eBC13Db8aa5BF13a25e500",
96
- UniswapV4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
97
- UniswapV4MigratorSplitHook: "0x103aB8804e66bC272840940CBa0ad34729c4e500",
98
- UniswapV4ScheduledMulticurveInitializer: "0xCe3099B2F07029b086E5e92a1573C5f5A3071783",
99
- UniswapV4ScheduledMulticurveInitializerHook: "0x580ca49389d83b019d07E17e99454f2F218e2dc0"
100
- },
101
- "1301": {
102
- Airlock: "0x0d2f38d807bfAd5C18e430516e10ab560D300caF",
103
- AirlockMultisigTestnet: "0x0abCf819FD57C9f0141628410fFC273405E44426",
104
- Bundler: "0xED344444633B965cd148F8fFCE3765938A179094",
105
- DopplerDeployer: "0x77B5F559EE9cf3bfcf2fFf5731a84332D8eECAC9",
106
- DopplerLensQuoter: "0x917da361072ce968acD810BbfC9B64079426ebf0",
107
- GovernanceFactory: "0x4225C632b62622Bd7B0A3eC9745C0a866Ff94F6F",
108
- LockableUniswapV3Initializer: "0x9dFb775dB7b005d9Dc77DA84D8b2e42C281D0344",
109
- NoOpGovernanceFactory: "0x7E5D336A6E9e453c9f02E5102CC039E015Fd8fb8",
110
- NoOpMigrator: "0x193F48A45B6025dDeD10bc4BaeEF65c833696387",
111
- StreamableFeesLocker: "0x1728E8B3282502f275949109331E070b819B38eA",
112
- TokenFactory: "0x82Ac010C67f70BACf7655cd8948a4AD92A173CAC",
113
- TokenFactory80: "0xf0B5141dD9096254B2ca624dff26024f46087229",
114
- UniswapV2Migrator: "0x620e3fec244e913d73f2163623b62d02DB69638B",
115
- UniswapV3Initializer: "0xE0dC4012AC9C868F09c6e4b20d66ED46D6F258d0",
116
- UniswapV4Initializer: "0x70d20cd48791E527036491dc464C8Dc58351Dd93",
117
- UniswapV4Migrator: "0xb6D69eAA98E657bEEFF7ca4452768e6f707aa6b1",
118
- UniswapV4MigratorHook: "0xFB0671Ec46190b09255776d2D77744fa101Ba500",
119
- UniswapV4MulticurveInitializer: "0xac7939F1B4079d55A7fA4DFA314Ac0173A77bA40",
120
- UniswapV4MulticurveInitializerHook: "0x11b55A121a38FDab8FAF16f9f1A4f124E3f42d40",
121
- UniswapV4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
122
- UniswapV4ScheduledMulticurveInitializerHook: "0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0"
123
- },
124
- "4326": {
125
- Airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
126
- NoOpGovernanceFactory: "0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638",
127
- NoOpMigrator: "0x233A71A7bB928b1357A1Ebf454298320989Ca5B5"
54
+ UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad"
128
55
  },
129
56
  "4663": {
130
57
  Airlock: "0xeb7C034704eF8Dcd2D32324c1545f62fB4aD0862",
131
- Bundler: "0xEdE0B5fae363232c396724Fa962250Fa197cc5a1",
58
+ Bundler: "0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c",
132
59
  DN404Factory: "0x37A9Fa204a4d3A429FDED7e3469ab076C854Bc9d",
133
60
  DopplerCreateXDeployer: "0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83",
134
61
  DopplerDeployer: "0x4389AD34938B14F25cff7ED983c53f5a42A2573f",
@@ -142,9 +69,9 @@ var GENERATED_DOPPLER_DEPLOYMENTS = {
142
69
  LockableUniswapV3Initializer: "0xde8886A0019Ea060B8378Ee37b8A23b8117F29A3",
143
70
  NoOpGovernanceFactory: "0x85f37f74Ef2478A770318bc810177a9835911aD7",
144
71
  NoOpMigrator: "0xba2F330EDb16cD8056f5988d8CE19BbC63475A0e",
145
- Quoter: "0x076838736F90Cd1d30dED756A3B89E576BE972F8",
146
- RehypeDopplerHookInitializer: "0x9982538F41f2ae29ddb9d3D9307010052984FDbB",
147
- RehypeDopplerHookMigrator: "0x975f9d1939cf6e4A3c9D99f9d41e6411CF4dA23b",
72
+ Quoter: "0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D",
73
+ RehypeDopplerHookInitializer: "0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215",
74
+ RehypeDopplerHookMigrator: "0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B",
148
75
  StreamableFeesLockerV2: "0x7B6147AC3F615bdb764e7EbD5f517dac1AD163B8",
149
76
  SwapRestrictorDopplerHook: "0xC16c826F75338A5Ea626f94f8992191B4ce5abA2",
150
77
  TimelockFactory: "0x6076fdDFCaC0dD980e0350dfF5239feC3f86C578",
@@ -153,26 +80,9 @@ var GENERATED_DOPPLER_DEPLOYMENTS = {
153
80
  UniswapV2MigratorSplit: "0xB05046cEa797c993FB5b583098B1c4682e9Da333",
154
81
  UniswapV4Initializer: "0x6cce158B6D1747617fc218592B4D60B239B957ea"
155
82
  },
156
- "4801": {
157
- Airlock: "0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731",
158
- GovernanceFactory: "0x136191B46478cAB023cbC01a36160C4Aad81677a",
159
- TokenFactory: "0x5FBe931dc4B923A7abe4c47aD68d5bF9Eda5B76D",
160
- UniswapV2Migrator: "0x8b4C7DB9121FC885689C0A50D5a1429F15AEc2a0",
161
- UniswapV3Initializer: "0x9916Ec1c1E0462F6F8f7514e414F06bf001Ac82A",
162
- WETH: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12"
163
- },
164
- "6343": {
165
- Airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
166
- NoOpGovernanceFactory: "0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638",
167
- NoOpMigrator: "0x233A71A7bB928b1357A1Ebf454298320989Ca5B5"
168
- },
169
83
  "8453": {
170
84
  Airlock: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12",
171
- Bundler: "0x136191B46478cAB023cbC01a36160C4Aad81677a",
172
- CloneDERC20VotesV2: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
173
- CloneDERC20VotesV2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
174
- DecayMulticurveInitializer: "0xD59cE43E53D69F190E15d9822Fb4540dCcc91178",
175
- DecayMulticurveInitializerHook: "0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0",
85
+ Bundler: "0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c",
176
86
  DN404Factory: "0x37A9Fa204a4d3A429FDED7e3469ab076C854Bc9d",
177
87
  DopplerCreateXDeployer: "0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83",
178
88
  DopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
@@ -186,78 +96,47 @@ var GENERATED_DOPPLER_DEPLOYMENTS = {
186
96
  LockableUniswapV3Initializer: "0xE0dC4012AC9C868F09c6e4b20d66ED46D6F258d0",
187
97
  NoOpGovernanceFactory: "0xe7dfbd5b0A2C3B4464653A9beCdc489229eF090E",
188
98
  NoOpMigrator: "0x6ddfED58D238Ca3195E49d8ac3d4cEa6386E5C33",
189
- Quoter: "0x076838736F90Cd1d30dED756A3B89E576BE972F8",
190
- RehypeDopplerHook: "0x3Ec4798A9B11e8243A8Db99687f7A23597B96623",
191
- RehypeDopplerHookInitializer: "0x9982538F41f2ae29ddb9d3D9307010052984FDbB",
192
- RehypeDopplerHookMigrator: "0x975f9d1939cf6e4A3c9D99f9d41e6411CF4dA23b",
193
- StreamableFeesLocker: "0x0A00775D71a42cd33D62780003035e7F5b47bD3A",
99
+ Quoter: "0xce6cd4E35447E05A39A50A4bCf61f2DcD93A8f0D",
100
+ RehypeDopplerHookInitializer: "0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215",
101
+ RehypeDopplerHookMigrator: "0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B",
194
102
  StreamableFeesLockerV2: "0xcE3212e6536F33cD6fbFEE265224131353Ca3D47",
195
103
  TimelockFactory: "0xa636bD5F9179E80e9EdB371Ed90956fA5ebdCB33",
196
- TokenFactory: "0x4225C632b62622Bd7B0A3eC9745C0a866Ff94F6F",
197
- TokenFactory80: "0xf0B5141dD9096254B2ca624dff26024f46087229",
198
104
  TopUpDistributor: "0x435312320C0330B1999746753551CdFbD83aD814",
199
105
  UniswapV2Locker: "0x06731e30df4B0209ED19C39Ba8eD253e17b0E495",
200
- UniswapV2Migrator: "0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731",
201
106
  UniswapV2MigratorSplit: "0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3",
202
- UniswapV3Initializer: "0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5",
203
- UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
204
- UniswapV4Migrator: "0xd3B4cF7FD24381e90A4F012fC6c5976b87B9B3cE",
205
- UniswapV4MigratorHook: "0xD6FECFF347c6203A41874e8D77dE669B54e7A500",
206
- UniswapV4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
207
- UniswapV4MigratorSplitHook: "0x103aB8804e66bC272840940CBa0ad34729c4e500",
208
- UniswapV4MulticurveInitializer: "0x65dE470Da664A5be139A5D812bE5FDa0d76CC951",
209
- UniswapV4MulticurveInitializerHook: "0x892D3C2B4ABEAAF67d52A7B29783E2161B7CaD40",
210
- UniswapV4ScheduledMulticurveInitializer: "0xA36715dA46Ddf4A769f3290f49AF58bF8132ED8E",
211
- UniswapV4ScheduledMulticurveInitializerHook: "0x3e342a06f9592459D75721d6956B570F02eF2Dc0"
212
- },
213
- "10143": {
214
- Airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
215
- AirlockMultisigTestnet: "0x0abCf819FD57C9f0141628410fFC273405E44426",
216
- Bundler: "0xf6023127f6E937091D5B605680056A6D27524bad",
217
- DopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
218
- DopplerLensQuoter: "0x2F2BAcd46d3F5c9EE052Ab392b73711dB89129DB",
219
- GovernanceFactory: "0x014E1c0bd34f3B10546E554CB33B3293fECDD056",
220
- LockableUniswapV3Initializer: "0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE",
221
- NoOpGovernanceFactory: "0x094D926A969B3024ca46D2186BF13FD5CDBA9CE2",
222
- NoOpMigrator: "0x5CadB034267751a364dDD4d321C99E07A307f915",
223
- StreamableFeesLocker: "0x0d2f38d807bfAd5C18e430516e10ab560D300caF",
224
- TimelockFactory: "0xB544F6fFF61F601F638C3930F6Aec4bbD7DA42b9",
225
- TokenFactory: "0x8AF018e28c273826e6b2d5a99e81c8fB63729b07",
226
- TokenFactory80: "0xf0B5141dD9096254B2ca624dff26024f46087229",
227
- UniswapV2Locker: "0xfF3e891F2C1389eF638F9b0576003590aeEe1844",
228
- UniswapV2Migrator: "0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3",
229
- UniswapV3Initializer: "0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec",
230
- UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
231
- UniswapV4Migrator: "0x4B0EC16Eb40318Ca5A4346f20F04A2285C19675B",
232
- UniswapV4MigratorHook: "0x76E1f507592d9856B48482c599732d129eD6a500",
233
- UniswapV4MulticurveInitializer: "0xA3C847eAb58eAa9cbc215C785c9cfBc19CDABD5f",
234
- UniswapV4MulticurveInitializerHook: "0xFaF16d11737E6552156DD328cD26C530e1da2D40",
235
- WETH: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12"
236
- },
237
- "57073": {
238
- Airlock: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12",
239
- Bundler: "0x136191B46478cAB023cbC01a36160C4Aad81677a",
240
- DopplerDeployer: "0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B",
241
- DopplerLensQuoter: "0x8AF018e28c273826e6b2d5a99e81c8fB63729b07",
242
- GovernanceFactory: "0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9",
243
- TokenFactory: "0xFAafdE6a5b658684cC5eb0C5c2c755B00A246F45",
244
- UniswapV2Migrator: "0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731",
245
- UniswapV3Initializer: "0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5",
246
- UniswapV4Initializer: "0x014E1c0bd34f3B10546E554CB33B3293fECDD056"
107
+ UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad"
108
+ },
109
+ "42161": {
110
+ Airlock: "0xeb7C034704eF8Dcd2D32324c1545f62fB4aD0862",
111
+ Bundler: "0xf45588E8e0B1df9dB9ae7E20eCE5726AE931357c",
112
+ DN404Factory: "0x37A9Fa204a4d3A429FDED7e3469ab076C854Bc9d",
113
+ DopplerCreateXDeployer: "0x103004E50Bed65DFBa30dD9c264B6BdF5e529B83",
114
+ DopplerDeployer: "0x4389AD34938B14F25cff7ED983c53f5a42A2573f",
115
+ DopplerERC20V1: "0x3Be8B97Fd0e713B5aBE0649Fa830223B6B4BC599",
116
+ DopplerERC20V1Factory: "0x1B37D3a72082029c44B35B604Ea473617580b69a",
117
+ DopplerHookInitializer: "0xAa7f809BB3752f715fA2e418230667C382A56544",
118
+ DopplerHookMigrator: "0x7BF319d8e969f7596B1Bc171Da9ce322f67Ae0c4",
119
+ DopplerLensQuoter: "0xf4c22465532f64777FfcD7770831AEca38F35c04",
120
+ GovernanceFactory: "0xDeb0447DAE3EB177c4dbA8bBCCCa25c8F273B7ef",
121
+ LaunchpadGovernanceFactory: "0xdb036746D65DD52126b1915f1AdF555e6C5237Cf",
122
+ LockableUniswapV3Initializer: "0xde8886A0019Ea060B8378Ee37b8A23b8117F29A3",
123
+ NoOpGovernanceFactory: "0x85f37f74Ef2478A770318bc810177a9835911aD7",
124
+ NoOpMigrator: "0xba2F330EDb16cD8056f5988d8CE19BbC63475A0e",
125
+ Quoter: "0xc9Be59b344Ec66547A4C697aa374e959D59b0567",
126
+ RehypeDopplerHookInitializer: "0x5F9eB5f6726Fe88D5e39867967F5b833d2fA3215",
127
+ RehypeDopplerHookMigrator: "0x660740D7d6Fb2C8998Fa3ffF459cceB9Ac12C84B",
128
+ StreamableFeesLockerV2: "0xEd822828B6109d16a9D362b8146a35789E0064f5",
129
+ SwapRestrictorDopplerHook: "0xC16c826F75338A5Ea626f94f8992191B4ce5abA2",
130
+ TimelockFactory: "0x6076fdDFCaC0dD980e0350dfF5239feC3f86C578",
131
+ TopUpDistributor: "0x46adee7595d48b1Ec53090e9bc78e1E69Fa0eF06",
132
+ UniswapV2Locker: "0x63f6Efe03F25A8C6650b38d05C5a454051d642a5",
133
+ UniswapV2MigratorSplit: "0xB05046cEa797c993FB5b583098B1c4682e9Da333",
134
+ UniswapV4Initializer: "0x6cce158B6D1747617fc218592B4D60B239B957ea"
247
135
  },
248
136
  "84532": {
249
137
  Airlock: "0x3411306Ce66c9469BFF1535BA955503c4Bde1C6e",
250
138
  AirlockMultisigTestnet: "0x0abCf819FD57C9f0141628410fFC273405E44426",
251
- BasicMultisig: "0x6f645FA08B7eadAD620CEC85634204b1d7A46DC2",
252
- Bundler: "0x69DB7c20cDdA49Bed2bFb21e16Fa218330C50661",
253
- CloneDERC20VotesV2: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
254
- CloneDERC20VotesV2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
255
- CloneERC20: "0xE7F1Cc50CCa68975eD6E56Ee4b0Aaf171D02732A",
256
- CloneERC20Factory: "0xbf4Ca4D527c9760A884df31292f72E9AcA503045",
257
- CloneERC20Votes: "0x52831E40151a79FE2e74549b0974d44A10Ac30aD",
258
- CloneERC20VotesFactory: "0x9a497a9fB78e49984B9d260abA1F4AD6321D4D92",
259
- DecayMulticurveInitializer: "0xD59cE43E53D69F190E15d9822Fb4540dCcc91178",
260
- DecayMulticurveInitializerHook: "0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0",
139
+ Bundler: "0xDdDDDd67579B73fDdFf301DB92Fd4A01afD4613a",
261
140
  DN404Factory: "0x98b0Aa2e0f134dbB3eb157b5646D387E6D55243a",
262
141
  DopplerCreateXDeployer: "0x0000000000f13Ab5b685F03A412A26719aB6bE60",
263
142
  DopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
@@ -269,80 +148,24 @@ var GENERATED_DOPPLER_DEPLOYMENTS = {
269
148
  GovernanceFactory: "0x9dBFaaDC8c0cB2c34bA698DD9426555336992e20",
270
149
  LaunchpadGovernanceFactory: "0x0902e7C7207df8ed6303Aef4382bcab181b5fBFA",
271
150
  LockableUniswapV3Initializer: "0x16AdA5Be50C3c2D94Af5fEae6b539C40A78Ad53c",
272
- MulticurveLibrary: "0x32238a39ba5aF060EFbfAda59979B639E0945fE0",
273
151
  NoOpGovernanceFactory: "0x7bD798fafC99A3b17E261F8308A8C11B56935ea1",
274
152
  NoOpMigrator: "0xF11066abbd329ac4bBA39455340539322C222eb0",
275
- Quoter: "0x23C94d575C3e116fFDd7D5fbb50b7cA4972EdA83",
276
- RehypeDopplerHook: "0x3Ec4798A9B11e8243A8Db99687f7A23597B96623",
277
- RehypeDopplerHookInitializer: "0x78C79C95eacEb2D08f7a55cc0D31012f8aF510c3",
278
- RehypeDopplerHookMigrator: "0x9349E5A3e6458aa65E2fB7ED67e9aD08Ae7F660D",
279
- StreamableFeesLocker: "0x3345E557c5C0b474bE1eb4693264008B8562Aa9c",
153
+ Quoter: "0xc20347a97646ed6e2B45DBfEcE372f68d928ec0a",
154
+ RehypeDopplerHookInitializer: "0xAdB90eF4dc001CFB81ecADEd2CDbda7D18487606",
155
+ RehypeDopplerHookMigrator: "0x5E2A91F8eBE288e0AA76a0C1A47877Ded801e90d",
280
156
  StreamableFeesLockerV2: "0xcE3212e6536F33cD6fbFEE265224131353Ca3D47",
281
- TeamGovernanceFactory: "0x8aF3001ED75F86f4Dd910577ECa9C5dB7CEa765c",
282
157
  TimelockFactory: "0x80F42ECCc91177D39E20f1A88A54D231c1b086a2",
283
- TokenFactory: "0x9D8fd79B2a59c5d91ccBd79c3AEb4de56451Bb02",
284
- TokenFactory80: "0xf0B5141dD9096254B2ca624dff26024f46087229",
285
158
  TopUpDistributor: "0x435312320C0330B1999746753551CdFbD83aD814",
286
159
  UniswapV2Locker: "0x06731e30df4B0209ED19C39Ba8eD253e17b0E495",
287
- UniswapV2Migrator: "0x04a898f3722c38F9Def707bD17DC78920EFA977C",
288
160
  UniswapV2MigratorSplit: "0xD7abA5f1d80a330a6fe9E96F7bA122710E0912d3",
289
- UniswapV3Initializer: "0x4C3062B9ccFdbCB10353F57C1B59a29d4c5CFa47",
290
- UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
291
- UniswapV4Migrator: "0xEEe0eCCb54398ce371CAACBCEf076d3Ed597DDb3",
292
- UniswapV4MigratorHook: "0x127cAAAd598Ffa97577940b0a5c3b6150019E500",
293
- UniswapV4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
294
- UniswapV4MigratorSplitHook: "0x103aB8804e66bC272840940CBa0ad34729c4e500",
295
- UniswapV4MulticurveInitializer: "0x1718405E58c61425cDc0083262bC9f72198F5232",
296
- UniswapV4MulticurveInitializerHook: "0x6a1061FC558dDe1E6fD0eFd641b370d435b56d40",
297
- UniswapV4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
298
- UniswapV4ScheduledMulticurveInitializerHook: "0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0",
299
- WETH: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12"
300
- },
301
- "763373": {
302
- Airlock: "0x5CadB034267751a364dDD4d321C99E07A307f915",
303
- GovernanceFactory: "0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec",
304
- TokenFactory: "0x77EbfBAE15AD200758E9E2E61597c0B07d731254",
305
- UniswapV2Migrator: "0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE",
306
- UniswapV3Initializer: "0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3",
307
- WETH: "0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B"
308
- },
309
- "11155111": {
310
- Airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
311
- AirlockMultisigTestnet: "0x0abCf819FD57C9f0141628410fFC273405E44426",
312
- CloneDERC20VotesV2: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
313
- CloneDERC20VotesV2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
314
- CloneERC20: "0x215b2cE3Dd8D110394e94A868580D61a77aDEc4A",
315
- CloneERC20Factory: "0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e",
316
- CloneERC20Votes: "0xA8d0E8036D3fAE21C7Af075ad41942Bc1f807CDF",
317
- CloneERC20VotesFactory: "0x5A92bFfbc01ea0396A9c7D4154d36d4EAF2e483E",
318
- DecayMulticurveInitializer: "0xD59cE43E53D69F190E15d9822Fb4540dCcc91178",
319
- DecayMulticurveInitializerHook: "0xbB7784A4d481184283Ed89619A3e3ed143e1Adc0",
320
- DopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
321
- DopplerHookInitializer: "0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544",
322
- DopplerHookMigrator: "0x1E40b0875DDa35f41E15cFB475403859B8c860c4",
323
- GovernanceFactory: "0x9F309D79BEe3E8b2f56FaCF74b7195Df176c8F61",
324
- NoOpGovernanceFactory: "0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638",
325
- NoOpMigrator: "0x233A71A7bB928b1357A1Ebf454298320989Ca5B5",
326
- Quoter: "0xFD44B773B21AC485C95Db1Ff38554b7699f8C042",
327
- RehypeDopplerHook: "0x3Ec4798A9B11e8243A8Db99687f7A23597B96623",
328
- RehypeDopplerHookInitializer: "0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123",
329
- RehypeDopplerHookMigrator: "0xea95DfdF69B90c65C827070852F7039D6aF6Dd7b",
330
- StreamableFeesLocker: "0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6",
331
- StreamableFeesLockerV2: "0xcE3212e6536F33cD6fbFEE265224131353Ca3D47",
332
- TimelockFactory: "0x9fd40af2baAfAF03513f091444e821c0d5b06ea0",
333
- TopUpDistributor: "0x435312320C0330B1999746753551CdFbD83aD814",
334
- UniswapV2Locker: "0xA366D94eDA7abEc16bfa5619A855a6208bE3aEE9",
335
- UniswapV2Migrator: "0x765875bff87614cE0581ee73B9fa663B71F3DfF2",
336
- UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
337
- UniswapV4Migrator: "0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5",
338
- UniswapV4MigratorHook: "0x4053D4fa966cbdCC20Ec62070aC8814De8bEE500",
339
- UniswapV4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
340
- UniswapV4ScheduledMulticurveInitializerHook: "0xc6a562cb5CbFA29BCB1bDCCF903b8B8f2E4A2DC0"
161
+ UniswapV4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad"
341
162
  }
342
163
  };
343
164
  var WAD = 10n ** 18n;
344
165
  var DEAD_ADDRESS = "0x000000000000000000000000000000000000dEaD";
345
166
  var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
167
+ var MAX_UINT64 = (1n << 64n) - 1n;
168
+ var MAX_UINT128 = (1n << 128n) - 1n;
346
169
  var FEE_TIERS = {
347
170
  LOWEST: 100,
348
171
  // 0.01%
@@ -371,6 +194,7 @@ var TICK_SPACINGS = {
371
194
  var DOPPLER_MAX_TICK_SPACING = 30;
372
195
  var SECONDS_PER_DAY = 86400;
373
196
  var SECONDS_PER_YEAR = 365 * SECONDS_PER_DAY;
197
+ var MIN_BUNDLER_VESTING_DURATION = BigInt(SECONDS_PER_DAY);
374
198
  var DEFAULT_EPOCH_LENGTH = 43200;
375
199
  var DEFAULT_AUCTION_DURATION = 7 * SECONDS_PER_DAY;
376
200
  var DEFAULT_LOCK_DURATION = SECONDS_PER_YEAR;
@@ -465,6 +289,7 @@ var FEE_AMOUNT_MASK = 16777215;
465
289
  var CHAIN_IDS = {
466
290
  MAINNET: 1,
467
291
  ETH_SEPOLIA: 11155111,
292
+ ARBITRUM: 42161,
468
293
  BASE: 8453,
469
294
  BASE_SEPOLIA: 84532,
470
295
  INK: 57073,
@@ -484,15 +309,9 @@ function getRehypeDopplerHookInitializerAddress(chainId) {
484
309
  var ADDRESSES = {
485
310
  [CHAIN_IDS.MAINNET]: {
486
311
  airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].Airlock,
487
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].CloneERC20Factory,
488
- derc20V2Factory: getGeneratedAddress(
489
- CHAIN_IDS.MAINNET,
490
- "CloneDERC20VotesV2Factory"
491
- ),
492
- derc20V2Implementation: getGeneratedAddress(
493
- CHAIN_IDS.MAINNET,
494
- "CloneDERC20VotesV2"
495
- ),
312
+ tokenFactory: "0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e",
313
+ derc20V2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
314
+ derc20V2Implementation: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
496
315
  dopplerERC20V1Factory: getGeneratedAddress(
497
316
  CHAIN_IDS.MAINNET,
498
317
  "DopplerERC20V1Factory"
@@ -505,7 +324,7 @@ var ADDRESSES = {
505
324
  v3Quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
506
325
  lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].LockableUniswapV3Initializer,
507
326
  v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV4Initializer,
508
- v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV4ScheduledMulticurveInitializer,
327
+ v4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
509
328
  dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].DopplerHookInitializer,
510
329
  rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(
511
330
  CHAIN_IDS.MAINNET
@@ -516,18 +335,18 @@ var ADDRESSES = {
516
335
  dopplerLens: ZERO_ADDRESS,
517
336
  dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].DopplerDeployer,
518
337
  poolManager: "0x000000000004444c5dc75cB358380D2e3dE08A90",
519
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV2Migrator,
338
+ v2Migrator: "0x765875bff87614cE0581ee73B9fa663B71F3DfF2",
520
339
  v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV2MigratorSplit,
521
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV4Migrator,
522
- v4MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV4MigratorSplit,
523
- v4MigratorHook: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].UniswapV4MigratorHook,
340
+ v4Migrator: "0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5",
341
+ v4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
342
+ v4MigratorHook: "0x4053D4fa966cbdCC20Ec62070aC8814De8bEE500",
524
343
  dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].DopplerHookMigrator,
525
344
  rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].RehypeDopplerHookMigrator,
526
345
  noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].NoOpMigrator,
527
346
  governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].GovernanceFactory,
528
347
  noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].NoOpGovernanceFactory,
529
348
  launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].LaunchpadGovernanceFactory,
530
- streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].StreamableFeesLocker,
349
+ streamableFeesLocker: "0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6",
531
350
  streamableFeesLockerV2: getGeneratedAddress(
532
351
  CHAIN_IDS.MAINNET,
533
352
  "StreamableFeesLockerV2"
@@ -535,6 +354,7 @@ var ADDRESSES = {
535
354
  topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].TopUpDistributor,
536
355
  universalRouter: "0x66a9893cc07d91d95644aedd05d03f95e1dba8af",
537
356
  permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
357
+ bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MAINNET].Bundler,
538
358
  weth: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
539
359
  univ2Router02: "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
540
360
  uniswapV2Factory: "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f",
@@ -542,54 +362,87 @@ var ADDRESSES = {
542
362
  uniswapV4Quoter: "0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203"
543
363
  },
544
364
  [CHAIN_IDS.ETH_SEPOLIA]: {
545
- airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].Airlock,
546
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].CloneERC20Factory,
547
- derc20V2Factory: getGeneratedAddress(
548
- CHAIN_IDS.ETH_SEPOLIA,
549
- "CloneDERC20VotesV2Factory"
550
- ),
551
- derc20V2Implementation: getGeneratedAddress(
552
- CHAIN_IDS.ETH_SEPOLIA,
553
- "CloneDERC20VotesV2"
554
- ),
365
+ airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
366
+ tokenFactory: "0xe7Df2A4520C26a2D4Dedb3a7585BFBcd30eABA6e",
367
+ derc20V2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
368
+ derc20V2Implementation: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
555
369
  v3Initializer: ZERO_ADDRESS,
556
370
  v3Quoter: ZERO_ADDRESS,
557
- v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].UniswapV4Initializer,
558
- v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].UniswapV4ScheduledMulticurveInitializer,
559
- dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].DopplerHookInitializer,
560
- rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(
561
- CHAIN_IDS.ETH_SEPOLIA
562
- ),
563
- rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(
564
- CHAIN_IDS.ETH_SEPOLIA
565
- ),
371
+ v4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
372
+ v4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
373
+ dopplerHookInitializer: "0xBDF938149ac6a781F94FAa0ed45E6A0e984c6544",
374
+ rehypeDopplerHookInitializer: "0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123",
375
+ rehypeDopplerHook: "0xBF4195ab0B03e1eB3345dd1e83BeD7650b1ed123",
566
376
  dopplerLens: ZERO_ADDRESS,
567
- dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].DopplerDeployer,
377
+ dopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
568
378
  poolManager: "0xE03A1074c86CFeDd5C142C4F04F1a1536e203543",
569
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].UniswapV2Migrator,
570
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].UniswapV4Migrator,
571
- dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].DopplerHookMigrator,
572
- rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].RehypeDopplerHookMigrator,
573
- noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].NoOpMigrator,
379
+ v2Migrator: "0x765875bff87614cE0581ee73B9fa663B71F3DfF2",
380
+ v4Migrator: "0x0820A4D0173C17Ece283f7bDaAF0f8876eB205f5",
381
+ dopplerHookMigrator: "0x1E40b0875DDa35f41E15cFB475403859B8c860c4",
382
+ rehypeDopplerHookMigrator: "0xea95DfdF69B90c65C827070852F7039D6aF6Dd7b",
383
+ noOpMigrator: "0x233A71A7bB928b1357A1Ebf454298320989Ca5B5",
574
384
  governanceFactory: ZERO_ADDRESS,
575
- noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].NoOpGovernanceFactory,
576
- streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ETH_SEPOLIA].StreamableFeesLocker,
385
+ noOpGovernanceFactory: "0xddAE8B3eD08184682f7Bc32B74d943cEEfEab638",
386
+ streamableFeesLocker: "0xe24FC2F7191e850e2D4514aBb4d39305b1871eC6",
577
387
  universalRouter: "0x3A9D48AB9751398BbFa63ad67599Bb04e4BdF98b",
578
388
  permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
579
389
  weth: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14",
580
390
  uniswapV4Quoter: "0x61b3f2011a92d183c7dbadbda940a7555ccf9227"
581
391
  },
582
- [CHAIN_IDS.BASE]: {
583
- airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].Airlock,
584
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].TokenFactory80,
585
- derc20V2Factory: getGeneratedAddress(
586
- CHAIN_IDS.BASE,
587
- "CloneDERC20VotesV2Factory"
392
+ [CHAIN_IDS.ARBITRUM]: {
393
+ airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].Airlock,
394
+ tokenFactory: ZERO_ADDRESS,
395
+ dopplerERC20V1Factory: getGeneratedAddress(
396
+ CHAIN_IDS.ARBITRUM,
397
+ "DopplerERC20V1Factory"
588
398
  ),
589
- derc20V2Implementation: getGeneratedAddress(
590
- CHAIN_IDS.BASE,
591
- "CloneDERC20VotesV2"
399
+ dopplerERC20V1Implementation: getGeneratedAddress(
400
+ CHAIN_IDS.ARBITRUM,
401
+ "DopplerERC20V1"
402
+ ),
403
+ doppler404Factory: getGeneratedAddress(CHAIN_IDS.ARBITRUM, "DN404Factory"),
404
+ v3Initializer: ZERO_ADDRESS,
405
+ v3Quoter: "0x61fFE014bA17989E743c5F6cB21bF9697530B21e",
406
+ lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].LockableUniswapV3Initializer,
407
+ v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].UniswapV4Initializer,
408
+ dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].DopplerHookInitializer,
409
+ rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(
410
+ CHAIN_IDS.ARBITRUM
411
+ ),
412
+ rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(
413
+ CHAIN_IDS.ARBITRUM
414
+ ),
415
+ dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].DopplerLensQuoter,
416
+ dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].DopplerDeployer,
417
+ poolManager: "0x360E68faCcca8cA495c1B759Fd9EEe466db9FB32",
418
+ v2Migrator: ZERO_ADDRESS,
419
+ v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].UniswapV2MigratorSplit,
420
+ v4Migrator: ZERO_ADDRESS,
421
+ dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].DopplerHookMigrator,
422
+ rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].RehypeDopplerHookMigrator,
423
+ noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].NoOpMigrator,
424
+ governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].GovernanceFactory,
425
+ noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].NoOpGovernanceFactory,
426
+ launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].LaunchpadGovernanceFactory,
427
+ streamableFeesLocker: ZERO_ADDRESS,
428
+ streamableFeesLockerV2: getGeneratedAddress(
429
+ CHAIN_IDS.ARBITRUM,
430
+ "StreamableFeesLockerV2"
592
431
  ),
432
+ topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].TopUpDistributor,
433
+ universalRouter: "0xA51afAFe0263b40EdaEf0Df8781eA9aa03E381a3",
434
+ permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
435
+ bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.ARBITRUM].Bundler,
436
+ weth: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
437
+ uniswapV2Factory: "0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9",
438
+ uniswapV3Factory: "0x1F98431c8aD98523631AE4a59f267346ea31F984",
439
+ uniswapV4Quoter: "0x3972C00f7ed4885e145823eb7C655375d275A1C5"
440
+ },
441
+ [CHAIN_IDS.BASE]: {
442
+ airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].Airlock,
443
+ tokenFactory: "0xf0B5141dD9096254B2ca624dff26024f46087229",
444
+ derc20V2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
445
+ derc20V2Implementation: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
593
446
  dopplerERC20V1Factory: getGeneratedAddress(
594
447
  CHAIN_IDS.BASE,
595
448
  "DopplerERC20V1Factory"
@@ -599,15 +452,15 @@ var ADDRESSES = {
599
452
  "DopplerERC20V1"
600
453
  ),
601
454
  doppler404Factory: getGeneratedAddress(CHAIN_IDS.BASE, "DN404Factory"),
602
- v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV3Initializer,
455
+ v3Initializer: "0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5",
603
456
  v3Quoter: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
604
457
  lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].LockableUniswapV3Initializer,
605
458
  v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV4Initializer,
606
- v4MulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV4MulticurveInitializer,
459
+ v4MulticurveInitializer: "0x65dE470Da664A5be139A5D812bE5FDa0d76CC951",
607
460
  // From Doppler multicurve deployments (Base mainnet)
608
- v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV4ScheduledMulticurveInitializer,
461
+ v4ScheduledMulticurveInitializer: "0xA36715dA46Ddf4A769f3290f49AF58bF8132ED8E",
609
462
  // From Doppler scheduled multicurve deployments (Base mainnet)
610
- v4DecayMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].DecayMulticurveInitializer,
463
+ v4DecayMulticurveInitializer: "0xD59cE43E53D69F190E15d9822Fb4540dCcc91178",
611
464
  // From Doppler decay multicurve deployments (Base mainnet)
612
465
  // Opening auction slots reserved for phase-1 lifecycle support (not deployed on Base yet)
613
466
  openingAuctionInitializer: ZERO_ADDRESS,
@@ -620,18 +473,18 @@ var ADDRESSES = {
620
473
  ),
621
474
  rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(CHAIN_IDS.BASE),
622
475
  dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].DopplerHookInitializer,
623
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV2Migrator,
476
+ v2Migrator: "0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731",
624
477
  v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV2MigratorSplit,
625
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV4Migrator,
626
- v4MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV4MigratorSplit,
627
- v4MigratorHook: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].UniswapV4MigratorHook,
478
+ v4Migrator: "0xd3B4cF7FD24381e90A4F012fC6c5976b87B9B3cE",
479
+ v4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
480
+ v4MigratorHook: "0xD6FECFF347c6203A41874e8D77dE669B54e7A500",
628
481
  dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].DopplerHookMigrator,
629
482
  rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].RehypeDopplerHookMigrator,
630
483
  noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].NoOpMigrator,
631
484
  governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].GovernanceFactory,
632
485
  noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].NoOpGovernanceFactory,
633
486
  launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].LaunchpadGovernanceFactory,
634
- streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE].StreamableFeesLocker,
487
+ streamableFeesLocker: "0x0A00775D71a42cd33D62780003035e7F5b47bD3A",
635
488
  streamableFeesLockerV2: getGeneratedAddress(
636
489
  CHAIN_IDS.BASE,
637
490
  "StreamableFeesLockerV2"
@@ -648,15 +501,9 @@ var ADDRESSES = {
648
501
  },
649
502
  [CHAIN_IDS.BASE_SEPOLIA]: {
650
503
  airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].Airlock,
651
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].TokenFactory80,
652
- derc20V2Factory: getGeneratedAddress(
653
- CHAIN_IDS.BASE_SEPOLIA,
654
- "CloneDERC20VotesV2Factory"
655
- ),
656
- derc20V2Implementation: getGeneratedAddress(
657
- CHAIN_IDS.BASE_SEPOLIA,
658
- "CloneDERC20VotesV2"
659
- ),
504
+ tokenFactory: "0xf0B5141dD9096254B2ca624dff26024f46087229",
505
+ derc20V2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
506
+ derc20V2Implementation: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
660
507
  dopplerERC20V1Factory: getGeneratedAddress(
661
508
  CHAIN_IDS.BASE_SEPOLIA,
662
509
  "DopplerERC20V1Factory"
@@ -666,14 +513,14 @@ var ADDRESSES = {
666
513
  "DopplerERC20V1"
667
514
  ),
668
515
  doppler404Factory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].DN404Factory,
669
- v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV3Initializer,
516
+ v3Initializer: "0x4C3062B9ccFdbCB10353F57C1B59a29d4c5CFa47",
670
517
  v3Quoter: "0xC5290058841028F1614F3A6F0F5816cAd0df5E27",
671
518
  lockableV3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].LockableUniswapV3Initializer,
672
519
  v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV4Initializer,
673
- v4MulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV4MulticurveInitializer,
674
- v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV4ScheduledMulticurveInitializer,
520
+ v4MulticurveInitializer: "0x1718405E58c61425cDc0083262bC9f72198F5232",
521
+ v4ScheduledMulticurveInitializer: "0xF84378C9F39e0FF267f3101c88773359c5393876",
675
522
  // From Doppler scheduled multicurve deployments (Base Sepolia)
676
- v4DecayMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].DecayMulticurveInitializer,
523
+ v4DecayMulticurveInitializer: "0xD59cE43E53D69F190E15d9822Fb4540dCcc91178",
677
524
  // From Doppler decay multicurve deployments (Base Sepolia)
678
525
  // Opening Auction contracts (deployed Feb 2025)
679
526
  openingAuctionInitializer: "0x3dCd35945Dc86a9FaA80846B06CB4676961d0AEa",
@@ -688,18 +535,18 @@ var ADDRESSES = {
688
535
  dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].DopplerLensQuoter,
689
536
  dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].DopplerDeployer,
690
537
  poolManager: "0x05E73354cFDd6745C338b50BcFDfA3Aa6fA03408",
691
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV2Migrator,
538
+ v2Migrator: "0x04a898f3722c38F9Def707bD17DC78920EFA977C",
692
539
  v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV2MigratorSplit,
693
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV4Migrator,
694
- v4MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV4MigratorSplit,
540
+ v4Migrator: "0xEEe0eCCb54398ce371CAACBCEf076d3Ed597DDb3",
541
+ v4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
695
542
  dopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].DopplerHookMigrator,
696
543
  rehypeDopplerHookMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].RehypeDopplerHookMigrator,
697
- v4MigratorHook: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].UniswapV4MigratorHook,
544
+ v4MigratorHook: "0x127cAAAd598Ffa97577940b0a5c3b6150019E500",
698
545
  noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].NoOpMigrator,
699
546
  governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].GovernanceFactory,
700
547
  noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].NoOpGovernanceFactory,
701
548
  launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].LaunchpadGovernanceFactory,
702
- streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.BASE_SEPOLIA].StreamableFeesLocker,
549
+ streamableFeesLocker: "0x3345E557c5C0b474bE1eb4693264008B8562Aa9c",
703
550
  streamableFeesLockerV2: getGeneratedAddress(
704
551
  CHAIN_IDS.BASE_SEPOLIA,
705
552
  "StreamableFeesLockerV2"
@@ -715,8 +562,8 @@ var ADDRESSES = {
715
562
  uniswapV4Quoter: "0x4A6513c898fe1B2d0E78d3b0e0A4a151589B1cBa"
716
563
  },
717
564
  [CHAIN_IDS.INK]: {
718
- airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].Airlock,
719
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].TokenFactory,
565
+ airlock: "0x660eAaEdEBc968f8f3694354FA8EC0b4c5Ba8D12",
566
+ tokenFactory: "0xFAafdE6a5b658684cC5eb0C5c2c755B00A246F45",
720
567
  derc20V2Factory: getGeneratedAddress(
721
568
  CHAIN_IDS.INK,
722
569
  "CloneDERC20VotesV2Factory"
@@ -725,15 +572,15 @@ var ADDRESSES = {
725
572
  CHAIN_IDS.INK,
726
573
  "CloneDERC20VotesV2"
727
574
  ),
728
- v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].UniswapV3Initializer,
575
+ v3Initializer: "0xaA47D2977d622DBdFD33eeF6a8276727c52EB4e5",
729
576
  v3Quoter: "0x96b572D2d880cf2Fa2563651BD23ADE6f5516652",
730
577
  v4Initializer: "0xC99b485499f78995C6F1640dbB1413c57f8BA684",
731
578
  dopplerLens: "0x3972c00f7ed4885e145823eb7c655375d275a1c5",
732
- dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].DopplerDeployer,
579
+ dopplerDeployer: "0xa82c66b6ddEb92089015C3565E05B5c9750b2d4B",
733
580
  poolManager: "0x360e68faccca8ca495c1b759fd9eee466db9fb32",
734
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].UniswapV2Migrator,
581
+ v2Migrator: "0x5F3bA43D44375286296Cb85F1EA2EBfa25dde731",
735
582
  v4Migrator: ZERO_ADDRESS,
736
- governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].GovernanceFactory,
583
+ governanceFactory: "0xb4deE32EB70A5E55f3D2d861F49Fb3D79f7a14d9",
737
584
  noOpGovernanceFactory: ZERO_ADDRESS,
738
585
  // Not yet deployed
739
586
  streamableFeesLocker: ZERO_ADDRESS,
@@ -741,7 +588,6 @@ var ADDRESSES = {
741
588
  universalRouter: "0x112908dac86e20e7241b0927479ea3bf935d1fa0",
742
589
  univ2Router02: "0xB3FB126ACDd5AdCA2f50Ac644a7a2303745f18b4",
743
590
  permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
744
- bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.INK].Bundler,
745
591
  weth: "0x4200000000000000000000000000000000000006",
746
592
  uniswapV4Quoter: "0x3972c00f7ed4885e145823eb7c655375d275a1c5"
747
593
  },
@@ -795,8 +641,8 @@ var ADDRESSES = {
795
641
  uniswapV4Quoter: "0x8dc178efb8111bb0973dd9d722ebeff267c98f94"
796
642
  },
797
643
  [CHAIN_IDS.UNICHAIN]: {
798
- airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].Airlock,
799
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].TokenFactory,
644
+ airlock: "0x77EbfBAE15AD200758E9E2E61597c0B07d731254",
645
+ tokenFactory: "0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3",
800
646
  derc20V2Factory: getGeneratedAddress(
801
647
  CHAIN_IDS.UNICHAIN,
802
648
  "CloneDERC20VotesV2Factory"
@@ -805,30 +651,29 @@ var ADDRESSES = {
805
651
  CHAIN_IDS.UNICHAIN,
806
652
  "CloneDERC20VotesV2"
807
653
  ),
808
- v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].UniswapV3Initializer,
654
+ v3Initializer: "0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec",
809
655
  v3Quoter: "0x385A5cf5F83e99f7BB2852b6A19C3538b9FA7658",
810
656
  v4Initializer: "0x2F2BAcd46d3F5c9EE052Ab392b73711dB89129DB",
811
657
  dopplerLens: "0x333e3c607b141b18ff6de9f258db6e77fe7491e0",
812
658
  dopplerDeployer: "0x06FEFD02F0b6d9f57F52cfacFc113665Dfa20F0f",
813
659
  poolManager: "0x1f98400000000000000000000000000000000004",
814
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].UniswapV2Migrator,
815
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].UniswapV4Migrator,
816
- noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].NoOpMigrator,
817
- governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].GovernanceFactory,
818
- noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].NoOpGovernanceFactory,
660
+ v2Migrator: "0xf6023127f6E937091D5B605680056A6D27524bad",
661
+ v4Migrator: "0x49F3fBB2dFF7f3d03B622e3b2a6d3F2E6fdB2a5A",
662
+ noOpMigrator: "0x917da361072ce968acD810BbfC9B64079426ebf0",
663
+ governanceFactory: "0x99C94B9Df930E1E21a4E4a2c105dBff21bF5c5aE",
664
+ noOpGovernanceFactory: "0x3AD727ee0FBBb8Ee0920933FdB96F23fD56f1299",
819
665
  streamableFeesLocker: ZERO_ADDRESS,
820
666
  // Not yet deployed
821
667
  universalRouter: "0xef740bf23acae26f6492b10de645d6b98dc8eaf3",
822
668
  univ2Router02: "0x284f11109359a7e1306c3e447ef14d38400063ff",
823
669
  uniswapV2Factory: "0x1f98400000000000000000000000000000000002",
824
670
  permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
825
- bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN].Bundler,
826
671
  weth: "0x4200000000000000000000000000000000000006",
827
672
  uniswapV4Quoter: "0x333e3c607b141b18ff6de9f258db6e77fe7491e0"
828
673
  },
829
674
  [CHAIN_IDS.UNICHAIN_SEPOLIA]: {
830
675
  airlock: "0x651ab94B4777e2e4cdf96082d90C65bd947b73A4",
831
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA].TokenFactory,
676
+ tokenFactory: "0x82Ac010C67f70BACf7655cd8948a4AD92A173CAC",
832
677
  derc20V2Factory: getGeneratedAddress(
833
678
  CHAIN_IDS.UNICHAIN_SEPOLIA,
834
679
  "CloneDERC20VotesV2Factory"
@@ -843,23 +688,22 @@ var ADDRESSES = {
843
688
  dopplerLens: "0x56dcd40a3f2d466f48e7f48bdbe5cc9b92ae4472",
844
689
  dopplerDeployer: "0x2f2bacd46d3f5c9ee052ab392b73711db89129db",
845
690
  poolManager: "0x00B036B58a818B1BC34d502D3fE730Db729e62AC",
846
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA].UniswapV2Migrator,
847
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA].UniswapV4Migrator,
848
- noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA].NoOpMigrator,
691
+ v2Migrator: "0x620e3fec244e913d73f2163623b62d02DB69638B",
692
+ v4Migrator: "0xb6D69eAA98E657bEEFF7ca4452768e6f707aa6b1",
693
+ noOpMigrator: "0x193F48A45B6025dDeD10bc4BaeEF65c833696387",
849
694
  governanceFactory: "0x1E4332EEfAE9e4967C2D186f7b2d439D778e81cC",
850
- noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.UNICHAIN_SEPOLIA].NoOpGovernanceFactory,
695
+ noOpGovernanceFactory: "0x7E5D336A6E9e453c9f02E5102CC039E015Fd8fb8",
851
696
  streamableFeesLocker: ZERO_ADDRESS,
852
697
  // Not yet deployed
853
698
  universalRouter: "0xf70536B3bcC1bD1a972dc186A2cf84cC6da6Be5D",
854
699
  univ2Router02: "0x284f11109359a7e1306c3e447ef14d38400063ff",
855
700
  permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
856
- bundler: "0x63f8C8F9beFaab2FaCD7Ece0b0242f78B920Ee90",
857
701
  weth: "0x4200000000000000000000000000000000000006",
858
702
  uniswapV4Quoter: "0x56dcd40a3f2d466f48e7f48bdbe5cc9b92ae4472"
859
703
  },
860
704
  [CHAIN_IDS.MONAD_TESTNET]: {
861
- airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].Airlock,
862
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].TokenFactory80,
705
+ airlock: "0xDe3599a2eC440B296373a983C85C365DA55d9dFA",
706
+ tokenFactory: "0xf0B5141dD9096254B2ca624dff26024f46087229",
863
707
  derc20V2Factory: getGeneratedAddress(
864
708
  CHAIN_IDS.MONAD_TESTNET,
865
709
  "CloneDERC20VotesV2Factory"
@@ -868,38 +712,31 @@ var ADDRESSES = {
868
712
  CHAIN_IDS.MONAD_TESTNET,
869
713
  "CloneDERC20VotesV2"
870
714
  ),
871
- v3Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].UniswapV3Initializer,
715
+ v3Initializer: "0x9F4e56be80f08ba1A2445645EFa6d231E27b43ec",
872
716
  v3Quoter: ZERO_ADDRESS,
873
- v4Initializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].UniswapV4Initializer,
874
- dopplerLens: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].DopplerLensQuoter,
875
- dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].DopplerDeployer,
717
+ v4Initializer: "0x53b4c21a6Cb61D64F636ABBfa6E8E90E6558e8ad",
718
+ dopplerLens: "0x2F2BAcd46d3F5c9EE052Ab392b73711dB89129DB",
719
+ dopplerDeployer: "0xb35469ee64A87Afd19B31615094fE3962d73e421",
876
720
  poolManager: "0xe93882f395B0b24180855c68Ab19B2d78573ceBc",
877
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].UniswapV2Migrator,
721
+ v2Migrator: "0x43d0D97EC9241A8F05A264f94B82A1d2E600f2B3",
878
722
  v4Migrator: "0xBEd386a1Fc62B6598c9b8d2BF634471B6Fe75EB7",
879
- noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].NoOpMigrator,
880
- governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].GovernanceFactory,
881
- noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].NoOpGovernanceFactory,
723
+ noOpMigrator: "0x5CadB034267751a364dDD4d321C99E07A307f915",
724
+ governanceFactory: "0x014E1c0bd34f3B10546E554CB33B3293fECDD056",
725
+ noOpGovernanceFactory: "0x094D926A969B3024ca46D2186BF13FD5CDBA9CE2",
882
726
  streamableFeesLocker: "0x91231cDdD8d6C86Df602070a3081478e074b97b7",
883
727
  // Not yet deployed
884
728
  universalRouter: ZERO_ADDRESS,
885
729
  univ2Router02: ZERO_ADDRESS,
886
730
  permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
887
- bundler: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_TESTNET].Bundler,
888
731
  weth: ZERO_ADDRESS,
889
732
  // TODO: Get Monad Testnet weth
890
733
  uniswapV4Quoter: ZERO_ADDRESS
891
734
  },
892
735
  [CHAIN_IDS.MONAD_MAINNET]: {
893
736
  airlock: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].Airlock,
894
- tokenFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].TokenFactory80,
895
- derc20V2Factory: getGeneratedAddress(
896
- CHAIN_IDS.MONAD_MAINNET,
897
- "CloneDERC20VotesV2Factory"
898
- ),
899
- derc20V2Implementation: getGeneratedAddress(
900
- CHAIN_IDS.MONAD_MAINNET,
901
- "CloneDERC20VotesV2"
902
- ),
737
+ tokenFactory: "0xf0B5141dD9096254B2ca624dff26024f46087229",
738
+ derc20V2Factory: "0x16F5ACB64F4FA17296E942C51d3395aDC318f9e1",
739
+ derc20V2Implementation: "0x4BBfed1c27CDE12eF6638251D81ab4e3be7556b7",
903
740
  dopplerERC20V1Factory: getGeneratedAddress(
904
741
  CHAIN_IDS.MONAD_MAINNET,
905
742
  "DopplerERC20V1Factory"
@@ -915,17 +752,17 @@ var ADDRESSES = {
915
752
  dopplerLens: ZERO_ADDRESS,
916
753
  dopplerDeployer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].DopplerDeployer,
917
754
  poolManager: "0x188d586ddcf52439676ca21a244753fa19f9ea8e",
918
- v2Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].UniswapV2Migrator,
755
+ v2Migrator: "0x136191B46478cAB023cbC01a36160C4Aad81677a",
919
756
  v2MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].UniswapV2MigratorSplit,
920
- v4Migrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].UniswapV4Migrator,
921
- v4MigratorSplit: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].UniswapV4MigratorSplit,
922
- v4MigratorHook: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].UniswapV4MigratorHook,
757
+ v4Migrator: "0x44bf742e57cd8cF23ABbc8dab2c44e2a3228356E",
758
+ v4MigratorSplit: "0xa1b06BE4f2fC347d194240D79EDa9F40CCAd9732",
759
+ v4MigratorHook: "0x3E4c689BBf33b37106eBC13Db8aa5BF13a25e500",
923
760
  noOpMigrator: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].NoOpMigrator,
924
761
  governanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].GovernanceFactory,
925
762
  noOpGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].NoOpGovernanceFactory,
926
763
  launchpadGovernanceFactory: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].LaunchpadGovernanceFactory,
927
764
  topUpDistributor: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].TopUpDistributor,
928
- v4ScheduledMulticurveInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].UniswapV4ScheduledMulticurveInitializer,
765
+ v4ScheduledMulticurveInitializer: "0xCe3099B2F07029b086E5e92a1573C5f5A3071783",
929
766
  dopplerHookInitializer: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].DopplerHookInitializer,
930
767
  rehypeDopplerHookInitializer: getRehypeDopplerHookInitializerAddress(
931
768
  CHAIN_IDS.MONAD_MAINNET
@@ -933,7 +770,7 @@ var ADDRESSES = {
933
770
  rehypeDopplerHook: getRehypeDopplerHookInitializerAddress(
934
771
  CHAIN_IDS.MONAD_MAINNET
935
772
  ),
936
- streamableFeesLocker: GENERATED_DOPPLER_DEPLOYMENTS[CHAIN_IDS.MONAD_MAINNET].StreamableFeesLocker,
773
+ streamableFeesLocker: "0x63f8C8F9beFaab2FaCD7Ece0b0242f78B920Ee90",
937
774
  streamableFeesLockerV2: getGeneratedAddress(
938
775
  CHAIN_IDS.MONAD_MAINNET,
939
776
  "StreamableFeesLockerV2"
@@ -5771,7 +5608,102 @@ var dopplerLensAbi = [
5771
5608
  stateMutability: "nonpayable"
5772
5609
  }
5773
5610
  ];
5611
+ var bundlerCreateParamsComponents = [
5612
+ { name: "initialSupply", type: "uint256", internalType: "uint256" },
5613
+ { name: "numTokensToSell", type: "uint256", internalType: "uint256" },
5614
+ { name: "numeraire", type: "address", internalType: "address" },
5615
+ {
5616
+ name: "tokenFactory",
5617
+ type: "address",
5618
+ internalType: "contract ITokenFactory"
5619
+ },
5620
+ { name: "tokenFactoryData", type: "bytes", internalType: "bytes" },
5621
+ {
5622
+ name: "governanceFactory",
5623
+ type: "address",
5624
+ internalType: "contract IGovernanceFactory"
5625
+ },
5626
+ {
5627
+ name: "governanceFactoryData",
5628
+ type: "bytes",
5629
+ internalType: "bytes"
5630
+ },
5631
+ {
5632
+ name: "poolInitializer",
5633
+ type: "address",
5634
+ internalType: "contract IPoolInitializer"
5635
+ },
5636
+ { name: "poolInitializerData", type: "bytes", internalType: "bytes" },
5637
+ {
5638
+ name: "liquidityMigrator",
5639
+ type: "address",
5640
+ internalType: "contract ILiquidityMigrator"
5641
+ },
5642
+ {
5643
+ name: "liquidityMigratorData",
5644
+ type: "bytes",
5645
+ internalType: "bytes"
5646
+ },
5647
+ { name: "integrator", type: "address", internalType: "address" },
5648
+ { name: "salt", type: "bytes32", internalType: "bytes32" }
5649
+ ];
5650
+ var bundlerPoolKeyComponents = [
5651
+ { name: "currency0", type: "address", internalType: "Currency" },
5652
+ { name: "currency1", type: "address", internalType: "Currency" },
5653
+ { name: "fee", type: "uint24", internalType: "uint24" },
5654
+ { name: "tickSpacing", type: "int24", internalType: "int24" },
5655
+ { name: "hooks", type: "address", internalType: "contract IHooks" }
5656
+ ];
5774
5657
  var bundlerAbi = [
5658
+ {
5659
+ type: "function",
5660
+ name: "airlock",
5661
+ inputs: [],
5662
+ outputs: [{ name: "", type: "address", internalType: "contract Airlock" }],
5663
+ stateMutability: "view"
5664
+ },
5665
+ {
5666
+ type: "function",
5667
+ name: "poolManager",
5668
+ inputs: [],
5669
+ outputs: [
5670
+ {
5671
+ name: "",
5672
+ type: "address",
5673
+ internalType: "contract IPoolManager"
5674
+ }
5675
+ ],
5676
+ stateMutability: "view"
5677
+ },
5678
+ {
5679
+ type: "function",
5680
+ name: "vestingOf",
5681
+ inputs: [{ name: "asset", type: "address", internalType: "address" }],
5682
+ outputs: [
5683
+ { name: "recipient", type: "address", internalType: "address" },
5684
+ { name: "permissionlessClaim", type: "bool", internalType: "bool" },
5685
+ { name: "start", type: "uint64", internalType: "uint64" },
5686
+ { name: "cliffDuration", type: "uint64", internalType: "uint64" },
5687
+ { name: "vestingDuration", type: "uint64", internalType: "uint64" },
5688
+ { name: "totalAmount", type: "uint128", internalType: "uint128" },
5689
+ { name: "claimedAmount", type: "uint128", internalType: "uint128" }
5690
+ ],
5691
+ stateMutability: "view"
5692
+ },
5693
+ {
5694
+ type: "function",
5695
+ name: "claimable",
5696
+ inputs: [{ name: "asset", type: "address", internalType: "address" }],
5697
+ outputs: [{ name: "amount", type: "uint256", internalType: "uint256" }],
5698
+ stateMutability: "view"
5699
+ },
5700
+ {
5701
+ type: "function",
5702
+ name: "claim",
5703
+ inputs: [{ name: "asset", type: "address", internalType: "address" }],
5704
+ outputs: [{ name: "amount", type: "uint256", internalType: "uint256" }],
5705
+ stateMutability: "nonpayable"
5706
+ },
5775
5707
  {
5776
5708
  type: "function",
5777
5709
  name: "bundle",
@@ -5780,331 +5712,246 @@ var bundlerAbi = [
5780
5712
  name: "createData",
5781
5713
  type: "tuple",
5782
5714
  internalType: "struct CreateParams",
5715
+ components: bundlerCreateParamsComponents
5716
+ },
5717
+ {
5718
+ name: "vestingData",
5719
+ type: "tuple",
5720
+ internalType: "struct Bundler.VestingParams",
5783
5721
  components: [
5784
- { name: "initialSupply", type: "uint256", internalType: "uint256" },
5785
- { name: "numTokensToSell", type: "uint256", internalType: "uint256" },
5786
- { name: "numeraire", type: "address", internalType: "address" },
5787
- {
5788
- name: "tokenFactory",
5789
- type: "address",
5790
- internalType: "contract ITokenFactory"
5791
- },
5792
- { name: "tokenFactoryData", type: "bytes", internalType: "bytes" },
5793
- {
5794
- name: "governanceFactory",
5795
- type: "address",
5796
- internalType: "contract IGovernanceFactory"
5797
- },
5798
- {
5799
- name: "governanceFactoryData",
5800
- type: "bytes",
5801
- internalType: "bytes"
5802
- },
5803
5722
  {
5804
- name: "poolInitializer",
5805
- type: "address",
5806
- internalType: "contract IPoolInitializer"
5723
+ name: "permissionlessClaim",
5724
+ type: "bool",
5725
+ internalType: "bool"
5807
5726
  },
5808
- { name: "poolInitializerData", type: "bytes", internalType: "bytes" },
5809
5727
  {
5810
- name: "liquidityMigrator",
5811
- type: "address",
5812
- internalType: "contract ILiquidityMigrator"
5728
+ name: "vestingDuration",
5729
+ type: "uint64",
5730
+ internalType: "uint64"
5813
5731
  },
5814
5732
  {
5815
- name: "liquidityMigratorData",
5816
- type: "bytes",
5817
- internalType: "bytes"
5818
- },
5819
- { name: "integrator", type: "address", internalType: "address" },
5820
- { name: "salt", type: "bytes32", internalType: "bytes32" }
5733
+ name: "cliffDuration",
5734
+ type: "uint64",
5735
+ internalType: "uint64"
5736
+ }
5821
5737
  ]
5822
5738
  },
5823
- { name: "commands", type: "bytes", internalType: "bytes" },
5824
- { name: "inputs", type: "bytes[]", internalType: "bytes[]" }
5739
+ { name: "exactAmountIn", type: "uint128", internalType: "uint128" },
5740
+ { name: "recipient", type: "address", internalType: "address" }
5741
+ ],
5742
+ outputs: [
5743
+ { name: "asset", type: "address", internalType: "address" },
5744
+ {
5745
+ name: "poolKey",
5746
+ type: "tuple",
5747
+ internalType: "struct PoolKey",
5748
+ components: bundlerPoolKeyComponents
5749
+ },
5750
+ { name: "governance", type: "address", internalType: "address" },
5751
+ { name: "timelock", type: "address", internalType: "address" },
5752
+ { name: "amountOut", type: "uint128", internalType: "uint128" }
5825
5753
  ],
5826
- outputs: [],
5827
5754
  stateMutability: "payable"
5828
5755
  },
5829
5756
  {
5830
5757
  type: "function",
5831
- name: "simulateBundleExactIn",
5758
+ name: "simulateBundle",
5832
5759
  inputs: [
5833
5760
  {
5834
5761
  name: "createData",
5835
5762
  type: "tuple",
5836
5763
  internalType: "struct CreateParams",
5837
- components: [
5838
- { name: "initialSupply", type: "uint256", internalType: "uint256" },
5839
- { name: "numTokensToSell", type: "uint256", internalType: "uint256" },
5840
- { name: "numeraire", type: "address", internalType: "address" },
5841
- {
5842
- name: "tokenFactory",
5843
- type: "address",
5844
- internalType: "contract ITokenFactory"
5845
- },
5846
- { name: "tokenFactoryData", type: "bytes", internalType: "bytes" },
5847
- {
5848
- name: "governanceFactory",
5849
- type: "address",
5850
- internalType: "contract IGovernanceFactory"
5851
- },
5852
- {
5853
- name: "governanceFactoryData",
5854
- type: "bytes",
5855
- internalType: "bytes"
5856
- },
5857
- {
5858
- name: "poolInitializer",
5859
- type: "address",
5860
- internalType: "contract IPoolInitializer"
5861
- },
5862
- { name: "poolInitializerData", type: "bytes", internalType: "bytes" },
5863
- {
5864
- name: "liquidityMigrator",
5865
- type: "address",
5866
- internalType: "contract ILiquidityMigrator"
5867
- },
5868
- {
5869
- name: "liquidityMigratorData",
5870
- type: "bytes",
5871
- internalType: "bytes"
5872
- },
5873
- { name: "integrator", type: "address", internalType: "address" },
5874
- { name: "salt", type: "bytes32", internalType: "bytes32" }
5875
- ]
5764
+ components: bundlerCreateParamsComponents
5876
5765
  },
5766
+ { name: "exactAmountIn", type: "uint128", internalType: "uint128" }
5767
+ ],
5768
+ outputs: [
5769
+ { name: "asset", type: "address", internalType: "address" },
5877
5770
  {
5878
- name: "params",
5771
+ name: "poolKey",
5879
5772
  type: "tuple",
5880
- internalType: "struct IQuoterV2.QuoteExactInputSingleParams",
5881
- components: [
5882
- { name: "tokenIn", type: "address", internalType: "address" },
5883
- { name: "tokenOut", type: "address", internalType: "address" },
5884
- { name: "amountIn", type: "uint256", internalType: "uint256" },
5885
- { name: "fee", type: "uint24", internalType: "uint24" },
5886
- {
5887
- name: "sqrtPriceLimitX96",
5888
- type: "uint160",
5889
- internalType: "uint160"
5890
- }
5891
- ]
5892
- }
5773
+ internalType: "struct PoolKey",
5774
+ components: bundlerPoolKeyComponents
5775
+ },
5776
+ { name: "governance", type: "address", internalType: "address" },
5777
+ { name: "timelock", type: "address", internalType: "address" },
5778
+ { name: "amountOut", type: "uint128", internalType: "uint128" }
5893
5779
  ],
5894
- outputs: [{ name: "amountOut", type: "uint256", internalType: "uint256" }],
5895
5780
  stateMutability: "nonpayable"
5896
5781
  },
5897
5782
  {
5898
5783
  type: "function",
5899
- name: "simulateBundleExactOut",
5784
+ name: "_simulateBundle",
5900
5785
  inputs: [
5901
5786
  {
5902
5787
  name: "createData",
5903
5788
  type: "tuple",
5904
5789
  internalType: "struct CreateParams",
5905
- components: [
5906
- { name: "initialSupply", type: "uint256", internalType: "uint256" },
5907
- { name: "numTokensToSell", type: "uint256", internalType: "uint256" },
5908
- { name: "numeraire", type: "address", internalType: "address" },
5909
- {
5910
- name: "tokenFactory",
5911
- type: "address",
5912
- internalType: "contract ITokenFactory"
5913
- },
5914
- { name: "tokenFactoryData", type: "bytes", internalType: "bytes" },
5915
- {
5916
- name: "governanceFactory",
5917
- type: "address",
5918
- internalType: "contract IGovernanceFactory"
5919
- },
5920
- {
5921
- name: "governanceFactoryData",
5922
- type: "bytes",
5923
- internalType: "bytes"
5924
- },
5925
- {
5926
- name: "poolInitializer",
5927
- type: "address",
5928
- internalType: "contract IPoolInitializer"
5929
- },
5930
- { name: "poolInitializerData", type: "bytes", internalType: "bytes" },
5931
- {
5932
- name: "liquidityMigrator",
5933
- type: "address",
5934
- internalType: "contract ILiquidityMigrator"
5935
- },
5936
- {
5937
- name: "liquidityMigratorData",
5938
- type: "bytes",
5939
- internalType: "bytes"
5940
- },
5941
- { name: "integrator", type: "address", internalType: "address" },
5942
- { name: "salt", type: "bytes32", internalType: "bytes32" }
5943
- ]
5790
+ components: bundlerCreateParamsComponents
5944
5791
  },
5945
- {
5946
- name: "params",
5947
- type: "tuple",
5948
- internalType: "struct IQuoterV2.QuoteExactOutputSingleParams",
5949
- components: [
5950
- { name: "tokenIn", type: "address", internalType: "address" },
5951
- { name: "tokenOut", type: "address", internalType: "address" },
5952
- { name: "amount", type: "uint256", internalType: "uint256" },
5953
- { name: "fee", type: "uint24", internalType: "uint24" },
5954
- {
5955
- name: "sqrtPriceLimitX96",
5956
- type: "uint160",
5957
- internalType: "uint160"
5958
- }
5959
- ]
5960
- }
5792
+ { name: "exactAmountIn", type: "uint128", internalType: "uint128" }
5961
5793
  ],
5962
- outputs: [{ name: "amountIn", type: "uint256", internalType: "uint256" }],
5794
+ outputs: [],
5963
5795
  stateMutability: "nonpayable"
5964
5796
  },
5965
5797
  {
5966
5798
  type: "function",
5967
- name: "simulateMulticurveBundleExactOut",
5799
+ name: "unlockCallback",
5800
+ inputs: [{ name: "data", type: "bytes", internalType: "bytes" }],
5801
+ outputs: [{ name: "", type: "bytes", internalType: "bytes" }],
5802
+ stateMutability: "nonpayable"
5803
+ },
5804
+ {
5805
+ type: "event",
5806
+ name: "Bundled",
5968
5807
  inputs: [
5969
5808
  {
5970
- name: "createData",
5971
- type: "tuple",
5972
- internalType: "struct CreateParams",
5973
- components: [
5974
- { name: "initialSupply", type: "uint256", internalType: "uint256" },
5975
- { name: "numTokensToSell", type: "uint256", internalType: "uint256" },
5976
- { name: "numeraire", type: "address", internalType: "address" },
5977
- {
5978
- name: "tokenFactory",
5979
- type: "address",
5980
- internalType: "contract ITokenFactory"
5981
- },
5982
- { name: "tokenFactoryData", type: "bytes", internalType: "bytes" },
5983
- {
5984
- name: "governanceFactory",
5985
- type: "address",
5986
- internalType: "contract IGovernanceFactory"
5987
- },
5988
- {
5989
- name: "governanceFactoryData",
5990
- type: "bytes",
5991
- internalType: "bytes"
5992
- },
5993
- {
5994
- name: "poolInitializer",
5995
- type: "address",
5996
- internalType: "contract IPoolInitializer"
5997
- },
5998
- { name: "poolInitializerData", type: "bytes", internalType: "bytes" },
5999
- {
6000
- name: "liquidityMigrator",
6001
- type: "address",
6002
- internalType: "contract ILiquidityMigrator"
6003
- },
6004
- {
6005
- name: "liquidityMigratorData",
6006
- type: "bytes",
6007
- internalType: "bytes"
6008
- },
6009
- { name: "integrator", type: "address", internalType: "address" },
6010
- { name: "salt", type: "bytes32", internalType: "bytes32" }
6011
- ]
5809
+ name: "recipient",
5810
+ type: "address",
5811
+ indexed: true,
5812
+ internalType: "address"
5813
+ },
5814
+ {
5815
+ name: "amountIn",
5816
+ type: "uint128",
5817
+ indexed: false,
5818
+ internalType: "uint128"
5819
+ },
5820
+ {
5821
+ name: "amountOut",
5822
+ type: "uint128",
5823
+ indexed: false,
5824
+ internalType: "uint128"
6012
5825
  },
6013
- { name: "exactAmountOut", type: "uint128", internalType: "uint128" },
6014
- { name: "hookData", type: "bytes", internalType: "bytes" }
6015
- ],
6016
- outputs: [
6017
- { name: "asset", type: "address", internalType: "address" },
6018
5826
  {
6019
5827
  name: "poolKey",
6020
5828
  type: "tuple",
5829
+ indexed: false,
6021
5830
  internalType: "struct PoolKey",
6022
- components: [
6023
- { name: "currency0", type: "address", internalType: "Currency" },
6024
- { name: "currency1", type: "address", internalType: "Currency" },
6025
- { name: "fee", type: "uint24", internalType: "uint24" },
6026
- { name: "tickSpacing", type: "int24", internalType: "int24" },
6027
- { name: "hooks", type: "address", internalType: "contract IHooks" }
6028
- ]
5831
+ components: bundlerPoolKeyComponents
5832
+ }
5833
+ ],
5834
+ anonymous: false
5835
+ },
5836
+ {
5837
+ type: "event",
5838
+ name: "VestingCreated",
5839
+ inputs: [
5840
+ {
5841
+ name: "asset",
5842
+ type: "address",
5843
+ indexed: true,
5844
+ internalType: "address"
6029
5845
  },
6030
- { name: "amountIn", type: "uint256", internalType: "uint256" },
6031
- { name: "gasEstimate", type: "uint256", internalType: "uint256" }
5846
+ {
5847
+ name: "recipient",
5848
+ type: "address",
5849
+ indexed: true,
5850
+ internalType: "address"
5851
+ },
5852
+ {
5853
+ name: "permissionlessClaim",
5854
+ type: "bool",
5855
+ indexed: false,
5856
+ internalType: "bool"
5857
+ },
5858
+ {
5859
+ name: "totalAmount",
5860
+ type: "uint128",
5861
+ indexed: false,
5862
+ internalType: "uint128"
5863
+ },
5864
+ {
5865
+ name: "start",
5866
+ type: "uint64",
5867
+ indexed: false,
5868
+ internalType: "uint64"
5869
+ },
5870
+ {
5871
+ name: "cliffDuration",
5872
+ type: "uint64",
5873
+ indexed: false,
5874
+ internalType: "uint64"
5875
+ },
5876
+ {
5877
+ name: "vestingDuration",
5878
+ type: "uint64",
5879
+ indexed: false,
5880
+ internalType: "uint64"
5881
+ }
6032
5882
  ],
6033
- stateMutability: "nonpayable"
5883
+ anonymous: false
6034
5884
  },
6035
5885
  {
6036
- type: "function",
6037
- name: "simulateMulticurveBundleExactIn",
5886
+ type: "event",
5887
+ name: "VestingReleased",
6038
5888
  inputs: [
6039
5889
  {
6040
- name: "createData",
6041
- type: "tuple",
6042
- internalType: "struct CreateParams",
6043
- components: [
6044
- { name: "initialSupply", type: "uint256", internalType: "uint256" },
6045
- { name: "numTokensToSell", type: "uint256", internalType: "uint256" },
6046
- { name: "numeraire", type: "address", internalType: "address" },
6047
- {
6048
- name: "tokenFactory",
6049
- type: "address",
6050
- internalType: "contract ITokenFactory"
6051
- },
6052
- { name: "tokenFactoryData", type: "bytes", internalType: "bytes" },
6053
- {
6054
- name: "governanceFactory",
6055
- type: "address",
6056
- internalType: "contract IGovernanceFactory"
6057
- },
6058
- {
6059
- name: "governanceFactoryData",
6060
- type: "bytes",
6061
- internalType: "bytes"
6062
- },
6063
- {
6064
- name: "poolInitializer",
6065
- type: "address",
6066
- internalType: "contract IPoolInitializer"
6067
- },
6068
- { name: "poolInitializerData", type: "bytes", internalType: "bytes" },
6069
- {
6070
- name: "liquidityMigrator",
6071
- type: "address",
6072
- internalType: "contract ILiquidityMigrator"
6073
- },
6074
- {
6075
- name: "liquidityMigratorData",
6076
- type: "bytes",
6077
- internalType: "bytes"
6078
- },
6079
- { name: "integrator", type: "address", internalType: "address" },
6080
- { name: "salt", type: "bytes32", internalType: "bytes32" }
6081
- ]
5890
+ name: "asset",
5891
+ type: "address",
5892
+ indexed: true,
5893
+ internalType: "address"
6082
5894
  },
6083
- { name: "exactAmountIn", type: "uint128", internalType: "uint128" },
6084
- { name: "hookData", type: "bytes", internalType: "bytes" }
5895
+ {
5896
+ name: "recipient",
5897
+ type: "address",
5898
+ indexed: true,
5899
+ internalType: "address"
5900
+ },
5901
+ {
5902
+ name: "amount",
5903
+ type: "uint128",
5904
+ indexed: false,
5905
+ internalType: "uint128"
5906
+ }
6085
5907
  ],
6086
- outputs: [
5908
+ anonymous: false
5909
+ },
5910
+ {
5911
+ type: "error",
5912
+ name: "BundleQuote",
5913
+ inputs: [
6087
5914
  { name: "asset", type: "address", internalType: "address" },
6088
5915
  {
6089
5916
  name: "poolKey",
6090
5917
  type: "tuple",
6091
5918
  internalType: "struct PoolKey",
6092
- components: [
6093
- { name: "currency0", type: "address", internalType: "Currency" },
6094
- { name: "currency1", type: "address", internalType: "Currency" },
6095
- { name: "fee", type: "uint24", internalType: "uint24" },
6096
- { name: "tickSpacing", type: "int24", internalType: "int24" },
6097
- { name: "hooks", type: "address", internalType: "contract IHooks" }
6098
- ]
5919
+ components: bundlerPoolKeyComponents
6099
5920
  },
6100
- { name: "amountOut", type: "uint256", internalType: "uint256" },
6101
- { name: "gasEstimate", type: "uint256", internalType: "uint256" }
6102
- ],
6103
- stateMutability: "nonpayable"
5921
+ { name: "governance", type: "address", internalType: "address" },
5922
+ { name: "timelock", type: "address", internalType: "address" },
5923
+ { name: "amountOut", type: "uint128", internalType: "uint128" }
5924
+ ]
6104
5925
  },
6105
- { type: "error", name: "InvalidAddresses", inputs: [] },
6106
- { type: "error", name: "InvalidBundleData", inputs: [] },
6107
- { type: "error", name: "InvalidOutputToken", inputs: [] }
5926
+ {
5927
+ type: "error",
5928
+ name: "ExactInputNotFullySpent",
5929
+ inputs: [
5930
+ { name: "expected", type: "uint256", internalType: "uint256" },
5931
+ { name: "actual", type: "uint256", internalType: "uint256" }
5932
+ ]
5933
+ },
5934
+ { type: "error", name: "ExactInputAmountZero", inputs: [] },
5935
+ { type: "error", name: "InvalidAddress", inputs: [] },
5936
+ { type: "error", name: "InvalidNativeValue", inputs: [] },
5937
+ { type: "error", name: "InvalidPool", inputs: [] },
5938
+ { type: "error", name: "InvalidRecipient", inputs: [] },
5939
+ { type: "error", name: "InvalidVestingSchedule", inputs: [] },
5940
+ { type: "error", name: "NoClaimableAmount", inputs: [] },
5941
+ { type: "error", name: "SenderNotPoolManager", inputs: [] },
5942
+ { type: "error", name: "SenderNotRecipient", inputs: [] },
5943
+ { type: "error", name: "SenderNotSelf", inputs: [] },
5944
+ {
5945
+ type: "error",
5946
+ name: "SwapQuote",
5947
+ inputs: [{ name: "amountOut", type: "uint128", internalType: "uint128" }]
5948
+ },
5949
+ { type: "error", name: "UnexpectedSimulationSuccess", inputs: [] },
5950
+ {
5951
+ type: "error",
5952
+ name: "VestingAlreadyExists",
5953
+ inputs: [{ name: "asset", type: "address", internalType: "address" }]
5954
+ }
6108
5955
  ];
6109
5956
  var poolManagerAbi = [
6110
5957
  {
@@ -6315,6 +6162,13 @@ var rehypeDopplerHookInitializerAbi = [
6315
6162
  ],
6316
6163
  stateMutability: "view"
6317
6164
  },
6165
+ {
6166
+ type: "function",
6167
+ name: "bundler",
6168
+ inputs: [],
6169
+ outputs: [{ name: "", type: "address", internalType: "address" }],
6170
+ stateMutability: "view"
6171
+ },
6318
6172
  {
6319
6173
  type: "function",
6320
6174
  name: "quoter",
@@ -6409,32 +6263,77 @@ var rehypeDopplerHookInitializerAbi = [
6409
6263
  internalType: "uint24"
6410
6264
  },
6411
6265
  {
6412
- name: "durationSeconds",
6413
- type: "uint32",
6414
- indexed: false,
6415
- internalType: "uint32"
6416
- }
6417
- ],
6418
- anonymous: false
6419
- },
6420
- {
6421
- type: "event",
6422
- name: "FeeUpdated",
6423
- inputs: [
6266
+ name: "durationSeconds",
6267
+ type: "uint32",
6268
+ indexed: false,
6269
+ internalType: "uint32"
6270
+ }
6271
+ ],
6272
+ anonymous: false
6273
+ },
6274
+ {
6275
+ type: "event",
6276
+ name: "FeeUpdated",
6277
+ inputs: [
6278
+ {
6279
+ name: "poolId",
6280
+ type: "bytes32",
6281
+ indexed: true,
6282
+ internalType: "PoolId"
6283
+ },
6284
+ {
6285
+ name: "fee",
6286
+ type: "uint24",
6287
+ indexed: false,
6288
+ internalType: "uint24"
6289
+ }
6290
+ ],
6291
+ anonymous: false
6292
+ },
6293
+ {
6294
+ type: "function",
6295
+ name: "setFeeDistribution",
6296
+ inputs: [
6297
+ { name: "poolId", type: "bytes32", internalType: "PoolId" },
6298
+ {
6299
+ name: "assetFeesToAssetBuybackWad",
6300
+ type: "uint256",
6301
+ internalType: "uint256"
6302
+ },
6303
+ {
6304
+ name: "assetFeesToNumeraireBuybackWad",
6305
+ type: "uint256",
6306
+ internalType: "uint256"
6307
+ },
6308
+ {
6309
+ name: "assetFeesToBeneficiaryWad",
6310
+ type: "uint256",
6311
+ internalType: "uint256"
6312
+ },
6313
+ { name: "assetFeesToLpWad", type: "uint256", internalType: "uint256" },
6314
+ {
6315
+ name: "numeraireFeesToAssetBuybackWad",
6316
+ type: "uint256",
6317
+ internalType: "uint256"
6318
+ },
6319
+ {
6320
+ name: "numeraireFeesToNumeraireBuybackWad",
6321
+ type: "uint256",
6322
+ internalType: "uint256"
6323
+ },
6424
6324
  {
6425
- name: "poolId",
6426
- type: "bytes32",
6427
- indexed: true,
6428
- internalType: "PoolId"
6325
+ name: "numeraireFeesToBeneficiaryWad",
6326
+ type: "uint256",
6327
+ internalType: "uint256"
6429
6328
  },
6430
6329
  {
6431
- name: "fee",
6432
- type: "uint24",
6433
- indexed: false,
6434
- internalType: "uint24"
6330
+ name: "numeraireFeesToLpWad",
6331
+ type: "uint256",
6332
+ internalType: "uint256"
6435
6333
  }
6436
6334
  ],
6437
- anonymous: false
6335
+ outputs: [],
6336
+ stateMutability: "nonpayable"
6438
6337
  },
6439
6338
  { type: "error", name: "FeeBeneficiariesNotConfigured", inputs: [] },
6440
6339
  {
@@ -6443,6 +6342,7 @@ var rehypeDopplerHookInitializerAbi = [
6443
6342
  inputs: []
6444
6343
  },
6445
6344
  { type: "error", name: "FeeDistributionMustAddUpToWAD", inputs: [] },
6345
+ { type: "error", name: "SenderNotAuthorized", inputs: [] },
6446
6346
  {
6447
6347
  type: "error",
6448
6348
  name: "FeeTooHigh",
@@ -7092,7 +6992,6 @@ function getLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1) {
7092
6992
  }
7093
6993
 
7094
6994
  // src/evm/utils/multicurveLiquidity.ts
7095
- var MAX_UINT128 = (1n << 128n) - 1n;
7096
6995
  function getMaxLiquiditySafeMulticurveTickUpper(params) {
7097
6996
  if (params.tickUpper <= params.tickLower) {
7098
6997
  throw new Error(
@@ -7264,6 +7163,7 @@ function isNonEmpty(values) {
7264
7163
  var NO_OP_ENABLED_CHAIN_IDS = [
7265
7164
  CHAIN_IDS.MAINNET,
7266
7165
  CHAIN_IDS.ETH_SEPOLIA,
7166
+ CHAIN_IDS.ARBITRUM,
7267
7167
  CHAIN_IDS.BASE,
7268
7168
  CHAIN_IDS.BASE_SEPOLIA,
7269
7169
  CHAIN_IDS.UNICHAIN,
@@ -7277,6 +7177,7 @@ function isNoOpEnabledChain(chainId) {
7277
7177
  }
7278
7178
  var LAUNCHPAD_ENABLED_CHAIN_IDS = [
7279
7179
  CHAIN_IDS.MAINNET,
7180
+ CHAIN_IDS.ARBITRUM,
7280
7181
  CHAIN_IDS.BASE,
7281
7182
  CHAIN_IDS.BASE_SEPOLIA,
7282
7183
  CHAIN_IDS.ROBINHOOD,
@@ -7365,14 +7266,21 @@ function validateFeeDistributionInfo(feeDistributionInfo) {
7365
7266
  }
7366
7267
 
7367
7268
  // src/evm/utils/rehypeDopplerHookInitializer.ts
7368
- function normalizeRehypeDopplerHookInitializerConfig(config) {
7269
+ function normalizeRehypeDopplerHookInitializerConfig(config, controllerOverride) {
7369
7270
  assertNonZeroAddress(config.hookAddress, "Rehype hookAddress");
7370
- const feeBeneficiaries = config.feeBeneficiaries;
7371
- if (feeBeneficiaries !== void 0 && config.buybackDestination !== void 0) {
7271
+ if (config.buybackDestination !== void 0 && controllerOverride !== void 0) {
7272
+ throw new Error(
7273
+ "Rehype buybackDestination and withFeeDistributionController are mutually exclusive"
7274
+ );
7275
+ }
7276
+ const buybackDestination = config.buybackDestination ?? controllerOverride;
7277
+ if (buybackDestination === void 0) {
7372
7278
  throw new Error(
7373
- "Rehype buybackDestination and feeBeneficiaries are mutually exclusive"
7279
+ "Rehype requires buybackDestination or withFeeDistributionController"
7374
7280
  );
7375
7281
  }
7282
+ assertNonZeroAddress(buybackDestination, "Rehype buybackDestination");
7283
+ const feeBeneficiaries = config.feeBeneficiaries;
7376
7284
  const feeDistributionInfo = resolveRehypeFeeDistributionInfo(config);
7377
7285
  const { startFee, endFee, durationSeconds, startingTime } = normalizeFeeSchedule(config);
7378
7286
  const feeRoutingMode = feeBeneficiaries !== void 0 ? normalizeBeneficiaryFeeRoutingMode(config.feeRoutingMode) : normalizeFeeRoutingMode(config.feeRoutingMode);
@@ -7395,19 +7303,14 @@ function normalizeRehypeDopplerHookInitializerConfig(config) {
7395
7303
  );
7396
7304
  return {
7397
7305
  ...common,
7306
+ buybackDestination,
7398
7307
  feeBeneficiaries: normalizedBeneficiaries,
7399
7308
  feeRoutingMode: 1 /* RouteToBeneficiaryFees */
7400
7309
  };
7401
7310
  }
7402
- if (config.buybackDestination === void 0) {
7403
- throw new Error(
7404
- "Rehype requires either buybackDestination or feeBeneficiaries"
7405
- );
7406
- }
7407
- assertNonZeroAddress(config.buybackDestination, "Rehype buybackDestination");
7408
7311
  return {
7409
7312
  ...common,
7410
- buybackDestination: config.buybackDestination,
7313
+ buybackDestination,
7411
7314
  feeRoutingMode
7412
7315
  };
7413
7316
  }
@@ -7725,6 +7628,44 @@ function assertAddressMatch(code, expected, actual) {
7725
7628
  throw new AirlockCreateReceiptError(code, { expected, actual });
7726
7629
  }
7727
7630
  }
7631
+ function normalizePoolKey2(value) {
7632
+ if (Array.isArray(value)) {
7633
+ return {
7634
+ currency0: value[0],
7635
+ currency1: value[1],
7636
+ fee: Number(value[2]),
7637
+ tickSpacing: Number(value[3]),
7638
+ hooks: value[4]
7639
+ };
7640
+ }
7641
+ const poolKey = value;
7642
+ return {
7643
+ currency0: poolKey.currency0,
7644
+ currency1: poolKey.currency1,
7645
+ fee: Number(poolKey.fee),
7646
+ tickSpacing: Number(poolKey.tickSpacing),
7647
+ hooks: poolKey.hooks
7648
+ };
7649
+ }
7650
+ function poolId(poolKey) {
7651
+ return viem.keccak256(
7652
+ viem.encodeAbiParameters(
7653
+ [
7654
+ {
7655
+ type: "tuple",
7656
+ components: [
7657
+ { name: "currency0", type: "address" },
7658
+ { name: "currency1", type: "address" },
7659
+ { name: "fee", type: "uint24" },
7660
+ { name: "tickSpacing", type: "int24" },
7661
+ { name: "hooks", type: "address" }
7662
+ ]
7663
+ }
7664
+ ],
7665
+ [poolKey]
7666
+ )
7667
+ );
7668
+ }
7728
7669
  function verifyPreparedCreateReceipt({
7729
7670
  prepared,
7730
7671
  receipt
@@ -7775,6 +7716,86 @@ function verifyPreparedCreateReceipt({
7775
7716
  prepared.prediction.poolOrHookAddress,
7776
7717
  receiptIdentity.poolOrHookAddress
7777
7718
  );
7719
+ let verifiedDevBuy;
7720
+ if (prepared.devBuy) {
7721
+ const bundledEvents = [];
7722
+ const vestingEvents = [];
7723
+ for (const log of receipt.logs) {
7724
+ if (!addressesEqual(log.address, prepared.devBuy.bundler)) continue;
7725
+ try {
7726
+ const decoded = viem.decodeEventLog({
7727
+ abi: bundlerAbi,
7728
+ data: log.data,
7729
+ topics: log.topics
7730
+ });
7731
+ if (decoded.eventName === "Bundled") {
7732
+ const args = decoded.args;
7733
+ bundledEvents.push({
7734
+ recipient: args.recipient,
7735
+ amountIn: args.amountIn,
7736
+ amountOut: args.amountOut,
7737
+ poolKey: normalizePoolKey2(args.poolKey)
7738
+ });
7739
+ } else if (decoded.eventName === "VestingCreated") {
7740
+ const args = decoded.args;
7741
+ vestingEvents.push(args);
7742
+ }
7743
+ } catch {
7744
+ }
7745
+ }
7746
+ if (bundledEvents.length === 0) {
7747
+ throw new AirlockCreateReceiptError("MISSING_BUNDLED_EVENT");
7748
+ }
7749
+ if (bundledEvents.length > 1) {
7750
+ throw new AirlockCreateReceiptError("MULTIPLE_BUNDLED_EVENTS", {
7751
+ expected: 1,
7752
+ actual: bundledEvents.length
7753
+ });
7754
+ }
7755
+ const bundled = bundledEvents[0];
7756
+ if (!addressesEqual(bundled.recipient, prepared.devBuy.recipient)) {
7757
+ throw new AirlockCreateReceiptError("BUNDLED_RECIPIENT_MISMATCH", {
7758
+ expected: prepared.devBuy.recipient,
7759
+ actual: bundled.recipient
7760
+ });
7761
+ }
7762
+ if (bundled.amountIn !== prepared.devBuy.exactAmountIn) {
7763
+ throw new AirlockCreateReceiptError("BUNDLED_INPUT_MISMATCH", {
7764
+ expected: prepared.devBuy.exactAmountIn.toString(),
7765
+ actual: bundled.amountIn.toString()
7766
+ });
7767
+ }
7768
+ const bundledPoolId = poolId(bundled.poolKey);
7769
+ if (bundledPoolId.toLowerCase() !== prepared.prediction.poolId.toLowerCase()) {
7770
+ throw new AirlockCreateReceiptError("BUNDLED_POOL_KEY_MISMATCH", {
7771
+ expected: prepared.prediction.poolId,
7772
+ actual: bundledPoolId
7773
+ });
7774
+ }
7775
+ if (prepared.devBuy.vesting.vestingDuration === 0n) {
7776
+ if (vestingEvents.length !== 0) {
7777
+ throw new AirlockCreateReceiptError("UNEXPECTED_VESTING_EVENT", {
7778
+ expected: 0,
7779
+ actual: vestingEvents.length
7780
+ });
7781
+ }
7782
+ } else {
7783
+ if (vestingEvents.length === 0) {
7784
+ throw new AirlockCreateReceiptError("MISSING_VESTING_EVENT");
7785
+ }
7786
+ if (vestingEvents.length > 1) {
7787
+ throw new AirlockCreateReceiptError("MULTIPLE_VESTING_EVENTS", {
7788
+ expected: 1,
7789
+ actual: vestingEvents.length
7790
+ });
7791
+ }
7792
+ const vesting = vestingEvents[0];
7793
+ if (!addressesEqual(vesting.asset, prepared.prediction.tokenAddress) || !addressesEqual(vesting.recipient, prepared.devBuy.recipient) || vesting.totalAmount !== bundled.amountOut || vesting.permissionlessClaim !== prepared.devBuy.vesting.permissionlessClaim || vesting.cliffDuration !== prepared.devBuy.vesting.cliffDuration || vesting.vestingDuration !== prepared.devBuy.vesting.vestingDuration) {
7794
+ throw new AirlockCreateReceiptError("VESTING_MISMATCH");
7795
+ }
7796
+ }
7797
+ verifiedDevBuy = { amountOut: bundled.amountOut };
7798
+ }
7778
7799
  return {
7779
7800
  receiptIdentity,
7780
7801
  preparedIdentity: {
@@ -7787,7 +7808,8 @@ function verifyPreparedCreateReceipt({
7787
7808
  poolKey: prepared.prediction.poolKey,
7788
7809
  poolId: prepared.prediction.poolId,
7789
7810
  tokenIsCurrency0: prepared.prediction.tokenIsCurrency0
7790
- }
7811
+ },
7812
+ devBuy: verifiedDevBuy
7791
7813
  };
7792
7814
  }
7793
7815
  async function verifyPreparedCreateExecution({
@@ -8103,6 +8125,42 @@ function tickToMarketCap(params) {
8103
8125
  }
8104
8126
 
8105
8127
  // src/evm/builders/shared.ts
8128
+ function normalizeBuilderDevBuy(params) {
8129
+ if (params.exactAmountIn <= 0n || params.exactAmountIn > MAX_UINT128) {
8130
+ throw new Error("Dev buy exactAmountIn must be in the uint128 range");
8131
+ }
8132
+ if (params.recipient.toLowerCase() === ZERO_ADDRESS) {
8133
+ throw new Error("Dev buy recipient must not be the zero address");
8134
+ }
8135
+ const vestingDuration = params.vesting?.vestingDuration ?? 0n;
8136
+ const cliffDuration = params.vesting?.cliffDuration ?? 0n;
8137
+ if (vestingDuration < 0n || vestingDuration > MAX_UINT64) {
8138
+ throw new Error("Dev buy vestingDuration must be in the uint64 range");
8139
+ }
8140
+ if (cliffDuration < 0n || cliffDuration > MAX_UINT64) {
8141
+ throw new Error("Dev buy cliffDuration must be in the uint64 range");
8142
+ }
8143
+ if (params.vesting && vestingDuration === 0n) {
8144
+ throw new Error(
8145
+ "Dev buy vestingDuration must be greater than zero when vesting is configured"
8146
+ );
8147
+ }
8148
+ if (vestingDuration !== 0n && vestingDuration < MIN_BUNDLER_VESTING_DURATION) {
8149
+ throw new Error("Dev buy vestingDuration must be at least 86400 seconds");
8150
+ }
8151
+ if (cliffDuration > vestingDuration) {
8152
+ throw new Error("Dev buy cliffDuration must not exceed vestingDuration");
8153
+ }
8154
+ return {
8155
+ exactAmountIn: params.exactAmountIn,
8156
+ recipient: params.recipient,
8157
+ vesting: {
8158
+ permissionlessClaim: params.vesting?.permissionlessClaim ?? false,
8159
+ vestingDuration,
8160
+ cliffDuration
8161
+ }
8162
+ };
8163
+ }
8106
8164
  function assertTokenConfigSupportsYearlyMintRate(params) {
8107
8165
  if ("yearlyMintRate" in params && params.type !== "standard") {
8108
8166
  throw new Error(
@@ -8272,7 +8330,6 @@ function buildCurvesFromPresets(params) {
8272
8330
  }
8273
8331
 
8274
8332
  // src/evm/entities/DopplerFactory.ts
8275
- var MAX_UINT1282 = (1n << 128n) - 1n;
8276
8333
  var MAX_PROCEEDS_SPLIT_SHARE = WAD / 2n;
8277
8334
  function isDopplerHookMigratorConfig(config) {
8278
8335
  return config.type === "dopplerHookMigrator" || config.type === "dopplerHook";
@@ -8293,14 +8350,12 @@ var erc20BalanceOfAbi = [
8293
8350
  ];
8294
8351
  var TOKEN_FACTORY_80_ADDRESS2 = "0xf0b5141dd9096254b2ca624dff26024f46087229";
8295
8352
  var DERC20_V2_MIN_VESTING_DURATION = 24 * 60 * 60;
8296
- var MAX_UINT64 = (1n << 64n) - 1n;
8297
8353
  var MAX_UINT48 = (1n << 48n) - 1n;
8298
8354
  var DopplerFactory = class {
8299
8355
  publicClient;
8300
8356
  walletClient;
8301
8357
  chainId;
8302
8358
  customMigrationEncoder;
8303
- multicurveBundlerSupport = /* @__PURE__ */ new Map();
8304
8359
  constructor(publicClient, walletClient, chainId) {
8305
8360
  this.publicClient = publicClient;
8306
8361
  this.walletClient = walletClient;
@@ -9201,7 +9256,6 @@ var DopplerFactory = class {
9201
9256
  }
9202
9257
  /**
9203
9258
  * Simulate a static auction creation and return predicted addresses.
9204
- * Useful for pre-buy flows (bundle) to know the token/pool before sending.
9205
9259
  */
9206
9260
  async simulateCreateStaticAuction(params) {
9207
9261
  const createParams = await this.encodeCreateStaticAuctionParams(params);
@@ -9677,7 +9731,7 @@ var DopplerFactory = class {
9677
9731
  );
9678
9732
  }
9679
9733
  }
9680
- const poolId = this.computePoolId({
9734
+ const poolId2 = this.computePoolId({
9681
9735
  currency0: actualTokenAddress < params.sale.numeraire ? actualTokenAddress : params.sale.numeraire,
9682
9736
  currency1: actualTokenAddress < params.sale.numeraire ? params.sale.numeraire : actualTokenAddress,
9683
9737
  fee: params.pool.fee,
@@ -9687,7 +9741,7 @@ var DopplerFactory = class {
9687
9741
  return {
9688
9742
  hookAddress: actualHookAddress,
9689
9743
  tokenAddress: actualTokenAddress,
9690
- poolId,
9744
+ poolId: poolId2,
9691
9745
  transactionHash: hash
9692
9746
  };
9693
9747
  }
@@ -9718,7 +9772,7 @@ var DopplerFactory = class {
9718
9772
  }
9719
9773
  const tokenAddress = simResult[0];
9720
9774
  const hookAddress = simResult[1];
9721
- const poolId = this.computePoolId({
9775
+ const poolId2 = this.computePoolId({
9722
9776
  currency0: tokenAddress < params.sale.numeraire ? tokenAddress : params.sale.numeraire,
9723
9777
  currency1: tokenAddress < params.sale.numeraire ? params.sale.numeraire : tokenAddress,
9724
9778
  fee: params.pool.fee,
@@ -9737,7 +9791,7 @@ var DopplerFactory = class {
9737
9791
  createParams: createParamsWithTimelock,
9738
9792
  hookAddress,
9739
9793
  tokenAddress,
9740
- poolId,
9794
+ poolId: poolId2,
9741
9795
  gasEstimate,
9742
9796
  execute: () => this.createDynamicAuction(params, {
9743
9797
  _createParams: createParamsWithTimelock
@@ -11080,12 +11134,9 @@ var DopplerFactory = class {
11080
11134
  )
11081
11135
  };
11082
11136
  } else if (hasLegacyHook) {
11083
- mode = {
11084
- type: "rehype",
11085
- hookConfig: legacyHook
11086
- };
11137
+ mode = { type: "dopplerHook", hookConfig: legacyHook };
11087
11138
  } else {
11088
- mode = { type: "rehype" };
11139
+ mode = { type: "dopplerHook" };
11089
11140
  }
11090
11141
  } else {
11091
11142
  switch (initializer.type) {
@@ -11096,7 +11147,7 @@ var DopplerFactory = class {
11096
11147
  "Initializer type 'dopplerHookInitializer' cannot be combined with legacy schedule or RehypeDopplerHookInitializer configuration"
11097
11148
  );
11098
11149
  }
11099
- mode = { type: "rehype" };
11150
+ mode = { type: "dopplerHook" };
11100
11151
  break;
11101
11152
  }
11102
11153
  case "standard": {
@@ -11185,7 +11236,7 @@ var DopplerFactory = class {
11185
11236
  "Initializer type 'rehype' cannot be combined with schedule"
11186
11237
  );
11187
11238
  }
11188
- mode = { type: "rehype", hookConfig: initializer.config };
11239
+ mode = { type: "dopplerHook", hookConfig: initializer.config };
11189
11240
  break;
11190
11241
  }
11191
11242
  default: {
@@ -11198,8 +11249,8 @@ var DopplerFactory = class {
11198
11249
  }
11199
11250
  if (params.modules?.dopplerHookInitializer !== void 0) {
11200
11251
  if (mode.type === "standard") {
11201
- mode = { type: "rehype" };
11202
- } else if (mode.type !== "rehype") {
11252
+ mode = { type: "dopplerHook" };
11253
+ } else if (mode.type !== "dopplerHook") {
11203
11254
  throw new Error(
11204
11255
  "modules.dopplerHookInitializer can only be used with the dopplerHookInitializer, rehype, or standard multicurve initializer mode"
11205
11256
  );
@@ -11218,14 +11269,20 @@ var DopplerFactory = class {
11218
11269
  params.sale.numTokensToSell
11219
11270
  );
11220
11271
  const addresses = getAddresses(this.chainId);
11272
+ const resolvedBundler = params.devBuy ? params.modules?.bundler ?? addresses.bundler : void 0;
11273
+ if (params.devBuy && (!resolvedBundler || resolvedBundler === ZERO_ADDRESS)) {
11274
+ throw new Error(
11275
+ "Bundler address not configured on this chain. Override via builder.withBundler() or modules.bundler."
11276
+ );
11277
+ }
11221
11278
  const sortedBeneficiaries = sortBeneficiaries(
11222
11279
  params.pool.beneficiaries ?? []
11223
11280
  );
11224
11281
  const initializerMode = this.resolveMulticurveInitializerMode(params);
11225
11282
  const useScheduledInitializer = initializerMode.type === "scheduled";
11226
11283
  const useDecayInitializer = initializerMode.type === "decay";
11227
- const useDopplerHookInitializer = initializerMode.type === "rehype";
11228
- const normalizedRehypeHookConfig = initializerMode.type === "rehype" && initializerMode.hookConfig ? normalizeRehypeDopplerHookInitializerConfig(
11284
+ const useDopplerHookInitializer = initializerMode.type === "dopplerHook";
11285
+ const normalizedRehypeHookConfig = initializerMode.type === "dopplerHook" && initializerMode.hookConfig ? normalizeRehypeDopplerHookInitializerConfig(
11229
11286
  initializerMode.hookConfig
11230
11287
  ) : void 0;
11231
11288
  const curveComponents = [
@@ -11527,7 +11584,11 @@ var DopplerFactory = class {
11527
11584
  ),
11528
11585
  ...this.resolveGovernanceBalanceLimitExclusions(
11529
11586
  params.governance
11530
- )
11587
+ ),
11588
+ ...params.devBuy ? [
11589
+ params.devBuy.recipient,
11590
+ ...params.devBuy.vesting.vestingDuration !== 0n && resolvedBundler ? [resolvedBundler] : []
11591
+ ] : []
11531
11592
  ] : void 0
11532
11593
  });
11533
11594
  const predictedTokenAddress = this.predictDopplerERC20V1TokenAddress({
@@ -11578,29 +11639,136 @@ var DopplerFactory = class {
11578
11639
  };
11579
11640
  return createParams;
11580
11641
  }
11642
+ resolveBundlerAddress(params) {
11643
+ const bundler = params.modules?.bundler ?? getAddresses(this.chainId).bundler;
11644
+ if (!bundler || bundler === ZERO_ADDRESS) {
11645
+ throw new Error(
11646
+ "Bundler address not configured on this chain. Override via builder.withBundler() or modules.bundler."
11647
+ );
11648
+ }
11649
+ return bundler;
11650
+ }
11651
+ async ensureDevBuyInitializerCompatibility(args) {
11652
+ const initializerMode = this.resolveMulticurveInitializerMode(args.params);
11653
+ if (initializerMode.type !== "dopplerHook") {
11654
+ throw new Error(
11655
+ "Dev buys require a DopplerHookInitializer or Rehype initializer"
11656
+ );
11657
+ }
11658
+ const rehypeInitializer = initializerMode.hookConfig?.hookAddress;
11659
+ if (!rehypeInitializer) return;
11660
+ const configuredBundler = await this.publicClient.readContract({
11661
+ address: rehypeInitializer,
11662
+ abi: rehypeDopplerHookInitializerAbi,
11663
+ functionName: "bundler"
11664
+ });
11665
+ if (configuredBundler.toLowerCase() !== args.bundler.toLowerCase()) {
11666
+ throw new Error(
11667
+ `Rehype initializer ${rehypeInitializer} is configured for Bundler ${configuredBundler}, not ${args.bundler}`
11668
+ );
11669
+ }
11670
+ }
11671
+ parseBundleSimulation(result) {
11672
+ const values = Array.isArray(result) ? result : result && typeof result === "object" ? [
11673
+ result.asset,
11674
+ result.poolKey,
11675
+ result.governance,
11676
+ result.timelock,
11677
+ result.amountOut
11678
+ ] : [];
11679
+ if (values.length < 5) {
11680
+ throw new Error("Failed to simulate multicurve dev buy");
11681
+ }
11682
+ return {
11683
+ asset: values[0],
11684
+ poolKey: this.normalizePoolKey(values[1]),
11685
+ governance: values[2],
11686
+ timelock: values[3],
11687
+ amountOut: values[4]
11688
+ };
11689
+ }
11581
11690
  async resolveFinalMulticurveCreate(args) {
11582
11691
  const { params, simulationAccount } = args;
11583
11692
  const addresses = getAddresses(this.chainId);
11584
11693
  const airlock = params.modules?.airlock ?? addresses.airlock;
11585
11694
  const initialCreateParams = args.createParams ?? this.encodeCreateMulticurveParams(params);
11586
- const initialSimulation = await this.publicClient.simulateContract({
11587
- address: airlock,
11588
- abi: airlockAbi,
11589
- functionName: "create",
11590
- args: [{ ...initialCreateParams }],
11591
- account: simulationAccount
11592
- });
11593
- const initialResult = initialSimulation.result;
11594
- if (!initialResult || !Array.isArray(initialResult) || initialResult.length < 5) {
11595
- throw new Error("Failed to simulate multicurve create");
11695
+ if (!params.devBuy) {
11696
+ const initialSimulation = await this.publicClient.simulateContract({
11697
+ address: airlock,
11698
+ abi: airlockAbi,
11699
+ functionName: "create",
11700
+ args: [{ ...initialCreateParams }],
11701
+ account: simulationAccount
11702
+ });
11703
+ const initialResult = initialSimulation.result;
11704
+ if (!initialResult || !Array.isArray(initialResult) || initialResult.length < 5) {
11705
+ throw new Error("Failed to simulate multicurve create");
11706
+ }
11707
+ let createParams2 = initialCreateParams;
11708
+ let request = initialSimulation.request;
11709
+ let result2 = initialResult;
11710
+ if (!args.createParams) {
11711
+ const enrichedCreateParams = this.withSimulationGovernanceTimelockExclusion({
11712
+ createParams: createParams2,
11713
+ simResult: initialResult,
11714
+ token: params.token,
11715
+ governance: params.governance,
11716
+ modules: params.modules,
11717
+ addresses
11718
+ });
11719
+ if (enrichedCreateParams.tokenFactoryData !== createParams2.tokenFactoryData) {
11720
+ createParams2 = enrichedCreateParams;
11721
+ const finalSimulation = await this.publicClient.simulateContract({
11722
+ address: airlock,
11723
+ abi: airlockAbi,
11724
+ functionName: "create",
11725
+ args: [{ ...createParams2 }],
11726
+ account: simulationAccount
11727
+ });
11728
+ const finalResult = finalSimulation.result;
11729
+ if (!finalResult || !Array.isArray(finalResult) || finalResult.length < 5) {
11730
+ throw new Error("Failed to simulate enriched multicurve create");
11731
+ }
11732
+ request = finalSimulation.request;
11733
+ result2 = finalResult;
11734
+ }
11735
+ }
11736
+ const tokenAddress = result2[0];
11737
+ const poolIdentity = await this.computeMulticurvePoolIdentity(
11738
+ params,
11739
+ tokenAddress
11740
+ );
11741
+ const prediction2 = {
11742
+ tokenAddress,
11743
+ poolOrHookAddress: result2[1],
11744
+ governanceAddress: result2[2],
11745
+ timelockAddress: result2[3],
11746
+ migrationPoolAddress: result2[4],
11747
+ ...poolIdentity
11748
+ };
11749
+ return { airlock, createParams: createParams2, prediction: prediction2, request };
11596
11750
  }
11751
+ this.validateMulticurveDevBuy(params.devBuy);
11752
+ const bundler = this.resolveBundlerAddress(params);
11753
+ await this.ensureDevBuyInitializerCompatibility({ params, bundler });
11597
11754
  let createParams = initialCreateParams;
11598
- let request = initialSimulation.request;
11599
- let result = initialResult;
11755
+ const initialBundleSimulation = await this.publicClient.simulateContract({
11756
+ address: bundler,
11757
+ abi: bundlerAbi,
11758
+ functionName: "simulateBundle",
11759
+ args: [{ ...createParams }, params.devBuy.exactAmountIn]
11760
+ });
11761
+ let result = this.parseBundleSimulation(initialBundleSimulation.result);
11600
11762
  if (!args.createParams) {
11601
11763
  const enrichedCreateParams = this.withSimulationGovernanceTimelockExclusion({
11602
11764
  createParams,
11603
- simResult: initialResult,
11765
+ simResult: [
11766
+ result.asset,
11767
+ result.poolKey.hooks,
11768
+ result.governance,
11769
+ result.timelock,
11770
+ ZERO_ADDRESS
11771
+ ],
11604
11772
  token: params.token,
11605
11773
  governance: params.governance,
11606
11774
  modules: params.modules,
@@ -11608,87 +11776,202 @@ var DopplerFactory = class {
11608
11776
  });
11609
11777
  if (enrichedCreateParams.tokenFactoryData !== createParams.tokenFactoryData) {
11610
11778
  createParams = enrichedCreateParams;
11611
- const finalSimulation = await this.publicClient.simulateContract({
11612
- address: airlock,
11613
- abi: airlockAbi,
11614
- functionName: "create",
11615
- args: [{ ...createParams }],
11616
- account: simulationAccount
11779
+ const finalBundleSimulation = await this.publicClient.simulateContract({
11780
+ address: bundler,
11781
+ abi: bundlerAbi,
11782
+ functionName: "simulateBundle",
11783
+ args: [{ ...createParams }, params.devBuy.exactAmountIn]
11617
11784
  });
11618
- const finalResult = finalSimulation.result;
11619
- if (!finalResult || !Array.isArray(finalResult) || finalResult.length < 5) {
11620
- throw new Error("Failed to simulate enriched multicurve create");
11621
- }
11622
- request = finalSimulation.request;
11623
- result = finalResult;
11785
+ result = this.parseBundleSimulation(finalBundleSimulation.result);
11624
11786
  }
11625
11787
  }
11626
- const tokenAddress = result[0];
11627
- const poolIdentity = await this.computeMulticurvePoolIdentity(
11628
- params,
11629
- tokenAddress
11630
- );
11788
+ const currency0 = result.poolKey.currency0.toLowerCase();
11789
+ const currency1 = result.poolKey.currency1.toLowerCase();
11790
+ const asset = result.asset.toLowerCase();
11791
+ const numeraire = createParams.numeraire.toLowerCase();
11792
+ if (!(currency0 === asset && currency1 === numeraire || currency1 === asset && currency0 === numeraire)) {
11793
+ throw new Error(
11794
+ "Bundler simulation returned a pool key that does not contain the created asset and numeraire"
11795
+ );
11796
+ }
11797
+ if (result.poolKey.hooks.toLowerCase() !== createParams.poolInitializer.toLowerCase()) {
11798
+ throw new Error(
11799
+ "Bundler simulation returned an unexpected pool initializer"
11800
+ );
11801
+ }
11631
11802
  const prediction = {
11632
- tokenAddress,
11633
- poolOrHookAddress: result[1],
11634
- governanceAddress: result[2],
11635
- timelockAddress: result[3],
11636
- migrationPoolAddress: result[4],
11637
- ...poolIdentity
11803
+ tokenAddress: result.asset,
11804
+ poolOrHookAddress: result.asset,
11805
+ governanceAddress: result.governance,
11806
+ timelockAddress: result.timelock,
11807
+ poolKey: result.poolKey,
11808
+ poolId: this.computePoolId(result.poolKey),
11809
+ tokenIsCurrency0: currency0 === asset
11810
+ };
11811
+ const devBuy = {
11812
+ ...params.devBuy,
11813
+ vesting: { ...params.devBuy.vesting },
11814
+ bundler,
11815
+ simulatedAmountOut: result.amountOut
11816
+ };
11817
+ return { airlock, bundler, createParams, prediction, devBuy };
11818
+ }
11819
+ buildDevBuyTransaction(args) {
11820
+ return {
11821
+ to: args.devBuy.bundler,
11822
+ data: viem.encodeFunctionData({
11823
+ abi: bundlerAbi,
11824
+ functionName: "bundle",
11825
+ args: [
11826
+ { ...args.createParams },
11827
+ { ...args.devBuy.vesting },
11828
+ args.devBuy.exactAmountIn,
11829
+ args.devBuy.recipient
11830
+ ]
11831
+ }),
11832
+ value: args.createParams.numeraire === ZERO_ADDRESS ? args.devBuy.exactAmountIn : 0n
11638
11833
  };
11639
- return { airlock, createParams, prediction, request };
11834
+ }
11835
+ async readDevBuyAllowance(args) {
11836
+ if (args.createParams.numeraire === ZERO_ADDRESS) {
11837
+ return void 0;
11838
+ }
11839
+ return await this.publicClient.readContract({
11840
+ address: args.createParams.numeraire,
11841
+ abi: viem.erc20Abi,
11842
+ functionName: "allowance",
11843
+ args: [args.account, args.bundler]
11844
+ });
11845
+ }
11846
+ async estimateDevBuyGas(args) {
11847
+ try {
11848
+ const gas = await this.publicClient.estimateContractGas(
11849
+ {
11850
+ address: args.devBuy.bundler,
11851
+ abi: bundlerAbi,
11852
+ functionName: "bundle",
11853
+ args: [
11854
+ { ...args.createParams },
11855
+ { ...args.devBuy.vesting },
11856
+ args.devBuy.exactAmountIn,
11857
+ args.devBuy.recipient
11858
+ ],
11859
+ account: args.account,
11860
+ value: args.createParams.numeraire === ZERO_ADDRESS ? args.devBuy.exactAmountIn : 0n
11861
+ }
11862
+ );
11863
+ return { status: "estimated", gas };
11864
+ } catch {
11865
+ return { status: "unavailable" };
11866
+ }
11640
11867
  }
11641
11868
  async prepareCreateMulticurve(params, options) {
11642
11869
  const resolved = await this.resolveFinalMulticurveCreate({
11643
11870
  params,
11644
11871
  simulationAccount: options.account
11645
11872
  });
11646
- const internalGasEstimate = await this.resolveInternalCreateGasEstimate({
11647
- request: resolved.request,
11648
- address: resolved.airlock,
11873
+ if (!resolved.devBuy) {
11874
+ const internalGasEstimate = await this.resolveInternalCreateGasEstimate({
11875
+ request: resolved.request,
11876
+ address: resolved.airlock,
11877
+ createParams: resolved.createParams,
11878
+ account: options.account
11879
+ });
11880
+ if (internalGasEstimate.status === "reverted") {
11881
+ throw internalGasEstimate.error;
11882
+ }
11883
+ return {
11884
+ chainId: this.chainId,
11885
+ account: options.account,
11886
+ airlock: resolved.airlock,
11887
+ createParams: resolved.createParams,
11888
+ prediction: resolved.prediction,
11889
+ transaction: {
11890
+ to: resolved.airlock,
11891
+ data: viem.encodeFunctionData({
11892
+ abi: airlockAbi,
11893
+ functionName: "create",
11894
+ args: [{ ...resolved.createParams }]
11895
+ }),
11896
+ value: 0n
11897
+ },
11898
+ gasEstimate: internalGasEstimate
11899
+ };
11900
+ }
11901
+ const allowance = await this.readDevBuyAllowance({
11902
+ createParams: resolved.createParams,
11903
+ account: options.account,
11904
+ bundler: resolved.devBuy.bundler
11905
+ });
11906
+ const approvalRequired = allowance !== void 0 && allowance < resolved.devBuy.exactAmountIn;
11907
+ const approvalTransaction = approvalRequired ? {
11908
+ to: resolved.createParams.numeraire,
11909
+ data: viem.encodeFunctionData({
11910
+ abi: viem.erc20Abi,
11911
+ functionName: "approve",
11912
+ args: [resolved.devBuy.bundler, resolved.devBuy.exactAmountIn]
11913
+ }),
11914
+ value: 0n
11915
+ } : void 0;
11916
+ const gasEstimate = approvalRequired ? { status: "unavailable" } : await this.estimateDevBuyGas({
11649
11917
  createParams: resolved.createParams,
11918
+ devBuy: resolved.devBuy,
11650
11919
  account: options.account
11651
11920
  });
11652
- if (internalGasEstimate.status === "reverted") {
11653
- throw internalGasEstimate.error;
11654
- }
11655
- const gasEstimate = internalGasEstimate;
11656
11921
  return {
11657
11922
  chainId: this.chainId,
11658
11923
  account: options.account,
11659
11924
  airlock: resolved.airlock,
11660
11925
  createParams: resolved.createParams,
11661
11926
  prediction: resolved.prediction,
11662
- transaction: {
11663
- to: resolved.airlock,
11664
- data: viem.encodeFunctionData({
11665
- abi: airlockAbi,
11666
- functionName: "create",
11667
- args: [{ ...resolved.createParams }]
11668
- }),
11669
- value: 0n
11670
- },
11927
+ transaction: this.buildDevBuyTransaction({
11928
+ createParams: resolved.createParams,
11929
+ devBuy: resolved.devBuy
11930
+ }),
11931
+ approvalTransaction,
11932
+ devBuy: resolved.devBuy,
11671
11933
  gasEstimate
11672
11934
  };
11673
11935
  }
11674
11936
  async simulateCreateMulticurve(params) {
11937
+ const paramsSnapshot = structuredClone(params);
11675
11938
  const resolved = await this.resolveFinalMulticurveCreate({
11676
- params,
11939
+ params: paramsSnapshot,
11677
11940
  simulationAccount: this.walletClient?.account
11678
11941
  });
11679
- const gasEstimate = await this.resolveCreateGasEstimate({
11680
- request: resolved.request,
11681
- address: resolved.airlock,
11682
- createParams: resolved.createParams,
11683
- account: this.walletClient?.account ?? params.userAddress
11684
- });
11942
+ const createParamsSnapshot = structuredClone(resolved.createParams);
11943
+ let gasEstimate;
11944
+ if (resolved.devBuy) {
11945
+ const account = this.walletClient?.account ?? paramsSnapshot.userAddress;
11946
+ const allowance = await this.readDevBuyAllowance({
11947
+ createParams: resolved.createParams,
11948
+ account: typeof account === "string" ? account : account.address,
11949
+ bundler: resolved.devBuy.bundler
11950
+ });
11951
+ if (allowance === void 0 || allowance >= resolved.devBuy.exactAmountIn) {
11952
+ const estimate = await this.estimateDevBuyGas({
11953
+ createParams: resolved.createParams,
11954
+ devBuy: resolved.devBuy,
11955
+ account
11956
+ });
11957
+ gasEstimate = estimate.status === "estimated" ? estimate.gas : void 0;
11958
+ }
11959
+ } else {
11960
+ gasEstimate = await this.resolveCreateGasEstimate({
11961
+ request: resolved.request,
11962
+ address: resolved.airlock,
11963
+ createParams: resolved.createParams,
11964
+ account: this.walletClient?.account ?? paramsSnapshot.userAddress
11965
+ });
11966
+ }
11685
11967
  return {
11686
11968
  createParams: resolved.createParams,
11687
11969
  tokenAddress: resolved.prediction.tokenAddress,
11688
11970
  poolId: resolved.prediction.poolId,
11689
11971
  gasEstimate,
11690
- execute: () => this.createMulticurve(params, {
11691
- _createParams: resolved.createParams
11972
+ devBuy: resolved.devBuy,
11973
+ execute: () => this.createMulticurve(paramsSnapshot, {
11974
+ _createParams: createParamsSnapshot
11692
11975
  })
11693
11976
  };
11694
11977
  }
@@ -11701,38 +11984,142 @@ var DopplerFactory = class {
11701
11984
  simulationAccount: this.walletClient.account,
11702
11985
  createParams: options?._createParams
11703
11986
  });
11704
- const gasEstimate = await this.resolveCreateGasEstimate({
11705
- request: resolved.request,
11706
- address: resolved.airlock,
11987
+ let approvalTransactionHash;
11988
+ let hash;
11989
+ if (resolved.devBuy) {
11990
+ const account2 = this.walletClient.account;
11991
+ if (!account2) {
11992
+ throw new Error("Wallet account required for write operations");
11993
+ }
11994
+ const accountAddress2 = typeof account2 === "string" ? account2 : account2.address;
11995
+ const [allowance, balance] = await Promise.all([
11996
+ this.readDevBuyAllowance({
11997
+ createParams: resolved.createParams,
11998
+ account: accountAddress2,
11999
+ bundler: resolved.devBuy.bundler
12000
+ }),
12001
+ resolved.createParams.numeraire === ZERO_ADDRESS ? void 0 : this.publicClient.readContract({
12002
+ address: resolved.createParams.numeraire,
12003
+ abi: viem.erc20Abi,
12004
+ functionName: "balanceOf",
12005
+ args: [accountAddress2]
12006
+ })
12007
+ ]);
12008
+ if (balance !== void 0 && balance < resolved.devBuy.exactAmountIn) {
12009
+ throw new Error(
12010
+ `Insufficient ERC20 balance for dev buy: required ${resolved.devBuy.exactAmountIn}, available ${balance}`
12011
+ );
12012
+ }
12013
+ if (allowance !== void 0 && allowance < resolved.devBuy.exactAmountIn) {
12014
+ const { request: approvalRequest, result: approvalSucceeded } = await this.publicClient.simulateContract({
12015
+ address: resolved.createParams.numeraire,
12016
+ abi: viem.erc20Abi,
12017
+ functionName: "approve",
12018
+ args: [resolved.devBuy.bundler, resolved.devBuy.exactAmountIn],
12019
+ account: account2
12020
+ });
12021
+ if (approvalSucceeded !== true) {
12022
+ throw new Error("Bundler approval simulation returned false");
12023
+ }
12024
+ approvalTransactionHash = await this.walletClient.writeContract(approvalRequest);
12025
+ const approvalReceipt = await this.publicClient.waitForTransactionReceipt({
12026
+ hash: approvalTransactionHash,
12027
+ confirmations: 2
12028
+ });
12029
+ if (approvalReceipt.status !== "success") {
12030
+ throw new Error("Bundler approval transaction reverted");
12031
+ }
12032
+ const approvedAllowance = await this.readDevBuyAllowance({
12033
+ createParams: resolved.createParams,
12034
+ account: accountAddress2,
12035
+ bundler: resolved.devBuy.bundler
12036
+ });
12037
+ if (approvedAllowance === void 0 || approvedAllowance < resolved.devBuy.exactAmountIn) {
12038
+ throw new Error(
12039
+ "Bundler approval transaction did not provide the required allowance"
12040
+ );
12041
+ }
12042
+ }
12043
+ const { request } = await this.publicClient.simulateContract({
12044
+ address: resolved.devBuy.bundler,
12045
+ abi: bundlerAbi,
12046
+ functionName: "bundle",
12047
+ args: [
12048
+ { ...resolved.createParams },
12049
+ { ...resolved.devBuy.vesting },
12050
+ resolved.devBuy.exactAmountIn,
12051
+ resolved.devBuy.recipient
12052
+ ],
12053
+ account: account2,
12054
+ value: resolved.createParams.numeraire === ZERO_ADDRESS ? resolved.devBuy.exactAmountIn : 0n
12055
+ });
12056
+ hash = await this.walletClient.writeContract(
12057
+ params.gas === void 0 ? request : { ...request, gas: params.gas }
12058
+ );
12059
+ } else {
12060
+ const gasEstimate = await this.resolveCreateGasEstimate({
12061
+ request: resolved.request,
12062
+ address: resolved.airlock,
12063
+ createParams: resolved.createParams,
12064
+ account: this.walletClient.account
12065
+ });
12066
+ const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;
12067
+ hash = await this.walletClient.writeContract({
12068
+ ...resolved.request,
12069
+ gas
12070
+ });
12071
+ }
12072
+ const receipt = await this.publicClient.waitForTransactionReceipt({ hash, confirmations: 2 });
12073
+ const account = this.walletClient.account;
12074
+ if (!account) {
12075
+ throw new Error("Wallet account required for receipt verification");
12076
+ }
12077
+ const accountAddress = typeof account === "string" ? account : account.address;
12078
+ const transaction = resolved.devBuy ? this.buildDevBuyTransaction({
12079
+ createParams: resolved.createParams,
12080
+ devBuy: resolved.devBuy
12081
+ }) : {
12082
+ to: resolved.airlock,
12083
+ data: viem.encodeFunctionData({
12084
+ abi: airlockAbi,
12085
+ functionName: "create",
12086
+ args: [{ ...resolved.createParams }]
12087
+ }),
12088
+ value: 0n
12089
+ };
12090
+ const prepared = {
12091
+ chainId: this.chainId,
12092
+ account: accountAddress,
12093
+ airlock: resolved.airlock,
11707
12094
  createParams: resolved.createParams,
11708
- account: this.walletClient.account
11709
- });
11710
- const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;
11711
- const hash = await this.walletClient.writeContract({
11712
- ...resolved.request,
11713
- gas
11714
- });
11715
- const receipt = await this.publicClient.waitForTransactionReceipt({ hash, confirmations: 2 });
11716
- const createResult = parseAirlockCreateReceipt({
11717
- receipt,
11718
- expectedAirlock: resolved.airlock
11719
- });
11720
- if (!createResult) {
11721
- throw new Error(
11722
- "Failed to extract token address from Create event in transaction logs"
11723
- );
12095
+ prediction: resolved.prediction,
12096
+ transaction,
12097
+ devBuy: resolved.devBuy};
12098
+ const verified = verifyPreparedCreateReceipt({ prepared, receipt });
12099
+ const baseResult = {
12100
+ tokenAddress: verified.receiptIdentity.tokenAddress,
12101
+ poolId: resolved.prediction.poolId,
12102
+ transactionHash: hash,
12103
+ approvalTransactionHash
12104
+ };
12105
+ if (!resolved.devBuy) {
12106
+ return baseResult;
11724
12107
  }
11725
- const actualTokenAddress = createResult.tokenAddress;
11726
- if (resolved.prediction.tokenAddress.toLowerCase() !== actualTokenAddress.toLowerCase()) {
11727
- console.warn(
11728
- `[DopplerSDK] Simulation predicted token ${resolved.prediction.tokenAddress} but actual is ${actualTokenAddress}. This may indicate state divergence between simulation and execution.`
12108
+ if (!verified.devBuy) {
12109
+ throw new Error(
12110
+ "Bundler receipt verification did not return dev-buy data"
11729
12111
  );
11730
12112
  }
11731
- const { poolId } = await this.computeMulticurvePoolIdentity(
11732
- params,
11733
- actualTokenAddress
11734
- );
11735
- return { tokenAddress: actualTokenAddress, poolId, transactionHash: hash };
12113
+ return {
12114
+ ...baseResult,
12115
+ devBuy: {
12116
+ exactAmountIn: resolved.devBuy.exactAmountIn,
12117
+ recipient: resolved.devBuy.recipient,
12118
+ vesting: { ...resolved.devBuy.vesting },
12119
+ bundler: resolved.devBuy.bundler,
12120
+ amountOut: verified.devBuy.amountOut
12121
+ }
12122
+ };
11736
12123
  }
11737
12124
  /**
11738
12125
  * Normalize user-provided multicurve positions and ensure they satisfy SDK constraints
@@ -12233,6 +12620,24 @@ var DopplerFactory = class {
12233
12620
  );
12234
12621
  }
12235
12622
  }
12623
+ validateMulticurveDevBuy(devBuy) {
12624
+ if (devBuy.exactAmountIn <= 0n || devBuy.exactAmountIn > MAX_UINT128) {
12625
+ throw new Error("Dev buy exactAmountIn must be in the uint128 range");
12626
+ }
12627
+ if (devBuy.recipient.toLowerCase() === ZERO_ADDRESS) {
12628
+ throw new Error("Dev buy recipient must not be the zero address");
12629
+ }
12630
+ const { vestingDuration, cliffDuration } = devBuy.vesting;
12631
+ if (vestingDuration < 0n || vestingDuration > MAX_UINT64 || cliffDuration < 0n || cliffDuration > MAX_UINT64) {
12632
+ throw new Error("Dev buy vesting durations must be in the uint64 range");
12633
+ }
12634
+ if (vestingDuration !== 0n && vestingDuration < MIN_BUNDLER_VESTING_DURATION) {
12635
+ throw new Error("Dev buy vestingDuration must be at least 86400 seconds");
12636
+ }
12637
+ if (cliffDuration > vestingDuration) {
12638
+ throw new Error("Dev buy cliffDuration must not exceed vestingDuration");
12639
+ }
12640
+ }
12236
12641
  /**
12237
12642
  * Validate multicurve auction parameters
12238
12643
  */
@@ -12256,6 +12661,14 @@ var DopplerFactory = class {
12256
12661
  throw new Error("Cannot sell more tokens than initial supply");
12257
12662
  }
12258
12663
  this.resolveMulticurveInitializerMode(params);
12664
+ if (params.devBuy) {
12665
+ this.validateMulticurveDevBuy(params.devBuy);
12666
+ if (this.resolveMulticurveInitializerMode(params).type !== "dopplerHook") {
12667
+ throw new Error(
12668
+ "Dev buys require a DopplerHookInitializer or Rehype initializer"
12669
+ );
12670
+ }
12671
+ }
12259
12672
  this.validateVestingConfig(params.sale, params.vesting);
12260
12673
  if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {
12261
12674
  const beneficiaries = params.pool.beneficiaries;
@@ -12300,18 +12713,6 @@ var DopplerFactory = class {
12300
12713
  );
12301
12714
  }
12302
12715
  }
12303
- /**
12304
- * Get the Bundler contract address for the current chain
12305
- * Used to perform atomic create + swap ("bundle") flows for static auctions
12306
- */
12307
- getBundlerAddress() {
12308
- const addresses = getAddresses(this.chainId);
12309
- const addr = addresses.bundler;
12310
- if (!addr || addr === ZERO_ADDRESS) {
12311
- throw new Error("Bundler address not configured for this chain");
12312
- }
12313
- return addr;
12314
- }
12315
12716
  /**
12316
12717
  * Get the appropriate migrator address based on migration config
12317
12718
  * Allows override via ModuleAddressOverrides when provided in params.
@@ -12387,168 +12788,6 @@ var DopplerFactory = class {
12387
12788
  }
12388
12789
  // computeTicks moved to builders. No longer needed here.
12389
12790
  // computeOptimalGamma moved to utils.
12390
- // -----------------------------
12391
- // Bundler helpers (Static/V3)
12392
- // -----------------------------
12393
- /**
12394
- * Simulate a bundle with exact input on Uniswap V3 as part of create
12395
- * Returns the expected output amount for the provided exact input.
12396
- */
12397
- async simulateBundleExactInput(createParams, params) {
12398
- const bundler = this.getBundlerAddress();
12399
- const { result } = await this.publicClient.simulateContract({
12400
- address: bundler,
12401
- abi: bundlerAbi,
12402
- functionName: "simulateBundleExactIn",
12403
- args: [
12404
- { ...createParams },
12405
- {
12406
- tokenIn: params.tokenIn,
12407
- tokenOut: params.tokenOut,
12408
- amountIn: params.amountIn,
12409
- fee: params.fee,
12410
- sqrtPriceLimitX96: params.sqrtPriceLimitX96
12411
- }
12412
- ]
12413
- });
12414
- return result;
12415
- }
12416
- /**
12417
- * Simulate a bundle with exact output on Uniswap V3 as part of create
12418
- * Returns the required input amount for the provided exact output.
12419
- */
12420
- async simulateBundleExactOutput(createParams, params) {
12421
- const bundler = this.getBundlerAddress();
12422
- const { result } = await this.publicClient.simulateContract({
12423
- address: bundler,
12424
- abi: bundlerAbi,
12425
- functionName: "simulateBundleExactOut",
12426
- args: [
12427
- { ...createParams },
12428
- {
12429
- tokenIn: params.tokenIn,
12430
- tokenOut: params.tokenOut,
12431
- amount: params.amount,
12432
- fee: params.fee,
12433
- sqrtPriceLimitX96: params.sqrtPriceLimitX96
12434
- }
12435
- ]
12436
- });
12437
- return result;
12438
- }
12439
- // Bundler helpers (Multicurve/V4)
12440
- async simulateMulticurveBundleExactOut(createParams, params) {
12441
- const bundler = this.getBundlerAddress();
12442
- await this.ensureMulticurveBundlerSupport(bundler);
12443
- const exactAmountOut = params?.exactAmountOut ?? 0n;
12444
- this.ensureUint128(exactAmountOut, "exactAmountOut", { allowZero: true });
12445
- const hookData = "0x";
12446
- const { result } = await this.publicClient.simulateContract({
12447
- address: bundler,
12448
- abi: bundlerAbi,
12449
- functionName: "simulateMulticurveBundleExactOut",
12450
- args: [{ ...createParams }, exactAmountOut, hookData]
12451
- });
12452
- const { asset, poolKey, amount, gasEstimate } = this.parseMulticurveBundleResult(result);
12453
- return {
12454
- asset,
12455
- poolKey,
12456
- amountIn: amount,
12457
- gasEstimate
12458
- };
12459
- }
12460
- async simulateMulticurveBundleExactIn(createParams, params) {
12461
- const bundler = this.getBundlerAddress();
12462
- await this.ensureMulticurveBundlerSupport(bundler);
12463
- if (params.exactAmountIn === void 0) {
12464
- throw new Error(
12465
- "exactAmountIn is required for multicurve bundle simulations"
12466
- );
12467
- }
12468
- const exactAmountIn = params.exactAmountIn;
12469
- this.ensureUint128(exactAmountIn, "exactAmountIn");
12470
- const hookData = "0x";
12471
- const { result } = await this.publicClient.simulateContract({
12472
- address: bundler,
12473
- abi: bundlerAbi,
12474
- functionName: "simulateMulticurveBundleExactIn",
12475
- args: [{ ...createParams }, exactAmountIn, hookData]
12476
- });
12477
- const { asset, poolKey, amount, gasEstimate } = this.parseMulticurveBundleResult(result);
12478
- return {
12479
- asset,
12480
- poolKey,
12481
- amountOut: amount,
12482
- gasEstimate
12483
- };
12484
- }
12485
- /**
12486
- * Execute an atomic create + swap bundle through the Bundler
12487
- * commands/inputs are Universal Router encoded values (e.g., from doppler-router)
12488
- */
12489
- async bundle(createParams, commands, inputs, options) {
12490
- if (!this.walletClient) {
12491
- throw new Error("Wallet client required for write operations");
12492
- }
12493
- const bundler = this.getBundlerAddress();
12494
- const { request } = await this.publicClient.simulateContract({
12495
- address: bundler,
12496
- abi: bundlerAbi,
12497
- functionName: "bundle",
12498
- args: [{ ...createParams }, commands, inputs],
12499
- account: this.walletClient.account,
12500
- value: options?.value ?? 0n
12501
- });
12502
- const gas = options?.gas ?? void 0;
12503
- const tx = await this.walletClient.writeContract(
12504
- gas ? { ...request, gas } : request
12505
- );
12506
- return tx;
12507
- }
12508
- ensureUint128(value, paramName, options = {}) {
12509
- const { allowZero = false } = options;
12510
- if (value < 0n) {
12511
- throw new Error(`${paramName} cannot be negative`);
12512
- }
12513
- if (!allowZero && value === 0n) {
12514
- throw new Error(`${paramName} must be greater than zero`);
12515
- }
12516
- if (value > MAX_UINT1282) {
12517
- throw new Error(`${paramName} exceeds uint128 range`);
12518
- }
12519
- }
12520
- parseMulticurveBundleResult(result) {
12521
- let asset;
12522
- let poolKeyRaw;
12523
- let amount;
12524
- let gasEstimate;
12525
- if (Array.isArray(result)) {
12526
- if (result.length < 4) {
12527
- throw new Error("Unexpected multicurve bundle simulation result shape");
12528
- }
12529
- asset = result[0];
12530
- poolKeyRaw = result[1];
12531
- amount = result[2];
12532
- gasEstimate = result[3];
12533
- } else if (result && typeof result === "object") {
12534
- const obj = result;
12535
- asset = obj.asset;
12536
- poolKeyRaw = obj.poolKey;
12537
- amount = obj.amountIn ?? obj.amountOut ?? obj.amount;
12538
- gasEstimate = obj.gasEstimate;
12539
- } else {
12540
- throw new Error("Unexpected multicurve bundle simulation result format");
12541
- }
12542
- if (asset === void 0 || poolKeyRaw === void 0 || amount === void 0 || gasEstimate === void 0) {
12543
- throw new Error("Incomplete multicurve bundle simulation result");
12544
- }
12545
- return {
12546
- asset,
12547
- poolKey: this.normalizePoolKey(poolKeyRaw),
12548
- amount,
12549
- gasEstimate
12550
- };
12551
- }
12552
12791
  normalizePoolKey(value) {
12553
12792
  if (Array.isArray(value)) {
12554
12793
  const [currency0, currency1, feeRaw, tickSpacingRaw, hooks] = value;
@@ -12918,7 +13157,7 @@ var DopplerFactory = class {
12918
13157
  const addresses = getAddresses(this.chainId);
12919
13158
  const initializerMode = this.resolveMulticurveInitializerMode(params);
12920
13159
  let hookAddress;
12921
- if (initializerMode.type === "rehype") {
13160
+ if (initializerMode.type === "dopplerHook") {
12922
13161
  hookAddress = params.modules?.dopplerHookInitializer ?? addresses.dopplerHookInitializer ?? ZERO_ADDRESS;
12923
13162
  if (hookAddress === ZERO_ADDRESS) {
12924
13163
  throw new Error("DopplerHookInitializer address not configured");
@@ -12947,7 +13186,7 @@ var DopplerFactory = class {
12947
13186
  const poolKey = {
12948
13187
  currency0: tokenIsCurrency0 ? tokenAddress : numeraire,
12949
13188
  currency1: tokenIsCurrency0 ? numeraire : tokenAddress,
12950
- fee: initializerMode.type === "decay" || initializerMode.type === "rehype" && initializerMode.hookConfig ? DYNAMIC_FEE_FLAG : params.pool.fee,
13189
+ fee: initializerMode.type === "decay" || initializerMode.type === "dopplerHook" && initializerMode.hookConfig ? DYNAMIC_FEE_FLAG : params.pool.fee,
12951
13190
  tickSpacing: params.pool.tickSpacing,
12952
13191
  hooks: hookAddress
12953
13192
  };
@@ -12957,30 +13196,7 @@ var DopplerFactory = class {
12957
13196
  tokenIsCurrency0
12958
13197
  };
12959
13198
  }
12960
- async ensureMulticurveBundlerSupport(bundler) {
12961
- if (this.multicurveBundlerSupport.get(bundler)) {
12962
- return;
12963
- }
12964
- const client = this.publicClient;
12965
- if (!client || typeof client.getBytecode !== "function") {
12966
- this.multicurveBundlerSupport.set(bundler, true);
12967
- return;
12968
- }
12969
- const bytecode = await client.getBytecode({ address: bundler });
12970
- const supports = Boolean(
12971
- bytecode && MULTICURVE_BUNDLER_SELECTORS.every(
12972
- (selector) => bytecode.includes(selector.slice(2))
12973
- )
12974
- );
12975
- if (!supports) {
12976
- throw new Error(
12977
- `Bundler at ${bundler} does not support multicurve bundling. Ensure the Doppler Bundler has been upgraded and update chain addresses.`
12978
- );
12979
- }
12980
- this.multicurveBundlerSupport.set(bundler, true);
12981
- }
12982
13199
  };
12983
- var MULTICURVE_BUNDLER_SELECTORS = ["0xe2e9faa1", "0x07087b06"];
12984
13200
  function parseAirlockPoolOrHook(rawAssetData, context = "Airlock getAssetData") {
12985
13201
  const rawPoolOrHook = readContractResultField(
12986
13202
  rawAssetData,
@@ -13406,12 +13622,12 @@ var DynamicAuction = class {
13406
13622
  const isToken0 = poolKey.currency0 !== viem.zeroAddress;
13407
13623
  const tokenAddress = isToken0 ? poolKey.currency0 : poolKey.currency1;
13408
13624
  const numeraireAddress = isToken0 ? poolKey.currency1 : poolKey.currency0;
13409
- const poolId = computePoolId(poolKey);
13625
+ const poolId2 = computePoolId(poolKey);
13410
13626
  return {
13411
13627
  hookAddress: this.hookAddress,
13412
13628
  tokenAddress,
13413
13629
  numeraireAddress,
13414
- poolId,
13630
+ poolId: poolId2,
13415
13631
  currentEpoch,
13416
13632
  totalProceeds: state.totalProceeds,
13417
13633
  totalTokensSold: state.totalTokensSold,
@@ -13734,14 +13950,14 @@ async function collectMulticurveFees({
13734
13950
  addresses
13735
13951
  }) {
13736
13952
  if (state.status === 2 /* Locked */) {
13737
- const poolId = computePoolId(state.poolKey);
13953
+ const poolId2 = computePoolId(state.poolKey);
13738
13954
  const collectFeesAbi = initializerAddress === addresses.dopplerHookInitializer ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi;
13739
13955
  return collectFeesFromContract({
13740
13956
  client,
13741
13957
  walletClient,
13742
13958
  contractAddress: initializerAddress,
13743
13959
  abi: collectFeesAbi,
13744
- poolId
13960
+ poolId: poolId2
13745
13961
  });
13746
13962
  }
13747
13963
  throw new Error("Multicurve pool is not locked or was migrated");
@@ -13751,13 +13967,13 @@ async function collectFeesFromContract({
13751
13967
  walletClient,
13752
13968
  contractAddress,
13753
13969
  abi,
13754
- poolId
13970
+ poolId: poolId2
13755
13971
  }) {
13756
13972
  const { request, result } = await client.simulateContract({
13757
13973
  address: contractAddress,
13758
13974
  abi,
13759
13975
  functionName: "collectFees",
13760
- args: [poolId],
13976
+ args: [poolId2],
13761
13977
  account: walletClient.account
13762
13978
  });
13763
13979
  const hash = await walletClient.writeContract(request);
@@ -13773,13 +13989,13 @@ async function getMulticurveFeeSchedule(client, state) {
13773
13989
  if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {
13774
13990
  return null;
13775
13991
  }
13776
- const poolId = computePoolId(state.poolKey);
13992
+ const poolId2 = computePoolId(state.poolKey);
13777
13993
  try {
13778
13994
  const scheduleData = await client.readContract({
13779
13995
  address: state.poolKey.hooks,
13780
13996
  abi: decayMulticurveInitializerHookAbi,
13781
13997
  functionName: "getFeeScheduleOf",
13782
- args: [poolId]
13998
+ args: [poolId2]
13783
13999
  });
13784
14000
  return {
13785
14001
  startingTime: Number(readStructField(scheduleData, "startingTime", 0)),
@@ -13855,14 +14071,14 @@ var PENDING_FEE_CALL_ORDER = [
13855
14071
  "getLastCumulatedFees1"
13856
14072
  ];
13857
14073
  var PENDING_FEE_PREVIEW_CALL_COUNT = PENDING_FEE_CALL_ORDER.length;
13858
- function createPendingFeePreviewCalls(target, poolId, beneficiary) {
14074
+ function createPendingFeePreviewCalls(target, poolId2, beneficiary) {
13859
14075
  return PENDING_FEE_CALL_ORDER.map((functionName) => ({
13860
14076
  target,
13861
14077
  allowFailure: true,
13862
14078
  callData: viem.encodeFunctionData({
13863
14079
  abi: feeClaimsInitializerAbi,
13864
14080
  functionName,
13865
- args: functionName === "collectFees" || functionName === "getCumulatedFees0" || functionName === "getCumulatedFees1" ? [poolId] : [poolId, beneficiary]
14081
+ args: functionName === "collectFees" || functionName === "getCumulatedFees0" || functionName === "getCumulatedFees1" ? [poolId2] : [poolId2, beneficiary]
13866
14082
  })
13867
14083
  }));
13868
14084
  }
@@ -14246,10 +14462,10 @@ async function getPendingFeeBreakdownForMulticurveTokens({
14246
14462
  });
14247
14463
  }
14248
14464
  function createPendingFeeBreakdownPreviewPlan(poolContext, beneficiary) {
14249
- const poolId = computePoolId(poolContext.state.poolKey);
14465
+ const poolId2 = computePoolId(poolContext.state.poolKey);
14250
14466
  const poolCalls = createPendingFeePreviewCalls(
14251
14467
  poolContext.initializerAddress,
14252
- poolId,
14468
+ poolId2,
14253
14469
  beneficiary
14254
14470
  );
14255
14471
  if (poolContext.initializerKind !== "dopplerHook" || poolContext.dopplerHookAddress === viem.zeroAddress) {
@@ -14262,26 +14478,26 @@ function createPendingFeeBreakdownPreviewPlan(poolContext, beneficiary) {
14262
14478
  return {
14263
14479
  kind: "rehype",
14264
14480
  poolContext,
14265
- poolId,
14481
+ poolId: poolId2,
14266
14482
  calls: [
14267
14483
  ...poolCalls,
14268
- createRehypeCapabilityProbe(poolContext.dopplerHookAddress, poolId),
14484
+ createRehypeCapabilityProbe(poolContext.dopplerHookAddress, poolId2),
14269
14485
  ...createPendingFeePreviewCalls(
14270
14486
  poolContext.dopplerHookAddress,
14271
- poolId,
14487
+ poolId2,
14272
14488
  beneficiary
14273
14489
  )
14274
14490
  ]
14275
14491
  };
14276
14492
  }
14277
- function createRehypeCapabilityProbe(target, poolId) {
14493
+ function createRehypeCapabilityProbe(target, poolId2) {
14278
14494
  return {
14279
14495
  target,
14280
14496
  allowFailure: true,
14281
14497
  callData: viem.encodeFunctionData({
14282
14498
  abi: feesManagerAbi,
14283
14499
  functionName: "getPoolKey",
14284
- args: [poolId]
14500
+ args: [poolId2]
14285
14501
  })
14286
14502
  };
14287
14503
  }
@@ -14443,7 +14659,7 @@ var RehypeDopplerHookInitializer = class {
14443
14659
  * The fee amounts are newly collected pool fees, not necessarily the caller's
14444
14660
  * beneficiary payout.
14445
14661
  */
14446
- async claimFees(poolId) {
14662
+ async claimFees(poolId2, options) {
14447
14663
  const walletClient = this.requireWalletClient(
14448
14664
  "Wallet client required to claim rehype beneficiary fees"
14449
14665
  );
@@ -14451,23 +14667,25 @@ var RehypeDopplerHookInitializer = class {
14451
14667
  address: this.hookAddress,
14452
14668
  abi: rehypeFeesManagerAbi,
14453
14669
  functionName: "collectFees",
14454
- args: [poolId],
14670
+ args: [poolId2],
14455
14671
  account: walletClient.account
14456
14672
  });
14457
- const hash = await walletClient.writeContract(request);
14673
+ const hash = await walletClient.writeContract(
14674
+ options?.gas === void 0 ? request : { ...request, gas: options.gas }
14675
+ );
14458
14676
  await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });
14459
14677
  const [fees0, fees1] = result;
14460
14678
  return { fees0, fees1, transactionHash: hash };
14461
14679
  }
14462
- async getPendingFees(poolId, beneficiary) {
14680
+ async getPendingFees(poolId2, beneficiary) {
14463
14681
  const calls = createPendingFeePreviewCalls(
14464
14682
  this.hookAddress,
14465
- poolId,
14683
+ poolId2,
14466
14684
  beneficiary
14467
14685
  );
14468
14686
  return calculatePendingFees(await callAggregate3(this.rpc, calls));
14469
14687
  }
14470
- async updateBeneficiary(poolId, newBeneficiary) {
14688
+ async updateBeneficiary(poolId2, newBeneficiary) {
14471
14689
  if (newBeneficiary.toLowerCase() === ZERO_ADDRESS) {
14472
14690
  throw new Error(
14473
14691
  "Rehype beneficiary cannot be updated to the zero address"
@@ -14480,7 +14698,7 @@ var RehypeDopplerHookInitializer = class {
14480
14698
  address: this.hookAddress,
14481
14699
  abi: feesManagerAbi,
14482
14700
  functionName: "updateBeneficiary",
14483
- args: [poolId, newBeneficiary],
14701
+ args: [poolId2, newBeneficiary],
14484
14702
  account: walletClient.account
14485
14703
  });
14486
14704
  const hash = await walletClient.writeContract(request);
@@ -14503,48 +14721,82 @@ var RehypeDopplerHookInitializer = class {
14503
14721
  const [fees0, fees1] = result;
14504
14722
  return { fees0, fees1, transactionHash: hash };
14505
14723
  }
14506
- async getFeeDistributionInfo(poolId) {
14724
+ /**
14725
+ * Replace a pool's complete fee distribution matrix.
14726
+ *
14727
+ * The connected wallet must be the pool's configured fee distribution
14728
+ * controller (`buybackDst`). The asset-fee allocations and numeraire-fee
14729
+ * allocations must each sum to WAD.
14730
+ *
14731
+ * @returns The confirmed transaction hash.
14732
+ */
14733
+ async setFeeDistribution(poolId2, feeDistributionInfo) {
14734
+ const walletClient = this.requireWalletClient(
14735
+ "Wallet client required to set rehype fee distribution"
14736
+ );
14737
+ const { request } = await this.rpc.simulateContract({
14738
+ address: this.hookAddress,
14739
+ abi: rehypeDopplerHookInitializerAbi,
14740
+ functionName: "setFeeDistribution",
14741
+ args: [
14742
+ poolId2,
14743
+ feeDistributionInfo.assetFeesToAssetBuybackWad,
14744
+ feeDistributionInfo.assetFeesToNumeraireBuybackWad,
14745
+ feeDistributionInfo.assetFeesToBeneficiaryWad,
14746
+ feeDistributionInfo.assetFeesToLpWad,
14747
+ feeDistributionInfo.numeraireFeesToAssetBuybackWad,
14748
+ feeDistributionInfo.numeraireFeesToNumeraireBuybackWad,
14749
+ feeDistributionInfo.numeraireFeesToBeneficiaryWad,
14750
+ feeDistributionInfo.numeraireFeesToLpWad
14751
+ ],
14752
+ account: walletClient.account
14753
+ });
14754
+ const hash = await walletClient.writeContract(request);
14755
+ await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });
14756
+ return { transactionHash: hash };
14757
+ }
14758
+ async getFeeDistributionInfo(poolId2) {
14507
14759
  const result = await this.rpc.readContract({
14508
14760
  address: this.hookAddress,
14509
14761
  abi: rehypeDopplerHookInitializerAbi,
14510
14762
  functionName: "getFeeDistributionInfo",
14511
- args: [poolId]
14763
+ args: [poolId2]
14512
14764
  });
14513
14765
  return normalizeRehypeFeeDistributionInfo(result);
14514
14766
  }
14515
- async getFeeRoutingMode(poolId) {
14767
+ async getFeeRoutingMode(poolId2) {
14516
14768
  const mode = await this.rpc.readContract({
14517
14769
  address: this.hookAddress,
14518
14770
  abi: rehypeDopplerHookInitializerAbi,
14519
14771
  functionName: "getFeeRoutingMode",
14520
- args: [poolId]
14772
+ args: [poolId2]
14521
14773
  });
14522
14774
  return Number(mode);
14523
14775
  }
14524
- async getFeeSchedule(poolId) {
14776
+ async getFeeSchedule(poolId2) {
14525
14777
  const result = await this.rpc.readContract({
14526
14778
  address: this.hookAddress,
14527
14779
  abi: rehypeDopplerHookInitializerAbi,
14528
14780
  functionName: "getFeeSchedule",
14529
- args: [poolId]
14781
+ args: [poolId2]
14530
14782
  });
14531
14783
  return normalizeRehypeFeeSchedule(result);
14532
14784
  }
14533
- async getHookFees(poolId) {
14785
+ async getHookFees(poolId2) {
14534
14786
  const result = await this.rpc.readContract({
14535
14787
  address: this.hookAddress,
14536
14788
  abi: rehypeDopplerHookInitializerAbi,
14537
14789
  functionName: "getHookFees",
14538
- args: [poolId]
14790
+ args: [poolId2]
14539
14791
  });
14540
14792
  return normalizeRehypeHookFees(result);
14541
14793
  }
14542
- async getPoolInfo(poolId) {
14794
+ async getPoolInfo(poolId2) {
14543
14795
  const result = await this.rpc.readContract({
14544
14796
  address: this.hookAddress,
14545
14797
  abi: rehypeDopplerHookInitializerAbi,
14546
14798
  functionName: "getPoolInfo",
14547
- args: [poolId]
14799
+ args: [poolId2]
14548
14800
  });
14549
14801
  return normalizeRehypePoolInfo(result);
14550
14802
  }
@@ -14611,7 +14863,7 @@ var RehypeDopplerHookMigrator = class {
14611
14863
  const [fees0, fees1] = result;
14612
14864
  return { fees0, fees1, transactionHash: hash };
14613
14865
  }
14614
- async setFeeDistribution(poolId, feeDistributionInfo) {
14866
+ async setFeeDistribution(poolId2, feeDistributionInfo) {
14615
14867
  if (!this.walletClient) {
14616
14868
  throw new Error("Wallet client required to set rehype fee distribution");
14617
14869
  }
@@ -14620,7 +14872,7 @@ var RehypeDopplerHookMigrator = class {
14620
14872
  abi: rehypeDopplerHookMigratorAbi,
14621
14873
  functionName: "setFeeDistribution",
14622
14874
  args: [
14623
- poolId,
14875
+ poolId2,
14624
14876
  feeDistributionInfo.assetFeesToAssetBuybackWad,
14625
14877
  feeDistributionInfo.assetFeesToNumeraireBuybackWad,
14626
14878
  feeDistributionInfo.assetFeesToBeneficiaryWad,
@@ -14636,48 +14888,48 @@ var RehypeDopplerHookMigrator = class {
14636
14888
  await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });
14637
14889
  return hash;
14638
14890
  }
14639
- async getFeeDistributionInfo(poolId) {
14891
+ async getFeeDistributionInfo(poolId2) {
14640
14892
  const result = await this.rpc.readContract({
14641
14893
  address: this.hookAddress,
14642
14894
  abi: rehypeDopplerHookMigratorAbi,
14643
14895
  functionName: "getFeeDistributionInfo",
14644
- args: [poolId]
14896
+ args: [poolId2]
14645
14897
  });
14646
14898
  return normalizeRehypeFeeDistributionInfo(result);
14647
14899
  }
14648
- async getFeeRoutingMode(poolId) {
14900
+ async getFeeRoutingMode(poolId2) {
14649
14901
  const mode = await this.rpc.readContract({
14650
14902
  address: this.hookAddress,
14651
14903
  abi: rehypeDopplerHookMigratorAbi,
14652
14904
  functionName: "getFeeRoutingMode",
14653
- args: [poolId]
14905
+ args: [poolId2]
14654
14906
  });
14655
14907
  return Number(mode);
14656
14908
  }
14657
- async getHookFees(poolId) {
14909
+ async getHookFees(poolId2) {
14658
14910
  const result = await this.rpc.readContract({
14659
14911
  address: this.hookAddress,
14660
14912
  abi: rehypeDopplerHookMigratorAbi,
14661
14913
  functionName: "getHookFees",
14662
- args: [poolId]
14914
+ args: [poolId2]
14663
14915
  });
14664
14916
  return normalizeRehypeHookFees(result);
14665
14917
  }
14666
- async getPoolInfo(poolId) {
14918
+ async getPoolInfo(poolId2) {
14667
14919
  const result = await this.rpc.readContract({
14668
14920
  address: this.hookAddress,
14669
14921
  abi: rehypeDopplerHookMigratorAbi,
14670
14922
  functionName: "getPoolInfo",
14671
- args: [poolId]
14923
+ args: [poolId2]
14672
14924
  });
14673
14925
  return normalizeRehypePoolInfo(result);
14674
14926
  }
14675
- async getPosition(poolId) {
14927
+ async getPosition(poolId2) {
14676
14928
  const result = await this.rpc.readContract({
14677
14929
  address: this.hookAddress,
14678
14930
  abi: rehypeDopplerHookMigratorAbi,
14679
14931
  functionName: "getPosition",
14680
- args: [poolId]
14932
+ args: [poolId2]
14681
14933
  });
14682
14934
  return normalizeRehypePosition(result);
14683
14935
  }
@@ -18599,6 +18851,112 @@ var TopUpDistributor = class {
18599
18851
  }
18600
18852
  };
18601
18853
 
18854
+ // src/evm/entities/Bundler.ts
18855
+ var Bundler = class {
18856
+ publicClient;
18857
+ walletClient;
18858
+ bundlerAddress;
18859
+ constructor(publicClient, walletClient, bundlerAddress) {
18860
+ this.publicClient = publicClient;
18861
+ this.walletClient = walletClient;
18862
+ this.bundlerAddress = bundlerAddress;
18863
+ }
18864
+ get rpc() {
18865
+ return this.publicClient;
18866
+ }
18867
+ /** Returns the Bundler contract address used by this client. */
18868
+ getAddress() {
18869
+ return this.bundlerAddress;
18870
+ }
18871
+ /**
18872
+ * Reads the vesting position for an asset.
18873
+ *
18874
+ * @param asset Token whose Bundler position should be read.
18875
+ */
18876
+ async getVesting(asset) {
18877
+ const result = await this.rpc.readContract({
18878
+ address: this.bundlerAddress,
18879
+ abi: bundlerAbi,
18880
+ functionName: "vestingOf",
18881
+ args: [asset]
18882
+ });
18883
+ const values = result;
18884
+ return {
18885
+ recipient: values[0],
18886
+ permissionlessClaim: values[1],
18887
+ start: values[2],
18888
+ cliffDuration: values[3],
18889
+ vestingDuration: values[4],
18890
+ totalAmount: values[5],
18891
+ claimedAmount: values[6]
18892
+ };
18893
+ }
18894
+ /**
18895
+ * Returns the amount currently claimable for an asset.
18896
+ *
18897
+ * @param asset Token whose claimable amount should be read.
18898
+ */
18899
+ async getClaimable(asset) {
18900
+ return await this.rpc.readContract({
18901
+ address: this.bundlerAddress,
18902
+ abi: bundlerAbi,
18903
+ functionName: "claimable",
18904
+ args: [asset]
18905
+ });
18906
+ }
18907
+ /**
18908
+ * Simulates a claim and returns both the claimable amount and write request.
18909
+ *
18910
+ * The caller defaults to the configured wallet account. Pass `account` when
18911
+ * using a read-only SDK instance. For restricted positions, the caller must
18912
+ * be the recorded recipient.
18913
+ *
18914
+ * @param asset Token to claim.
18915
+ * @param account Account that will trigger the claim.
18916
+ */
18917
+ async simulateClaim(asset, account) {
18918
+ const resolvedAccount = account ?? this.walletClient?.account;
18919
+ if (!resolvedAccount) {
18920
+ throw new Error(
18921
+ "An account is required to simulate a Bundler vesting claim"
18922
+ );
18923
+ }
18924
+ const { request, result } = await this.rpc.simulateContract({
18925
+ address: this.bundlerAddress,
18926
+ abi: bundlerAbi,
18927
+ functionName: "claim",
18928
+ args: [asset],
18929
+ account: resolvedAccount
18930
+ });
18931
+ return {
18932
+ amount: result,
18933
+ request
18934
+ };
18935
+ }
18936
+ /**
18937
+ * Claims the currently vested amount to the position's recorded recipient.
18938
+ *
18939
+ * Requires a configured wallet client. Permissionless callers may trigger a
18940
+ * claim but cannot redirect its proceeds.
18941
+ *
18942
+ * @param asset Token to claim.
18943
+ * @param options Optional transaction gas override.
18944
+ * @returns Submitted transaction hash.
18945
+ */
18946
+ async claim(asset, options) {
18947
+ if (!this.walletClient) {
18948
+ throw new Error("Wallet client required for write operations");
18949
+ }
18950
+ const { request } = await this.simulateClaim(
18951
+ asset,
18952
+ this.walletClient.account
18953
+ );
18954
+ return await this.walletClient.writeContract(
18955
+ options?.gas === void 0 ? request : { ...request, gas: options.gas }
18956
+ );
18957
+ }
18958
+ };
18959
+
18602
18960
  // src/evm/builders/StaticAuctionBuilder.ts
18603
18961
  var StaticAuctionBuilder = class _StaticAuctionBuilder {
18604
18962
  token;
@@ -19326,6 +19684,7 @@ var MulticurveBuilder = class _MulticurveBuilder {
19326
19684
  schedule;
19327
19685
  dopplerHook;
19328
19686
  vesting;
19687
+ devBuy;
19329
19688
  governance;
19330
19689
  migration;
19331
19690
  integrator;
@@ -19333,6 +19692,7 @@ var MulticurveBuilder = class _MulticurveBuilder {
19333
19692
  salt;
19334
19693
  moduleAddresses;
19335
19694
  gasLimit;
19695
+ feeDistributionControllerAddress;
19336
19696
  // Stored from withCurves() for graduationMarketCap conversion in build()
19337
19697
  numerairePrice;
19338
19698
  tokenDecimals;
@@ -19578,9 +19938,19 @@ var MulticurveBuilder = class _MulticurveBuilder {
19578
19938
  "Cannot specify both graduationMarketCap and farTick. Use one or the other."
19579
19939
  );
19580
19940
  }
19581
- const normalizedParams = normalizeRehypeDopplerHookInitializerConfig(params);
19582
- this.dopplerHook = normalizedParams;
19583
- this.initializer = { type: "rehype", config: normalizedParams };
19941
+ if (params.buybackDestination !== void 0 && this.feeDistributionControllerAddress !== void 0) {
19942
+ throw new Error(
19943
+ "Rehype buybackDestination and withFeeDistributionController are mutually exclusive"
19944
+ );
19945
+ }
19946
+ if (params.buybackDestination !== void 0 || this.feeDistributionControllerAddress !== void 0) {
19947
+ normalizeRehypeDopplerHookInitializerConfig(
19948
+ params,
19949
+ this.feeDistributionControllerAddress
19950
+ );
19951
+ }
19952
+ this.dopplerHook = params;
19953
+ this.initializer = { type: "rehype", config: params };
19584
19954
  return this;
19585
19955
  }
19586
19956
  /** @deprecated Use withRehypeDopplerHookInitializer instead. */
@@ -19613,6 +19983,18 @@ var MulticurveBuilder = class _MulticurveBuilder {
19613
19983
  };
19614
19984
  return this;
19615
19985
  }
19986
+ /**
19987
+ * Configures an exact-input purchase executed atomically with market creation.
19988
+ *
19989
+ * Omit `vesting` for direct delivery to `recipient`; when present, Bundler
19990
+ * holds the output and releases it under that schedule. This is independent
19991
+ * from `withVesting`, which configures token allocation vesting. Passing
19992
+ * `undefined` clears the dev buy.
19993
+ */
19994
+ withDevBuy(params) {
19995
+ this.devBuy = params ? normalizeBuilderDevBuy(params) : void 0;
19996
+ return this;
19997
+ }
19616
19998
  parseStartTimeSeconds(value, label) {
19617
19999
  let startTimeSeconds;
19618
20000
  if (value instanceof Date) {
@@ -19713,6 +20095,24 @@ var MulticurveBuilder = class _MulticurveBuilder {
19713
20095
  this.governance = params;
19714
20096
  return this;
19715
20097
  }
20098
+ /**
20099
+ * Configure the address authorized to update a Rehype pool's fee
20100
+ * distribution matrix.
20101
+ *
20102
+ * This sets the on-chain `buybackDst`, which also receives direct-buyback
20103
+ * proceeds and legacy empty-beneficiary fees. Every Rehype initializer
20104
+ * requires either this method or `buybackDestination`; they configure the
20105
+ * same field and cannot be used together.
20106
+ */
20107
+ withFeeDistributionController(address) {
20108
+ if (this.dopplerHook?.buybackDestination !== void 0) {
20109
+ throw new Error(
20110
+ "Rehype buybackDestination and withFeeDistributionController are mutually exclusive"
20111
+ );
20112
+ }
20113
+ this.feeDistributionControllerAddress = address;
20114
+ return this;
20115
+ }
19716
20116
  withMigration(migration) {
19717
20117
  this.migration = migration;
19718
20118
  return this;
@@ -19746,6 +20146,9 @@ var MulticurveBuilder = class _MulticurveBuilder {
19746
20146
  withAirlock(address) {
19747
20147
  return this.overrideModule("airlock", address);
19748
20148
  }
20149
+ withBundler(address) {
20150
+ return this.overrideModule("bundler", address);
20151
+ }
19749
20152
  withV4MulticurveInitializer(address) {
19750
20153
  this.assertCanSetInitializer("standard");
19751
20154
  this.initializer = { type: "standard" };
@@ -19867,7 +20270,24 @@ var MulticurveBuilder = class _MulticurveBuilder {
19867
20270
  );
19868
20271
  }
19869
20272
  }
20273
+ if (this.feeDistributionControllerAddress !== void 0 && this.dopplerHook === void 0) {
20274
+ throw new Error(
20275
+ "withFeeDistributionController requires a Rehype initializer configuration"
20276
+ );
20277
+ }
20278
+ const governance = this.governance ?? (isNoOpEnabledChain(this.chainId) ? { type: "noOp" } : { type: "default" });
20279
+ if (governance.type === "launchpad" && !isLaunchpadEnabledChain(this.chainId)) {
20280
+ throw new Error(
20281
+ `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`
20282
+ );
20283
+ }
19870
20284
  let dopplerHook = this.dopplerHook;
20285
+ if (dopplerHook) {
20286
+ dopplerHook = normalizeRehypeDopplerHookInitializerConfig(
20287
+ dopplerHook,
20288
+ this.feeDistributionControllerAddress
20289
+ );
20290
+ }
19871
20291
  if (dopplerHook?.graduationMarketCap !== void 0) {
19872
20292
  const numerairePrice = dopplerHook.numerairePrice ?? this.numerairePrice;
19873
20293
  if (!numerairePrice) {
@@ -19927,14 +20347,13 @@ var MulticurveBuilder = class _MulticurveBuilder {
19927
20347
  );
19928
20348
  }
19929
20349
  }
19930
- const schedule = initializer.type === "scheduled" ? { startTime: initializer.startTime } : void 0;
19931
- dopplerHook = initializer.type === "rehype" ? initializer.config : void 0;
19932
- const governance = this.governance ?? (isNoOpEnabledChain(this.chainId) ? { type: "noOp" } : { type: "default" });
19933
- if (governance.type === "launchpad" && !isLaunchpadEnabledChain(this.chainId)) {
20350
+ if (this.devBuy && initializer.type !== "dopplerHookInitializer" && initializer.type !== "dopplerHook" && initializer.type !== "rehype") {
19934
20351
  throw new Error(
19935
- `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`
20352
+ `Dev buys require a DopplerHookInitializer or Rehype initializer; '${initializer.type}' is not supported`
19936
20353
  );
19937
20354
  }
20355
+ const schedule = initializer.type === "scheduled" ? { startTime: initializer.startTime } : void 0;
20356
+ dopplerHook = initializer.type === "rehype" ? initializer.config : void 0;
19938
20357
  return {
19939
20358
  token: this.token,
19940
20359
  sale: this.sale,
@@ -19943,6 +20362,10 @@ var MulticurveBuilder = class _MulticurveBuilder {
19943
20362
  schedule,
19944
20363
  dopplerHook,
19945
20364
  vesting: this.vesting,
20365
+ devBuy: this.devBuy ? {
20366
+ ...this.devBuy,
20367
+ vesting: { ...this.devBuy.vesting }
20368
+ } : void 0,
19946
20369
  governance,
19947
20370
  migration: this.migration,
19948
20371
  integrator: this.integrator ?? ZERO_ADDRESS,
@@ -20331,6 +20754,7 @@ var DopplerSDK = class {
20331
20754
  _factory;
20332
20755
  _quoter;
20333
20756
  _topUpDistributor;
20757
+ _bundler;
20334
20758
  constructor(config) {
20335
20759
  this.publicClient = config.publicClient;
20336
20760
  this.walletClient = config.walletClient;
@@ -20383,6 +20807,34 @@ var DopplerSDK = class {
20383
20807
  resolvedTopUpDistributor
20384
20808
  );
20385
20809
  }
20810
+ /**
20811
+ * Gets the Bundler client configured for this chain.
20812
+ *
20813
+ * Throws when the chain has no Bundler deployment. Use `getBundler(address)`
20814
+ * for custom deployments.
20815
+ */
20816
+ get bundler() {
20817
+ if (!this._bundler) {
20818
+ this._bundler = this.getBundler();
20819
+ }
20820
+ return this._bundler;
20821
+ }
20822
+ /**
20823
+ * Creates a Bundler client using the chain default or an explicit address.
20824
+ *
20825
+ * Read methods work without a wallet client; claims require one.
20826
+ *
20827
+ * @param bundlerAddress Optional custom Bundler deployment.
20828
+ */
20829
+ getBundler(bundlerAddress) {
20830
+ const resolvedBundler = bundlerAddress ?? getAddresses(this.chainId).bundler;
20831
+ if (!resolvedBundler || resolvedBundler === ZERO_ADDRESS) {
20832
+ throw new Error(
20833
+ "Bundler address is not configured on this chain. Pass bundlerAddress to getBundler()."
20834
+ );
20835
+ }
20836
+ return new Bundler(this.publicClient, this.walletClient, resolvedBundler);
20837
+ }
20386
20838
  /**
20387
20839
  * Get a StaticAuction instance for interacting with a static auction pool
20388
20840
  * @param poolAddress The address of the Uniswap V3 pool
@@ -20604,6 +21056,7 @@ var VERSION = "1.0.0";
20604
21056
  exports.ADDRESSES = ADDRESSES;
20605
21057
  exports.AirlockCreateReceiptError = AirlockCreateReceiptError;
20606
21058
  exports.BASIS_POINTS = BASIS_POINTS;
21059
+ exports.Bundler = Bundler;
20607
21060
  exports.CHAIN_IDS = CHAIN_IDS;
20608
21061
  exports.DAY_SECONDS = DAY_SECONDS;
20609
21062
  exports.DEAD_ADDRESS = DEAD_ADDRESS;