Перейти к основному содержанию

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

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

ПрограммаТокены Token-2022 base/quote?Режим
CPMMДа — с ограничениемСтрогий список разрешений расширений + статический список из 4 токенов.
CLMMДа — с ограничениемСтрогий список разрешений расширений + статический список из 6 токенов + управляемый администратором реестр + обнаружение Superstate.
AMM v4НетПрограмма предшествует Token-2022; оба токена должны быть классическим SPL Token.
Stable AMMНетТе же ограничения, что и AMM v4.
Farm v6ЧастичноТокен награды может быть Token-2022 (подчиняется тому же списку разрешений, если ферма обертывает LP из CPMM/CLMM); LP токены пользователей наследуют ограничения завернутого пула.
LaunchLabДа, управляется программойБазовый токен может быть Token-2022, но только через инструкцию initialize_with_token_2022; программа сама создает токен с MetadataPointer (всегда) и опционально TransferFeeConfig (ставка ≤ 5%). Уже существующие токены Token-2022 с произвольными расширениями не могут использоваться в качестве базового.
Burn & EarnЗеркалирует пул программыНаследует ограничения CPMM / CLMM.
Проверки списка разрешений находятся в: На CPMM и CLMM нет проверки токенов во время свопа — проверка срабатывает только при создании пула. После создания пула свопы просто доверяют тому, что токены не изменились, что корректно для неизменяемых частей состояния mint Token-2022.

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

После проверок статического списка (описаны ниже) программа проходит по расширениям mint и отклоняет mint, если он содержит любое расширение, отличное от этих пяти:
РасширениеПричина разрешения
TransferFeeConfigМатематика пула вычитает входящий сбор; программа Token-2022 обрабатывает исходящий сбор. См. algorithms/token-2022-transfer-fees.
MetadataPointerДекоративное — указывает на метаданные в сети.
TokenMetadataДекоративное — встроенные метаданные.
InterestBearingConfigПул видит основную сумму; множитель UI только для отображения, базовый баланс сохраняется.
ScaledUiAmountТа же структура, что и interest-bearing — масштабный коэффициент применяется только к отображению UI.
Что угодно не из этого списка — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable и т.д. — заставляет is_supported_mint вернуть false и транзакция создания пула откатывается. Соответствующие строки (CPMM, идентичная структура в CLMM):
for e in extensions {
    if e != ExtensionType::TransferFeeConfig
        && e != ExtensionType::MetadataPointer
        && e != ExtensionType::TokenMetadata
        && e != ExtensionType::InterestBearingConfig
        && e != ExtensionType::ScaledUiAmount
    {
        return Ok(false);
    }
}
Ok(true)
cp-swap/src/utils/token.rs:190–200

Пути обхода

Токен Token-2022, не входящий в список разрешений, может быть допущен через один из трех явных путей обхода. Они пробуются по порядку, перед тем как выполняется проверка расширений.

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

Постоянный массив MINT_WHITELIST строк в формате base58 зашифрован в каждой программе. Если адрес mint совпадает, функция сразу же возвращает true и проверка расширений не выполняется.
ПрограммаРазрешенные токены
CPMMHVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM, Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g, FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4, 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
CLMMТе же четыре, плюс DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg, AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9
Эти адреса встроены в программу; обновление списка требует обновления программы через мультиподпись 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ган:
superstate_allowlist::ID == freeze_authority
    && *mint_account_info.owner == spl_token_2022::ID
    && default_account_state_freeze
    && maybe_permanent_delegate
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 поверхностно представляет обе половины расчета:
const { amountIn, amountOut, feeAmount, token2022FeeIn, token2022FeeOut } =
  await raydium.cpmm.computeSwapAmount({ ... });
Правильный 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 сумма” — основная сумма, умноженная на зависимый от времени или установленный администратором масштабный коэффициент. Математика свопа работает с основной суммой:
principal_in = ui_amount_in / ui_multiplier(now)
SDK преобразует автоматически. Прямые читатели RPC должны рассматривать pool.token0Vault.amount как основную сумму.

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

Пул — это пул Token-2022, если либо mint имеет programId == TokenzQdB.... API показывает это:
GET /pools/info/ids?ids=<POOL_ID>
{
  "data": [{
    "mintA": { "programId": "TokenzQdB...", "hasTransferFee": true, ... },
    "mintB": { "programId": "Tokenkeg...", ... }
  }]
}
Используйте programId для распределения и hasTransferFee для отображения предупреждения UI.

Помощники SDK

import { Raydium, TOKEN_2022_PROGRAM_ID } from "@raydium-io/raydium-sdk-v2";
import { ExtensionType, getExtensionTypes, unpackMint } from "@solana/spl-token";

const raydium = await Raydium.load({ owner, connection });

const acct = await connection.getAccountInfo(mintPubkey);
if (!acct) throw new Error("mint not found");
const mint = unpackMint(mintPubkey, acct, acct.owner);

if (acct.owner.equals(TOKEN_2022_PROGRAM_ID)) {
  const extensions = getExtensionTypes(mint.tlvData);
  const accepted = new Set([
    ExtensionType.TransferFeeConfig,
    ExtensionType.MetadataPointer,
    ExtensionType.TokenMetadata,
    ExtensionType.InterestBearingConfig,
    ExtensionType.ScaledUiAmount,
  ]);
  const rejecting = extensions.filter(e => !accepted.has(e));
  if (rejecting.length) {
    console.warn("Pool creation will revert unless this mint is whitelisted:", rejecting);
  }
}

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

  • Предварительная проверка только 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.