Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
Raydium은 임의의 Token-2022 민트를 수락하지 않습니다. CPMM과 CLMM 모두 엄격한 허용 목록 모드를 실행합니다. 기본적으로 소수의 확장만 통과하고 나머지는 모두 풀 생성 시 거부됩니다. 소수의 신뢰할 수 있는 민트는 하드코딩된 주소로 허용되며, CLMM은 추가로 관리자 관리 민트별 레지스트리와 런타임 Superstate 토큰 감지를 지원합니다. 이 페이지는 무엇이 적용되고 어디에 적용되는지에 대한 단일 페이지 참고 자료이며, 프로그램 소스의 파일 및 줄 인용을 포함합니다.

프로그램 수준 지원

허용 목록 검사는 다음 위치에 있습니다: CPMM 또는 CLMM에는 스왑 시간 민트 검사가 없습니다 — 게이트는 풀 생성 시에만 작동합니다. 풀이 존재하면 스왑은 민트가 변경되지 않았다고 신뢰하며, 이는 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를 포함합니다.
  • OpenPosition V1은 볼트 민트를 검사하지 않으며 배포된 목록이 대상으로 하는 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에 바인딩하도록 선택하는 민트입니다.
이는 Token-2022 인용 민트를 바인딩하는 것을 높은 신뢰 작업으로 만들며, CPMM 및 CLMM 정적 화이트리스트와 동일한 이유입니다: TransferHook 인용 민트는 그것으로 인용된 모든 풀의 모든 구매, 판매 및 수수료 청구에서 후크를 실행하고, PermanentDelegate 인용 민트는 위임자가 해당 풀의 인용 볼트를 쓸어가도록 허용합니다. 둘 다 프로그램에 의해 차단되지 않습니다. LaunchLab이 인용 민트가 바인딩되면 올바르게 처리하는 것:
  • 인용 볼트, 두 수수료 볼트 및 공유 수수료 수신자의 토큰 계정은 인용 민트의 자체 프로그램에서 생성됩니다.
  • 인용 측의 TransferFeeConfig는 네 가지 거래 명령어 모두에 가격이 책정되며, 슬리피지 바운드는 볼트의 총 이동이 아닌 지불자의 순 금액에 대해 확인됩니다. products/launchlab/instructions 참조.
  • PoolState.token_program_flag는 두 민트의 프로그램을 기록합니다 — 기본 민트의 경우 bit0, 인용 민트의 경우 bit1. 비트별로 디코딩; 바이트는 부울이 아닙니다. products/launchlab/accounts 참조.
더 이상 사용되지 않는 Initialize 명령어는 여전히 레거시 전용 인용 프로그램을 사용하므로, Token-2022 인용 민트가 있는 구성은 InitializeV2InitializeWithToken2022를 통해서만 도달 가능합니다.

CPMM 및 CLMM 확장 허용 목록

정적 화이트리스트 단축(아래에서 다룸) 후, 프로그램은 민트의 확장을 반복하고 다음 5개 이외의 확장을 가진 경우 민트를 거부합니다: 이 목록에 없는 것 — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable 등 — 은 is_supported_mintfalse를 반환하고 풀 생성이 되돌려지게 합니다. 관련 줄(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 (데브넷).
효과: CLMM 팀은 프로그램 업그레이드 없이 특정 Token-2022 민트를 풀 생성에 옵트인할 수 있습니다. CPMM은 동등물이 없습니다 — 그 허용 목록은 엄격하게 소스 코딩됩니다.

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입니다.
이는 레지스트리가 아닌 휴리스틱입니다 — Superstate가 동일한 권한 형태로 발급하는 모든 향후 민트는 자동으로 허용됩니다.

우회가 면제하지 않는 것

우회는 확장 허용 목록을 건너뛰지만, 프로그램은 여전히 적용합니다:
  • 민트는 Token 또는 Token-2022로 소유됩니다. 사용자 정의 토큰 프로그램은 업스트림에서 거부됩니다.
  • 풀 볼트는 Token-2022 풀에 대한 올바른 ATA 확장으로 생성됩니다(ImmutableOwner 등).
  • 모든 전송은 transfer_checked를 통해 진행됩니다 — 수수료 베어링 민트는 올바른 금액을 볼트에 착지시킵니다.
화이트리스트되거나 PDA 등록된 민트가 나중에 TransferHook을 추가하면 스왑 시간 검사를 얻지 못합니다; 후크는 단순히 모든 전송에서 실행되고 스왑을 벽돌로 만들 수 있습니다. 따라서 화이트리스팅은 높은 신뢰 작업입니다.

”차단됨” 의미론

is_supported_mintfalse를 반환하면, 풀 생성은 ErrorCode::NotSupportMint(CPMM) / ErrorCode::NotSupportMint(CLMM)로 되돌려집니다. reference/error-codes에서 숫자 코드를 참조하세요. 기존 풀은 이 검사를 소급하여 실패할 수 없습니다 — 게이트는 생성 시에만 실행됩니다. 민트 확장은 Raydium이 거부하는 범주에 대해 불변입니다(전송 후크, 비전송 가능, 기밀 전송은 생성 후 추가될 수 없음), 따라서 정적 검사로 충분합니다.

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

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

전송 수수료 회계

TransferFeeConfig를 가진 민트의 경우, 모든 스왑, 예치 및 인출은 명목 금액보다 적게 이동합니다. SDK는 계산의 두 절반을 모두 표시합니다:
올바른 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 금액”은 원금에 시간 종속 또는 관리자 설정 스케일 팩터를 곱한 것입니다. 스왑 수학은 원금에서 작동합니다:
SDK는 자동으로 변환합니다. 직접 RPC 리더는 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 민트 자동 나열. 지갑 및 애그리게이터는 사용자에게 민트를 표시하기 전에 TransferHookNonTransferable을 확인해야 합니다; 둘 다 Raydium 적대적입니다.

향후 작업

이 매트릭스를 변경할 Solana 생태계 및 프로토콜 로드맵 항목:
  • Solana 수준에서 허용 목록 전송 후크 프로그램(진화하는 생태계 규칙).
  • 기밀 전송 호환 AMM(연구 단계).
  • 더 광범위한 CPMM 민트별 레지스트리(CLMM과의 패리티).
  • 의존성 업그레이드로 CLMM의 ScaledUiConfig 디코딩이 Superstate 휴리스틱 없이 작동.
이 페이지는 어느 것이든 출시될 때 업데이트됩니다.

포인터

소스:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rsMINT_WHITELIST, is_supported_mint.
  • raydium-clmm/programs/amm/src/util/token.rsMINT_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 인용 민트 바인딩(확장 검사 없음).