Перейти к основному содержанию
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Заменено 2026-10-22. CreatePermissionedPool был переименован в CreateCustomizablePoolV2 и сделан разрешённым для всех, а аккаунт Permission с CreatePermissionPda / ClosePermissionPda был удалён. Эта запись описывает программу на момент 2026-07-30. См. запись от 2026-10-22.
Этот релиз документирует два изменения в программе 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/accounts — Permission в инвентаре и его собственный раздел, поле 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).