@whetstone-research/doppler-sdk 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -1
- package/dist/DopplerSDK.js +19 -19
- package/dist/DopplerSDK.mjs +18 -18
- package/dist/abis/index.d.mts +32 -1
- package/dist/abis/index.d.ts +32 -1
- package/dist/abis/index.js +26 -22
- package/dist/abis/index.mjs +1 -1
- package/dist/addresses.d.mts +1 -0
- package/dist/addresses.d.ts +1 -0
- package/dist/addresses.js +7 -7
- package/dist/addresses.mjs +2 -2
- package/dist/builders/DynamicAuctionBuilder.js +10 -10
- package/dist/builders/DynamicAuctionBuilder.mjs +9 -9
- package/dist/builders/MulticurveBuilder.d.mts +16 -0
- package/dist/builders/MulticurveBuilder.d.ts +16 -0
- package/dist/builders/MulticurveBuilder.js +10 -10
- package/dist/builders/MulticurveBuilder.mjs +9 -9
- package/dist/builders/StaticAuctionBuilder.js +10 -10
- package/dist/builders/StaticAuctionBuilder.mjs +9 -9
- package/dist/builders/index.js +18 -18
- package/dist/builders/index.mjs +11 -11
- package/dist/builders/shared.js +11 -11
- package/dist/builders/shared.mjs +7 -7
- package/dist/{chunk-LOVD3NCN.js → chunk-3MVW6UIW.js} +18 -2
- package/dist/chunk-3MVW6UIW.js.map +1 -0
- package/dist/{chunk-DVAQB7TB.mjs → chunk-3NFSMMBF.mjs} +3 -3
- package/dist/{chunk-DVAQB7TB.mjs.map → chunk-3NFSMMBF.mjs.map} +1 -1
- package/dist/{chunk-PBWOCVDZ.mjs → chunk-4TAAZ6W3.mjs} +248 -51
- package/dist/chunk-4TAAZ6W3.mjs.map +1 -0
- package/dist/{chunk-4DUE547M.js → chunk-6BQY5EPB.js} +4 -2
- package/dist/chunk-6BQY5EPB.js.map +1 -0
- package/dist/{chunk-HVM7KZJM.mjs → chunk-6HFZ6XMV.mjs} +4 -4
- package/dist/{chunk-HVM7KZJM.mjs.map → chunk-6HFZ6XMV.mjs.map} +1 -1
- package/dist/{chunk-EG6O2TUX.js → chunk-7Z2UGWE7.js} +26 -26
- package/dist/{chunk-EG6O2TUX.js.map → chunk-7Z2UGWE7.js.map} +1 -1
- package/dist/{chunk-O2DZH23A.mjs → chunk-CYY5IATT.mjs} +9 -5
- package/dist/chunk-CYY5IATT.mjs.map +1 -0
- package/dist/{chunk-BZKX3J3R.mjs → chunk-E2NF4AQB.mjs} +18 -3
- package/dist/chunk-E2NF4AQB.mjs.map +1 -0
- package/dist/{chunk-B4B7BXLI.js → chunk-E6ACC5S6.js} +24 -24
- package/dist/{chunk-B4B7BXLI.js.map → chunk-E6ACC5S6.js.map} +1 -1
- package/dist/{chunk-K5CV3MIH.mjs → chunk-FQ3PVXZU.mjs} +5 -5
- package/dist/{chunk-K5CV3MIH.mjs.map → chunk-FQ3PVXZU.mjs.map} +1 -1
- package/dist/{chunk-WQKBQRBS.mjs → chunk-GCT3IZ3E.mjs} +12 -12
- package/dist/{chunk-WQKBQRBS.mjs.map → chunk-GCT3IZ3E.mjs.map} +1 -1
- package/dist/{chunk-LDZCTC5Q.mjs → chunk-H5SUGQ2C.mjs} +45 -7
- package/dist/chunk-H5SUGQ2C.mjs.map +1 -0
- package/dist/{chunk-PE47QUJV.mjs → chunk-HH7HQ4HC.mjs} +3 -3
- package/dist/{chunk-PE47QUJV.mjs.map → chunk-HH7HQ4HC.mjs.map} +1 -1
- package/dist/{chunk-LXUF7RNX.mjs → chunk-IWJOPXYN.mjs} +4 -3
- package/dist/chunk-IWJOPXYN.mjs.map +1 -0
- package/dist/{chunk-MBOKYN2Y.js → chunk-K3TEDYUG.js} +20 -20
- package/dist/{chunk-MBOKYN2Y.js.map → chunk-K3TEDYUG.js.map} +1 -1
- package/dist/{chunk-NVVEUALG.mjs → chunk-MH74WYVZ.mjs} +5 -5
- package/dist/{chunk-NVVEUALG.mjs.map → chunk-MH74WYVZ.mjs.map} +1 -1
- package/dist/{chunk-ZVH7VBH5.mjs → chunk-N74ICDSX.mjs} +118 -20
- package/dist/chunk-N74ICDSX.mjs.map +1 -0
- package/dist/{chunk-C7GN6GPG.js → chunk-OROTK4OT.js} +51 -27
- package/dist/chunk-OROTK4OT.js.map +1 -0
- package/dist/{chunk-Z7ZGPSQF.js → chunk-P4BT5GDO.js} +76 -72
- package/dist/chunk-P4BT5GDO.js.map +1 -0
- package/dist/{chunk-YBDWQTUH.mjs → chunk-QFQXHDC7.mjs} +76 -9
- package/dist/chunk-QFQXHDC7.mjs.map +1 -0
- package/dist/{chunk-RKJ2466C.mjs → chunk-QOGBOT2M.mjs} +3 -3
- package/dist/{chunk-RKJ2466C.mjs.map → chunk-QOGBOT2M.mjs.map} +1 -1
- package/dist/{chunk-3ALNQHGL.js → chunk-RLUMYHPI.js} +76 -9
- package/dist/chunk-RLUMYHPI.js.map +1 -0
- package/dist/{chunk-5FJCRKQ6.js → chunk-RXUJ4DUB.js} +28 -28
- package/dist/{chunk-5FJCRKQ6.js.map → chunk-RXUJ4DUB.js.map} +1 -1
- package/dist/{chunk-MGLI4N4B.js → chunk-SAX7P3MH.js} +22 -22
- package/dist/{chunk-MGLI4N4B.js.map → chunk-SAX7P3MH.js.map} +1 -1
- package/dist/{chunk-3ORKVXQL.js → chunk-TJCMFITE.js} +27 -27
- package/dist/{chunk-3ORKVXQL.js.map → chunk-TJCMFITE.js.map} +1 -1
- package/dist/{chunk-TL7U67CX.js → chunk-UIPSHVT4.js} +11 -11
- package/dist/{chunk-TL7U67CX.js.map → chunk-UIPSHVT4.js.map} +1 -1
- package/dist/{chunk-5ZPBKSNS.mjs → chunk-UY4TVYEU.mjs} +3 -3
- package/dist/{chunk-5ZPBKSNS.mjs.map → chunk-UY4TVYEU.mjs.map} +1 -1
- package/dist/{chunk-PQUS2LCD.js → chunk-UZTVXZP3.js} +16 -16
- package/dist/{chunk-PQUS2LCD.js.map → chunk-UZTVXZP3.js.map} +1 -1
- package/dist/{chunk-HMZEYBFO.mjs → chunk-V32Q2S3U.mjs} +4 -4
- package/dist/{chunk-HMZEYBFO.mjs.map → chunk-V32Q2S3U.mjs.map} +1 -1
- package/dist/{chunk-7F4O7NPS.js → chunk-V5GPJ6S2.js} +26 -26
- package/dist/{chunk-7F4O7NPS.js.map → chunk-V5GPJ6S2.js.map} +1 -1
- package/dist/{chunk-DOWDXOTK.mjs → chunk-VGCXJRUV.mjs} +51 -27
- package/dist/chunk-VGCXJRUV.mjs.map +1 -0
- package/dist/{chunk-J32XSN44.js → chunk-WYRM5BAI.js} +344 -147
- package/dist/chunk-WYRM5BAI.js.map +1 -0
- package/dist/{chunk-OUUFER2X.mjs → chunk-X7FRTHUL.mjs} +4 -4
- package/dist/{chunk-OUUFER2X.mjs.map → chunk-X7FRTHUL.mjs.map} +1 -1
- package/dist/{chunk-E54BP2GN.js → chunk-Y6VZD4C6.js} +53 -15
- package/dist/chunk-Y6VZD4C6.js.map +1 -0
- package/dist/{chunk-5MP6AMPB.js → chunk-YFJUIO2A.js} +132 -34
- package/dist/chunk-YFJUIO2A.js.map +1 -0
- package/dist/{chunk-WHQHXYPB.js → chunk-YKRDFXU3.js} +5 -5
- package/dist/{chunk-WHQHXYPB.js.map → chunk-YKRDFXU3.js.map} +1 -1
- package/dist/constants.d.mts +7 -1
- package/dist/constants.d.ts +7 -1
- package/dist/constants.js +51 -47
- package/dist/constants.mjs +1 -1
- package/dist/deployments.generated.d.mts +72 -5
- package/dist/deployments.generated.d.ts +72 -5
- package/dist/deployments.generated.js +2 -2
- package/dist/deployments.generated.mjs +1 -1
- package/dist/entities/DopplerFactory.d.mts +2 -0
- package/dist/entities/DopplerFactory.d.ts +2 -0
- package/dist/entities/DopplerFactory.js +8 -8
- package/dist/entities/DopplerFactory.mjs +7 -7
- package/dist/entities/auction/DynamicAuction.js +5 -5
- package/dist/entities/auction/DynamicAuction.mjs +4 -4
- package/dist/entities/auction/MulticurvePool.d.mts +9 -3
- package/dist/entities/auction/MulticurvePool.d.ts +9 -3
- package/dist/entities/auction/MulticurvePool.js +7 -6
- package/dist/entities/auction/MulticurvePool.mjs +6 -5
- package/dist/entities/auction/StaticAuction.js +5 -5
- package/dist/entities/auction/StaticAuction.mjs +4 -4
- package/dist/entities/auction/index.js +11 -10
- package/dist/entities/auction/index.mjs +8 -7
- package/dist/entities/quoter/Quoter.js +5 -5
- package/dist/entities/quoter/Quoter.mjs +4 -4
- package/dist/entities/quoter/index.js +5 -5
- package/dist/entities/quoter/index.mjs +4 -4
- package/dist/entities/token/derc20/Derc20.js +3 -3
- package/dist/entities/token/derc20/Derc20.mjs +2 -2
- package/dist/entities/token/derc20/index.js +3 -3
- package/dist/entities/token/derc20/index.mjs +2 -2
- package/dist/entities/token/index.js +3 -3
- package/dist/entities/token/index.mjs +2 -2
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +110 -102
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -18
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.mts +32 -1
- package/dist/types.d.ts +32 -1
- package/dist/types.js +8 -8
- package/dist/types.mjs +3 -3
- package/dist/utils/airlock.js +7 -7
- package/dist/utils/airlock.mjs +3 -3
- package/dist/utils/index.js +10 -10
- package/dist/utils/index.mjs +5 -5
- package/dist/utils/tokenAddressMiner.d.mts +7 -0
- package/dist/utils/tokenAddressMiner.d.ts +7 -0
- package/dist/utils/tokenAddressMiner.js +3 -3
- package/dist/utils/tokenAddressMiner.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-3ALNQHGL.js.map +0 -1
- package/dist/chunk-4DUE547M.js.map +0 -1
- package/dist/chunk-5MP6AMPB.js.map +0 -1
- package/dist/chunk-BZKX3J3R.mjs.map +0 -1
- package/dist/chunk-C7GN6GPG.js.map +0 -1
- package/dist/chunk-DOWDXOTK.mjs.map +0 -1
- package/dist/chunk-E54BP2GN.js.map +0 -1
- package/dist/chunk-J32XSN44.js.map +0 -1
- package/dist/chunk-LDZCTC5Q.mjs.map +0 -1
- package/dist/chunk-LOVD3NCN.js.map +0 -1
- package/dist/chunk-LXUF7RNX.mjs.map +0 -1
- package/dist/chunk-O2DZH23A.mjs.map +0 -1
- package/dist/chunk-PBWOCVDZ.mjs.map +0 -1
- package/dist/chunk-YBDWQTUH.mjs.map +0 -1
- package/dist/chunk-Z7ZGPSQF.js.map +0 -1
- package/dist/chunk-ZVH7VBH5.mjs.map +0 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunk7M57PU6V_js = require('./chunk-7M57PU6V.js');
|
|
4
|
-
var
|
|
5
|
-
var
|
|
4
|
+
var chunk6BQY5EPB_js = require('./chunk-6BQY5EPB.js');
|
|
5
|
+
var chunkP4BT5GDO_js = require('./chunk-P4BT5GDO.js');
|
|
6
|
+
var chunk3MVW6UIW_js = require('./chunk-3MVW6UIW.js');
|
|
6
7
|
var viem = require('viem');
|
|
7
8
|
|
|
8
9
|
var MulticurvePool = class {
|
|
@@ -25,7 +26,7 @@ var MulticurvePool = class {
|
|
|
25
26
|
/**
|
|
26
27
|
* Get current pool state from the multicurve initializer
|
|
27
28
|
*
|
|
28
|
-
* Automatically discovers which initializer (standard or
|
|
29
|
+
* Automatically discovers which initializer (standard, scheduled, or decay) contains the pool.
|
|
29
30
|
*/
|
|
30
31
|
async getState() {
|
|
31
32
|
const { state } = await this.findInitializerForPool();
|
|
@@ -35,14 +36,15 @@ var MulticurvePool = class {
|
|
|
35
36
|
* Find which initializer contains this pool and return both the address and state.
|
|
36
37
|
*
|
|
37
38
|
* Tries v4MulticurveInitializer first (more common), then falls back to
|
|
38
|
-
* v4ScheduledMulticurveInitializer
|
|
39
|
+
* v4ScheduledMulticurveInitializer and v4DecayMulticurveInitializer if needed.
|
|
39
40
|
*/
|
|
40
41
|
async findInitializerForPool() {
|
|
41
42
|
const chainId = await this.rpc.getChainId();
|
|
42
|
-
const addresses =
|
|
43
|
+
const addresses = chunkP4BT5GDO_js.getAddresses(chainId);
|
|
43
44
|
const initializersToTry = [
|
|
44
45
|
addresses.v4MulticurveInitializer,
|
|
45
|
-
addresses.v4ScheduledMulticurveInitializer
|
|
46
|
+
addresses.v4ScheduledMulticurveInitializer,
|
|
47
|
+
addresses.v4DecayMulticurveInitializer
|
|
46
48
|
].filter(
|
|
47
49
|
(addr) => addr !== void 0 && addr !== viem.zeroAddress
|
|
48
50
|
);
|
|
@@ -56,7 +58,7 @@ var MulticurvePool = class {
|
|
|
56
58
|
triedInitializers.push(initializerAddress);
|
|
57
59
|
const stateData = await this.rpc.readContract({
|
|
58
60
|
address: initializerAddress,
|
|
59
|
-
abi:
|
|
61
|
+
abi: chunk3MVW6UIW_js.v4MulticurveInitializerAbi,
|
|
60
62
|
functionName: "getState",
|
|
61
63
|
args: [this.tokenAddress]
|
|
62
64
|
});
|
|
@@ -93,13 +95,13 @@ var MulticurvePool = class {
|
|
|
93
95
|
throw new Error("Wallet client required to collect fees");
|
|
94
96
|
}
|
|
95
97
|
const chainId = await this.rpc.getChainId();
|
|
96
|
-
const addresses =
|
|
98
|
+
const addresses = chunkP4BT5GDO_js.getAddresses(chainId);
|
|
97
99
|
const { initializerAddress, state } = await this.findInitializerForPool();
|
|
98
100
|
if (state.status === 2 /* Locked */) {
|
|
99
101
|
const poolId = chunk7M57PU6V_js.computePoolId(state.poolKey);
|
|
100
102
|
return this.collectFeesFromContract(
|
|
101
103
|
initializerAddress,
|
|
102
|
-
|
|
104
|
+
chunk3MVW6UIW_js.v4MulticurveInitializerAbi,
|
|
103
105
|
poolId
|
|
104
106
|
);
|
|
105
107
|
}
|
|
@@ -111,7 +113,7 @@ var MulticurvePool = class {
|
|
|
111
113
|
}
|
|
112
114
|
const assetData = await this.rpc.readContract({
|
|
113
115
|
address: addresses.v4Migrator,
|
|
114
|
-
abi:
|
|
116
|
+
abi: chunk3MVW6UIW_js.v4MulticurveMigratorAbi,
|
|
115
117
|
functionName: "getAssetData",
|
|
116
118
|
args: [state.poolKey.currency0, state.poolKey.currency1]
|
|
117
119
|
});
|
|
@@ -131,7 +133,7 @@ var MulticurvePool = class {
|
|
|
131
133
|
);
|
|
132
134
|
const streamData = await this.rpc.readContract({
|
|
133
135
|
address: lockerAddress,
|
|
134
|
-
abi:
|
|
136
|
+
abi: chunk3MVW6UIW_js.streamableFeesLockerAbi,
|
|
135
137
|
functionName: "streams",
|
|
136
138
|
args: [poolId]
|
|
137
139
|
});
|
|
@@ -143,7 +145,7 @@ var MulticurvePool = class {
|
|
|
143
145
|
}
|
|
144
146
|
return this.collectFeesFromContract(
|
|
145
147
|
lockerAddress,
|
|
146
|
-
|
|
148
|
+
chunk3MVW6UIW_js.streamableFeesLockerAbi,
|
|
147
149
|
poolId
|
|
148
150
|
);
|
|
149
151
|
}
|
|
@@ -156,6 +158,42 @@ var MulticurvePool = class {
|
|
|
156
158
|
const state = await this.getState();
|
|
157
159
|
return state.numeraire;
|
|
158
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Get the decay fee schedule for dynamic-fee multicurve pools.
|
|
163
|
+
*
|
|
164
|
+
* Returns `null` when the pool is not using dynamic fees.
|
|
165
|
+
*/
|
|
166
|
+
async getFeeSchedule() {
|
|
167
|
+
const { state } = await this.findInitializerForPool();
|
|
168
|
+
if (state.poolKey.fee !== chunk6BQY5EPB_js.DYNAMIC_FEE_FLAG) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const poolId = chunk7M57PU6V_js.computePoolId(state.poolKey);
|
|
172
|
+
try {
|
|
173
|
+
const scheduleData = await this.rpc.readContract({
|
|
174
|
+
address: state.poolKey.hooks,
|
|
175
|
+
abi: chunk3MVW6UIW_js.decayMulticurveInitializerHookAbi,
|
|
176
|
+
functionName: "getFeeScheduleOf",
|
|
177
|
+
args: [poolId]
|
|
178
|
+
});
|
|
179
|
+
const scheduleStruct = scheduleData;
|
|
180
|
+
return {
|
|
181
|
+
startingTime: Number(
|
|
182
|
+
scheduleStruct.startingTime ?? scheduleStruct[0] ?? 0
|
|
183
|
+
),
|
|
184
|
+
startFee: Number(scheduleStruct.startFee ?? scheduleStruct[1] ?? 0),
|
|
185
|
+
endFee: Number(scheduleStruct.endFee ?? scheduleStruct[2] ?? 0),
|
|
186
|
+
lastFee: Number(scheduleStruct.lastFee ?? scheduleStruct[3] ?? 0),
|
|
187
|
+
durationSeconds: Number(
|
|
188
|
+
scheduleStruct.durationSeconds ?? scheduleStruct[4] ?? 0
|
|
189
|
+
)
|
|
190
|
+
};
|
|
191
|
+
} catch {
|
|
192
|
+
throw new Error(
|
|
193
|
+
`Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
159
197
|
parsePoolKey(rawPoolKey) {
|
|
160
198
|
const poolKeyStruct = rawPoolKey;
|
|
161
199
|
return {
|
|
@@ -172,7 +210,7 @@ var MulticurvePool = class {
|
|
|
172
210
|
}
|
|
173
211
|
const lockerAddress = await this.rpc.readContract({
|
|
174
212
|
address: migratorAddress,
|
|
175
|
-
abi:
|
|
213
|
+
abi: chunk3MVW6UIW_js.v4MulticurveMigratorAbi,
|
|
176
214
|
functionName: "locker",
|
|
177
215
|
args: []
|
|
178
216
|
});
|
|
@@ -198,5 +236,5 @@ var MulticurvePool = class {
|
|
|
198
236
|
};
|
|
199
237
|
|
|
200
238
|
exports.MulticurvePool = MulticurvePool;
|
|
201
|
-
//# sourceMappingURL=chunk-
|
|
202
|
-
//# sourceMappingURL=chunk-
|
|
239
|
+
//# sourceMappingURL=chunk-Y6VZD4C6.js.map
|
|
240
|
+
//# sourceMappingURL=chunk-Y6VZD4C6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/entities/auction/MulticurvePool.ts"],"names":["getAddresses","zeroAddress","v4MulticurveInitializerAbi","computePoolId","v4MulticurveMigratorAbi","streamableFeesLockerAbi","DYNAMIC_FEE_FLAG","decayMulticurveInitializerHookAbi"],"mappings":";;;;;;;;AA8CO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,IAAY,GAAA,GAAoB;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,WAAA,CACE,MAAA,EACA,YAAA,EACA,YAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAyC;AAC7C,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAK,sBAAA,EAAuB;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,sBAAA,GAA8D;AAC1E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAW;AAC1C,IAAA,MAAM,SAAA,GAAYA,8BAAa,OAA2B,CAAA;AAG1D,IAAA,MAAM,iBAAA,GAA+B;AAAA,MACnC,SAAA,CAAU,uBAAA;AAAA,MACV,SAAA,CAAU,gCAAA;AAAA,MACV,SAAA,CAAU;AAAA,KACZ,CAAE,MAAA;AAAA,MACA,CAAC,IAAA,KAA0B,IAAA,KAAS,MAAA,IAAa,IAAA,KAASC;AAAA,KAC5D;AAEA,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,oBAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,sBAAsB,iBAAA,EAAmB;AAClD,MAAA,iBAAA,CAAkB,KAAK,kBAAkB,CAAA;AAEzC,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC5C,OAAA,EAAS,kBAAA;AAAA,QACT,GAAA,EAAKC,2CAAA;AAAA,QACL,YAAA,EAAc,UAAA;AAAA,QACd,IAAA,EAAM,CAAC,IAAA,CAAK,YAAY;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,CAAC,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA,GAAI,SAAA;AAajD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAI5C,MAAA,IAAI,OAAA,CAAQ,KAAA,KAAUD,gBAAA,IAAe,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC9D,QAAA,MAAM,KAAA,GAA6B;AAAA,UACjC,OAAO,IAAA,CAAK,YAAA;AAAA,UACZ,SAAA;AAAA,UACA,KAAK,OAAA,CAAQ,GAAA;AAAA,UACb,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,MAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA,EAAS,OAAO,OAAO;AAAA,SACzB;AACA,QAAA,OAAO,EAAE,oBAAoB,KAAA,EAAM;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4BAA4B,IAAA,CAAK,YAAY,yBACpB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,WAAA,GAIH;AACD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAW;AAC1C,IAAA,MAAM,SAAA,GAAYD,8BAAa,OAA2B,CAAA;AAG1D,IAAA,MAAM,EAAE,kBAAA,EAAoB,KAAA,EAAM,GAAI,MAAM,KAAK,sBAAA,EAAuB;AAExE,IAAA,IAAI,MAAM,MAAA,KAAA,CAAA,eAAsC;AAC9C,MAAA,MAAM,MAAA,GAASG,8BAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,QACV,kBAAA;AAAA,QACAD,2CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,MAAA,KAAA,CAAA,eAAsC;AAC9C,MAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AACzB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC5C,SAAS,SAAA,CAAU,UAAA;AAAA,QACnB,GAAA,EAAKE,wCAAA;AAAA,QACL,YAAA,EAAc,cAAA;AAAA,QACd,MAAM,CAAC,KAAA,CAAM,QAAQ,SAAA,EAAW,KAAA,CAAM,QAAQ,SAAS;AAAA,OACxD,CAAA;AAED,MAAA,MAAM,kBAAkB,IAAA,CAAK,YAAA;AAAA,QAC1B,SAAA,CAAkB,OAAA,IAAY,SAAA,CAAkB,CAAC;AAAA,OACpD;AACA,MAAA,MAAM,MAAA,GAASD,+BAAc,eAAe,CAAA;AAE5C,MAAA,MAAM,gBACH,SAAA,CAAkB,aAAA,IAAkB,SAAA,CAAkB,CAAC,KAAK,EAAC;AAChE,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,IAAK,aAAA,CAAc,WAAW,CAAA,EAAG;AAC/D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,oBAAA;AAAA,QAC/B,SAAA,CAAU,UAAA;AAAA,QACV,SAAA,CAAU;AAAA,OACZ;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC7C,OAAA,EAAS,aAAA;AAAA,QACT,GAAA,EAAKE,wCAAA;AAAA,QACL,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAM;AAAA,OACd,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,MAAA;AAAA,QACf,UAAA,CAAmB,SAAA,IAAc,UAAA,CAAmB,CAAC,CAAA,IAAK;AAAA,OAC7D;AACA,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AAEA,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,QACV,aAAA;AAAA,QACAA,wCAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAAwC;AAC5C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,EAAS;AAClC,IAAA,OAAO,KAAA,CAAM,SAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,GAA6D;AACjE,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,KAAK,sBAAA,EAAuB;AACpD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,KAAQC,iCAAA,EAAkB;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAASH,8BAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,QAC/C,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,QACvB,GAAA,EAAKI,kDAAA;AAAA,QACL,YAAA,EAAc,kBAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAM;AAAA,OACd,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,YAAA;AACvB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,MAAA;AAAA,UACZ,cAAA,CAAe,YAAA,IAAgB,cAAA,CAAe,CAAC,CAAA,IAAK;AAAA,SACtD;AAAA,QACA,UAAU,MAAA,CAAO,cAAA,CAAe,YAAY,cAAA,CAAe,CAAC,KAAK,CAAC,CAAA;AAAA,QAClE,QAAQ,MAAA,CAAO,cAAA,CAAe,UAAU,cAAA,CAAe,CAAC,KAAK,CAAC,CAAA;AAAA,QAC9D,SAAS,MAAA,CAAO,cAAA,CAAe,WAAW,cAAA,CAAe,CAAC,KAAK,CAAC,CAAA;AAAA,QAChE,eAAA,EAAiB,MAAA;AAAA,UACf,cAAA,CAAe,eAAA,IAAmB,cAAA,CAAe,CAAC,CAAA,IAAK;AAAA;AACzD,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,2BAAA,EAA8B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,yCAAA;AAAA,OACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,UAAA,EAAgC;AACnD,IAAA,MAAM,aAAA,GAAgB,UAAA;AACtB,IAAA,OAAO;AAAA,MACL,SAAA,EAAY,aAAA,CAAc,SAAA,IAAa,aAAA,CAAc,CAAC,CAAA;AAAA,MACtD,SAAA,EAAY,aAAA,CAAc,SAAA,IAAa,aAAA,CAAc,CAAC,CAAA;AAAA,MACtD,KAAK,MAAA,CAAO,aAAA,CAAc,GAAA,IAAO,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,MACjD,aAAa,MAAA,CAAO,aAAA,CAAc,WAAA,IAAe,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,MACjE,KAAA,EAAQ,aAAA,CAAc,KAAA,IAAS,aAAA,CAAc,CAAC;AAAA,KAChD;AAAA,EACF;AAAA,EAEA,MAAc,oBAAA,CACZ,eAAA,EACA,gBAAA,EACkB;AAClB,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa;AAAA,MAChD,OAAA,EAAS,eAAA;AAAA,MACT,GAAA,EAAKH,wCAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,MAAM;AAAC,KACR,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEA,MAAc,uBAAA,CACZ,eAAA,EACA,GAAA,EACA,MAAA,EACkE;AAClE,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAAM,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MAC1D,OAAA,EAAS,eAAA;AAAA,MACT,GAAA;AAAA,MACA,YAAA,EAAc,aAAA;AAAA,MACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,OAAA,EAAS,KAAK,YAAA,CAAc;AAAA,KAC7B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAc,cAAc,OAAO,CAAA;AAE3D,IAAA,MAAM,KAAK,GAAA,CAAI,yBAAA,CAA0B,EAAE,IAAA,EAAM,aAAA,EAAe,GAAG,CAAA;AAEnE,IAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAA;AAEvB,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AACF","file":"chunk-Y6VZD4C6.js","sourcesContent":["import {\n type Address,\n type PublicClient,\n type WalletClient,\n type Hash,\n type Hex,\n zeroAddress,\n} from 'viem';\nimport {\n LockablePoolStatus,\n type MulticurveDecayFeeSchedule,\n type MulticurvePoolState,\n type SupportedPublicClient,\n type V4PoolKey,\n} from '../../types';\nimport {\n decayMulticurveInitializerHookAbi,\n v4MulticurveInitializerAbi,\n v4MulticurveMigratorAbi,\n streamableFeesLockerAbi,\n} from '../../abis';\nimport { getAddresses } from '../../addresses';\nimport type { SupportedChainId } from '../../addresses';\nimport { DYNAMIC_FEE_FLAG } from '../../constants';\nimport { computePoolId } from '../../utils/poolKey';\n\n/** Result from finding which initializer contains the pool */\ninterface InitializerDiscoveryResult {\n initializerAddress: Address;\n state: MulticurvePoolState;\n}\n\n/**\n * MulticurvePool class for interacting with V4 multicurve pools\n *\n * Multicurve pools use the V4 multicurve initializer which supports:\n * - Multiple bonding curves with different price ranges\n * - Fee collection for configured beneficiaries\n * - No-migration lockable liquidity\n *\n * Note: V4 pools don't have their own contract addresses. The token address\n * is used as the lookup key to retrieve pool state from the initializer contract.\n *\n * Terminology: The contracts call the created token \"asset\" (paired against \"numeraire\", e.g., WETH).\n * We use \"tokenAddress\" in the SDK for consistency.\n */\nexport class MulticurvePool {\n private client: SupportedPublicClient;\n private walletClient?: WalletClient;\n private tokenAddress: Address;\n private get rpc(): PublicClient {\n return this.client as PublicClient;\n }\n\n constructor(\n client: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n tokenAddress: Address,\n ) {\n this.client = client;\n this.walletClient = walletClient;\n this.tokenAddress = tokenAddress;\n }\n\n /**\n * Get the token address for this pool\n * This is also the lookup key used to retrieve pool state from the initializer\n * (Called \"asset\" in the contracts, but we use \"tokenAddress\" for SDK consistency)\n */\n getTokenAddress(): Address {\n return this.tokenAddress;\n }\n\n /**\n * Get current pool state from the multicurve initializer\n *\n * Automatically discovers which initializer (standard, scheduled, or decay) contains the pool.\n */\n async getState(): Promise<MulticurvePoolState> {\n const { state } = await this.findInitializerForPool();\n return state;\n }\n\n /**\n * Find which initializer contains this pool and return both the address and state.\n *\n * Tries v4MulticurveInitializer first (more common), then falls back to\n * v4ScheduledMulticurveInitializer and v4DecayMulticurveInitializer if needed.\n */\n private async findInitializerForPool(): Promise<InitializerDiscoveryResult> {\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Build list of initializers to try, preferring non-scheduled (more common)\n const initializersToTry: Address[] = [\n addresses.v4MulticurveInitializer,\n addresses.v4ScheduledMulticurveInitializer,\n addresses.v4DecayMulticurveInitializer,\n ].filter(\n (addr): addr is Address => addr !== undefined && addr !== zeroAddress,\n );\n\n if (initializersToTry.length === 0) {\n throw new Error(\n 'No V4 multicurve initializer addresses configured for this chain',\n );\n }\n\n const triedInitializers: Address[] = [];\n\n for (const initializerAddress of initializersToTry) {\n triedInitializers.push(initializerAddress);\n\n const stateData = await this.rpc.readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'getState',\n args: [this.tokenAddress],\n });\n\n // Parse the returned tuple into a strongly typed PoolKey\n const [numeraire, status, rawPoolKey, farTick] = stateData as readonly [\n Address,\n number,\n {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n } & readonly [Address, Address, number, number, Address],\n number,\n ];\n\n const poolKey = this.parsePoolKey(rawPoolKey);\n\n // Check if pool exists in this initializer\n // A non-existent pool will have zeroed hooks and tickSpacing\n if (poolKey.hooks !== zeroAddress && poolKey.tickSpacing !== 0) {\n const state: MulticurvePoolState = {\n asset: this.tokenAddress,\n numeraire,\n fee: poolKey.fee,\n tickSpacing: poolKey.tickSpacing,\n status,\n poolKey,\n farTick: Number(farTick),\n };\n return { initializerAddress, state };\n }\n }\n\n // Pool not found in any initializer\n throw new Error(\n `Pool not found for token ${this.tokenAddress}. ` +\n `Tried initializers: ${triedInitializers.join(', ')}`,\n );\n }\n\n /**\n * Collect fees from the pool and distribute to beneficiaries\n *\n * This function can be called by any beneficiary to trigger fee collection\n * and distribution. Fees are automatically distributed according to the\n * configured beneficiary shares.\n *\n * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash\n */\n async collectFees(): Promise<{\n fees0: bigint;\n fees1: bigint;\n transactionHash: Hash;\n }> {\n if (!this.walletClient) {\n throw new Error('Wallet client required to collect fees');\n }\n\n const chainId = await this.rpc.getChainId();\n const addresses = getAddresses(chainId as SupportedChainId);\n\n // Discover which initializer has this pool and get state in one call\n const { initializerAddress, state } = await this.findInitializerForPool();\n\n if (state.status === LockablePoolStatus.Locked) {\n const poolId = computePoolId(state.poolKey);\n return this.collectFeesFromContract(\n initializerAddress,\n v4MulticurveInitializerAbi,\n poolId,\n );\n }\n\n if (state.status === LockablePoolStatus.Exited) {\n if (!addresses.v4Migrator) {\n throw new Error(\n 'V4 multicurve migrator address not configured for this chain',\n );\n }\n\n const assetData = await this.rpc.readContract({\n address: addresses.v4Migrator,\n abi: v4MulticurveMigratorAbi,\n functionName: 'getAssetData',\n args: [state.poolKey.currency0, state.poolKey.currency1],\n });\n\n const migratorPoolKey = this.parsePoolKey(\n (assetData as any).poolKey ?? (assetData as any)[1],\n );\n const poolId = computePoolId(migratorPoolKey);\n\n const beneficiaries =\n (assetData as any).beneficiaries ?? (assetData as any)[4] ?? [];\n if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {\n throw new Error(\n 'Migrated multicurve pool has no beneficiaries configured',\n );\n }\n\n const lockerAddress = await this.resolveLockerAddress(\n addresses.v4Migrator,\n addresses.streamableFeesLocker,\n );\n\n const streamData = await this.rpc.readContract({\n address: lockerAddress,\n abi: streamableFeesLockerAbi,\n functionName: 'streams',\n args: [poolId],\n });\n\n const startDate = Number(\n (streamData as any).startDate ?? (streamData as any)[2] ?? 0,\n );\n if (startDate === 0) {\n throw new Error('Migrated multicurve stream not initialized');\n }\n\n return this.collectFeesFromContract(\n lockerAddress,\n streamableFeesLockerAbi,\n poolId,\n );\n }\n\n throw new Error('Multicurve pool is not locked or migrated');\n }\n\n /**\n * Get the numeraire address for this pool\n */\n async getNumeraireAddress(): Promise<Address> {\n const state = await this.getState();\n return state.numeraire;\n }\n\n /**\n * Get the decay fee schedule for dynamic-fee multicurve pools.\n *\n * Returns `null` when the pool is not using dynamic fees.\n */\n async getFeeSchedule(): Promise<MulticurveDecayFeeSchedule | null> {\n const { state } = await this.findInitializerForPool();\n if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {\n return null;\n }\n\n const poolId = computePoolId(state.poolKey);\n try {\n const scheduleData = await this.rpc.readContract({\n address: state.poolKey.hooks,\n abi: decayMulticurveInitializerHookAbi,\n functionName: 'getFeeScheduleOf',\n args: [poolId],\n });\n\n const scheduleStruct = scheduleData as any;\n return {\n startingTime: Number(\n scheduleStruct.startingTime ?? scheduleStruct[0] ?? 0,\n ),\n startFee: Number(scheduleStruct.startFee ?? scheduleStruct[1] ?? 0),\n endFee: Number(scheduleStruct.endFee ?? scheduleStruct[2] ?? 0),\n lastFee: Number(scheduleStruct.lastFee ?? scheduleStruct[3] ?? 0),\n durationSeconds: Number(\n scheduleStruct.durationSeconds ?? scheduleStruct[4] ?? 0,\n ),\n };\n } catch {\n throw new Error(\n `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,\n );\n }\n }\n\n private parsePoolKey(rawPoolKey: unknown): V4PoolKey {\n const poolKeyStruct = rawPoolKey as any;\n return {\n currency0: (poolKeyStruct.currency0 ?? poolKeyStruct[0]) as Address,\n currency1: (poolKeyStruct.currency1 ?? poolKeyStruct[1]) as Address,\n fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),\n tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),\n hooks: (poolKeyStruct.hooks ?? poolKeyStruct[4]) as Address,\n };\n }\n\n private async resolveLockerAddress(\n migratorAddress: Address,\n configuredLocker?: Address,\n ): Promise<Address> {\n if (configuredLocker) {\n return configuredLocker;\n }\n\n const lockerAddress = await this.rpc.readContract({\n address: migratorAddress,\n abi: v4MulticurveMigratorAbi,\n functionName: 'locker',\n args: [],\n });\n\n return lockerAddress as Address;\n }\n\n private async collectFeesFromContract(\n contractAddress: Address,\n abi: typeof v4MulticurveInitializerAbi | typeof streamableFeesLockerAbi,\n poolId: Hex,\n ): Promise<{ fees0: bigint; fees1: bigint; transactionHash: Hash }> {\n const { request, result } = await this.rpc.simulateContract({\n address: contractAddress,\n abi,\n functionName: 'collectFees',\n args: [poolId],\n account: this.walletClient!.account,\n });\n\n const hash = await this.walletClient!.writeContract(request);\n\n await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });\n\n const [fees0, fees1] = result as readonly [bigint, bigint];\n\n return {\n fees0,\n fees1,\n transactionHash: hash,\n };\n }\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkSAX7P3MH_js = require('./chunk-SAX7P3MH.js');
|
|
4
4
|
var chunkN33R22A2_js = require('./chunk-N33R22A2.js');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var chunk6BQY5EPB_js = require('./chunk-6BQY5EPB.js');
|
|
6
|
+
var chunkUIPSHVT4_js = require('./chunk-UIPSHVT4.js');
|
|
7
7
|
|
|
8
8
|
// src/builders/MulticurveBuilder.ts
|
|
9
9
|
var MulticurveBuilder = class _MulticurveBuilder {
|
|
@@ -28,7 +28,7 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
28
28
|
name: params.name,
|
|
29
29
|
symbol: params.symbol,
|
|
30
30
|
tokenURI: params.tokenURI,
|
|
31
|
-
yearlyMintRate: params.yearlyMintRate ??
|
|
31
|
+
yearlyMintRate: params.yearlyMintRate ?? chunk6BQY5EPB_js.DEFAULT_V3_YEARLY_MINT_RATE
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
return this;
|
|
@@ -66,7 +66,7 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
66
66
|
"Cannot use withMarketCapPresets() after withCurves(). Use withCurves() for market cap-based configuration, or withMarketCapPresets() for preset-based configuration."
|
|
67
67
|
);
|
|
68
68
|
}
|
|
69
|
-
const { fee, tickSpacing, curves } =
|
|
69
|
+
const { fee, tickSpacing, curves } = chunkSAX7P3MH_js.buildCurvesFromPresets({
|
|
70
70
|
fee: params?.fee,
|
|
71
71
|
tickSpacing: params?.tickSpacing,
|
|
72
72
|
presets: params?.presets,
|
|
@@ -143,14 +143,14 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
143
143
|
const sortedCurves = this.sortCurvesByMarketCap(params.curves);
|
|
144
144
|
this.validateCurveContiguity(sortedCurves);
|
|
145
145
|
const totalShares = sortedCurves.reduce((sum, c) => sum + c.shares, 0n);
|
|
146
|
-
if (totalShares !==
|
|
146
|
+
if (totalShares !== chunk6BQY5EPB_js.WAD) {
|
|
147
147
|
throw new Error(
|
|
148
|
-
`Total curve shares must equal 100% (${
|
|
148
|
+
`Total curve shares must equal 100% (${chunk6BQY5EPB_js.WAD}). Got ${totalShares} (${Number(totalShares * 10000n / chunk6BQY5EPB_js.WAD) / 100}%)`
|
|
149
149
|
);
|
|
150
150
|
}
|
|
151
|
-
if (params.fee !== void 0 && params.fee >
|
|
151
|
+
if (params.fee !== void 0 && params.fee > chunk6BQY5EPB_js.V4_MAX_FEE) {
|
|
152
152
|
throw new Error(
|
|
153
|
-
`Fee ${params.fee} exceeds maximum allowed for V4 pools (${
|
|
153
|
+
`Fee ${params.fee} exceeds maximum allowed for V4 pools (${chunk6BQY5EPB_js.V4_MAX_FEE} = 10%). Use a fee between 0 and ${chunk6BQY5EPB_js.V4_MAX_FEE}.`
|
|
154
154
|
);
|
|
155
155
|
}
|
|
156
156
|
this.numerairePrice = params.numerairePrice;
|
|
@@ -241,10 +241,11 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
241
241
|
* ```
|
|
242
242
|
*/
|
|
243
243
|
withRehypeDopplerHook(params) {
|
|
244
|
+
this.assertCanSetInitializer("rehype");
|
|
244
245
|
const totalDistribution = params.assetBuybackPercentWad + params.numeraireBuybackPercentWad + params.beneficiaryPercentWad + params.lpPercentWad;
|
|
245
|
-
if (totalDistribution !==
|
|
246
|
+
if (totalDistribution !== chunk6BQY5EPB_js.WAD) {
|
|
246
247
|
throw new Error(
|
|
247
|
-
`DopplerHook fee distribution must sum to ${
|
|
248
|
+
`DopplerHook fee distribution must sum to ${chunk6BQY5EPB_js.WAD} (100%), but got ${totalDistribution}`
|
|
248
249
|
);
|
|
249
250
|
}
|
|
250
251
|
if (params.graduationMarketCap !== void 0 && params.farTick !== void 0) {
|
|
@@ -253,6 +254,7 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
253
254
|
);
|
|
254
255
|
}
|
|
255
256
|
this.dopplerHook = params;
|
|
257
|
+
this.initializer = { type: "rehype", config: params };
|
|
256
258
|
return this;
|
|
257
259
|
}
|
|
258
260
|
withVesting(params) {
|
|
@@ -268,35 +270,100 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
268
270
|
};
|
|
269
271
|
return this;
|
|
270
272
|
}
|
|
271
|
-
|
|
272
|
-
if (!params) {
|
|
273
|
-
this.schedule = void 0;
|
|
274
|
-
return this;
|
|
275
|
-
}
|
|
273
|
+
parseStartTimeSeconds(value, label) {
|
|
276
274
|
let startTimeSeconds;
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
startTimeSeconds = Number(startTime);
|
|
275
|
+
if (value instanceof Date) {
|
|
276
|
+
startTimeSeconds = Math.floor(value.getTime() / 1e3);
|
|
277
|
+
} else if (typeof value === "bigint") {
|
|
278
|
+
startTimeSeconds = Number(value);
|
|
282
279
|
} else {
|
|
283
|
-
startTimeSeconds = Number(
|
|
280
|
+
startTimeSeconds = Number(value);
|
|
284
281
|
}
|
|
285
282
|
if (!Number.isFinite(startTimeSeconds) || !Number.isInteger(startTimeSeconds)) {
|
|
286
283
|
throw new Error(
|
|
287
|
-
|
|
284
|
+
`${label} must be an integer number of seconds since Unix epoch`
|
|
288
285
|
);
|
|
289
286
|
}
|
|
290
287
|
if (startTimeSeconds < 0) {
|
|
291
|
-
throw new Error(
|
|
288
|
+
throw new Error(`${label} cannot be negative`);
|
|
292
289
|
}
|
|
293
290
|
const UINT32_MAX = 4294967295;
|
|
294
291
|
if (startTimeSeconds > UINT32_MAX) {
|
|
295
292
|
throw new Error(
|
|
296
|
-
|
|
293
|
+
`${label} must fit within uint32 (seconds since Unix epoch up to year 2106)`
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
return startTimeSeconds;
|
|
297
|
+
}
|
|
298
|
+
assertCanSetInitializer(nextType) {
|
|
299
|
+
const currentType = this.initializer?.type;
|
|
300
|
+
if (currentType === void 0 || currentType === "standard" || currentType === nextType) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
throw new Error(
|
|
304
|
+
`Cannot set multicurve initializer to '${nextType}' because it is already configured as '${currentType}'`
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Configure decay multicurve initializer settings.
|
|
309
|
+
*
|
|
310
|
+
* The pool's terminal fee is always taken from `poolConfig().fee`.
|
|
311
|
+
* `startFee` must be greater than or equal to that terminal fee.
|
|
312
|
+
* `startTime` is optional and defaults to `0` when omitted.
|
|
313
|
+
*/
|
|
314
|
+
withDecay(params) {
|
|
315
|
+
if (!params) {
|
|
316
|
+
if (this.initializer?.type === "decay") {
|
|
317
|
+
this.initializer = { type: "standard" };
|
|
318
|
+
}
|
|
319
|
+
return this;
|
|
320
|
+
}
|
|
321
|
+
this.assertCanSetInitializer("decay");
|
|
322
|
+
const startTime = params.startTime === void 0 ? 0 : this.parseStartTimeSeconds(params.startTime, "Decay startTime");
|
|
323
|
+
const startFee = Number(params.startFee);
|
|
324
|
+
const durationSeconds = Number(params.durationSeconds);
|
|
325
|
+
if (!Number.isFinite(startFee) || !Number.isInteger(startFee)) {
|
|
326
|
+
throw new Error("Decay startFee must be an integer");
|
|
327
|
+
}
|
|
328
|
+
if (startFee < 0 || startFee > chunk6BQY5EPB_js.DECAY_MAX_START_FEE) {
|
|
329
|
+
throw new Error(
|
|
330
|
+
`Decay startFee must be between 0 and ${chunk6BQY5EPB_js.DECAY_MAX_START_FEE} (80%)`
|
|
297
331
|
);
|
|
298
332
|
}
|
|
333
|
+
if (!Number.isFinite(durationSeconds) || !Number.isInteger(durationSeconds)) {
|
|
334
|
+
throw new Error("Decay durationSeconds must be an integer");
|
|
335
|
+
}
|
|
336
|
+
if (durationSeconds < 0) {
|
|
337
|
+
throw new Error("Decay durationSeconds cannot be negative");
|
|
338
|
+
}
|
|
339
|
+
const UINT32_MAX = 4294967295;
|
|
340
|
+
if (durationSeconds > UINT32_MAX) {
|
|
341
|
+
throw new Error("Decay durationSeconds must fit within uint32");
|
|
342
|
+
}
|
|
343
|
+
this.schedule = void 0;
|
|
344
|
+
this.initializer = {
|
|
345
|
+
type: "decay",
|
|
346
|
+
startTime,
|
|
347
|
+
startFee,
|
|
348
|
+
durationSeconds
|
|
349
|
+
};
|
|
350
|
+
return this;
|
|
351
|
+
}
|
|
352
|
+
withSchedule(params) {
|
|
353
|
+
if (!params) {
|
|
354
|
+
if (this.initializer?.type === "scheduled") {
|
|
355
|
+
this.initializer = { type: "standard" };
|
|
356
|
+
}
|
|
357
|
+
this.schedule = void 0;
|
|
358
|
+
return this;
|
|
359
|
+
}
|
|
360
|
+
this.assertCanSetInitializer("scheduled");
|
|
361
|
+
const startTimeSeconds = this.parseStartTimeSeconds(
|
|
362
|
+
params.startTime,
|
|
363
|
+
"Schedule startTime"
|
|
364
|
+
);
|
|
299
365
|
this.schedule = { startTime: startTimeSeconds };
|
|
366
|
+
this.initializer = { type: "scheduled", startTime: startTimeSeconds };
|
|
300
367
|
return this;
|
|
301
368
|
}
|
|
302
369
|
withGovernance(params) {
|
|
@@ -312,7 +379,7 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
312
379
|
return this;
|
|
313
380
|
}
|
|
314
381
|
withIntegrator(address) {
|
|
315
|
-
this.integrator = address ??
|
|
382
|
+
this.integrator = address ?? chunk6BQY5EPB_js.ZERO_ADDRESS;
|
|
316
383
|
return this;
|
|
317
384
|
}
|
|
318
385
|
withGasLimit(gas) {
|
|
@@ -338,6 +405,9 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
338
405
|
withV4ScheduledMulticurveInitializer(address) {
|
|
339
406
|
return this.overrideModule("v4ScheduledMulticurveInitializer", address);
|
|
340
407
|
}
|
|
408
|
+
withV4DecayMulticurveInitializer(address) {
|
|
409
|
+
return this.overrideModule("v4DecayMulticurveInitializer", address);
|
|
410
|
+
}
|
|
341
411
|
withGovernanceFactory(address) {
|
|
342
412
|
return this.overrideModule("governanceFactory", address);
|
|
343
413
|
}
|
|
@@ -366,8 +436,8 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
366
436
|
"tokenSupply must be provided (either via saleConfig() or withCurves() params)"
|
|
367
437
|
);
|
|
368
438
|
}
|
|
369
|
-
const fee = config.fee ??
|
|
370
|
-
const tickSpacing = config.tickSpacing ??
|
|
439
|
+
const fee = config.fee ?? chunk6BQY5EPB_js.FEE_TIERS.MEDIUM;
|
|
440
|
+
const tickSpacing = config.tickSpacing ?? chunk6BQY5EPB_js.TICK_SPACINGS[fee];
|
|
371
441
|
if (tickSpacing === void 0) {
|
|
372
442
|
throw new Error(
|
|
373
443
|
`Custom fee ${fee} requires explicit tickSpacing. Standard fees (100, 500, 3000, 10000) auto-derive tickSpacing.`
|
|
@@ -466,8 +536,35 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
466
536
|
}
|
|
467
537
|
dopplerHook = { ...dopplerHook, farTick };
|
|
468
538
|
}
|
|
469
|
-
const
|
|
470
|
-
if (
|
|
539
|
+
const initializer = this.initializer ?? (dopplerHook ? { type: "rehype", config: dopplerHook } : this.schedule ? { type: "scheduled", startTime: this.schedule.startTime } : { type: "standard" });
|
|
540
|
+
if (initializer.type === "scheduled" && dopplerHook) {
|
|
541
|
+
throw new Error(
|
|
542
|
+
"Cannot combine scheduled multicurve with rehype initializer. Use exactly one initializer mode."
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
if (initializer.type === "decay" && dopplerHook) {
|
|
546
|
+
throw new Error(
|
|
547
|
+
"Cannot combine decay multicurve with rehype initializer. Use exactly one initializer mode."
|
|
548
|
+
);
|
|
549
|
+
}
|
|
550
|
+
if (initializer.type === "decay") {
|
|
551
|
+
const startFee = Number(initializer.startFee);
|
|
552
|
+
const terminalFee = Number(this.pool.fee);
|
|
553
|
+
if (startFee < terminalFee) {
|
|
554
|
+
throw new Error(
|
|
555
|
+
`Decay startFee (${startFee}) must be greater than or equal to terminal pool fee (${terminalFee})`
|
|
556
|
+
);
|
|
557
|
+
}
|
|
558
|
+
if (startFee > terminalFee && initializer.durationSeconds <= 0) {
|
|
559
|
+
throw new Error(
|
|
560
|
+
"Decay durationSeconds must be greater than 0 when startFee is greater than pool.fee"
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
const schedule = initializer.type === "scheduled" ? { startTime: initializer.startTime } : void 0;
|
|
565
|
+
dopplerHook = initializer.type === "rehype" ? initializer.config : void 0;
|
|
566
|
+
const governance = this.governance ?? (chunkUIPSHVT4_js.isNoOpEnabledChain(this.chainId) ? { type: "noOp" } : { type: "default" });
|
|
567
|
+
if (governance.type === "launchpad" && !chunkUIPSHVT4_js.isLaunchpadEnabledChain(this.chainId)) {
|
|
471
568
|
throw new Error(
|
|
472
569
|
`Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`
|
|
473
570
|
);
|
|
@@ -476,12 +573,13 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
476
573
|
token: this.token,
|
|
477
574
|
sale: this.sale,
|
|
478
575
|
pool: this.pool,
|
|
479
|
-
|
|
576
|
+
initializer,
|
|
577
|
+
schedule,
|
|
480
578
|
dopplerHook,
|
|
481
579
|
vesting: this.vesting,
|
|
482
580
|
governance,
|
|
483
581
|
migration: this.migration,
|
|
484
|
-
integrator: this.integrator ??
|
|
582
|
+
integrator: this.integrator ?? chunk6BQY5EPB_js.ZERO_ADDRESS,
|
|
485
583
|
userAddress: this.userAddress,
|
|
486
584
|
modules: this.moduleAddresses,
|
|
487
585
|
gas: this.gasLimit
|
|
@@ -490,5 +588,5 @@ var MulticurveBuilder = class _MulticurveBuilder {
|
|
|
490
588
|
};
|
|
491
589
|
|
|
492
590
|
exports.MulticurveBuilder = MulticurveBuilder;
|
|
493
|
-
//# sourceMappingURL=chunk-
|
|
494
|
-
//# sourceMappingURL=chunk-
|
|
591
|
+
//# sourceMappingURL=chunk-YFJUIO2A.js.map
|
|
592
|
+
//# sourceMappingURL=chunk-YFJUIO2A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/MulticurveBuilder.ts"],"names":["DEFAULT_V3_YEARLY_MINT_RATE","buildCurvesFromPresets","WAD","V4_MAX_FEE","DECAY_MAX_START_FEE","ZERO_ADDRESS","FEE_TIERS","TICK_SPACINGS","validateMarketCapParameters","marketCapToTicksForMulticurve","marketCapToTickForMulticurve","isNoOpEnabledChain","isLaunchpadEnabledChain"],"mappings":"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","file":"chunk-YFJUIO2A.js","sourcesContent":["import type { Address } from 'viem';\nimport {\n DEFAULT_V3_YEARLY_MINT_RATE,\n DECAY_MAX_START_FEE,\n FEE_TIERS,\n TICK_SPACINGS,\n V4_MAX_FEE,\n WAD,\n ZERO_ADDRESS,\n} from '../constants';\n\nimport {\n marketCapToTicksForMulticurve,\n marketCapToTickForMulticurve,\n validateMarketCapParameters,\n} from '../utils';\nimport {\n isNoOpEnabledChain,\n isLaunchpadEnabledChain,\n type CreateMulticurveParams,\n type GovernanceOption,\n type MigrationConfig,\n type VestingConfig,\n type TokenConfig,\n type MulticurveMarketCapCurvesConfig,\n type MulticurveMarketCapPreset,\n type ModuleAddressOverrides,\n type RehypeDopplerHookConfig,\n type MulticurveInitializerConfig,\n} from '../types';\nimport { type SupportedChainId } from '../addresses';\nimport {\n type BaseAuctionBuilder,\n type MarketCapPresetOverrides,\n buildCurvesFromPresets,\n} from './shared';\n\nexport class MulticurveBuilder<\n C extends SupportedChainId,\n> implements BaseAuctionBuilder<C> {\n private token?: TokenConfig;\n private sale?: CreateMulticurveParams<C>['sale'];\n private pool?: CreateMulticurveParams<C>['pool'];\n private initializer?: CreateMulticurveParams<C>['initializer'];\n private schedule?: CreateMulticurveParams<C>['schedule'];\n private dopplerHook?: RehypeDopplerHookConfig;\n private vesting?: VestingConfig;\n private governance?: GovernanceOption<C>;\n private migration?: MigrationConfig;\n private integrator?: Address;\n private userAddress?: Address;\n private moduleAddresses?: ModuleAddressOverrides;\n private gasLimit?: bigint;\n // Stored from withCurves() for graduationMarketCap conversion in build()\n private numerairePrice?: number;\n private tokenDecimals?: number;\n private numeraireDecimals?: number;\n // Deferred curves config - converted to pool in build()\n private curvesConfig?: {\n numerairePrice: number;\n curves: Array<{\n marketCap: { start: number; end: number | 'max' };\n numPositions: number;\n shares: bigint;\n }>;\n tokenSupply?: bigint;\n tokenDecimals?: number;\n numeraireDecimals?: number;\n fee?: number;\n tickSpacing?: number;\n beneficiaries?: { beneficiary: Address; shares: bigint }[];\n };\n public chainId: C;\n\n constructor(chainId: C) {\n this.chainId = chainId;\n }\n\n static forChain<C extends SupportedChainId>(\n chainId: C,\n ): MulticurveBuilder<C> {\n return new MulticurveBuilder(chainId);\n }\n\n tokenConfig(\n params:\n | {\n type?: 'standard';\n name: string;\n symbol: string;\n tokenURI: string;\n yearlyMintRate?: bigint;\n }\n | {\n type: 'doppler404';\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n },\n ): this {\n if (params && 'type' in params && params.type === 'doppler404') {\n this.token = {\n type: 'doppler404',\n name: params.name,\n symbol: params.symbol,\n baseURI: params.baseURI,\n unit: params.unit,\n };\n } else {\n this.token = {\n type: 'standard',\n name: params.name,\n symbol: params.symbol,\n tokenURI: params.tokenURI,\n yearlyMintRate: params.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE,\n };\n }\n return this;\n }\n\n saleConfig(params: {\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n }): this {\n this.sale = {\n initialSupply: params.initialSupply,\n numTokensToSell: params.numTokensToSell,\n numeraire: params.numeraire,\n };\n return this;\n }\n\n poolConfig(params: {\n fee: number;\n tickSpacing: number;\n curves: {\n tickLower: number;\n tickUpper: number;\n numPositions: number;\n shares: bigint;\n }[];\n beneficiaries?: { beneficiary: Address; shares: bigint }[];\n }): this {\n // Mutual exclusion: cannot use poolConfig() after withCurves()\n if (this.curvesConfig) {\n throw new Error(\n 'Cannot use poolConfig() after withCurves(). ' +\n 'Use withCurves() for market cap-based configuration, ' +\n 'or poolConfig() for manual tick configuration.',\n );\n }\n\n const sortedBeneficiaries = params.beneficiaries\n ? [...params.beneficiaries].sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n })\n : undefined;\n\n this.pool = {\n fee: params.fee,\n tickSpacing: params.tickSpacing,\n curves: params.curves,\n beneficiaries: sortedBeneficiaries,\n };\n return this;\n }\n\n withMarketCapPresets(params?: {\n fee?: number;\n tickSpacing?: number;\n presets?: MulticurveMarketCapPreset[];\n overrides?: MarketCapPresetOverrides;\n beneficiaries?: { beneficiary: Address; shares: bigint }[];\n }): this {\n // Mutual exclusion: cannot use withMarketCapPresets() after withCurves()\n if (this.curvesConfig) {\n throw new Error(\n 'Cannot use withMarketCapPresets() after withCurves(). ' +\n 'Use withCurves() for market cap-based configuration, ' +\n 'or withMarketCapPresets() for preset-based configuration.',\n );\n }\n\n const { fee, tickSpacing, curves } = buildCurvesFromPresets({\n fee: params?.fee,\n tickSpacing: params?.tickSpacing,\n presets: params?.presets,\n overrides: params?.overrides,\n });\n\n return this.poolConfig({\n fee,\n tickSpacing,\n curves,\n beneficiaries: params?.beneficiaries,\n });\n }\n\n /**\n * Configure multicurve using market cap ranges (no tick math required).\n *\n * This is the recommended way to configure multicurve pools. Simply specify\n * market cap ranges in USD for each curve.\n *\n * Curves can be provided in any order - they will be automatically sorted\n * by market cap (ascending) before validation and processing. Curves must\n * be contiguous or overlapping (no gaps allowed).\n *\n * V4 pools support custom fees (0-100,000). Standard fee tiers auto-derive\n * tickSpacing; custom fees require explicit tickSpacing parameter.\n *\n * @param params - Market cap configuration with curves defined by market cap ranges\n * @returns Builder instance for chaining\n *\n * @example Standard fee tier\n * ```ts\n * builder\n * .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n * .withCurves({\n * numerairePrice: 3000,\n * curves: [...],\n * fee: 500, // Standard tier, tickSpacing auto-derived\n * })\n * ```\n *\n * @example Custom fee\n * ```ts\n * builder\n * .saleConfig({ initialSupply, numTokensToSell, numeraire: WETH })\n * .withCurves({\n * numerairePrice: 3000,\n * curves: [...],\n * fee: 2500, // Custom 0.25% fee\n * tickSpacing: 10, // Required for custom fees\n * })\n * ```\n */\n withCurves(params: MulticurveMarketCapCurvesConfig): this {\n // Mutual exclusion: cannot use withCurves() after poolConfig()/withMarketCapPresets()\n if (this.pool) {\n throw new Error(\n 'Cannot use withCurves() after poolConfig()/withMarketCapPresets(). ' +\n 'Use withCurves() for market cap-based configuration, ' +\n 'or poolConfig() for manual tick configuration.',\n );\n }\n\n // Validate numerairePrice\n if (params.numerairePrice <= 0) {\n throw new Error('numerairePrice must be greater than 0');\n }\n\n // Validate curves array\n if (!params.curves || params.curves.length === 0) {\n throw new Error('curves array must contain at least one curve');\n }\n\n // Validate each curve (basic validation that doesn't require saleConfig)\n for (let i = 0; i < params.curves.length; i++) {\n const curve = params.curves[i];\n this.validateCurveRange(\n curve.marketCap.start,\n curve.marketCap.end,\n curve.numPositions,\n curve.shares,\n `curves[${i}]`,\n );\n }\n\n // Sort curves by market cap (start, then end) for deterministic ordering\n const sortedCurves = this.sortCurvesByMarketCap(params.curves);\n\n // Validate curve contiguity (no gaps allowed, overlaps OK)\n this.validateCurveContiguity(sortedCurves);\n\n // Validate total shares sum to exactly WAD\n const totalShares = sortedCurves.reduce((sum, c) => sum + c.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Total curve shares must equal 100% (${WAD}). Got ${totalShares} (${Number((totalShares * 10000n) / WAD) / 100}%)`,\n );\n }\n\n // Validate fee if provided\n if (params.fee !== undefined && params.fee > V4_MAX_FEE) {\n throw new Error(\n `Fee ${params.fee} exceeds maximum allowed for V4 pools (${V4_MAX_FEE} = 10%). ` +\n `Use a fee between 0 and ${V4_MAX_FEE}.`,\n );\n }\n\n // Store for later use in build() (graduationMarketCap conversion)\n this.numerairePrice = params.numerairePrice;\n this.tokenDecimals = params.tokenDecimals;\n this.numeraireDecimals = params.numeraireDecimals;\n\n // Store config for deferred conversion in build()\n this.curvesConfig = {\n numerairePrice: params.numerairePrice,\n curves: sortedCurves,\n tokenSupply: params.tokenSupply,\n tokenDecimals: params.tokenDecimals,\n numeraireDecimals: params.numeraireDecimals,\n fee: params.fee,\n tickSpacing: params.tickSpacing,\n beneficiaries: params.beneficiaries,\n };\n\n return this;\n }\n\n /**\n * Sort curves by market cap (start, then end) for deterministic ordering\n */\n private sortCurvesByMarketCap<\n T extends { marketCap: { start: number; end: number | 'max' } },\n >(curves: T[]): T[] {\n return [...curves].sort((a, b) => {\n const startDiff = a.marketCap.start - b.marketCap.start;\n if (startDiff !== 0) return startDiff;\n const aEnd = a.marketCap.end === 'max' ? Infinity : a.marketCap.end;\n const bEnd = b.marketCap.end === 'max' ? Infinity : b.marketCap.end;\n return aEnd - bEnd;\n });\n }\n\n private validateCurveRange(\n startMarketCap: number,\n endMarketCap: number | 'max',\n numPositions: number,\n shares: bigint,\n label: string,\n ): void {\n if (startMarketCap <= 0) {\n throw new Error(`${label}: marketCap.start must be greater than 0`);\n }\n if (endMarketCap !== 'max' && endMarketCap <= 0) {\n throw new Error(`${label}: marketCap.end must be greater than 0`);\n }\n if (endMarketCap !== 'max' && startMarketCap >= endMarketCap) {\n throw new Error(\n `${label}: startMarketCap ($${startMarketCap.toLocaleString()}) must be less than endMarketCap ($${endMarketCap.toLocaleString()})`,\n );\n }\n if (numPositions <= 0) {\n throw new Error(`${label}: numPositions must be greater than 0`);\n }\n if (shares <= 0n) {\n throw new Error(`${label}: shares must be greater than 0`);\n }\n }\n\n private validateCurveContiguity(\n sortedCurves: { marketCap: { start: number; end: number | 'max' } }[],\n ): void {\n if (sortedCurves.length <= 1) {\n return;\n }\n\n for (let i = 1; i < sortedCurves.length; i++) {\n const prevCurve = sortedCurves[i - 1];\n const currCurve = sortedCurves[i];\n const prevEnd =\n prevCurve.marketCap.end === 'max'\n ? Infinity\n : prevCurve.marketCap.end;\n const prevEndLabel =\n prevCurve.marketCap.end === 'max'\n ? 'max'\n : `$${prevCurve.marketCap.end.toLocaleString()}`;\n const currEndLabel =\n currCurve.marketCap.end === 'max'\n ? 'max'\n : `$${currCurve.marketCap.end.toLocaleString()}`;\n\n if (currCurve.marketCap.start > prevEnd) {\n throw new Error(\n `Gap detected between market cap ranges: ` +\n `$${prevCurve.marketCap.start.toLocaleString()}-${prevEndLabel} ` +\n `and $${currCurve.marketCap.start.toLocaleString()}-${currEndLabel}. ` +\n `Curves must be contiguous or overlapping.`,\n );\n }\n }\n }\n\n /**\n * Configure a RehypeDopplerHook for the pool.\n *\n * When configured, the hook will be initialized with the pool and will handle:\n * - Custom swap fees\n * - Fee distribution to beneficiaries, LPs, and buyback destinations\n *\n * IMPORTANT:\n * - The hook address must be whitelisted in the DopplerHookInitializer\n * - Fee distribution percentages must sum to exactly WAD (1e18 = 100%)\n *\n * @example\n * ```typescript\n * builder.withRehypeDopplerHook({\n * hookAddress: '0x...',\n * buybackDestination: '0x...',\n * customFee: 3000, // 0.3%\n * assetBuybackPercentWad: parseEther('0.2'), // 20%\n * numeraireBuybackPercentWad: parseEther('0.2'), // 20%\n * beneficiaryPercentWad: parseEther('0.3'), // 30%\n * lpPercentWad: parseEther('0.3'), // 30%\n * })\n * ```\n */\n withRehypeDopplerHook(params: RehypeDopplerHookConfig): this {\n this.assertCanSetInitializer('rehype');\n\n const totalDistribution =\n params.assetBuybackPercentWad +\n params.numeraireBuybackPercentWad +\n params.beneficiaryPercentWad +\n params.lpPercentWad;\n if (totalDistribution !== WAD) {\n throw new Error(\n `DopplerHook fee distribution must sum to ${WAD} (100%), but got ${totalDistribution}`,\n );\n }\n\n // Validate mutual exclusivity of graduation threshold options\n if (params.graduationMarketCap !== undefined && params.farTick !== undefined) {\n throw new Error(\n 'Cannot specify both graduationMarketCap and farTick. Use one or the other.',\n );\n }\n\n this.dopplerHook = params;\n this.initializer = { type: 'rehype', config: params };\n return this;\n }\n\n withVesting(params?: {\n duration?: bigint;\n cliffDuration?: number;\n recipients?: Address[];\n amounts?: bigint[];\n }): this {\n if (!params) {\n this.vesting = undefined;\n return this;\n }\n this.vesting = {\n duration: Number(params.duration ?? 0n),\n cliffDuration: params.cliffDuration ?? 0,\n recipients: params.recipients,\n amounts: params.amounts,\n };\n return this;\n }\n\n private parseStartTimeSeconds(\n value: number | bigint | Date,\n label: string,\n ): number {\n let startTimeSeconds: number;\n if (value instanceof Date) {\n startTimeSeconds = Math.floor(value.getTime() / 1000);\n } else if (typeof value === 'bigint') {\n startTimeSeconds = Number(value);\n } else {\n startTimeSeconds = Number(value);\n }\n\n if (\n !Number.isFinite(startTimeSeconds) ||\n !Number.isInteger(startTimeSeconds)\n ) {\n throw new Error(\n `${label} must be an integer number of seconds since Unix epoch`,\n );\n }\n\n if (startTimeSeconds < 0) {\n throw new Error(`${label} cannot be negative`);\n }\n\n const UINT32_MAX = 0xffffffff;\n if (startTimeSeconds > UINT32_MAX) {\n throw new Error(\n `${label} must fit within uint32 (seconds since Unix epoch up to year 2106)`,\n );\n }\n\n return startTimeSeconds;\n }\n\n private assertCanSetInitializer(\n nextType: MulticurveInitializerConfig['type'],\n ): void {\n const currentType = this.initializer?.type;\n if (\n currentType === undefined ||\n currentType === 'standard' ||\n currentType === nextType\n ) {\n return;\n }\n throw new Error(\n `Cannot set multicurve initializer to '${nextType}' because it is already configured as '${currentType}'`,\n );\n }\n\n /**\n * Configure decay multicurve initializer settings.\n *\n * The pool's terminal fee is always taken from `poolConfig().fee`.\n * `startFee` must be greater than or equal to that terminal fee.\n * `startTime` is optional and defaults to `0` when omitted.\n */\n withDecay(params?: {\n startTime?: number | bigint | Date;\n startFee: number;\n durationSeconds: number | bigint;\n }): this {\n if (!params) {\n if (this.initializer?.type === 'decay') {\n this.initializer = { type: 'standard' };\n }\n return this;\n }\n\n this.assertCanSetInitializer('decay');\n\n const startTime =\n params.startTime === undefined\n ? 0\n : this.parseStartTimeSeconds(params.startTime, 'Decay startTime');\n const startFee = Number(params.startFee);\n const durationSeconds = Number(params.durationSeconds);\n\n if (!Number.isFinite(startFee) || !Number.isInteger(startFee)) {\n throw new Error('Decay startFee must be an integer');\n }\n if (startFee < 0 || startFee > DECAY_MAX_START_FEE) {\n throw new Error(\n `Decay startFee must be between 0 and ${DECAY_MAX_START_FEE} (80%)`,\n );\n }\n if (!Number.isFinite(durationSeconds) || !Number.isInteger(durationSeconds)) {\n throw new Error('Decay durationSeconds must be an integer');\n }\n if (durationSeconds < 0) {\n throw new Error('Decay durationSeconds cannot be negative');\n }\n const UINT32_MAX = 0xffffffff;\n if (durationSeconds > UINT32_MAX) {\n throw new Error('Decay durationSeconds must fit within uint32');\n }\n\n this.schedule = undefined;\n this.initializer = {\n type: 'decay',\n startTime,\n startFee,\n durationSeconds,\n };\n return this;\n }\n\n withSchedule(params?: { startTime: number | bigint | Date }): this {\n if (!params) {\n if (this.initializer?.type === 'scheduled') {\n this.initializer = { type: 'standard' };\n }\n this.schedule = undefined;\n return this;\n }\n\n this.assertCanSetInitializer('scheduled');\n const startTimeSeconds = this.parseStartTimeSeconds(\n params.startTime,\n 'Schedule startTime',\n );\n this.schedule = { startTime: startTimeSeconds };\n this.initializer = { type: 'scheduled', startTime: startTimeSeconds };\n return this;\n }\n\n withGovernance(params: GovernanceOption<C>): this {\n this.governance = params;\n return this;\n }\n\n withMigration(migration: MigrationConfig): this {\n this.migration = migration;\n return this;\n }\n\n withUserAddress(address: Address): this {\n this.userAddress = address;\n return this;\n }\n\n withIntegrator(address?: Address): this {\n this.integrator = address ?? ZERO_ADDRESS;\n return this;\n }\n\n withGasLimit(gas?: bigint): this {\n this.gasLimit = gas;\n return this;\n }\n\n private overrideModule<K extends keyof ModuleAddressOverrides>(\n key: K,\n address: NonNullable<ModuleAddressOverrides[K]>,\n ): this {\n this.moduleAddresses = {\n ...this.moduleAddresses,\n [key]: address,\n } as ModuleAddressOverrides;\n return this;\n }\n\n withTokenFactory(address: Address): this {\n return this.overrideModule('tokenFactory', address);\n }\n withAirlock(address: Address): this {\n return this.overrideModule('airlock', address);\n }\n withV4MulticurveInitializer(address: Address): this {\n return this.overrideModule('v4MulticurveInitializer', address);\n }\n withV4ScheduledMulticurveInitializer(address: Address): this {\n return this.overrideModule('v4ScheduledMulticurveInitializer', address);\n }\n withV4DecayMulticurveInitializer(address: Address): this {\n return this.overrideModule('v4DecayMulticurveInitializer', address);\n }\n withGovernanceFactory(address: Address): this {\n return this.overrideModule('governanceFactory', address);\n }\n withV2Migrator(address: Address): this {\n return this.overrideModule('v2Migrator', address);\n }\n\n withV4Migrator(address: Address): this {\n return this.overrideModule('v4Migrator', address);\n }\n withNoOpMigrator(address: Address): this {\n return this.overrideModule('noOpMigrator', address);\n }\n withDopplerHookInitializer(address: Address): this {\n return this.overrideModule('dopplerHookInitializer', address);\n }\n\n build(): CreateMulticurveParams<C> {\n if (!this.token) throw new Error('tokenConfig is required');\n if (!this.sale) throw new Error('saleConfig is required');\n if (!this.migration) throw new Error('migration configuration is required');\n if (!this.userAddress) throw new Error('userAddress is required');\n\n // Convert deferred curves config to pool if set\n if (this.curvesConfig && !this.pool) {\n const config = this.curvesConfig;\n\n // Get token supply from config or saleConfig\n const tokenSupply = config.tokenSupply ?? this.sale.initialSupply;\n if (!tokenSupply) {\n throw new Error(\n 'tokenSupply must be provided (either via saleConfig() or withCurves() params)',\n );\n }\n\n // Get fee and tick spacing\n const fee = config.fee ?? FEE_TIERS.MEDIUM;\n const tickSpacing =\n config.tickSpacing ?? (TICK_SPACINGS as Record<number, number>)[fee];\n\n if (tickSpacing === undefined) {\n throw new Error(\n `Custom fee ${fee} requires explicit tickSpacing. ` +\n `Standard fees (100, 500, 3000, 10000) auto-derive tickSpacing.`,\n );\n }\n\n // Validate first curve market caps (the launch price)\n const firstCurve = config.curves[0];\n const startValidation = validateMarketCapParameters(\n firstCurve.marketCap.start,\n tokenSupply,\n config.tokenDecimals,\n );\n const endValidation =\n firstCurve.marketCap.end === 'max'\n ? { valid: true, warnings: [] }\n : validateMarketCapParameters(\n firstCurve.marketCap.end,\n tokenSupply,\n config.tokenDecimals,\n );\n const allWarnings = [\n ...startValidation.warnings,\n ...endValidation.warnings,\n ];\n if (allWarnings.length > 0) {\n console.warn('First curve market cap validation warnings:');\n allWarnings.forEach((w) => console.warn(` - ${w}`));\n }\n\n // Convert all curves to ticks\n const curves: {\n tickLower: number;\n tickUpper: number;\n numPositions: number;\n shares: bigint;\n }[] = [];\n\n for (const curve of config.curves) {\n const curveTicks = marketCapToTicksForMulticurve({\n marketCapLower: curve.marketCap.start,\n marketCapUpper: curve.marketCap.end,\n tokenSupply,\n numerairePriceUSD: config.numerairePrice,\n tickSpacing,\n tokenDecimals: config.tokenDecimals ?? 18,\n numeraireDecimals: config.numeraireDecimals ?? 18,\n });\n\n curves.push({\n tickLower: curveTicks.tickLower,\n tickUpper: curveTicks.tickUpper,\n numPositions: curve.numPositions,\n shares: curve.shares,\n });\n }\n\n // Sort beneficiaries by address if provided\n const sortedBeneficiaries = config.beneficiaries\n ? [...config.beneficiaries].sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n })\n : undefined;\n\n // Set pool config\n this.pool = {\n fee,\n tickSpacing,\n curves,\n beneficiaries: sortedBeneficiaries,\n };\n }\n\n if (!this.pool) throw new Error('poolConfig is required');\n\n // Validate noOp migration requires beneficiaries\n // NoOpMigrator is designed for locked pools with beneficiaries. Without beneficiaries,\n // the pool status is \"Initialized\" (not \"Locked\"), meaning exitLiquidity() can be called.\n // But NoOpMigrator.migrate() always reverts, so the entire graduation transaction fails\n // and liquidity becomes trapped.\n if (this.migration.type === 'noOp') {\n const hasBeneficiaries =\n this.pool.beneficiaries && this.pool.beneficiaries.length > 0;\n if (!hasBeneficiaries) {\n throw new Error(\n 'noOp migration requires beneficiaries. Without beneficiaries, the pool would be stuck after reaching ' +\n 'graduation - exitLiquidity() succeeds but NoOpMigrator.migrate() always reverts, causing the entire ' +\n 'transaction to fail. Either add beneficiaries or use a different migration type (uniswapV2, uniswapV4).',\n );\n }\n }\n\n // Convert graduationMarketCap to farTick if using rehype\n let dopplerHook = this.dopplerHook;\n if (dopplerHook?.graduationMarketCap !== undefined) {\n // Use numerairePrice from: 1) explicit in dopplerHook, 2) stored from withCurves()\n const numerairePrice = dopplerHook.numerairePrice ?? this.numerairePrice;\n\n if (!numerairePrice) {\n throw new Error(\n 'graduationMarketCap requires numerairePrice. ' +\n 'Either use withCurves() (which provides numerairePrice), ' +\n 'or pass numerairePrice explicitly in withRehypeDopplerHook().',\n );\n }\n\n if (dopplerHook.graduationMarketCap <= 0) {\n throw new Error('graduationMarketCap must be greater than 0');\n }\n\n const farTick = marketCapToTickForMulticurve({\n marketCapUSD: dopplerHook.graduationMarketCap,\n tokenSupply: this.sale.initialSupply,\n numerairePriceUSD: numerairePrice,\n tickSpacing: this.pool.tickSpacing,\n tokenDecimals: this.tokenDecimals ?? 18,\n numeraireDecimals: this.numeraireDecimals ?? 18,\n });\n\n // Validate farTick is within curve boundaries\n const allTickUppers = this.pool.curves.map((c) => c.tickUpper);\n const allTickLowers = this.pool.curves.map((c) => c.tickLower);\n const maxTickUpper = Math.max(...allTickUppers);\n const minTickLower = Math.min(...allTickLowers);\n\n if (farTick < minTickLower) {\n throw new Error(\n `graduationMarketCap converts to tick ${farTick}, which is below the lowest curve tick (${minTickLower})`,\n );\n }\n if (farTick > maxTickUpper) {\n throw new Error(\n `graduationMarketCap converts to tick ${farTick}, which is above the highest curve tick (${maxTickUpper})`,\n );\n }\n\n // Store computed farTick on dopplerHook for encoding\n dopplerHook = { ...dopplerHook, farTick };\n }\n\n const initializer =\n this.initializer ??\n (dopplerHook\n ? { type: 'rehype', config: dopplerHook }\n : this.schedule\n ? { type: 'scheduled', startTime: this.schedule.startTime }\n : { type: 'standard' });\n\n if (initializer.type === 'scheduled' && dopplerHook) {\n throw new Error(\n \"Cannot combine scheduled multicurve with rehype initializer. Use exactly one initializer mode.\",\n );\n }\n if (initializer.type === 'decay' && dopplerHook) {\n throw new Error(\n \"Cannot combine decay multicurve with rehype initializer. Use exactly one initializer mode.\",\n );\n }\n if (initializer.type === 'decay') {\n const startFee = Number(initializer.startFee);\n const terminalFee = Number(this.pool.fee);\n\n if (startFee < terminalFee) {\n throw new Error(\n `Decay startFee (${startFee}) must be greater than or equal to terminal pool fee (${terminalFee})`,\n );\n }\n\n if (startFee > terminalFee && initializer.durationSeconds <= 0) {\n throw new Error(\n 'Decay durationSeconds must be greater than 0 when startFee is greater than pool.fee',\n );\n }\n }\n\n const schedule =\n initializer.type === 'scheduled'\n ? { startTime: initializer.startTime }\n : undefined;\n dopplerHook =\n initializer.type === 'rehype' ? initializer.config : undefined;\n\n // Default governance: noOp on supported chains, default on others (e.g., Ink)\n const governance =\n this.governance ??\n (isNoOpEnabledChain(this.chainId)\n ? { type: 'noOp' as const }\n : { type: 'default' as const });\n\n if (\n governance.type === 'launchpad' &&\n !isLaunchpadEnabledChain(this.chainId)\n ) {\n throw new Error(\n `Launchpad governance is not supported on chain ${this.chainId}. Use a supported chain or a different governance type.`,\n );\n }\n\n return {\n token: this.token,\n sale: this.sale,\n pool: this.pool,\n initializer,\n schedule,\n dopplerHook,\n vesting: this.vesting,\n governance: governance as GovernanceOption<C>,\n migration: this.migration,\n integrator: this.integrator ?? ZERO_ADDRESS,\n userAddress: this.userAddress,\n modules: this.moduleAddresses,\n gas: this.gasLimit,\n };\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkP4BT5GDO_js = require('./chunk-P4BT5GDO.js');
|
|
4
4
|
|
|
5
5
|
// src/utils/airlock.ts
|
|
6
6
|
var airlockAbi = [
|
|
@@ -15,10 +15,10 @@ var airlockAbi = [
|
|
|
15
15
|
var getAirlockOwner = async (publicClient) => {
|
|
16
16
|
const client = publicClient;
|
|
17
17
|
const chainId = client.chain?.id;
|
|
18
|
-
if (!chainId || !
|
|
18
|
+
if (!chainId || !chunkP4BT5GDO_js.ADDRESSES[chainId]) {
|
|
19
19
|
throw new Error("Unsupported chain ID for airlock owner lookup");
|
|
20
20
|
}
|
|
21
|
-
const airlockAddress =
|
|
21
|
+
const airlockAddress = chunkP4BT5GDO_js.ADDRESSES[chainId].airlock;
|
|
22
22
|
const owner = await client.readContract({
|
|
23
23
|
address: airlockAddress,
|
|
24
24
|
abi: airlockAbi,
|
|
@@ -41,5 +41,5 @@ exports.DEFAULT_AIRLOCK_BENEFICIARY_SHARES = DEFAULT_AIRLOCK_BENEFICIARY_SHARES;
|
|
|
41
41
|
exports.createAirlockBeneficiary = createAirlockBeneficiary;
|
|
42
42
|
exports.getAirlockBeneficiary = getAirlockBeneficiary;
|
|
43
43
|
exports.getAirlockOwner = getAirlockOwner;
|
|
44
|
-
//# sourceMappingURL=chunk-
|
|
45
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-YKRDFXU3.js.map
|
|
45
|
+
//# sourceMappingURL=chunk-YKRDFXU3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/airlock.ts"],"names":["ADDRESSES"],"mappings":";;;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,SAAA,EAAW,CAAA;AAAA,IAChE,eAAA,EAAiB;AAAA;AAErB,CAAA;AAEO,IAAM,eAAA,GAAkB,OAC7B,YAAA,KACqB;AACrB,EAAA,MAAM,MAAA,GAAS,YAAA;AACf,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,EAAO,EAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,IAAW,CAACA,0BAAA,CAAU,OAAO,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,cAAA,GAAiBA,0BAAA,CAAU,OAAO,CAAA,CAAE,OAAA;AAE1C,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,IACtC,OAAA,EAAS,cAAA;AAAA,IACT,GAAA,EAAK,UAAA;AAAA,IACL,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,yBAAyB,CAAA;AACrD,EAAA,OAAO,KAAA;AACT;AAGO,IAAM,kCAAA,GAAqC,OAAO,IAAI;AAEtD,IAAM,wBAAA,GAA2B,CACtC,KAAA,EACA,MAAA,GAAiB,kCAAA,MACI;AAAA,EACrB,WAAA,EAAa,KAAA;AAAA,EACb;AACF,CAAA;AAEO,IAAM,qBAAA,GAAwB,OACnC,YAAA,EACA,MAAA,GAAiB,kCAAA,KACY;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,YAAY,CAAA;AAChD,EAAA,OAAO,wBAAA,CAAyB,OAAO,MAAM,CAAA;AAC/C","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/utils/airlock.ts"],"names":["ADDRESSES"],"mappings":";;;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,SAAA,EAAW,CAAA;AAAA,IAChE,eAAA,EAAiB;AAAA;AAErB,CAAA;AAEO,IAAM,eAAA,GAAkB,OAC7B,YAAA,KACqB;AACrB,EAAA,MAAM,MAAA,GAAS,YAAA;AACf,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,EAAO,EAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,IAAW,CAACA,0BAAA,CAAU,OAAO,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,cAAA,GAAiBA,0BAAA,CAAU,OAAO,CAAA,CAAE,OAAA;AAE1C,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,IACtC,OAAA,EAAS,cAAA;AAAA,IACT,GAAA,EAAK,UAAA;AAAA,IACL,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,yBAAyB,CAAA;AACrD,EAAA,OAAO,KAAA;AACT;AAGO,IAAM,kCAAA,GAAqC,OAAO,IAAI;AAEtD,IAAM,wBAAA,GAA2B,CACtC,KAAA,EACA,MAAA,GAAiB,kCAAA,MACI;AAAA,EACrB,WAAA,EAAa,KAAA;AAAA,EACb;AACF,CAAA;AAEO,IAAM,qBAAA,GAAwB,OACnC,YAAA,EACA,MAAA,GAAiB,kCAAA,KACY;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,YAAY,CAAA;AAChD,EAAA,OAAO,wBAAA,CAAyB,OAAO,MAAM,CAAA;AAC/C","file":"chunk-YKRDFXU3.js","sourcesContent":["import type { PublicClient, Address } from 'viem';\nimport { ADDRESSES, type SupportedChainId } from '../addresses';\nimport type { BeneficiaryData } from '../types';\n\nconst airlockAbi = [\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [{ name: '', type: 'address', internalType: 'address' }],\n stateMutability: 'view',\n },\n] as const;\n\nexport const getAirlockOwner = async (\n publicClient: unknown,\n): Promise<Address> => {\n const client = publicClient as PublicClient;\n const chainId = client.chain?.id as SupportedChainId | undefined;\n if (!chainId || !ADDRESSES[chainId]) {\n throw new Error('Unsupported chain ID for airlock owner lookup');\n }\n\n const airlockAddress = ADDRESSES[chainId].airlock;\n\n const owner = await client.readContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'owner',\n });\n\n if (!owner) throw new Error('Airlock owner not found');\n return owner as Address;\n};\n\n// Default airlock beneficiary shares (5% = 0.05e18 WAD)\nexport const DEFAULT_AIRLOCK_BENEFICIARY_SHARES = BigInt(5e16); // 5% in WAD\n\nexport const createAirlockBeneficiary = (\n owner: Address,\n shares: bigint = DEFAULT_AIRLOCK_BENEFICIARY_SHARES,\n): BeneficiaryData => ({\n beneficiary: owner,\n shares,\n});\n\nexport const getAirlockBeneficiary = async (\n publicClient: unknown,\n shares: bigint = DEFAULT_AIRLOCK_BENEFICIARY_SHARES,\n): Promise<BeneficiaryData> => {\n const owner = await getAirlockOwner(publicClient);\n return createAirlockBeneficiary(owner, shares);\n};\n"]}
|