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

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

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

Замораживание позиционных 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.
  • 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 authority запуска до выпуска, а withdraw_withheld_authority — это настроенный платформой transfer_fee_extension_auth с момента создания монеты — сама программа launchpad не имеет инструкции для вывода удержанных средств. См. products/launchlab/platform-config.
  • Монета quote — LaunchLab её не создаёт и не проверяет. CreateConfig принимает счёт монеты как есть, поэтому нет эквивалента is_supported_mint на стороне quote. Единственное ограничение — какие монеты администратор выбирает привязать к GlobalConfig.
Это делает привязку монеты quote Token-2022 действием высокого доверия, с той же логикой, что и статические whitelist CPMM и CLMM ниже: монета quote с 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 дополнительно консультирует PDA SupportMintAssociated с 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).
Эффект: команда CLMM может включить конкретную монету Token-2022 в создание пула без обновления программы. CPMM не имеет эквивалента — его allow-list строго закодирован в исходном коде.

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.
Это эвристика, а не реестр — любая будущая монета, которую выпустит Superstate с той же формой authority, будет автоматически допущена.

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

Пути обхода пропускают allow-list расширений, но программа по-прежнему применяет:
  • Монета принадлежит либо Token, либо Token-2022. Пользовательская программа токена отклоняется выше по потоку.
  • Хранилища пула создаются с правильными расширениями ATA для пулов Token-2022 (ImmutableOwner и т. д.).
  • Все передачи проходят через transfer_checked — монеты с комиссией попадают в хранилище в правильном количестве.
Монета в whitelist или зарегистрированная в PDA, которая, например, позже добавляет 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 — нет.
  • NonTransferableTransfer всегда не удаётся. Пул не может взять под опеку.
  • ConfidentialTransfer — суммы передачи зашифрованы; кривая не может оценить swap.
  • PermanentDelegate — держатель делегата может очистить любой счёт токена, включая хранилище пула. Разрешено только через статический whitelist для доверенных издателей (например, регулируемые stablecoin).
  • MintCloseAuthority — монета может быть закрыта; существующие пулы становятся непригодными. Запрещено по умолчанию.
  • DefaultAccountState (Frozen) — ATA пула попадут в состояние Frozen и потребуют размораживания для каждого счёта. Разрешено только через обнаружение Superstate, которое предполагает, что издатель размораживает институциональные счета при регистрации.
  • Group/Member pointers — не активно вредны, но не проверены. Запрещены по умолчанию, чтобы сохранить поверхность узкой.

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

Для монет с TransferFeeConfig каждый swap, депозит и вывод перемещают меньше номинальной суммы. SDK выводит обе половины расчёта:
Правильный UI показывает:
  • amountIn + token2022FeeIn как “вы отправляете”
  • amountOut - token2022FeeOut как “вы получаете”
  • feeAmount как комиссию пула (LP + протокол), которая отделена от комиссии за передачу Token-2022
Наивный UI, который показывает только 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 работает с основной суммой:
SDK конвертирует автоматически. Прямые читатели RPC должны рассматривать pool.token0Vault.amount как основную сумму.

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

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

Помощники SDK

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

  • Предварительная проверка только ID программы. Монета может быть Token-2022 и неподдерживаемой. Пройдитесь по списку расширений против allow-list (и статического whitelist) перед разрешением создания пула.
  • Доверие к котировке SDK, когда монета вообще не принята. API котировки не отказывает в котировке — создание пула — это то, что откатывается. Подтвердите семантику is_supported_mint off-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.
Эта страница будет обновлена, когда что-либо из этого будет реализовано.

Указатели

Источники:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rsMINT_WHITELIST, is_supported_mint.
  • raydium-clmm/programs/amm/src/util/token.rsMINT_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 (без проверки расширений).