Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Raydium не принимает произвольные минты Token-2022. Как CPMM, так и CLMM работают в строгом режиме списка разрешений: по умолчанию проходит только небольшой набор расширений; всё остальное отклоняется при создании пула. Каждая программа допускает отдельный минт через один механизм — управляемый администратором реестр PDA для каждого минта. Обе программы также содержали жёсткие обходы в разных местах; все они теперь удалены. Эта страница — единственный справочник по тому, что применяется и где, со ссылками на исходный код программы.

Поддержка на уровне программы

Проверки списка разрешений находятся в: На CPMM или CLMM нет проверки минта во время swap — ограничение срабатывает только при создании пула. Как только пул существует, swap просто доверяет, что минты не изменились, что верно для неизменяемых частей состояния минта Token-2022.

Замораживание позиционных NFT CLMM для ограниченных эмитентов

Счета позиционных NFT остаются разморожены по умолчанию. CLMM замораживает один только когда позиция использует V2 открытый путь и текущий freeze_authority хотя бы одного минта хранилища появляется в жёсткой кодировке списка frozen_position_nft_authorities::IDS. Этот список заменил более раннее обнаружение токена Superstate в CLMM и несёт ту же полномочия эмитента, которые совпадали со старой эвристикой. Установка пула PDA как freeze_authority минта позиционного NFT сама по себе не является замораживанием. Это правило хранения позиций, а не список разрешений при создании пула:
  • Пул может уже существовать и оставаться пригодным для swap.
  • Минт позиционного NFT использует пул PDA CLMM как свой собственный freeze_authority; базовый эмитент не контролирует позиционный NFT.
  • OpenPositionV2 охватывает классические позиционные NFT SPL над активами пула Token-2022. OpenPositionWithToken22Nft охватывает позиционные NFT Token-2022.
  • OpenPosition V1 не проверяет минты хранилища и не может служить активам Token-2022 с ограничениями, на которые нацелен отправленный список.
  • Существующие позиции не изменяются.
Замороженные позиции остаются управляемыми их владельцем, но не могут быть переданы. ClosePosition размораживает и сжигает атомарно, когда клиент передаёт пул как первый оставшийся счёт. См. products/clmm/ticks-and-positions.

Минты quote LaunchLab

Два минта LaunchLab имеют очень разные ограничения, и асимметрия легко упустить.
  • Минт base — LaunchLab его создаёт. Минт base Token-2022 доступен только через initialize_with_token_2022, и программа будет прикреплять только MetadataPointer и (опционально) TransferFeeConfig. Всё остальное возвращает NoSupportExtension. Уже существующий минт Token-2022 вообще не может быть предоставлен как base. Когда TransferFeeConfig прикреплён, transfer_fee_config_authority минта является PDA полномочий запуска до выпуска, в то время как его withdraw_withheld_authority является настроенным платформой transfer_fee_extension_auth с момента создания минта — сама программа launchpad не имеет инструкции для вывода удержанного. См. products/launchlab/platform-config.
  • Минт quote — LaunchLab его не создаёт и не проверяет. CreateConfig принимает счёт минта как есть, поэтому на стороне quote нет эквивалента is_supported_mint. Единственное ограничение — какие минты администратор выбирает для привязки к GlobalConfig.
Это делает привязку минта quote Token-2022 действием высокого доверия, по той же причине, что и регистрация минта ниже: минт quote с TransferHook запустил бы свой hook при каждой покупке, продаже и требовании комиссии в каждом пуле, котируемом в нём, а минт quote с PermanentDelegate позволил бы делегату очистить хранилища quote этих пулов. Ни один из них не блокируется программой. То, что LaunchLab правильно обрабатывает после привязки минта quote:
  • Хранилище quote, оба хранилища комиссий и счёт получателя комиссии за акции создаются в собственной программе минта quote.
  • TransferFeeConfig на стороне quote учитывается во всех четырёх инструкциях торговли, и граница проскальзывания проверяется против чистой суммы плательщика, а не против валового движения хранилища. См. products/launchlab/instructions.
  • PoolState.token_program_flag записывает программы обоих минтов — бит0 для минта base, бит1 для минта quote. Декодируйте по битам; байт не является логическим значением. См. products/launchlab/accounts.
Устаревшая инструкция Initialize по-прежнему принимает устаревшую программу quote, поэтому конфиг с минтом quote Token-2022 доступен только через InitializeV2 и InitializeWithToken2022.

Список разрешённых расширений CPMM и CLMM

После двух коротких замыканий, описанных ниже, программа перебирает расширения минта и отклоняет минт, если он содержит любое расширение, отличное от этих пяти: Всё, что не в этом списке — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable и т. д. — заставляет is_supported_mint вернуть false и создание пула откатиться. Соответствующие строки (CPMM, идентичная форма в CLMM):
— cp-swap/src/utils/token.rs

Пути обхода

Минт Token-2022, который не подходит под список разрешений, всё ещё может быть допущен через один механизм в каждой программе. Обе программы также содержали жёсткие обходы в прошлом; ни один из них не сохранился. is_supported_mint теперь является функцией, идентичной байт в байт в обеих программах: минты классического SPL Token проходят, минт с реестром PDA проходит, и всё остальное должно содержать только разрешённые расширения.

