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

# 2026-08-31 — LaunchLab: правила кривой платформы заменяют whitelist параметров кривой

> Ограничения параметров запуска переходят из PlatformConfig.curve_params в отдельные PlatformCurveRule-аккаунты с ограничениями (field, op, value), диапазонами значений, ORed-группами проверок и делегированным кошельком менеджера. PlatformConfig сохраняет размер 944 байта; устаревшее поле и две его инструкции удалены, добавлены семь кодов ошибок.

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

  [Открыть английскую версию →](/reference/changelog/2026-08-31-launchlab-platform-curve-rules)
</Info>

<Info>
  Эта запись описывает предстоящее обновление программы LaunchLab. Она была проверена на локальной ветке релиза перед развёртыванием. Перед использованием новых аккаунтов или инструкций убедитесь в развёрнутой версии программы.
</Info>

Платформа уже могла ограничивать, какие формы запуска могут выбирать её создатели, через `PlatformConfig.curve_params`. Этот механизм проверял **только точное совпадение**: запись либо фиксировала поле на одно значение, либо подстраивала его с помощью sentinel. Кроме того, он мог содержать максимум 10 записей для каждого `GlobalConfig`, который поддерживала платформа, и находился на самом аккаунте `PlatformConfig`, увеличивая его на 491 байт за запись.

Эти три свойства столкнулись по мере добавления конфигов в протокол. Выражение «целевой объём сбора средств между 50 и 200 SOL» требовало одной записи на каждое допустимое значение и было поэтому невозможно. Собственные пороги `GlobalConfig` тем временем были открыты широко — ставки 1 bps, границы предложения 99999 — именно чтобы каждая платформа вписалась под них, что оставило платформы без способа их сузить.

Этот релиз заменяет whitelist на **правила кривой**: один аккаунт `PlatformCurveRule` на пару (платформа, конфиг), содержащий до 10 групп проверок, каждая содержит до 25 ограничений `(field, op, value)` над 19 параметрами запуска, с операторами `Eq`, `Gte`, `Lte` и `Neq`. Ограничения внутри группы связаны AND, группы связаны OR. Диапазон — это `Gte` плюс `Lte` на одном поле.

Полная модель и девять рабочих примеров находятся на новой странице: [`products/launchlab/curve-rules`](/ru/products/launchlab/curve-rules).

## TL;DR для интеграторов

