Перейти к основному содержанию

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

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

ПолеЗначение
curve_type0 = constant-product (виртуальные резервы), 1 = fixed-price, 2 = linear-price.
base_supply_maxМаксимальное количество базовых токенов, которые кривая когда-либо может выпустить.
base_supply_graduationБазовые токены, которые должны быть проданы для достижения градации. Обычно 0.8 × base_supply_max; оставшиеся 20% становятся начальной LP пула после градации.
quote_reserve_targetСумма котировки, которая запускает градацию. Вычисляется при Initialize из параметров кривой + base_supply_graduation.
virtual_base / virtual_quoteСемена виртуальных резервов для кривой constant-product.
migrate_typeВыбирает целевой пул после градации: AMM v4 или CPMM. См. instructions.
fees.buy_numerator / buy_denominatorКомиссия на покупку, например 100 / 10_000 = 1.00%.
fees.sell_numerator / sell_denominatorКомиссия на продажу. Часто такая же, как на покупку.
fees.protocol_share, fees.creator_share, fees.lp_shareРаспределение вышеуказанных комиссий, в сумме равное denominator.
Имена полей в структуре Rust совпадают с полями PoolState, описанными в accounts; единицы выше являются концептуальными.

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

Кривая по умолчанию и наиболее часто используемая. Все pump-style запуски используют эту форму. Кривая предполагает, что с самого начала существует виртуальный резерв котировки V_q и виртуальный базовый резерв V_b (хранятся как virtual_quote и virtual_base на PoolState), поэтому эффективный пул выглядит как CPMM с этими резервами. Покупки следуют математике x · y = k:
(V_q + real_quote_in_after_fee) × (V_b + real_base_remaining − base_out) = V_q × V_b
решено относительно base_out:
base_out = (V_b + real_base_remaining) × quote_in_after_fee / (V_q + real_quote_in_after_fee)
Эффективная цена при продано базовых токенов s:
price(s) = (V_q + real_quote_in(s)) / (V_b + real_base_remaining(s))
Один и тот же инвариант x · y = k, который LaunchLab применяет до градации, становится буквально кривой CPMM (или AMM v4) после градации, поэтому переход при градации работает механически безупречно: предельная цена при base_sold = base_supply_graduation равна цене, с которой открывается пул после градации, с (quote_vault, base_vault_remaining) в качестве его резервов.

Кривая с фиксированной ценой (curve_type = 1)

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

Кривая с линейной ценой (curve_type = 2)

Цена растёт линейно с base_sold:
price(s) = a · s     (a = наклон, выведено из virtual_base / virtual_quote)
Интегральная стоимость:
cost(s_0, s_1) = a · (s_1² − s_0²) / 2
Квадратична по base_sold — ранние покупатели платят близко к нулю, поздние покупатели платят значительно больше, при этом предельная цена всегда растёт с фиксированным наклоном. On-chain реализация находится в curve/linear_price.rs.

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

цена
  │   linear (крутой хвост)               linear (curve_type = 2)
  │       ╱
  │      ╱
  │     ╱            const-product (curve_type = 0)
  │    ╱            ╱
  │   ╱           ╱
  │  ╱         ╱
  │ ╱       ╱
  │╱_____╱_______________________  fixed-price (curve_type = 1)
  └──────────────────────────────── base_sold
  0                  S_град         S_макс

Порог градации

quote_reserve_target вычисляется при Initialize как котировка, необходимая для доведения base_sold от 0 до base_supply_graduation:
quote_reserve_target = cost(0, base_supply_graduation) × (1 + buy_fee_rate)
                                                         ^^^^^^^^^^^^^^^^^
                                                         приблизительно; точная
                                                         форма соответствует
                                                         округлению комиссии,
                                                         используемому на Buy.
Запуск градирует, как только quote_vault.balance ≥ quote_reserve_target. Поскольку покупки приходят дискретными размерами, фактический баланс при градации может немного превышать целевой — излишек становится дополнительной ликвидностью на стороне котировки в результирующем 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):
цена = 40 × (500e6 / 1e9)² = 40 × 0.25 = 10  (котировка за базовый, 6 децималей)
Цена при градации (s = 800_000_000):
цена = 40 × (800e6 / 1e9)² = 40 × 0.64 = 25.6
Котировка, требуемая для достижения градации (интегральная стоимость):
cost(0, 800_000_000) = (40 / (3 × 1e18)) × ((800e6)³ − 0)
                     = (40 / 3e18) × 5.12e26
                     ≈ 6.827e9
Итак, ≈ 6.827 единиц котировки в собственной форме (в любом 6-децимальном котировочном мочевом пузыре, например ~6,827 USDC, если котировка — USDC). Комиссия сверху:
quote_reserve_target ≈ 6.827e9 × 1.01 ≈ 6.895e9  (6,895 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 теперь покупают гораздо меньше базовых токенов, потому что кривая крутая. Newton-решение при s₀ = 750e6 с quote_in_after_fee = 9.9 даёт примерно ∆s ≈ 0.4e6 — ~15-кратное уменьшение базовых токенов на USDC по сравнению с первой покупкой.

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

На каждый Buy:
gross_fee      = ceil(quote_in_gross × buy_numerator / buy_denominator)
lp_share       = gross_fee × fees.lp_share / fees.total_share
protocol_share = gross_fee × fees.protocol_share / fees.total_share
creator_share  = gross_fee × fees.creator_share / fees.total_share
  • lp_share остаётся в quote_vault. Это то, что делает эффективную кривую более напряжённой (больше резерва котировки против того же предложения базовых токенов).
  • protocol_share увеличивает LaunchState.state_data.protocol_fees_quote.
  • creator_share увеличивает LaunchState.state_data.creator_fees_quote.
На Sell применяется то же распределение, но комиссия вычитается из исходящего quote_out. Оба счётчика очищаются через CollectFees (администратор или создатель, каждый на свой счётчик).

Точность

  • Суммы на стороне базовых токенов: u64.
  • Суммы на стороне котировки: u64.
  • Промежуточные кубы / произведения: u128.
  • Newton-решения для «покупить точное количество котировки» и «продать точное количество котировки» итерируют в u128 с фиксированной точкой с настраиваемым максимальным количеством итераций (по умолчанию 10). Режим отказа — NotConverged — редок вне граничных случаев близ градации.

Переход к CPMM

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

Куда дальше

Источники: