Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →

Что такое кривая привязки

Кривая привязки — это детерминированная функция цены p(s), которая связывает цену токена с объёмом, находящимся в обращении (s — количество проданного предложения). Покупатели отправляют залог контракту; контракт выпускает новые единицы токена по предельной цене, задаваемой кривой. Продавцы возвращают единицы токена и получают интегрированный возврат. Два ключевых отличия от CPMM-пула:
  • Контрагент не требуется. Контракт-издатель — это маркет-мейкер; ликвидность существует по определению.
  • Монотонная цена. Цена растёт с каждой чистой покупкой и падает с каждой чистой продажей.
Кривые привязки — стандартный механизм запуска, когда издатель не хочет предварительно наполнять AMM-пул залогом.

Универсальные формулы цены

Для любой непрерывной функции цены p(s): Спотовая цена при предложении s:
Стоимость покупки предложения от s_0 до s_1 (где s_1 > s_0):
где P(s) = ∫ p(s) ds — первообразная кривой. Геометрически cost — это площадь под кривой p между s_0 и s_1. Доход от продажи предложения обратно от s_1 к s_0:
(Симметрия: покупка и продажа на одном и том же интервале обмениваются одинаковым залогом — за исключением комиссий.) Средняя цена для покупки:

Распространённые типы кривых

Линейная

Цена растёт пропорционально предложению. Используется для «плавных» запусков, когда издатель хочет предсказуемую, умеренную наценку в течение жизни проекта.

Квадратичная

(Для ненормализованной формы p(s) = k · s² отбросьте S_max²: P(s) = (k/3) · s³. Выберите одно соглашение и придерживайтесь его — разобранный ниже пример везде использует нормализованную форму.) Цена растёт квадратично. Ранние покупатели получают почти нулевую цену (плоская начальная область); поздние покупатели платят крутую премию.
LaunchLab не реализует квадратичную кривую цены. Его три типа кривых — 0 = ConstantProduct (по умолчанию), 1 = FixedPrice и 2 = LinearPrice. Ближайшая по форме к этому разделу — LinearPrice, у которой цена равна p(s) = a·s, а стоимость поэтому квадратична. Этот раздел сохранён как общее рассмотрение полиномиальной кривой.

Virtual-reserves CPMM (стиль Pump)

Кривая — это стандартный CPMM с воображаемым начальным резервом quote V_q:
Спотовая цена:
Стоимость перемещения от s_0 к s_1:
Этот вариант обладает элегантным свойством: при выпуске (где s = S_graduate), предельная цена равна цене открытия нижестоящего CPMM-пула, заполненного резервами (S_max − S_graduate, V_q + cost(0, S_graduate)). Передача неразрывна. LaunchLab предоставляет это как curve_type = 0 (ConstantProduct) — тип по умолчанию и единственный, для которого сегодня существуют активные конфигурации.

Дискретная реализация

На цепи s и cost — оба целые числа (единицы минимального номинала). Непрерывный интеграл cost(s_0, s_1) вычисляется прямо из закрытой формы, когда она существует (линейная, квадратичная). Для кривых без закрытой обратной формы (квадратичная, при известной cost найти s_1) используется итерация Ньютона:
Это общий численный рецепт, а не реализация LaunchLab. В LaunchLab нет решателя Ньютона и нет ошибки NotConverged — ни одной из трёх его кривых он не нужен. Кривая постоянного произведения обращается в замкнутой форме, кривая фиксированной цены — это деление, а квадратичная стоимость кривой линейной цены обращается через квадратный корень. Даже приведённый выше случай квадратичной цены имеет точную замкнутую форму s₁ = ∛(s₀³ + 3·cost/k), которая и используется в сниппете как начальное приближение.

Интеграция комиссий

Комиссии применяются поверх стоимости кривой, не внутри неё. При покупке:
При продаже:
LP-часть комиссии остаётся в quote_vault и фактически делает кривую более крутой для будущих покупателей — резерв растёт без выпуска дополнительного предложения. Части протокола и создателя отслеживаются в отдельных счётчиках для последующего снятия.

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

Кривая «выпускается», когда она получила достаточно залога для запуска внешнего AMM-пула по цене, соответствующей текущей цене кривой. Для квадратичной кривой с параметрами (k, S_max, S_graduate):
Как только quote_vault ≥ quote_to_graduate, инструкция Graduate создаёт CPMM-пул с:
Для кривой virtual-reserves по конструкции:
Для квадратичной кривой это равенство не выполняется: интегрированная средняя цена лежит строго выше предельной цены, поэтому CPMM открывается выше p(S_graduate) на фиксированный множитель (см. разобранный пример). Только кривая постоянного произведения / виртуальных резервов — та, которую LaunchLab действительно использует — непрерывна по цене при передаче.

Непостоянство против CPMM-пула

Чистый запуск с кривой привязки имеет нулевое непостоянство в смысле Uniswap: нет «другой стороны» рынка для переуравновешивания. Кривая выпускает предложение по требованию, и единственный «LP» — это сам контракт. После выпуска полученный CPMM-пул ведёт себя как любой другой CPMM-пул — если LP не был сожжён, он подвержен обычной динамике непостоянных потерь. Вот почему сжигание после выпуска — доминирующая политика в публичных запусках: оно делает пул постоянным и устраняет ценовые шоки, вызванные выводом LP.

Выполненный пример

Кривая: квадратичная, k = 40, S_max = 1e9, S_graduate = 0.8 · S_max = 8e8. Комиссия на покупку 1%.

Цена при s = 5e8

10 единиц quote на одну единицу base.

Стоимость первой покупки 1e6 base

С комиссией 1%:

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

Цена при выпуске

Резервы CPMM после выпуска

Это не p(8e8) = 25.6 — это ровно 4/3 от него. Для любой кривой с квадратичной ценой интегрированное среднее равно p(s)/3 · s / s, поэтому cost(0,s)/s = p(s)/3 · ... даёт 4/3 · p(s), когда оставшееся предложение равно 1 − 0.8. Следовательно, квадратичная передача не является непрерывной по цене. Только кривая постоянного произведения / виртуальных резервов обладает описанным выше свойством точного равенства; квадратичный запуск показывает скачок при выпуске.

Ссылки

Источники:
  • Исходный код программы Raydium LaunchLab (реализация квадратичной кривой и virtual-reserves).
  • Белая книга Bancor (линейные кривые привязки, исторический контекст).
  • Публичные анализы ошибок Pump.fun (вариант virtual-reserves).