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

# 어드민 키 및 멀티시그

> Raydium 프로그램의 권한 구조 — 각 어드민의 역할, 멀티시그 구성 방식, 온체인에서 각 역할의 현재 보유자를 확인하는 방법.

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

  [영문판 보기 →](/security/admin-and-multisig)
</Info>

<Info>
  모든 Raydium 프로그램에는 최소 하나의 권한 있는 역할이 있습니다 — 프로그램을 업그레이드하거나, 새 설정을 생성하거나, 프로토콜 수수료를 인출할 수 있는 키입니다. 이러한 역할의 권한 범위를 최소화하고 (지연이 있는 멀티시그 뒤에 두는 방식으로) 어드민이 침해되었을 때의 주요 방어 수단으로 활용합니다. 이 페이지에서는 각 역할과 실제 보안 방식을 정리합니다.
</Info>

## 프로그램별 역할

### AMM v4

| 역할         | 권한 주소               | 할 수 있는 것               |
| ---------- | ------------------- | ---------------------- |
| 프로그램 업그레이드 | Squads 멀티시그 (3/4)   | 새 프로그램 바이트코드 배포        |
| 풀 어드민      | Treasury 멀티시그 (3/5) | 풀 상태 토글, 기존 풀 수수료 업데이트 |

### CPMM

| 역할            | 권한 주소               | 할 수 있는 것                          |
| ------------- | ------------------- | --------------------------------- |
| 프로그램 업그레이드    | Squads 멀티시그 (3/4)   | 새 프로그램 바이트코드 배포                   |
| AmmConfig 어드민 | Treasury 멀티시그 (3/5) | 새 AmmConfig(수수료 티어) 생성 및 기존 항목 토글 |
| 풀 생성 수수료 수취인  | Treasury 멀티시그 (3/5) | 풀 생성 시 일회성 수수료 수취                 |

### CLMM

| 역할                            | 권한 주소                       | 할 수 있는 것                                                                                                                                                                                                                                                                |
| ----------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 프로그램 업그레이드                    | Squads 멀티시그 (3/4)           | 새 프로그램 바이트코드 배포                                                                                                                                                                                                                                                         |
| AmmConfig 어드민                 | Treasury 멀티시그 (3/5)         | AmmConfig 생성/수정                                                                                                                                                                                                                                                         |
| DynamicFeeConfig 어드민          | Treasury 멀티시그 (3/5)         | `CreateDynamicFeeConfig` / `UpdateDynamicFeeConfig` — `CreateCustomizablePool` 호출이 선택할 수 있는 동적 수수료 티어 설정                                                                                                                                                                |
| `limit_order_admin` (프로그램 전역) | **오프체인 운영용 핫 월렛 (멀티시그 아님)** | 주문 소유자 대신 지정가 주문을 정산하고 닫습니다. 키퍼 키는 단일 프로그램 전역 상수입니다 (메인넷과 데브넷에서 값이 다름). `SettleLimitOrder` / `CloseLimitOrder` 시 `signer == limit_order.owner \|\| signer == limit_order_admin::ID` 조건으로 검증됩니다. 출력은 항상 원래 소유자의 ATA로 전달되며, 키퍼는 자금을 다른 곳으로 보내거나 주문을 수정하거나 새 주문을 열 수 없습니다. |

`limit_order_admin`은 의도적으로 범위를 좁힌 운영 역할입니다. 오프체인 키퍼가 주문 소유자가 온라인 상태가 아니어도 체결된 주문을 처리할 수 있도록 설계되었습니다. 키퍼 키는 핫 상태 (키퍼 VM에 상주)이며 위의 멀티시그와는 독립적으로 교체됩니다. 키퍼 권한이 실제로 할 수 있는 것은 다음으로 엄격히 제한됩니다:

* `SettleLimitOrder` — 주문의 체결된 출력을 주문의 지정가 기준으로 **소유자의** ATA로 전달합니다.
* `CloseLimitOrder` — 완전히 정산된 주문 계정을 닫아 렌트를 회수합니다 (렌트는 주문 소유자에게 귀속).

