> ## 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 풀의 전체 계정 목록 — AmmInfo, TargetOrders, OpenOrders, 볼트, LP 민트, 권한 — 그리고 풀이 바인딩된 OpenBook 계정.

<Info>
  **이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.**

  [영문판 보기 →](/products/amm-v4/accounts)
</Info>

<Info>
  2026-07 업그레이드 이후, AMM v4의 OpenBook / Serum 의존성이 **제거되었습니다** — 더 이상 어떤 명령어도 OpenBook 상태를 읽거나 쓰지 않습니다. 아래의 마켓 계정들은 레거시 v1 명령어 레이아웃의 위치 플레이스홀더로만 유지되며(수락되지만 무시됨), `AmmInfo`의 참조 필드로만 남아 있습니다. V2 스왑 진입점을 사용하세요. 이 페이지는 여전히 계정을 "풀 소유" 및 "OpenBook (레거시)" 섹션으로 분류하여 이전 트랜잭션을 읽을 수 있도록 합니다.
</Info>

## 목록

AMM v4 풀은 생성 시 하나의 바인딩된 마켓을 `AmmInfo`에 기록합니다. 전체 구성은 다음과 같습니다:

| 카테고리           | 계정                                   | 소유자         | 역할                                                                   |
| -------------- | ------------------------------------ | ----------- | -------------------------------------------------------------------- |
| 풀              | `AmmInfo`                            | AMM v4 프로그램 | 풀 상태: 누적된 수수료, 상태, 볼트 참조 (그리고 레거시 필드로서 마켓).                          |
| 풀              | `amm_authority`                      | AMM v4 프로그램 | 프로그램 소유 PDA로 볼트 이동에 서명합니다. 모든 AMM v4 풀에서 공유됩니다.                      |
| 풀              | `amm_open_orders`                    | OpenBook    | 레거시 `OpenOrders` 참조. 더 이상 프로그램에서 읽거나 쓰지 않으며, v1 레이아웃에서 위치상으로만 전달됩니다. |
| 풀              | `amm_target_orders`                  | AMM v4 프로그램 | 레거시 타겟 주문 계정. 여전히 `WithdrawPnl`에서 참조되지만(계정 #10) 그리드는 더 이상 구축되지 않습니다. |
| 풀              | `pool_coin_token_account`            | SPL Token   | 풀의 코인 측 볼트 (`amm_authority`의 ATA).                                   |
| 풀              | `pool_pc_token_account`              | SPL Token   | 풀의 pc 측 볼트.                                                          |
| 풀              | `lp_mint`                            | SPL Token   | 대체 가능한 LP 민트.                                                        |
| 풀              | `pool_withdraw_queue`                | AMM v4 프로그램 | 지연된 출금을 위한 레거시 큐; 길이 0으로 유지됩니다.                                      |
| 풀              | `pool_temp_lp`                       | AMM v4 프로그램 | 보조 LP 계정.                                                            |
| 레거시 (OpenBook) | `serum_market`                       | OpenBook    | 바인딩된 마켓. v1 레이아웃에서 전달되지만 더 이상 검증되거나 사용되지 않습니다.                       |
| 레거시            | `serum_bids`, `serum_asks`           | OpenBook    | 입찰/매도 큐. 무시됩니다.                                                      |
| 레거시            | `serum_event_queue`                  | OpenBook    | 대기 중인 이벤트. 무시됩니다.                                                    |
| 레거시            | `serum_coin_vault`, `serum_pc_vault` | SPL Token   | 마켓 수준 볼트. 무시됩니다.                                                     |
| 레거시            | `serum_vault_signer`                 | OpenBook    | 마켓 수준 PDA. 무시됩니다.                                                    |

참고: "serum" 접두사는 하위 호환성을 위해 AMM v4의 IDL 및 필드 이름에 유지됩니다. 이 계정들은 OpenBook 제거 후 더 이상 기능하지 않습니다.

## `AmmInfo`

풀의 루트 상태 계정입니다. 풀과 OpenBook 참조를 인라인으로 포함하기 때문에 크기가 큽니다(약 752바이트).

```rust theme={null}
// programs/amm/src/state.rs (축약; 필드 순서 / 이름은 IDL을 따름)
pub struct AmmInfo {
    pub status: u64,           // 비트마스크: 스왑/입금/출금/크랭크 활성화
    pub nonce:  u64,           // amm_authority 파생에 사용되는 범프
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // 내부 상태 머신
    pub reset_flag:    u64,
    pub min_size:      u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,    // 레거시 (OpenBook 로트 크기); 이제 0으로 초기화됨
    pub pc_lot_size:   u64,    // 레거시; 이제 0으로 초기화됨
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,

    pub fees: Fees,            // 거래/프로토콜/펀드 수수료율
    pub state_data: StateData,

    // 풀 소유 계정:
    pub coin_vault: Pubkey,
    pub pc_vault:   Pubkey,
    pub coin_vault_mint: Pubkey,
    pub pc_vault_mint:   Pubkey,
    pub lp_mint:  Pubkey,
    pub open_orders: Pubkey,   // OpenBook의 풀 OpenOrders
    pub market: Pubkey,        // OpenBook 마켓
    pub market_program: Pubkey, // OpenBook 프로그램 ID
    pub target_orders: Pubkey,
    pub withdraw_queue: Pubkey,
    pub lp_vault:       Pubkey, // = pool_temp_lp
    pub owner: Pubkey,          // 관리자 (멀티시그)
    pub lp_reserve: u64,
    pub padding: [u64; 3],
}

pub struct Fees {
    pub min_separate_numerator:   u64,     // 5
    pub min_separate_denominator: u64,     // 10_000
    pub trade_fee_numerator:      u64,     // 25  → OpenBook 통합에서 사용됨
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → 스왑 수수료의 프로토콜 몫
    pub pnl_denominator:          u64,     // 100 → 따라서 12/100 = 수수료의 12%, = 거래량의 0.03%
    pub swap_fee_numerator:       u64,     // 25  → 0.25% 총 스왑 수수료
    pub swap_fee_denominator:     u64,     // 10_000
}

pub struct StateData {
    pub need_take_pnl_coin: u64,        // 여전히 업데이트됨 — 누적된 프로토콜 수수료 (코인 측)
    pub need_take_pnl_pc:   u64,        // 여전히 업데이트됨 — 누적된 프로토콜 수수료 (pc 측)
    pub total_pnl_pc:   u64,            // 더 이상 사용되지 않음 — 더 이상 업데이트되지 않음
    pub total_pnl_coin: u64,            // 더 이상 사용되지 않음 — 더 이상 업데이트되지 않음
    pub pool_open_time: u64,            // 여전히 사용됨 — 풀 개설 타임스탬프
    pub padding: [u64; 2],              // 예약됨
    pub orderbook_to_init_time: u64,    // 더 이상 사용되지 않음 — 더 이상 업데이트되지 않음
    pub swap_coin_in_amount: u128,      // 더 이상 사용되지 않음 — 거래량 카운터 동결됨
    pub swap_pc_out_amount:  u128,      // 더 이상 사용되지 않음
    pub swap_acc_pc_fee:    u64,        // 더 이상 사용되지 않음
    pub swap_pc_in_amount:  u128,       // 더 이상 사용되지 않음
    pub swap_coin_out_amount: u128,     // 더 이상 사용되지 않음
    pub swap_acc_coin_fee:  u64,        // 더 이상 사용되지 않음
}
```

<Note>
  구조체 **레이아웃은 변경되지 않았습니다**(바이트 호환), 따라서 기존 역직렬화기는 계속 작동하지만, OpenBook 제거 후 위에서 `더 이상 사용되지 않음`으로 표시된 필드는 **더 이상 쓰이지 않습니다** — `swap_*` 거래량 카운터는 마지막 값에서 동결됩니다. 거래량 분석을 위해서는 이 필드 대신 거래 로그를 사용하세요. `need_take_pnl_*`과 `pool_open_time`만 적극적으로 유지됩니다.
</Note>

통합자 대면 필드:

* **`coin_vault`**, **`pc_vault`** — 풀의 SPL Token 볼트. `coin`은 Serum/OpenBook 규칙에 따라 `token_0`(기본), `pc`는 `token_1`(인용)입니다.
* **`coin_decimals`**, **`pc_decimals`** — 민트와 일치합니다.
* **`open_orders`**, **`target_orders`**, **`market`** — 레거시 참조 필드. 여전히 `AmmInfo`에 있고 v1 명령어 레이아웃에서 위치상으로 전달되지만, 프로그램은 더 이상 읽거나 검증하지 않습니다. V2 스왑 진입점은 이들을 생략합니다.
* **`fees.swap_fee_numerator / swap_fee_denominator`** — 결합된 거래 수수료. 기본값 `25 / 10_000 = 0.25%`.
* **`status`** — 작업을 제어하는 비트마스크. `AdminSetStatus`를 통해 관리자가 설정 가능합니다.
* **`state_data.need_take_pnl_*`** — 총 누적 수수료와 스윕된 금액 간의 차이. `TakePnl`이 이를 0으로 설정합니다.

## OpenBook 연결

<Note>
  **제거됨.** OpenBook / Serum 의존성이 프로그램에서 삭제되었습니다(2026-07 업그레이드). 이 섹션에서 설명하는 계정들은 더 이상 검증되거나 사용되지 않습니다. 이들은 `AmmInfo`의 참조 필드로, 그리고 레거시 v1 명령어 레이아웃의 위치 플레이스홀더로 남아 있습니다. **V2 스왑 진입점**을 사용하세요([`SwapBaseInV2` / `SwapBaseOutV2`](/ko/products/amm-v4/instructions)). 이들은 이 계정들을 전혀 사용하지 않습니다.
</Note>

레거시 **v1** `SwapBaseIn` / `SwapBaseOut`, `Deposit`, 또는 `Withdraw` 명령어를 호출할 때, 계정 **개수**는 여전히 이전 레이아웃과 일치해야 하지만(마켓 계정들이 역사적 위치를 차지), 그들의 **내용은 더 이상 확인되지 않습니다** — CPI가 이들에 대해 발행되지 않습니다. 새 코드는 이 계정들을 전혀 사용하지 않는 V2 스왑 변형을 사용해야 합니다.

```ts theme={null}
const market = ...;  // OpenBook 마켓 PublicKey

// OpenBook이 마켓 계정에 노출하는 필드:
const marketDecoded = OpenBookMarket.decode(marketAccountData);
const {
  bids:           serumBids,
  asks:           serumAsks,
  eventQueue:     serumEventQueue,
  requestQueue:   serumRequestQueue,
  baseVault:      serumCoinVault,
  quoteVault:     serumPcVault,
  vaultSignerNonce,
} = marketDecoded;

const serumVaultSigner = PublicKey.createProgramAddressSync(
  [market.toBuffer(), u64ToBytes(vaultSignerNonce)],
  OPENBOOK_PROGRAM_ID,
);
```

AMM의 `amm_open_orders`는 OpenBook 소유 계정으로 이 마켓의 풀 한도 주문 상태를 보유합니다: 활성 주문, 정산된 잔액, 추천인 등. `amm_target_orders`는 AMM 측입니다: 프로그램이 현재 게시된 것과 저렴하게 비교하고 차이를 배치/취소할 수 있도록 AMM의 *의도된* 그리드(각 주문 슬롯의 가격/크기)를 보유합니다.

## 권한 PDA

전체 AMM v4 프로그램에 정확히 하나의 `amm_authority` PDA가 있습니다. 그 시드는 간단합니다(`["amm authority"]`), 그 범프는 모든 `AmmInfo`에 저장됩니다. 이 권한은 모든 AMM v4 풀의 모든 토큰 이동에 서명합니다.

```ts theme={null}
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
```

OpenBook 작업에 서명하기 위해 풀당 별도의 **풀 범위** 권한이 파생됩니다(이 프로그램의 설계에서 `amm_authority`는 실제로 둘 다 포함합니다; 다른 버전은 다른 파생을 사용했으므로 코드에서 특정 풀의 `AmmInfo.nonce`를 확인하세요).

## 볼트

풀의 SPL Token 볼트는 `owner`가 `amm_authority`인 표준 토큰 계정입니다. ATA가 아닙니다 — 그들의 주소는 `["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id]` 시드로 `Initialize`에서 파생된 특정 PDA입니다. 주소는 `AmmInfo`에 저장됩니다; 파생은 일회성 호기심입니다.

Token-2022는 **지원되지 않습니다**. 프로그램은 모든 볼트 이동에 대해 SPL Token의 프로그램 ID를 하드코딩합니다. AMM v4 풀을 Token-2022 민트에 바인딩하려고 시도하면 `Initialize`에서 실패합니다.

## LP 민트

권한이 `amm_authority`인 클래식 SPL Token 민트입니다. 총 공급량은 풀의 LP 소유권을 추적합니다; LP를 소각하면 두 볼트에서 비례적으로 토큰을 반환합니다. AMM v4가 CPMM보다 먼저 나왔기 때문에, 풀 상태에 `lp_supply` 미러가 없습니다 — 민트의 온체인 공급량을 직접 읽으세요.

## 상태 비트마스크

`AmmInfo.status`는 작업을 제어합니다. 비트(위치는 프로그램 버전에 따라 다를 수 있습니다 — 소스를 통해 확인하세요):

| 비트 | 플래그                 | 효과                        |
| -- | ------------------- | ------------------------- |
| 0  | `SWAP_DISABLED`     | `Swap*`이 거부됩니다.           |
| 1  | `DEPOSIT_DISABLED`  | `Deposit`이 거부됩니다.         |
| 2  | `WITHDRAW_DISABLED` | `Withdraw`가 거부됩니다.        |
| 3  | `CLMM_LIKE_MIGRATE` | 작업에서 사용하는 마이그레이션 게이트 플래그. |

Raydium 멀티시그는 `SetParams`를 통해 이를 설정합니다(`param = Status`). (`AdminCancelOrders`는 제거되었습니다.)

## 관찰 / 오라클

**AMM v4는 전용 관찰 계정이 없습니다.** 온체인 TWAP가 필요한 다른 프로토콜은 일반적으로 OpenBook의 북 교차를 간접적으로 소비하거나 오프체인을 읽습니다. 프로그램 지원이 있는 Raydium TWAP가 필요하면 CPMM 또는 CLMM을 사용하세요.

## 처음부터 풀의 계정 파생

AMM v4는 결정론적 쌍별 PDA를 위해 설계되지 않았기 때문에(Solana 규칙보다 먼저 나왔음), 정규 `amm_id`는 다음으로 파생된 **시드 키쌍**입니다:

```
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
```

동일한 시드 키 패턴이 `amm_open_orders`, `amm_target_orders`, `amm_withdraw_queue`, `pool_temp_lp`, `pool_coin_token_account`, `pool_pc_token_account`, 및 `lp_mint`에 적용됩니다. SDK와 API는 이를 미리 계산합니다; `raydium-sdk-v2`의 `Liquidity.getAssociatedPoolKeys`를 참조하세요.

실제로, 통합자는 `GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID>`에서 또는 SDK에서 풀의 전체 계정 세트를 읽습니다. 손으로 파생하는 것은 거의 필요하지 않습니다.

## 라이프사이클 빠른 참조

| 이벤트                                    | 생성된 계정                                                                                                   | 삭제된 계정 |
| -------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------ |
| `Initialize2`                          | `amm_info`, `amm_open_orders`, `amm_target_orders`, 볼트, `lp_mint`, `pool_withdraw_queue`, `pool_temp_lp` | —      |
| `Deposit`                              | — (사용자 LP ATA를 생성할 수 있음)                                                                                 | —      |
| `Withdraw`                             | —                                                                                                        | —      |
| `SwapBaseIn` / `SwapBaseOut` (v1 / V2) | — (사용자 ATA를 생성할 수 있음)                                                                                    | —      |
| `WithdrawPnl`                          | —                                                                                                        | —      |

풀과 그들의 계정은 무기한 지속됩니다. 유동성이 완전히 출금되더라도 `AmmInfo`는 남아 있습니다.

## 어디서 무엇을 읽을지

* **수학 및 수수료 산술**: [`products/amm-v4/math`](/ko/products/amm-v4/math).
* **수수료 분할 및 CPMM/CLMM과의 비교**: [`products/amm-v4/fees`](/ko/products/amm-v4/fees).
* **명령어 계정 목록**: [`products/amm-v4/instructions`](/ko/products/amm-v4/instructions).
* **OpenBook 계정 파생**: OpenBook 프로그램 문서([`github.com/openbook-dex/program`](https://github.com/openbook-dex/program)).

출처:

* [Raydium AMM 프로그램 — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* [`reference/program-addresses`](/ko/reference/program-addresses) 정규 프로그램 ID의 경우
* 상대방 계정의 경우 OpenBook / Serum 프로토콜
