Запуск с двумя позициями
После поправки от 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 и есть это смещение. Соответствие — не приближение, а то же самое уравнение, записанное иначе.
Что даёт её удаление: нет миграции — самого рискованного момента протокола, — нет комиссии за градуацию, которую можно было бы извлечь, один путь комиссий вместо двух и рынки, доступные для маршрутизации агрегаторами с первого блока.
Два диапазона
тик 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 у него есть один выход — режим завершения, на случай закрытия проекта.
- Объявление. Владелец StockFun вызывает
end(), и лок публично записывает дату, наступающую через 30 дней. С этого момента ни один новый рынок не может быть запущен, и позиция$STOCKFUNтоже не может быть создана, поэтому ни у одного рынка срок предварительного объявления не оказывается короче полного. Торговля и сбор комиссий продолжаются - Срок предварительного объявления. В течение 30 дней торговля во всех пулах
продолжается. Владелец может в любой момент отменить завершение через
cancelEnd(), и запуски возобновляются - Вывод ликвидности. Когда 30 дней истекут, владелец может вывести из пула все его
позиции — оба диапазона рынка, единственную позицию
$STOCKFUN— и отправить их ETH и токены, включая несобранные донаты, на любой адрес (recoverLiquidity). Пул, из которого ликвидность выведена, больше ничего не собирает и больше не считается заблокированным; последующая отмена оставляет его пустым
30 дней — это срок предварительного объявления для холдеров. Это константа лока,
END_DELAY, а не настройка: единственная фиксированная задержка протокола.
Вне режима завершения до позиций ничего не добирается. С 2026-10-05 лок удерживает долю
сбора комиссий, которую её получатель не принял, для этого получателя, пока её кто-нибудь
не выплатит (payOwed); а владелец StockFun может вывести то, что было отправлено в лок
по ошибке (rescue, rescueClaims, rescueNft): любой токен, ETH сверх удерживаемых им
долей, claims v4, NFT. Общего вызова у лока нет: через PoolManager можно было бы
добраться до вывода ликвидности режима завершения без его 30 дней.