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

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

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

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

Счета NFT позиций остаются разморожены по умолчанию. CLMM замораживает позицию только когда позиция использует V2 открытый путь и текущий freeze_authority хотя бы одного минта хранилища появляется в жёсткой кодировке списка frozen_position_nft_authorities::IDS. Этот список заменил более раннее обнаружение токена Superstate в CLMM и несёт ту же полномочия эмитента, которые совпадали со старой эвристикой. Установка пула PDA как freeze_authority минта NFT позиции сама по себе не является замораживанием. Это правило хранения позиции, а не список разрешений при создании пула:
  • Пул может уже существовать и оставаться доступным для свопов.
  • Минт 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 запустил бы свой хук на каждой покупке, продаже и требовании комиссии в каждом пуле, котируемом в нём, а минт 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 registry authorities. В обеих программах инструкция принимает либо crate::admin::ID, либо выделенный орган этой программы, и требует, чтобы минт принадлежал Token-2022. Эффект: конкретный минт Token-2022 может быть включён в создание пула без обновления программы — вот почему жёсткие кодировки списков могли быть удалены. Каждая программа консультирует реестр из каждого пути создания пула, который у неё есть: CPMM из Initialize и InitializeWithPermission (последний — это то, что используют выпуски LaunchLab, поэтому зарегистрированный минт выпускается так же, как создаётся), CLMM из CreatePool, CreateCustomizablePool и CreateCustomizablePoolV2.

Удалённые обходные пути

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

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

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

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

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

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

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

Семантика «заблокировано»

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

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

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

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

Для минтов с TransferFeeConfig каждый своп, депозит и вывод перемещают меньше номинальной суммы. Задействованы два отдельных числа, и 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 выбирает по текущей эпохе. Оба SwapV2 CPMM и SwapV2 CLMM передают полный счёт минта в accounts, поэтому программа читает правильную конфигурацию без дополнительного поиска. Если вы цитируете более чем на одну эпоху вперёд через Trade API или SDK, выполненная комиссия может отличаться от цитируемой комиссии — ограничена maximum_fee_basis_points конфигурации старшей версии.

Приносящие проценты и ScaledUiAmount

Пул содержит основную сумму; «сумма UI» — это основная сумма, умноженная на зависящий от времени или установленный администратором коэффициент масштабирования. Математика свопа работает с основной суммой:
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 — создание базового минта LaunchLab Token-2022.
  • raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs — привязка минта котировки LaunchLab (без проверки расширения).