Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
LaunchLab поддерживает три формы кривых, выбираемые при Initialize: constant-product (наиболее распространённая, форма с виртуальными резервами стандартной кривой x · y = k), linear-price и fixed-price. Формула порога выпуска одинакова для всех трёх. На этой странице подробно разбирается математика constant-product; линейная и фиксированная формы кратко описаны в конце.

Параметры, хранящиеся в LaunchState

Названия полей в структуре Rust совпадают с полями PoolState, описанными в accounts; единицы выше — концептуальные.

Кривая constant-product с виртуальными резервами (curve_type = 0)

Кривая по умолчанию и наиболее используемая. Все запуски в стиле Pump используют эту форму. Кривая предполагает наличие виртуального резерва quote V_q и виртуального резерва base V_b с самого начала (хранятся как virtual_quote и virtual_base в PoolState), поэтому эффективный пул выглядит как CPMM с этими резервами. Покупки следуют математике x · y = k:
решено для base_out:
Эффективная цена при продано base s:
Тот же инвариант x · y = k, который LaunchLab применяет до выпуска, затем становится кривой CPMM после выпуска, поэтому переход механически безупречен: предельная цена при base_sold = base_supply_graduation равна цене, по которой открывается пул после выпуска с (quote_vault, base_vault_remaining) в качестве резервов.

Кривая fixed-price (curve_type = 1)

Кривая с плоской ценой. Каждая покупка/продажа происходит по постоянной цене, настраиваемой при Initialize:
Полезна для честных запусков, когда команда хочет единую цену для всех участников независимо от времени покупки. Выпуск запускается, когда продано base_supply_graduation (линейная зависимость стоимости делает вывод quote_reserve_target простым).

Кривая linear-price (curve_type = 2)

Цена растёт линейно с base_sold:
Интегрированная стоимость:
Квадратична по base_sold — ранние покупатели платят близко к нулю, поздние платят значительно больше, при этом предельная цена всегда растёт с фиксированным наклоном. Реализация на цепи находится в curve/linear_price.rs.

Сравнение форм кривых

Порог выпуска

quote_reserve_target вычисляется при Initialize как количество quote, необходимое для увеличения base_sold с 0 до base_supply_graduation:
Запуск выпускается, как только quote_vault.balance ≥ quote_reserve_target. Поскольку покупки происходят дискретными размерами, фактический баланс при выпуске может немного превышать целевой — избыток становится дополнительной ликвидностью на стороне quote в результирующем пуле CPMM.

Пошаговый пример — квадратичный запуск

Параметры:
  • base_supply_max = 1_000_000_000 (1 миллиард базовых токенов, 6 десятичных)
  • base_supply_graduation = 800_000_000 (80% продано запускает выпуск)
  • k = 40 (масштаб цены)
  • Комиссии: 1% покупка, 1% продажа, распределение lp:creator:protocol = 60:20:20.
Начальная цена (s = 0): 0 (чистая квадратика начинается с нуля). Цена при 50% продано (s = 500_000_000):
Цена при выпуске (s = 800_000_000):
Quote, необходимый для достижения выпуска (интегрированная стоимость):
Итак, ≈ 6.827 единиц quote в нативном виде (в любом 6-десятичном quote mint, например ~6,827 USDC, если quote — USDC). Комиссия сверху:
Первая покупка на 10 USDC:
  • Виртуальное состояние: s = 0, quote_vault = 0.
  • Вычесть комиссию: quote_after_fee = 10 × 0.99 = 9.9.
  • Решить (40 / (3e18)) × s³ = 9.9s ≈ 6.22e6 базовых токенов куплено.
  • Комиссия 1% (0.1 USDC) распределена: lp 0.06, creator 0.02, protocol 0.02. Доля lp остаётся в quote_vault; остальные две маршрутизируются в соответствующие счётчики накопления.
Покупка при 75% продано (приближение к выпуску): Те же 10 USDC теперь покупают намного меньше base, потому что кривая крутая. Решение Ньютона при s₀ = 750e6 с quote_in_after_fee = 9.9 даёт примерно ∆s ≈ 0.4e6 — сокращение в ~15 раз в base на USDC по сравнению с первой покупкой.

Механика комиссий во время фазы кривой

При каждой Buy:
  • lp_share остаётся в quote_vault. Это то, что делает эффективную кривую более узкой (больше резерва quote против того же предложения base).
  • protocol_share увеличивает LaunchState.state_data.protocol_fees_quote.
  • creator_share увеличивает LaunchState.state_data.creator_fees_quote.
При Sell то же распределение применяется, но комиссия берётся из исходящего quote_out. Оба счётчика очищаются через CollectFees (администратор или создатель, каждый на свой счётчик).

Точность

  • Количества на стороне base: u64.
  • Количества на стороне quote: u64.
  • Промежуточные кубы / произведения: u128.
  • Решения Ньютона для “купить точное количество quote” и “продать точное количество quote” итерируют в u128 с фиксированной точкой с настраиваемым максимальным количеством итераций (по умолчанию 10). Режим отказа — NotConverged — редко встречается вне граничных случаев близко к выпуску.

Передача в CPMM

Когда срабатывает Graduate:
Для квадратичной кривой cpmm_initial_price механически равна price(base_sold) (это предельная цена кривой в момент передачи). Пул CPMM открывается ровно по этой цене, поэтому наблюдатель, переходящий от UI кривой к UI CPMM, не видит скачка.

Что дальше

Источники: