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

# 2026-09-09 — AMM v4: Solana 3.0 의존성 및 초과 lamports 회수

> AMM v4는 solana-program 3.0, spl-token 9.0 및 새로운 solana-system-interface 크레이트에 대해 재구축되며, SIMD-0437에서 해제된 렌트를 반환하는 관리자 전용 WithdrawExcessLamports 명령어(태그 18)를 추가합니다. CreateConfigAccount는 더 이상 후행 렌트 sysvar를 읽지 않으며 호환성이 유지됩니다. 아무것도 손상되지 않으며 계정 레이아웃이 변경되지 않았습니다.

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

  [영문판 보기 →](/reference/changelog/2026-09-09-amm-v4-solana-3-and-excess-lamports)
</Info>

<Info>
  이 항목은 예정된 AMM v4 프로그램 업데이트를 다룹니다. 배포 전에 로컬 릴리스 브랜치에 대해 검증되었습니다. 새로운 명령어에 의존하기 전에 배포된 프로그램을 확인하세요.
</Info>

두 가지 관련 없는 사항이 한 번의 재구축으로 함께 제공됩니다.

첫 번째는 유지보수입니다. AMM v4는 2.1 업그레이드 이후 `solana-program` `=2.1.0`에 고정되어 있었으며, 이 고정이 차단되고 있었습니다. 시스템 프로그램 헬퍼는 Solana 3.0에서 자체 `solana-system-interface` 크레이트로 이동했고, `spl-token`은 9.0에 도달했으며, `spl-associated-token-account`는 8.0에 도달했습니다. 이 릴리스는 세 가지 모두를 포함합니다.

두 번째는 프로토콜이 받아야 할 자금입니다. [SIMD-0437](/ko/solana-fundamentals/rent-and-reclaimable-rent)은 렌트 면제 최소값을 5단계에 걸쳐 90% 감소시키고 있으며, 1단계는 2026년 9월 3일 메인넷에 도착했습니다. AMM v4가 그 이전에 생성한 모든 계정(수백 개의 풀 볼트, LP 민트, `AmmInfo` 및 `TargetOrders` 계정)은 이제 과잉 자금이 조성되어 있으며, 프로그램 소유 계정의 lamports는 해당 프로그램에서만 이동할 수 있습니다. 따라서 새로운 명령어가 필요합니다.

## 통합자를 위한 요약

* **트레이더나 LP가 호출하는 것은 변경되지 않았습니다.** `Initialize2`, `Deposit`, `Withdraw`, `SwapBaseIn`, `SwapBaseOut`, `SwapBaseInV2`, `SwapBaseOutV2`, `WithdrawPnl` 및 `SetParams`는 계정 목록, 인수 레이아웃 및 수학을 유지합니다. 계정 레이아웃이 변경되지 않았습니다. 기존 오류 코드가 이동하지 않았습니다.
* **하나의 명령어가 추가됩니다: `WithdrawExcessLamports`, 태그 `18`.** 관리자 전용, 인수 없음, 가변 계정 목록. AMM v4 제어 계정에서 렌트 면제 최소값 이상의 lamports를 반환하고 다른 것은 건드리지 않습니다. [`products/amm-v4/instructions`](/ko/products/amm-v4/instructions#withdrawexcesslamports)를 참조하세요.
* **하나의 오류 코드가 추가됩니다: `60` `LamportsCalculateError`.** `AmmError`는 Anchor 번호가 아닙니다 — 0부터 시작합니다 — 따라서 이는 `custom program error: 0x3c`입니다. 코드 `0`–`59`는 변경되지 않습니다.
* **`CreateConfigAccount`(태그 14)는 더 이상 렌트 sysvar를 읽지 않습니다** 그리고 이제 4개 계정 명령어로 문서화됩니다. **이 릴리스에서는 아무것도 손상되지 않습니다**. 이것이 포함됩니다: 계정이 목록의 마지막이었고 핸들러는 길이 확인 없이 위치적으로 읽으므로, 여전히 이를 전달하는 관리자 도구는 계속 작동합니다.
* **IDL 새로고침이 필요합니다** 클라이언트를 생성하는 경우. 하나의 새로운 명령어, 하나의 새로운 오류 변형, 하나의 변경된 계정 목록.

## `WithdrawExcessLamports`

명령어는 수집 lamports 지갑을 유일한 서명자 및 대상으로, AMM v4 권한 PDA, SPL Token 프로그램, 그리고 임의의 수의 소스 계정을 사용합니다. 각 소스 계정의 소유자에 따라 디스패치합니다:

| 소스 계정 소유자                      | 처리                                                                                                             |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------- |
| SPL Token, 165 바이트, 비네이티브      | 권한 PDA로 서명된 토큰 프로그램의 `WithdrawExcessLamports`(판별자 `38`) CPI                                                    |
| SPL Token, 165 바이트, 네이티브(wSOL) | `SyncNative`, 래핑된 `amount`가 얼마나 증가했는지 측정, 정확히 그 델타에 대해 `UnwrapLamports`(판별자 `45`) 실행, 그 후 래핑된 잔액이 변경되지 않았음을 확인 |
| SPL Token, 기타 크기(LP 민트)        | `WithdrawExcessLamports` CPI                                                                                   |
| AMM v4 프로그램 자체                 | 계정을 `rent.minimum_balance(data_len)`으로 직접 차감                                                                   |
| 기타                             | 조용히 건너뜀                                                                                                        |

wSOL 분기가 흥미로운 부분입니다. 래핑된 SOL 계정의 lamport 잔액 *은* 토큰 잔액이므로, 토큰 프로그램은 이에 대해 `WithdrawExcessLamports`를 완전히 거부합니다. `SyncNative`를 통한 왕복과 델타 크기의 `UnwrapLamports`는 기증된 초과분만 추출하고 래핑된 잔액을 정확히 시작한 위치에 남깁니다 — 이는 나중에 확인되며, 산술이 일치하지 않으면 `LamportsCalculateError`가 발생합니다. **따라서 SOL 측 풀 볼트는 스윕을 통해 전체 유동성을 유지하며**, LP는 스윕 전후로 가격 변화를 보지 않습니다.

서명자는 클러스터당 전용 키이며, 기존 AMM 소유자 및 풀 생성 수수료 주소와 동일한 `config_feature` 모듈 아래에 하드코딩됩니다. CPMM 및 LaunchLab과 달리, AMM v4는 **오직** 해당 지갑만 수락합니다 — 관리자 폴백이 없습니다. 주소는 [`reference/program-addresses`](/ko/reference/program-addresses#excess-lamports-collection-wallets)에 있습니다.

## `CreateConfigAccount`는 더 이상 렌트 sysvar를 읽지 않습니다

Solana 3.0은 `Rent::get()`을 렌트 매개변수를 읽는 자연스러운 방법으로 만드는 것이므로, 릴리스는 프로그램의 모든 네 개의 `Rent::from_account_info(...)` 호출을 대체했습니다. 세 개의 호출에서 — 풀의 토큰 계정, LP 민트 및 `Initialize2` 중 PDA 계정을 생성하는 헬퍼 — sysvar 계정은 여전히 전달되고 토큰 프로그램 CPI로 여전히 전달되므로, 해당 계정 목록에 대해 아무것도 변경되지 않습니다. `CreateConfigAccount`에서 sysvar는 다른 목적이 없었고 목록의 마지막 계정이었으므로, 문서화된 목록에서 제거되었습니다:

|   | 이전(5개 계정)        | 이후(4개 계정)        |
| - | ---------------- | ---------------- |
| 1 | `admin` (W, S)   | `admin` (W, S)   |
| 2 | `amm_config` (W) | `amm_config` (W) |
| 3 | `pnl_owner`      | `pnl_owner`      |
| 4 | `system_program` | `system_program` |
| 5 | `rent`           | —                |

**이전의 5개 계정 목록을 보내는 것은 여전히 작동합니다.** 제거된 계정은 마지막이었고, `process_create_config`는 총 개수를 확인하는 것이 없는 `next_account_info`를 통해 위치적으로 4개 계정을 읽으므로, 후행 렌트 계정은 절대 조회되지 않습니다. 관리자 도구는 명확성을 위해 업데이트되어야 하지만, 긴급하지는 않습니다. 사용자 대면 빌더는 이 명령어를 전혀 구성하지 않습니다.

`Initialize2`는 과도하게 읽지 않을 경우입니다: 또한 `Rent::from_account_info` 호출을 중단했지만, 렌트 계정은 **위치 3에 유지되며** 여전히 실제로 사용됩니다 — 프로그램은 풀의 볼트와 LP 민트를 생성하는 `spl_token::initialize_account` 및 `initialize_mint` CPI로 이를 전달합니다. 해당 계정 목록에서 이를 제거하면 풀 생성이 손상됩니다.

## 의존성 변경

| 크레이트                           | 이전       | 이후                     |
| ------------------------------ | -------- | ---------------------- |
| `solana-program`               | `=2.1.0` | `=3.0.0`               |
| `solana-system-interface`      | —        | `=3.0.0`, `bincode` 기능 |
| `spl-token`                    | `=7.0.0` | `9.0.0`                |
| `spl-associated-token-account` | `6.0.0`  | `8.0.0`                |

프로그램이 사용하는 시스템 프로그램 조각 — `system_instruction::create_account`, `transfer`, `allocate`, `assign`, 및 프로그램 ID 자체 — 이제 `solana_program::system_program` 및 `solana_program::system_instruction`이 아닌 `solana-system-interface`에서 옵니다. 프로그램 ID는 바이트 동일하므로, 이는 체인상 결과가 없는 컴파일 타임 이동이며, 이에 대해 비교하는 `InvalidSysProgramAddress` 확인도 포함됩니다.

두 개의 죽은 모듈도 삭제되었습니다: `srm_token` 및 `msrm_token`, [OpenBook 제거](/ko/reference/changelog/2026-07-22-amm-v4-openbook-removal)에서 남겨진 Serum/MSRM 민트 선언. 아무것도 이들을 참조하지 않았습니다.

## 변경되지 않은 것

* **모든 계정 레이아웃.** `AmmInfo`, `StateData`, `TargetOrders`, `AmmConfig` — 동일한 크기, 동일한 필드 오프셋. 인덱서나 디코더 변경 없음.
* **오류 코드 `0`–`59`.** `LamportsCalculateError`는 `60`에 추가되므로 아무것도 이동하지 않습니다.
* **AMM 권한 PDA.** 여전히 전체 프로그램에 대한 하나의 PDA, 시드 `["amm authority"]`, nonce `254`.
* **수수료, PnL 회계 및 곡선.** 건드리지 않음. `WithdrawExcessLamports`는 어떤 풀의 준비금에도 포함되지 않은 lamports를 이동합니다.
* **Token-2022.** 여전히 지원되지 않음. 새로운 명령어는 레거시 SPL Token 프로그램에만 말합니다.
* **프로그램 ID.** 변경되지 않음 — [`reference/program-addresses`](/ko/reference/program-addresses)를 참조하세요.

## 업데이트된 페이지

* `products/amm-v4/instructions` — `WithdrawExcessLamports`가 계정 목록 및 소유자별 디스패치 테이블과 함께 추가됨; 렌트 sysvar 제거를 다루는 새로운 `CreateConfigAccount` / `UpdateConfigAccount` 섹션; 인벤토리 테이블 및 상태 변경 매트릭스 행 추가.
* `products/amm-v4/overview` — 릴리스 배너.
* `reference/error-codes` — 새로운 "AMM v4: `AmmError`는 Anchor 번호가 아님" 섹션으로 코드 `60` 및 `0` 기반 번호 매기기 문서화.
* `reference/program-addresses` — 새로운 "초과 lamports 수집 지갑" 섹션.
* `solana-fundamentals/rent-and-reclaimable-rent` — 새로운 "Raydium 프로그램이 자체 측에서 스윕하는 것" 섹션; 래핑된 SOL 노트가 두 토큰 프로그램 모두 `UnwrapLamports`를 노출한다고 말하도록 수정됨.
* `solana-fundamentals/toolchain` — Agave 3.1.10, `release.anza.xyz`, Rust 1.91.0.
