@black-market/sdk 0.6.4 → 0.7.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 (82) hide show
  1. package/README.md +28 -4
  2. package/dist/addresses.d.ts +1 -1
  3. package/dist/addresses.js +4 -4
  4. package/dist/launch.d.ts +61 -0
  5. package/dist/launch.d.ts.map +1 -1
  6. package/dist/launch.js +171 -6
  7. package/dist/launch.js.map +1 -1
  8. package/dist/lifecycle/abi.d.ts +1999 -253
  9. package/dist/lifecycle/abi.d.ts.map +1 -1
  10. package/dist/lifecycle/abi.js +43 -14
  11. package/dist/lifecycle/abi.js.map +1 -1
  12. package/dist/lifecycle/allocations.d.ts +11 -0
  13. package/dist/lifecycle/allocations.d.ts.map +1 -0
  14. package/dist/lifecycle/allocations.js +36 -0
  15. package/dist/lifecycle/allocations.js.map +1 -0
  16. package/dist/lifecycle/calibration.d.ts +19 -0
  17. package/dist/lifecycle/calibration.d.ts.map +1 -0
  18. package/dist/lifecycle/calibration.js +65 -0
  19. package/dist/lifecycle/calibration.js.map +1 -0
  20. package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.d.ts +11 -0
  21. package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.d.ts.map +1 -0
  22. package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.js +10 -0
  23. package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.js.map +1 -0
  24. package/dist/lifecycle/index.d.ts +4 -2
  25. package/dist/lifecycle/index.d.ts.map +1 -1
  26. package/dist/lifecycle/index.js +4 -2
  27. package/dist/lifecycle/index.js.map +1 -1
  28. package/dist/lifecycle/markets.d.ts +170 -6
  29. package/dist/lifecycle/markets.d.ts.map +1 -1
  30. package/dist/lifecycle/markets.js +164 -37
  31. package/dist/lifecycle/markets.js.map +1 -1
  32. package/dist/lifecycle/planner.d.ts +7 -14
  33. package/dist/lifecycle/planner.d.ts.map +1 -1
  34. package/dist/lifecycle/planner.js +354 -400
  35. package/dist/lifecycle/planner.js.map +1 -1
  36. package/dist/lifecycle/presets.d.ts +62 -0
  37. package/dist/lifecycle/presets.d.ts.map +1 -0
  38. package/dist/lifecycle/presets.js +195 -0
  39. package/dist/lifecycle/presets.js.map +1 -0
  40. package/dist/lifecycle/progress.d.ts +5 -1
  41. package/dist/lifecycle/progress.d.ts.map +1 -1
  42. package/dist/lifecycle/progress.js +212 -53
  43. package/dist/lifecycle/progress.js.map +1 -1
  44. package/dist/lifecycle/rpc.d.ts +13 -2
  45. package/dist/lifecycle/rpc.d.ts.map +1 -1
  46. package/dist/lifecycle/rpc.js +92 -8
  47. package/dist/lifecycle/rpc.js.map +1 -1
  48. package/dist/lifecycle/simulation.d.ts +14 -4
  49. package/dist/lifecycle/simulation.d.ts.map +1 -1
  50. package/dist/lifecycle/simulation.js +383 -116
  51. package/dist/lifecycle/simulation.js.map +1 -1
  52. package/dist/lifecycle/transactions.d.ts +6 -0
  53. package/dist/lifecycle/transactions.d.ts.map +1 -0
  54. package/dist/lifecycle/transactions.js +40 -0
  55. package/dist/lifecycle/transactions.js.map +1 -0
  56. package/dist/lifecycle/types.d.ts +39 -2
  57. package/dist/lifecycle/types.d.ts.map +1 -1
  58. package/dist/lifecycle/types.js.map +1 -1
  59. package/docs/launch-lifecycle.md +228 -54
  60. package/examples/README.md +108 -18
  61. package/examples/generate-lifecycle-commitment-fixture.mjs +3 -1
  62. package/examples/launch-example-support.mjs +1 -1
  63. package/examples/launch-example.mjs +73 -26
  64. package/examples/launch-lifecycle-smoke.mjs +13 -11
  65. package/examples/launch.mjs +12 -11
  66. package/examples/quickstart.mjs +1 -1
  67. package/package.json +1 -1
  68. package/src/addresses.ts +4 -4
  69. package/src/launch.ts +213 -6
  70. package/src/lifecycle/abi.ts +43 -14
  71. package/src/lifecycle/allocations.ts +35 -0
  72. package/src/lifecycle/calibration.ts +59 -0
  73. package/src/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.ts +11 -0
  74. package/src/lifecycle/index.ts +4 -2
  75. package/src/lifecycle/markets.ts +169 -35
  76. package/src/lifecycle/planner.ts +326 -330
  77. package/src/lifecycle/presets.ts +243 -0
  78. package/src/lifecycle/progress.ts +193 -50
  79. package/src/lifecycle/rpc.ts +97 -9
  80. package/src/lifecycle/simulation.ts +370 -109
  81. package/src/lifecycle/transactions.ts +34 -0
  82. package/src/lifecycle/types.ts +35 -3
package/src/launch.ts CHANGED
@@ -31,6 +31,53 @@ export type LaunchPoolRecipe = {
31
31
  tickLower: number; tickUpper: number;
32
32
  };
33
33
 
