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

