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

# Instruksi routing

> Referensi untuk instruksi AMM Routing yang diaktifkan di mainnet — enam varian mencakup swap input-eksak / output-eksak dan utilitas wSOL.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/products/routing/instructions)
</Info>

<Info>
  Halaman ini adalah referensi instruksi otoritatif untuk program AMM Routing. Untuk contoh kode, lihat [`products/routing/code-demos`](/id/products/routing/code-demos). Untuk penjelasan kesalahan, lihat [`reference/error-codes`](/id/reference/error-codes).
</Info>

## Ringkasan instruksi

| Tag | Discriminator                | Eksak  | Varian   |
| --- | ---------------------------- | ------ | -------- |
| 0   | `SwapBaseInWithUserAccount`  | Input  | Legacy   |
| 1   | `SwapBaseOutWithUserAccount` | Output | Legacy   |
| 5   | `CreateSyncNative`           | —      | Utilitas |
| 6   | `CloseTokenAccount`          | —      | Utilitas |
| 8   | `SwapBaseIn`                 | Input  | Saat Ini |
| 9   | `SwapBaseOut`                | Output | Saat Ini |

**Keterangan:**

* **Eksak:** jumlah mana yang ditetapkan oleh pemanggil (Input = exact-input `amount_in`; Output = exact-output `amount_out`).
* **Varian:** Instruksi Legacy memerlukan `limit_prices` deque yang tidak kosong bahkan jika tidak ada hop CLMM dalam rute. Instruksi Saat Ini (8 / 9) memperlakukan `limit_prices` kosong sebagai "tidak ada pemeriksaan", yang merupakan jalur yang disarankan untuk kode baru.

Semua varian swap merutekan token intermediate melalui **ATA yang dikendalikan pengguna** — pengguna memiliki ATA input, setiap ATA intermediate, dan ATA output. Untuk integrasi baru, gunakan **tag 8 (`SwapBaseIn`)** atau **tag 9 (`SwapBaseOut`)** kecuali Anda memiliki alasan khusus untuk memanggil varian Legacy.

## Instruksi swap saat ini (direkomendasikan)

Ini adalah titik masuk yang harus digunakan oleh kode baru. Struktur argumen sama dengan varian Legacy tetapi `limit_prices` dapat kosong.

### `SwapBaseIn` (tag 8)

Swap multi-hop dengan input-eksak. Pemanggil menetapkan `amount_in`; router menjalankan hop-by-hop dan menegaskan bahwa jumlah akhir mencapai atau melampaui `minimum_amount_out`.

**Argumen**

```
amount_in:            u64
minimum_amount_out:   u64
limit_prices:         VecDeque<u128>  // opsional; deque kosong berarti tidak ada pemeriksaan harga CLMM per-hop
```

**Akun**

```
[
  <user_input_ata> W S,         // penandatangan; saldo >= amount_in
  <user_intermediate_ata_1> W,  // satu per hop intermediate
  ... <user_intermediate_ata_N> W,
  <user_output_ata> W,
  <token_program>,

  <pool_program_hop_1>,         // mengidentifikasi keluarga AMM mana hop 1 berada
  <pool_state_hop_1> W,
  ... <akun lain yang diperlukan oleh program hop 1>,

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

  ... [ulangi per hop]
]
```

Daftar akun yang tepat per hop tergantung pada program AMM yang mendasar (AMM v4 / CPMM / CLMM / Stable). Router CPI ke masing-masing secara bergantian dan memvalidasi bahwa ID program cocok dengan salah satu dari empat program yang didukung.

**Kondisi pra-eksekusi**

* Pemanggil menandatangani dengan `user_input_ata`.
* `user_input_ata.amount >= amount_in`.
* Setiap ATA pengguna intermediate ada dan dimiliki oleh pemanggil.
* Jika ada hop yang merupakan CLMM dan Anda menginginkan penegakan terikat harga, berikan satu entri `limit_prices` per hop CLMM.

**Kondisi pasca-eksekusi**

* Saldo `user_input_ata` berkurang sebesar `amount_in`.
* Saldo `user_output_ata` meningkat sebesar ≥ `minimum_amount_out`.
* Setiap ATA intermediate dibiarkan tanpa perubahan bersih (rute menggunakan apapun yang dihasilkannya satu hop sebelumnya).

**Kesalahan umum**

* `ExceededSlippage` — output akhir \< `minimum_amount_out`.
* `InvalidInput` — rute kosong, akun tidak terformat, atau `pool_program` tidak didukung.
* `SqrtPriceX64` — harga hop CLMM bergerak di luar batas `limit_prices` yang disediakan (hanya ketika `limit_prices` tidak kosong).

***

### `SwapBaseOut` (tag 9)

Swap multi-hop dengan output-eksak. Pemanggil menetapkan `amount_out`; router menegaskan bahwa input aktual tidak melebihi `maximum_amount_in`.

**Argumen**

```
maximum_amount_in:   u64
amount_out:          u64
limit_prices:        VecDeque<u128>  // opsional; deque kosong berarti tidak ada pemeriksaan harga CLMM per-hop
```

**Akun** — struktur yang sama seperti tag 8.

**Kondisi pra-eksekusi**

* Pemanggil menandatangani dengan `user_input_ata`; saldo `>= maximum_amount_in` (kasus terburuk).
* Setiap ATA intermediate dan output ada.

