이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
프로그램 수준 지원
허용 목록 검사는 다음 위치에 있습니다:
- CPMM:
raydium-cp-swap/programs/cp-swap/src/utils/token.rs:178의is_supported_mint,Initialize에서 호출됨. - CLMM:
raydium-clmm/programs/amm/src/util/token.rs:280의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가 하드코딩된 제한된 발급자 목록과 일치할 때만 동결합니다. 초기 목록에는 아래 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:190–200
우회 경로
허용 목록에 맞지 않는 Token-2022 민트는 여전히 3가지 명시적 우회 중 하나를 통해 허용될 수 있습니다. 확장 반복이 실행되기 전에 순서대로 시도됩니다.1. 정적 민트 화이트리스트
상수MINT_WHITELIST 배열의 base58 문자열이 각 프로그램에 하드코딩됩니다. 민트의 주소가 일치하면 함수는 즉시 true를 반환하고 확장 검사가 수행되지 않습니다.
이 주소들은 프로그램에 구워집니다; 목록을 업데이트하려면 3/4 업그레이드 멀티시그를 통한 프로그램 업그레이드가 필요합니다.
2. 민트별 레지스트리 — CLMM만
CLMM은 추가로 시드[b"support_mint", mint]에서 SupportMintAssociated PDA를 참조합니다. 해당 PDA가 민트에 대해 존재하면, 확장 세트에 관계없이 허용됩니다.
PDA는 CreateSupportMintAssociated(admin/create_support_mint_associated.rs)에 의해 생성됩니다. 명령어는 두 서명자로 제한됩니다:
crate::admin::ID— 표준 Raydium 관리자 권한.crate::create_support_mint_associated_owner::ID— 이 목적을 위한 전용 권한:RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY(메인넷),rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5(데브넷).
3. Superstate 감지 — CLMM만
CLMM은 Superstate의 토큰화된 자산을 위한 세 번째 경로를 가지고 있으며, 이는 CLMM 프로그램에 연결된spl-token-2022 버전이 언팩할 수 없는 ScaledUiConfig 확장을 사용합니다. 의존성을 업그레이드하는 대신, CLMM은 권한 형태로 Superstate 토큰을 감지합니다:
raydium-clmm/programs/amm/src/util/token.rs:485
민트는 4가지 모두 유지되면 이 분기를 통과합니다:
- 그 소유 프로그램은 Token-2022 프로그램입니다.
- 그 동결 권한은
superstate_allowlist::ID와 같습니다.reference/program-addresses에서 메인넷-베타 및 데브넷 값을 참조하세요. - 그
DefaultAccountState확장은Frozen으로 설정됩니다. - 그 영구 위임자도
superstate_allowlist::ID입니다.
우회가 면제하지 않는 것
우회는 확장 허용 목록을 건너뛰지만, 프로그램은 여전히 적용합니다:- 민트는
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상태로 착지하고 계정별로 해동이 필요합니다. Superstate 감지를 통해서만 허용되며, 이는 발급자가 등록 시 기관 계정을 해동한다고 가정합니다. - Group/Member 포인터 — 적극적으로 해롭지는 않지만 검토되지 않았습니다. 표면을 좁게 유지하기 위해 기본적으로 허용되지 않습니다.
전송 수수료 회계
TransferFeeConfig를 가진 민트의 경우, 모든 스왑, 예치 및 인출은 명목 금액보다 적게 이동합니다. SDK는 계산의 두 절반을 모두 표시합니다:
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 금액”은 원금에 시간 종속 또는 관리자 설정 스케일 팩터를 곱한 것입니다. 스왑 수학은 원금에서 작동합니다:pool.token0Vault.amount를 원금으로 취급해야 합니다.
”Token-2022 풀” 정의
풀은 어느 한 민트가programId == TokenzQdB...를 가지면 Token-2022 풀입니다. API는 이를 표시합니다:
programId를 사용하여 디스패치하고, hasTransferFee를 사용하여 UI 경고를 표시합니다.
SDK 헬퍼
일반적인 통합 실수
- 프로그램 ID만 사전 검사. 민트는 Token-2022 이고 지원되지 않을 수 있습니다. 풀 생성을 허용하기 전에 확장 목록을 허용 목록(및 정적 화이트리스트)에 대해 검토하세요.
- 민트가 전혀 수락되지 않을 때 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과의 패리티).
- 의존성 업그레이드로 CLMM의
ScaledUiConfig디코딩이 Superstate 휴리스틱 없이 작동.
포인터
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—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 기본 민트 생성.raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs— LaunchLab 인용 민트 바인딩(확장 검사 없음).

