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

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

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

Замораживание NFT позиций CLMM для ограниченных издателей

Счета NFT позиций остаются разморожены по умолчанию. CLMM замораживает позицию только когда позиция использует V2 open path и текущий freeze_authority хотя бы одной монеты хранилища совпадает с жёстко закодированным списком ограниченных издателей. Начальный список содержит тот же authority, используемый путём обнаружения Superstate ниже. Установка пула PDA как freeze authority монеты NFT позиции сама по себе не является замораживанием. Это правило хранения позиции, а не ещё один allow-list при создании пула:
  • Пул может уже существовать и оставаться доступным для свопов.
  • Монета NFT позиции использует пул PDA CLMM как свой собственный freeze authority; базовый издатель не контролирует NFT позиции.
  • OpenPositionV2 охватывает классические SPL NFT позиций над активами пула Token-2022. OpenPositionWithToken22Nft охватывает NFT позиций Token-2022.
  • OpenPosition V1 не проверяет монеты хранилища и не может служить активам Token-2022 с ограничениями, на которые нацелен поставляемый список.
  • Существующие позиции не изменяются.
Замороженные позиции остаются управляемыми их владельцем, но не могут быть переданы. ClosePosition размораживает и сжигает атомарно, когда клиент передаёт пул как первый оставшийся счёт. См. products/clmm/ticks-and-positions.

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 и проверка расширения не выполняется. Эти адреса запечены в программу; обновление списка требует обновления программы через мультиподпись 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 просто запустится при каждой передаче и может заблокировать свопы. Поэтому внесение в whitelist — это действие высокого доверия.

Семантика “Blocked”

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

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

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

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

Для монет с TransferFeeConfig каждый своп, депозит и вывод перемещают меньше номинальной суммы. 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 выбирает по текущей эпохе. Оба SwapV2 CPMM и SwapV2 CLMM передают полный счёт монеты в accounts, поэтому программа читает правильную конфигурацию без дополнительного поиска. Если вы цитируете более чем одну эпоху заранее через Trade API или SDK, выполненная комиссия может отличаться от цитируемой комиссии — ограничена maximum_fee_basis_points более старой конфигурации.

Interest-bearing и ScaledUiAmount

Пул держит основную сумму; “UI amount” — это основная сумма, умноженная на зависящий от времени или установленный администратором коэффициент масштабирования. Математика свопа работает с основной суммой:
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 вне цепи перед тем, как открыть создание пула в вашем 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 в allow-list на уровне Solana (соглашение экосистемы развивается).
  • 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 — создание базовой монеты Token-2022 LaunchLab.