Skip to content

Commit bc01784

Browse files
marktodaclaude
andauthored
feat(liquidity-launcher-sdk): quick-launch graduation pool tick spacing — the 2026-08-05 redeploy mints at 25 (#680)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 711fec2 commit bc01784

3 files changed

Lines changed: 55 additions & 0 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
'@uniswap/liquidity-launcher-sdk': minor
3+
---
4+
5+
Quick-launch preset: state the graduation pool's tick spacing, which the 2026-08-05 chain-4663 full redeploy changed on-chain from 50 to 25 without any SDK constant describing it.
6+
7+
- `QUICK_LAUNCH_POOL_TICK_SPACING` (new) → `25`. The value the launch flow passes in `MigratorParameters.poolParameters` since the redeploy — deliberately NOT the generic `feeToTickSpacing` derivation, which yields 50 for the 2500 fee tier. Evidence: the post-redeploy `Initialize` census on chain 4663 shows every quick-launch graduation pool minted at spacing 25 (295 pools in the redeploy's first day, zero new pools at 50).
8+
- `QUICK_LAUNCH_ALLOWED_POOL_TICK_SPACINGS` (new) → `[25, 50]`. The append-only grandfather set (same shape as `QUICK_LAUNCH_ALLOWED_GRADUATION_FDV_USD`): pools are permanent, so routing/discovery consumers deriving a token's candidate launch pools must race a `(QUICK_LAUNCH_LP_FEE, spacing)` key for every entry — the token address alone cannot say which generation minted its pool. This is the constant rh-cca's `LAUNCH_POOL_TIERS`-style routing should consume instead of hand-maintained literals (Uniswap/universe#38608 shipped the interim literal).
9+
- `QUICK_LAUNCH_PRESET.lp.tickSpacing` (new field) → `QUICK_LAUNCH_POOL_TICK_SPACING`, beside the existing `lp.fee`.
10+
11+
`feeToTickSpacing` itself is unchanged — it remains the generic v3-canonical/interface derivation used for validation; the preset now states the observed on-chain value where the launch flow no longer follows that formula. `isQuickLaunch` classification is unaffected (it never matched on the pool key).

sdks/liquidity-launcher-sdk/src/quickLaunch.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ import {
99
PERMANENT_TIMELOCK_REQUEST_SECONDS,
1010
PERMANENT_UNLOCK_BLOCK_THRESHOLD,
1111
QUICK_LAUNCH_ALLOWED_GRADUATION_FDV_USD,
12+
QUICK_LAUNCH_ALLOWED_POOL_TICK_SPACINGS,
1213
QUICK_LAUNCH_DURATION_SECONDS,
1314
QUICK_LAUNCH_FLOOR_FDV_USD,
1415
QUICK_LAUNCH_GRADUATION_FDV_TOLERANCE_RATIO,
1516
QUICK_LAUNCH_GRADUATION_FDV_USD,
1617
QUICK_LAUNCH_GRADUATION_RAISE_USD,
18+
QUICK_LAUNCH_POOL_TICK_SPACING,
1719
QUICK_LAUNCH_PRESET,
1820
QUICK_LAUNCH_RESERVED_FOR_LP_RAW,
1921
QUICK_LAUNCH_SOLD_SUPPLY_SHARE,
@@ -56,6 +58,8 @@ describe('QUICK_LAUNCH_PRESET', () => {
5658
expect(QUICK_LAUNCH_PRESET.auctionSupplyRaw).toBe(5n * 10n ** 26n)
5759
expect(QUICK_LAUNCH_PRESET.reservedForLpRaw).toBe(5n * 10n ** 26n)
5860
expect(QUICK_LAUNCH_PRESET.raiseCurrency).toBe(zeroAddress)
61+
expect(QUICK_LAUNCH_PRESET.lp.fee).toBe(2_500)
62+
expect(QUICK_LAUNCH_PRESET.lp.tickSpacing).toBe(25)
5963
expect(QUICK_LAUNCH_PRESET.lp.range).toBe('CONCENTRATED_FULL_RANGE')
6064
expect(QUICK_LAUNCH_PRESET.lp.lockMode).toBe('buybackBurn')
6165
expect(QUICK_LAUNCH_PRESET.lp.permanentTimelock).toBe(true)
@@ -439,6 +443,21 @@ describe('FDV -> price-per-token request derivation', () => {
439443
})
440444
})
441445

446+
describe('graduation-pool tick spacing constants', () => {
447+
it('states the observed post-redeploy spacing, not the feeToTickSpacing derivation', () => {
448+
// The 2026-08-05 chain-4663 redeploy mints graduation pools at spacing 25; the generic
449+
// fee->spacing formula would say 50 for the 2500 tier. The preset states on-chain reality.
450+
expect(QUICK_LAUNCH_POOL_TICK_SPACING).toBe(25)
451+
expect(QUICK_LAUNCH_PRESET.lp.tickSpacing).toBe(QUICK_LAUNCH_POOL_TICK_SPACING)
452+
})
453+
454+
it('grandfathers every spacing pools were ever minted at — pools are permanent', () => {
455+
expect([...QUICK_LAUNCH_ALLOWED_POOL_TICK_SPACINGS]).toEqual([25, 50])
456+
// The current preset value is in the allowed set.
457+
expect(QUICK_LAUNCH_ALLOWED_POOL_TICK_SPACINGS).toContain(QUICK_LAUNCH_POOL_TICK_SPACING)
458+
})
459+
})
460+
442461
describe('graduation-FDV gate constants', () => {
443462
it('grandfathers both the $5k historical cohort and the $10k current preset', () => {
444463
expect([...QUICK_LAUNCH_ALLOWED_GRADUATION_FDV_USD]).toEqual([5_000, 10_000])

sdks/liquidity-launcher-sdk/src/quickLaunch.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,28 @@ export const QUICK_LAUNCH_GRADUATION_FDV_TOLERANCE_RATIO = 0.1
9999
*/
100100
export const QUICK_LAUNCH_LP_FEE = 2_500
101101

102+
/**
103+
* V4 graduation-pool tick spacing, as passed in `MigratorParameters.poolParameters` since the
104+
* 2026-08-05 chain-4663 full redeploy. Deliberately NOT the generic {@link feeToTickSpacing}
105+
* derivation, which yields 50 for the {@link QUICK_LAUNCH_LP_FEE} tier: the post-redeploy
106+
* Initialize census shows every quick-launch graduation pool minted at spacing 25 (295 pools in
107+
* the redeploy's first day, zero new pools at 50), so the preset states the observed value rather
108+
* than a formula the launch flow no longer follows.
109+
*/
110+
export const QUICK_LAUNCH_POOL_TICK_SPACING = 25
111+
112+
/**
113+
* Every tick spacing a quick-launch graduation pool has ever been minted at, newest first — the
114+
* append-only grandfather set (same shape as {@link QUICK_LAUNCH_ALLOWED_GRADUATION_FDV_USD}).
115+
* Pools are permanent, so a superseded spacing never leaves this list; routing/discovery consumers
116+
* deriving a token's candidate launch pools must race a `(QUICK_LAUNCH_LP_FEE, spacing)` key for
117+
* EVERY entry, because the token address alone cannot say which generation minted the pool.
118+
* - 25: since the 2026-08-05 chain-4663 full redeploy ({@link QUICK_LAUNCH_POOL_TICK_SPACING}).
119+
* - 50: every earlier generation — the {@link feeToTickSpacing} derivation of the fee, kept as a
120+
* literal so a future change to that formula cannot rewrite the historical record.
121+
*/
122+
export const QUICK_LAUNCH_ALLOWED_POOL_TICK_SPACINGS = [QUICK_LAUNCH_POOL_TICK_SPACING, 50] as const
123+
102124
/** V4 LP price-range strategy: full-range + concentrated. */
103125
export const QUICK_LAUNCH_LP_RANGE: PriceRangeKind = 'CONCENTRATED_FULL_RANGE'
104126

@@ -242,6 +264,8 @@ export interface QuickLaunchPreset {
242264
readonly graduationFdvUsd: number
243265
readonly lp: {
244266
readonly fee: number
267+
/** Graduation-pool tick spacing — see {@link QUICK_LAUNCH_POOL_TICK_SPACING}. */
268+
readonly tickSpacing: number
245269
readonly range: PriceRangeKind
246270
readonly lockMode: QuickLaunchLockMode
247271
/** Locked forever. */
@@ -270,6 +294,7 @@ export const QUICK_LAUNCH_PRESET: QuickLaunchPreset = {
270294
graduationFdvUsd: QUICK_LAUNCH_GRADUATION_FDV_USD,
271295
lp: {
272296
fee: QUICK_LAUNCH_LP_FEE,
297+
tickSpacing: QUICK_LAUNCH_POOL_TICK_SPACING,
273298
range: QUICK_LAUNCH_LP_RANGE,
274299
lockMode: QUICK_LAUNCH_LOCK_MODE,
275300
permanentTimelock: true,

0 commit comments

Comments
 (0)