Запуск с двумя позициями

После поправки от 2026-09-12 бондинг-кривой больше нет. Весь саплай уходит в заблокированную ликвидность Uniswap v4 прямо в транзакции создания. В коде с 2026-09-28: LiquidityLock.launchMarket делает всё это внутри транзакции создания рынка, а тесты фиксируют цену открытия, которую читает Lens: 3 401 582 525 wei за токен.

Почему кривая исчезла

Старая кривая была постоянным произведением на виртуальных резервах:

x = VIRTUAL_ETH   + netReserve     (3.75 ETH + сколько поступило)
y = TOKEN_RESERVE - tokensSold     (1.1 B − сколько ушло)

Это ровно то, чем является позиция концентрированной ликвидности: виртуальные резервы v3/v4 и есть это смещение. Соответствие — не приближение, а то же самое уравнение, записанное иначе.

Что даёт её удаление: нет миграции — самого рискованного момента протокола, — нет комиссии за градуацию, которую можно было бы извлечь, один путь комиссий вместо двух и рынки, доступные для маршрутизации агрегаторами с первого блока.

Два диапазона

graph LR A["FDV 3.409 ETH

тик 195000

открытие"] -->|диапазон 1 · 700M токенов · 7.535 ETH| B["FDV 34.091 ETH

тик 171960

10x"] B -->|диапазон 2 · 300M токенов · без верхней границы| C["тик −887220

потолок цены"]
Диапазон 1 Диапазон 2
Токены 700 000 000 300 000 000
Тики [171960, 195000] [−887220, 171960]
Глубина 7,535 ETH на прохождение 14,5 ETH при 2× · 45,7 ETH при 20× · 144,6 ETH при 200×

tickSpacing 60 и никакой LP-комиссии.

Это настройки запуска по умолчанию. С 2026-10-05 саплай, число токенов в диапазоне 1 (диапазон 2 получает остаток), тик запуска, нижние тики обоих диапазонов, шаг тиков и LP-комиссия образуют одну настройку владельца StockFun, setLaunchConfig на фабрике, которая применяется к рынкам, созданным после этого. Она отклоняет форму, которую не смог бы вместить ни один пул: пустой диапазон, тики не по шагу или не по порядку, шаг тиков или LP-комиссию вне допустимых пределов, диапазоны, ликвидность которых не может вместить один тик. Каждый пул сохраняет форму, LP-комиссию и шаг тиков, с которыми был создан: лок записывает его тики, а Lens отдаёт LP-комиссию и шаг тиков каждого рынка.

Тонкий момент: цена открытия

При запуске обе позиции содержат только токены. Именно это позволяет протоколу не вносить ни одного ETH: каждый ETH, который когда-либо окажется в пуле, приходит от покупателей.

Чтобы позиция состояла только из токенов, текущая цена должна быть на уровне верхней границы её диапазона или выше. Отсюда:

sqrtStartX96 = TickMath.getSqrtPriceAtTick(BAND1_UPPER);  // not sqrt(raw FDV)

Точный тик стартовой FDV — 194 977,95, а ближайший пригодный тик над ним — 195 000. Если вывести sqrtStart из сырой FDV, цена окажется внутри диапазона 1, и проверка NotSingleSided в LiquidityLock отклонит депозит.

Квантование даёт эффективную FDV 3,4016 ETH вместо 3,409, то есть отклонение −0,22 %.

Как это выглядит на практике

Последовательные покупки по 2 ETH с момента запуска, с настройками по умолчанию:

Потрачено FDV Доля купленного саплая
2 ETH ~$27 600 36,1 %
4 ETH ~$50 400 53,3 %
10 ETH ~$164 000 74,8 %
50 ETH ~$2,78 млн 93,9 %

Первый тикет забирает 36,1 % саплая — против 36,99 % на старой кривой. Запуск ведёт себя как раньше, с точностью до пункта, и именно по этому критерию подбирались параметры.

Структурный потолок диапазона

Количество ETH, которое может поглотить диапазон, если бы в нём находилось 100 % саплая, равно ровно среднему геометрическому двух его FDV:

$$ E{\max} = \sqrt{\text{FDV}{\text{нач}} \times \text{FDV}_{\text{кон}}}

$$

Именно это ограничивает параметры: нельзя свободно выбрать цену запуска, верх диапазона и глубину — количество токенов замыкает систему.

Режим завершения

Как и токены, лок нельзя апгрейдить: именно его код удерживает ликвидность в пулах. С 2026-10-02 у него есть один выход — режим завершения, на случай закрытия проекта.

  1. Объявление. Владелец StockFun вызывает end(), и лок публично записывает дату, наступающую через 30 дней. С этого момента ни один новый рынок не может быть запущен, и позиция $STOCKFUN тоже не может быть создана, поэтому ни у одного рынка срок предварительного объявления не оказывается короче полного. Торговля и сбор комиссий продолжаются
  2. Срок предварительного объявления. В течение 30 дней торговля во всех пулах продолжается. Владелец может в любой момент отменить завершение через cancelEnd(), и запуски возобновляются
  3. Вывод ликвидности. Когда 30 дней истекут, владелец может вывести из пула все его позиции — оба диапазона рынка, единственную позицию $STOCKFUN — и отправить их ETH и токены, включая несобранные донаты, на любой адрес (recoverLiquidity). Пул, из которого ликвидность выведена, больше ничего не собирает и больше не считается заблокированным; последующая отмена оставляет его пустым

30 дней — это срок предварительного объявления для холдеров. Это константа лока, END_DELAY, а не настройка: единственная фиксированная задержка протокола.

Вне режима завершения до позиций ничего не добирается. С 2026-10-05 лок удерживает долю сбора комиссий, которую её получатель не принял, для этого получателя, пока её кто-нибудь не выплатит (payOwed); а владелец StockFun может вывести то, что было отправлено в лок по ошибке (rescue, rescueClaims, rescueNft): любой токен, ETH сверх удерживаемых им долей, claims v4, NFT. Общего вызова у лока нет: через PoolManager можно было бы добраться до вывода ликвидности режима завершения без его 30 дней.