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

# Инструкции AMM v4

> Все инструкции AMM v4 с аргументами, счетами пула и OpenBook, которые они ожидают, а также предусловиями и постусловиями для каждой.

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

  [Открыть английскую версию →](/products/amm-v4/instructions)
</Info>

<Info>
  Инструкции AMM v4 единообразно требуют как **стороны пула** (счета программы AMM v4), так и **стороны маркета** (счета OpenBook для связанного маркета). Отсутствие или несовпадение любого набора приводит к откату. В списках счетов ниже используются имена полей из Raydium SDK для ясности; базовый IDL иногда использует префиксы `serum_*`.
</Info>

## Перечень инструкций

| Группа              | Инструкция            | Примечания                                                                                                     |
| ------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------- |
| Жизненный цикл пула | `Initialize2`         | Текущая инструкция создания пула (по-прежнему функциональна; UI по умолчанию использует CPMM для новых пулов). |
| Ликвидность         | `Deposit`             | Добавить ликвидность, получить LP.                                                                             |
| Ликвидность         | `Withdraw`            | Сжечь LP, получить обе стороны пропорционально.                                                                |
| Своп                | `SwapBaseIn`          | Своп с точным входом (полный путь: хранилища + OpenBook).                                                      |
| Своп                | `SwapBaseOut`         | Своп с точным выходом (полный путь).                                                                           |
| Своп                | `SwapBaseInV2`        | Своп с точным входом, обходящий OpenBook — только хранилища, меньше счетов.                                    |
| Своп                | `SwapBaseOutV2`       | Своп с точным выходом, обходящий OpenBook.                                                                     |
| Обслуживание        | `SetParams`           | Админ: изменить параметры пула.                                                                                |
| Обслуживание        | `WithdrawPnl`         | Перевести накопленный протокольный PnL на счета владельца PnL.                                                 |
| Обслуживание        | `CreateConfigAccount` | Админ: инициализировать программный PDA `AmmConfig`.                                                           |
| Обслуживание        | `UpdateConfigAccount` | Админ: изменить параметры конфигурации на уровне программы.                                                    |

SDK предоставляет построители только для пользовательских инструкций. Инструкции обслуживания обычно вызываются хранителем Raydium.

## `Initialize2`

Инициализировать новый пул AMM v4, связанный с существующим маркетом OpenBook.

**Аргументы**

```
nonce:        u8
open_time:    u64
init_pc_amount:   u64
init_coin_amount: u64
```

**Счета** (записываемые `W`, подписывающие `S`)

| #  | Имя                          | W | S | Примечания                                                         |
| -- | ---------------------------- | - | - | ------------------------------------------------------------------ |
| 1  | `token_program`              |   |   | SPL Token.                                                         |
| 2  | `system_program`             |   |   |                                                                    |
| 3  | `rent`                       |   |   |                                                                    |
| 4  | `amm`                        | W |   | Счет `AmmInfo` (ключ с seed).                                      |
| 5  | `amm_authority`              |   |   | PDA программы.                                                     |
| 6  | `amm_open_orders`            | W |   | OpenBook `OpenOrders` (с seed).                                    |
| 7  | `lp_mint`                    | W |   |                                                                    |
| 8  | `coin_mint`                  |   |   |                                                                    |
| 9  | `pc_mint`                    |   |   |                                                                    |
| 10 | `pool_coin_token_account`    | W |   |                                                                    |
| 11 | `pool_pc_token_account`      | W |   |                                                                    |
| 12 | `pool_withdraw_queue`        | W |   |                                                                    |
| 13 | `pool_target_orders_account` | W |   |                                                                    |
| 14 | `pool_lp_token_account`      | W |   | ATA LP создателя.                                                  |
| 15 | `pool_temp_lp_token_account` | W |   | Вспомогательный счет.                                              |
| 16 | `market_program`             |   |   | Программа OpenBook.                                                |
| 17 | `market`                     |   |   | Маркет OpenBook.                                                   |
| 18 | `user_wallet`                | W | S | Создатель. Оплачивает аренду и финансирует первоначальный депозит. |
| 19 | `user_token_coin`            | W |   |                                                                    |
| 20 | `user_token_pc`              | W |   |                                                                    |