**Kondisi pasca-eksekusi**

* `user_input_ata` berkurang sebesar jumlah aktual yang diperlukan (≤ `maximum_amount_in`).
* `user_output_ata` meningkat sebesar `amount_out` secara tepat.

**Kesalahan umum**

* `ExceededSlippage` — input yang diperlukan melebihi `maximum_amount_in`.
* `InvalidInput`, `SqrtPriceX64` — seperti untuk tag 8.

***

## Instruksi swap legacy

Varian yang lebih lama ini masih dapat dipanggil pada program aktif dan didokumentasikan di sini untuk kelengkapan. Lebih suka tag 8 / tag 9 untuk kode baru; kedua varian Legacy di bawah memerlukan `limit_prices` deque yang tidak kosong bahkan ketika tidak ada hop CLMM yang terlibat, yang membuatnya sulit untuk digunakan.

### `SwapBaseInWithUserAccount` (tag 0)

Swap multi-hop dengan input-eksak, identik dalam bentuk ke tag 8 tetapi dengan persyaratan `limit_prices` yang lebih ketat.

**Argumen**

```
amount_in:           u64
minimum_amount_out:  u64
limit_prices:        VecDeque<u128>  // diperlukan, tidak kosong
```

**Akun** — bentuk yang sama seperti `SwapBaseIn` (tag 8). Semua slot intermediate harus berupa ATA yang dimiliki oleh pemanggil.

**Kondisi pra-eksekusi**

* Pemanggil menandatangani dengan `user_input_ata`.
* `user_input_ata.amount >= amount_in`.
* Semua ATA pengguna intermediate ada dan dimiliki oleh pemanggil.
* `limit_prices` tidak kosong (satu entri per hop CLMM; isi dengan nilai placeholder jika tidak ada hop CLMM yang terlibat).

**Kondisi pasca-eksekusi**

* Saldo `user_input_ata` berkurang sebesar `amount_in`.
* Saldo `user_output_ata` meningkat sebesar ≥ `minimum_amount_out`.

**Kesalahan umum**

* `ExceededSlippage`.
* `InvalidInput` — `limit_prices` kosong ditolak pada varian Legacy ini.
* `SqrtPriceX64`.

***

### `SwapBaseOutWithUserAccount` (tag 1)

Swap dengan output-eksak, varian Legacy yang sesuai dengan `SwapBaseOut` (tag 9).

**Argumen**

```
maximum_amount_in:   u64
amount_out:          u64
limit_prices:        VecDeque<u128>  // diperlukan, tidak kosong
```

**Akun** — bentuk yang sama seperti tag 0 / tag 9.

**Kondisi pra-eksekusi**

* Pemanggil menandatangani dengan `user_input_ata`.
* `user_input_ata.amount >= maximum_amount_in`.
* Semua ATA pengguna intermediate ada dan dimiliki oleh pemanggil.
* `limit_prices` tidak kosong.

**Kondisi pasca-eksekusi**

* `user_input_ata` berkurang sebesar jumlah aktual yang diperlukan (≤ `maximum_amount_in`).
* `user_output_ata` meningkat sebesar `amount_out` secara tepat.

**Kesalahan umum**

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

***

## Instruksi utilitas

### `CreateSyncNative` (tag 5)

Buat (jika tidak ada) dan sinkronkan ATA wSOL dalam satu langkah. Nyaman ketika membungkus SOL secara inline bersama swap.

**Argumen**

```
amount: u64    // SOL yang akan dibungkus (lamports)
```

**Akun**

```
[
  <user_wsol_ata> W,            // ATA untuk wSOL; dibuat jika tidak ada
  <user_native_account> W S,    // penandatangan; SOL dikurangi dari sini
  <wsol_mint>,
  <system_program>,
  <token_program>,
  <associated_token_program>,
]
```

**Efek**

* Membuat `user_wsol_ata` jika belum ada.
* Mentransfer `amount` lamports dari saldo SOL asli penandatangan ke ATA.
* Memanggil `SyncNative` pada ATA sehingga saldo tokennya mencerminkan lamports baru.

**Kesalahan umum**

* `InvalidOwner` — pemilik `user_wsol_ata` bukan penandatangan.

***

### `CloseTokenAccount` (tag 6)

Tutup akun token dan kembalikan rentnya ke dompet tujuan. Berpasangan dengan `CreateSyncNative`: setelah swap leg wSOL, panggil `CloseTokenAccount` untuk memulihkan rent yang mendukung ATA wSOL.

**Argumen** — tidak ada.

**Akun**

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

**Efek**

* Menutup `token_account_to_close`.
* Mentransfer saldo lamports yang bebas rent (\~0.00203928 SOL di mainnet untuk akun SPL Token vanilla) ke `destination_for_rent`.
* Akun token harus memiliki saldo token nol.

**Kesalahan umum**

* `InvalidOwner` — pemanggil bukan pemilik ATA.
* Saldo akun token tidak nol.

***

## Ke mana selanjutnya

* [`products/routing/code-demos`](/id/products/routing/code-demos) — membangun setiap instruksi ini dalam TypeScript.
* [`products/routing/accounts`](/id/products/routing/accounts) — kunci dispatch per-AMM dan tata letak akun per-hop.
* [`reference/error-codes`](/id/reference/error-codes) — daftar `RouteError` lengkap.
