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

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.

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

Две программы

SPL TokenToken-2022
Program IDTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DATokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
Запущена20202022
Размер учётной записи (token account)165 B165 B + расширения (переменно)
РасширенияНетДа — 17+ официальных расширений
Обратная совместимостьПолнаяНа условиях по каждому минту
Обе программы поддерживаются командой Solana Labs (теперь Anza) и находятся в репозитории solana-program-library.

Почему две программы?

SPL Token была заморожена для сохранения совместимости — её байткод практически неизменяем, обеспечивая надёжную базу для всей экосистемы. По мере расширения сценариев использования (стейблкоины с комиссией на передачу, институциональные мальты, требующие гибкого контроля заморозки, NFT с указателями на метаданные) команда Solana представила Token-2022 как отдельную расширяемую программу вместо обновления SPL Token. Это сохраняет существующие интеграции и позволяет каждому минту выбрать ровно те расширения, которые ему нужны. Token-2022 — строгий надмножество по функциональности, но не по адресному пространству: две программы сосуществуют, и минт по определённому адресу принадлежит ровно одной из них.

Структура учётной записи

Mint account

Определяет идентичность токена. SPL Token mint (82 байта):
u32   mint_authority_option
Pubkey mint_authority
u64   supply
u8    decimals
bool  is_initialized
u32   freeze_authority_option
Pubkey freeze_authority
Token-2022 mint: то же базовое расположение плюс ноль или более записей extension TLV (type-length-value) добавлены после базовой части.

Token account

Хранит баланс определённого минта для определённого владельца. SPL Token account (165 байт):
Pubkey mint
Pubkey owner
u64    amount
u32    delegate_option
Pubkey delegate
u8     state         // initialized, frozen
u32    is_native_option
u64    is_native
u64    delegated_amount
u32    close_authority_option
Pubkey close_authority
Token-2022 account: то же базовое расположение плюс записи extension TLV, если какие-либо расширения активны.

Расширения Token-2022

Расширения — модульные возможности, которые можно прикрепить к mintам или учётным записям. Каждое расширение — отдельная TLV-запись. Ключевые для Raydium:

Transfer fee

Минт может взимать процентную комиссию при каждой передаче. Комиссия поступает указанному центру вывода. Поддерживается Raydium CPMM и CLMM через SwapV2 — программа учитывает комиссию при расчёте обменных курсов, поэтому математика пула остаётся согласованной.
let extension = TransferFeeConfig {
    transfer_fee_config_authority,
    withdraw_withheld_authority,
    withheld_amount: 0,
    older_transfer_fee: ...,
    newer_transfer_fee: ...,
};

Transfer hook

Минт указывает на программу, которую runtime вызывает при каждой передаче. Программа hook может отклонить передачу или выполнить побочные эффекты (обновить состояние соответствия, залогировать и т.д.). Raydium CPMM/CLMM вызывает hook через SwapV2 — транзакция включает программу hook и любые дополнительные учётные записи, которые ей нужны.

Interest-bearing

Баланс на цепи увеличивается с процентной ставкой, установленной в конфигурации. Только отображение (балансы со временем выглядят выше) а не фактический минт; базовое предложение остаётся неизменным.

Mint close authority

Позволяет закрыть минт, когда предложение достигает нуля.

Permanent delegate

Назначенный кошелёк может переводить или сжигать токены с любой учётной записи без ограничений. Raydium блокирует создание пулов для mintов с этим расширением — это несовместимо с инвариантом, что резервы пула не могут быть захвачены.

Non-transferable

Токены не могут быть перемещены с учётной записи, на которую они выпущены. Raydium блокирует создание пулов — непродаваемый актив не может быть базовым или котируемым активом LP-пула.

Default account state

Новые token accounts для этого минта заморожены по умолчанию и должны быть разморожены авторитетом заморозки. Полезно, но редко.

Confidential transfer

Балансы и суммы передач зашифрованы. Raydium не поддерживает mints с конфиденциальной передачей (математика пула требует открытых балансов).

Metadata pointer + token metadata

Заменяет метаданные Metaplex для mintов Token-2022. Поддерживается для листинга пулов Raydium.

Group / Member pointer

Объявляет минт как принадлежащий к группе (например, коллекция NFT). Информационное; Raydium использует это для отображения. См. официальную страницу расширений Token-2022 для полного списка.

Какие продукты Raydium что поддерживают

ПродуктSPL TokenToken-2022Примечания
AMM v4ДаНетИнтеграция OpenBook требует SPL Token
CPMMДаДаТребует SwapV2 для пулов Token-2022
CLMMДаДаТребует SwapV2 для пулов Token-2022
Farm v6ДаДаПоддерживается для обоих: минт ставки и минты вознаграждений
LaunchLabДаДаЗавершённые пулы CPMM наследуют поддержку Token-2022
Условия приемлемости минта для пулов Raydium — все расширения разрешены, кроме перечисленных:
  • Блокированы: non-transferable, permanent delegate, confidential transfer, default account state (в отклоняемых конфигурациях).
  • Разрешены с условиями (LP должен принять риск): transfer fee, transfer hook, активный freeze authority.
  • Полностью разрешены: interest-bearing, metadata pointer, group pointer, mint close authority.
Ответ getPoolInfoFromRpc включает флаги расширений минта — клиенты должны проверить перед LP.

Стандарты token account

