> ## 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.

# SPL Token и Token-2022

> Два стандарта токенов, на которых работает Raydium — унаследованная программа SPL Token и её преемница Token-2022. Что это такое, чем они отличаются и какие продукты Raydium их поддерживают.

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/solana-fundamentals/spl-token-and-token-2022)
</Info>

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

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

|                                       | SPL Token                                     | Token-2022                                    |
| ------------------------------------- | --------------------------------------------- | --------------------------------------------- |
| Program ID                            | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` |
| Запущена                              | 2020                                          | 2022                                          |
| Размер учётной записи (token account) | 165 B                                         | 165 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` — программа учитывает комиссию при расчёте обменных курсов, поэтому математика пула остаётся согласованной.

```rust theme={null}
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](https://spl.solana.com/token-2022/extensions) для полного списка.

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

| Продукт   | SPL Token | Token-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.

```ts theme={null}
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:

```ts theme={null}
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` / `SwapBaseInputV2`      | SPL 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 с комиссией на передачу

```ts theme={null}
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`](/ru/security/oracle-and-token-risks).

## Указатели

* [`solana-fundamentals/account-model`](/ru/solana-fundamentals/account-model) — общая модель учётных записей.
* [`reference/token-2022-support`](/ru/reference/token-2022-support) — специфика Token-2022 для CPMM и CLMM.
* [`security/oracle-and-token-risks`](/ru/security/oracle-and-token-risks) — риски от вредоносных расширений mintов.

Источники:

* [SPL Token docs](https://spl.solana.com/token).
* [Token-2022 docs](https://spl.solana.com/token-2022) — полный список расширений.
* [Associated Token Account](https://spl.solana.com/associated-token-account).
