> ## 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를 지원하는 범위, 풀 생성 시 각 프로그램이 적용하는 명시적 확장 허용 목록, 그리고 거부된 민트를 허용하는 유일한 우회 메커니즘인 관리자 관리 민트별 레지스트리 PDA에 대한 정보입니다.

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

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

<Info>
  Raydium은 임의의 Token-2022 민트를 수락하지 않습니다. CPMM과 CLMM 모두 엄격한 **허용 목록 모드**를 실행합니다. 기본적으로 작은 확장 집합만 통과하고 나머지는 모두 풀 생성 시 거부됩니다. 각 프로그램은 하나의 메커니즘을 통해 개별 민트를 허용합니다. 즉, 관리자 관리 민트별 레지스트리 PDA입니다. 두 프로그램 모두 여러 지점에서 하드코딩된 우회 메커니즘을 가지고 있었지만, 모두 삭제되었습니다. 이 페이지는 무엇이 적용되고 어디에 적용되는지에 대한 단일 페이지 참고 자료이며, 프로그램 소스에 대한 인용을 포함합니다.
</Info>

## 프로그램 수준 지원

| 프로그램 | Token-2022 기본/인용 민트? | 모드 |
| - | - | - |
| **CPMM** | 예 — 제한됨 | 엄격한 확장 허용 목록 + 관리자 민트별 레지스트리. 4개 민트 정적 화이트리스트는 2026-09 업그레이드에서 제거되었습니다. |
| **CLMM** | 예 — 제한됨 | 엄격한 확장 허용 목록 + 관리자 민트별 레지스트리. 6개 민트 정적 화이트리스트와 Superstate 감지는 모두 2026년 7월에 제거되었습니다. |
| **AMM v4** | 아니오 | 프로그램은 Token-2022 이전에 출시되었으며, 두 민트 모두 클래식 SPL Token이어야 합니다. |
| **Stable AMM** | 아니오 | AMM v4와 동일한 제약 조건입니다. |
| **Farm v6** | 예, 부분적 | 보상 민트는 Token-2022일 수 있습니다(팜이 CPMM/CLMM LP를 래핑할 때 동일한 허용 목록 적용). 사용자 스테이크 LP 민트는 래핑된 풀에서 상속됩니다. |
| **LaunchLab** | 예 — 기본 프로그램 관리, 인용 제한 없음 | 기본 민트는 Token-2022일 수 있지만 전용 `initialize_with_token_2022` 명령어를 통해서만 가능합니다. 프로그램은 `MetadataPointer`(항상)와 선택적으로 `TransferFeeConfig`(비율 ≤ 5%)를 사용하여 민트를 생성합니다. 임의의 확장을 가진 기존 Token-2022 민트는 기본으로 사용할 수 없습니다. **인용** 민트는 관리자가 `GlobalConfig`에 바인딩하는 모든 Token-2022 민트일 수 있으며, 확장 검사가 없습니다. [아래](#launchlab-인용-민트) 참조. |
| **Burn & Earn** | 풀 프로그램 미러 | CPMM / CLMM 제한을 상속합니다. |

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

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

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

## CLMM 포지션 NFT 제한된 발급자에 대한 동결

포지션 NFT 계정은 기본적으로 동결되지 않은 상태로 유지됩니다. CLMM은 포지션이 V2 오픈 경로를 사용하고 **그리고** 적어도 하나의 볼트 민트의 현재 `freeze_authority`가 하드코딩된 `frozen_position_nft_authorities::IDS` 목록에 나타날 때만 동결합니다. 이 목록은 CLMM의 이전 Superstate 토큰 감지를 대체한 것이며, 이전 휴리스틱이 일치한 발급자 권한과 동일한 권한을 가집니다. 풀 PDA를 포지션 NFT 민트의 동결 권한으로 설정하는 것 자체는 동결이 아닙니다. 이는 풀 생성 허용 목록이 아닌 포지션 보관 규칙입니다:

* 풀은 이미 존재할 수 있으며 스왑 가능한 상태로 유지됩니다.
* 포지션 NFT 민트는 CLMM 풀 PDA를 자신의 동결 권한으로 사용합니다. 기본 발급자는 포지션 NFT를 제어하지 않습니다.
* `OpenPositionV2`는 Token-2022 풀 자산에 대한 클래식 SPL 포지션 NFT를 다룹니다. `OpenPositionWithToken22Nft`는 Token-2022 포지션 NFT를 다룹니다.
* `OpenPosition` V1은 볼트 민트를 검사하지 않으며 배포된 목록이 대상으로 하는 Token-2022 제한 자산을 제공할 수 없습니다.
* 기존 포지션은 변경되지 않습니다.

동결된 포지션은 소유자가 관리할 수 있지만 전송할 수 없습니다. `ClosePosition`은 클라이언트가 풀을 첫 번째 남은 계정으로 전달할 때 원자적으로 해제하고 소각합니다. [`products/clmm/ticks-and-positions`](/ko/products/clmm/ticks-and-positions#제한된-발급자-포지션) 참조.

## LaunchLab 인용 민트

LaunchLab의 두 민트는 매우 다르게 제한되며, 비대칭성을 놓치기 쉽습니다.

* **기본 민트** — LaunchLab이 생성합니다. Token-2022 기본 민트는 `initialize_with_token_2022`를 통해서만 도달할 수 있으며, 프로그램은 `MetadataPointer`와 (선택적으로) `TransferFeeConfig`만 첨부합니다. 다른 것은 `NoSupportExtension`을 반환합니다. 기존 Token-2022 민트는 기본으로 공급될 수 없습니다. `TransferFeeConfig`가 첨부되면, 민트의 `transfer_fee_config_authority`는 졸업까지 시작 권한 PDA이고, `withdraw_withheld_authority`는 민트 생성부터 플랫폼의 구성된 `transfer_fee_extension_auth`입니다. 런치패드 프로그램 자체는 보류 철회 명령어가 없습니다. [`products/launchlab/platform-config`](/ko/products/launchlab/platform-config#token-2022-전송-수수료-권한) 참조.
* **인용 민트** — LaunchLab이 생성하지 않으며 검사하지 않습니다. `CreateConfig`는 민트 계정을 그대로 수락하므로 **인용 측에는 `is_supported_mint` 동등물이 없습니다**. 유일한 게이트는 관리자가 `GlobalConfig`에 바인딩하도록 선택하는 민트입니다.

이는 Token-2022 인용 민트를 바인딩하는 것을 높은 신뢰 작업으로 만듭니다. 아래 민트를 등록하는 것과 같은 이유입니다: `TransferHook` 인용 민트는 인용된 모든 풀의 모든 구매, 판매 및 수수료 청구에서 훅을 실행하고, `PermanentDelegate` 인용 민트는 위임자가 해당 풀의 인용 볼트를 쓸어갈 수 있게 합니다. 둘 다 프로그램에 의해 차단되지 않습니다.

LaunchLab이 인용 민트가 바인딩되면 올바르게 처리하는 것:

* 인용 볼트, 두 수수료 볼트 및 공유 수수료 수신자의 토큰 계정은 인용 민트의 자체 프로그램에서 생성됩니다.
* 인용 측의 `TransferFeeConfig`는 4개 거래 명령어 모두에 가격이 책정되며, 슬리피지 바운드는 볼트의 총 이동이 아닌 지불자의 순 금액에 대해 확인됩니다. [`products/launchlab/instructions`](/ko/products/launchlab/instructions#인용-측-전송-수수료) 참조.
* `PoolState.token_program_flag`는 두 민트의 프로그램을 기록합니다. 기본 민트의 경우 bit0, 인용 민트의 경우 bit1입니다. 비트별로 디코딩하세요. 바이트는 부울이 아닙니다. [`products/launchlab/accounts`](/ko/products/launchlab/accounts#poolstate) 참조.

더 이상 사용되지 않는 `Initialize` 명령어는 여전히 레거시 전용 인용 프로그램을 사용하므로, Token-2022 인용 민트가 있는 구성은 `InitializeV2` 및 `InitializeWithToken2022`를 통해서만 도달할 수 있습니다.

## CPMM 및 CLMM 확장 허용 목록

[아래](#유일한-우회-민트별-레지스트리)에서 다루는 두 단락 이후, 프로그램은 민트의 확장을 반복하고 다음 5개 이외의 **모든** 확장을 가진 민트를 거부합니다:

| 확장 | 허용되는 이유 |
| - | - |
| `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`](https://github.com/raydium-io/raydium-cp-swap/blob/master/programs/cp-swap/src/utils/token.rs)

## 우회 경로

허용 목록에 맞지 않는 Token-2022 민트는 여전히 각 프로그램의 하나의 메커니즘을 통해 허용될 수 있습니다. 두 프로그램 모두 과거에 하드코딩된 우회 메커니즘을 가지고 있었습니다. 그 중 어느 것도 남아 있지 않습니다.

| 우회 | CPMM | CLMM |
| - | - | - |
| 민트별 레지스트리 PDA | 예 — 유일한 우회 | 예 — 유일한 우회 |
| 정적 `MINT_WHITELIST` | 2026-09에 제거됨 (4개 주소) | 2026-07에 제거됨 (6개 주소) |
| Superstate 권한 형태 감지 | 없음 | 2026-07에 제거됨 |

`is_supported_mint`는 이제 두 프로그램에서 바이트 단위로 동일한 함수입니다: 레거시 SPL Token 민트는 통과하고, 민트에 레지스트리 PDA가 있으면 통과하며, 다른 모든 것은 허용 목록 확장만 가져야 합니다.

## 유일한 우회: 민트별 레지스트리

두 프로그램 모두 시드 `[b"support_mint", mint]`에서 `SupportMintAssociated` PDA를 참조합니다. 해당 PDA가 민트에 대해 존재하면, 민트는 확장 집합에 관계없이 허용됩니다.

각 프로그램은 자신의 PDA 사본(다른 프로그램 ID 아래에서 파생), 자신의 `CreateSupportMintAssociated` / `CloseSupportMintAssociated` 쌍, 그리고 공유 관리자와 함께 자신의 전용 권한을 가집니다:

네 개의 키(CPMM 및 CLMM × 메인넷 및 데브넷)는 [지원 민트 레지스트리 권한](/ko/reference/program-addresses#support-mint-registry-authorities)에 나열되어 있습니다.

두 프로그램에서 명령어는 `crate::admin::ID` 또는 해당 프로그램의 전용 권한을 수락하고, 민트가 Token-2022로 소유되어야 합니다. 효과: 특정 Token-2022 민트는 프로그램 업그레이드 없이 풀 생성에 옵트인할 수 있습니다. 이것이 하드코딩된 목록이 사라질 수 있는 이유입니다.

각 프로그램은 **모든** 풀 생성 경로에서 레지스트리를 참조합니다: CPMM은 `Initialize` 및 `InitializeWithPermission`에서 (후자는 LaunchLab 졸업이 사용하는 것이므로 등록된 민트도 졸업하고 생성함), CLMM은 `CreatePool`, `CreateCustomizablePool` 및 `CreatePermissionedPool`에서.

## 제거된 우회

두 하드코딩된 메커니즘 모두 배포된 프로그램에서 제거되었습니다. 이전 동작에 대해 작성된 통합이 여전히 이를 가정할 수 있기 때문에 여기에만 문서화됩니다.

### 정적 `MINT_WHITELIST` — 제거됨

base58 민트 주소의 상수 배열은 확장 반복 전에 `is_supported_mint`를 단락시키는 데 사용되었습니다. CLMM의 6개 주소를 보유했고 2026-07-24에 삭제되었습니다. CPMM의 동일한 집합의 처음 4개를 보유했고 [2026-09-09 업그레이드](/ko/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports)에서 삭제되었습니다.

| 이전에 화이트리스트된 위치 | 민트 |
| - | - |
| CPMM 및 CLMM | `HVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM`, `Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g`, `FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4`, `2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo` |
| CLMM만 | `DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg`, `AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9` |

**이러한 민트 중 하나에 대해 이미 존재하는 풀은 계속 거래합니다**. 민트 검사는 풀 생성 시에만 실행됩니다. 이제 이 중 하나에 대해 **새로운** 풀을 생성하려면 대신 레지스트리 PDA가 필요합니다.

### Superstate 권한 형태 감지 — 제거됨

CLMM은 주소가 아닌 권한 형태로 Superstate의 토큰화된 자산을 식별했습니다: `freeze_authority` **그리고** 영구 위임자가 모두 `superstate_allowlist::ID`와 같고, `DefaultAccountState`가 `Frozen`으로 설정된 Token-2022 민트는 허용되었습니다. 휴리스틱이었으므로 동일한 형태의 모든 향후 민트가 자동으로 허용되었을 것입니다.

2026-07-31에 `superstate_allowlist` 모듈과 함께 삭제되었습니다. 이를 대체한 것은 더 좁으며 다른 목적을 제공합니다: `frozen_position_nft_authorities::IDS`는 아무것도 허용하지 않습니다. **포지션 NFT**가 동결되는지 여부를 결정하며, [위](#clmm-포지션-nft-제한된-발급자에-대한-동결)에서 설명합니다. 이전 휴리스틱이 일치한 발급자 권한은 해당 목록의 유일한 항목입니다.

## 우회가 면제하지 않는 것

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

* 민트는 `Token` 또는 `Token-2022`로 소유됩니다. 사용자 정의 토큰 프로그램은 업스트림에서 거부됩니다.
* 풀 볼트는 Token-2022 풀에 대한 올바른 ATA 확장으로 생성됩니다 (`ImmutableOwner` 등).
* 모든 전송은 `transfer_checked`를 통해 진행됩니다. 수수료 베어링 민트는 올바른 금액을 볼트에 착지시킵니다.

화이트리스트되거나 PDA 등록된 민트가 나중에 `TransferHook`을 추가하면 스왑 시간 검사를 얻지 못합니다. 훅은 단순히 모든 전송에서 실행되고 스왑을 중단시킬 수 있습니다. 민트를 등록하는 것은 따라서 높은 신뢰 작업입니다.

## "차단됨" 의미론

`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` 상태로 착지하고 계정별로 해제가 필요합니다. 민트를 등록하여만 허용되며, 이는 발급자가 등록 시 기관 계정을 해제한다고 가정합니다.
* **Group/Member 포인터** — 적극적으로 해롭지는 않지만 검토되지 않았습니다. 표면을 좁게 유지하기 위해 기본적으로 허용되지 않습니다.

## 전송 수수료 회계

`TransferFeeConfig`를 가진 민트의 경우, 모든 스왑, 예치 및 인출은 명목 금액보다 적게 이동합니다. 두 개의 별도 숫자가 관련되며, SDK는 이들을 분리합니다:

* **풀 수수료** (LP + 프로토콜 + 펀드 + 크리에이터)는 곡선에서 나옵니다. `raydium.cpmm.computeSwapAmount({ ... })`는 `fee`로 반환하며, `amountIn`, `amountOut`, `minAmountOut`, `executionPrice`, `priceImpact` 및 원본 `swapResult`와 함께 반환합니다.
* **Token-2022 전송 수수료**는 풀이 아닌 민트에서 나옵니다. `@raydium-io/raydium-sdk-v2`의 `getTransferAmountFee` 헬퍼로 계산되며, `GetTransferAmountFee`를 반환합니다:

```ts theme={null}
export interface GetTransferAmountFee {
  amount: BN;                  // 실제로 이동하는 금액
  fee: BN | undefined;         // 민트에 의해 보류됨. 민트에 TransferFeeConfig가 없을 때 undefined
  expirationTime: number | undefined;  // 예정된 수수료 변경이 보류 중일 때 설정됨
}
```

예치 및 인출은 직접 표시합니다: `computePairAmount`는 `inputAmountFee` 및 `anotherAmount`를 `GetTransferAmountFee` 값으로 반환합니다.

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

* 입력 금액 **더하기** 전송 `fee`를 "보내는 금액"으로
* 출력 금액 **빼기** 전송 `fee`를 "받는 금액"으로
* 풀 `fee`를 별도 줄로 — Token-2022 수수료가 아닙니다

입력 금액만 표시하는 순진한 UI → 출력 금액은 비용을 과소 평가합니다. 이 헬퍼에 클러스터의 `epochInfo`를 전달하세요. 캐시하지 마세요. 에포크는 민트의 `older` 및 `newer` 수수료 구성 중 어느 것을 선택하는지 결정합니다.

### `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 } from "@raydium-io/raydium-sdk-v2";
// TOKEN_2022_PROGRAM_ID is not re-exported by the Raydium SDK — import it from
// @solana/spl-token, as the SDK itself does.
import {
  TOKEN_2022_PROGRAM_ID,
  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 **그리고** 지원되지 않을 수 있습니다. 풀 생성을 허용하기 전에 확장 목록을 허용 목록에 대해 확인하고, 민트의 레지스트리 PDA를 확인하세요.
* **민트가 전혀 수락되지 않을 때 SDK의 인용을 신뢰합니다.** 인용 API는 거부하지 않습니다. 풀 생성이 되돌아갑니다. UI에서 풀 생성을 노출하기 전에 오프체인에서 `is_supported_mint` 의미론을 확인하세요.
* **전송 수수료 헤어컷 없이 인용합니다.** 양쪽에 1% 전송 수수료 민트가 있는 0.25% CPMM 풀의 유효 수수료는 약 2.25%이지, 0.25%가 아닙니다. SDK 인용 또는 Trade API 인용을 사용하세요. 풀의 수수료 계층만으로 수수료를 수동으로 계산하지 마세요.
* **Token-2022 풀에서 레거시 `Swap` 명령어를 호출합니다.** `Swap`은 Token-2022 이전입니다. 어느 민트든 Token-2022일 때마다 `SwapV2`를 사용하세요.
* **새로운 Token-2022 민트를 자동 나열합니다.** 지갑 및 애그리게이터는 민트를 사용자에게 표시하기 전에 `TransferHook` 및 `NonTransferable`을 확인해야 합니다. 둘 다 Raydium 적대적입니다.

## 향후 작업

이 매트릭스를 변경할 Solana 생태계 및 프로토콜 로드맵 항목:

* Solana 수준에서 허용 목록 전송 훅 프로그램 (생태계 규칙 진화).
* 기밀 전송 호환 AMM (연구 단계).
* 더 광범위한 CPMM 민트별 레지스트리 (CLMM과 패리티).
* 레지스트리에 대한 공개 읽기 경로, UI가 PDA 자체를 파생시키지 않고 "지원되지 않음"과 "지원되지 않지만 등록됨"을 구분할 수 있도록.

이 페이지는 어느 것이든 도착할 때 업데이트됩니다.

## 포인터

* [`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` — `is_supported_mint`, `support_mint_associated_is_initialized`.
* `raydium-clmm/programs/amm/src/util/token.rs` — `is_supported_mint`, `support_mint_associated_is_initialized`, `frozen_position_nft_authorities`, `position_nft_must_freeze`.
* `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 기본 민트 생성.
* `raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs` — LaunchLab 인용 민트 바인딩 (확장 검사 없음).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.