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

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

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

Список разрешений расширений CPMM и CLMM

После проверок статического списка (описаны ниже) программа проходит по расширениям mint и отклоняет mint, если он содержит любое расширение, отличное от этих пяти: Что угодно не из этого списка — 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, не входящий в список разрешений, может быть допущен через один из трех явных путей обхода. Они пробуются по порядку, перед тем как выполняется проверка расширений.

1. Статический список адресов токенов

Постоянный массив MINT_WHITELIST строк в формате base58 зашифрован в каждой программе. Если адрес mint совпадает, функция сразу же возвращает true и проверка расширений не выполняется. Эти адреса встроены в программу; обновление списка требует обновления программы через мультиподпись 3/4.

2. Реестр для каждого токена — только CLMM

CLMM дополнительно обращается к SupportMintAssociated PDA с seed [b"support_mint", mint]. Если этот PDA существует для токена, токен допускается независимо от набора его расширений. PDA создается инструкцией CreateSupportMintAssociated (admin/create_support_mint_associated.rs). Инструкция защищена двумя подписантами:
  • crate::admin::ID — стандартный орган администратора Raydium.
  • crate::create_support_mint_associated_owner::ID — выделенный орган для этой цели: RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY (mainnet), rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5 (devnet).
Эффект: команда CLMM может добавить конкретный токен Token-2022 в создание пула без обновления программы. CPMM не имеет эквивалента — его список разрешений строго задан в исходном коде.

3. Обнаружение Superstate — только CLMM

CLMM имеет третий путь специально для токенизированных активов Superstate, которые используют расширение ScaledUiConfig, которое версия spl-token-2022, связанная с программой CLMM, не может распаковать. Вместо обновления зависимости CLMM обнаруживает токены Superstate по их форме orган:
raydium-clmm/programs/amm/src/util/token.rs:485 Mint проходит эту проверку, если все четыре условия верны:
  • Его владелец программ — программа Token-2022.
  • Его freeze authority равен superstate_allowlist::ID. Mainnet: 2Yq4T3mPNfjtEyTxSbRjRKqLf1pwbTasuCQrWe6QpM7x. Devnet: 3TRuL3MFvzHaUfQAb6EsSAbQhWdhmYrKxEiViVkdQfXu.
  • Его расширение DefaultAccountState установлено в Frozen.
  • Его постоянный делегат также superstate_allowlist::ID.
Это эвристика, а не реестр — любой будущий токен, который выпустит Superstate с тем же органом, будет допущен автоматически.

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

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

Семантика “заблокировано”

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

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

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

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

Для mint с TransferFeeConfig, каждый своп, депозит и вывод перемещают меньше номинальной суммы. SDK поверхностно представляет обе половины расчета:
Правильный UI показывает:
  • amountIn + token2022FeeIn как “вы отправляете”
  • amountOut - token2022FeeOut как “вы получаете”
  • feeAmount как комиссию пула (LP + протокол), которая отделена от комиссии передачи Token-2022
Наивный UI, который показывает только amountIn → amountOut, занижает затраты.

Предел maximumFee

Комиссии за передачу Token-2022 ограничены за передачу. Для mint с 1% ставкой и лимитом 10 000 токенов, передача 100 000 000 токенов платит только 10 000 в комиссии. SDK computeSwapAmount применяет предел; прямые вызывающие программу должны воспроизвести это.

Переход на новую эпоху

Орган mint может запланировать изменение ставки комиссии, которое активируется в следующую эпоху. Во время переходного окна два конфигурации (older, newer) существуют на mint одновременно и TransferChecked выбирает по текущей эпохе. И CPMM SwapV2, и CLMM SwapV2 передают полный аккаунт mint в accounts, поэтому программа читает правильную конфигурацию без дополнительного поиска. Если вы котируете более чем на одну эпоху вперед через Trade API или SDK, выполненная комиссия может отличаться от котируемой комиссии — ограничено maximum_fee_basis_points старой конфигурации.

Interest-bearing и ScaledUiAmount

Пул держит основную сумму; “UI сумма” — основная сумма, умноженная на зависимый от времени или установленный администратором масштабный коэффициент. Математика свопа работает с основной суммой:
SDK преобразует автоматически. Прямые читатели RPC должны рассматривать pool.token0Vault.amount как основную сумму.

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

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

Помощники SDK

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

  • Предварительная проверка только ID программы. Mint может быть Token-2022 и неподдерживаемым. Проверьте список расширений по списку разрешений (и статическому списку) перед разрешением создания пула.
  • Доверие цитате SDK, когда mint вообще не принят. API цитаты не отказывает в цитировании — создание пула — это то, что откатывается. Подтвердите семантику is_supported_mint офф-чейн перед открытием создания пула в вашем UI.
  • Цитирование без скидки на комиссию передачи. Mint с комиссией передачи 1% с обеих сторон пула CPMM с 0.25% имеет эффективную комиссию около 2.25%, а не 0.25%. Используйте цитату SDK или цитату Trade API — никогда не вычисляйте комиссию вручную только с уровня комиссии пула.
  • Вызов устаревшей инструкции Swap для пула Token-2022. Swap предшествует Token-2022. Используйте SwapV2 всякий раз, когда любой mint — Token-2022.
  • Автоматический список новых токенов Token-2022. Кошельки и агрегаторы должны проверять TransferHook и NonTransferable перед отображением токена пользователям; оба враждебны Raydium.

Будущая работа

Элементы дорожной карты экосистемы Solana и протокола, которые изменили бы эту матрицу:
  • Разрешенные на уровне Solana программы transfer-hook (соглашение об экосистеме развивается).
  • AMM, совместимые с confidential-transfer (стадия исследования).
  • Более широкий реестр 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 — инструкция реестра для каждого токена.
  • raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs — создание базового mint Token-2022 LaunchLab.