> ## 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 ルーティング命令のリファレンス — 完全入力/完全出力スワップと wSOL ユーティリティをカバーする 6 つのバリアント。

<Info>
  **このページは AI による自動翻訳です。すべての内容は英語版を正とします。**

  [英語版を表示 →](/products/routing/instructions)
</Info>

## 命令の概要

| タグ | ディスクリミネーター                   | 完全 | バリアント   |
| -- | ---------------------------- | -- | ------- |
| 0  | `SwapBaseInWithUserAccount`  | 入力 | レガシー    |
| 1  | `SwapBaseOutWithUserAccount` | 出力 | レガシー    |
| 5  | `CreateSyncNative`           | —  | ユーティリティ |
| 6  | `CloseTokenAccount`          | —  | ユーティリティ |
| 8  | `SwapBaseIn`                 | 入力 | 現在      |
| 9  | `SwapBaseOut`                | 出力 | 現在      |

**凡例:**

* **完全:** 呼び出し元が固定する金額（入力 = 完全入力 `amount_in`；出力 = 完全出力 `amount_out`）。
* **バリアント:** レガシー命令ではルートに CLMM ホップがない場合でも、空でない `limit_prices` デックが必要です。現在の命令（8 / 9）は空の `limit_prices` を「チェックなし」として扱い、これが新しいコードの推奨パスです。

すべてのスワップバリアントは、中間トークンを**ユーザーが管理する ATA** を通じてルーティングします。ユーザーは入力 ATA、すべての中間 ATA、および出力 ATA を所有します。新しい統合では、特定の理由がない限り\*\*タグ 8（`SwapBaseIn`）**または**タグ 9（`SwapBaseOut`）\*\*を使用してください。

## 現在のスワップ命令（推奨）

これらは新しいコードが使用すべきエントリーポイントです。引数構造はレガシーバリアントと同じですが、`limit_prices` は空にすることができます。

### `SwapBaseIn`（タグ 8）

完全入力マルチホップスワップ。呼び出し元は `amount_in` を固定し、ルーターはホップごとに実行して、最終金額が `minimum_amount_out` 以上になることを確認します。

**引数**

```
amount_in:            u64
minimum_amount_out:   u64
limit_prices:         VecDeque<u128>  // optional; empty deque means no per-hop CLMM price check
```

**アカウント**

```
[
  <user_input_ata> W S,         // signer; balance >= amount_in
  <user_intermediate_ata_1> W,  // one per intermediate hop
  ... <user_intermediate_ata_N> W,
  <user_output_ata> W,
  <token_program>,

  <pool_program_hop_1>,         // identifies which AMM family hop 1 is
  <pool_state_hop_1> W,
  ... <other accounts required by hop 1's program>,

  <pool_program_hop_2>,
  <pool_state_hop_2> W,
  ... <hop 2 accounts>,

  ... [repeat per hop]
]
```

ホップごとの正確なアカウントリストは、基礎となる AMM プログラム（AMM v4 / CPMM / CLMM / Stable）に依存します。ルーターは各プログラムに順番に CPI を実行し、プログラム ID が 4 つのサポート対象プログラムのいずれかと一致することを検証します。

**事前条件**

* 呼び出し元は `user_input_ata` で署名します。
* `user_input_ata.amount >= amount_in`。
* すべての中間ユーザー ATA が存在し、呼び出し元が所有しています。
* CLMM ホップがあり、価格バウンド強制を望む場合は、CLMM ホップごとに 1 つの `limit_prices` エントリを指定します。

**事後条件**

* `user_input_ata` 残高が `amount_in` だけ減少します。
* `user_output_ata` 残高が ≥ `minimum_amount_out` 増加します。
* 各中間 ATA はネット変化ゼロで残されます（ルートは 1 ホップ前に生成したものを消費します）。

**一般的なエラー**

* `ExceededSlippage` — 最終出力 \< `minimum_amount_out`。
* `InvalidInput` — ルートが空、アカウントが不正形式、または `pool_program` がサポートされていません。
* `SqrtPriceX64` — CLMM ホップの価格が指定された `limit_prices` バウンド外に移動しました（`limit_prices` が空でない場合のみ）。

***

### `SwapBaseOut`（タグ 9）

完全出力マルチホップスワップ。呼び出し元は `amount_out` を固定し、ルーターは実際の入力が `maximum_amount_in` を超えないことを確認します。

**引数**

```
maximum_amount_in:   u64
amount_out:          u64
limit_prices:        VecDeque<u128>  // optional; empty deque means no per-hop CLMM price check
```

