@black-market/sdk 0.6.3 → 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.
- package/README.md +28 -4
- package/dist/addresses.d.ts +1 -1
- package/dist/addresses.js +4 -4
- package/dist/launch.d.ts +61 -0
- package/dist/launch.d.ts.map +1 -1
- package/dist/launch.js +171 -6
- package/dist/launch.js.map +1 -1
- package/dist/lifecycle/abi.d.ts +1999 -253
- package/dist/lifecycle/abi.d.ts.map +1 -1
- package/dist/lifecycle/abi.js +43 -14
- package/dist/lifecycle/abi.js.map +1 -1
- package/dist/lifecycle/allocations.d.ts +11 -0
- package/dist/lifecycle/allocations.d.ts.map +1 -0
- package/dist/lifecycle/allocations.js +36 -0
- package/dist/lifecycle/allocations.js.map +1 -0
- package/dist/lifecycle/calibration.d.ts +19 -0
- package/dist/lifecycle/calibration.d.ts.map +1 -0
- package/dist/lifecycle/calibration.js +65 -0
- package/dist/lifecycle/calibration.js.map +1 -0
- package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.d.ts +11 -0
- package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.d.ts.map +1 -0
- package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.js +10 -0
- package/dist/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.js.map +1 -0
- package/dist/lifecycle/index.d.ts +4 -2
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +4 -2
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/markets.d.ts +170 -6
- package/dist/lifecycle/markets.d.ts.map +1 -1
- package/dist/lifecycle/markets.js +164 -37
- package/dist/lifecycle/markets.js.map +1 -1
- package/dist/lifecycle/planner.d.ts +7 -14
- package/dist/lifecycle/planner.d.ts.map +1 -1
- package/dist/lifecycle/planner.js +355 -392
- package/dist/lifecycle/planner.js.map +1 -1
- package/dist/lifecycle/presets.d.ts +62 -0
- package/dist/lifecycle/presets.d.ts.map +1 -0
- package/dist/lifecycle/presets.js +195 -0
- package/dist/lifecycle/presets.js.map +1 -0
- package/dist/lifecycle/progress.d.ts +5 -1
- package/dist/lifecycle/progress.d.ts.map +1 -1
- package/dist/lifecycle/progress.js +286 -118
- package/dist/lifecycle/progress.js.map +1 -1
- package/dist/lifecycle/rpc.d.ts +13 -2
- package/dist/lifecycle/rpc.d.ts.map +1 -1
- package/dist/lifecycle/rpc.js +92 -8
- package/dist/lifecycle/rpc.js.map +1 -1
- package/dist/lifecycle/simulation.d.ts +14 -1
- package/dist/lifecycle/simulation.d.ts.map +1 -1
- package/dist/lifecycle/simulation.js +400 -100
- package/dist/lifecycle/simulation.js.map +1 -1
- package/dist/lifecycle/transactions.d.ts +6 -0
- package/dist/lifecycle/transactions.d.ts.map +1 -0
- package/dist/lifecycle/transactions.js +40 -0
- package/dist/lifecycle/transactions.js.map +1 -0
- package/dist/lifecycle/types.d.ts +39 -2
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/docs/launch-lifecycle.md +236 -39
- package/examples/README.md +108 -18
- package/examples/generate-lifecycle-commitment-fixture.mjs +3 -1
- package/examples/launch-example-support.mjs +1 -1
- package/examples/launch-example.mjs +73 -26
- package/examples/launch-lifecycle-smoke.mjs +13 -11
- package/examples/launch.mjs +12 -11
- package/examples/quickstart.mjs +1 -1
- package/package.json +1 -1
- package/src/addresses.ts +4 -4
- package/src/launch.ts +213 -6
- package/src/lifecycle/abi.ts +43 -14
- package/src/lifecycle/allocations.ts +35 -0
- package/src/lifecycle/calibration.ts +59 -0
- package/src/lifecycle/deployments/fixed-fee-pool-hook-v1-20261008.ts +11 -0
- package/src/lifecycle/index.ts +4 -2
- package/src/lifecycle/markets.ts +169 -35
- package/src/lifecycle/planner.ts +326 -321
- package/src/lifecycle/presets.ts +243 -0
- package/src/lifecycle/progress.ts +254 -102
- package/src/lifecycle/rpc.ts +97 -9
- package/src/lifecycle/simulation.ts +391 -94
- package/src/lifecycle/transactions.ts +34 -0
- 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
|
-
|
|
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
|
-
//
|
|
215
|
+
// Usable endpoints require mathematical floor/ceil, including negative ticks.
|
|
167
216
|
function alignDown(tick: number, tickSpacing: number): number {
|
|
168
|
-
|
|
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
|
-
|
|
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;
|
package/src/lifecycle/abi.ts
CHANGED
|
@@ -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
|
|
159
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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";
|
package/src/lifecycle/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/**
|
|
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
|
|
9
|
+
export * from "./presets.js";
|
|
10
|
+
export * from "./transactions.js";
|
|
11
|
+
export { planLaunch, simulateLaunchPlan, buildNextTransaction, prepareAndPlanLifecycleLaunch } from "./planner.js";
|