**Постусловия**

* `lp_supply = sqrt(init_coin_amount × init_pc_amount) − INIT_BURN`, где `INIT_BURN` ≈ 100 LP-единиц выведены из обращения.
* Ордера OpenBook еще **не** размещены; первый `MonitorStep` размещает начальную сетку.

**Частые ошибки** — `InvalidInput` (несовпадающие десятичные разряды, неотсортировано), `NotApproved`, `InvalidMarketState` на стороне OpenBook.

## `Deposit`

Добавить ликвидность.

**Аргументы**

```
max_coin_amount: u64
max_pc_amount:   u64
base_side:       u64    // 0 = базис на coin, 1 = базис на pc
// (некоторые варианты SDK также принимают other_amount_min)
```

**Счета** (сокращенно)

| #  | Имя                       | W | S |
| -- | ------------------------- | - | - |
| 1  | `token_program`           |   |   |
| 2  | `amm`                     | W |   |
| 3  | `amm_authority`           |   |   |
| 4  | `amm_open_orders`         |   |   |
| 5  | `amm_target_orders`       | W |   |
| 6  | `lp_mint`                 | W |   |
| 7  | `pool_coin_token_account` | W |   |
| 8  | `pool_pc_token_account`   | W |   |
| 9  | `market`                  |   |   |
| 10 | `user_coin_token_account` | W |   |
| 11 | `user_pc_token_account`   | W |   |
| 12 | `user_lp_token_account`   | W |   |
| 13 | `user_owner`              |   | S |

**Математика** — стандартная пропорциональная. Используя *эффективные* резервы пула (хранилища + на маркете), SDK вычисляет пару coin/pc, которая дает требуемое количество LP, и проверяет ее против `max_*`. Откатывается с `ExceededSlippage`, если какая-либо сторона превышает лимит.

## `Withdraw`

Сжечь LP, получить обе стороны.

**Аргументы**

```
amount: u64    // LP для сжигания
```

**Счета** — как `Deposit` с обратным направлением; `lp_mint` записываемый для сжигания, пользовательские ATA — получатели. На внутреннем уровне происходит шаг, похожий на `MonitorStep`, для урегулирования от OpenBook, чтобы погашение использовало свежие резервы.

## `SwapBaseIn`

Своп с точным входом. Всегда **путь через AMM** (не маршрутизируется через сопоставление OpenBook).

