이 페이지는 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는 4개 거래 명령어 모두에 가격이 책정되며, 슬리피지 바운드는 볼트의 총 이동이 아닌 지불자의 순 금액에 대해 확인됩니다.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 쌍, 그리고 공유 관리자와 함께 자신의 전용 권한을 가집니다:
네 개의 키(CPMM 및 CLMM × 메인넷 및 데브넷)는 지원 민트 레지스트리 권한에 나열되어 있습니다.
두 프로그램에서 명령어는 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 업그레이드에서 삭제되었습니다.
이러한 민트 중 하나에 대해 이미 존재하는 풀은 계속 거래합니다. 민트 검사는 풀 생성 시에만 실행됩니다. 이제 이 중 하나에 대해 새로운 풀을 생성하려면 대신 레지스트리 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 포인터 — 적극적으로 해롭지는 않지만 검토되지 않았습니다. 표면을 좁게 유지하기 위해 기본적으로 허용되지 않습니다.
전송 수수료 회계
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 수수료가 아닙니다
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를 사용하여 디스패치하고, hasTransferFee를 사용하여 UI 경고를 표시하세요.
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 인용 민트 바인딩 (확장 검사 없음).

