@black-market/sdk 0.1.0

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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/abis.d.ts +2573 -0
  4. package/dist/abis.d.ts.map +1 -0
  5. package/dist/abis.js +1875 -0
  6. package/dist/abis.js.map +1 -0
  7. package/dist/abyss.d.ts +3650 -0
  8. package/dist/abyss.d.ts.map +1 -0
  9. package/dist/abyss.js +1522 -0
  10. package/dist/abyss.js.map +1 -0
  11. package/dist/addresses.d.ts +211 -0
  12. package/dist/addresses.d.ts.map +1 -0
  13. package/dist/addresses.js +234 -0
  14. package/dist/addresses.js.map +1 -0
  15. package/dist/auction.d.ts +57 -0
  16. package/dist/auction.d.ts.map +1 -0
  17. package/dist/auction.js +88 -0
  18. package/dist/auction.js.map +1 -0
  19. package/dist/client.d.ts +12 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +18 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/format.d.ts +15 -0
  24. package/dist/format.d.ts.map +1 -0
  25. package/dist/format.js +78 -0
  26. package/dist/format.js.map +1 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +9 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/launch.d.ts +225 -0
  32. package/dist/launch.d.ts.map +1 -0
  33. package/dist/launch.js +511 -0
  34. package/dist/launch.js.map +1 -0
  35. package/dist/live.d.ts +185 -0
  36. package/dist/live.d.ts.map +1 -0
  37. package/dist/live.js +205 -0
  38. package/dist/live.js.map +1 -0
  39. package/package.json +51 -0
  40. package/src/abis.ts +1896 -0
  41. package/src/abyss.ts +1574 -0
  42. package/src/addresses.ts +342 -0
  43. package/src/auction.ts +107 -0
  44. package/src/client.ts +37 -0
  45. package/src/format.ts +73 -0
  46. package/src/index.ts +8 -0
  47. package/src/launch.ts +724 -0
  48. package/src/live.ts +393 -0
