> ## 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 — CPMM: Anchor 1.0, 초과 lamports 회수, 고정 수수료 소유자

> CPMM이 Agave 3.1.10에서 Anchor 1.0.2로 이동하고 SIMD-0437로 해제된 임차료를 회수하는 관리자 CollectExcessLamports 명령을 추가합니다. CreateAmmConfig는 이제 서명자 대신 하드코딩된 프로토콜 및 펀드 수수료 소유자를 작성하고, 4개 주소 Token-2022 민트 화이트리스트가 제거되며, ClosePermissionPda는 전용 권한 부여 권한을 수락합니다. 오류 6015가 추가됩니다.

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

  [영문판 보기 →](/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports)
</Info>

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

CPMM의 주요 변경 사항은 프레임워크 이동입니다: Anchor `0.32.1`에서 `1.0.2`로, 빌드 도구 체인은 Agave 2.3.0에서 3.1.10으로 이동합니다. 함께 따라오는 것은 4가지 동작 변경으로, 이 중 3가지는 관리 도구에만 영향을 미치고 1가지(민트 화이트리스트 제거)는 **새** 풀에 사용할 수 있는 Token-2022 민트를 변경합니다.

트레이더, LP 또는 풀 생성자가 호출하는 모든 것은 계정 목록, 인수 및 수학을 유지합니다.

## 통합자를 위한 요약

