메인 콘텐츠로 건너뛰기

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

프로그램 수준의 지원

프로그램Token-2022 기본/인용 민트?모드
CPMM예 — 제한됨엄격한 확장 허용 목록 + 4개 민트 정적 화이트리스트
CLMM예 — 제한됨엄격한 확장 허용 목록 + 6개 민트 정적 화이트리스트 + 관리자 민트별 레지스트리 + Superstate 감지
AMM v4아니오프로그램은 Token-2022보다 먼저 개발됨, 두 민트 모두 classic SPL Token이어야 함
Stable AMM아니오AMM v4와 동일한 제약 조건
Farm v6예, 부분적보상 민트는 Token-2022 가능(CPMM/CLMM LP를 래핑할 때 동일한 허용 목록 적용), 사용자 스테이크 LP 민트는 래핑된 풀에서 상속
LaunchLab예, 프로그램 관리기본 민트는 Token-2022 가능하지만 전용 initialize_with_token_2022 명령어를 통해서만 가능하며, 프로그램 자체에서 MetadataPointer(항상)와 선택적 TransferFeeConfig(비율 ≤ 5%)로 민트 생성
Burn & Earn풀 프로그램 미러링CPMM / CLMM 게이팅 상속
허용 목록 검사는 다음에 위치합니다: CPMM이나 CLMM에는 스왑 시간 민트 검사가 없습니다 — 게이트는 풀 생성 시에만 발동합니다. 풀이 존재하면 스왑은 민트가 변경되지 않았다고 신뢰하는데, 이는 Token-2022 민트 상태의 불변 부분에 대해 정확합니다.

CPMM 및 CLMM 확장 허용 목록

정적 화이트리스트 단축(아래에서 다룸) 후, 프로그램은 민트의 확장을 반복하고 다음 다섯 가지 이외의 확장이 있으면 민트를 거부합니다:
확장허용되는 이유
TransferFeeConfig풀 수학은 인바운드 수수료를 빼고, Token-2022 프로그램이 아웃바운드 수수료를 처리합니다. algorithms/token-2022-transfer-fees 참조.
MetadataPointer장식용 — 온체인 메타데이터를 가리킵니다.
TokenMetadata장식용 — 인라인 메타데이터
InterestBearingConfig풀은 원금을 봅니다, UI 승수는 장식이며 기초 잔액은 유지됩니다.
ScaledUiAmount이자 추적과 동일한 모양 — 스케일 요소는 UI 표시에만 적용됩니다.
이 목록에 없는 것 — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable 등 — 은 is_supported_mintfalse를 반환하고 풀 생성을 되돌리게 합니다. 관련 줄(CPMM, CLMM에서 동일한 형태):
for e in extensions {
    if e != ExtensionType::TransferFeeConfig
        && e != ExtensionType::MetadataPointer
        && e != ExtensionType::TokenMetadata
        && e != ExtensionType::InterestBearingConfig
        && e != ExtensionType::ScaledUiAmount
    {
        return Ok(false);
    }
}
Ok(true)
cp-swap/src/utils/token.rs:190–200

우회 경로

허용 목록에 맞지 않는 Token-2022 민트도 세 가지 명시적 우회 중 하나를 통해 승인될 수 있습니다. 확장 반복이 실행되기 전에 순서대로 시도됩니다.

1. 정적 민트 화이트리스트

각 프로그램에 base58 문자열의 상수 MINT_WHITELIST 배열이 하드코딩되어 있습니다. 민트의 주소가 일치하면 함수는 즉시 true를 반환하고 확장 검사는 수행되지 않습니다.
프로그램화이트리스트된 민트
CPMMHVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM, Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g, FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4, 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
CLMM위의 4개 + DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg, AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9
이 주소들은 프로그램에 구워져 있으며, 목록 업데이트는 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 토큰을 감지합니다:
superstate_allowlist::ID == freeze_authority
    && *mint_account_info.owner == spl_token_2022::ID
    && default_account_state_freeze
    && maybe_permanent_delegate
raydium-clmm/programs/amm/src/util/token.rs:485 민트는 네 가지 모두 충족하면 이 분기를 통과합니다:
  • 소유하는 프로그램이 Token-2022 프로그램입니다.
  • 동결 권한이 superstate_allowlist::ID와 같습니다. 메인넷: 2Yq4T3mPNfjtEyTxSbRjRKqLf1pwbTasuCQrWe6QpM7x. 데브넷: 3TRuL3MFvzHaUfQAb6EsSAbQhWdhmYrKxEiViVkdQfXu.
  • DefaultAccountState 확장이 Frozen으로 설정되어 있습니다.
  • 영구 위임자도 superstate_allowlist::ID입니다.
