> ## 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>
  **이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.**

  [영문판 보기 →](/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` | 관리자: 프로그램 수준 `AmmConfig` PDA 초기화.                |
| 유지보수     | `UpdateConfigAccount` | 관리자: 프로그램 수준 설정 파라미터 변경.                         |

SDK는 사용자 대면 지시사항에 대한 빌더만 노출합니다. 유지보수 지시사항은 일반적으로 Raydium 키퍼에 의해 호출됩니다.

## `Initialize2`

기존 OpenBook 마켓에 바인드된 새로운 AMM v4 풀을 부트스트랩합니다.

**인자**

```
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` 계정(시드된 키).        |
| 5  | `amm_authority`              |   |   | 프로그램 PDA.                   |
| 6  | `amm_open_orders`            | W |   | OpenBook `OpenOrders`(시드됨). |
| 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 |   | 생성자의 LP ATA.                |
| 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`, OpenBook 측 `InvalidMarketState`.

## `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는 주어진 LP 양을 생성하는 coin/pc 쌍을 계산하고 `max_*`에 대해 확인합니다. 어느 쪽이 한도를 초과하면 `ExceededSlippage`로 취소됩니다.

## `Withdraw`

LP를 소각하고 양쪽을 수령합니다.

**인자**

```
amount: u64    // 소각할 LP
```

**계정** — `Deposit`과 유사하지만 방향이 반대입니다. `lp_mint`는 소각을 위해 쓰기 가능하며, 사용자 ATA는 수신자입니다. `MonitorStep`과 유사한 OpenBook에서의 정산 단계가 내부적으로 비례식 수학 전에 발생하므로 상환은 최신 준비금을 사용합니다.

## `SwapBaseIn`

정확한 입력 스왑. 항상 **AMM 경로** 스왑입니다(OpenBook 매칭을 통해 라우팅되지 않음).

<Note>
  **새 코드에는 V2 변형을 사용하세요.** AMM v4가 더 이상 OpenBook과 유동성을 공유하지 않기 때문에, 유효성 검사를 위해 전체 OpenBook 계정 세트를 여전히 요구하는 V1 진입점(`SwapBaseIn`, `SwapBaseOut`)은 기능적으로 중복됩니다. 새 통합은 훨씬 작은 계정 목록을 사용하고 현재의 표준 실행 경로를 나타내는 [`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`](/ko/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 라우터는 AMM v4를 통해 라우팅할 때 항상 V2 형식을 사용합니다.

인자는 V1 형식과 동일합니다(`SwapBaseInV2`에서는 `amount_in / minimum_amount_out`, `SwapBaseOutV2`에서는 `max_amount_in / amount_out`).

## `MonitorStep` (레거시 / 비활성)

<Note>
  **더 이상 크랭킹되지 않습니다.** AMM v4는 더 이상 OpenBook과 유동성을 공유하지 않으므로 `MonitorStep`은 할 일이 없습니다 — 풀에 정산, 취소 또는 교체할 게시된 주문이 없습니다. 지시사항은 하위 호환성을 위해 온체인 프로그램에 남아 있지만 Raydium 키퍼는 더 이상 이를 호출하지 않습니다. 수동으로 호출하는 것은 효과적으로 no-op입니다(0으로 설정된 상태 새로고침 제외) 통합자에게 필요하지 않아야 합니다.
</Note>

원래 이 지시사항은 풀의 OpenBook 상호작용을 크랭킹했습니다.

**인자**

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

**계정** — 스왑을 위한 위의 모든 것 + 관리 OpenBook 계정.

**원래 효과**(현재 실제로 관련 없음):

* 채워진 모든 주문을 정산했습니다(그들의 수익은 OpenBook CPI를 통해 `market_coin_vault`/`market_pc_vault`에서 풀의 볼트로 이동).
* 가격이나 크기가 더 이상 `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`를 0으로 설정합니다.

누적된 PnL이 이미 불변성에서 제외되었으므로 준비금에 변화가 없습니다.

## `SetParams`

관리자 파라미터 변경: 상태 비트마스크, 주문 격자 깊이, 금액 파동, 수수료(드물게) 등. Raydium 멀티시그에 의해 호출됩니다. 인자는 CPMM의 `UpdateAmmConfig`와 유사한 `param: u8` 태그 + 페이로드입니다.

## 상태 변화 매트릭스

| 지시사항          | `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`](/ko/products/amm-v4/code-demos) — 스왑 및 LP 흐름을 위한 TypeScript 예제.
* [`products/amm-v4/fees`](/ko/products/amm-v4/fees) — `WithdrawPnl` 세부사항 및 수수료 분할.
* [`reference/error-codes`](/ko/reference/error-codes) — 전방 참조 표(AMM v4 오류는 해당 페이지에 나열됨).

출처:

* [Raydium AMM program — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* Raydium SDK v2 `Liquidity` module
* OpenBook program — market 측 계정 검증