Единственный обход: реестр для каждого минта

Обе программы консультируют PDA SupportMintAssociated с seed [b"support_mint", mint]. Если этот PDA существует для минта, минт допускается независимо от его набора расширений. Каждая программа имеет свою копию PDA (они выводятся под разными ID программ), свою пару CreateSupportMintAssociated / CloseSupportMintAssociated и свой выделенный полномочия рядом с общим администратором: Четыре ключа (CPMM и CLMM × mainnet и devnet) перечислены в разделе Администраторские власти реестра support-mint. В обеих программах инструкция принимает либо crate::admin::ID, либо выделенный полномочия этой программы, и требует, чтобы минт был владельцем Token-2022. Эффект: конкретный минт Token-2022 может быть включен в создание пула без обновления программы — вот почему жёсткие кодированные списки могли быть удалены. Каждая программа консультирует реестр из каждого пути создания пула, который она имеет: CPMM из Initialize и InitializeWithPermission (последний — это то, что используют выпуски LaunchLab, поэтому зарегистрированный минт выпускается так же, как создаётся), CLMM из CreatePool, CreateCustomizablePool и CreatePermissionedPool.

Удалённые обходы

Оба жёсткие кодированные механизма удалены из развёрнутых программ. Они документированы здесь только потому, что интеграции, написанные для более старого поведения, могут по-прежнему предполагать их.

Статический MINT_WHITELIST — удалён

Постоянный массив адресов минтов в base58 использовался для короткого замыкания is_supported_mint перед итерацией расширений. CLMM содержал шесть адресов и был удалён 2026-07-24; CPMM содержал первые четыре из того же набора и был удалён в обновлении 2026-09-09. Пул, который уже существует для одного из этих минтов, продолжает торговать — проверка минта выполняется только при создании пула. Создание нового пула для одного теперь требует вместо этого реестра PDA для него.

Обнаружение формы полномочий Superstate — удалено

CLMM кратко идентифицировал токенизированные активы Superstate по форме их полномочий, а не по адресу: минт Token-2022, чей freeze_authority и постоянный делегат оба равнялись superstate_allowlist::ID, с DefaultAccountState, установленным на Frozen, был допущен. Это была эвристика, поэтому любой будущий минт с той же формой был бы автоматически допущен. Он был удалён 2026-07-31 вместе с модулем superstate_allowlist. То, что его заменило, уже и служит другой цели: frozen_position_nft_authorities::IDS, который ничего не допускает — он решает, получает ли позиционный NFT замораживание, и описан выше. Единственный полномочия эмитента, который совпадала со старой эвристикой, является единственной записью в этом списке.

Что обходы не отменяют

Обходы пропускают список разрешённых расширений, но программа по-прежнему применяет:
  • Минт принадлежит либо Token, либо Token-2022. Пользовательская программа токена отклоняется выше по течению.
  • Хранилища пула создаются с правильными расширениями ATA для пулов Token-2022 (ImmutableOwner и т. д.).
  • Все передачи проходят через transfer_checked — минты с комиссией приземляют правильную сумму в хранилище.
Минт в списке разрешений или зарегистрированный в PDA, который позже добавляет TransferHook, не получает проверку во время swap; hook просто запустится при каждой передаче и может заблокировать swap. Регистрация минта — это действие высокого доверия.

Семантика “заблокировано”

Когда is_supported_mint возвращает false, создание пула откатывается с ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM). См. reference/error-codes для числовых кодов. Существующие пулы не могут ретроактивно не пройти эту проверку — ограничение выполняется только при создании. Расширения минта неизменяемы для категорий, которые Raydium отклоняет (transfer hook, non-transferable, confidential transfer не могут быть добавлены после создания), поэтому статической проверки достаточно.

Почему каждое исключённое расширение исключено

  • TransferHook — вызывает пользовательскую программу при каждой передаче с произвольным потреблением CU, произвольными условиями отказа и способностью повторно входить в вызывающую программу. Безопасной песочницы не существует. Некоторые DEX поддерживают списки разрешений hook; Raydium — нет.
  • NonTransferable — Transfer всегда не удаётся. Пул не может взять под опеку.
  • ConfidentialTransfer — суммы передачи зашифрованы; кривая не может оценить swap.
  • PermanentDelegate — держатель делегата может очистить любой счёт токена, включая хранилище пула. Допустимо только путём регистрации минта, что является тем, как доверенный эмитент (например, регулируемая стабилизированная монета) подключается в каждом случае.
  • MintCloseAuthority — минт может быть закрыт; существующие пулы становятся непригодными для использования. Запрещено по умолчанию.
  • DefaultAccountState (Frozen) — ATA пула приземлятся в состояние Frozen и потребуют размораживания для каждого счёта. Допустимо только путём регистрации минта, что предполагает, что эмитент размораживает институциональные счета при регистрации.
  • Group/Member pointers — не активно вредны, но не проверены. Запрещены по умолчанию, чтобы сохранить поверхность узкой.