`OpenLimitOrder`, `IncreaseLimitOrder`, `DecreaseLimitOrder` 호출, 풀 필드 변경, 다른 명령어 서명 등은 불가능합니다 — 이러한 제한은 명령어의 `Accounts` 구조체 내 시드 및 `has_one` 제약 조건으로 온체인에서 강제됩니다. 키퍼가 침해되더라도 최악의 경우는 사용 불가 (소유자가 직접 정산할 때까지 주문이 대기)이거나, 합법적으로 체결 가능한 주문을 순서와 다르게 정산/종료하는 정도입니다. 소유자가 이미 허가한 곳 이외로 사용자 자금을 이동시키는 것은 불가능합니다.

### Farm v6

| 역할         | 권한 주소             | 할 수 있는 것                       |
| ---------- | ----------------- | ------------------------------ |
| 프로그램 업그레이드 | Squads 멀티시그 (3/4) | 새 프로그램 바이트코드 배포                |
| 팜 생성자 (팜별) | 팜 생성자 지갑          | 보상 볼트 자금 충전, 스케줄 연장, 미사용 보상 회수 |

개별 팜에는 프로토콜 어드민이 없습니다 — 각 팜의 생성자는 자신의 팜만 관리하며, 생성자의 권한 범위는 제한되어 있습니다 (사용자 스테이킹 자산 탈취 불가, 스테이킹 민트 변경 불가).

### LaunchLab

| 역할           | 권한 주소             | 할 수 있는 것                      |
| ------------ | ----------------- | ----------------------------- |
| 프로그램 업그레이드   | Squads 멀티시그 (3/4) | 새 프로그램 바이트코드 배포               |
| 런치 생성자 (런치별) | 런치 생성자 지갑         | 졸업 후 생성자 수수료 수령; 미졸업 커브 잔액 인출 |

런치에는 커브를 변경하거나 모금된 자금을 탈취할 수 있는 프로토콜 어드민이 없습니다.

## 프로그램 업그레이드 권한

Raydium의 프로그램은 표준 Solana **BPF Loader v3** 업그레이드 메커니즘을 사용합니다. 모든 프로그램의 업그레이드 권한은 3/4 Squads 멀티시그가 보유합니다.

3/4 구성을 선택한 이유: 단일 침해로는 부족할 만큼 서명자 수가 충분하면서, 합법적인 업그레이드를 조율하기에 너무 많지 않은 수입니다. 네 명의 권한자는 각각 독립적인 에어갭 콜드 디바이스 서명자로, 핵심 팀원이 보유합니다. 순차 서명 방식으로 동일 트랜잭션에 대한 병렬 승인을 방지하며, 트랜잭션에는 고정 만료 기간이 적용됩니다. 멀티시그 운영은 **Solana STRIDE Program (Asymmetric Research)** 과의 협력 하에 주기적으로 검토됩니다.

### 업그레이드 권한 제거

Raydium은 어떤 프로그램의 업그레이드 권한도 null로 설정하지 않았습니다. 프로토콜은 버그 패치, Token-2022 같은 확장 추가, 통합 드리프트 수정을 위해 프로그램이 업그레이드 가능해야 한다는 원칙 하에 운영됩니다. 트레이드오프: 사용자는 3/4 멀티시그가 충분히 검토된 업그레이드만 배포할 것이라고 신뢰해야 합니다.

불변성을 선호하는 사용자를 위해, 구 버전인 AMM v4 프로그램은 마지막 감사 이후 안정적으로 유지되고 있습니다. 18개월 동안 업그레이드가 없었으며, 권한은 여전히 존재하지만 해당 코드 경로는 사실상 동결 상태입니다.

## AmmConfig 권한

새 AmmConfig 생성은 권한이 필요한 작업입니다 — 3/5 treasury 멀티시그가 새 수수료 티어와 틱 간격을 승인합니다. 기존 풀은 PDA로 AmmConfig를 참조하며, 풀의 수수료 티어는 AmmConfig에 정의된 값을 따릅니다.

**어드민이 기존 AmmConfig를 변경할 수 있나요?** 기술적으로는 가능합니다. `updateAmmConfig`는 어드민이 호출할 수 있습니다. 하지만 실제로는 해당 설정을 사용하는 모든 풀의 경제 구조가 조용히 변경되기 때문에 배포된 AmmConfig 수정은 피하고 있습니다. 변경이 필요한 경우 새 AmmConfig를 생성하고 마이그레이션하는 것이 프로토콜 정책입니다.

**어드민이 설정을 통해 프로토콜 수수료를 탈취할 수 있나요?** 아닙니다 — AmmConfig에는 수수료 매개변수가 포함되지만 프로토콜 수수료 수취인은 포함되지 않습니다. 수취인 주소는 풀별로 별도의 불변 주소입니다.