Associated Token Account (ATA)

Обе программы используют соглашение Associated Token Account: PDA, полученный из [owner, programId, mint] через Associated Token Program (ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL). Почти каждая пользовательская token account на Solana — это ATA.
import { getAssociatedTokenAddressSync } from "@solana/spl-token";

// SPL Token
const ata = getAssociatedTokenAddressSync(mint, owner);

// Token-2022
const ata22 = getAssociatedTokenAddressSync(
  mint,
  owner,
  false,               // allowOwnerOffCurve
  TOKEN_2022_PROGRAM_ID,
);
Программа ATA создаёт учётные записи, принадлежащие соответствующей программе токенов на основе того, какая программа владеет mintом.

Не-ATA token accounts

Кошелёк может иметь несколько token accounts для одного минта; ATA — просто соглашение. Своды пулов, например, не являются ATA — это PDA программы пула, содержащие резервы пула.

Определение, какой программе принадлежит минт

Учётная запись каждого минта имеет поле owner, указывающее либо на SPL Token, либо на Token-2022:
const mintInfo = await connection.getAccountInfo(mintPubkey);
if (mintInfo.owner.equals(TOKEN_PROGRAM_ID)) {
  console.log("SPL Token mint");
} else if (mintInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) {
  console.log("Token-2022 mint");
}
SDK Raydium выполняет это определение автоматически — getPoolInfoFromRpc возвращает соответствующий programId для каждого токена, чтобы клиенты могли построить правильные ATA.

Инструкции swap по программам

CPMM и CLMM Raydium имеют по две инструкции swap:
ИнструкцияПоддерживаемые mints
Swap / SwapBaseInput (legacy)Только SPL Token
SwapV2 / SwapBaseInputV2SPL Token и Token-2022
SwapV2 принимает дополнительные учётные записи: учётные записи mintов с обеих сторон, программу токенов для каждой стороны (так как они могут отличаться), и — для mintов с transfer hook — программу hook и её требуемые учётные записи. Клиенты должны всегда использовать SwapV2, когда хотя бы одна сторона — Token-2022; SwapV2 также работает для пулов только с SPL, но устаревший Swap дешевле по вычислениям. SDK выбирает правильный вариант автоматически.

Миграция проекта SPL Token на Token-2022

Token-2022 не является заменой по принципу plug-and-play на уровне минта — минт по адресу X либо SPL, либо Token-2022, и это зафиксировано при создании. Чтобы «мигрировать», вы должны:
  1. Создать новый минт под Token-2022 с нужными вам расширениями.
  2. Предоставить механизм swap/wrap для держателей старого SPL минта, чтобы обменять на новый.
  3. Обновить все LP-пулы, фермы и интеграции, чтобы ссылаться на новый минт.
Это сложно. Большинство проектов, запущенных под SPL, остаются под SPL, если конкретное требование расширения не вынудит переход.

Рабочий пример: создание минта Token-2022 с комиссией на передачу

import {
  Connection, Keypair, SystemProgram, Transaction, sendAndConfirmTransaction,
} from "@solana/web3.js";
import {
  TOKEN_2022_PROGRAM_ID, ExtensionType, createInitializeMintInstruction,
  getMintLen, createInitializeTransferFeeConfigInstruction,
} from "@solana/spl-token";

const connection = new Connection("https://api.mainnet-beta.solana.com");
const payer      = Keypair.generate();
const mint       = Keypair.generate();

const extensions    = [ExtensionType.TransferFeeConfig];
const mintLen       = getMintLen(extensions);
const rentLamports  = await connection.getMinimumBalanceForRentExemption(mintLen);

const tx = new Transaction().add(
  SystemProgram.createAccount({
    fromPubkey:       payer.publicKey,
    newAccountPubkey: mint.publicKey,
    space:            mintLen,
    lamports:         rentLamports,
    programId:        TOKEN_2022_PROGRAM_ID,
  }),
  createInitializeTransferFeeConfigInstruction(
    mint.publicKey,
    payer.publicKey,                  // transfer fee authority
    payer.publicKey,                  // withdraw-withheld authority
    50,                               // 50 bps = 0.5%
    BigInt(1_000_000),                // max fee per transfer (smallest units)
    TOKEN_2022_PROGRAM_ID,
  ),
  createInitializeMintInstruction(
    mint.publicKey,
    9,                                // decimals
    payer.publicKey,                  // mint authority
    null,                             // freeze authority
    TOKEN_2022_PROGRAM_ID,
  ),
);

await sendAndConfirmTransaction(connection, tx, [payer, mint]);
Этот минт может быть добавлен в пул CPMM Raydium; своппующие платят 0.5% комиссию на передачу поверх комиссии пула.

Соображения безопасности

Перед LP или swap через минт Token-2022:
  • Проверьте freeze_authority. Если он не null и контролируется централизованной стороной, она может заморозить вашу ATA (и, возможно, свод пула).
  • Проверьте transfer_hook. Программа hook может блокировать передачи произвольно — изучите источник hook самостоятельно.
  • Проверьте transfer_fee. Учитывайте комиссию в ожидаемом выводе swap.
  • Проверьте permanent_delegate и non_transferable. Программа Raydium отклоняет их, но проверьте при построении пользовательской интеграции.
Полный фреймворк принятия рисков см. в security/oracle-and-token-risks.

Указатели

Источники: