Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Этот релиз документирует два изменения в программе CLMM. Оба являются дополнительными и обратно совместимыми: существующие пулы, позиции и открытые ордеры не затронуты, а классические пути CreatePool / CreateCustomizablePool остаются неизменными.

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

  • ID пулов теперь могут быть неканоническими, за шлюзом разрешений. Исторически существовал ровно один адрес CLMM пула на (amm_config, token_mint_0, token_mint_1) — PDA семена его фиксировали. Новая инструкция CreatePermissionedPool встраивает предоставленный клиентом ненулевой seed_index: u16 в семена PDA пула, позволяя авторизованному оператору создавать несколько пулов для одной пары и уровня комиссии, каждый по своему адресу. Поскольку произвольные адреса пулов — это привилегированная возможность, плательщик должен иметь Permission PDA, выданный администратором. Две административные инструкции, CreatePermissionPda и ClosePermissionPda, управляют этими разрешениями.
  • OpenLimitOrder теперь проверяет выходную сторону. Инструкция принимает три дополнительных счета — output_token_account, output_vault, output_vault_mint — и отклоняет ордер с NotApproved, если счет входного или выходного токена владельца заморожен. Это гарантирует, что заполнение может быть доставлено, что важно для разрешённых / замороженных по умолчанию токенов Token-2022. Клиенты, построенные на основе старого односторонного списка счетов, должны добавить три выходных счета.

Что изменилось в программе

Новая инструкция: CreatePermissionedPool

Та же форма и параметры, что и CreateCustomizablePool (она принимает те же CreateCustomizableParams, поэтому односторонняя комиссия и опция динамической комиссии доступны), плюс:
  • Аргумент seed_index: u16, который должен быть ненулевым. Он добавляется (little-endian) к семенам PDA пула: ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()].
  • Счет permission: PDA ["permission", payer]. Anchor отклоняет вызов, если он не существует или не принадлежит программе — его простое существование является авторизацией.
  • Счет pool_creator, записанный как pool_state.owner, который может отличаться от платящего payer.
seed_index = 0 остаётся зарезервированным для устаревших пулов: для них компонент семени сворачивается в пусто, воспроизводя классический четырёхсемянный адрес, поэтому ни один существующий адрес пула не меняется. См. Instructions → CreatePermissionedPool.

Новый счет: Permission

Счет возможности, существование которого является разрешением. Он хранит только authority, для которого был создан (плюс заполнение). Семена PDA: ["permission", authority]. Он предоставляет право вызывать CreatePermissionedPool и ничего больше — он не может перемещать средства, менять комиссии или изменять какой-либо пул. См. Accounts → Permission.

Новые административные инструкции: CreatePermissionPda / ClosePermissionPda

  • CreatePermissionPda инициализирует Permission PDA для данного permission_authority.
  • ClosePermissionPda закрывает его и возвращает ренту вызывающему, отзывая разрешение. Пулы, уже созданные под этим разрешением, не затронуты.
Обе принимают либо публичный ключ программы admin, либо выделенный ключ permission_pda_admin (отдельная константа на mainnet и devnet). См. Admin keys and multisig → CLMM.

PoolState: поле seed_index

Два байта были выделены из существующей области заполнения (padding: [u8; 6]seed_index: [u8; 2] + padding: [u8; 4]) сразу после fee_on. Общий размер счета не изменился, и миграция индексатора не требуется. Для пулов, созданных через CreatePool / CreateCustomizablePool, seed_index равен [0, 0]; для разрешённых пулов он содержит выбранный создателем индекс и требуется для повторного получения адреса пула в автономном режиме.

OpenLimitOrder: счета выходной стороны и защита от замороженных счётов

Список счетов OpenLimitOrder получает output_token_account, output_vault и output_vault_mint. Они используются только для проверки — выход не дебетуется при открытии. Обработчик теперь требует, чтобы ни входной, ни выходной счет токена не был заморожен, в противном случае возвращает NotApproved (тот же код уже возвращался, когда пул имел отключённый своп или лимитный ордер). Это закрывает пробел, где ордер мог быть открыт против счета токена, который никогда не мог получить заполнение (например, ещё не разморозившийся счет для замороженного по умолчанию токена Token-2022). См. Instructions → OpenLimitOrder.

Коды ошибок

Нет новых кодов ошибок. Существующий 6000 NotApproved теперь дополнительно охватывает замороженный входной/выходной счет токена и случаи отключённого своп/лимитного ордера на OpenLimitOrder, а также случай “подписант не является ни admin, ни permission_pda_admin” на инструкциях разрешений. Таблица кодов ошибок и нумерация в остальном не изменились с релиза 2026-05-18. См. Error codes → CLMM.

Заметки по миграции

  • Чтение адресов пулов: не предполагайте один пул на (config, mint0, mint1). Пара теперь может иметь канонический пул плюс один или несколько разрешённых пулов по адресам, полученным из seed_index. Перечисляйте пулы из API / индексатора вместо получения одного PDA и сохраняйте seed_index, когда вам нужно повторно получить адрес разрешённого пула.
  • Размещение лимитных ордеров: добавьте три счета выходной стороны в вашу транзакцию OpenLimitOrder и выведите чёткое сообщение, когда NotApproved возвращается для замороженного счета.
  • Без разрыва размера счета или макета: PoolState имеет тот же размер; вышедшие в отставку байты заполнения теперь содержат seed_index.

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

  • products/clmm/overview — заметка “What’s new” о разрешённых мультипулах и защите лимитного ордера.
  • products/clmm/instructions — новый раздел CreatePermissionedPool, CreatePermissionPda / ClosePermissionPda в таблице инструкций и примечании об административном шлюзе, а также обновлённый список счетов OpenLimitOrder / предусловия / ошибки.
  • products/clmm/accountsPermission в инвентаре и его собственный раздел, поле PoolState.seed_index, помощники для получения PDA (derivePermissionedPool, derivePermission) и краткая справка по жизненному циклу.
  • security/admin-and-multisig — новая строка permission_pda_admin и пояснение области разрешений в таблице ролей CLMM.
  • reference/error-codes — расширенное описание NotApproved.
Проверено против:
  • исходного кода raydium-clmm (create_permissioned_pool.rs, admin/create_permission_pda.rs, admin/close_permission_pda.rs, states/permission.rs, states/pool.rs, limit_order/open_limit_order.rs, lib.rs).