34
+ export type LaunchPositionRangesInput = {
35
+ /** Exact, spacing-aligned opening ratio, as returned by deriveLaunchPoolRecipe. */
36
+ launchSqrtPriceX96: bigint;
37
+ /** Existing launch convention: true means the launched token is token0. */
38
+ launchedTokenIsQuote: boolean;
39
+ /** Raw launch-token units allocated to ONE pool, not the entire launch supply. */
40
+ tokenBudget: bigint;
41
+ tickSpacing: number;
42
+ venue: "abyss" | "uniswap-v4";
43
+ /** Source-defined Black Market inventory weights, widths and gaps. */
44
+ distributionPreset: "early-scarcity" | "staircase" | "smooth-ramp";
45
+ positionCount?: number;
46
+ /** Defaults to source-gaps; adjacent removes only Staircase's empty shelf gaps. */
47
+ staircaseBoundaries?: "source-gaps" | "adjacent";
48
+ /** Defaults to false; extends only the final band's far endpoint. */
49
+ extendFinalRangeToBoundary?: boolean;
50
+ };
51
+
52
+ export type LaunchPositionRange = {
53
+ tickLower: number;
54
+ tickUpper: number;
55
+ sqrtPriceLowerX96: bigint;
56
+ sqrtPriceUpperX96: bigint;
57
+ inventoryBps: number;
58
+ /** Intended inventory allocation, including any rounding dust burned before buys. */
59
+ allocatedTokenAmount: bigint;
60
+ liquidity: bigint;
61
+ /** Admitted maximum: equals allocatedTokenAmount, not the smaller actual mint debit. */
62
+ maxTokenAmount: bigint;
63
+ maxQuoteAmount: 0n;
64
+ };
65
+
66
+ export type LaunchPositionRanges = {
67
+ launchTick: number;
68
+ launchSqrtPriceX96: bigint;
69
+ boundaryTick: number;
70
+ boundarySqrtPriceX96: bigint;
71
+ positions: readonly LaunchPositionRange[];
72
+ tokenAmountMaximum: bigint;
73
+ /** Expected rounding residual burned before buys; not an unallocated creator reserve. */
74
+ unspentTokenAmount: bigint;
75
+ totalLiquidity: bigint;
76
+ openingActiveLiquidity: bigint;
77
+ buySideLiquidity: bigint;
78
+ maxLiquidityPerTick: bigint;
79
+ };
80
+
34
81
  export type LaunchBuySqrtPriceLimitInput = {
35
82
  launchSqrtPriceX96: bigint;
36
83
  launchedTokenIsQuote: boolean;
@@ -40,6 +87,7 @@ export type LaunchBuySqrtPriceLimitInput = {
40
87
  const Q32 = 1n << 32n;
41
88
  const Q96 = 1n << 96n;
42
89
  const MAX_UINT128 = (1n << 128n) - 1n;
90
+ const MAX_INT128 = (1n << 127n) - 1n;
43
91
  const MAX_UINT160 = (1n << 160n) - 1n;
44
92
  const MAX_UINT256 = (1n << 256n) - 1n;
45
93
  const MIN_INT24 = -(1 << 23);
@@ -130,7 +178,8 @@ function integerSqrt(value: bigint): bigint {
130
178
  return x0;
131
179
  }
132
180
 
133
- function getSqrtRatioAtTick(tick: number): bigint {
181
+ /** Canonical Q64.96 endpoint ratio, rounded up; MAX is not a usable swap limit. */
182
+ export function getSqrtRatioAtTick(tick: number): bigint {
134
183
  if (!Number.isInteger(tick) || tick < MIN_TICK || tick > MAX_TICK) {
135
184
  throw new Error("Tick is outside the canonical TickMath range");
136
185
  }
@@ -163,15 +212,13 @@ function getTickAtSqrtRatio(sqrtPriceX96: bigint): number {
163
212
  return low;
164
213
  }
165
214
 
166
- // Signed-remainder alignment matches the canonical Solidity range geometry.
215
+ // Usable endpoints require mathematical floor/ceil, including negative ticks.
167
216
  function alignDown(tick: number, tickSpacing: number): number {
168
- const remainder = tick % tickSpacing;
169
- return remainder === 0 ? tick : tick - remainder;
217
+ return Math.floor(tick / tickSpacing) * tickSpacing;
170
218
  }
171
219
 
172
220
  function alignUp(tick: number, tickSpacing: number): number {
173
- const remainder = tick % tickSpacing;
174
- return remainder === 0 ? tick : tick + (tickSpacing - remainder);
221
+ return Math.ceil(tick / tickSpacing) * tickSpacing;
175
222
  }
176
223
 
177
224
  function launchBand(
@@ -203,6 +250,18 @@ function liquidityForAmount1(amount1: bigint, sqrtLowerX96: bigint, sqrtUpperX96
203
250
  return (amount1 * Q96) / (sqrtUpperX96 - sqrtLowerX96);
204
251
  }
205
252
 
253
+ function divideRoundingUp(numerator: bigint, denominator: bigint): bigint {
254
+ return (numerator + denominator - 1n) / denominator;
255
+ }
256
+
257
+ // Canonical SqrtPriceMath.getAmount0Delta(..., true) uses two ceiling divisions.
258
+ function amount0ForLiquidityRoundingUp(liquidity: bigint, sqrtLowerX96: bigint, sqrtUpperX96: bigint): bigint {
259
+ return divideRoundingUp(
260
+ divideRoundingUp((liquidity << 96n) * (sqrtUpperX96 - sqrtLowerX96), sqrtUpperX96),
261
+ sqrtLowerX96,
262
+ );
263
+ }
264
+
206
265
  /**
207
266
  * Derives one-sided launch geometry from explicit supply, budget and fully diluted market cap.
208
267
  * The raw price remains a rational bigint until the canonical Q64.96 square root conversion.
@@ -256,6 +315,154 @@ export function deriveLaunchPoolRecipe(
256
315
  };
257
316
  }
258
317
 
318
+ // Black Market apps/web/src/lib/launch.ts uses cumulative rounding for both
319
+ // preset inventory weights (10,000 bps) and active widths (64 spacing steps).
320
+ function apportionLaunchInventory(total: number, scores: readonly number[]): number[] {
321
+ const sum = scores.reduce((value, score) => value + score, 0);
322
+ let cumulative = 0;
323
+ let allocated = 0;
324
+ return scores.map((score) => {
325
+ cumulative += score;
326
+ const next = Math.round((total * cumulative) / sum);
327
+ const share = next - allocated;
328
+ allocated = next;
329
+ return share;
330
+ });
331
+ }
332
+
333
+ /**
334
+ * Source-defined one-sided Black Market presets, ordered toward higher launch-token
335
+ * prices. The first position starts at launch; later bands are contiguous or leave
336
+ * the preset's intentional gaps. Only an explicit final-tail adaptation reaches
337
+ * the usable protocol boundary; no equal-tick extrapolation is applied.
338
+ * Supply allocation across pools belongs to the caller: pass each pool's share.
339
+ * Budget caps floor all but the final allocation, which receives the remainder.
340
+ * Exact rational funding floors guarantee canonical rounded-up mint debits fit
341
+ * their caps, without a percentage liquidity reserve or creator allocation.
342
+ * Gross liquidity is checked at each endpoint, including adjacent shared ticks.
343
+ * Active liquidity follows [lower, upper); the first downward token1 buy crosses
344
+ * the opening upper endpoint and activates only the first reachable band.
345
+ * Boundary ratios are position endpoints, not exclusive swap-price guards.
346
+ */
347
+ export function deriveLaunchPositionRanges(input: LaunchPositionRangesInput): LaunchPositionRanges {
348
+ assertCanonicalSqrtPrice(input.launchSqrtPriceX96, "launchSqrtPriceX96");
349
+ assertPositiveUint(input.tokenBudget, MAX_UINT256, "tokenBudget");
350
+ if (typeof input.launchedTokenIsQuote !== "boolean") throw new Error("launchedTokenIsQuote must be a boolean");
351
+ const { tickSpacing, venue, distributionPreset } = input;
352
+ if (!Number.isInteger(tickSpacing) || tickSpacing < 1 || tickSpacing > 32767) throw new Error("tickSpacing must be 1..32767");
353
+ if (venue !== "abyss" && venue !== "uniswap-v4") throw new Error("venue must be abyss or uniswap-v4");
354
+ if (distributionPreset !== "early-scarcity" && distributionPreset !== "staircase" && distributionPreset !== "smooth-ramp") {
355
+ throw new Error("distributionPreset must be early-scarcity, staircase or smooth-ramp");
356
+ }
357
+ const positionCount = input.positionCount ?? 5;
358
+ if (!Number.isInteger(positionCount) || positionCount < 2 || positionCount > 16) throw new Error("positionCount must be 2..16");
359
+ const extendFinalRangeToBoundary = input.extendFinalRangeToBoundary ?? false;
360
+ if (typeof extendFinalRangeToBoundary !== "boolean") throw new Error("extendFinalRangeToBoundary must be a boolean");
361
+ const staircaseBoundaries = input.staircaseBoundaries === undefined ? "source-gaps" : input.staircaseBoundaries;
362
+ if (staircaseBoundaries !== "source-gaps" && staircaseBoundaries !== "adjacent") {
363
+ throw new Error("staircaseBoundaries must be source-gaps or adjacent");
364
+ }
365
+ if (input.staircaseBoundaries !== undefined && distributionPreset !== "staircase") {
366
+ throw new Error("staircaseBoundaries is only valid for the staircase preset");
367
+ }
368
+ const launchTick = getTickAtSqrtRatio(input.launchSqrtPriceX96);
369
+ if (launchTick % tickSpacing !== 0 || getSqrtRatioAtTick(launchTick) !== input.launchSqrtPriceX96) {
370
+ throw new Error("Opening sqrt price must be an exact spacing-aligned tick");
371
+ }
372
+ const band = launchBand(launchTick, tickSpacing, input.launchedTokenIsQuote);
373
+ const boundaryTick = input.launchedTokenIsQuote ? band.tickUpper : band.tickLower;
374
+ const inventoryBps = apportionLaunchInventory(10_000, Array.from({ length: positionCount }, (_, index) => {
375
+ if (distributionPreset === "early-scarcity") return (positionCount - 1) ** 2 + 15 * index ** 2;
376
+ if (distributionPreset === "staircase") return (Math.floor((index * 4) / positionCount) + 1) ** 2;
377
+ return positionCount + 2 * index;
378
+ }));
379
+ const widths = apportionLaunchInventory(64, inventoryBps.map((_, index) => {
380
+ if (distributionPreset === "early-scarcity") return positionCount - 1 + 3 * index;
381
+ if (distributionPreset === "staircase") return Math.floor((index * 4) / positionCount) + 1;
382
+ return 2 * positionCount - index;
383
+ }));
384
+
385
+ // V4 Pool.sol floors the negative tick INDEX; Abyss Tick.sol truncates toward
386
+ // zero, equivalent to ceil here. The resulting canonical capacities differ.
387
+ const minimumTickIndex = venue === "uniswap-v4" ? Math.floor(MIN_TICK / tickSpacing) : Math.ceil(MIN_TICK / tickSpacing);
388
+ const maximumTickIndex = Math.floor(MAX_TICK / tickSpacing);
389
+ const maxLiquidityPerTick = MAX_UINT128 / BigInt(maximumTickIndex - minimumTickIndex + 1);
390
+ const positions: LaunchPositionRange[] = [];
391
+ const grossLiquidityByTick = new Map<number, bigint>();
392
+ const direction = input.launchedTokenIsQuote ? 1 : -1;
393
+ let distance = 0;
394
+ let allocated = 0n;
395
+ let totalLiquidity = 0n;
396
+ let tokenAmountMaximum = 0n;
397
+ let tokenAmountSpent = 0n;
398
+ let openingActiveLiquidity = 0n;
399
+ for (let index = 0; index < positionCount; index += 1) {
400
+ const weight = inventoryBps[index]!;
401
+ const allocatedTokenAmount = index === positionCount - 1
402
+ ? input.tokenBudget - allocated
403
+ : (input.tokenBudget * BigInt(weight)) / 10_000n;
404
+ if (allocatedTokenAmount <= 0n) throw new Error("Every position must have a positive allocated token cap");
405
+ allocated += allocatedTokenAmount;
406
+ if (index > 0) {
407
+ if (distributionPreset === "early-scarcity") {
408
+ distance += 2 + Math.floor((4 * index) / (positionCount - 1));
409
+ } else if (distributionPreset === "staircase" && staircaseBoundaries === "source-gaps" &&
410
+ Math.floor((index * 4) / positionCount) !== Math.floor(((index - 1) * 4) / positionCount)) {
411
+ distance += 3;
412
+ }
413
+ }
414
+ const start = launchTick + direction * distance * tickSpacing;
415
+ distance += widths[index]!;
416
+ const canonicalEnd = launchTick + direction * distance * tickSpacing;
417
+ if (Math.min(start, canonicalEnd) < band.tickLower || Math.max(start, canonicalEnd) > band.tickUpper) {
418
+ throw new Error("The launch tick leaves too little room for this distribution preset");
419
+ }
420
+ const end = extendFinalRangeToBoundary && index === positionCount - 1 ? boundaryTick : canonicalEnd;
421
+ const tickLower = Math.min(start, end);
422
+ const tickUpper = Math.max(start, end);
423
+ const sqrtLowerX96 = tickLower === launchTick ? input.launchSqrtPriceX96 : getSqrtRatioAtTick(tickLower);
424
+ const sqrtUpperX96 = tickUpper === launchTick ? input.launchSqrtPriceX96 : getSqrtRatioAtTick(tickUpper);
425
+ // For integer caps, flooring the exact rational inverse guarantees the
426
+ // two-ceiling amount0 debit (or one-ceiling amount1 debit) cannot exceed cap.
427
+ const liquidity = input.launchedTokenIsQuote
428
+ ? (allocatedTokenAmount * sqrtLowerX96 * sqrtUpperX96) / (Q96 * (sqrtUpperX96 - sqrtLowerX96))
429
+ : liquidityForAmount1(allocatedTokenAmount, sqrtLowerX96, sqrtUpperX96);
430
+ if (liquidity <= 0n || liquidity > MAX_INT128) throw new Error("Derived position liquidity is outside the positive int128 mint range");
431
+ const mintDebit = input.launchedTokenIsQuote
432
+ ? amount0ForLiquidityRoundingUp(liquidity, sqrtLowerX96, sqrtUpperX96)
433
+ : divideRoundingUp(liquidity * (sqrtUpperX96 - sqrtLowerX96), Q96);
434
+ if (mintDebit <= 0n || mintDebit > allocatedTokenAmount || (venue === "uniswap-v4" && mintDebit > MAX_INT128)) {
435
+ throw new Error("Derived position mint debit exceeds its budget or settlement range");
436
+ }
437
+ const lowerGross = (grossLiquidityByTick.get(tickLower) ?? 0n) + liquidity;
438
+ const upperGross = (grossLiquidityByTick.get(tickUpper) ?? 0n) + liquidity;
439
+ if (lowerGross > maxLiquidityPerTick || upperGross > maxLiquidityPerTick) {
440
+ throw new Error(`Gross position liquidity exceeds the tick capacity at ${lowerGross > maxLiquidityPerTick ? tickLower : tickUpper}`);
441
+ }
442
+ grossLiquidityByTick.set(tickLower, lowerGross);
443
+ grossLiquidityByTick.set(tickUpper, upperGross);
444
+ totalLiquidity += liquidity;
445
+ tokenAmountMaximum += allocatedTokenAmount;
446
+ tokenAmountSpent += mintDebit;
447
+ if (tickLower <= launchTick && launchTick < tickUpper) openingActiveLiquidity += liquidity;
448
+ positions.push({ tickLower, tickUpper, sqrtPriceLowerX96: sqrtLowerX96, sqrtPriceUpperX96: sqrtUpperX96,
449
+ inventoryBps: weight, allocatedTokenAmount, liquidity, maxTokenAmount: allocatedTokenAmount, maxQuoteAmount: 0n });
450
+ }
451
+ return {
452
+ launchTick,
453
+ launchSqrtPriceX96: input.launchSqrtPriceX96,
454
+ boundaryTick,
455
+ boundarySqrtPriceX96: getSqrtRatioAtTick(boundaryTick),
456
+ positions,
457
+ tokenAmountMaximum,
458
+ unspentTokenAmount: input.tokenBudget - tokenAmountSpent,
459
+ totalLiquidity,
460
+ openingActiveLiquidity,
461
+ buySideLiquidity: positions[0]!.liquidity,
462
+ maxLiquidityPerTick,
463
+ };
464
+ }
465
+
259
466
  export type LaunchInitialBuyEstimateInput = {
260
467
  launchSqrtPriceX96: bigint;
261
468
  liquidity: bigint;
@@ -4,7 +4,7 @@ import {
4
4
  marketLiveStateV1Components, positionIdentityV1Components, preparedMarketV1Components,
5
5
  profileRegistrationV1Components, profileTopologyV1Components, launchEnvelopeV2Components, sourceTermsV3Components,
6
6
  } from "./schema.js";
7
- import { poolBoundHookParametersV1Components, v4LifecycleMarketComponents } from "./markets.js";
7
+ import { poolBoundHookParametersV1Components, poolBoundHookParametersV2Components, v4LifecycleMarketComponents } from "./markets.js";
8
8
 
9
9
  const planInput = { name: "plan", type: "tuple", components: launchPlanV1Components } as const;
10
10
  export const launchLifecycleAbi = [
@@ -155,17 +155,29 @@ export const poolMarketAdapterV1Abi = [
155
155
  { name: "salt", type: "bytes32" }, { name: "predictedHook", type: "address" },
156
156
  ] },
157
157
  ] as const;
158
- const boundParametersInput = { name: "parameters", type: "tuple", components: poolBoundHookParametersV1Components } as const;
159
- export const poolHookDeployerV1Abi = [
158
+ const boundParametersV1Input = { name: "parameters", type: "tuple", components: poolBoundHookParametersV1Components } as const;
159
+ const boundParametersV2Input = { name: "parameters", type: "tuple", components: poolBoundHookParametersV2Components } as const;
160
+ const poolHookDeployerMetadataAbi = [
160
161
  { type: "constructor", stateMutability: "nonpayable", inputs: [{ name: "creationCode", type: "bytes" }] },
161
162
  { type: "function", name: "creationCodeHash", stateMutability: "view", inputs: [], outputs: [{ type: "bytes32" }] },
162
163
  { type: "function", name: "codeChunk0", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
163
164
  { type: "function", name: "codeChunk1", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
164
165
  { type: "function", name: "deployedCodeHash", stateMutability: "view", inputs: [{ type: "address" }], outputs: [{ type: "bytes32" }] },
165
- { type: "function", name: "initCodeHash", stateMutability: "view", inputs: [boundParametersInput], outputs: [{ type: "bytes32" }] },
166
- { type: "function", name: "predict", stateMutability: "view", inputs: [boundParametersInput, { name: "salt", type: "bytes32" }], outputs: [{ type: "address" }] },
167
166
  { type: "function", name: "validHookAddress", stateMutability: "pure", inputs: [{ type: "address" }], outputs: [{ type: "bool" }] },
168
- { type: "function", name: "deploy", stateMutability: "nonpayable", inputs: [boundParametersInput, { name: "salt", type: "bytes32" }], outputs: [{ name: "hook", type: "address" }] },
167
+ ] as const;
168
+ /** Reviewed config5 holder with the exact 18-word PoolBoundHookParametersV1 tuple. */
169
+ export const poolHookDeployerV1Abi = [
170
+ ...poolHookDeployerMetadataAbi,
171
+ { type: "function", name: "initCodeHash", stateMutability: "view", inputs: [boundParametersV1Input], outputs: [{ type: "bytes32" }] },
172
+ { type: "function", name: "predict", stateMutability: "view", inputs: [boundParametersV1Input, { name: "salt", type: "bytes32" }], outputs: [{ type: "address" }] },
173
+ { type: "function", name: "deploy", stateMutability: "nonpayable", inputs: [boundParametersV1Input, { name: "salt", type: "bytes32" }], outputs: [{ name: "hook", type: "address" }] },
174
+ ] as const;
175
+ /** Config6 source holder with the exact 20-word PoolBoundHookParametersV2 tuple. */
176
+ export const poolHookDeployerConfigV6Abi = [
177
+ ...poolHookDeployerMetadataAbi,
178
+ { type: "function", name: "initCodeHash", stateMutability: "view", inputs: [boundParametersV2Input], outputs: [{ type: "bytes32" }] },
179
+ { type: "function", name: "predict", stateMutability: "view", inputs: [boundParametersV2Input, { name: "salt", type: "bytes32" }], outputs: [{ type: "address" }] },
180
+ { type: "function", name: "deploy", stateMutability: "nonpayable", inputs: [boundParametersV2Input, { name: "salt", type: "bytes32" }], outputs: [{ name: "hook", type: "address" }] },
169
181
  ] as const;
170
182
  export const sharedHookDeployerV1Abi = [
171
183
  { type: "constructor", stateMutability: "nonpayable", inputs: [{ name: "creationCode", type: "bytes" }] },
@@ -206,10 +218,7 @@ export const lifecycleV4HookAbi = [
206
218
  { type: "function", name: "pendingFees", stateMutability: "view", inputs: [{ type: "bytes32" }, { type: "address" }], outputs: [{ type: "uint256" }] },
207
219
  { type: "function", name: "settledFees", stateMutability: "view", inputs: [{ type: "bytes32" }, { type: "address" }], outputs: [{ type: "uint256" }] },
208
220
  ] as const;
209
- /** Complete mined FixedFeePoolHookV1 ABI (pool-launch-v1, 20261005T053747Z-b5a7b88).
210
- * Compiler-only internalType annotations are omitted; the constructor is one 18-field tuple. */
211
- export const fixedFeePoolHookV1Abi = [
212
- { type: "constructor", inputs: [boundParametersInput], stateMutability: "nonpayable" },
221
+ const fixedFeePoolHookCommonAbi = [
213
222
  { type: "function", name: "ALL_HOOK_MASK", inputs: [], outputs: [{ name: "", type: "uint160" }], stateMutability: "view" },
214
223
  { type: "function", name: "MAX_ORACLE_CARDINALITY", inputs: [], outputs: [{ name: "", type: "uint16" }], stateMutability: "view" },
215
224
  { type: "function", name: "PIPS_DENOMINATOR", inputs: [], outputs: [{ name: "", type: "uint24" }], stateMutability: "view" },
@@ -279,22 +288,42 @@ export const fixedFeePoolHookV1Abi = [
279
288
  { type: "error", name: "Reentrancy", inputs: [] },
280
289
  { type: "error", name: "Unauthorized", inputs: [] },
281
290
  ] as const;
291
+ /** Reviewed config5 hook. No configurable minimum/sensitivity constructor or getters. */
292
+ export const fixedFeePoolHookV1Abi = [
293
+ { type: "constructor", inputs: [boundParametersV1Input], stateMutability: "nonpayable" },
294
+ ...fixedFeePoolHookCommonAbi,
295
+ ] as const;
296
+ /** Config6 source ABI; usable only with its separately certified V2-constructor graph. */
297
+ export const fixedFeePoolHookConfigV6Abi = [
298
+ { type: "constructor", inputs: [boundParametersV2Input], stateMutability: "nonpayable" },
299
+ ...fixedFeePoolHookCommonAbi,
300
+ { type: "function", name: "minimumHookFeePips", inputs: [], outputs: [{ name: "", type: "uint24" }], stateMutability: "view" },
301
+ { type: "function", name: "feeSensitivityPipsSecondsPerTick", inputs: [], outputs: [{ name: "", type: "uint32" }], stateMutability: "view" },
302
+ ] as const;
282
303
  export const lifecycleV4LockerAbi = [
283
304
  { type: "function", name: "poolManager", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
284
305
  { type: "function", name: "launcher", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
285
306
  { type: "function", name: "positionCount", stateMutability: "view", inputs: [{ type: "bytes32" }], outputs: [{ type: "uint256" }] },
286
307
  { type: "function", name: "isSealed", stateMutability: "view", inputs: [{ type: "bytes32" }], outputs: [{ type: "bool" }] },
287
308
  ] as const;
288
- export const poolFeeCollectorFactoryV1Abi = [
309
+ const poolFeeCollectorFactoryCommonAbi = [
289
310
  { type: "function", name: "collectorDeployer", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
290
- { type: "function", name: "poolBoundHookParameters", stateMutability: "view", inputs: [
291
- { name: "registrar", type: "address" }, { name: "token", type: "address" }, { name: "market", type: "tuple", components: lifecycleMarketComponents },
292
- ], outputs: [boundParametersInput, { name: "salt", type: "bytes32" }] },
293
311
  { type: "function", name: "decodeAndValidate", stateMutability: "view", inputs: [{ type: "address" }, { type: "address" }, { type: "tuple", components: lifecycleMarketComponents }], outputs: [{ type: "tuple", components: v4LifecycleMarketComponents }] },
294
312
  { type: "function", name: "poolBoundDeploymentMetadata", stateMutability: "view", inputs: [{ type: "address" }, { type: "address" }, { type: "tuple", components: lifecycleMarketComponents }], outputs: [{ type: "address" }, { type: "bytes32" }, { type: "bytes32" }, { type: "address" }] },
295
313
  { type: "function", name: "dependencyDigest", stateMutability: "view", inputs: [{ type: "address" }], outputs: [{ type: "bytes32" }] },
296
314
  { type: "function", name: "create", stateMutability: "nonpayable", inputs: [{ type: "address" }, { type: "address" }, { type: "tuple", components: lifecycleV4PoolKeyComponents }, { type: "uint256" }], outputs: [{ type: "address" }] },
297
315
  ] as const;
316
+ const boundFactoryInputs = [
317
+ { name: "registrar", type: "address" }, { name: "token", type: "address" }, { name: "market", type: "tuple", components: lifecycleMarketComponents },
318
+ ] as const;
319
+ export const poolFeeCollectorFactoryV1Abi = [
320
+ ...poolFeeCollectorFactoryCommonAbi,
321
+ { type: "function", name: "poolBoundHookParameters", stateMutability: "view", inputs: boundFactoryInputs, outputs: [boundParametersV1Input, { name: "salt", type: "bytes32" }] },
322
+ ] as const;
323
+ export const poolFeeCollectorFactoryConfigV6Abi = [
324
+ ...poolFeeCollectorFactoryCommonAbi,
325
+ { type: "function", name: "poolBoundHookParameters", stateMutability: "view", inputs: boundFactoryInputs, outputs: [boundParametersV2Input, { name: "salt", type: "bytes32" }] },
326
+ ] as const;
298
327
  export const lifecycleDirectoryAbi = [
299
328
  { type: "function", name: "core", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
300
329
  { type: "function", name: "market", stateMutability: "view", inputs: [{ type: "bytes32" }, { type: "uint32" }], outputs: [{ name: "adapter", type: "address" }, { name: "prepared", type: "tuple", components: preparedMarketV1Components }] },
@@ -0,0 +1,35 @@
1
+ import type { LaunchPlanV1, MarketConfigV1 } from "./schema.js";
2
+ import { decodeAbyssLifecycleMarketConfig, decodePoolBoundV4LifecycleMarketConfig, decodeV4LifecycleMarketConfig, isPoolBoundV4ConfigVersion } from "./markets.js";
3
+ import { LifecyclePlanningError } from "./types.js";
4
+
5
+ /** Intended allocation is exact; actual mint rounding residuals burn before buys. */
6
+ export function assertLifecycleSupplyAllocation(plan: LaunchPlanV1): void {
7
+ if (plan.markets.reduce((sum, market) => sum + market.tokenBudget, 0n) !== plan.token.supply) {
8
+ throw new LifecyclePlanningError("INVALID_TOKEN_BUDGET", "Market token budgets must sum exactly to committed supply");
9
+ }
10
+ }
11
+
12
+ export function assertLifecycleMarketAllocation(market: MarketConfigV1, positions: readonly ({ maxTokenAmount: bigint } | { tokenAmountMaximum: bigint })[]): number {
13
+ if (positions.length === 0 || positions.length > 32) throw new LifecyclePlanningError("INVALID_POSITION_COUNT", "Every market requires one through 32 positions");
14
+ const maxima = positions.reduce((sum, position) => sum + ("maxTokenAmount" in position ? position.maxTokenAmount : position.tokenAmountMaximum), 0n);
15
+ if (maxima !== market.tokenBudget) throw new LifecyclePlanningError("INVALID_TOKEN_BUDGET", "Position token maxima must sum exactly to their market budget");
16
+ return positions.length;
17
+ }
18
+
19
+ /** Pure compilation decodes once; planning reuses its already decoded configs. */
20
+ export function assertLifecycleTokenAllocation(plan: LaunchPlanV1): void {
21
+ assertLifecycleSupplyAllocation(plan);
22
+ let positionCount = 0;
23
+ for (const market of plan.markets) {
24
+ const positions = market.configVersion === 1
25
+ ? decodeAbyssLifecycleMarketConfig(market.config).positions
26
+ : market.configVersion === 4
27
+ ? decodeV4LifecycleMarketConfig(market.config).positions
28
+ : isPoolBoundV4ConfigVersion(market.configVersion)
29
+ ? decodePoolBoundV4LifecycleMarketConfig(market.config, market.configVersion).positions
30
+ : undefined;
31
+ if (positions === undefined) throw new LifecyclePlanningError("UNSUPPORTED_CONFIG_VERSION", "Allocation requires an explicit supported position schema");
32
+ positionCount += assertLifecycleMarketAllocation(market, positions);
33
+ }
34
+ if (positionCount > 32) throw new LifecyclePlanningError("INVALID_POSITION_COUNT", "A launch commits at most 32 total positions across every venue");
35
+ }
@@ -0,0 +1,59 @@
1
+ import { decodeFunctionResult, keccak256, type Address } from "viem";
2
+ import { launchLifecycleAbi } from "./abi.js";
3
+ import { buildPoolBoundHookParameters, decodePoolBoundV4LifecycleMarketConfig, isPoolBoundV4ConfigVersion, poolBoundHookInitCodeHash, poolBoundV4LifecycleConfigSchema, predictPoolBoundHookAddress, type PoolBoundHookParameters, type PoolBoundLifecycleConfigVersion } from "./markets.js";
4
+ import { getKnownLifecycleProfile, type LifecycleProfilePreset } from "./presets.js";
5
+ import { type LaunchPlanV1, type LaunchReceiptV1 } from "./schema.js";
6
+ import { LifecyclePlanningError, type PlannedLaunch, type PoolBoundHookDeployment } from "./types.js";
7
+
8
+ const verifiedCreationCode = new WeakSet<LifecycleProfilePreset>();
9
+
10
+ /** Construction only: a release preset never certifies current registry admission.
11
+ * Unknown chain/core/profile identities deliberately return to live discovery. */
12
+ export function deriveKnownPoolBoundHookDeployment(options: { plan: LaunchPlanV1; marketIndex: number; token: Address }): { deployment: PoolBoundHookDeployment; parameters: PoolBoundHookParameters; configVersion: PoolBoundLifecycleConfigVersion } | undefined {
13
+ const { plan, marketIndex, token } = options;
14
+ const market = plan.markets[marketIndex];
15
+ if (market === undefined || !isPoolBoundV4ConfigVersion(market.configVersion)) throw new LifecyclePlanningError("INVALID_BOUND_MARKET", "Market index must select explicit pool-bound config version 5 or 6");
16
+ const preset = getKnownLifecycleProfile({ chainId: plan.chainId, orchestrator: plan.orchestrator, profileId: market.profileId });
17
+ if (preset === undefined) return undefined;
18
+ if (!preset.supported) throw new LifecyclePlanningError("UNSUPPORTED_CONFIG_VERSION", preset.unavailableReason ?? "This historical deployment does not support the current pool-bound ABI");
19
+ const { profile, boundHook: graph } = preset;
20
+ if (graph === undefined || profile.topology.hookTopology !== 2 || profile.topology.configVersion !== market.configVersion ||
21
+ profile.adapter.configVersion !== market.configVersion || profile.envelope?.configVersion !== market.configVersion ||
22
+ profile.registration.configSchema.toLowerCase() !== poolBoundV4LifecycleConfigSchema(market.configVersion).toLowerCase() ||
23
+ market.adapterId.toLowerCase() !== profile.registration.adapterId.toLowerCase()) throw new LifecyclePlanningError("INVALID_BOUND_MARKET", "Market does not select the preset's exact version, schema, adapter and bound-hook topology");
24
+ if (!verifiedCreationCode.has(preset)) {
25
+ if (keccak256(graph.creationCode).toLowerCase() !== profile.topology.hookCreationCodeHash.toLowerCase() || graph.deployer.toLowerCase() !== profile.topology.hookDeployer.toLowerCase() || graph.registrar.toLowerCase() !== profile.adapter.implementation.toLowerCase()) throw new LifecyclePlanningError("HOOK_CREATION_CODE_MISMATCH", "Frozen hook creation code or constructor graph differs from its reviewed preset");
26
+ verifiedCreationCode.add(preset);
27
+ }
28
+ const config = decodePoolBoundV4LifecycleMarketConfig(market.config, market.configVersion);
29
+ const parameters = buildPoolBoundHookParameters({
30
+ chainId: plan.chainId, core: plan.orchestrator, poolManager: graph.poolManager, registrar: graph.registrar,
31
+ oracleFactory: graph.oracleFactory, liquidityLocker: graph.liquidityLocker, token, market, config,
32
+ });
33
+ const initCodeHash = poolBoundHookInitCodeHash(graph.creationCode, parameters, market.configVersion);
34
+ const deployment = { deployer: graph.deployer, initCodeHash, salt: config.hookSalt, predictedHook: predictPoolBoundHookAddress({ deployer: graph.deployer, initCodeHash, salt: config.hookSalt }) };
35
+ return { deployment, parameters, configVersion: market.configVersion };
36
+ }
37
+
38
+ export function validateBuySlippageBps(bps: number): void {
39
+ if (!Number.isSafeInteger(bps) || bps < 0 || bps >= 10000) throw new LifecyclePlanningError("INVALID_BUY_SLIPPAGE", "Buy slippage must be an integer between zero and 9999 basis points");
40
+ }
41
+
42
+ /** Actual ordered receipt outputs, never reserve geometry or caller-supplied quotes. */
43
+ export function protectOrderedBuyMinimums(planned: PlannedLaunch, bps: number): LaunchPlanV1 {
44
+ validateBuySlippageBps(bps);
45
+ const { simulation, plan } = planned;
46
+ if (simulation.confidence !== "stateful" || simulation.backend === "unavailable" || simulation.steps.length !== planned.transactions.length || simulation.steps.some((step, index) => !step.success || step.transactionId !== planned.transactions[index]?.id)) throw new LifecyclePlanningError("LAUNCH_DIAGNOSTIC_FAILED", simulation.reason ?? "The complete diagnostic launch sequence did not execute successfully", simulation);
47
+ const activation = planned.transactions.find((transaction) => transaction.kind === "atomic" || transaction.kind === "activate");
48
+ const step = simulation.steps.find((candidate) => candidate.transactionId === activation?.id);
49
+ if (activation === undefined || step?.returnData === undefined) throw new LifecyclePlanningError("MISSING_BUY_OUTPUTS", "Diagnostic execution omitted the actual activation receipt", simulation);
50
+ const receipt = decodeFunctionResult({ abi: launchLifecycleAbi, functionName: activation.kind === "atomic" ? "launchAtomic" : "activateLaunch", data: step.returnData }) as LaunchReceiptV1;
51
+ if (receipt.planHash.toLowerCase() !== planned.planHash.toLowerCase() || receipt.launchId.toLowerCase() !== planned.launchId.toLowerCase() || receipt.token.toLowerCase() !== planned.predictedToken.toLowerCase() || receipt.marketCount !== plan.markets.length || receipt.tokenOut.length !== plan.buys.length || receipt.quoteSpent.length !== plan.buys.length) throw new LifecyclePlanningError("MISSING_BUY_OUTPUTS", "Diagnostic receipt differs from the complete committed launch and ordered buys", simulation);
52
+ const factor = BigInt(10000 - bps);
53
+ return { ...plan, buys: plan.buys.map((buy, index) => {
54
+ const output = receipt.tokenOut[index]!;
55
+ const minTokenOut = output * factor / 10000n;
56
+ if (receipt.quoteSpent[index]! > buy.quoteAmountIn || output < buy.minTokenOut || minTokenOut <= 0n) throw new LifecyclePlanningError("INVALID_BUY_OUTPUT", "Each actual buy must satisfy its budget and produce a positive protected minimum", simulation);
57
+ return { ...buy, minTokenOut };
58
+ }) };
59
+ }
@@ -0,0 +1,11 @@
1
+ import type { Hex } from "viem";
2
+
3
+ /**
4
+ * Exact config6/V2 constructor creation code from pool-launch-v1/20261008T000141Z-e174ce6.
5
+ * Source commit: e174ce695c7010f50ca9211b07b9f178c990beac.
6
+ * Artifact SHA-256: 39d526e5531c1d529e40687acade47cea8a028248877ef930c038a57dfe7e145.
7
+ * Creation-code keccak256: 0x11c4c7b1f265ed708b7d53ab828c89d237ca821333daa808f1913986c6f8f1ab.
8
+ * Creation/runtime sizes: 28946/24035 bytes; the exact V2 arguments add 640 bytes.
9
+ * Constructor arguments are appended per market, never frozen into this artifact.
10
+ */
11
+ export const fixedFeePoolHookV1CreationCode: Hex = "0x610260604052348015610010575f5ffd5b5060405161711238038061711283398101604081905261002f91610c92565b806100398161045c565b611afc613fff30161461005f57604051632a96f9e160e21b815260040160405180910390fd5b80516001600160a01b039081166080908152602080840151831660a0908152604080860151851660c0526060860151851660e0529285015184166101005284015190921661012052516100b491839101610e17565b60408051601f1981840301815291905280516020918201206101609081526102408301516101809081526101208401516001600160a01b039081166101a05261026085015163ffffffff9081166101c052918501519285015166ffffff00000000941b939093169116176101e05260a082015160c08301519082169116105f81610142578260a00151610148565b8260c001515b90505f8261015a578360c00151610160565b8360a001515b6001600160a01b03808416610200819052908216610220819052851515610240526040805160a081018252928352602083019190915260e087015162ffffff169082015261010086015160020b60608201523060808201529091506101c68160a0902090565b6101405280515f80546001600160a01b03199081166001600160a01b03938416178255602080850151600180546040808901516060808b0151958a166001600160b81b031990941693909317600160a01b62ffffff928316021762ffffff60b81b1916600160b81b91909516029390931782556080808901516002805490971690891617909555825161012081018452958652938b015186169285019290925260c08a0151909416938301939093526101a088015191929083019160ff169081111561029457610294610fbc565b60018111156102a5576102a5610fbc565b815261014087015162ffffff166020808301919091526101c088015160ff166040808401919091526101e08901516001600160a01b039081166060808601919091526102008b0151151560808601526102208b015160a0909501949094528451600380549183166001600160a01b031992831617815593860151600480549184169183169190911790559185015160058054919092169281168317825593850151929390916001600160a81b031990911617600160a01b83600181111561036e5761036e610fbc565b0217905550608082015160028201805460a085015160ff16600160c01b0260ff60c01b1962ffffff909416600160a81b029390931663ffffffff60a81b199091161791909117905560c082015160038201805460e08501511515600160a01b026001600160a81b03199091166001600160a01b0390931692909217919091179055610100909101516004909101556102208501515f90819061040f90610b11565b6008805461ffff909216600160e01b0261ffff60e01b1962ffffff909416600160c81b029390931664ffffffffff60c81b19909216919091179190911790555061102d9650505050505050565b80516001600160a01b03163b1580610480575060208101516001600160a01b03163b155b80610497575060408101516001600160a01b03163b155b806104ae575060608101516001600160a01b03163b155b806104c5575060808101516001600160a01b03163b155b806104dc575060c08101516001600160a01b03163b155b806104f2575060a08101516001600160a01b0316155b8061051657508060c001516001600160a01b03168160a001516001600160a01b0316145b8061052d575060a08101516001600160a01b031630145b80610551575080606001516001600160a01b031681602001516001600160a01b0316145b806105745750805f01516001600160a01b031681602001516001600160a01b0316145b8061058b575060208101516001600160a01b031630145b806105a2575060608101516001600160a01b031630145b806105b9575060808101516001600160a01b031630145b806105dc5750805f01516001600160a01b031681608001516001600160a01b0316145b806105f75750620f424062ffffff168160e0015162ffffff16115b8061060d5750600160020b81610100015160020b125b806106245750610100810151617fff60029190910b135b8061064a57506401000276a36001600160a01b03168161012001516001600160a01b0316105b80610680575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b03168161012001516001600160a01b031610155b8061069c5750620f424062ffffff1681610140015162ffffff16115b806106ba575080610140015162ffffff1681610160015162ffffff16115b806106d05750600160ff16816101a0015160ff16115b8061070757506101c081015160ff161580159061070757506004816101c0015160ff1610806107075750600a816101c0015160ff16115b8061073057506101c081015160ff161580159061073057506101e08101516001600160a01b0316155b8061074857506101e08101516001600160a01b031630145b8061076c5750805f01516001600160a01b0316816101e001516001600160a01b0316145b80610791575080608001516001600160a01b0316816101e001516001600160a01b0316145b8061079f5750610240810151155b806107b3575061026081015163ffffffff16155b806107c95750602081610260015163ffffffff16115b156107e75760405163c52a9bd360e01b815260040160405180910390fd5b5f816020015190505f8260800151905082606001516001600160a01b0316826001600160a01b031663f2f4eb266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610841573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108659190610fd0565b6001600160a01b03161415806108ef5750825f01516001600160a01b0316826001600160a01b031663dc4c90d36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e39190610fd0565b6001600160a01b031614155b8061096f575082604001516001600160a01b0316826001600160a01b031663c7f7fb906040518163ffffffff1660e01b8152600401602060405180830381865afa15801561093f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109639190610fd0565b6001600160a01b031614155b806109ef575082608001516001600160a01b0316826001600160a01b031663d7b96d4e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e39190610fd0565b6001600160a01b031614155b80610a6f575082602001516001600160a01b0316816001600160a01b03166316eebd1e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a639190610fd0565b6001600160a01b031614155b80610aee5750825f01516001600160a01b0316816001600160a01b031663dc4c90d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610abe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae29190610fd0565b6001600160a01b031614155b15610b0c5760405163c52a9bd360e01b815260040160405180910390fd5b505050565b5f5f60c0516001600160a01b031663deee4135846040518263ffffffff1660e01b8152600401610b4391815260200190565b6040805180830381865afa158015610b5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190610ff2565b909250905062ffffff82161580610b9f5750620d89e862ffffff8316115b80610bae575060028161ffff16105b80610bbe575061100061ffff8216115b15610bdc5760405163c52a9bd360e01b815260040160405180910390fd5b915091565b60405161028081016001600160401b0381118282101715610c1057634e487b7160e01b5f52604160045260245ffd5b60405290565b6001600160a01b0381168114610c2a575f5ffd5b50565b8051610c3881610c16565b919050565b805162ffffff81168114610c38575f5ffd5b8051600281900b8114610c38575f5ffd5b805163ffffffff81168114610c38575f5ffd5b805160ff81168114610c38575f5ffd5b80518015158114610c38575f5ffd5b5f610280828403128015610ca4575f5ffd5b50610cad610be1565b610cb683610c2d565b8152610cc460208401610c2d565b6020820152610cd560408401610c2d565b6040820152610ce660608401610c2d565b6060820152610cf760808401610c2d565b6080820152610d0860a08401610c2d565b60a0820152610d1960c08401610c2d565b60c0820152610d2a60e08401610c3d565b60e0820152610d3c6101008401610c4f565b610100820152610d4f6101208401610c2d565b610120820152610d626101408401610c3d565b610140820152610d756101608401610c3d565b610160820152610d886101808401610c60565b610180820152610d9b6101a08401610c73565b6101a0820152610dae6101c08401610c73565b6101c0820152610dc16101e08401610c2d565b6101e0820152610dd46102008401610c83565b61020082015261022083810151908201526102408084015190820152610dfd6102608401610c60565b6102608201529392505050565b6001600160a01b03169052565b5f61028082019050610e2a828451610e0a565b6020830151610e3c6020840182610e0a565b506040830151610e4f6040840182610e0a565b506060830151610e626060840182610e0a565b506080830151610e756080840182610e0a565b5060a0830151610e8860a0840182610e0a565b5060c0830151610e9b60c0840182610e0a565b5060e0830151610eb260e084018262ffffff169052565b50610100830151610ec961010084018260020b9052565b50610120830151610ede610120840182610e0a565b50610140830151610ef761014084018262ffffff169052565b50610160830151610f1061016084018262ffffff169052565b50610180830151610f2a61018084018263ffffffff169052565b506101a0830151610f416101a084018260ff169052565b506101c0830151610f586101c084018260ff169052565b506101e0830151610f6d6101e0840182610e0a565b50610200830151610f8361020084018215159052565b50610220830151610220830152610240830151610240830152610260830151610fb561026084018263ffffffff169052565b5092915050565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215610fe0575f5ffd5b8151610feb81610c16565b9392505050565b5f5f60408385031215611003575f5ffd5b61100c83610c3d565b9150602083015161ffff81168114611022575f5ffd5b809150509250929050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051610200516102205161024051615de361132f5f395f81816113d80152613e3401525f81816122c0015281816123a801528181612eb6015261300f01525f818161227d0152818161236d01528181612e600152612fd301525f818161044d015261056d01525f818161052b0152612a4601525f818161049c015261134501525f61067401525f6103bf01525f8181610324015281816108e301528181610d3b015281816110cf01528181611479015281816116cc01528181611b0701528181611f440152818161200e015281816121b2015281816123420152818161290c0152818161299601528181612c1a01528181612ca901528181612d3501528181612dc6015281816134890152818161360e0152818161368901526139dc01525f8181610803015281816130c901528181613fc5015261413001525f818161050401528181610d0301528181610fa10152818161111d0152818161205c015281816120c901528181612133015281816123ee0152818161259e0152818161266e015281816127f401528181612f5b015281816134af0152818161355501526135eb01525f81816107bb015281816131640152613e9f01525f818161062d015261119f01525f818161029e0152818161086d01528181610bda0152818161130801528181612b7201528181613f490152613f8701525f81816106b701528181610a5801528181610aee01528181610e98015281816110ae0152818161127301528181611505015281816116ab0152818161173f015281816119f101528181611c5e01528181611e7f015281816121d70152818161224b01528181612321015281816126050152818161275901528181612ad601528181612f97015281816136ae015281816136e1015281816138100152818161389f0152818161391c0152818161402301528181614267015281816147d401528181614863015281816148e0015281816149a8015281816149f30152614a600152615de35ff3fe608060405234801561000f575f5ffd5b5060043610610218575f3560e01c80630268e2931461021c5780630885f7321461023157806321d0ee701461025a578063259982e5146102865780632b20e39714610299578063359b4f30146102d85780633e451d6a146102f957806342ea83e01461030c57806347f8496c1461031f57806350fb3a3a146103465780635524d54814610359578063575e24b41461037c5780635955d09a146103ba57806360f89f2e146103e1578063654f631c146103f45780636fe7e6eb14610425578063747a68cd146104385780637dbeb94e1461044b578063847211a6146104845780638bc801c11461049757806391dd7346146104be578063921b0bed146104de5780639759164a146104ff5780639e5fe06214610526578063a3f4bac714610562578063a86911141461056b578063aae49d7014610591578063ac4e40541461059b578063ac5555aa146105a4578063b47b2fb1146105b7578063b6a8b0fa146105ed578063c5c51dca14610600578063c5fbb29814610615578063c7f7fb9014610628578063ca266dfe1461064f578063ce1b8e4f1461066f578063d2be662514610696578063dc4c90d3146106b2578063dd71cea8146106d9578063e1b4af6914610726578063e2e65ec114610739578063f11457c71461074c578063f2f4eb26146107b6578063f399150c146107dd578063fc0c546a146107fe578063fd5b6d5b14610825575b5f5ffd5b61022f61022a36600461507a565b610838565b005b61024461023f366004615094565b610937565b60405161025191906150ec565b60405180910390f35b61026d6102683660046151e7565b610a4c565b6040516001600160e01b03199091168152602001610251565b61026d6102943660046151e7565b610ae2565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610251565b6102eb6102e6366004615267565b610b77565b604051908152602001610251565b6102eb610307366004615295565b610b94565b61022f61031a3660046152b0565b610ba5565b6102eb7f000000000000000000000000000000000000000000000000000000000000000081565b61022f6103543660046152fe565b610d98565b61036c610367366004615094565b610e73565b6040519015158152602001610251565b61038f61038a366004615331565b610e8a565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610251565b6102eb7f000000000000000000000000000000000000000000000000000000000000000081565b61022f6103ef36600461538a565b61109f565b610407610402366004615094565b61117d565b6040805162ffffff909316835261ffff909116602083015201610251565b61026d6104333660046153df565b611267565b6102eb610446366004615295565b6114d0565b7f000000000000000000000000000000000000000000000000000000000000000060201c5b60405162ffffff9091168152602001610251565b6102eb610492366004615094565b6114e4565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b6104d16104cc366004615438565b6114f8565b6040516102519190615476565b6104f16104ec3660046154ab565b611625565b604051610251929190615523565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b61054d7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610251565b6102c0613fff81565b7f000000000000000000000000000000000000000000000000000000000000000061054d565b610470620f424081565b6102c0611afc81565b61036c6105b2366004615094565b611716565b6105ca6105c53660046155af565b611732565b604080516001600160e01b03199093168352600f9190910b602083015201610251565b61026d6105fb36600461562f565b6119e5565b610608611a99565b6040516102519190615688565b6102eb610623366004615094565b611b48565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b61066261065d366004615094565b611b6a565b60405161025191906156ca565b6102eb7f000000000000000000000000000000000000000000000000000000000000000081565b61069f61100081565b60405161ffff9091168152602001610251565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106e7366004615715565b611bf4565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091169183019190915215156060820152608001610251565b61026d61073436600461562f565b611c52565b6102eb610747366004615267565b611d06565b61075f61075a366004615094565b611d24565b6040805161ffff998a168152978916602089015295881695870195909552600293840b60608701526001600160401b039283166080870152911660a0850152900b60c083015290911660e082015261010001610251565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b6107f06107eb36600461507a565b611d99565b604051610251929190615735565b6102c07f000000000000000000000000000000000000000000000000000000000000000081565b6102eb610833366004615267565b611fad565b3068929eee149b4bd2126854036108565763ab143c065f526004601cfd5b3068929eee149b4bd2126855336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108aa576040516282b42960e81b815260040160405180910390fd5b6108b381611fcb565b6201001154156108d6576040516304c7cf6760e51b815260040160405180910390fd5b42620100118190556040517f0000000000000000000000000000000000000000000000000000000000000000907ff1bac50d2c6f6c83cb8ff6fac488b03adc5fb0cc9fae30db2077588d5d9e5fbd905f90a33868929eee149b4bd212685550565b60408051610120810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101919091526109888261200c565b6040805161012081018252600380546001600160a01b039081168352600454811660208401526005549081169383019390935290916060830190600160a01b900460ff1660018111156109dd576109dd6150b8565b60018111156109ee576109ee6150b8565b8152600282015462ffffff600160a81b820416602083015260ff600160c01b9091048116604083015260038301546001600160a01b0381166060840152600160a01b9004161515608082015260049091015460a09091015292915050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a95576040516282b42960e81b815260040160405180910390fd5b3068929eee149b4bd212685403610ab35763ab143c065f526004601cfd5b610abc85611fcb565b610ac6868561204b565b610acf84612186565b5063021d0ee760e41b5b95945050505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2b576040516282b42960e81b815260040160405180910390fd5b3068929eee149b4bd212685403610b495763ab143c065f526004601cfd5b610b5285611fcb565b610b5c868561204b565b610b6584612186565b5063259982e560e01b95945050505050565b5f610b818361200c565b610b8a8261227a565b5490505b92915050565b5f610b9e8261227a565b5492915050565b3068929eee149b4bd212685403610bc35763ab143c065f526004601cfd5b3068929eee149b4bd2126855336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c17576040516282b42960e81b815260040160405180910390fd5b610c38610c33610c2c368590038501856157bf565b60a0902090565b61200c565b620100105460ff1615610c5e57604051630ea075bf60e21b815260040160405180910390fd5b610c6781612319565b5f5f610c7783610100013561117d565b6008549193509150600283810b600160c81b909204900b141580610cab575060085461ffff828116600160e01b9092041614155b15610cc95760405163c52a9bd360e01b815260040160405180910390fd5b610cd66020840184615295565b600380546001600160a01b0319166001600160a01b0392831617905562010010805460ff191660011790557f000000000000000000000000000000000000000000000000000000000000000016610d306020850185615295565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000007ffafdbdd88ac30f0aa936e576be61816ea751908540523fa81b80c4a406ad7bec60405160405180910390a450503868929eee149b4bd21268555050565b3068929eee149b4bd212685403610db65763ab143c065f526004601cfd5b610dbf8261200c565b6008805461ffff600160e01b90910481169083161115610de9578054600160e01b900461ffff1691505b8054600160201b900461ffff165f610e036009838661328f565b835461ffff60201b1916600160201b61ffff838116918202929092178655919250831614610e6c576040805161ffff80851682528316602082015286917f04f592d3848fffa22f73de92a2fd8da837e6d597f468af77c6fc619b478362ae910160405180910390a25b5050505050565b5f610e7d8261200c565b5050620100105460ff1690565b5f8080336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ed5576040516282b42960e81b815260040160405180910390fd5b3068929eee149b4bd212685403610ef35763ab143c065f526004601cfd5b620100135460ff1615610f195760405163558a1e0360e11b815260040160405180910390fd5b610f2287611fcb565b60035f610f2f8989613322565b60028301549091505f90600160a81b900462ffffff1615801590610f5a5750610f5a828b8b86613360565b15610f8857610f85610f6f8a602001356133e4565b6002850154600160a81b900462ffffff1661341f565b90505b6040516364b3357d60e11b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c9666afa90610fda908e908e9087906004016158ca565b602060405180830381865afa158015610ff5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110199190615921565b90506110558b61102c60208d018d615938565b611036575f611038565b825b61104560208e018e615938565b61104f578361347b565b5f61347b565b61105d61366c565b811561107f5761107f83838660020160189054906101000a900460ff16613706565b506315d7892d60e21b955060801b93505f92505050955095509592505050565b6110a883611fcb565b5f6110f37f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613a4b565b5050600354919250506001600160a01b0384811691161415806111485750816001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614155b8061115a57506001600160a01b038116155b156111775760405162820f3560e61b815260040160405180910390fd5b50505050565b60405163deee413560e01b8152600481018290525f9081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063deee4135906024016040805180830381865afa1580156111e3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112079190615953565b909250905062ffffff821615806112255750620d89e862ffffff8316115b80611234575060028161ffff16105b80611244575061100061ffff8216115b156112625760405163c52a9bd360e01b815260040160405180910390fd5b915091565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112b0576040516282b42960e81b815260040160405180910390fd5b3068929eee149b4bd2126854036112ce5763ab143c065f526004601cfd5b6112e3610c33610c2c368790038701876157bf565b620100105460ff16158061130057506201001054610100900460ff165b8061133d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8061137a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b156113975760405162820f3560e61b815260040160405180910390fd5b60086113a4600942613afd565b825465ffffffff00001916600160201b61ffff9283160263ffff00001916176201000092909116919091021781556113fc837f0000000000000000000000000000000000000000000000000000000000000000613b3d565b8154426001600160401b03908116600160881b02600160881b600160c81b03194392909216600160481b02600160481b600160881b031962ffffff95909516600160301b0294909416600160301b600160881b031990931692909217929092179190911617815562010010805461ff0019166101001790556040517f0000000000000000000000000000000000000000000000000000000000000000907febcc9ffea17e08841d7588f2ecd87720e1cfb444bb3b5e662c4a5005c3c94ab2905f90a250636fe7e6eb60e01b95945050505050565b5f6114da8261227a565b6003015492915050565b5f6114ee8261200c565b5050620100115490565b6060336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611542576040516282b42960e81b815260040160405180910390fd5b6201001254158061156e575062010012548383604051611563929190615980565b604051809103902014155b1561158c5760405163f7a632f560e01b815260040160405180910390fd5b5f620100128190556115a0838501856157bf565b90506115b0610c338260a0902090565b6201001054610100900460ff166115d95760405162820f3560e61b815260040160405180910390fd5b5f6115e6825f0151613b52565b90505f6115f68360200151613b52565b9050818160405160200161160b929190615735565b604051602081830303815290604052935050505092915050565b6060806116318561200c565b6008805462010000900461ffff165f0361165e576040516329d9e10560e01b815260040160405180910390fd5b611709428686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250508554600160301b810460020b925061ffff1690506116f07f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613beb565b8654600995949392919062010000900461ffff16613c6e565b9250925050935093915050565b5f6117208261200c565b50506201001054610100900460ff1690565b5f80336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461177c576040516282b42960e81b815260040160405180910390fd5b3068929eee149b4bd21268540361179a5763ab143c065f526004601cfd5b620100135460ff16156117c05760405163558a1e0360e11b815260040160405180910390fd5b6117c987611fcb565b6117d4875f5f61347b565b60035f6117e18989613322565b90505f6117f160208b018b615295565b6001600160a01b0316826001600160a01b03161461181b5761181660208b018b615295565b61182b565b61182b60408b0160208c01615295565b6002840154909150600160a81b900462ffffff16158015906118545750611854828b8b86613360565b156118fd575f61188061186a8b602001356133e4565b6002860154600160a81b900462ffffff1661341f565b905080156118fb575f61189660208d018d615295565b6001600160a01b0316846001600160a01b0316146118bd576118b88a600f0b90565b6118c7565b6118c78a60801d90565b90506118d78260208d01356159a3565b81600f0b146118f95760405163161b48a960e21b815260040160405180910390fd5b505b505b6002830154600160a81b900462ffffff1615806119235750611921818b8b86613360565b155b1561193e575063b47b2fb160e01b93505f92506119da915050565b5f61194c60208c018c615295565b6001600160a01b0316826001600160a01b0316146119735761196e89600f0b90565b61197d565b61197d8960801d90565b90505f6119a561198f83600f0b6133e4565b6002870154600160a81b900462ffffff1661341f565b905080156119c9576119c983828760020160189054906101000a900460ff16613706565b63b47b2fb160e01b96509450505050505b965096945050505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a2e576040516282b42960e81b815260040160405180910390fd5b3068929eee149b4bd212685403611a4c5763ab143c065f526004601cfd5b620100135460ff1615611a725760405163558a1e0360e11b815260040160405180910390fd5b611a7b86611fcb565b611a8686868661347b565b50635b54587d60e11b9695505050505050565b620100105460609060ff16611aae575f611ab1565b60015b60ff166001600160401b03811115611acb57611acb615743565b604051908082528060200260200182016040528015611af4578160200160208202803683370190505b50620100105490915060ff1615611b45577f0000000000000000000000000000000000000000000000000000000000000000815f81518110611b3857611b386159ca565b6020026020010181815250505b90565b5f611b528261200c565b5050600854600160881b90046001600160401b031690565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152611b9d8261200c565b50506040805160a0810182525f546001600160a01b039081168252600154808216602084015262ffffff600160a01b82041693830193909352600160b81b909204600290810b606083015254909116608082015290565b5f5f5f5f611c018661200c565b5f60098661ffff8110611c1657611c166159ca565b015463ffffffff811698600160201b820460060b9850600160581b82046001600160a01b03169750600160f81b90910460ff1695509350505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c9b576040516282b42960e81b815260040160405180910390fd5b620100135460ff1615611cc15760405163558a1e0360e11b815260040160405180910390fd5b3068929eee149b4bd212685403611cdf5763ab143c065f526004601cfd5b611ce886611fcb565b611cf3865f5f61347b565b5063e1b4af6960e01b9695505050505050565b5f611d108361200c565b611d198261227a565b600101549392505050565b5f5f5f5f5f5f5f5f611d358961200c565b505060085461ffff8082169962010000830482169950600160201b830482169850600160301b8304600290810b98506001600160401b03600160481b850481169850600160881b8504169650600160c81b8404900b9450600160e01b909204169150565b5f5f3068929eee149b4bd212685403611db95763ab143c065f526004601cfd5b3068929eee149b4bd2126855620100135460ff1615611deb5760405163558a1e0360e11b815260040160405180910390fd5b611df483611fcb565b6003546001600160a01b03163314611e1e576040516282b42960e81b815260040160405180910390fd5b6201000854151580611e3357506201000c5415155b15611f38575f83604051602001611e4a91906159de565b60408051601f19818403018152908290528051602082012062010012556348c8949160e01b825291505f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906348c8949190611eb4908590600401615476565b5f604051808303815f875af1158015611ecf573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef691908101906159ec565b620100125490915015611f1c5760405163f7a632f560e01b815260040160405180910390fd5b80806020019051810190611f309190615a7e565b909450925050505b336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000007f4a93be8d0a356d70b54fdf016f78a2ed8b8a3c420952848eb4f4b2c4546405b68484604051611f94929190615735565b60405180910390a33868929eee149b4bd2126855915091565b5f611fb78361200c565b611fc08261227a565b600201549392505050565b611fe0610c33610c2c368490038401846157bf565b6201001054610100900460ff166120095760405162820f3560e61b815260040160405180910390fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081146120095760405162820f3560e61b815260040160405180910390fd5b620100135460ff16801561209e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614158061209e5750604081013515155b156120bc5760405163558a1e0360e11b815260040160405180910390fd5b62010011545f0361211d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161461211957604051637cd5a0ad60e01b815260040160405180910390fd5b5050565b600654600160a01b900460ff16801561216857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b1561211957604051630af9fb3360e21b815260040160405180910390fd5b604081013515806121a85750600854600160481b90046001600160401b031643145b156121b05750565b7f00000000000000000000000000000000000000000000000000000000000000005f6121fc7f000000000000000000000000000000000000000000000000000000000000000083613a4b565b509092506122109150506020840184615aa0565b60020b8160020b1280612238575061222e6040840160208501615aa0565b60020b8160020b12155b1561224257505050565b612275816122707f000000000000000000000000000000000000000000000000000000000000000085613beb565b613dbe565b505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036122be575062010008919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361230157506201000c919050565b60405162820f3560e61b815260040160405180910390fd5b60035f6123667f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613a4b565b50505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b5f14806123cb57506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b155b806123de57506001600160a01b03811615155b8061242a57506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661241e6040850160208601615295565b6001600160a01b031614155b8061245a575060028201546001600160a01b031661244e6060850160408601615295565b6001600160a01b031614155b806124a457506002820154600160a01b900460ff166001811115612480576124806150b8565b6124906080850160608601615abb565b60018111156124a1576124a16150b8565b14155b806124d357506002820154600160a81b900462ffffff166124cb60a0850160808601615ad9565b62ffffff1614155b806124fe57506002820154600160c01b900460ff166124f860c0850160a08601615af4565b60ff1614155b8061252e575060038201546001600160a01b031661252260e0850160c08601615295565b6001600160a01b031614155b8061255b57506003820154600160a01b900460ff161515612556610100850160e08601615938565b151514155b8061256f5750816004015483610100013514155b8061258e57506125826020840184615295565b6001600160a01b03163b155b806125d657506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166125cb6020850185615295565b6001600160a01b0316145b806125f55750306125ea6020850185615295565b6001600160a01b0316145b8061263d57506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166126326020850185615295565b6001600160a01b0316145b1561265b5760405163c52a9bd360e01b815260040160405180910390fd5b5f6126696020850185615295565b90505f7f000000000000000000000000000000000000000000000000000000000000000090505f826001600160a01b031663365a86fc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126f09190615b14565b90505f836001600160a01b03166371a973056040518163ffffffff1660e01b81526004015f60405180830381865afa15801561272e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127559190810190615b2f565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031663dc4c90d36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e19190615b14565b6001600160a01b031614158061288857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031663d7b96d4e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612858573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287c9190615b14565b6001600160a01b031614155b806129045750306001600160a01b0316846001600160a01b031663cc41ddce6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f89190615b14565b6001600160a01b031614155b8061298e57507f0000000000000000000000000000000000000000000000000000000000000000846001600160a01b0316633e0dc34e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612967573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298b9190615921565b14155b80612a3e57507f0000000000000000000000000000000000000000000000000000000000000000846001600160a01b031663182148ef6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156129f1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a159190615bd6565b604051602001612a2591906156ca565b6040516020818303038152906040528051906020012014155b80612ace57507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16846001600160a01b0316639e5fe0626040518163ffffffff1660e01b8152600401602060405180830381865afa158015612aa7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612acb9190615921565b14155b80612b6a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031663dc4c90d36040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5e9190615b14565b6001600160a01b031614155b80612c0657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03166316eebd1e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bfa9190615b14565b6001600160a01b031614155b80612c94575060405162e568cf60e71b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b038416906372b4678090602401602060405180830381865afa158015612c6d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c919190615921565b15155b80612d205750604051630323715f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03841690630646e2be90602401602060405180830381865afa158015612cfc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d209190615c44565b80612db15750604051635c0af38360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b03851690635c0af38390602401602060405180830381865afa158015612d8a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dae9190615921565b14155b80612e4b5750604051630961712f60e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201525f906001600160a01b03851690630961712f90602401602060405180830381865afa158015612e1b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3f9190615b14565b6001600160a01b031614155b80612e5857508051600214155b80612eae57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815f81518110612e9a57612e9a6159ca565b60200260200101516001600160a01b031614155b80612f0557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681600181518110612ef157612ef16159ca565b60200260200101516001600160a01b031614155b80612f1857506001600160a01b0382163b155b80612f2b57506001600160a01b03821630145b80612f535750612f3e6020880188615295565b6001600160a01b0316826001600160a01b0316145b80612f8f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b80612fcb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b8061300757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b8061304357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b8061306e57506001600160a01b03821661306360e0890160c08a01615295565b6001600160a01b0316145b806130a557506130816020880188615295565b6001600160a01b031661309a60e0890160c08a01615295565b6001600160a01b0316145b156130c35760405163c52a9bd360e01b815260040160405180910390fd5b5f8290507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663a28a4d866040518163ffffffff1660e01b8152600401602060405180830381865afa15801561312d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131519190615b14565b6001600160a01b03161415806131f857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316632b507df86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131c8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ec9190615b14565b6001600160a01b031614155b8061325e5750806001600160a01b031663b3f05b976040518163ffffffff1660e01b8152600401602060405180830381865afa15801561323a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061325e9190615c44565b1561327c5760405163c52a9bd360e01b815260040160405180910390fd5b61328583613e9d565b5050505050505050565b5f8261ffff165f036132b4576040516329d9e10560e01b815260040160405180910390fd5b8261ffff168261ffff16116132ca57508161331b565b825b8261ffff168161ffff161015613316576001858261ffff1661ffff81106132f5576132f56159ca565b01805463ffffffff191663ffffffff929092169190911790556001016132cc565b508190505b9392505050565b5f6133306020830183615938565b15155f602084013512146133535761334e6040840160208501615295565b61331b565b61331b6020840184615295565b5f8060016002840154600160a01b900460ff166001811115613384576133846150b8565b146133bc576133966020850185615938565b6133af576133aa6040860160208701615295565b6133cb565b6133aa6020860186615295565b60028301546001600160a01b03165b6001600160a01b03878116911614915050949350505050565b5f600160ff1b820361340957604051637e2df70960e11b815260040160405180910390fd5b5f82126134165781610b8e565b610b8e82615c5f565b5f806134348462ffffff8516620f42406141b1565b9050613440848461423f565b915080821180613456575060016001607f1b0382115b1561347457604051637e2df70960e11b815260040160405180910390fd5b5092915050565b60405162e568cf60e71b81527f000000000000000000000000000000000000000000000000000000000000000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906372b4678090602401602060405180830381865afa1580156134fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135209190615921565b5f0361352b57505050565b62010013805460ff191660011790556040516381f8a9d160e01b81525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381f8a9d19061358e90889088908890600401615c79565b60408051808303815f875af11580156135a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135cd9190615a7e565b62010013805460ff1916905560405191935091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016907f0000000000000000000000000000000000000000000000000000000000000000907fa30ca6140dfb2cac1c1021c5303d8dc7de0cd4db47221fb3ad068fac7ef8185e9061365d9086908690615735565b60405180910390a35050505050565b600854600160481b90046001600160401b0316430361368757565b7f00000000000000000000000000000000000000000000000000000000000000005f6136d37f000000000000000000000000000000000000000000000000000000000000000083613a4b565b5050915050612119816122707f000000000000000000000000000000000000000000000000000000000000000085613beb565b3068929eee149b4bd2126854036137245763ab143c065f526004601cfd5b3068929eee149b4bd2126855825f61373b8261227a565b90505f8160020154825f01546137519190615c98565b90506137648160016001607f1b03615c98565b85111561377657613776868383614253565b5f60ff8516156137a957606461378f60ff871688615cbf565b61379a90607d615cd2565b6137a49190615cbf565b6137ab565b5f5b905085835f015f8282546137bf9190615ce9565b9250508190555080836001015f8282546137d99190615ce9565b9250508190555085836003015f8282546137f39190615ce9565b9091555050604051627eeac760e11b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169062fdd58e906138469030908990600401615cfc565b602060405180830381865afa158015613861573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138859190615921565b604051630ab714fb60e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063156e29f6906138d890309089908c90600401615d16565b5f604051808303815f87803b1580156138ef575f5ffd5b505af1158015613901573d5f5f3e3d5ffd5b5050604051627eeac760e11b81525f92506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915062fdd58e906139539030908a90600401615cfc565b602060405180830381865afa15801561396e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139929190615921565b9050818110806139a457508782820314155b806139b25750846003015481105b156139d05760405163104eed1d60e31b815260040160405180910390fd5b856001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000007f2616e25de5abcc9e6a698b140fb6c92f55ace21b7a57f76172f195dbbf693af68a86604051613a2c929190615735565b60405180910390a35050505050503868929eee149b4bd2126855505050565b5f5f5f5f5f613a59866142f7565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015613aa1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ac59190615921565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b6040805160808101825263ffffffff83168082525f602083018190529282019290925260016060909101819052600160f81b9091178355805b9250929050565b5f81613b49578261331b565b61331b83615d3a565b5f8181613b5e8261227a565b80549091505f819003613b7557505f949350505050565b613b8f8583846002015484613b8a9190615c98565b614253565b6001820180545f808555918290556002840191909155613baf8183615c98565b600654909550613bca9085906001600160a01b031683614333565b600354613be29085906001600160a01b031687614333565b50505050919050565b5f5f613bf6836142f7565b90505f613c04600383615ce9565b604051631e2eaeaf60e01b8152600481018290529091506001600160a01b03861690631e2eaeaf90602401602060405180830381865afa158015613c4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad99190615921565b6060808261ffff165f03613c95576040516329d9e10560e01b815260040160405180910390fd5b86516001600160401b03811115613cae57613cae615743565b604051908082528060200260200182016040528015613cd7578160200160208202803683370190505b50915086516001600160401b03811115613cf357613cf3615743565b604051908082528060200260200182016040528015613d1c578160200160208202803683370190505b5090505f5b8751811015613db157613d528a8a8a8481518110613d4157613d416159ca565b60200260200101518a8a8a8a6143cc565b848381518110613d6457613d646159ca565b60200260200101848481518110613d7d57613d7d6159ca565b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b8152505050806001019050613d21565b5097509795505050505050565b60088054613df59060099061ffff808216914291600160301b820460020b918891620100008204811691600160201b900416614578565b825463ffffffff19166201000061ffff9283160261ffff191617911617808255613e5890600160301b8104600290810b918691600160c81b909104900b7f00000000000000000000000000000000000000000000000000000000000000006146f4565b8154600160301b600160881b031916600160301b62ffffff9290921691909102600160481b600160881b03191617600160481b436001600160401b0316021790555050565b7f00000000000000000000000000000000000000000000000000000000000000005f613ed68263086fce0d60e11b83600461016061475d565b90505f80806005905080604085015111602085015160201c1715613ef8575f5ffd5b6101408401606085015b81811015613f2057805160a01c15613f18575f5ffd5b602001613f02565b505083516020850151909350915050811580613f4157506001604084015114155b80613f7f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613f7c846060015190565b14155b80613fbd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613fba846080015190565b14155b80613ffb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613ff88460a0015190565b14155b8061401b57506005546001600160a01b03166140188460c0015190565b14155b8061405957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166140568460e0015190565b14155b15614076576040516282b42960e81b815260040160405180910390fd5b61408d84636373dff160e11b8460246101c061475d565b92505f600190505f600590508060a0860151118260808701511117604086015160a01c17156140ba575f5ffd5b610120850160c086015b818110156140e257805160a01c156140da575f5ffd5b6020016140c4565b50506101a0850161012086015b8181101561410d57805160201c15614105575f5ffd5b6020016140ef565b5050845184925090501415806141285750600160a084015114155b8061416657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166141638460c0015190565b14155b806141845750846001600160a01b03166141818460e0015190565b14155b8061419457506101408301518110155b15610e6c576040516282b42960e81b815260040160405180910390fd5b82820281838583041485151702614238575f198385098181108201900382848609835f0384168285116141eb5763ae47f7025f526004601cfd5b93849004938382119092035f83900383900460010102920304176002600383028118808402820302808402820302808402820302808402820302808402820302808402909103020261331b565b0492915050565b5f61331b8362ffffff8416620f42406141b1565b805f0361425f57505050565b828161428b827f0000000000000000000000000000000000000000000000000000000000000000614792565b10156142aa576040516365169c1d60e01b815260040160405180910390fd5b81836003015f8282546142bd9190615c98565b909155506142ce90508184846147bc565b6142d9843084614994565b81836002015f8282546142ec9190615ce9565b909155505050505050565b6040515f90614316908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b805f0361433f57505050565b5f61434a8430614792565b90505f6143578585614792565b9050614364858585614ad8565b5f61436f8630614792565b90505f61437c8787614792565b90508382118061438e57508482850314155b8061439857508281105b806143a557508483820314155b156143c357604051631dc418c360e31b815260040160405180910390fd5b50505050505050565b5f5f8663ffffffff165f03614472575f898661ffff1661ffff81106143f3576143f36159ca565b60408051608081018252919092015463ffffffff808216808452600160201b830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461445e5761445b818a8988614b22565b90505b80602001518160400151925092505061456c565b8688035f806144868c8c858c8c8c8c614bc8565b91509150815f015163ffffffff168363ffffffff16036144b657816020015182604001519450945050505061456c565b805f015163ffffffff168363ffffffff16036144e257806020015181604001519450945050505061456c565b5f825f0151825f01510390505f835f0151850390508063ffffffff168263ffffffff1660060b856020015185602001510360060b8161452357614523615cab565b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b0316028161455b5761455b615cab565b048560400151019650965050505050505b97509795505050505050565b5f5f5f898961ffff1661ffff8110614592576145926159ca565b60408051608081018252919092015463ffffffff808216808452600160201b830460060b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff1615156060830152909250891690036145fb578885925092505061456c565b8461ffff168461ffff161180156146235750614618600186615d5a565b61ffff168961ffff16145b61462d578461462f565b835b91508161463d8a6001615d74565b6146479190615d8e565b925061465581898989614b22565b8a8461ffff1661ffff811061466c5761466c6159ca565b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02959095166001600160581b0366ffffffffffffff909216600160201b026001600160581b031990931663ffffffff909516949094179190911716919091179190911790555097509795505050505050565b5f5f8560020b6147048685613b3d565b60020b6147119190615db1565b9050600284900b8082131561472857809150614744565b61473181615c5f565b8212156147445761474181615c5f565b91505b61475282600289900b6159a3565b979650505050505050565b6040518481526023198301614773578360048201525b81818483895afa614786573d5f823e3d81fd5b813d1015610ad9575f5ffd5b5f816014526370a0823160601b5f5260208060246010865afa601f3d111660205102905092915050565b604051627eeac760e11b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169062fdd58e9061480a9030908890600401615cfc565b602060405180830381865afa158015614825573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148499190615921565b604051637a94c56560e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f5298aca9061489c90309088908790600401615d16565b5f604051808303815f87803b1580156148b3575f5ffd5b505af11580156148c5573d5f5f3e3d5ffd5b5050604051627eeac760e11b81525f92506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915062fdd58e906149179030908990600401615cfc565b602060405180830381865afa158015614932573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149569190615921565b90508181118061496857508281830314155b806149765750836003015481105b15610e6c5760405163104eed1d60e31b815260040160405180910390fd5b805f036149a057505050565b825f6149cc827f0000000000000000000000000000000000000000000000000000000000000000614792565b90505f6149d98386614792565b604051630b0d9c0960e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c0990614a2c90899089908990600401615d16565b5f604051808303815f87803b158015614a43575f5ffd5b505af1158015614a55573d5f5f3e3d5ffd5b505050505f614a84847f0000000000000000000000000000000000000000000000000000000000000000614792565b90505f614a918588614792565b905083821180614aa357508582850314155b80614aad57508281105b80614aba57508583820314155b1561328557604051631dc418c360e31b815260040160405180910390fd5b816014528060345263a9059cbb60601b5f5260205f604460105f875af18060015f511416614b1857803d853b151710614b18576390b8ec185f526004601cfd5b505f603452505050565b614b2a61503e565b5f855f01518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020015f856001600160801b031611614b7b576001614b7d565b845b6001600160801b031663ffffffff60801b608085901b1681614ba157614ba1615cab565b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614bd061503e565b614bd861503e565b888561ffff1661ffff8110614bef57614bef6159ca565b60408051608081018252919092015463ffffffff8116808352600160201b820460060b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff16151560608201529250614c4d90899089614da3565b15614c86578663ffffffff16825f015163ffffffff1614614c7a5781614c7583898988614b22565b614c7d565b81815b9150915061456c565b8883614c93876001615d74565b614c9d9190615d8e565b61ffff1661ffff8110614cb257614cb26159ca565b60408051608081018252929091015463ffffffff81168352600160201b810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614d5b57604080516080810182528a5463ffffffff81168252600160201b810460060b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614d6988835f015189614da3565b614d8657604051636ffbbccd60e11b815260040160405180910390fd5b614d938989898887614e61565b9150915097509795505050505050565b5f8363ffffffff168363ffffffff1611158015614dcc57508363ffffffff168263ffffffff1611155b15614de8578163ffffffff168363ffffffff161115905061331b565b5f8463ffffffff168463ffffffff1611614e1557614e1063ffffffff8516600160201b615ce9565b614e1d565b8363ffffffff165b90505f8563ffffffff168463ffffffff1611614e4c57614e4763ffffffff8516600160201b615ce9565b614e54565b8363ffffffff165b9091111595945050505050565b614e6961503e565b614e7161503e565b5f83614e7e866001615d74565b614e889190615d8e565b61ffff1690505f60018561ffff1683614ea19190615ce9565b614eab9190615c98565b90505b5f6002614ebb8385615ce9565b614ec59190615cbf565b905089614ed661ffff881683615dd0565b61ffff8110614ee757614ee76159ca565b60408051608081018252929091015463ffffffff81168352600160201b810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909550614f5357614f4b816001615ce9565b925050614eae565b8961ffff8716614f64836001615ce9565b614f6e9190615dd0565b61ffff8110614f7f57614f7f6159ca565b60408051608081018252929091015463ffffffff81168352600160201b810460060b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094505f90614fe2908b908b614da3565b9050808015614ffa5750614ffa8a8a875f0151614da3565b15615006575050615032565b8061501d57615016600183615c98565b925061502b565b615028826001615ce9565b93505b5050614eae565b50509550959350505050565b604080516080810182525f80825260208201819052918101829052606081019190915290565b5f60a08284031215615074575f5ffd5b50919050565b5f60a0828403121561508a575f5ffd5b61331b8383615064565b5f602082840312156150a4575f5ffd5b5035919050565b6001600160a01b03169052565b634e487b7160e01b5f52602160045260245ffd5b600281106150e857634e487b7160e01b5f52602160045260245ffd5b9052565b81516001600160a01b03908116825260208084015190911690820152604080830151610120830191615120908401826150ab565b50606083015161513360608401826150cc565b50608083015161514a608084018262ffffff169052565b5060a083015161515f60a084018260ff169052565b5060c083015161517260c08401826150ab565b5060e083015161518660e084018215159052565b5061010092830151919092015290565b6001600160a01b0381168114612009575f5ffd5b5f5f83601f8401126151ba575f5ffd5b5081356001600160401b038111156151d0575f5ffd5b602083019150836020828501011115613b36575f5ffd5b5f5f5f5f5f8587036101608112156151fd575f5ffd5b863561520881615196565b95506152178860208901615064565b9450608060bf198201121561522a575f5ffd5b5060c0860192506101408601356001600160401b0381111561524a575f5ffd5b615256888289016151aa565b969995985093965092949392505050565b5f5f60408385031215615278575f5ffd5b82359150602083013561528a81615196565b809150509250929050565b5f602082840312156152a5575f5ffd5b813561331b81615196565b5f5f8284036101c08112156152c3575f5ffd5b6152cd8585615064565b9250610120609f19820112156152e1575f5ffd5b5060a0830190509250929050565b61ffff81168114612009575f5ffd5b5f5f6040838503121561530f575f5ffd5b82359150602083013561528a816152ef565b5f60608284031215615074575f5ffd5b5f5f5f5f5f6101408688031215615346575f5ffd5b853561535181615196565b94506153608760208801615064565b935061536f8760c08801615321565b92506101208601356001600160401b0381111561524a575f5ffd5b5f5f5f60e0848603121561539c575f5ffd5b6153a68585615064565b925060a08401356153b681615196565b915060c08401356153c681615196565b809150509250925092565b8060020b8114612009575f5ffd5b5f5f5f5f61010085870312156153f3575f5ffd5b84356153fe81615196565b935061540d8660208701615064565b925060c085013561541d81615196565b915060e085013561542d816153d1565b939692955090935050565b5f5f60208385031215615449575f5ffd5b82356001600160401b0381111561545e575f5ffd5b61546a858286016151aa565b90969095509350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f604084860312156154bd575f5ffd5b8335925060208401356001600160401b038111156154d9575f5ffd5b8401601f810186136154e9575f5ffd5b80356001600160401b038111156154fe575f5ffd5b8660208260051b8401011115615512575f5ffd5b939660209190910195509293505050565b604080825283519082018190525f9060208501906060840190835b8181101561555f57835160060b83526020938401939092019160010161553e565b5050838103602080860191909152855180835291810192508501905f5b818110156155a35782516001600160a01b031684526020938401939092019160010161557c565b50919695505050505050565b5f5f5f5f5f5f61016087890312156155c5575f5ffd5b86356155d081615196565b95506155df8860208901615064565b94506155ee8860c08901615321565b935061012087013592506101408701356001600160401b03811115615611575f5ffd5b61561d89828a016151aa565b979a9699509497509295939492505050565b5f5f5f5f5f5f6101208789031215615645575f5ffd5b863561565081615196565b955061565f8860208901615064565b945060c0870135935060e087013592506101008701356001600160401b03811115615611575f5ffd5b602080825282518282018190525f918401906040840190835b818110156156bf5783518352602093840193909201916001016156a1565b509095945050505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b90830152608092830151169181019190915260a00190565b5f5f60408385031215615726575f5ffd5b50508035926020909101359150565b918252602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b038111828210171561577957615779615743565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a7576157a7615743565b604052919050565b62ffffff81168114612009575f5ffd5b5f60a08284031280156157d0575f5ffd5b506157d9615757565b82356157e481615196565b815260208301356157f481615196565b60208201526040830135615807816157af565b6040820152606083013561581a816153d1565b6060820152608083013561582d81615196565b60808201529392505050565b803561584481615196565b6001600160a01b03168252602081013561585d81615196565b6001600160a01b031660208301526040810135615879816157af565b62ffffff1660408301526060810135615891816153d1565b60020b606083015260808101356158a781615196565b6001600160a01b03166080929092019190915250565b8015158114612009575f5ffd5b61012081016158d98286615839565b83356158e4816158bd565b151560a0830152602084013560c0830152604084013561590381615196565b6001600160a01b031660e08301526101009091019190915292915050565b5f60208284031215615931575f5ffd5b5051919050565b5f60208284031215615948575f5ffd5b813561331b816158bd565b5f5f60408385031215615964575f5ffd5b825161596f816157af565b602084015190925061528a816152ef565b818382375f9101908152919050565b634e487b7160e01b5f52601160045260245ffd5b8082018281125f8312801582168215821617156159c2576159c261598f565b505092915050565b634e487b7160e01b5f52603260045260245ffd5b60a08101610b8e8284615839565b5f602082840312156159fc575f5ffd5b81516001600160401b03811115615a11575f5ffd5b8201601f81018413615a21575f5ffd5b80516001600160401b03811115615a3a57615a3a615743565b615a4d601f8201601f191660200161577f565b818152856020838501011115615a61575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f5f60408385031215615a8f575f5ffd5b505080516020909101519092909150565b5f60208284031215615ab0575f5ffd5b813561331b816153d1565b5f60208284031215615acb575f5ffd5b81356002811061331b575f5ffd5b5f60208284031215615ae9575f5ffd5b813561331b816157af565b5f60208284031215615b04575f5ffd5b813560ff8116811461331b575f5ffd5b5f60208284031215615b24575f5ffd5b815161331b81615196565b5f60208284031215615b3f575f5ffd5b81516001600160401b03811115615b54575f5ffd5b8201601f81018413615b64575f5ffd5b80516001600160401b03811115615b7d57615b7d615743565b8060051b615b8d6020820161577f565b91825260208184018101929081019087841115615ba8575f5ffd5b6020850194505b838510156147525784519250615bc483615196565b82825260209485019490910190615baf565b5f60a0828403128015615be7575f5ffd5b50615bf0615757565b8251615bfb81615196565b81526020830151615c0b81615196565b60208201526040830151615c1e816157af565b60408201526060830151615c31816153d1565b6060820152608083015161582d81615196565b5f60208284031215615c54575f5ffd5b815161331b816158bd565b5f600160ff1b8201615c7357615c7361598f565b505f0390565b60e08101615c878286615839565b60a082019390935260c00152919050565b81810381811115610b8e57610b8e61598f565b634e487b7160e01b5f52601260045260245ffd5b5f82615ccd57615ccd615cab565b500490565b8082028115828204841417610b8e57610b8e61598f565b80820180821115610b8e57610b8e61598f565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f8160020b627fffff198103615d5257615d5261598f565b5f0392915050565b61ffff8281168282160390811115610b8e57610b8e61598f565b61ffff8181168382160190811115610b8e57610b8e61598f565b5f61ffff831680615da157615da1615cab565b8061ffff84160691505092915050565b8181035f8312801583831316838312821617156134745761347461598f565b5f82615dde57615dde615cab565b50069056";
@@ -1,4 +1,4 @@
1
- /** Explicit versioned launch stack. Importing this entry never selects a deployed address. */
1
+ /** Versioned construction metadata and live launch execution calibration. */
2
2
  export * from "./schema.js";
3
3
  export * from "./types.js";
4
4
  export * from "./abi.js";
@@ -6,4 +6,6 @@ export * from "./markets.js";
6
6
  export * from "./progress.js";
7
7
  export * from "./fork.js";
8
8
  export * from "./authors.js";
9
- export { planLaunch, simulateLaunchPlan, buildNextTransaction, preparePoolBoundLifecyclePlan } from "./planner.js";
9
+ export * from "./presets.js";
10
+ export * from "./transactions.js";
11
+ export { planLaunch, simulateLaunchPlan, buildNextTransaction, prepareAndPlanLifecycleLaunch } from "./planner.js";