Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Поддержка на уровне программы
Проверки allow-list находятся в:
- CPMM:
is_supported_mintвraydium-cp-swap/programs/cp-swap/src/utils/token.rs:178, вызывается изInitialize. - CLMM:
is_supported_mintвraydium-clmm/programs/amm/src/util/token.rs:280, вызывается изCreatePool. - LaunchLab:
initialize_with_token_2022вraydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs(исходный код не является общедоступным).
Замораживание позиционных NFT в CLMM для ограниченных издателей
Счета позиционных NFT остаются разморожены по умолчанию. CLMM замораживает позицию только когда позиция использует V2 open path и текущийfreeze_authority хотя бы одной монеты хранилища совпадает с жёстко закодированным списком ограниченных издателей. Начальный список содержит тот же authority, используемый путём обнаружения Superstate ниже. Установка PDA пула как freeze authority монеты позиционного NFT сама по себе не является замораживанием. Это правило хранения позиции, а не ещё один allow-list при создании пула:
- Пул может уже существовать и оставаться пригодным для 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 authority запуска до выпуска, аwithdraw_withheld_authority— это настроенный платформойtransfer_fee_extension_authс момента создания монеты — сама программа launchpad не имеет инструкции для вывода удержанных средств. См.products/launchlab/platform-config. - Монета quote — LaunchLab её не создаёт и не проверяет.
CreateConfigпринимает счёт монеты как есть, поэтому нет эквивалентаis_supported_mintна стороне quote. Единственное ограничение — какие монеты администратор выбирает привязать кGlobalConfig.
TransferHook запустит свой hook при каждой покупке, продаже и требовании комиссии в каждом пуле, котируемом в ней, а монета quote с PermanentDelegate позволит делегату очистить хранилища quote этих пулов. Ни то, ни другое не блокируется программой.
Что LaunchLab правильно обрабатывает после привязки монеты quote:
- Хранилище quote, оба хранилища комиссий и счёт получателя комиссии за акции создаются в собственной программе монеты quote.
TransferFeeConfigна стороне quote учитывается во всех четырёх инструкциях торговли, и граница slippage проверяется против чистой суммы плательщика, а не против валового движения хранилища. См.products/launchlab/instructions.PoolState.token_program_flagзаписывает программы обеих монет — бит0 для монеты base, бит1 для монеты quote. Декодируйте по битам; байт не является логическим значением. См.products/launchlab/accounts.
Initialize по-прежнему принимает программу quote только для legacy, поэтому конфиг с монетой quote Token-2022 доступен только через InitializeV2 и InitializeWithToken2022.
Allow-list расширений CPMM и CLMM
После того как статический whitelist срабатывает (рассмотрено ниже), программа перебирает расширения монеты и отклоняет монету, если она содержит любое расширение, отличное от этих пяти:
Всё остальное —
TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable и т. д. — заставляет is_supported_mint вернуть false и откатывает создание пула.
Соответствующие строки (CPMM, идентичная форма в CLMM):
cp-swap/src/utils/token.rs:190–200
Пути обхода
Монета Token-2022, которая не соответствует allow-list, всё ещё может быть допущена через один из трёх явных путей обхода. Они пробуются по порядку, прежде чем запускается итерация расширений.1. Статический whitelist монет
Константный массивMINT_WHITELIST строк base58 жёстко закодирован в каждой программе. Если адрес монеты совпадает, функция немедленно возвращает true и проверка расширения не выполняется.
Эти адреса встроены в программу; обновление списка требует обновления программы через multisig 3/4.
2. Реестр для каждой монеты — только CLMM
CLMM дополнительно консультирует PDASupportMintAssociated с seed [b"support_mint", mint]. Если этот PDA существует для монеты, она допускается независимо от её набора расширений.
PDA создаётся CreateSupportMintAssociated (admin/create_support_mint_associated.rs). Инструкция ограничена двумя подписантами:
crate::admin::ID— стандартный authority администратора Raydium.crate::create_support_mint_associated_owner::ID— выделенный authority для этой цели:RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY(mainnet),rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5(devnet).
3. Обнаружение Superstate — только CLMM
CLMM имеет третий путь специально для токенизированных активов Superstate, которые используют расширениеScaledUiConfig, которое версия spl-token-2022, связанная с программой CLMM, не может распаковать. Вместо обновления зависимости CLMM обнаруживает токены Superstate по форме их authority:
raydium-clmm/programs/amm/src/util/token.rs:485
Монета проходит эту ветвь, если все четыре условия выполнены:
- Её владеющая программа — это программа Token-2022.
- Её freeze authority равна
superstate_allowlist::ID. См.reference/program-addressesдля значений mainnet-beta и devnet. - Её расширение
DefaultAccountStateустановлено наFrozen. - Её permanent delegate также равен
superstate_allowlist::ID.
Что пути обхода не отменяют
Пути обхода пропускают allow-list расширений, но программа по-прежнему применяет:- Монета принадлежит либо
Token, либоToken-2022. Пользовательская программа токена отклоняется выше по потоку. - Хранилища пула создаются с правильными расширениями ATA для пулов Token-2022 (
ImmutableOwnerи т. д.). - Все передачи проходят через
transfer_checked— монеты с комиссией попадают в хранилище в правильном количестве.
TransferHook, не получает проверку во время swap; hook просто запустится при каждой передаче и может заблокировать swap. Поэтому внесение в whitelist — это действие высокого доверия.
Семантика “заблокировано”
Когдаis_supported_mint возвращает false, создание пула откатывается с ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM). См. reference/error-codes для числовых кодов.
Существующие пулы не могут ретроспективно не пройти эту проверку — ограничение срабатывает только при создании. Расширения монеты неизменяемы для категорий, которые Raydium отклоняет (transfer hook, non-transferable, confidential transfer не могут быть добавлены после создания), поэтому статической проверки достаточно.
Почему каждое исключённое расширение исключено
- TransferHook — вызывает пользовательскую программу при каждой передаче с произвольным потреблением CU, произвольными условиями отказа и способностью повторно входить в вызывающую программу. Безопасной песочницы не существует. Некоторые DEX поддерживают allow-list hook; Raydium — нет.
- NonTransferable —
Transferвсегда не удаётся. Пул не может взять под опеку. - ConfidentialTransfer — суммы передачи зашифрованы; кривая не может оценить swap.
- PermanentDelegate — держатель делегата может очистить любой счёт токена, включая хранилище пула. Разрешено только через статический whitelist для доверенных издателей (например, регулируемые stablecoin).
- MintCloseAuthority — монета может быть закрыта; существующие пулы становятся непригодными. Запрещено по умолчанию.
- DefaultAccountState (Frozen) — ATA пула попадут в состояние
Frozenи потребуют размораживания для каждого счёта. Разрешено только через обнаружение Superstate, которое предполагает, что издатель размораживает институциональные счета при регистрации. - Group/Member pointers — не активно вредны, но не проверены. Запрещены по умолчанию, чтобы сохранить поверхность узкой.
Учёт комиссий за передачу
Для монет сTransferFeeConfig каждый swap, депозит и вывод перемещают меньше номинальной суммы. SDK выводит обе половины расчёта:
amountIn + token2022FeeInкак “вы отправляете”amountOut - token2022FeeOutкак “вы получаете”feeAmountкак комиссию пула (LP + протокол), которая отделена от комиссии за передачу Token-2022
amountIn → amountOut, занижает затраты.
Ограничение maximumFee
Комиссии за передачу Token-2022 ограничены за передачу. Для монеты с 1% и ограничением в 10 000 токенов передача 100 000 000 токенов платит только 10 000 в комиссии. computeSwapAmount SDK применяет ограничение; прямые вызывающие программу должны его воспроизвести.
Переход эпохи
Authority монеты может запланировать изменение ставки комиссии, которое активируется в следующую эпоху. Во время окна переходов два конфига (older, newer) живут на монете одновременно и TransferChecked выбирает по текущей эпохе. CPMM SwapV2 и CLMM SwapV2 оба передают полный счёт монеты в accounts, поэтому программа читает правильный конфиг без дополнительного поиска.
Если вы котируете более чем на одну эпоху вперёд через Trade API или SDK, выполненная комиссия может отличаться от котируемой комиссии — ограничена maximum_fee_basis_points старого конфига.
Interest-bearing и ScaledUiAmount
Пул держит основную сумму; “UI сумма” — это основная сумма, умноженная на зависящий от времени или установленный администратором коэффициент масштабирования. Математика swap работает с основной суммой:pool.token0Vault.amount как основную сумму.
Определение “пула Token-2022”
Пул является пулом Token-2022, если любая монета имеетprogramId == TokenzQdB.... API выводит это:
programId для диспетчеризации и hasTransferFee для вывода предупреждения UI.
Помощники SDK
Распространённые ошибки интеграции
- Предварительная проверка только ID программы. Монета может быть Token-2022 и неподдерживаемой. Пройдитесь по списку расширений против allow-list (и статического whitelist) перед разрешением создания пула.
- Доверие к котировке SDK, когда монета вообще не принята. API котировки не отказывает в котировке — создание пула — это то, что откатывается. Подтвердите семантику
is_supported_mintoff-chain перед тем, как выставить создание пула в вашем 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 и протокола, которые изменили бы эту матрицу:- Allow-listed программы transfer-hook на уровне Solana (соглашение экосистемы развивается).
- AMM, совместимые с confidential-transfer (стадия исследования).
- Более широкий реестр per-mint для CPMM (паритет с CLMM).
- Обновление зависимости, чтобы декодирование
ScaledUiConfigв CLMM работало без эвристики Superstate.
Указатели
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—MINT_WHITELIST,is_supported_mint.raydium-clmm/programs/amm/src/util/token.rs—MINT_WHITELIST,superstate_allowlist,is_superstate_token,is_supported_mint.raydium-clmm/programs/amm/src/instructions/admin/create_support_mint_associated.rs— инструкция реестра per-mint.raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs— создание base-mint Token-2022 в LaunchLab.raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs— привязка quote-mint в LaunchLab (без проверки расширений).