이는 레지스트리가 아니라 휴리스틱입니다 — Superstate가 동일한 권한 형태로 발급하는 향후의 모든 민트는 자동으로 승인됩니다.

우회 경로가 포기하지 않는 것

우회 경로는 확장 허용 목록을 건너뛰지만, 프로그램은 여전히 다음을 적용합니다:
  • 민트는 Token 또는 Token-2022가 소유합니다. 사용자 정의 토큰 프로그램은 업스트림에서 거부됩니다.
  • 풀 볼트는 Token-2022 풀을 위한 올바른 ATA 확장(ImmutableOwner 등)으로 생성됩니다.
  • 모든 전송은 transfer_checked를 통합니다 — 수수료 부담 민트는 올바른 양을 볼트에 넣습니다.
나중에, 예를 들어 TransferHook를 추가하는 화이트리스트 또는 PDA 등록 민트는 스왑 시간 검사를 받지 않습니다. 훅은 모든 전송에서 실행되며 스왑을 중단시킬 수 있습니다. 따라서 화이트리스팅은 높은 신뢰 조치입니다.

”차단됨” 의미 논리

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는 계산의 두 반을 표시합니다:
const { amountIn, amountOut, feeAmount, token2022FeeIn, token2022FeeOut } =
  await raydium.cpmm.computeSwapAmount({ ... });
올바른 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 양”은 원금에 시간 종속 또는 관리자 설정 스케일 요소를 곱한 값입니다. 스왑 수학은 원금에서 작동합니다:
principal_in = ui_amount_in / ui_multiplier(now)
SDK는 자동으로 변환합니다. 직접 RPC 읽기는 pool.token0Vault.amount을 원금으로 취급해야 합니다.

”Token-2022 풀” 정의

두 민트 중 하나programId == TokenzQdB...를 가지면 풀은 Token-2022 풀입니다. API는 이를 표시합니다:
GET /pools/info/ids?ids=<POOL_ID>
{
  "data": [{
    "mintA": { "programId": "TokenzQdB...", "hasTransferFee": true, ... },
    "mintB": { "programId": "Tokenkeg...", ... }
  }]
}
programId를 사용하여 발송하고, hasTransferFee를 사용하여 UI 경고를 표시합니다.

SDK 헬퍼

import { Raydium, TOKEN_2022_PROGRAM_ID } from "@raydium-io/raydium-sdk-v2";
import { ExtensionType, getExtensionTypes, unpackMint } from "@solana/spl-token";

const raydium = await Raydium.load({ owner, connection });

const acct = await connection.getAccountInfo(mintPubkey);
if (!acct) throw new Error("mint not found");
const mint = unpackMint(mintPubkey, acct, acct.owner);

if (acct.owner.equals(TOKEN_2022_PROGRAM_ID)) {
  const extensions = getExtensionTypes(mint.tlvData);
  const accepted = new Set([
    ExtensionType.TransferFeeConfig,
    ExtensionType.MetadataPointer,
    ExtensionType.TokenMetadata,
    ExtensionType.InterestBearingConfig,
    ExtensionType.ScaledUiAmount,
  ]);
  const rejecting = extensions.filter(e => !accepted.has(e));
  if (rejecting.length) {
    console.warn("Pool creation will revert unless this mint is whitelisted:", rejecting);
  }
}

일반적인 통합 실수

  • 프로그램 ID만 사전 검사. 민트는 Token-2022일 수 있으면서 지원되지 않을 수 있습니다. 풀 생성을 허용하기 전에 확장 목록을 허용 목록(및 정적 화이트리스트)에 대해 확인합니다.
  • 민트가 전혀 승인되지 않았을 때 SDK의 견적을 신뢰. 견적 API는 거부하지 않습니다 — 풀 생성이 되돌립니다. UI에서 풀 생성을 표시하기 전에 오프체인에서 is_supported_mint 의미 논리를 확인합니다.
  • 전송 수수료 헤어컷 없이 견적. 양쪽에 1% 전송 수수료 민트와 0.25% CPMM 풀은 0.25%가 아니라 약 2.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 기본 민트 생성