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을 참조하세요.

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 기본 민트 생성.