Учёт комиссии за передачу

Для минтов с TransferFeeConfig каждый swap, депозит и вывод перемещают меньше номинальной суммы. Задействованы два отдельных числа, и SDK держит их отдельно:
  • Комиссия пула (LP + протокол + фонд + создатель) поступает из кривой. raydium.cpmm.computeSwapAmount({ ... }) возвращает её как fee, наряду с amountIn, amountOut, minAmountOut, executionPrice, priceImpact и сырым swapResult.
  • Комиссия за передачу Token-2022 поступает из минта, а не из пула. Она вычисляется помощниками getTransferAmountFee в @raydium-io/raydium-sdk-v2, которые возвращают GetTransferAmountFee:
Депозит и вывод выводят его напрямую: computePairAmount возвращает inputAmountFee и anotherAmount как значения GetTransferAmountFee. Правильный UI показывает:
  • входящую сумму плюс её передачу fee как “вы отправляете”
  • исходящую сумму минус её передачу fee как “вы получаете”
  • комиссию пула fee как отдельную строку — это не комиссия Token-2022
Наивный UI, который показывает только amountIn → amountOut, занижает затраты. Передайте epochInfo из кластера в эти помощники, а не кешируйте его; эпоха — это то, что выбирает между конфигурацией комиссии older и newer минта.

Крышка maximumFee

Комиссии за передачу Token-2022 ограничены за передачу. Для минта с 1% и крышкой 10 000 токенов передача 100 000 000 токенов платит только 10 000 в комиссии. computeSwapAmount SDK применяет крышку; прямые вызывающие программы должны её воспроизвести.

Переход эпохи

Полномочия минта могут запланировать изменение ставки комиссии, которое активируется в следующую эпоху. Во время окна переходов две конфигурации (older, newer) живут на минте одновременно и TransferChecked выбирает по текущей эпохе. Как CPMM SwapV2, так и CLMM SwapV2 передают полный счёт минта в accounts, поэтому программа читает правильную конфигурацию без дополнительного поиска. Если вы котируете более одной эпохи вперёд через Trade API или SDK, выполненная комиссия может отличаться от котируемой комиссии — ограничена maximum_fee_basis_points конфигурации older.

Interest-bearing и ScaledUiAmount

Пул содержит основную сумму; “UI сумма” — это основная сумма, умноженная на зависящий от времени или установленный администратором коэффициент масштабирования. Математика swap работает с основной суммой:
SDK преобразует автоматически. Прямые читатели RPC должны рассматривать pool.token0Vault.amount как основную сумму.

Определение “пула Token-2022”

Пул является пулом Token-2022, если любой минт имеет programId == TokenzQdB.... API выводит это:
Используйте programId для отправки и hasTransferFee для вывода предупреждения UI.

Помощники SDK

Распространённые ошибки интеграции

  • Предварительная проверка только ID программы. Минт может быть Token-2022 и неподдерживаемым. Пройдитесь по списку расширений против списка разрешений и проверьте реестр PDA минта перед разрешением создания пула.
  • Доверие котировке SDK, когда минт вообще не принят. API котировки не отказывает в котировке — создание пула — это то, что откатывается. Подтвердите семантику is_supported_mint вне цепи перед раскрытием создания пула в вашем UI.
  • Котировка без скидки на комиссию за передачу. Минт с комиссией за передачу 1% с обеих сторон пула CPMM 0,25% имеет эффективную комиссию около 2,25%, а не 0,25%. Используйте котировку SDK или котировку Trade API — никогда не вычисляйте комиссию вручную только из уровня комиссии пула.
  • Вызов устаревшей инструкции Swap на пуле Token-2022. Swap предшествует Token-2022. Используйте SwapV2 всякий раз, когда любой минт является Token-2022.
  • Автоматический список новых минтов Token-2022. Кошельки и агрегаторы должны проверять TransferHook и NonTransferable перед выводом минта пользователям; оба враждебны Raydium.

Будущая работа

Элементы дорожной карты экосистемы Solana и протокола, которые изменили бы эту матрицу:
  • Списки разрешений transfer-hook программ на уровне Solana (соглашение экосистемы развивается).
  • AMM, совместимые с конфиденциальной передачей (этап исследования).
  • Более широкий реестр CPMM для каждого минта (паритет с CLMM).
  • Общественный путь чтения для реестра, чтобы UI мог сказать “неподдерживаемый” от “неподдерживаемый, но зарегистрированный” без самостоятельного вывода PDA.
Эта страница будет обновлена, когда любой из них приземлится.

Указатели

Источники:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rs — is_supported_mint, support_mint_associated_is_initialized.
  • raydium-clmm/programs/amm/src/util/token.rs — is_supported_mint, support_mint_associated_is_initialized, frozen_position_nft_authorities, position_nft_must_freeze.
  • raydium-clmm/programs/amm/src/instructions/admin/create_support_mint_associated.rs — инструкция реестра для каждого минта.
  • raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs — создание базового минта Token-2022 LaunchLab.
  • raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs — привязка минта quote LaunchLab (без проверки расширений).