* **사용자 대면 명령이 변경되지 않았습니다.** `Initialize`, `InitializeWithPermission`, `Deposit`, `Withdraw`, `SwapBaseInput`, `SwapBaseOutput` 및 4개의 `Collect*Fee` 경로 모두 바이트 동일합니다. 계정 레이아웃이 변경되지 않았습니다.
* **하나의 명령이 추가됩니다: `CollectExcessLamports`.** 관리자 전용, 인수 없음, `remaining_accounts`로 전달된 소스입니다. CPMM 제어 금고, LP 민트 및 PDA에서 임차료 면제 최소값 이상의 lamports를 반환하며 다른 것은 건드리지 않습니다. [`products/cpmm/instructions`](/ko/products/cpmm/instructions#collectexcesslamports)를 참조하세요.
* **하나의 오류 코드가 추가됩니다: `6015` `LamportsCalculateError`.** 코드 `6000`–`6014`는 변경되지 않습니다.
* **`CreateAmmConfig`는 더 이상 서명자를 수수료 소유자 필드에 복사하지 않습니다.** 새 구성은 하드코딩된 `protocol_fee_owner` 및 `fund_fee_owner` 키를 가져옵니다. **기존 `AmmConfig` 계정은 건드리지 않습니다** — 계정에서 `protocol_owner` / `fund_owner`를 읽으십시오. 어느 값이든 가정하지 마세요.
* **하드코딩된 4개 주소 Token-2022 `MINT_WHITELIST`가 제거되었습니다.** `SupportMintAssociated` PDA 레지스트리는 이제 확장 허용 목록의 유일한 우회입니다. 기존 풀은 영향을 받지 않습니다. 검사는 풀 생성 시에만 실행됩니다.
* **`ClosePermissionPda`는 공유 관리자가 아닌 전용 권한 PDA 생성자 권한을 수락합니다.**
* **IDL 새로고침이 필요합니다.** 하나의 새 명령, 하나의 새 오류 변형.
* **TypeScript 클라이언트 패키지의 이름이 변경되었습니다.** `@coral-xyz/anchor`는 `0.32.1`에서 고정됩니다. Anchor 1.x 클라이언트는 `@anchor-lang/core`로 게시됩니다.

## `CollectExcessLamports`

[SIMD-0437](/ko/solana-fundamentals/rent-and-reclaimable-rent)의 1단계는 2026년 9월 3일 메인넷에 도착했으며, 임차료 면제 최소값을 9% 줄였고 4단계가 더 있습니다. 단계 전에 생성된 모든 CPMM 풀 금고, LP 민트, `PoolState`, `AmmConfig`, `ObservationState`, `Permission` 및 `SupportMintAssociated` 계정은 이제 과잉 자금이 조성되었으며, 프로그램 소유 계정의 lamports는 해당 프로그램에서만 이동할 수 있습니다.

명령은 4개의 고정 계정(서명자/대상 지갑, `vault_and_lp_mint_auth_seed` 권한 PDA, **둘 다** 토큰 프로그램)을 가져간 다음 `remaining_accounts`의 임의 개수의 소스 계정을 가져갑니다. 각 소스 계정의 소유자에 따라 디스패치합니다: 토큰 계정 또는 민트의 경우 토큰 프로그램의 `WithdrawExcessLamports`(판별자 `38`)로의 CPI, CPMM 소유 PDA의 경우 직접 차변, 다른 것은 조용히 건너뜁니다.

래핑된 SOL은 이해할 가치가 있는 경우입니다. 네이티브 토큰 계정의 lamport 잔액 *은* 토큰 잔액이므로 두 토큰 프로그램 모두 하나에서 `WithdrawExcessLamports`를 거부합니다. CPMM은 대신 `SyncNative`를 CPI합니다(기부된 초과분을 래핑된 `amount`로 접으면서), 금액이 얼마나 증가했는지 측정하고, 정확히 그 델타에 대해 `UnwrapLamports`(판별자 `45`)를 수행한 다음 래핑된 잔액이 사전 동기화 값과 같아야 합니다 — 그렇지 않으면 `LamportsCalculateError`. **SOL 측 풀 금고는 스윕을 통해 전체 유동성을 유지하며**, LP는 스윕 전체에서 가격 변화를 보지 않습니다.

서명자는 공유 프로그램 관리자 또는 전용 수집 lamports 지갑일 수 있습니다. 주소는 [`reference/program-addresses`](/ko/reference/program-addresses#excess-lamports-collection-wallets)에 있습니다.

## `CreateAmmConfig`는 고정 수수료 소유자를 작성합니다

이 릴리스 전에 `create_amm_config`는 호출 서명자에서 두 수수료 소유자 필드를 설정했습니다:

```rust theme={null}
amm_config.protocol_owner = ctx.accounts.owner.key();
amm_config.fund_owner      = ctx.accounts.owner.key();
```

이제 프로그램의 자체 상수를 작성합니다:

```rust theme={null}
amm_config.protocol_owner = crate::protocol_fee_owner::ID;
amm_config.fund_owner      = crate::fund_fee_owner::ID;
```

`CreateAmmConfig`는 `crate::admin::ID`로 게이트되므로 실질적인 효과는 새로 생성된 수수료 계층이 관리자 멀티시그 대신 전용 운영 지갑에서 처음부터 스윕되며, 관리자는 `UpdateAmmConfig` 매개변수 `3` 또는 `4`를 통해 필드를 먼저 회전하지 않고는 방금 생성한 구성에서 수집할 수 없습니다.

두 상수는 프로그램의 나머지 주소와 동일한 devnet/mainnet `cfg` 패턴을 따르며, devnet에서는 둘 다 동일한 키로 확인됩니다. [`reference/program-addresses`](/ko/reference/program-addresses#cpmm-fee-owner-wallets)를 참조하세요.

<Warning>
  **이것은 마이그레이션이 아닙니다.** 이미 존재하는 모든 `AmmConfig`는 생성된 `protocol_owner` 및 `fund_owner`를 유지합니다. 새 상수를 하드코딩하기 시작하는 수집 도구는 이전 구성에서 실패하고, "관리자 키"를 가정하는 도구는 새 구성에서 실패합니다. 필드를 읽으세요.
</Warning>

## Token-2022 민트 화이트리스트가 제거되었습니다

`is_supported_mint`는 민트의 확장을 반복하기 전에 4개 주소의 하드코딩된 `MINT_WHITELIST`에서 단락되곤 했습니다. 해당 배열 — 그리고 모든 호출에서 빌드된 `HashSet` — 이 삭제되었습니다. 남은 것은:

1. 레거시 SPL Token 민트는 무조건 통과합니다.
2. `[b"support_mint", mint]`에서 초기화된 `SupportMintAssociated` PDA가 있는 민트는 무조건 통과합니다.
3. 그렇지 않으면 민트의 모든 확장은 `TransferFeeConfig`, `MetadataPointer`, `TokenMetadata`, `InterestBearingConfig`, `ScaledUiAmount` 중 하나여야 합니다.

레지스트리 PDA는 프로그램에 한동안 있었으며, 자체 `CreateSupportMintAssociated` / `CloseSupportMintAssociated` 쌍과 공유 관리자 옆의 자체 전용 권한이 있으며, `Initialize` 및 `InitializeWithPermission` 모두에서 참조됩니다. 정적 배열을 제거하면 민트 온보딩이 이제 프로그램 업그레이드가 아닌 순수 온체인 작업이 됩니다 — 이것이 요점입니다.

**기존 풀은 영향을 받지 않습니다**, 민트 검사는 풀 생성 시에만 실행되기 때문입니다. 변경되는 것은 4개의 이전에 화이트리스트된 민트 중 하나에 대해 *새* CPMM 풀을 생성하려면 해당 민트가 레지스트리 PDA를 가져야 한다는 것입니다 — 중요한 것들은 메인넷에서 이미 가지고 있습니다. 레지스트리가 하는 것과 하지 않는 것을 포함한 전체 그림은 [`reference/token-2022-support`](/ko/reference/token-2022-support#bypass-paths)에 있습니다.

## `ClosePermissionPda` 서명자 확대

`CreatePermissionPda`는 이미 공유 관리자 또는 전용 권한 PDA 생성자 권한을 수락했지만, `ClosePermissionPda`는 `address =` 제약으로 관리자에 고정되었습니다. 닫기 경로는 이제 동일한 쌍을 가져갑니다:

```rust theme={null}
constraint = (owner.key() == crate::admin::ID
           || owner.key() == crate::create_permission_pda_owner::ID) @ ErrorCode::InvalidOwner
```

따라서 권한을 발급하는 권한은 멀티시그를 통해 라우팅하지 않고도 이를 취소할 수 있습니다. 무단 서명자에 대한 오류는 어느 쪽이든 `InvalidOwner`(`6001`)입니다 — 이전 `address =` 제약은 이미 해당 사용자 정의 오류를 수행했습니다 — 따라서 수락된 서명자 집합만 확대되었습니다.

## 도구 체인 및 종속성 변경

| 항목                                                                                 | 이전                                | 이후                               |
| ---------------------------------------------------------------------------------- | --------------------------------- | -------------------------------- |
| `anchor-lang` / `anchor-spl`                                                       | `0.32.1`                          | `=1.0.2`                         |
| `Anchor.toml` `solana_version`                                                     | `2.3.0`                           | `3.1.10`                         |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status` (클라이언트 크레이트) | `2.3.0`                           | `3.0`                            |
| `anchor-client` / `-lang` / `-spl` (클라이언트 크레이트)                                    | `0.32.1`                          | `=1.0.2`                         |
| README: `rustup default`                                                           | `1.81.0`                          | `1.91.0`                         |
| README: Solana 설치 프로그램                                                             | `release.anza.xyz/v2.1.0`         | `release.anza.xyz/v3.1.10`       |
| README: `avm install`                                                              | `0.31.0`                          | `1.0.2` (더하기 `avm use 1.0.2`)    |
| README: Anchor 저장소                                                                 | `coral-xyz/anchor`                | `solana-foundation/anchor`       |
| Docker 이미지                                                                         | `solanafoundation/anchor:v0.32.1` | `solanafoundation/anchor:v1.0.2` |
| `@coral-xyz/anchor`                                                                | `0.32.1`                          | `@anchor-lang/core` `1.0.2`로 대체됨 |
| `@solana/spl-token`                                                                | `^0.4.8`                          | `^0.4.14`                        |
| `typescript`                                                                       | `^4.3.5`                          | `^5.6.3`                         |

Anchor 1.0은 모든 CPI 호출 사이트에서 두 가지를 변경합니다. 자신의 프로그램에서 CPMM을 통합하는 경우 중요합니다: `CpiContext::new`는 `AccountInfo` 대신 프로그램의 `Pubkey`를 가져가고, `Context`는 4개 대신 1개의 수명 매개변수를 가집니다. 클라이언트 측에서 `RequestBuilder::instructions()`는 `Result<...>` 대신 `Vec<Instruction>`을 반환하고, `CommitmentConfig`는 `solana_sdk` 대신 `anchor_client`에서 옵니다. `spl-associated-token-account` 8.0은 주소 도우미를 `::address` 아래로 이동하고 프로그램 ID를 `::program::ID`로 이동했습니다. [`sdk-api/rust-cpi`](/ko/sdk-api/rust-cpi#cargo-dependencies)를 참조하세요.

두 가지 빌드 시스템 세부 사항, 둘 다 온체인 효과 없음: 프로그램 크레이트는 `CPSWAP_LOCALNET_ADMIN` 환경 변수에서 로컬 지갑을 `admin`으로 컴파일하는 `localnet` 기능을 선언합니다(관리자 게이트 테스트가 실제로 서명할 수 있도록 — `yarn test:local-admin`이 이를 연결합니다). `programs/cp-swap/Cargo.toml`의 중복 `[profile.release]` 블록이 삭제되었습니다. Cargo는 워크스페이스 루트 외부의 `[profile]`을 무시하므로 루트 블록이 이미 적용 중인 것입니다 — 프로그램 수준 블록의 `panic = "abort"`가 적용되지 않았다는 사실을 포함합니다.

## 변경되지 않은 것

* **모든 계정 레이아웃.** `PoolState`, `AmmConfig`, `ObservationState`, `Permission`, `SupportMintAssociated` — 동일한 크기, 동일한 오프셋.
* **오류 코드 `6000`–`6014`.**
* **확장 허용 목록 자체.** 여전히 동일한 5개 확장.
* **수수료율, 수수료 발생 및 곡선.** `CollectExcessLamports`는 어떤 풀의 준비금의 일부도 아닌 lamports를 이동합니다.
* **`spl_memo`.** `Withdraw`의 메모 프로그램 제약은 `spl_memo::id()`에서 `anchor_spl::memo::ID`로 이동했습니다 — 이름이 바뀐 `anchor-spl` 내보내기 아래의 동일한 주소입니다.
* **프로그램 ID.** 변경되지 않음.

## 업데이트된 페이지

* `products/cpmm/instructions` — `CollectExcessLamports`가 계정 목록 및 소유자별 디스패치 테이블과 함께 추가됨; `CreateAmmConfig`는 `creator_fee_rate` 인수 및 고정 수수료 소유자에 대한 참고를 얻습니다; `CollectExcessLamports`, `CreateSupportMintAssociated`, `CloseSupportMintAssociated`에 대한 명령 요약 행이 추가됨; `ClosePermissionPda` 서명자 수정됨; `Initialize` 전제 조건이 레지스트리 전용 우회를 위해 다시 작성됨; 상태 변경 매트릭스 행이 추가됨.
* `products/cpmm/accounts` — Token-2022 섹션이 레지스트리 PDA 주위에서 다시 작성됨, 화이트리스트 제거가 호출됨; `ClosePermissionPda` 서명자 수정됨.
* `products/cpmm/overview` — 화이트리스트 문장이 다시 작성됨.
* `products/cpmm/code-demos` — Rust CPI 스켈레톤이 Anchor 1.0으로 업데이트됨.
* `reference/token-2022-support` — 우회 경로 섹션이 레지스트리 PDA 주위에서 다시 작성됨, 제거된 `MINT_WHITELIST`가 "제거된 우회" 섹션으로 이동됨.
* `reference/error-codes` — `6015` 문서화됨.
* `reference/program-addresses` — 새로운 "CPMM support-mint registry authority", "CPMM fee-owner wallets" 및 "Excess-lamports collection wallets" 섹션; `ClosePermissionPda` 참고 수정됨.
* `sdk-api/rust-cpi`, `solana-fundamentals/toolchain`, `integration-guides/cpi-integration` — Anchor 1.0 핀 및 CPI 마이그레이션 참고.
* `solana-fundamentals/rent-and-reclaimable-rent` — 새로운 "Raydium 프로그램이 자신의 측에서 스윕하는 것" 섹션.
