Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Поддержка на уровне программы
Проверки списка разрешений находятся в:
- CPMM:
is_supported_mintвraydium-cp-swap/programs/cp-swap/src/utils/token.rs, вызывается изInitializeиInitializeWithPermission. - CLMM:
is_supported_mintвraydium-clmm/programs/amm/src/util/token.rs, вызывается изCreatePool. - LaunchLab:
initialize_with_token_2022вraydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs(исходный код не является общедоступным).
Замораживание позиционных 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.OpenPositionV1 не проверяет минты хранилища и не может служить активам 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.
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 проходит, и всё остальное должно содержать только разрешённые расширения.
Единственный обход: реестр для каждого минта
Обе программы консультируют PDASupportMintAssociated с 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— минты с комиссией приземляют правильную сумму в хранилище.
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
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 работает с основной суммой: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.
Указатели
algorithms/token-2022-transfer-fees— математика комиссии в swap.products/cpmm/instructions—SwapV2,Initialize.products/clmm/instructions—SwapV2,CreatePool,CreateSupportMintAssociated.reference/error-codes— числовые кодыNotSupportMintдля каждой программы.
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 (без проверки расширений).

