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

# Token-2022 지원 매트릭스

> Raydium 프로그램이 Token-2022를 지원하는 범위, 풀 생성 시 각 프로그램이 적용하는 명시적 허용 목록, 그리고 거부된 민트를 승인하는 우회 경로(정적 민트 화이트리스트, 민트별 레지스트리, Superstate 감지).

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

  [영문판 보기 →](/reference/token-2022-support)
</Info>

<Info>
  Raydium은 임의의 Token-2022 민트를 허용하지 않습니다. CPMM과 CLMM 모두 엄격한 **허용 목록 모드**로 작동합니다. 기본적으로는 소수의 확장만 통과하며, 나머지는 모두 풀 생성 시 거부됩니다. 하드코딩된 주소로 승인된 신뢰할 수 있는 민트 몇 개가 있으며, CLMM은 추가로 관리자가 관리하는 민트별 레지스트리와 런타임 Superstate 토큰 감지를 지원합니다. 이 페이지는 무엇이 적용되고 어디에서 적용되는지에 대한 단일 페이지 참고자료이며, 프로그램 소스의 파일과 행 번호를 포함합니다.
</Info>

## 프로그램 수준의 지원

| 프로그램            | Token-2022 기본/인용 민트? | 모드                                                                                                                                               |
| --------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| **CPMM**        | 예 — 제한됨              | 엄격한 확장 허용 목록 + 4개 민트 정적 화이트리스트                                                                                                                   |
| **CLMM**        | 예 — 제한됨              | 엄격한 확장 허용 목록 + 6개 민트 정적 화이트리스트 + 관리자 민트별 레지스트리 + Superstate 감지                                                                                   |
| **AMM v4**      | 아니오                  | 프로그램은 Token-2022보다 먼저 개발됨, 두 민트 모두 classic SPL Token이어야 함                                                                                        |
| **Stable AMM**  | 아니오                  | AMM v4와 동일한 제약 조건                                                                                                                                |
| **Farm v6**     | 예, 부분적               | 보상 민트는 Token-2022 가능(CPMM/CLMM LP를 래핑할 때 동일한 허용 목록 적용), 사용자 스테이크 LP 민트는 래핑된 풀에서 상속                                                               |
| **LaunchLab**   | 예, 프로그램 관리           | 기본 민트는 Token-2022 가능하지만 전용 `initialize_with_token_2022` 명령어를 통해서만 가능하며, 프로그램 자체에서 `MetadataPointer`(항상)와 선택적 `TransferFeeConfig`(비율 ≤ 5%)로 민트 생성 |
| **Burn & Earn** | 풀 프로그램 미러링           | CPMM / CLMM 게이팅 상속                                                                                                                               |

허용 목록 검사는 다음에 위치합니다:

* **CPMM**: [`raydium-cp-swap/programs/cp-swap/src/utils/token.rs:178`](https://github.com/raydium-io/raydium-cp-swap)의 `is_supported_mint`, `Initialize`에서 호출
* **CLMM**: [`raydium-clmm/programs/amm/src/util/token.rs:280`](https://github.com/raydium-io/raydium-clmm)의 `is_supported_mint`, `CreatePool`에서 호출
* **LaunchLab**: `raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs`의 `initialize_with_token_2022` (소스는 공개되지 않음)

CPMM이나 CLMM에는 **스왑 시간 민트 검사가 없습니다** — 게이트는 풀 생성 시에만 발동합니다. 풀이 존재하면 스왑은 민트가 변경되지 않았다고 신뢰하는데, 이는 Token-2022 민트 상태의 불변 부분에 대해 정확합니다.

## CPMM 및 CLMM 확장 허용 목록

정적 화이트리스트 단축(아래에서 다룸) 후, 프로그램은 민트의 확장을 반복하고 다음 다섯 가지 이외의 확장이 있으면 민트를 거부합니다:

| 확장                      | 허용되는 이유                                                                                                                                     |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `TransferFeeConfig`     | 풀 수학은 인바운드 수수료를 빼고, Token-2022 프로그램이 아웃바운드 수수료를 처리합니다. [`algorithms/token-2022-transfer-fees`](/ko/algorithms/token-2022-transfer-fees) 참조. |
| `MetadataPointer`       | 장식용 — 온체인 메타데이터를 가리킵니다.                                                                                                                     |
| `TokenMetadata`         | 장식용 — 인라인 메타데이터                                                                                                                             |
| `InterestBearingConfig` | 풀은 원금을 봅니다, UI 승수는 장식이며 기초 잔액은 유지됩니다.                                                                                                       |
| `ScaledUiAmount`        | 이자 추적과 동일한 모양 — 스케일 요소는 UI 표시에만 적용됩니다.                                                                                                      |

이 목록에 없는 것 — `TransferHook`, `NonTransferable`, `ConfidentialTransferMint`, `PermanentDelegate`, `MintCloseAuthority`, `DefaultAccountState`, `GroupPointer`, `GroupMemberPointer`, `MemberPointer`, `Pausable` 등 — 은 `is_supported_mint`가 `false`를 반환하고 풀 생성을 되돌리게 합니다.

관련 줄(CPMM, CLMM에서 동일한 형태):

```rust theme={null}
for e in extensions {
    if e != ExtensionType::TransferFeeConfig
        && e != ExtensionType::MetadataPointer
        && e != ExtensionType::TokenMetadata
        && e != ExtensionType::InterestBearingConfig
        && e != ExtensionType::ScaledUiAmount
    {
        return Ok(false);
    }
}
Ok(true)
```

— [`cp-swap/src/utils/token.rs:190–200`](https://github.com/raydium-io/raydium-cp-swap)

## 우회 경로

허용 목록에 맞지 않는 Token-2022 민트도 세 가지 명시적 우회 중 하나를 통해 승인될 수 있습니다. 확장 반복이 실행되기 전에 순서대로 시도됩니다.

### 1. 정적 민트 화이트리스트

각 프로그램에 base58 문자열의 상수 `MINT_WHITELIST` 배열이 하드코딩되어 있습니다. 민트의 주소가 일치하면 함수는 즉시 `true`를 반환하고 확장 검사는 수행되지 않습니다.

| 프로그램 | 화이트리스트된 민트                                                                                                                                                                                     |
| ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| CPMM | `HVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM`, `Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g`, `FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4`, `2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo` |
| CLMM | 위의 4개 + `DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg`, `AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9`                                                                                         |

이 주소들은 프로그램에 구워져 있으며, 목록 업데이트는 3/4 업그레이드 멀티시그를 통한 프로그램 업그레이드가 필요합니다.

### 2. 민트별 레지스트리 — CLMM 전용

CLMM은 추가로 시드 `[b"support_mint", mint]`에서 `SupportMintAssociated` PDA를 참조합니다. 해당 PDA가 민트에 대해 존재하면, 확장 세트와 관계없이 승인됩니다.

PDA는 `CreateSupportMintAssociated`([`admin/create_support_mint_associated.rs`](https://github.com/raydium-io/raydium-clmm))로 생성됩니다. 명령어는 두 서명자로 제한됩니다:

* `crate::admin::ID` — 표준 Raydium 관리자 권한
* `crate::create_support_mint_associated_owner::ID` — 이 목적을 위한 전용 권한: `RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY` (메인넷), `rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5` (데브넷)

효과: CLMM 팀은 프로그램 업그레이드 없이 특정 Token-2022 민트를 풀 생성에 옵트인할 수 있습니다. CPMM은 동등한 기능이 없습니다 — 허용 목록은 순전히 소스 코드에 제한됩니다.

### 3. Superstate 감지 — CLMM 전용

CLMM은 Superstate의 토큰화된 자산을 위한 세 번째 경로를 가지고 있으며, 이들은 CLMM 프로그램에 연결된 `spl-token-2022` 버전이 언팩할 수 없는 `ScaledUiConfig` 확장을 사용합니다. 의존성을 업그레이드하는 대신 CLMM은 권한 형태별로 Superstate 토큰을 감지합니다:

```rust theme={null}
superstate_allowlist::ID == freeze_authority
    && *mint_account_info.owner == spl_token_2022::ID
    && default_account_state_freeze
    && maybe_permanent_delegate
```

— [`raydium-clmm/programs/amm/src/util/token.rs:485`](https://github.com/raydium-io/raydium-clmm)

민트는 **네 가지 모두** 충족하면 이 분기를 통과합니다:

* 소유하는 프로그램이 Token-2022 프로그램입니다.
* 동결 권한이 `superstate_allowlist::ID`와 같습니다. 메인넷: `2Yq4T3mPNfjtEyTxSbRjRKqLf1pwbTasuCQrWe6QpM7x`. 데브넷: `3TRuL3MFvzHaUfQAb6EsSAbQhWdhmYrKxEiViVkdQfXu`.
* `DefaultAccountState` 확장이 `Frozen`으로 설정되어 있습니다.
* 영구 위임자도 `superstate_allowlist::ID`입니다.

이는 레지스트리가 아니라 휴리스틱입니다 — Superstate가 동일한 권한 형태로 발급하는 향후의 모든 민트는 자동으로 승인됩니다.

## 우회 경로가 포기하지 않는 것

우회 경로는 확장 허용 목록을 건너뛰지만, 프로그램은 여전히 다음을 적용합니다:

* 민트는 `Token` 또는 `Token-2022`가 소유합니다. 사용자 정의 토큰 프로그램은 업스트림에서 거부됩니다.
* 풀 볼트는 Token-2022 풀을 위한 올바른 ATA 확장(`ImmutableOwner` 등)으로 생성됩니다.
* 모든 전송은 `transfer_checked`를 통합니다 — 수수료 부담 민트는 올바른 양을 볼트에 넣습니다.

나중에, 예를 들어 `TransferHook`를 추가하는 화이트리스트 또는 PDA 등록 민트는 스왑 시간 검사를 받지 않습니다. 훅은 모든 전송에서 실행되며 스왑을 중단시킬 수 있습니다. 따라서 화이트리스팅은 높은 신뢰 조치입니다.

## "차단됨" 의미 논리

`is_supported_mint`가 `false`를 반환하면, 풀 생성은 `ErrorCode::NotSupportMint`(CPMM) / `ErrorCode::NotSupportMint`(CLMM)으로 되돌립니다. 숫자 코드는 [`reference/error-codes`](/ko/reference/error-codes)를 참조하세요.

기존 풀은 이 검사에 대해 소급적으로 실패할 수 없습니다 — 게이트는 생성 시에만 실행됩니다. 민트 확장은 Raydium이 거부하는 범주에 대해 불변입니다(전송 훅, 비전송 가능, 기밀 전송은 생성 후에 추가될 수 없음), 따라서 정적 검사로 충분합니다.

## 각 제외된 확장이 제외되는 이유

* **TransferHook** — 모든 전송에서 사용자 정의 프로그램을 호출하며, 임의의 CU 소비, 임의의 실패 조건, 호출 프로그램을 다시 입력할 수 있습니다. 안전한 샌드박스가 없습니다. 일부 DEX는 훅 허용 목록을 유지합니다, Raydium은 그렇지 않습니다.
* **NonTransferable** — `Transfer`는 항상 실패합니다. 풀이 보유권을 가질 수 없습니다.
* **ConfidentialTransfer** — 전송 양이 암호화됩니다, 곡선은 스왑을 가격책정할 수 없습니다.
* **PermanentDelegate** — 위임자 보유자는 풀 볼트를 포함한 모든 토큰 계정을 넘길 수 있습니다. 신뢰할 수 있는 발행자(예: 규제된 스테이블코인)의 정적 화이트리스트를 통해서만 허용됩니다.
* **MintCloseAuthority** — 민트가 폐쇄될 수 있고, 기존 풀은 사용할 수 없게 됩니다. 기본적으로 거부됩니다.
* **DefaultAccountState (Frozen)** — 풀 ATA는 `Frozen` 상태로 끝나고 계정별 해동이 필요합니다. Superstate 감지를 통해서만 허용되며, 발급자가 등록 시 기관 계정을 해동한다고 가정합니다.
* **Group/Member 포인터** — 적극적으로 해롭지는 않지만 검토되지 않았습니다. 표면을 좁게 유지하기 위해 기본적으로 거부됩니다.

## 전송 수수료 계정

`TransferFeeConfig`를 포함하는 민트의 경우, 모든 스왑, 예치 및 출금은 명목 양보다 적게 이동합니다. SDK는 계산의 두 반을 표시합니다:

```ts theme={null}
const { amountIn, amountOut, feeAmount, token2022FeeIn, token2022FeeOut } =
  await raydium.cpmm.computeSwapAmount({ ... });
```

올바른 UI는 다음을 표시합니다:

* `amountIn + token2022FeeIn`을 "보내시는 금액"으로
* `amountOut - token2022FeeOut`을 "받으시는 금액"으로
* `feeAmount`를 풀 수수료(LP + 프로토콜)로, Token-2022 전송 수수료와 별개

`amountIn → amountOut`만 표시하는 순진한 UI는 비용을 과소평가합니다.

### `maximumFee` 상한선

Token-2022 전송 수수료는 전송당 상한이 있습니다. 1% 민트이고 10,000 토큰 상한인 경우, 100,000,000 토큰 전송은 수수료로 10,000만 지불합니다. SDK의 `computeSwapAmount`는 상한을 적용합니다, 직접 프로그램 호출자는 이를 복제해야 합니다.

### 에포크 전환

민트 권한은 다음 에포크에서 활성화되는 수수료 변경을 예약할 수 있습니다. 전환 창 동안 두 가지 설정(`older`, `newer`)이 민트에 한번에 있고 `TransferChecked`는 현재 에포크로 선택합니다. CPMM `SwapV2`와 CLMM `SwapV2` 모두 `accounts`에 전체 민트 계정을 전달하므로, 프로그램은 추가 조회 없이 올바른 설정을 읽습니다.

Trade API 또는 SDK를 통해 한 에포크 이상 미리 견적하면, 실행된 수수료는 견적된 수수료와 다를 수 있습니다 — 이전 설정의 `maximum_fee_basis_points`로 제한됩니다.

## 이자 추적 및 ScaledUiAmount

풀은 원금을 보유합니다, "UI 양"은 원금에 시간 종속 또는 관리자 설정 스케일 요소를 곱한 값입니다. 스왑 수학은 원금에서 작동합니다:

```
principal_in = ui_amount_in / ui_multiplier(now)
```

SDK는 자동으로 변환합니다. 직접 RPC 읽기는 `pool.token0Vault.amount`을 원금으로 취급해야 합니다.

## "Token-2022 풀" 정의

**두 민트 중 하나**가 `programId == TokenzQdB...`를 가지면 풀은 Token-2022 풀입니다. API는 이를 표시합니다:

```
GET /pools/info/ids?ids=<POOL_ID>
```

```json theme={null}
{
  "data": [{
    "mintA": { "programId": "TokenzQdB...", "hasTransferFee": true, ... },
    "mintB": { "programId": "Tokenkeg...", ... }
  }]
}
```

`programId`를 사용하여 발송하고, `hasTransferFee`를 사용하여 UI 경고를 표시합니다.

## SDK 헬퍼

```ts theme={null}
import { Raydium, TOKEN_2022_PROGRAM_ID } from "@raydium-io/raydium-sdk-v2";
import { ExtensionType, getExtensionTypes, unpackMint } from "@solana/spl-token";

const raydium = await Raydium.load({ owner, connection });

const acct = await connection.getAccountInfo(mintPubkey);
if (!acct) throw new Error("mint not found");
const mint = unpackMint(mintPubkey, acct, acct.owner);

if (acct.owner.equals(TOKEN_2022_PROGRAM_ID)) {
  const extensions = getExtensionTypes(mint.tlvData);
  const accepted = new Set([
    ExtensionType.TransferFeeConfig,
    ExtensionType.MetadataPointer,
    ExtensionType.TokenMetadata,
    ExtensionType.InterestBearingConfig,
    ExtensionType.ScaledUiAmount,
  ]);
  const rejecting = extensions.filter(e => !accepted.has(e));
  if (rejecting.length) {
    console.warn("Pool creation will revert unless this mint is whitelisted:", rejecting);
  }
}
```

## 일반적인 통합 실수

* **프로그램 ID만 사전 검사.** 민트는 Token-2022일 수 있으면서 지원되지 않을 수 있습니다. 풀 생성을 허용하기 전에 확장 목록을 허용 목록(및 정적 화이트리스트)에 대해 확인합니다.
* **민트가 전혀 승인되지 않았을 때 SDK의 견적을 신뢰.** 견적 API는 거부하지 않습니다 — 풀 생성이 되돌립니다. UI에서 풀 생성을 표시하기 전에 오프체인에서 `is_supported_mint` 의미 논리를 확인합니다.
* **전송 수수료 헤어컷 없이 견적.** 양쪽에 1% 전송 수수료 민트와 0.25% CPMM 풀은 0.25%가 아니라 약 2.25%의 효과적 수수료를 가집니다. SDK 견적 또는 Trade API 견적을 사용합니다 — 수수료를 풀의 수수료 티어만으로 수동 계산하지 않습니다.
* **Token-2022 풀에서 레거시 `Swap` 명령어 호출.** `Swap`은 Token-2022보다 먼저 나왔습니다. 두 민트 중 하나가 Token-2022일 때마다 `SwapV2`를 사용합니다.
* **새로운 Token-2022 민트 자동 나열.** 지갑과 애그리게이터는 민트를 사용자에게 표시하기 전에 `TransferHook`과 `NonTransferable`을 확인해야 합니다, 둘 다 Raydium 적대적입니다.

## 향후 작업

이 매트릭스를 변경할 Solana 에코시스템 및 프로토콜 로드맵 항목:

* Solana 수준에서 허용 목록된 전송 훅 프로그램(에코시스템 관례 진화)
* 기밀 전송 호환 AMM(연구 단계)
* 더 광범위한 CPMM 민트별 레지스트리(CLMM과의 동등)
* CLMM의 `ScaledUiConfig` 디코딩이 Superstate 휴리스틱 없이 작동하도록 의존성 업그레이드

어느 것이든 착지하면 이 페이지가 업데이트될 것입니다.

## 포인터

* [`algorithms/token-2022-transfer-fees`](/ko/algorithms/token-2022-transfer-fees) — 스왑의 수수료 수학
* [`products/cpmm/instructions`](/ko/products/cpmm/instructions) — `SwapV2`, `Initialize`
* [`products/clmm/instructions`](/ko/products/clmm/instructions) — `SwapV2`, `CreatePool`, `CreateSupportMintAssociated`
* [`reference/error-codes`](/ko/reference/error-codes) — 프로그램당 `NotSupportMint` 숫자 코드

소스:

* `raydium-cp-swap/programs/cp-swap/src/utils/token.rs` — `MINT_WHITELIST`, `is_supported_mint`
* `raydium-clmm/programs/amm/src/util/token.rs` — `MINT_WHITELIST`, `superstate_allowlist`, `is_superstate_token`, `is_supported_mint`
* `raydium-clmm/programs/amm/src/instructions/admin/create_support_mint_associated.rs` — 민트별 레지스트리 명령어
* `raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs` — LaunchLab Token-2022 기본 민트 생성