<Note>
  **Используйте варианты V2 для нового кода.** Поскольку AMM v4 больше не делится ликвидностью с OpenBook, точки входа V1 (`SwapBaseIn`, `SwapBaseOut`) — которые по-прежнему требуют полного набора счетов OpenBook для проверки — функционально избыточны. Новые интеграции должны использовать [`SwapBaseInV2` / `SwapBaseOutV2`](#swapbaseinv2-swapbaseoutv2), которые требуют гораздо меньший список счетов и представляют канонический путь выполнения сегодня. Формы V1 задокументированы здесь для полноты и для чтения существующих транзакций в цепи.
</Note>

**Аргументы**

```
amount_in:            u64
minimum_amount_out:   u64
```

**Счета** (сокращенно)

| #  | Имя                         | W | S |
| -- | --------------------------- | - | - |
| 1  | `token_program`             |   |   |
| 2  | `amm`                       | W |   |
| 3  | `amm_authority`             |   |   |
| 4  | `amm_open_orders`           | W |   |
| 5  | `amm_target_orders`         | W |   |
| 6  | `pool_coin_token_account`   | W |   |
| 7  | `pool_pc_token_account`     | W |   |
| 8  | `market_program`            |   |   |
| 9  | `market`                    | W |   |
| 10 | `market_bids`               | W |   |
| 11 | `market_asks`               | W |   |
| 12 | `market_event_queue`        | W |   |
| 13 | `market_coin_vault`         | W |   |
| 14 | `market_pc_vault`           | W |   |
| 15 | `market_vault_signer`       |   |   |
| 16 | `user_source_token_account` | W |   |
| 17 | `user_dest_token_account`   | W |   |
| 18 | `user_owner`                |   | S |

**Математика** — см. [`products/amm-v4/math`](/ru/products/amm-v4/math).

**Предусловия**

* `amm.status` разрешает своп (бит 0 маски состояния не установлен).
* `amm.state_data.pool_open_time <= now`.
* `amount_in > 0`.
* `user_source_token_account` содержит минимум `amount_in`.

**Постусловия**

* Пользователь теряет `amount_in` исходного токена, получает `amount_out ≥ minimum_amount_out` целевого токена.
* `state_data.swap_*_in_amount` и `swap_*_out_amount` увеличены (для аналитики).
* `need_take_pnl_*` увеличены на долю комиссии протокола.

**Частые ошибки** — `ExceededSlippage`, `InvalidInput`, `InvalidStatus`, `InvalidMarket`.

## `SwapBaseOut`

Своп с точным выходом, обратный `SwapBaseIn`. Те же счета.

**Аргументы**

```
max_amount_in: u64
amount_out:    u64
```

## `SwapBaseInV2` / `SwapBaseOutV2`

Варианты точек входа для свопа, которые **полностью пропускают счета OpenBook**. Математика идентична пути V1, но список счетов сокращается до только стороны AMM:

| # | Имя                         | W | S |
| - | --------------------------- | - | - |
| 1 | `token_program`             |   |   |
| 2 | `amm`                       | W |   |
| 3 | `amm_authority`             |   |   |
| 4 | `amm_open_orders`           |   |   |
| 5 | `pool_coin_token_account`   | W |   |
| 6 | `pool_pc_token_account`     | W |   |
| 7 | `user_source_token_account` | W |   |
| 8 | `user_dest_token_account`   | W |   |
| 9 | `user_owner`                |   | S |

Эффективные резервы пула по-прежнему учитывают токены, размещенные на OpenBook, поэтому математика котировок не изменяется. Используйте V2, чтобы сэкономить вычисления и избежать передачи счетов маркета, когда вам не нужно срабатывание OpenBook в той же транзакции. Маршрутизатор Raydium всегда использует форму V2 при маршрутизации через AMM v4.

Аргументы те же, что и в формах V1 (`amount_in / minimum_amount_out` для `SwapBaseInV2`; `max_amount_in / amount_out` для `SwapBaseOutV2`).

## `MonitorStep` (устаревший / неактивный)

<Note>
  **Больше не срабатывает.** AMM v4 больше не делится ликвидностью с OpenBook, поэтому `MonitorStep` нечего делать — пул не имеет ордеров, размещенных на урегулирование, отмену или замену. Инструкция остается в программе в цепи для обратной совместимости, но хранитель Raydium больше ее не вызывает. Ручной вызов по существу является no-op (кроме обновления нулевого состояния) и не должен быть необходим интеграторам.
</Note>

Первоначально эта инструкция управляла взаимодействием пула с OpenBook.

**Аргументы**

```
plan_order_limit:   u16
place_order_limit:  u16
cancel_order_limit: u16
```

**Счета** — все вышеперечисленное для свопа плюс административные счета OpenBook.

**Первоначальный эффект** (больше не актуален на практике):

* Урегулировал любые заполненные ордера (их выручка переместилась из `market_coin_vault`/`market_pc_vault` в хранилища пула через CPI OpenBook).
* Отменял устаревшие ордера, цены или размеры которых больше не совпадали с `target_orders`.
* Размещал новые ордера для закрытия разрыва между `target_orders` и `amm_open_orders`.

Без разрешений. Любой счет мог его вызвать; исторически хранитель Raydium делал это регулярно.

## `WithdrawPnl` / `TakePnl`

Административное изъятие накопленных комиссий протокола.

**Аргументы**

* `WithdrawPnl` не требует аргументов; он читает `need_take_pnl_*` и перемещает ровно эти суммы.

**Счета** (сокращенно)

| #  | Имя                       | W | S |                                      |
| -- | ------------------------- | - | - | ------------------------------------ |
| 1  | `token_program`           |   |   |                                      |
| 2  | `amm`                     | W |   |                                      |
| 3  | `amm_authority`           |   |   |                                      |
| 4  | `amm_config`              |   |   |                                      |
| 5  | `amm_open_orders`         | W |   |                                      |
| 6  | `pool_coin_token_account` | W |   |                                      |
| 7  | `pool_pc_token_account`   | W |   |                                      |
| 8  | `pnl_coin_token_account`  | W |   | Получатель, хранится на `AmmConfig`. |
| 9  | `pnl_pc_token_account`    | W |   |                                      |
| 10 | `pnl_owner`               |   | S | Административный мультиподпис.       |
| 11 | `market_program`          |   |   |                                      |
| 12 | `market`                  | W |   |                                      |
| 13 | `market_event_queue`      | W |   |                                      |
| 14 | `market_coin_vault`       | W |   |                                      |
| 15 | `market_pc_vault`         | W |   |                                      |
| 16 | `market_vault_signer`     |   |   |                                      |

**Эффект**

* Переводит `need_take_pnl_coin` из `pool_coin_token_account` в `pnl_coin_token_account`.
* То же для pc.
* Обнуляет `need_take_pnl_coin` и `need_take_pnl_pc`.

Резервы не меняются, так как накопленный PnL уже был исключен из инварианта.

## `SetParams`

Административные изменения параметров: маска состояния, глубина сетки сортировки, волны количества, комиссии (редко) и т. д. Вызывается мультиподписью Raydium. Аргументы — это тег `param: u8` + полезная нагрузка, аналогично `UpdateAmmConfig` в CPMM.

## Матрица изменения состояния

| Инструкция    | Предложение `lp_mint`                      | Хранилища                                | Счетчики PnL | OpenBook                  |
| ------------- | ------------------------------------------ | ---------------------------------------- | ------------ | ------------------------- |
| `Initialize2` | начальное предложение отчеканено создателю | `+ init_coin_amount`, `+ init_pc_amount` | 0            | Создан OpenOrders         |
| `Deposit`     | +                                          | + обе стороны                            | —            | урегулирование заполнений |
| `Withdraw`    | −                                          | − обе стороны                            | —            | урегулирование заполнений |
| `SwapBaseIn`  | —                                          | + in, − out                              | + доля pnl   | может пересоздать сетку   |
| `SwapBaseOut` | —                                          | + in, − out                              | + доля pnl   | может пересоздать сетку   |
| `MonitorStep` | —                                          | урегулирование заполнений                | —            | отмена / размещение       |
| `WithdrawPnl` | —                                          | − (pnl изъята)                           | 0            | —                         |
| `SetParams`   | —                                          | —                                        | —            | —                         |

## Куда дальше

* [`products/amm-v4/code-demos`](/ru/products/amm-v4/code-demos) — примеры на TypeScript для потоков свопа и LP.
* [`products/amm-v4/fees`](/ru/products/amm-v4/fees) — детали `WithdrawPnl` и распределение комиссий.
* [`reference/error-codes`](/ru/reference/error-codes) — таблица справочных кодов ошибок (ошибки AMM v4 перечислены на этой странице).

Источники:

* [Программа Raydium AMM — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* Модуль `Liquidity` Raydium SDK v2
* Программа OpenBook — проверки счетов на стороне маркета