* **`PlatformConfig` сохраняет размер и все смещения существующих полей.** Это фиксированные 944 байта. `curve_params` удалён; `restrict_curve_param` (`u8`), `curve_rule_manager` (`Pubkey`) и 4 байта, которые занимал префикс длины вектора, выходят из padding, который сокращается со 107 до 78.
* **Декодеры должны отбросить завершающий вектор.** Декодер, который всё ещё ожидает `Vec<PlatformCurveParam>` после padding, прочитает два новых поля как байты вектора. Всё перед padding не затронуто, поэтому декодер, который читает только кошельки комиссий и ставки, продолжит работать без изменений.
* **Построители запусков нуждаются в одном дополнительном аккаунте, когда флаг включен.** Пока `restrict_curve_param` равен `1`, `InitializeV2` и `InitializeWithToken2022` требуют PDA правила в `remaining_accounts` — *включая когда аккаунт не существует*, чтобы его пропуск не мог обойти проверку. Вывод: `[b"platform_curve_rule", platform_config, global_config]`.
* **Ни одна платформа не ограничена по умолчанию.** `restrict_curve_param` равен `0` на каждом существующем аккаунте, и `0` означает, что программа вообще не читает правила.
* **Две инструкции удалены:** `UpdatePlatformCurveParam` и `RemovePlatformCurveParam`. Четыре добавлены: `CreatePlatformCurveRule`, `UpdatePlatformCurveRule`, `RemovePlatformCurveRule`, `ClosePlatformCurveRule`.
* **`UpdatePlatformConfig` получает два варианта:** `RestrictCurveParam(u64)` с индексом dispatch 13 и `CurveRuleManager(Pubkey)` с индексом 14. Существующие индексы 0–12 не изменены.
* **Семь кодов ошибок добавлены,** `6024`–`6030`. `6020` `CurveParamIsNotExist` сохранён как заполнитель, хотя его последний вызывающий удалён, поэтому ничто после него не сдвигается. См. [`reference/error-codes`](/ru/reference/error-codes).
* **Требуется обновление IDL.** Новый тип аккаунта, четыре новые инструкции, две удалены, два новых варианта dispatch, семь новых кодов ошибок.
* **Проверьте правила off-chain перед отправкой.** SDK предоставляет `checkLaunchAgainstCurveRule` (отражает проверку во время запуска, включая fail-closed поведение) и `checkCurveRuleGroupWritable` (отражает валидацию во время записи). Обе — чистые функции. См. [Check before you send](/ru/products/launchlab/curve-rules#check-before-you-send).
* **Репетируйте на devnet перед включением на mainnet.** Включение `restrict_curve_param` сразу же меняет, что могут делать ваши создатели. Рекомендуемая последовательность — включая запуск одного токена, который должен быть отклонён, чтобы доказать, что ваш построитель действительно проходит проверку правила — находится в [Test on devnet first](/ru/products/launchlab/curve-rules#test-on-devnet-first).

## Что может выразить правило, чего не мог whitelist

| Намерение                                                 | Whitelist                 | Правило кривой                                    |
| --------------------------------------------------------- | ------------------------- | ------------------------------------------------- |
| Одна точная форма запуска                                 | Одна запись               | Одна группа с ограничениями `Eq`                  |
| Целевой объём сбора средств в диапазоне                   | Невозможно выразить       | Два ограничения: `Gte` + `Lte`                    |
| Три уровня запуска                                        | Три записи, только точные | Три группы                                        |
| Диапазон валюации выпуска независимо от предложения       | Невозможно выразить       | Два ограничения на производный `FundRaisingRateB` |
| Пол того, что попадает в выпущенный пул                   | Невозможно выразить       | Одно ограничение на производный `MigrateRateA`    |
| Только SPL Token или только Token-2022                    | Невозможно выразить       | Одно ограничение на `BaseTokenProgram`            |
| «Если установлена комиссия за передачу, ограничьте её 1%» | Невозможно выразить       | Две группы, управляемые `TransferFeeEnabled`      |
| Правило, которое переключается в дату, без присмотра      | Невозможно выразить       | Две группы, управляемые `UnixTimestamp`           |

19 полей включают четыре производные ставки — `SellRateA`, `LockRate`, `MigrateRateA`, `FundRaisingRateB` — что делает правило портативным между предложениями вместо привязки к одному.

## Делегированное управление

`PlatformConfig.curve_rule_manager` — это горячий кошелёк, который может создавать, обновлять, удалять и закрывать аккаунты правил этой платформы. Редактирование правил — рутинная операция, и ключ администратора платформы обычно является multisig; это поле, которое держит multisig вне цикла. Установите его один раз через `UpdatePlatformConfig::CurveRuleManager`.

Администратор платформы сохраняет ту же власть параллельно — программа принимает его путём повторного вывода PDA `PlatformConfig` от подписывающего — поэтому потерянный ключ менеджера восстанавливается путём ротации поля. `Pubkey::default()` означает только администратора.

Скомпрометированный ключ менеджера может ослабить или удалить правила параметров и вернуть rent аккаунта правила. Он не может переключить `restrict_curve_param`, трогать кошельки комиссий, поле vesting или конфиг CPMM, или нарушить лимит `GlobalConfig`.

## Rent и размер

Аккаунт правила создаётся без группы и изменяется в размере при каждом изменении, поэтому платформа платит за правила, которые она действительно написала, и удаление группы возвращает разницу подписывающему.

| Содержимое правила              | Размер     | Rent         |
| ------------------------------- | ---------- | ------------ |
| Пусто                           | 150 байт   | \~0.0019 SOL |
| 1 группа, 2 ограничения         | 200 байт   | \~0.0023 SOL |
| 3 группы, 4 ограничения каждая  | 408 байт   | \~0.0037 SOL |
| 10 групп, 25 ограничений каждая | 4 790 байт | \~0.034 SOL  |

Поскольку размер динамический, декодеры должны читать фактическую длину аккаунта, а не предполагать константу.

## Стоимость вычислений при запуске

Проверка выполняется при каждом запуске, пока она включена. Измерено end-to-end — вывод PDA, сканирование `remaining_accounts`, десериализация, оценка:

| Содержимое правила              | Прямые поля | Производные поля |
| ------------------------------- | ----------- | ---------------- |
| Включено, нет аккаунта правила  | 1 936       | —                |
| 1 группа, 2 ограничения         | 2 576       | 2 926            |
| 3 группы, 4 ограничения каждая  | 3 624       | 5 724            |
| 10 групп, 25 ограничений каждая | 24 344      | 68 094           |

Производное ограничение стоит около 223 CU против около 48 для чтения прямого поля. Даже полностью загруженное правило остаётся в пределах трети бюджета по умолчанию 200 000 CU на инструкцию. Группы оцениваются до тех пор, пока одна не совпадёт, поэтому наиболее используемый уровень должен быть первым.

## Одноразовая миграция

Платформы, которые использовали whitelist, были перенесены протоколом в один проход, прежде чем флаг стал доступен для включения. Выделенный орган запустил одну транзакцию на платформу, которая перевела каждую устаревшую запись в группы проверок аккаунта правила конфига, который она назвала, очистила записи из `PlatformConfig` и сжала этот аккаунт обратно до 944 байт.

Перевод сохранил старую семантику точно: каждая запись стала одной группой, каждое не-sentinel поле стало одним ограничением `Eq`, и запись all-sentinel — которая совпадала с каждым запуском — стала группой без ограничений, которая также совпадает с каждым запуском.

Миграция написала правила, но не включила их. Перенесённая платформа оставалась неограниченной, пока она сама не установила `restrict_curve_param` на `1`. Инструкция миграции была удалена из программы теперь, когда проход завершён, вместе с устаревшим полем, которое она читала.

## Что не изменилось

* **`GlobalConfig`.** Тот же макет, те же лимиты, те же инструкции. Правила сужают эти лимиты и проверяются вместе с ними; они никогда не могут расширить один.
* **Списки аккаунтов и аргументы инструкций запуска.** `InitializeV2` и `InitializeWithToken2022` принимают те же фиксированные аккаунты и те же аргументы. Только `remaining_accounts` получает запись, и только пока флаг включен.
* **Пути торговли, выпуска, комиссии и vesting.** Не затронуты.
* **`PlatformAllowConfig`.** Не изменён и не связан: он решает, *какие конфиги* могут использовать запуски платформы, в то время как правило решает, *какие параметры* внутри конфига. Два флага независимы.
* **Коды ошибок `6000`–`6023`.** Не изменены, `6020` включён.
* **Размер `PlatformConfig` и смещения перед padding.** Не изменены, поэтому существующие аккаунты не нуждаются в собственной миграции.

## Обновлённые страницы

* `products/launchlab/curve-rules` — **новая страница.** Трёхуровневая модель, таблицы 19 полей и 4 операторов, девять примеров, ограничение типа кривой, два off-chain помощника проверки, последовательность репетиции devnet, делегированное управление, rent, порядок развёртывания и стоимость вычислений.
* `products/launchlab/platform-config` — «Whitelist параметров кривой» заменён на «Правила параметров запуска»; макет обновлён для `restrict_curve_param`, `curve_rule_manager` и 78-байтного padding; таблица пути обновления, фрагмент пути чтения и подводные камни переписаны.
* `products/launchlab/instructions` — новый раздел «Правила параметров запуска платформы», охватывающий четыре инструкции, их аккаунты, аргументы и ошибки; строка инвентаря заменена.
* `products/launchlab/accounts` — `PlatformCurveRule` добавлен в инвентарь и получил собственный раздел с полным макетом и предупреждением о переменном размере.
* `reference/error-codes` — `6024`–`6030` задокументированы; `6018` и `6020` аннотированы.
