Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Начиная с обновления 2026-07, зависимость AMM v4 от OpenBook / Serum была удалена — ни одна инструкция больше не читает и не записывает состояние OpenBook. Аккаунты маркета ниже сохранены только как позиционные заполнители в старых макетах инструкций v1 (принимаются, но игнорируются) и как справочные поля на
AmmInfo. Используйте точки входа V2 для свопов, которые полностью их опускают. На этой странице аккаунты по-прежнему разделены на секции «принадлежащие пулу» и «OpenBook (устаревшие)» для чтения старых транзакций.Реестр
Пул AMM v4 записывает один привязанный маркет наAmmInfo при создании. Полная картина:
Примечание: префикс «serum» сохранён в IDL и названиях полей AMM v4 для обратной совместимости. Эти аккаунты больше не функциональны после удаления OpenBook.
AmmInfo
Корневой аккаунт состояния пула. Большой (≈ 752 байта), так как содержит ссылки на пул и OpenBook встроенными.
Макет структуры не изменился (совместим по байтам), поэтому существующие десериализаторы продолжают работать, но после удаления OpenBook поля, отмеченные как
УСТАРЕВШЕЕ выше, больше не записываются — счётчики объёма swap_* заморожены на последнем значении. Для аналитики объёма используйте логи торговли вместо этих полей. Только need_take_pnl_* и pool_open_time активно поддерживаются.coin_vault,pc_vault— хранилища SPL Token пула.coin— этоtoken_0по соглашению Serum/OpenBook (базовый),pc— этоtoken_1(котировка).coin_decimals,pc_decimals— соответствующие минтам.open_orders,target_orders,market— устаревшие справочные поля. По-прежнему присутствуют наAmmInfoи по-прежнему передаются позиционно в макетах инструкций v1, но программа больше их не читает и не проверяет. Точки входа V2 для свопов их опускают.fees.swap_fee_numerator / swap_fee_denominator— объединённая комиссия торговли. По умолчанию25 / 10_000 = 0.25%.status— единственное перечислимое состояние типаu64, ограничивающее операции, а не битовая маска. Устанавливается администратором черезSetParamsсparam = 0(Status). См. Статус ниже.lp_amount— внутренний итог LP пула. Он не равенlp_mint.supply: он ровно на один целый LP-токен (10^coin_decimalsбазовых единиц) больше, потому что эта сумма учитывается при инициализации, но никогда не минтится. Вся пропорциональная математика в программе используетlp_amount, поэтому используйте его и вы.amm_owner— записывается при создании из жёстко заданного в программе ключа администратора, а не из ключа создателя.state_data.need_take_pnl_*— дельта между валовыми накопленными комиссиями и тем, что было снято.TakePnlобнуляет эти значения.
Проводка OpenBook
Удалена. Зависимость OpenBook / Serum была удалена из программы (обновление 2026-07). Аккаунты, описанные в этом разделе, больше не проверяются и не используются. Они остаются справочными полями на
AmmInfo и позиционными заполнителями в старых макетах инструкций v1. Используйте точки входа V2 для свопов (SwapBaseInV2 / SwapBaseOutV2), которые полностью пропускают эти аккаунты.SwapBaseIn / SwapBaseOut, Deposit или Withdraw, количество аккаунтов должно по-прежнему соответствовать старому макету (аккаунты маркета занимают свои исторические позиции), но их содержимое больше не проверяется — никакой CPI не выполняется против них. Новый код должен использовать варианты V2 для свопов, которые вообще не принимают эти аккаунты.
amm_open_orders пула — это принадлежащий OpenBook аккаунт, содержащий состояние лимитных ордеров пула на этом маркете: активные ордеры, урегулированные балансы, рефереры и т. д. amm_target_orders — со стороны AMM: он содержит предполагаемую сетку AMM (цена/размер для каждого слота ордера), чтобы программа могла дёшево сравнить с тем, что в настоящий момент выставлено, и разместить / отменить разницу.
Authority PDAs
Существует ровно один PDAamm_authority для всей программы AMM v4. Его seed тривиален (["amm authority"]), а его bump хранится на каждом AmmInfo. Эта authority подписывает все перемещения токенов для всех пулов AMM v4.
254 в mainnet и дублируется на каждом AmmInfo в поле nonce; WithdrawExcessLamports заново выводит его с жёстко заданным этим nonce.
Хранилища
Хранилища SPL Token пула — это стандартные аккаунты токенов, чейowner — это amm_authority. Это не ATA — их адреса являются PDA, полученными при Initialize2 из [AMM_V4_PROGRAM_ID, market, "coin_vault_associated_seed"] и [AMM_V4_PROGRAM_ID, market, "pc_vault_associated_seed"]. Минт в seeds не входит, как и amm_id. Адреса хранятся на AmmInfo; их вывод — одноразовое любопытство.
Token-2022 не поддерживается. Программа жёстко кодирует ID программы SPL Token для всех перемещений хранилищ. Попытка привязать пул AMM v4 к минту Token-2022 не удаётся при Initialize2 с ошибкой InvalidSplTokenProgram.
LP mint
Классический SPL Token mint, чья authority — этоamm_authority. Общее предложение отслеживает владение LP пулом; сжигание LP возвращает токены из обоих хранилищ пропорционально.
Зеркало в состоянии всё же есть: AmmInfo.lp_amount. Оно не равно предложению минта — оно ровно на один целый LP-токен (10^coin_decimals базовых единиц) больше, потому что эта сумма учитывается при инициализации, но никогда не минтится. Каждое пропорциональное вычисление в программе делит на lp_amount, поэтому используйте это поле, а не предложение минта в цепи.
Статус
AmmInfo.status — это единственное перечислимое состояние типа u64, а не битовая маска. Проверяйте его на равенство: клиент, проверяющий status & 1, неверно классифицирует каждый живой пул, потому что обычное торговое состояние — это 6, у которого бит 0 установлен.
Initialize2 записывает 7, если open_time в будущем, и 6 в противном случае; пул со значением 7 сам переключается на 6 при первом свопе в момент state_data.pool_open_time или позже. Значение вне диапазона 0..=7 вызывает панику в AmmStatus::from_u64.
Multisig Raydium устанавливает состояние через SetParams с param = 0 (Status); принимаются только значения 1–7. (AdminCancelOrders был удалён.)
Наблюдение / оракул
AMM v4 не имеет выделенного аккаунта наблюдения, и после удаления OpenBook нет и состояния книги ордеров, из которого его можно было бы вывести. Если вам нужен TWAP Raydium с поддержкой программы, используйте CPMM или CLMM — оба поддерживают кольцевой буферObservationState. В противном случае индексируйте логи свопов вне цепи.
Получение аккаунтов пула с нуля
Аккаунты пула AMM v4 — это обычные PDA, ключом для которых служит привязанный маркет: не seeded keypair и не PDA для каждой пары. Все они используют одну и ту же трёхсидовую форму[AMM_V4_PROGRAM_ID, market, <label>] под AMM_V4_PROGRAM_ID:
Liquidity.getAssociatedPoolKeys в raydium-sdk-v2.
На практике интеграторы читают полный набор аккаунтов пула из GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> или из SDK. Ручное получение редко требуется.
Краткая справка по жизненному циклу
Пулы и их аккаунты сохраняются неопределённо долго. Даже если ликвидность полностью выведена,
AmmInfo остаётся.
Что читать где
- Математика и арифметика комиссий:
products/amm-v4/math. - Разделение комиссий и сравнение с CPMM/CLMM:
products/amm-v4/fees. - Списки аккаунтов инструкций:
products/amm-v4/instructions. - Получение аккаунтов OpenBook: исходный код программы OpenBook (
github.com/openbook-dex/program) — Rust-монорепозиторий, а не текстовая документация.
- Программа Raydium AMM —
raydium-io/raydium-amm reference/program-addressesдля канонических ID программ- Протокол OpenBook / Serum для аккаунтов контрагента

