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

## 명령어 요약

| 태그 | Discriminator                | 고정값 | 변형   |
| -- | ---------------------------- | --- | ---- |
| 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>  // 선택사항; 빈 덱은 홉 단위 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>,         // 홉 1이 어떤 AMM 계열인지 식별
  <pool_state_hop_1> W,
  ... <홉 1의 프로그램에 필요한 다른 계정>,

  <pool_program_hop_2>,
  <pool_state_hop_2> W,
  ... <홉 2 계정>,

  ... [홉당 반복]
]
```

홉당 정확한 계정 목록은 기본 AMM 프로그램 (AMM v4 / CPMM / CLMM / Stable)에 따라 다릅니다. 라우터는 각 프로그램에 CPI하고 프로그램 ID가 지원되는 4가지 프로그램 중 하나와 일치하는지 확인합니다.

**사전 조건**

* 호출자는 `user_input_ata`로 서명합니다.
* `user_input_ata.amount >= amount_in`.
* 각 중간 사용자 ATA가 존재하고 호출자가 소유합니다.
* 어떤 홉이 CLMM이고 가격 범위 시행을 원하면, CLMM 홉마다 하나의 `limit_prices` 항목을 제공하세요.

**사후 조건**

* `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)

정확 출력 멀티홉 스왑입니다. 호출자는 `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가 존재합니다.

**사후 조건**

* `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>  // 필수, 비어있지 않음
```

**계정** — `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)

정확 출력 스왑으로, `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)

한 단계에서 wSOL ATA를 만들고 (없으면) 동기화합니다. 스왑과 함께 인라인으로 SOL을 래핑할 때 편리합니다.

**인자**

```
amount: u64    // 래핑할 SOL (lamports)
```

**계정**

```
[
  <user_wsol_ata> W,            // wSOL용 ATA; 없으면 생성
  <user_native_account> W S,    // 서명자; SOL이 여기서 차감됨
  <wsol_mint>,
  <system_program>,
  <token_program>,
  <associated_token_program>,
]
```

**효과**

* `user_wsol_ata`가 아직 존재하지 않으면 생성합니다.
* `amount` lamports를 서명자의 네이티브 SOL 잔액에서 ATA로 전송합니다.
* ATA에서 `SyncNative`를 호출하여 토큰 잔액이 새로운 lamports를 반영하도록 합니다.

**흔한 오류**

* `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`를 닫습니다.
* 렌트 면제 lamports 잔액 (메인넷의 바닐라 SPL Token 계정의 경우 약 0.00203928 SOL)을 `destination_for_rent`로 전송합니다.
* 토큰 계정의 잔액이 0이어야 합니다.

**흔한 오류**

* `InvalidOwner` — 호출자가 ATA 소유자가 아닙니다.
* 토큰 계정 잔액이 0이 아닙니다.

***

## 다음 단계

* [`products/routing/code-demos`](/ko/products/routing/code-demos) — TypeScript로 각 명령어 구축하기.
* [`products/routing/accounts`](/ko/products/routing/accounts) — AMM당 디스패치 키 및 홉당 계정 레이아웃.
* [`reference/error-codes`](/ko/reference/error-codes) — 전체 `RouteError` 목록.
