> ## 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 Routing, включённых в mainnet — шесть вариантов для swap-ов с фиксированным входом/выходом и утилиты wSOL.

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

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

## Обзор инструкций

| Тег | Дискриминатор                | Точно | Вариант    |
| --- | ---------------------------- | ----- | ---------- |
| 0   | `SwapBaseInWithUserAccount`  | Вход  | Устаревший |
| 1   | `SwapBaseOutWithUserAccount` | Выход | Устаревший |
| 5   | `CreateSyncNative`           | —     | Утилита    |
| 6   | `CloseTokenAccount`          | —     | Утилита    |
| 8   | `SwapBaseIn`                 | Вход  | Текущий    |
| 9   | `SwapBaseOut`                | Выход | Текущий    |

**Легенда:**

* **Точно:** какое значение фиксируется вызывающей стороной (Вход = фиксированный вход `amount_in`; Выход = фиксированный выход `amount_out`).
* **Вариант:** устаревшие инструкции требуют непустой deque `limit_prices`, даже если в маршруте нет хопа CLMM. Текущие инструкции (8 / 9) воспринимают пустой `limit_prices` как «без проверок», что рекомендуется для нового кода.

Все варианты swap направляют промежуточные токены через **ATA, контролируемые пользователем** — пользователь владеет входной ATA, каждой промежуточной ATA и выходной ATA. Для новых интеграций используйте **тег 8 (`SwapBaseIn`)** или **тег 9 (`SwapBaseOut`)**, если у вас нет конкретной причины вызывать устаревший вариант.

## Текущие инструкции swap (рекомендуется)

Это точки входа, которые должны использовать новые коды. Структура аргументов такая же, как у устаревших вариантов, но `limit_prices` может быть пуста.

### `SwapBaseIn` (тег 8)

Мультихоп swap с фиксированным входом. Вызывающая сторона фиксирует `amount_in`; маршрутизатор выполняет хоп за хопом и проверяет, что финальное количество достигает или превышает `minimum_amount_out`.

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

```
amount_in:            u64
minimum_amount_out:   u64
limit_prices:         VecDeque<u128>  // опционально; пустая очередь означает отсутствие проверки цены CLMM на хоп
```

**Аккаунты**

```
[
  <user_input_ata> W S,         // подписант; баланс >= amount_in
  <user_intermediate_ata_1> W,  // по одной на каждый промежуточный хоп
  ... <user_intermediate_ata_N> W,
  <user_output_ata> W,
  <token_program>,

  <pool_program_hop_1>,         // определяет, какое семейство AMM использует хоп 1
  <pool_state_hop_1> W,
  ... <другие аккаунты, требуемые программой хопа 1>,

  <pool_program_hop_2>,
  <pool_state_hop_2> W,
  ... <аккаунты хопа 2>,

  ... [повторить для каждого хопа]
]
```

Точный список аккаунтов на хоп зависит от программы базовой биржи (AMM v4 / CPMM / CLMM / Stable). Маршрутизатор вызывает каждую программу по очереди через CPI и проверяет, что ID программы совпадает с одной из четырёх поддерживаемых программ.

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

* Вызывающая сторона подписывает `user_input_ata`.
* `user_input_ata.amount >= amount_in`.
* Каждая промежуточная ATA пользователя существует и принадлежит вызывающей стороне.
* Если какой-либо хоп является CLMM и вы хотите применить ограничения по цене, предоставьте одну запись `limit_prices` на хоп CLMM.

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

* Баланс `user_input_ata` уменьшен на `amount_in`.
* Баланс `user_output_ata` увеличен на ≥ `minimum_amount_out`.
* Каждая промежуточная ATA остаётся с нулевым чистым изменением (маршрут потребляет то, что произвёл предыдущий хоп).

**Распространённые ошибки**

* `ExceededSlippage` — финальный выход \< `minimum_amount_out`.
* `InvalidInput` — пустой маршрут, некорректные аккаунты или неподдерживаемая `pool_program`.
* `SqrtPriceX64` — цена хопа CLMM вышла за границы предоставленного ограничения `limit_prices` (только когда `limit_prices` непуста).

***

### `SwapBaseOut` (тег 9)

Мультихоп swap с фиксированным выходом. Вызывающая сторона фиксирует `amount_out`; маршрутизатор проверяет, что фактический вход не превышает `maximum_amount_in`.

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

```
maximum_amount_in:   u64
amount_out:          u64
limit_prices:        VecDeque<u128>  // опционально; пустая очередь означает отсутствие проверки цены CLMM на хоп
```

**Аккаунты** — такая же структура, как в теге 8.

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

* Вызывающая сторона подписывает `user_input_ata`; баланс `>= maximum_amount_in` (наихудший случай).
* Каждая промежуточная ATA и выходная ATA существуют.

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

* `user_input_ata` уменьшена на фактически необходимое количество (≤ `maximum_amount_in`).
* `user_output_ata` увеличена ровно на `amount_out`.