package/dist/launch.js ADDED
@@ -0,0 +1,511 @@
1
+ import { encodeFunctionData, isAddress, keccak256, stringToHex, zeroAddress, } from "viem";
2
+ import { ABYSS_FEE_TIERS, AbyssPoolProfile, atomicLaunchFactoryAbi, TokenKind } from "./abyss.js";
3
+ import { AUCTION_SUPPLY } from "./auction.js";
4
+ export const INITIAL_TEMPLATE_VERSION = 1;
5
+ export const STANDARD_TEMPLATE_ID = keccak256(stringToHex("black-market.standard"));
6
+ export const QUOTE_STAKING_TEMPLATE_ID = keccak256(stringToHex("black-market.quote-staking"));
7
+ export const QUOTE_DIVIDENDS_TEMPLATE_ID = keccak256(stringToHex("black-market.quote-dividends"));
8
+ export const DUAL_STAKING_TEMPLATE_ID = keccak256(stringToHex("black-market.dual-staking"));
9
+ export const DUAL_DIVIDENDS_TEMPLATE_ID = keccak256(stringToHex("black-market.dual-dividends"));
10
+ export const FEE_BURN_TEMPLATE_ID = keccak256(stringToHex("black-market.fee-burn"));
11
+ export const STANDARD_TEMPLATE_VERSION = INITIAL_TEMPLATE_VERSION;
12
+ export const LAUNCH_REWARD_DURATION = 7 * 24 * 60 * 60;
13
+ /**
14
+ * Canonical registered volatile/P3 oracle configuration for Atomic launches.
15
+ * Deployment evidence records maxAbsTickMove=17 and cardinality=4096 for this ID.
16
+ */
17
+ export const ATOMIC_LAUNCH_ORACLE_CONFIG_ID = "0xc0e9bed88d70a13fd3ab31451fefdd073b7266e838aee0ad1c236c8c9eff855d";
18
+ /** Existing Abyss execution policy: Atomic launch requests expire after 20 minutes. */
19
+ export const ATOMIC_LAUNCH_DEADLINE_SECONDS = 20 * 60;
20
+ /** Existing Abyss execution policy: initial Atomic buys tolerate 50 basis points of price movement. */
21
+ export const ATOMIC_LAUNCH_BUY_SLIPPAGE_BPS = 50;
22
+ /**
23
+ * Atomic lifecycle recipes and tests use a $5,000 initial fully diluted market cap.
24
+ * The form converts this editable whole-USD default to an X18 value before recipe derivation.
25
+ */
26
+ export const DEFAULT_ATOMIC_LAUNCH_TARGET_MARKET_CAP_USD = 5_000;
27
+ export var LaunchRewardMode;
28
+ (function (LaunchRewardMode) {
29
+ LaunchRewardMode[LaunchRewardMode["None"] = 0] = "None";
30
+ LaunchRewardMode[LaunchRewardMode["Staking"] = 1] = "Staking";
31
+ LaunchRewardMode[LaunchRewardMode["Dividends"] = 2] = "Dividends";
32
+ })(LaunchRewardMode || (LaunchRewardMode = {}));
33
+ export var LaunchFeeAssetMode;
34
+ (function (LaunchFeeAssetMode) {
35
+ LaunchFeeAssetMode[LaunchFeeAssetMode["Profile"] = 0] = "Profile";
36
+ LaunchFeeAssetMode[LaunchFeeAssetMode["PairedOnly"] = 1] = "PairedOnly";
37
+ LaunchFeeAssetMode[LaunchFeeAssetMode["Both"] = 2] = "Both";
38
+ LaunchFeeAssetMode[LaunchFeeAssetMode["LaunchedOnly"] = 3] = "LaunchedOnly";
39
+ })(LaunchFeeAssetMode || (LaunchFeeAssetMode = {}));
40
+ export var LaunchFeeDestination;
41
+ (function (LaunchFeeDestination) {
42
+ LaunchFeeDestination[LaunchFeeDestination["Owner"] = 1] = "Owner";
43
+ LaunchFeeDestination[LaunchFeeDestination["Rewards"] = 2] = "Rewards";
44
+ LaunchFeeDestination[LaunchFeeDestination["Burn"] = 4] = "Burn";
45
+ })(LaunchFeeDestination || (LaunchFeeDestination = {}));
46
+ const OWNER = LaunchFeeDestination.Owner;
47
+ const REWARDS = LaunchFeeDestination.Rewards;
48
+ const BURN = LaunchFeeDestination.Burn;
49
+ const BURNABLE_ONLY = [TokenKind.Burnable];
50
+ const DIVIDEND_ONLY = [TokenKind.HolderDividend];
51
+ export const LAUNCH_TEMPLATES = [
52
+ {
53
+ id: "standard",
54
+ templateId: STANDARD_TEMPLATE_ID,
55
+ version: INITIAL_TEMPLATE_VERSION,
56
+ label: "Standard",
57
+ tokenKinds: BURNABLE_ONLY,
58
+ poolProfiles: [AbyssPoolProfile.StandardOracle, AbyssPoolProfile.QuoteOracle],
59
+ launchedTokenIsQuote: false,
60
+ rewardMode: LaunchRewardMode.None,
61
+ rewardDuration: 0,
62
+ feeAssetMode: LaunchFeeAssetMode.Profile,
63
+ launchedTokenDestinations: OWNER,
64
+ pairedTokenDestinations: OWNER,
65
+ },
66
+ {
67
+ id: "quote-staking",
68
+ templateId: QUOTE_STAKING_TEMPLATE_ID,
69
+ version: INITIAL_TEMPLATE_VERSION,
70
+ label: "Quote Staking",
71
+ tokenKinds: BURNABLE_ONLY,
72
+ poolProfiles: [AbyssPoolProfile.QuoteOracle],
73
+ launchedTokenIsQuote: false,
74
+ rewardMode: LaunchRewardMode.Staking,
75
+ rewardDuration: LAUNCH_REWARD_DURATION,
76
+ feeAssetMode: LaunchFeeAssetMode.PairedOnly,
77
+ launchedTokenDestinations: 0,
78
+ pairedTokenDestinations: OWNER | REWARDS,
79
+ },
80
+ {
81
+ id: "quote-dividends",
82
+ templateId: QUOTE_DIVIDENDS_TEMPLATE_ID,
83
+ version: INITIAL_TEMPLATE_VERSION,
84
+ label: "Quote Dividends",
85
+ tokenKinds: DIVIDEND_ONLY,
86
+ poolProfiles: [AbyssPoolProfile.QuoteOracle],
87
+ launchedTokenIsQuote: false,
88
+ rewardMode: LaunchRewardMode.Dividends,
89
+ rewardDuration: LAUNCH_REWARD_DURATION,
90
+ feeAssetMode: LaunchFeeAssetMode.PairedOnly,
91
+ launchedTokenDestinations: 0,
92
+ pairedTokenDestinations: OWNER | REWARDS,
93
+ },
94
+ {
95
+ id: "dual-staking",
96
+ templateId: DUAL_STAKING_TEMPLATE_ID,
97
+ version: INITIAL_TEMPLATE_VERSION,
98
+ label: "Dual Staking",
99
+ tokenKinds: BURNABLE_ONLY,
100
+ poolProfiles: [AbyssPoolProfile.StandardOracle],
101
+ launchedTokenIsQuote: false,
102
+ rewardMode: LaunchRewardMode.Staking,
103
+ rewardDuration: LAUNCH_REWARD_DURATION,
104
+ feeAssetMode: LaunchFeeAssetMode.Both,
105
+ launchedTokenDestinations: OWNER | REWARDS | BURN,
106
+ pairedTokenDestinations: OWNER | REWARDS,
107
+ },
108
+ {
109
+ id: "dual-dividends",
110
+ templateId: DUAL_DIVIDENDS_TEMPLATE_ID,
111
+ version: INITIAL_TEMPLATE_VERSION,
112
+ label: "Dual Dividends",
113
+ tokenKinds: DIVIDEND_ONLY,
114
+ poolProfiles: [AbyssPoolProfile.StandardOracle],
115
+ launchedTokenIsQuote: false,
116
+ rewardMode: LaunchRewardMode.Dividends,
117
+ rewardDuration: LAUNCH_REWARD_DURATION,
118
+ feeAssetMode: LaunchFeeAssetMode.Both,
119
+ launchedTokenDestinations: OWNER | REWARDS | BURN,
120
+ pairedTokenDestinations: OWNER | REWARDS,
121
+ },
122
+ {
123
+ id: "fee-burn",
124
+ templateId: FEE_BURN_TEMPLATE_ID,
125
+ version: INITIAL_TEMPLATE_VERSION,
126
+ label: "Fee Burn",
127
+ tokenKinds: BURNABLE_ONLY,
128
+ poolProfiles: [AbyssPoolProfile.QuoteOracle],
129
+ launchedTokenIsQuote: true,
130
+ rewardMode: LaunchRewardMode.None,
131
+ rewardDuration: 0,
132
+ feeAssetMode: LaunchFeeAssetMode.LaunchedOnly,
133
+ launchedTokenDestinations: BURN,
134
+ pairedTokenDestinations: 0,
135
+ },
136
+ ];
137
+ const Q32 = 1n << 32n;
138
+ const Q96 = 1n << 96n;
139
+ const MAX_UINT128 = (1n << 128n) - 1n;
140
+ const MAX_UINT160 = (1n << 160n) - 1n;
141
+ const MAX_UINT256 = (1n << 256n) - 1n;
142
+ const MIN_INT24 = -(1 << 23);
143
+ const MAX_INT24 = (1 << 23) - 1;
144
+ // These are the deployed TickMathLib bounds. Swap limits are exclusive at both ends.
145
+ const MIN_TICK = -887_272;
146
+ const MAX_TICK = 887_272;
147
+ const MIN_SQRT_RATIO = 4295128739n;
148
+ const MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342n;
149
+ const ZERO_BYTES32 = `0x${"00".repeat(32)}`;
150
+ const BYTES32_HEX = /^0x[0-9a-fA-F]{64}$/;
151
+ // Canonical Uniswap v3 TickMath multipliers, matching contracts/src/oracles/TickMathLib.sol.
152
+ const TICK_MULTIPLIERS = [
153
+ 0xfffcb933bd6fad37aa2d162d1a594001n,
154
+ 0xfff97272373d413259a46990580e213an,
155
+ 0xfff2e50f5f656932ef12357cf3c7fdccn,
156
+ 0xffe5caca7e10e4e61c3624eaa0941cd0n,
157
+ 0xffcb9843d60f6159c9db58835c926644n,
158
+ 0xff973b41fa98c081472e6896dfb254c0n,
159
+ 0xff2ea16466c96a3843ec78b326b52861n,
160
+ 0xfe5dee046a99a2a811c461f1969c3053n,
161
+ 0xfcbe86c7900a88aedcffc83b479aa3a4n,
162
+ 0xf987a7253ac413176f2b074cf7815e54n,
163
+ 0xf3392b0822b70005940c7a398e4b70f3n,
164
+ 0xe7159475a2c29b7443b29c7fa6e889d9n,
165
+ 0xd097f3bdfd2022b8845ad8f792aa5825n,
166
+ 0xa9f746462d870fdf8a65dc1f90e061e5n,
167
+ 0x70d869a156d2a1b890bb3df62baf32f7n,
168
+ 0x31be135f97d08fd981231505542fcfa6n,
169
+ 0x9aa508b5b7a84e1c677de54f3e99bc9n,
170
+ 0x5d6af8dedb81196699c329225ee604n,
171
+ 0x2216e584f5fa1ea926041bedfe98n,
172
+ 0x48a170391f7dc42444e8fa2n,
173
+ ];
174
+ function assertUint(value, maximum, name) {
175
+ if (typeof value !== "bigint" || value < 0n || value > maximum) {
176
+ throw new Error(`${name} must be a nonnegative integer within its Solidity type`);
177
+ }
178
+ }
179
+ function assertPositiveUint(value, maximum, name) {
180
+ assertUint(value, maximum, name);
181
+ if (value === 0n)
182
+ throw new Error(`${name} must be positive`);
183
+ }
184
+ function assertInt24(value, name) {
185
+ if (typeof value !== "number" ||
186
+ !Number.isInteger(value) ||
187
+ value < MIN_INT24 ||
188
+ value > MAX_INT24) {
189
+ throw new Error(`${name} must be an int24 integer`);
190
+ }
191
+ }
192
+ function assertTokenDecimals(value, name) {
193
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value > 255) {
194
+ throw new Error(`${name} must be a uint8 integer`);
195
+ }
196
+ }
197
+ function assertOracleConfigId(value) {
198
+ if (typeof value !== "string" ||
199
+ !BYTES32_HEX.test(value) ||
200
+ value.toLowerCase() === ZERO_BYTES32) {
201
+ throw new Error("pool.oracleConfigId must be a nonzero bytes32");
202
+ }
203
+ }
204
+ function assertCanonicalSqrtPrice(value, name) {
205
+ assertUint(value, MAX_UINT160, name);
206
+ if (value < MIN_SQRT_RATIO || value >= MAX_SQRT_RATIO) {
207
+ throw new Error(`${name} is outside the canonical swap price bounds`);
208
+ }
209
+ }
210
+ function getFeeTier(fee) {
211
+ const tier = ABYSS_FEE_TIERS.find(({ feePips }) => feePips === fee);
212
+ if (!tier)
213
+ throw new Error("pool.fee is not an Abyss fee tier");
214
+ return tier;
215
+ }
216
+ function integerSqrt(value) {
217
+ if (value < 0n)
218
+ throw new Error("Cannot calculate a negative square root");
219
+ if (value < 2n)
220
+ return value;
221
+ let x0 = value;
222
+ let x1 = (x0 + value / x0) >> 1n;
223
+ while (x1 < x0) {
224
+ x0 = x1;
225
+ x1 = (x0 + value / x0) >> 1n;
226
+ }
227
+ return x0;
228
+ }
229
+ function getSqrtRatioAtTick(tick) {
230
+ if (!Number.isInteger(tick) || tick < MIN_TICK || tick > MAX_TICK) {
231
+ throw new Error("Tick is outside the canonical TickMath range");
232
+ }
233
+ const absoluteTick = Math.abs(tick);
234
+ let ratio = absoluteTick & 1 ? TICK_MULTIPLIERS[0] : 0x100000000000000000000000000000000n;
235
+ for (let bit = 1; bit < TICK_MULTIPLIERS.length; bit += 1) {
236
+ if (absoluteTick & (1 << bit)) {
237
+ ratio = (ratio * TICK_MULTIPLIERS[bit]) >> 128n;
238
+ }
239
+ }
240
+ if (tick > 0)
241
+ ratio = MAX_UINT256 / ratio;
242
+ return (ratio >> 32n) + (ratio % Q32 === 0n ? 0n : 1n);
243
+ }
244
+ function getTickAtSqrtRatio(sqrtPriceX96) {
245
+ assertCanonicalSqrtPrice(sqrtPriceX96, "sqrtPriceX96");
246
+ let low = MIN_TICK;
247
+ let high = MAX_TICK;
248
+ while (low < high) {
249
+ const middle = Math.ceil((low + high) / 2);
250
+ if (getSqrtRatioAtTick(middle) <= sqrtPriceX96) {
251
+ low = middle;
252
+ }
253
+ else {
254
+ high = middle - 1;
255
+ }
256
+ }
257
+ return low;
258
+ }
259
+ // Deliberately retain Solidity's signed-remainder alignment semantics from AtomicLaunchFactory.
260
+ function alignDown(tick, tickSpacing) {
261
+ const remainder = tick % tickSpacing;
262
+ return remainder === 0 ? tick : tick - remainder;
263
+ }
264
+ function alignUp(tick, tickSpacing) {
265
+ const remainder = tick % tickSpacing;
266
+ return remainder === 0 ? tick : tick + (tickSpacing - remainder);
267
+ }
268
+ function launchBand(launchTick, tickSpacing, launchedTokenIsQuote) {
269
+ const tickLower = launchedTokenIsQuote
270
+ ? alignUp(launchTick, tickSpacing)
271
+ : alignUp(MIN_TICK, tickSpacing);
272
+ const tickUpper = launchedTokenIsQuote
273
+ ? alignDown(MAX_TICK, tickSpacing)
274
+ : alignDown(launchTick, tickSpacing);
275
+ if (tickLower < MIN_TICK ||
276
+ tickUpper > MAX_TICK ||
277
+ tickLower >= tickUpper) {
278
+ throw new Error("launchTick cannot form a valid Atomic launch band");
279
+ }
280
+ return { tickLower, tickUpper };
281
+ }
282
+ function liquidityForAmount0(amount0, sqrtLowerX96, sqrtUpperX96) {
283
+ return (((amount0 * sqrtLowerX96) / Q96) * sqrtUpperX96) / (sqrtUpperX96 - sqrtLowerX96);
284
+ }
285
+ function liquidityForAmount1(amount1, sqrtLowerX96, sqrtUpperX96) {
286
+ return (amount1 * Q96) / (sqrtUpperX96 - sqrtLowerX96);
287
+ }
288
+ /**
289
+ * Derives the one-sided Atomic launch position from a target fully diluted market cap.
290
+ * The raw price remains a rational bigint until the canonical Q64.96 square root conversion.
291
+ */
292
+ export function deriveAtomicLaunchPoolRecipe(input) {
293
+ assertTokenDecimals(input.pairedTokenDecimals, "pairedTokenDecimals");
294
+ assertPositiveUint(input.pairedTokenUsdPriceX18, MAX_UINT256, "pairedTokenUsdPriceX18");
295
+ assertPositiveUint(input.targetMarketCapUsdX18, MAX_UINT256, "targetMarketCapUsdX18");
296
+ if (typeof input.launchedTokenIsQuote !== "boolean") {
297
+ throw new Error("launchedTokenIsQuote must be a boolean");
298
+ }
299
+ const feeTier = getFeeTier(input.fee);
300
+ const pairedTokenUnit = 10n ** BigInt(input.pairedTokenDecimals);
301
+ const [priceNumerator, priceDenominator] = input.launchedTokenIsQuote ? [input.targetMarketCapUsdX18 * pairedTokenUnit, input.pairedTokenUsdPriceX18 * AUCTION_SUPPLY] : [input.pairedTokenUsdPriceX18 * AUCTION_SUPPLY, input.targetMarketCapUsdX18 * pairedTokenUnit];
302
+ const targetSqrtPriceX96 = integerSqrt((priceNumerator << 192n) / priceDenominator);
303
+ const rawTick = getTickAtSqrtRatio(targetSqrtPriceX96);
304
+ const launchTick = input.launchedTokenIsQuote
305
+ ? Math.ceil(rawTick / feeTier.tickSpacing) * feeTier.tickSpacing
306
+ : Math.floor(rawTick / feeTier.tickSpacing) * feeTier.tickSpacing;
307
+ assertInt24(launchTick, "launchTick");
308
+ const { tickLower, tickUpper } = launchBand(launchTick, feeTier.tickSpacing, input.launchedTokenIsQuote);
309
+ const sqrtLowerX96 = getSqrtRatioAtTick(tickLower);
310
+ const sqrtUpperX96 = getSqrtRatioAtTick(tickUpper);
311
+ const launchSqrtPriceX96 = input.launchedTokenIsQuote ? sqrtLowerX96 : sqrtUpperX96;
312
+ const liquidity = input.launchedTokenIsQuote
313
+ ? liquidityForAmount0(AUCTION_SUPPLY, sqrtLowerX96, sqrtUpperX96)
314
+ : liquidityForAmount1(AUCTION_SUPPLY, sqrtLowerX96, sqrtUpperX96);
315
+ if (liquidity <= 0n || liquidity > MAX_UINT128) {
316
+ throw new Error("Derived liquidity is outside the uint128 range");
317
+ }
318
+ return {
319
+ launchTick,
320
+ launchSqrtPriceX96,
321
+ liquidity,
322
+ launchedTokenAmountMaximum: AUCTION_SUPPLY,
323
+ pairedTokenAmountMaximum: 0n,
324
+ };
325
+ }
326
+ /**
327
+ * Pure estimate for the first exact-input buy against a fresh one-sided Atomic
328
+ * launch position. No wallet balance, allowance, pool deployment, or RPC state.
329
+ * Uses conservative input-fee rounding; execution simulation remains the final
330
+ * authority before submission.
331
+ */
332
+ export function estimateAtomicLaunchInitialBuy(input) {
333
+ assertCanonicalSqrtPrice(input.launchSqrtPriceX96, "launchSqrtPriceX96");
334
+ assertPositiveUint(input.liquidity, MAX_UINT128, "liquidity");
335
+ assertUint(input.pairedTokenAmountIn, MAX_UINT256, "pairedTokenAmountIn");
336
+ const fee = BigInt(getFeeTier(input.fee).feePips);
337
+ const amountAfterFee = (input.pairedTokenAmountIn * (1000000n - fee)) / 1000000n;
338
+ if (amountAfterFee === 0n) {
339
+ return {
340
+ launchedTokenAmountOut: 0n,
341
+ pairedTokenAmountConsumed: input.pairedTokenAmountIn,
342
+ sqrtPriceAfterX96: input.launchSqrtPriceX96,
343
+ };
344
+ }
345
+ const limit = input.sqrtPriceLimitX96;
346
+ let sqrtPriceAfterX96;
347
+ let launchedTokenAmountOut;
348
+ if (input.launchedTokenIsQuote) {
349
+ // Paired token is token1; exact token1 input moves price upward and buys token0.
350
+ const delta = (amountAfterFee * Q96) / input.liquidity;
351
+ sqrtPriceAfterX96 = input.launchSqrtPriceX96 + delta;
352
+ if (limit !== undefined && sqrtPriceAfterX96 > limit)
353
+ sqrtPriceAfterX96 = limit;
354
+ launchedTokenAmountOut =
355
+ (input.liquidity * (sqrtPriceAfterX96 - input.launchSqrtPriceX96) * Q96) /
356
+ (sqrtPriceAfterX96 * input.launchSqrtPriceX96);
357
+ }
358
+ else {
359
+ // Paired token is token0; exact token0 input moves price downward and buys token1.
360
+ const numerator = input.liquidity * Q96 * input.launchSqrtPriceX96;
361
+ const denominator = input.liquidity * Q96 + amountAfterFee * input.launchSqrtPriceX96;
362
+ sqrtPriceAfterX96 = numerator / denominator;
363
+ if (limit !== undefined && sqrtPriceAfterX96 < limit)
364
+ sqrtPriceAfterX96 = limit;
365
+ launchedTokenAmountOut =
366
+ (input.liquidity * (input.launchSqrtPriceX96 - sqrtPriceAfterX96)) / Q96;
367
+ }
368
+ return {
369
+ launchedTokenAmountOut,
370
+ pairedTokenAmountConsumed: input.pairedTokenAmountIn,
371
+ sqrtPriceAfterX96,
372
+ };
373
+ }
374
+ function ceilSqrtRatio(numerator, denominator) {
375
+ const root = integerSqrt(numerator / denominator);
376
+ return root * root * denominator === numerator ? root : root + 1n;
377
+ }
378
+ /**
379
+ * Produces the router's exclusive sqrt-price guard for the paired-token initial buy.
380
+ * A paired input moves down for deployAbove and up for fee-burn/deployBelow.
381
+ */
382
+ export function deriveAtomicLaunchBuySqrtPriceLimitX96(input) {
383
+ assertCanonicalSqrtPrice(input.launchSqrtPriceX96, "launchSqrtPriceX96");
384
+ if (typeof input.launchedTokenIsQuote !== "boolean") {
385
+ throw new Error("launchedTokenIsQuote must be a boolean");
386
+ }
387
+ const slippageBps = input.slippageBps ?? ATOMIC_LAUNCH_BUY_SLIPPAGE_BPS;
388
+ if (!Number.isInteger(slippageBps) || slippageBps < 1 || slippageBps > 9_999) {
389
+ throw new Error("slippageBps must be an integer from 1 through 9,999");
390
+ }
391
+ const slippage = BigInt(slippageBps);
392
+ const squaredLaunchSqrt = input.launchSqrtPriceX96 * input.launchSqrtPriceX96;
393
+ if (input.launchedTokenIsQuote) {
394
+ const limit = integerSqrt((squaredLaunchSqrt * (10000n + slippage)) / 10000n);
395
+ return limit >= MAX_SQRT_RATIO ? MAX_SQRT_RATIO - 1n : limit;
396
+ }
397
+ const limit = ceilSqrtRatio(squaredLaunchSqrt * (10000n - slippage), 10000n);
398
+ return limit <= MIN_SQRT_RATIO ? MIN_SQRT_RATIO + 1n : limit;
399
+ }
400
+ export function getLaunchTemplate(id) {
401
+ const template = LAUNCH_TEMPLATES.find((candidate) => candidate.id === id);
402
+ if (!template)
403
+ throw new Error(`Unknown launch template: ${id}`);
404
+ return template;
405
+ }
406
+ export function getLaunchTemplateByHash(templateId) {
407
+ const template = LAUNCH_TEMPLATES.find((candidate) => candidate.templateId.toLowerCase() === templateId.toLowerCase());
408
+ if (!template)
409
+ throw new Error(`Unknown launch template id: ${templateId}`);
410
+ return template;
411
+ }
412
+ function dispositionTotal(disposition) {
413
+ return disposition.ownerBps + disposition.rewardsBps + disposition.burnBps;
414
+ }
415
+ function dispositionDestinations(disposition) {
416
+ return ((disposition.ownerBps === 0 ? 0 : OWNER) |
417
+ (disposition.rewardsBps === 0 ? 0 : REWARDS) |
418
+ (disposition.burnBps === 0 ? 0 : BURN));
419
+ }
420
+ function validateDisposition(name, disposition, active, allowedDestinations) {
421
+ if (!Number.isInteger(disposition.ownerBps) ||
422
+ !Number.isInteger(disposition.rewardsBps) ||
423
+ !Number.isInteger(disposition.burnBps) ||
424
+ disposition.ownerBps < 0 ||
425
+ disposition.rewardsBps < 0 ||
426
+ disposition.burnBps < 0) {
427
+ throw new Error(`${name} must contain nonnegative integer basis points`);
428
+ }
429
+ const total = dispositionTotal(disposition);
430
+ if (active ? total !== 10_000 : total !== 0) {
431
+ throw new Error(`${name} must total ${active ? "10,000" : "zero"} basis points`);
432
+ }
433
+ if (dispositionDestinations(disposition) & ~allowedDestinations) {
434
+ throw new Error(`${name} uses a destination not allowed by the template`);
435
+ }
436
+ }
437
+ export function buildAtomicLaunchCalldata(request, nativeBuyAmount = 0n) {
438
+ if (!isAddress(request.creator) || request.creator.toLowerCase() === zeroAddress) {
439
+ throw new Error("creator must be a nonzero address");
440
+ }
441
+ const template = getLaunchTemplateByHash(request.templateId);
442
+ if (request.templateVersion !== template.version)
443
+ throw new Error("Unsupported template version");
444
+ if (!template.tokenKinds.includes(request.token.kind)) {
445
+ throw new Error("Token kind is not supported by the template");
446
+ }
447
+ if (!template.poolProfiles.includes(request.pool.profile)) {
448
+ throw new Error("Pool profile is not supported by the template");
449
+ }
450
+ if (!isAddress(request.pool.pairedToken) || request.pool.pairedToken.toLowerCase() === zeroAddress) {
451
+ throw new Error("pairedToken must be a nonzero address");
452
+ }
453
+ if (request.pool.launchedTokenIsQuote !== template.launchedTokenIsQuote) {
454
+ throw new Error("Pool orientation does not match the template");
455
+ }
456
+ const feeTier = getFeeTier(request.pool.fee);
457
+ assertOracleConfigId(request.pool.oracleConfigId);
458
+ assertInt24(request.pool.launchTick, "pool.launchTick");
459
+ assertTokenDecimals(request.token.decimals, "token.decimals");
460
+ assertPositiveUint(request.token.supply, MAX_UINT256, "token.supply");
461
+ assertPositiveUint(request.pool.liquidity, MAX_UINT128, "pool.liquidity");
462
+ assertPositiveUint(request.pool.launchedTokenAmountMaximum, MAX_UINT256, "pool.launchedTokenAmountMaximum");
463
+ assertUint(request.pool.pairedTokenAmountMaximum, MAX_UINT256, "pool.pairedTokenAmountMaximum");
464
+ if (request.pool.pairedTokenAmountMaximum !== 0n) {
465
+ throw new Error("pool.pairedTokenAmountMaximum must be zero for a single-sided Atomic launch");
466
+ }
467
+ if (request.pool.launchedTokenAmountMaximum > request.token.supply) {
468
+ throw new Error("pool.launchedTokenAmountMaximum cannot exceed token.supply");
469
+ }
470
+ assertPositiveUint(request.deadline, MAX_UINT256, "deadline");
471
+ assertUint(request.initialBuy.pairedTokenAmountIn, MAX_UINT256, "initialBuy.pairedTokenAmountIn");
472
+ assertUint(nativeBuyAmount, MAX_UINT256, "nativeBuyAmount");
473
+ assertUint(request.initialBuy.launchedTokenAmountOutMinimum, MAX_UINT256, "initialBuy.launchedTokenAmountOutMinimum");
474
+ assertUint(request.initialBuy.sqrtPriceLimitX96, MAX_UINT160, "initialBuy.sqrtPriceLimitX96");
475
+ const effectiveBuyAmount = request.initialBuy.pairedTokenAmountIn + nativeBuyAmount;
476
+ if (effectiveBuyAmount === 0n) {
477
+ if (request.initialBuy.launchedTokenAmountOutMinimum !== 0n ||
478
+ request.initialBuy.sqrtPriceLimitX96 !== 0n) {
479
+ throw new Error("zero initial buy cannot set output or price limits");
480
+ }
481
+ }
482
+ else {
483
+ if (request.initialBuy.sqrtPriceLimitX96 === 0n) {
484
+ throw new Error("nonzero initial buy requires a directional price limit");
485
+ }
486
+ assertCanonicalSqrtPrice(request.initialBuy.sqrtPriceLimitX96, "initialBuy.sqrtPriceLimitX96");
487
+ const { tickLower, tickUpper } = launchBand(request.pool.launchTick, feeTier.tickSpacing, request.pool.launchedTokenIsQuote);
488
+ const launchSqrtPriceX96 = getSqrtRatioAtTick(request.pool.launchedTokenIsQuote ? tickLower : tickUpper);
489
+ if ((!request.pool.launchedTokenIsQuote &&
490
+ request.initialBuy.sqrtPriceLimitX96 >= launchSqrtPriceX96) ||
491
+ (request.pool.launchedTokenIsQuote &&
492
+ request.initialBuy.sqrtPriceLimitX96 <= launchSqrtPriceX96)) {
493
+ throw new Error("initial buy price limit does not protect the paired-token swap direction");
494
+ }
495
+ }
496
+ const launchedFeesActive = template.feeAssetMode === LaunchFeeAssetMode.Both ||
497
+ template.feeAssetMode === LaunchFeeAssetMode.LaunchedOnly ||
498
+ (template.feeAssetMode === LaunchFeeAssetMode.Profile &&
499
+ request.pool.profile === AbyssPoolProfile.StandardOracle);
500
+ const pairedFeesActive = template.feeAssetMode === LaunchFeeAssetMode.Profile ||
501
+ template.feeAssetMode === LaunchFeeAssetMode.PairedOnly ||
502
+ template.feeAssetMode === LaunchFeeAssetMode.Both;
503
+ validateDisposition("launchedTokenFees", request.launchedTokenFees, launchedFeesActive, template.launchedTokenDestinations);
504
+ validateDisposition("pairedTokenFees", request.pairedTokenFees, pairedFeesActive, template.pairedTokenDestinations);
505
+ return encodeFunctionData({
506
+ abi: atomicLaunchFactoryAbi,
507
+ functionName: "deployAndLaunch",
508
+ args: [request],
509
+ });
510
+ }
511
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../src/launch.ts"],"names":[],"mappings":"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"}