## 프로토콜 수수료 수령

스왑 수수료의 일부 (설정에 따라 25 bps 스왑 수수료 중 일반적으로 3–12 bps)가 프로토콜 수수료 볼트에 누적됩니다. 멀티시그는 이 누적된 수수료를 인출할 수 있습니다. 사용자의 LP 잔액에는 영향을 주지 않습니다 — LP 자금이 아닌 프로토콜에 사전 할당된 몫입니다.

## 팜 생성자 권한

Farm v6에서 생성자에게 부여된 권한:

* 보상 볼트 자금 충전 (토큰 추가).
* 스케줄 연장 (종료 시간 연장).
* 종료 시간 이후 `withdrawReward` 호출로 볼트 미사용 잔액 회수.

팜 생성자가 **할 수 없는 것**:

* 사용자 스테이킹 LP 인출.
* 스테이킹 민트 변경.
* 이미 지난 보상 비율 소급 변경 (`setRewards`를 통한 이후 시점 변경만 가능).
* 사용자 수확 동결.

악의적인 팜 생성자가 할 수 있는 최악의 경우는 볼트 자금을 충분히 채우지 않아 팜이 고갈되는 것입니다. 사용자의 원금 스테이크는 항상 안전합니다.

## Squads 멀티시그 구성

Raydium은 서로 다른 위험 영역을 위해 두 개의 별도 Squads 멀티시그를 운영합니다. 둘 다 [Squads Protocol](https://app.squads.so) UI에서 온체인으로 확인할 수 있습니다.

| 멀티시그           | 임계값     | 타임락      | 범위                                                                                                                                                                                                                                               |
| -------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **프로그램 업그레이드** | **3/4** | **24시간** | AMM v4, CPMM, CLMM, LaunchLab, Lock, AMM Routing, Stable Swap 및 레거시 Farm/Staking 프로그램의 새 바이트코드 배포 단독 권한. [`app.squads.so/.../FytDr…ceZQK`](https://app.squads.so/squads/FytDrVzDybM1TwFQPGb8qaxZR7dBCzNeqT3vtQsceZQK/home)에서 확인.                 |
| **Treasury**   | **3/5** | 없음       | Treasury 자산, 프로토콜 수익, 운영 비용. 현재 Raydium의 제한된 프로그램 어드민 권한 (AmmConfig 생성, 프로토콜 수수료 수령, 풀 파라미터 설정)도 보유. [`v3.squads.so/dashboard/RVha…dHdtYz09`](https://v3.squads.so/dashboard/RVhaWTdGUGNjTnVFdmdIWk1DTXB3dzJGZW44b0xXQlNKemRnQ3NYM0Rqd20=)에서 확인. |

업그레이드 멀티시그의 운영 특성:

* **모든 트랜잭션에 24시간 타임락 적용.** 오늘 승인된 업그레이드는 24시간 이후에 실행되므로, 사용자가 대응할 시간이 주어집니다.
* **에어갭 콜드 디바이스 서명.** 콜드 디바이스는 네트워크 카드가 물리적으로 제거되어 있으며, 하드웨어 월렛과만 연결되고 별도의 핫 디바이스로부터 QR 코드로 트랜잭션 데이터를 읽습니다.
* **순차 서명.** 한 콜드 디바이스가 트랜잭션을 생성하고 서명한 후에야 다음 콜드 디바이스가 서명 프로세스를 시작할 수 있어 동일 트랜잭션에 대한 충돌 또는 병렬 서명을 방지합니다.
* **트랜잭션 만료.** 모든 트랜잭션에 고정 만료 기간이 적용되어 오래된 트랜잭션은 자동으로 무효화됩니다.
* **TOTP + 물리적 키 강제 적용** — 트랜잭션 개시 및 온체인 브로드캐스트에 사용되는 핫 디바이스에 적용.
* **공개 트랜잭션 큐.** Squads UI에서 누구나 대기 중인 업그레이드를 모니터링할 수 있습니다.

Treasury 멀티시그에는 타임락이 없습니다 — 범위가 더 좁고 일상적인 운영 (AmmConfig 생성, 수수료 수령 등)은 당일 처리가 필요하기 때문입니다. Treasury 멀티시그는 위의 프로그램별 표에 나열된 제한적 프로그램 어드민 권한도 보유하며, 이는 임시 배치이고 프로젝트의 보안 파트너들과 주기적으로 검토됩니다.

## 온체인에서 권한 확인

프로그램의 현재 업그레이드 권한을 확인하는 가장 간단한 방법:

```bash theme={null}
solana program show <PROGRAM_ID>
```

출력 예시:

```
Program Id:          CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F
Owner:               BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: <ProgramDataPDA>
Authority:           <EXPECTED_MULTISIG_ADDRESS>
Last Deployed In Slot: <slot>
Data Length: <n> bytes
```

`Authority`가 예상되는 Squads 멀티시그 주소가 아니라면 문제가 있는 것입니다. Raydium은 예상 권한 주소를 [`reference/program-addresses`](/ko/reference/program-addresses)에 게시하고 있습니다.

AmmConfig / 풀 어드민 역할의 경우, 온체인 계정을 가져와 디코딩하세요:

```ts theme={null}
const config = await raydium.cpmm.getAmmConfig(configPda);
console.log("AmmConfig admin:", config.admin.toBase58());
// Expected: 3/5 treasury multisig.
```

## 권한 변경 이력

| 날짜      | 프로그램    | 변경 내용                                      |
| ------- | ------- | ------------------------------------------ |
| 2022-12 | AMM v4  | 인시던트 이후 업그레이드 권한을 싱글 시그에서 3/4 멀티시그로 마이그레이션 |
| 2023-02 | 전체 프로그램 | 모든 운영 역할을 3/5 treasury 멀티시그로 통합            |
| 2023-11 | CLMM    | 노출 범위 축소를 위해 보상 전용 운영에 두 번째 멀티시그 추가        |
| 2024-05 | CPMM    | 최초 배포부터 멀티시그 권한으로 시작                       |

## 사용자 측 고려사항

사용자/LP/통합 개발자로서 무엇을 해야 할까요?

1. **대규모 할당 전 업그레이드 권한을 확인하세요.** 문서에 명시된 멀티시그와 일치하는지 확인합니다.
2. **멀티시그 활동을 모니터링하세요.** [Squads UI](https://v4.squads.so)에서 대기 중인 트랜잭션을 확인할 수 있으며, 예정된 업그레이드에 동의하지 않을 경우 24시간 내 포지션을 정리할 수 있습니다.
3. **타임락을 고려한 청산 전략을 수립하세요.** 자동 복리 운용 중이라면, 변경 예정인 명령어가 포함되지 않도록 청산 경로를 확인하세요.
4. **프로그램 불변성을 가정하지 마세요.** Raydium의 모든 프로그램은 업그레이드될 수 있으므로 이를 고려해 계획을 세우세요.

## 통합 개발자가 주의해야 할 함정

### 1. 권한 주소 캐싱

업그레이드 권한이나 어드민 멀티시그 주소를 코드에 하드코딩한 경우, 이후 교체되면 검증에 실패합니다. 런타임에 [`reference/program-addresses`](/ko/reference/program-addresses)에서 가져오거나 주기적으로 갱신하세요.

### 2. AmmConfig가 고정불변이라고 가정

새 AmmConfig는 언제든지 생성될 수 있습니다. 애그리게이터/라우터는 전체 설정 목록을 주기적으로 (시간 단위도 충분) 다시 가져와야 합니다.

### 3. 팜 생성자의 악의적 행동 벡터

평판이 낮은 팜에 예치할 경우, 생성자는 팜을 일찍 종료하고 보상 볼트를 회수할 수 있습니다 (아직 스테이킹한 사용자가 없다고 가정). 사용자가 스테이킹을 시작하면 비례 권리가 프로그램에 의해 강제되며, 회수는 합리적 종료 이후 남은 잔액만 가능합니다.

## 관련 링크

* [`reference/program-addresses`](/ko/reference/program-addresses) — 공식 권한 주소 목록.
* [`security/attack-vectors`](/ko/security/attack-vectors) — 어드민 침해가 실제로 발생하는 방식.
* [`ray/treasury`](/ko/ray/treasury) — treasury 및 수수료 수령 주소.
* [`security/disclosure`](/ko/security/disclosure) — 어드민 관련 의심 사항 제보.

출처:

* [Squads Protocol](https://v4.squads.so) — 멀티시그 UI.
* [Solana BPF Loader 문서](https://docs.solana.com/developing/runtime-facilities/programs#bpf-loader) — 업그레이드 메커니즘.