**Распространённые ошибки**

* `ExceededSlippage` — требуемый вход превышает `maximum_amount_in`.
* `InvalidInput`, `SqrtPriceX64` — как для тега 8.

***

## Устаревшие инструкции swap

Эти более старые варианты всё ещё могут быть вызваны в работающей программе и документируются здесь для полноты. Предпочитайте теги 8 / 9 для нового кода; оба устаревших варианта ниже требуют непустую deque `limit_prices` даже при отсутствии хопа CLMM, что затрудняет их использование.

### `SwapBaseInWithUserAccount` (тег 0)

Мультихоп swap с фиксированным входом, идентичный по структуре тегу 8, но с более строгим требованием `limit_prices`.

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

```
amount_in:           u64
minimum_amount_out:  u64
limit_prices:        VecDeque<u128>  // обязательно, непуста
```

**Аккаунты** — такая же структура, как в `SwapBaseIn` (тег 8). Все промежуточные слоты должны быть ATA, принадлежащими вызывающей стороне.

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

* Вызывающая сторона подписывает `user_input_ata`.
* `user_input_ata.amount >= amount_in`.
* Все промежуточные ATA пользователя существуют и принадлежат вызывающей стороне.
* `limit_prices` непуста (по одной записи на хоп CLMM; при отсутствии хопа CLMM заполните заполнителями).

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

* Баланс `user_input_ata` уменьшен на `amount_in`.
* Баланс `user_output_ata` увеличен на ≥ `minimum_amount_out`.

**Распространённые ошибки**

* `ExceededSlippage`.
* `InvalidInput` — пустая `limit_prices` отклоняется в этом устаревшем варианте.
* `SqrtPriceX64`.

***

### `SwapBaseOutWithUserAccount` (тег 1)

Swap с фиксированным выходом, устаревший аналог `SwapBaseOut` (тег 9).

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

```
maximum_amount_in:   u64
amount_out:          u64
limit_prices:        VecDeque<u128>  // обязательно, непуста
```

**Аккаунты** — такая же структура, как в теге 0 / теге 9.

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

* Вызывающая сторона подписывает `user_input_ata`.
* `user_input_ata.amount >= maximum_amount_in`.
* Все промежуточные ATA пользователя существуют и принадлежат вызывающей стороне.
* `limit_prices` непуста.

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

* `user_input_ata` уменьшена на фактически необходимое количество (≤ `maximum_amount_in`).
* `user_output_ata` увеличена ровно на `amount_out`.

**Распространённые ошибки**

* `ExceededSlippage`.
* `InvalidInput`.
* `SqrtPriceX64`.

***

## Утилиты

### `CreateSyncNative` (тег 5)

Создание (если отсутствует) и синхронизация ATA wSOL в один шаг. Удобно при обёртывании SOL параллельно с swap.

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

```
amount: u64    // SOL для обёртывания (lamports)
```

**Аккаунты**

```
[
  <user_wsol_ata> W,            // ATA для wSOL; создаётся, если отсутствует
  <user_native_account> W S,    // подписант; SOL списывается отсюда
  <wsol_mint>,
  <system_program>,
  <token_program>,
  <associated_token_program>,
]
```

**Эффект**

* Создаёт `user_wsol_ata`, если она ещё не существует.
* Переводит `amount` lamports с собственного баланса SOL подписанта на ATA.
* Вызывает `SyncNative` на ATA, чтобы её баланс токена отразил новые lamport.

**Распространённые ошибки**

* `InvalidOwner` — владелец `user_wsol_ata` не является подписантом.

***

### `CloseTokenAccount` (тег 6)

Закрытие счёта токена и возврат его ренты в кошелёк назначения. Пара для `CreateSyncNative`: после swap-ноги wSOL вызовите `CloseTokenAccount`, чтобы вернуть ренту, которая поддерживала ATA wSOL.

**Аргументы** — отсутствуют.

**Аккаунты**

```
[
  <token_account_to_close> W,
  <destination_for_rent> W,
  <owner> S,
  <token_program>,
]
```

**Эффект**

* Закрывает `token_account_to_close`.
* Переводит баланс lamport, не облагаемый рентой (\~0.00203928 SOL в mainnet для обычного счёта SPL Token), на `destination_for_rent`.
* Баланс токена на счёте должен быть равен нулю.

**Распространённые ошибки**

* `InvalidOwner` — вызывающая сторона не является владельцем ATA.
* Баланс счёта токена не равен нулю.

***

## Что дальше

* [`products/routing/code-demos`](/ru/products/routing/code-demos) — создание каждой из этих инструкций на TypeScript.
* [`products/routing/accounts`](/ru/products/routing/accounts) — ключи отправки per-AMM и макет аккаунтов per-хоп.
* [`reference/error-codes`](/ru/reference/error-codes) — полный список `RouteError`.
