이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
Raydium은 임의의 Token-2022 민트를 허용하지 않습니다. CPMM과 CLMM 모두 엄격한 허용 목록 모드를 실행합니다. 기본적으로 소수의 확장만 통과하고 나머지는 모두 풀 생성 시 거부됩니다. 각 프로그램은 하나의 메커니즘을 통해 개별 민트를 허용합니다. 즉, 관리자 관리 민트별 레지스트리 PDA입니다. 두 프로그램 모두 과거에 여러 지점에서 하드코딩된 우회 경로를 가지고 있었지만, 모두 삭제되었습니다. 이 페이지는 무엇이 적용되고 어디에 적용되는지에 대한 단일 페이지 참고 자료이며, 프로그램 소스에 대한 인용을 포함합니다.
프로그램 수준 지원
허용 목록 검사는 다음 위치에 있습니다:
- CPMM:
raydium-cp-swap/programs/cp-swap/src/utils/token.rs의is_supported_mint,Initialize및InitializeWithPermission에서 호출됩니다. - CLMM:
raydium-clmm/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(소스는 공개되지 않음).
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를 포함합니다.OpenPositionV1은 볼트 민트를 검사하지 않으며 배포된 목록이 대상으로 하는 Token-2022 제한 자산을 제공할 수 없습니다.- 기존 포지션은 변경되지 않습니다.
ClosePosition은 클라이언트가 풀을 첫 번째 남은 계정으로 전달할 때 원자적으로 해제하고 소각합니다. 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를 참조하세요. - 견적 민트 — LaunchLab이 생성하지 않으며 검사하지 않습니다.
CreateConfig는 민트 계정을 그대로 수락하므로, 견적 측에는is_supported_mint동등물이 없습니다. 유일한 게이트는 관리자가GlobalConfig에 바인딩하도록 선택하는 민트입니다.
TransferHook 견적 민트는 그것으로 인용된 모든 풀의 모든 구매, 판매 및 수수료 청구에서 후크를 실행하고, PermanentDelegate 견적 민트는 위임자가 해당 풀의 견적 볼트를 쓸어가도록 허용합니다. 둘 다 프로그램에 의해 차단되지 않습니다.
LaunchLab이 견적 민트가 바인딩되면 올바르게 처리하는 것:
- 견적 볼트, 두 수수료 볼트 및 공유 수수료 수신자의 토큰 계정은 견적 민트의 자체 프로그램에서 생성됩니다.
- 견적 측의
TransferFeeConfig는 네 가지 거래 명령어 모두에 가격이 책정되며, 슬리피지 바운드는 볼트의 총 이동이 아닌 지불자의 순 금액에 대해 검사됩니다.products/launchlab/instructions를 참조하세요. PoolState.token_program_flag는 두 민트의 프로그램을 기록합니다 — 기본 민트의 경우 bit0, 견적 민트의 경우 bit1. 비트별로 디코딩하세요. 바이트는 부울이 아닙니다.products/launchlab/accounts를 참조하세요.
Initialize 명령어는 여전히 레거시 전용 견적 프로그램을 사용하므로, Token-2022 견적 민트가 있는 구성은 InitializeV2 및 InitializeWithToken2022를 통해서만 도달할 수 있습니다.
CPMM 및 CLMM 확장 허용 목록
아래에서 다루는 두 가지 단락 이후, 프로그램은 민트의 확장을 반복하고 다음 5가지 이외의 모든 확장을 가진 민트를 거부합니다:
이 목록에 없는 것 —
TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable 등 — 은 is_supported_mint가 false를 반환하고 풀 생성이 되돌려지게 합니다.
관련 줄 (CPMM, CLMM에서 동일한 형태):
cp-swap/src/utils/token.rs
우회 경로
허용 목록에 맞지 않는 Token-2022 민트는 여전히 각 프로그램의 하나의 메커니즘을 통해 허용될 수 있습니다. 두 프로그램 모두 과거에 하드코딩된 우회 경로를 가지고 있었습니다. 그 중 어느 것도 남아 있지 않습니다.is_supported_mint는 이제 두 프로그램에서 바이트 단위로 동일한 함수입니다: 레거시 SPL Token 민트는 통과하고, 민트에 레지스트리 PDA가 있으면 통과하며, 다른 모든 것은 허용 목록 확장만 가져야 합니다.
유일한 우회 경로: 민트별 레지스트리
두 프로그램 모두 시드[b"support_mint", mint]에서 SupportMintAssociated PDA를 참조합니다. 해당 PDA가 민트에 대해 존재하면, 민트는 확장 세트에 관계없이 허용됩니다.
각 프로그램은 자신의 PDA 사본 (다른 프로그램 ID 아래에서 파생), 자신의 CreateSupportMintAssociated / CloseSupportMintAssociated 쌍, 그리고 공유 관리자와 함께 자신의 전용 권한을 가집니다:
4개 키 (CPMM 및 CLMM × 메인넷 및 데브넷)는 Support-mint registry authorities에 나열되어 있습니다.
두 프로그램 모두에서 명령어는 crate::admin::ID 또는 해당 프로그램의 전용 권한을 수락하고, 민트가 Token-2022로 소유되어야 합니다. 효과: 특정 Token-2022 민트는 프로그램 업그레이드 없이 풀 생성에 옵트인할 수 있습니다 — 이것이 하드코딩된 목록이 사라질 수 있는 이유입니다.
각 프로그램은 가지고 있는 모든 풀 생성 경로에서 레지스트리를 참조합니다: CPMM은 Initialize 및 InitializeWithPermission에서 (후자는 LaunchLab 졸업이 사용하는 것이므로, 등록된 민트는 생성과 마찬가지로 졸업합니다), CLMM은 CreatePool, CreateCustomizablePool 및 CreateCustomizablePoolV2에서.
제거된 우회 메커니즘
배포된 프로그램에서 두 하드코딩된 메커니즘이 모두 제거되었습니다. 이전 동작을 가정하는 통합이 여전히 존재할 수 있으므로 여기에 문서화합니다.정적 MINT_WHITELIST — 제거됨
확장 프로그램 반복 전에 is_supported_mint를 단락시키는 데 사용되던 base58 민트 주소의 상수 배열입니다. CLMM은 6개 주소를 보유했으며 2026-07-24에 삭제되었고, CPMM은 동일한 집합의 처음 4개를 보유했으며 2026-09-09 업그레이드에서 삭제되었습니다.
이 민트 중 하나에 대해 이미 존재하는 풀은 계속 거래됩니다 — 민트 확인은 풀 생성 시에만 실행됩니다. 이제 이 중 하나에 대해 새로운 풀을 생성하려면 대신 레지스트리 PDA가 필요합니다.
Superstate 권한 형태 감지 — 제거됨
CLMM은 주소가 아닌 권한 형태로 Superstate의 토큰화된 자산을 식별했습니다.freeze_authority 및 영구 위임자가 모두 superstate_allowlist::ID와 같고 DefaultAccountState가 Frozen으로 설정된 Token-2022 민트가 허용되었습니다. 이는 휴리스틱이었으므로 동일한 형태의 향후 민트는 자동으로 허용되었을 것입니다.
2026-07-31에 superstate_allowlist 모듈과 함께 삭제되었습니다. 이를 대체한 것은 더 좁은 범위이며 다른 목적을 제공합니다: frozen_position_nft_authorities::IDS는 아무것도 허용하지 않으며, 포지션 NFT가 동결되는지 여부를 결정하며 위에 설명되어 있습니다. 이전 휴리스틱이 일치한 발행자 권한 하나가 해당 목록의 유일한 항목입니다.
우회 메커니즘이 면제하지 않는 것
우회 메커니즘은 확장 프로그램 허용 목록을 건너뛰지만, 프로그램은 여전히 다음을 적용합니다:- 민트는
Token또는Token-2022중 하나로 소유됩니다. 사용자 정의 토큰 프로그램은 업스트림에서 거부됩니다. - 풀 금고는 Token-2022 풀에 대해 올바른 ATA 확장으로 생성됩니다 (
ImmutableOwner등). - 모든 전송은
transfer_checked를 통해 진행됩니다 — 수수료 부담 민트는 금고에 올바른 금액을 입금합니다.
TransferHook을 추가하는 경우, 스왑 시간 확인을 얻지 못합니다. 훅은 모든 전송에서 실행되며 스왑을 중단시킬 수 있습니다. 따라서 민트를 등록하는 것은 높은 신뢰 작업입니다.
”차단됨” 의미론
is_supported_mint가 false를 반환하면, 풀 생성은 ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM)로 되돌립니다. 숫자 코드는 reference/error-codes를 참조하세요.
기존 풀은 이 확인에 소급 적용되어 실패할 수 없습니다 — 게이트는 생성 시에만 실행됩니다. 민트 확장은 Raydium이 거부하는 범주에 대해 불변입니다 (전송 훅, 양도 불가능, 기밀 전송은 생성 후 추가될 수 없음), 따라서 정적 확인으로 충분합니다.
각 제외된 확장이 제외되는 이유
- TransferHook — 모든 전송에서 사용자 정의 프로그램을 호출하며, 임의의 CU 소비, 임의의 실패 조건, 호출 프로그램을 재진입할 수 있는 능력이 있습니다. 안전한 샌드박스가 없습니다. 일부 DEX는 훅 허용 목록을 유지합니다. Raydium은 그렇지 않습니다.
- NonTransferable —
Transfer는 항상 실패합니다. 풀은 보관권을 가질 수 없습니다. - ConfidentialTransfer — 전송 금액이 암호화되어 있으므로 곡선이 스왑 가격을 책정할 수 없습니다.
- PermanentDelegate — 위임자 보유자는 풀 금고를 포함한 모든 토큰 계정을 쓸어낼 수 있습니다. 민트를 등록하여만 허용되며, 이는 신뢰할 수 있는 발행자 (예: 규제 스테이블코인)가 경우별로 온보딩되는 방식입니다.
- MintCloseAuthority — 민트를 닫을 수 있으므로 기존 풀을 사용할 수 없게 됩니다. 기본적으로 허용되지 않습니다.
- DefaultAccountState (Frozen) — 풀 ATA는
Frozen상태로 도착하며 계정당 해동이 필요합니다. 민트를 등록하여만 허용되며, 이는 발행자가 등록 시 기관 계정을 해동한다고 가정합니다. - Group/Member pointers — 적극적으로 해롭지는 않지만 검토되지 않았습니다. 표면을 좁게 유지하기 위해 기본적으로 허용되지 않습니다.
전송 수수료 회계
TransferFeeConfig를 보유한 민트의 경우, 모든 스왑, 입금 및 출금은 명목 금액보다 적게 이동합니다. 두 개의 별도 숫자가 관련되며 SDK는 이들을 분리합니다:
- 풀 수수료 (LP + 프로토콜 + 펀드 + 크리에이터)는 곡선에서 나옵니다.
raydium.cpmm.computeSwapAmount({ ... })는 이를fee로 반환하며,amountIn,amountOut,minAmountOut,executionPrice,priceImpact및 원본swapResult와 함께 반환합니다. - Token-2022 전송 수수료는 풀이 아닌 민트에서 나옵니다.
@raydium-io/raydium-sdk-v2의getTransferAmountFee헬퍼로 계산되며,GetTransferAmountFee를 반환합니다:
computePairAmount는 inputAmountFee 및 anotherAmount를 GetTransferAmountFee 값으로 반환합니다.
올바른 UI는 다음을 표시합니다:
- 입력 금액 더하기 전송
fee를 “보내는 금액”으로 - 출력 금액 빼기 전송
fee를 “받는 금액”으로 - 풀
fee를 별도 줄로 — Token-2022 수수료가 아닙니다
amountIn → amountOut만 표시하는 순진한 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 금액”은 원금에 시간 종속적 또는 관리자 설정 스케일 팩터를 곱한 것입니다. 스왑 수학은 원금에서 작동합니다:pool.token0Vault.amount를 원금으로 취급해야 합니다.
”Token-2022 풀” 정의
풀은 어느 한 민트가programId == TokenzQdB...를 가지면 Token-2022 풀입니다. API는 이를 표시합니다:
programId를 사용하고, UI 경고를 표시하려면 hasTransferFee를 사용하세요.
SDK 헬퍼
일반적인 통합 실수
- 프로그램 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— 스왑의 수수료 수학.products/cpmm/instructions—SwapV2,Initialize.products/clmm/instructions—SwapV2,CreatePool,CreateSupportMintAssociated.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 견적 민트 바인딩 (확장 확인 없음).

