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

# Anchor IDL

> Где найти IDL каждой программы Raydium, как переформировать из него клиентов TS / Rust / Python и политика изменения IDL протокола.

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

  [Открыть английскую версию →](/sdk-api/anchor-idl)
</Info>

## Что такое IDL

Программы Anchor на Solana публикуют файл **IDL** (Interface Definition Language), который описывает инструкции, макеты счетов, enum ошибок и схемы структур. IDL является источником истины для генерации клиентского кода — TS SDK, Rust CPI крейт и клиенты от третьих сторон генерируются (или пишутся вручную) на его основе.

Raydium публикует IDL для CPMM, CLMM и LaunchLab. AMM v4, Stable AMM и Farm (v3 / v5 / v6) предшествуют Anchor или иным образом не распространяются с Anchor — их структуры счетов вручную поддерживаются в SDK.

## Где их найти

IDL находятся в отдельном репозитории:

```
https://github.com/raydium-io/raydium-idl
```

Конкретные файлы:

| Программа  | Файл IDL                                                                                                                                                                                                |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| CPMM       | [`raydium_cpmm/raydium_cp_swap.json`](https://github.com/raydium-io/raydium-idl/blob/master/raydium_cpmm/raydium_cp_swap.json)                                                                          |
| CLMM       | [`raydium_clmm/raydium_clmm.json`](https://github.com/raydium-io/raydium-idl/blob/master/raydium_clmm/raydium_clmm.json)                                                                                |
| LaunchLab  | [`raydium_launchpad/raydium_launchpad.json`](https://github.com/raydium-io/raydium-idl/blob/master/raydium_launchpad/raydium_launchpad.json)                                                            |
| AMM v4     | официального IDL нет — см. [`raydium-sdk-V2/src/raydium/liquidity/layout.ts`](https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/liquidity/layout.ts) для макетов, написанных вручную |
| Stable AMM | официального IDL нет — макеты в SDK                                                                                                                                                                     |
| Farm       | официального IDL нет — макеты в SDK                                                                                                                                                                     |

Файлы IDL версионируются в истории git репозитория; закрепитесь на конкретный коммит, если требуется воспроизводимость побайтово.

IDL также можно получить непосредственно из развернутых программ через функцию Anchor **on-chain IDL** (если издатель программы выбрал эту опцию):

```bash theme={null}
anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet
```

CPMM, CLMM и LaunchLab имеют on-chain IDL. AMM v4, Stable AMM и Farm — нет (программы допредшествующие Anchor).

## Переформирование TypeScript клиента

Codegen Anchor создает типизированный клиент из IDL:

```bash theme={null}
# Используя anchor CLI
anchor build
anchor idl parse \
  --file target/idl/cpmm.json \
  --out target/types/cpmm.ts

# Или с помощью TS хелперов `@coral-xyz/anchor` во время выполнения:
```

```ts theme={null}
import { Program, AnchorProvider } from "@coral-xyz/anchor";
// Получите IDL непосредственно из репозитория raydium-idl (или поместите его в ваш проект).
import cpmmIdl from "./idls/raydium_cp_swap.json";

const provider = new AnchorProvider(connection, wallet, {});
const program  = new Program(cpmmIdl as any, CPMM_PROGRAM_ID, provider);

// Типизированные построители методов генерируются автоматически:
await program.methods
  .swapBaseInput(new BN(amountIn), new BN(minAmountOut))
  .accounts({ ... })
  .rpc();
```

Большинство интеграторов **не** делают этого — они используют более высокоуровневый хелпер `raydium.cpmm.swap(...)`, который оборачивает методы Anchor плюс все бухгалтерское обслуживание (создание ATA, корректировка комиссии передачи, бюджет вычислений, маршрутизация программы Token-2022). Переформируйте только если вам нужен слой ниже SDK.

## Переформирование Rust клиента (CPI крейт)

Raydium публикует Anchor крейты для программ, которые имеют IDL:

```toml theme={null}
# Cargo.toml
[dependencies]
raydium_cp_swap = { git = "https://github.com/raydium-io/raydium-cp-swap", branch = "master", features = ["cpi"] }
raydium_amm_v3 = { git = "https://github.com/raydium-io/raydium-clmm",    branch = "master", features = ["cpi"] }
```

Функция `cpi` предоставляет структуры счетов `cpi::accounts::<Ix>` и инициаторы `cpi::<ix>()` — готовые к использованию обертки CPI. См. [`sdk-api/rust-cpi`](/ru/sdk-api/rust-cpi) для шаблонов использования.

Если вы предпочитаете сгенерировать новые привязки:

```bash theme={null}
# Из IDL, используя anchor-client
anchor idl parse \
  --file raydium_cpmm/raydium_cp_swap.json \
  --out src/generated/cpmm_bindings.rs
```

## Переформирование Python клиента

Официального Raydium Python SDK нет. Сторонние генераторы включают:

* **`anchorpy`** — портирование `@coral-xyz/anchor` на Python. Генерирует типизированные построители методов из IDL.
* **`solders`** — низкоуровневые примитивы Solana (транзакции, keypairs, pubkeys) в привязках Rust; используется внутри `anchorpy`.

```bash theme={null}
pip install anchorpy solders solana
```

```python theme={null}
from anchorpy import Program, Provider
from solana.rpc.async_api import AsyncClient
from pathlib import Path
import json

idl = json.loads(Path("cpmm.json").read_text())
provider = Provider(AsyncClient("https://api.mainnet-beta.solana.com"), wallet)
program  = Program(idl, CPMM_PROGRAM_ID, provider)

await program.rpc["swap_base_input"](amount_in, min_amount_out, ctx=Context(accounts={...}))
```

См. [`sdk-api/python-integration`](/ru/sdk-api/python-integration) для более полного пошагового руководства.

## Политика изменения IDL

Raydium следует этим правилам для стабильности IDL:

1. **Дискриминаторы инструкций никогда не меняются.** Добавление новых инструкций расширяет enum в конце; существующие дискриминаторы остаются стабильными.
2. **Макеты структур счетов развиваются только адитивно.** Новые поля идут в конец, предшествуемые увеличением размера в on-chain схеме. Существующие поля сохраняют свои смещения.
3. **Коды enum ошибок только добавляются.** Существующий код ошибки всегда означает одно и то же.
4. **Критические изменения поставляются в новых программах.** Когда требуется переделка, команда развертывает новый ID программы (например, CPMM как новую программу вместо обновления AMM v4). Старые пулы продолжают работать на старой программе; новые пулы переходят на новую.

Эта политика делает переформированные клиенты обратно совместимыми: клиент, сгенерированный из IDL двухверсионной давности, по-прежнему сможет правильно декодировать текущее состояние (лишние конечные байты видит как padding).

## Что делать при изменении IDL

1. **Обновите SDK.** `npm update @raydium-io/raydium-sdk-v2`.
2. **Переформируйте ваш клиентский код**, если вы используете Anchor codegen напрямую.
3. **Сравните макет счета.** Конечные поля нового макета — это единственное, что ваш код не видел; подтвердите, нужны ли они вам.
4. **Не предполагайте, что старые дискриминаторы инструкций недействительны.** Согласно правилу 1, они все еще работают.
5. **Переагистрируйте интеграционные тесты** против devnet перед развертыванием на mainnet.

## Решение проблем IDL

### Ошибки "Invalid discriminator"

Обычно означает, что клиент, построенный на основе версии N IDL, пытается вызвать инструкцию, которая существовала только в предыдущей версии программы перед развертыванием. Повторно получите IDL из работающей программы:

```bash theme={null}
anchor idl fetch <PROGRAM_ID>
```

### Сбои декодирования счета

Если `program.account.<Name>.fetch(pubkey)` выдает ошибку с "Invalid account discriminator", счет был создан предыдущей версией программы и Anchor отклоняет его 8-байтовый дискриминатор. Решение — использовать синтаксический анализатор сырого макета из SDK (`PoolInfoLayout.decode(accountData)`), который не применяет дискриминаторы Anchor.

### Отсутствующие инструкции в сгенерированном клиенте

Codegen TS Anchor генерирует методы только для инструкций, запись IDL которых содержит `name`, который парсится как действительный идентификатор. Инструкции Raydium все это удовлетворяют, но если вы видите несоответствие, проверьте, является ли файл IDL из текущего выпуска SDK.

## Ссылки

* [`sdk-api/rust-cpi`](/ru/sdk-api/rust-cpi) — использование Rust CPI крейтов.
* [`sdk-api/python-integration`](/ru/sdk-api/python-integration) — Python через `anchorpy`.
* [`sdk-api/typescript-sdk`](/ru/sdk-api/typescript-sdk) — более высокоуровневый TS клиент.

Источники:

* [Репозиторий Raydium IDL](https://github.com/raydium-io/raydium-idl)
* [Спецификация Anchor IDL](https://www.anchor-lang.com/docs/idl)