**アカウント** — タグ 8 と同じ構造です。

**事前条件**

* 呼び出し元は `user_input_ata` で署名します；残高 `>= maximum_amount_in`（最悪の場合）。
* 各中間および出力 ATA が存在します。

**事後条件**

* `user_input_ata` が必要な実際の金額（≤ `maximum_amount_in`）だけ減少します。
* `user_output_ata` が正確に `amount_out` だけ増加します。

**一般的なエラー**

* `ExceededSlippage` — 必要な入力が `maximum_amount_in` を超えています。
* `InvalidInput`、`SqrtPriceX64` — タグ 8 と同様。

***

## レガシースワップ命令

これらの古いバリアントはライブプログラムで呼び出し可能であり、完全性のためここで説明されています。新しいコードではタグ 8 / タグ 9 を優先します；以下の両方のレガシーバリアントでは、CLMM ホップが関係ない場合でも空でない `limit_prices` デックが必要であり、これは使用を煩雑にします。

### `SwapBaseInWithUserAccount`（タグ 0）

完全入力マルチホップスワップ、タグ 8 と同じ形状ですが、より厳しい `limit_prices` 要件があります。

**引数**

```
amount_in:           u64
minimum_amount_out:  u64
limit_prices:        VecDeque<u128>  // required, non-empty
```

**アカウント** — `SwapBaseIn`（タグ 8）と同じ形状です。すべての中間スロットは呼び出し元が所有する ATA である必要があります。

**事前条件**

* 呼び出し元は `user_input_ata` で署名します。
* `user_input_ata.amount >= amount_in`。
* すべての中間ユーザー ATA が存在し、呼び出し元が所有しています。
* `limit_prices` が空でありません（CLMM ホップごとに 1 エントリ；CLMM ホップが関係ない場合はプレースホルダー値を指定してください）。

**事後条件**

* `user_input_ata` 残高が `amount_in` だけ減少します。
* `user_output_ata` 残高が ≥ `minimum_amount_out` 増加します。

**一般的なエラー**

* `ExceededSlippage`。
* `InvalidInput` — 空の `limit_prices` はこのレガシーバリアントで拒否されます。
* `SqrtPriceX64`。

***

### `SwapBaseOutWithUserAccount`（タグ 1）

完全出力スワップ、`SwapBaseOut`（タグ 9）のレガシー版です。

**引数**

```
maximum_amount_in:   u64
amount_out:          u64
limit_prices:        VecDeque<u128>  // required, non-empty
```

**アカウント** — タグ 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）

wSOL ATA を 1 ステップで作成（必要に応じて）および同期します。スワップと並行して SOL をラップする場合に便利です。

**引数**

```
amount: u64    // SOL to wrap (lamports)
```

**アカウント**

```
[
  <user_wsol_ata> W,            // ATA for wSOL; created if missing
  <user_native_account> W S,    // signer; SOL is debited from here
  <wsol_mint>,
  <system_program>,
  <token_program>,
  <associated_token_program>,
]
```

**効果**

* `user_wsol_ata` がまだ存在しない場合、作成します。
* サイナーのネイティブ SOL 残高から ATA に `amount` ラムポート転送します。
* ATA で `SyncNative` を呼び出して、トークン残高が新しいラムポートを反映するようにします。

**一般的なエラー**

* `InvalidOwner` — `user_wsol_ata` の所有者がサイナーではありません。

***

### `CloseTokenAccount`（タグ 6）

トークンアカウントを閉じて、そのレント（保証金）をデスティネーションウォレットに返します。`CreateSyncNative` とペアになります。wSOL レッグスワップ後、`CloseTokenAccount` を呼び出して wSOL ATA を支える保証金を回収します。

**引数** — なし。

**アカウント**

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

**効果**

* `token_account_to_close` を閉じます。
* レント相当のラムポート残高（メインネットでバニラ SPL Token アカウントの場合、約 0.00203928 SOL）を `destination_for_rent` に転送します。
* トークンアカウントはゼロトークン残高を持つ必要があります。

**一般的なエラー**

* `InvalidOwner` — 呼び出し元が ATA 所有者ではありません。
* トークンアカウント残高がゼロ以外です。

***

## 次のステップ

* [`products/routing/code-demos`](/ja/products/routing/code-demos) — TypeScript でこれらの各命令を構築します。
* [`products/routing/accounts`](/ja/products/routing/accounts) — AMM ごとのディスパッチキーとホップごとのアカウントレイアウト。
* [`reference/error-codes`](/ja/reference/error-codes) — 完全な `RouteError` リスト。
