Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Начиная с обновления 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), которые полностью пропускают эти аккаунты.
Когда вы вызываете устаревшую инструкцию v1 SwapBaseIn / SwapBaseOut, Deposit или Withdraw, количество аккаунтов должно по-прежнему соответствовать старому макету (аккаунты маркета занимают свои исторические позиции), но их содержимое больше не проверяется — никакой CPI не выполняется против них. Новый код должен использовать варианты V2 для свопов, которые вообще не принимают эти аккаунты.
amm_open_orders пула — это принадлежащий OpenBook аккаунт, содержащий состояние лимитных ордеров пула на этом маркете: активные ордеры, урегулированные балансы, рефереры и т. д. amm_target_orders — со стороны AMM: он содержит предполагаемую сетку AMM (цена/размер для каждого слота ордера), чтобы программа могла дёшево сравнить с тем, что в настоящий момент выставлено, и разместить / отменить разницу.

Authority PDAs

Существует ровно один PDA amm_authority для всей программы AMM v4. Его seed тривиален (["amm authority"]), а его bump хранится на каждом AmmInfo. Эта authority подписывает все перемещения токенов для всех пулов AMM v4.
Второй, ограниченной пулом authority не существует: этот единственный PDA покрывает всё, что подписывает программа. Его bump равен 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:
Привязанный маркет — единственный переменный seed, поэтому один маркет соответствует ровно одному пулу AMM v4. SDK и API предварительно вычисляют эти значения для вас; см. Liquidity.getAssociatedPoolKeys в raydium-sdk-v2. На практике интеграторы читают полный набор аккаунтов пула из GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> или из SDK. Ручное получение редко требуется.

Краткая справка по жизненному циклу

Пулы и их аккаунты сохраняются неопределённо долго. Даже если ликвидность полностью выведена, AmmInfo остаётся.

Что читать где

Источники: