> ## 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

> Формулы кривых, поддерживаемые LaunchLab, закрытые формы стоимости покупки и продажи, вывод порога градации и подробный пример запуска от первой покупки до градации.

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/products/launchlab/bonding-curve)
</Info>

<Info>
  LaunchLab поддерживает три форма кривых, выбираемые при `Initialize`: **constant-product** (наиболее распространённая, форма с виртуальными резервами классической кривой `x · y = k`), **linear-price** и **fixed-price**. Формула порога градации одинакова для всех трёх. На этой странице подробно разбирается математика constant-product; линейная и фиксированная формы описаны в конце.
</Info>

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

| Поле                                                         | Значение                                                                                                                                                         |
| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `curve_type`                                                 | `0` = 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`](/ru/products/launchlab/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`](/ru/products/launchlab/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.9` ⇒ `s ≈ 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, не видит скачков.

## Куда дальше

* [`products/launchlab/accounts`](/ru/products/launchlab/accounts) — поля `LaunchState`, хранящие эти параметры.
* [`products/launchlab/instructions`](/ru/products/launchlab/instructions) — списки аккаунтов для `Buy`, `Sell`, `Graduate`.
* [`algorithms/constant-product`](/ru/algorithms/constant-product) — математика CPMM, используемая пулом после градации.

Источники:

* [Raydium SDK v2 модуль `LaunchLab`](https://github.com/raydium-io/raydium-sdk-V2)
* Исходный код программы Raydium LaunchLab
