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

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.

Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →

Что такое 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
CPMMraydium_cpmm/raydium_cp_swap.json
CLMMraydium_clmm/raydium_clmm.json
LaunchLabraydium_launchpad/raydium_launchpad.json
AMM v4официального IDL нет — см. raydium-sdk-V2/src/raydium/liquidity/layout.ts для макетов, написанных вручную
Stable AMMофициального IDL нет — макеты в SDK
Farmофициального IDL нет — макеты в SDK
Файлы IDL версионируются в истории git репозитория; закрепитесь на конкретный коммит, если требуется воспроизводимость побайтово. IDL также можно получить непосредственно из развернутых программ через функцию Anchor on-chain IDL (если издатель программы выбрал эту опцию):
anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet
CPMM, CLMM и LaunchLab имеют on-chain IDL. AMM v4, Stable AMM и Farm — нет (программы допредшествующие Anchor).

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

Codegen Anchor создает типизированный клиент из IDL:
# Используя anchor CLI
anchor build
anchor idl parse \
  --file target/idl/cpmm.json \
  --out target/types/cpmm.ts

# Или с помощью TS хелперов `@coral-xyz/anchor` во время выполнения:
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:
# 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 для шаблонов использования. Если вы предпочитаете сгенерировать новые привязки:
# Из 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.
pip install anchorpy solders solana
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 для более полного пошагового руководства.

Политика изменения 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 из работающей программы:
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.

Ссылки

Источники: