Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
Raydium의 상품 프로그램들은 독립적인 코드베이스이지만, 공유된 규칙 집합을 기반으로 설계되었습니다. 이 페이지는 이러한 규칙들의 정규 참조입니다. 상품별 장에서는 규칙이 계정에서 어떻게 구현되는지 설명하고, 이 페이지는 규칙 자체를 설명합니다.

여기서 “공유”의 의미

코드베이스를 관통하는 세 가지 공유 방식이 있습니다:
  • 규칙 공유. 모든 프로그램은 동일한 PDA 파생 패턴, 동일한 수수료 분할 형태, 동일한 관찰 계정 개념을 사용합니다 — 하지만 각각 자신의 프로그램에서 자신의 시드로 구현합니다.
  • 계정 공유. 소수의 계정은 많은 풀에서 정확히 동일한 레코드입니다 (CPMM의 전역 권한 PDA, AmmConfig 계정).
  • 오프체인 공유. 하나의 REST API와 하나의 TypeScript SDK가 네 개의 프로그램 모두를 지원합니다. 통합자는 어느 프로그램을 호출하든 하나의 HTTP 호스트와 하나의 NPM 패키지와 상호작용합니다.
아래의 다섯 가지 기본 요소는 프로그램 경계를 넘는 모든 것을 다룹니다.

1. 권한 PDA

모든 Raydium 프로그램은 토큰 볼트를 소유하는 정확히 하나의 PDA를 가집니다. 사용자는 절대 볼트 권한을 직접 보유하지 않습니다 — 권한 PDA가 자금을 이동할 수 있는 유일한 서명자이며, 유효한 프로그램 명령이 이를 지시할 때만 서명합니다. 패턴은 상품 전체에서 동일하며, 시드는 다릅니다: 이로부터 몇 가지가 따릅니다:
  • CPMM과 CLMM의 경우, 권한 PDA는 전역 계정입니다 — 해당 유형의 모든 풀이 이를 사용합니다. CPMM으로 CPI하는 경우 풀별이 아닌 한 번만 필요합니다.
  • 풀별/팜별 권한의 경우, 풀/팜 ID에서 PDA를 파생합니다. SDK는 getPoolKeys / getFarmKeys에서 이를 수행합니다. 직접 통합하는 경우 findProgramAddressSync로 파생합니다.
  • 볼트 소유권은 변경할 수 없습니다. 권한 PDA를 소유자로 하여 토큰 계정이 생성되면, 오직 그 PDA만 — 프로그램에 의해 호출될 때 — 이동할 수 있습니다. 관리자 오버라이드는 없습니다.
프로그램별 정확한 시드와 ATA 레이아웃은 products/cpmm/accounts, products/clmm/accounts, products/amm-v4/accounts, products/farm-staking/accounts, products/launchlab/accounts를 참조하세요.

2. 관리자 및 설정 계정

CPMM과 CLMM은 **AmmConfig**라는 설정 계정 패턴을 공유합니다: 전체 수수료 계층에 적용되는 수수료율과 관리자 목적지를 보유하는 작은 전역 계정으로, u16으로 인덱싱됩니다. 풀은 생성 시 설정에 바인딩되며 다시 바인딩되지 않습니다.
규칙:
  • 수수료 계층은 전역입니다. 풀이 “이것은 0.25% 풀입니다”라고 말할 때, 생성 시점에 trade_fee_rate가 0.25%였던 AmmConfig에 바인딩된다는 의미입니다. 풀별 요금 오버라이드는 없습니다.
  • 설정은 변경될 수 있지만 풀은 따르지 않습니다. 설정 권한이 AmmConfig를 편집하면, 해당 설정에 바인딩된 모든 기존 풀이 즉시 새 요금을 적용합니다. 이는 버그가 아니라 기능입니다. 이것이 풀별 마이그레이션 없이 프로토콜 수준의 경제 변화가 전파되는 방식입니다.
  • disable_create_pool은 폐기 레버입니다. 수수료 계층이 중단될 때, 프로토콜 멀티시그가 이 플래그를 설정합니다 — 기존 풀은 계속 작동하지만 새 풀은 계층을 선택할 수 없습니다.
  • **protocol_owner / fund_owner**는 수수료 수집 호출의 서명자입니다. 이들을 멀티시그로 설정하는 것이 수수료 인출을 제한하는 방법입니다. 이들은 수수료 자체의 목적지 주소가 아닙니다. 그것은 동일한 계정의 protocol_fee_destination / fund_fee_destination입니다.
AMM v4는 AmmConfig가 없습니다 — 수수료 매개변수는 풀별이며 생성 시 하드코딩됩니다. Farm과 LaunchLab은 각각의 장에서 다루는 자신의 동등물 (FarmConfig, LaunchConfig)을 가집니다. 누가 무엇을 변경할 수 있는지에 대한 완전한 표는 security/admin-and-multisig에 있습니다. 현재 사용자 대면 수수료 분할은 ray/protocol-fees에 있습니다.

3. 프로토콜 / 펀드 / 크리에이터 수수료 분할

모든 CPMM 및 CLMM 스왑 수수료는 나가는 길에 최대 4개의 목적지로 분할됩니다:
기계적으로:
  1. 거래 수수료는 풀에 누적됩니다. 수수료는 스왑의 입력 측에서 제거되고 수수료 후 금액이 상수곱 수학이 보는 것입니다. 이것이 “LP가 수수료를 얻는다”는 의미입니다 — k가 상승하고 암시적 LP 토큰 가치도 상승합니다.
  2. 프로토콜/펀드/크리에이터 부분은 LP 측 누적에서 풀별 카운터 계정으로 공제됩니다. 이들은 풀 상태 (protocol_fees_token{0,1}, fund_fees_token{0,1} 등)에 있다가 누군가 해당 수집 명령을 호출할 때까지 머물러 있습니다. 그때까지 풀의 볼트를 떠나지 않습니다. 스왑의 관점에서 여전히 “풀에 있습니다”.
  3. 수집이 이들을 이동시킵니다. 프로토콜 및 펀드 경로는 AmmConfig의 각각의 protocol_owner / fund_owner 서명자가 필요합니다. CPMM 크리에이터 수수료는 크리에이터 서명 CollectCreatorFee 경로 또는 CollectCreatorFeePermissionless를 사용합니다. 후자는 모든 지불자가 트리거할 수 있지만 목적지를 크리에이터의 정규 ATA로 고정합니다.
몇 가지 중요한 관찰:
  • 분할 백분율은 거래 수수료에서이지, 거래에서가 아닙니다. 0.25% 거래 수수료에 12% 프로토콜 공유는 프로토콜이 거래의 0.25% × 12% = 0.03%를 얻는다는 의미입니다 — 거래의 12%가 아닙니다.
  • 크리에이터 수수료는 LaunchLab 졸업 풀에만 존재합니다. 표준 CPMM/CLMM 풀은 3방향 분할 (LP / 프로토콜 / 펀드)을 가집니다. LaunchLab은 토큰을 런칭한 사람에게 라우팅되는 네 번째 슬롯을 추가하며, Initialize에서 구성되고 불변입니다.
  • AMM v4는 2방향으로만 분할합니다, 풀별 하드코딩: LP 및 프로토콜. 펀드 슬롯 없음, 크리에이터 슬롯 없음.
  • 펀드 대 프로토콜 — 둘 다 프로토콜 재무부 목적지이지만, 다른 서명자와 다른 의도된 용도를 가집니다. protocol은 역사적으로 운영 자금을 조달합니다. fund는 장기 재무부입니다. 둘 사이의 분할 자체는 조정 가능합니다.
구체적인 요금은 reference/fee-comparisonray/protocol-fees에 있습니다.

4. 관찰 계정 (TWAP 링 버퍼)

CPMM과 CLMM 모두 풀별 관찰 계정을 유지합니다 — 다른 계약이 조작 저항 TWAP을 파생하는 데 사용할 수 있는 (timestamp, cumulative_price) 샘플의 고정 크기 링 버퍼입니다.
작동 방식:
  • 모든 스왑은 update_observation을 호출합니다. 프로그램은 현재 가격을 읽고, 이전 관찰 이후 경과한 초 수를 곱하고, 누적 카운터에 추가합니다. 새 항목은 가장 오래된 슬롯을 덮어씁니다 (링 버퍼 스타일).
  • 윈도우 위의 TWAP = (cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start]). 소비자는 원하는 윈도우를 괄호로 묶는 두 개의 관찰을 선택하고 나눕니다.
  • Raydium 자체는 가격 책정을 위해 TWAP을 사용하지 않습니다. AMM 수학은 현물 준비금을 직접 읽습니다. 관찰은 외부성입니다 — Raydium은 다른 계약이 읽을 수 있도록 이들을 작성하는 비용을 지불합니다.
  • AMM v4는 관찰 계정이 없습니다. ObservationState 설계보다 오래되었습니다. v4 TWAP을 원하는 통합자는 로그 기록에서 오프체인으로 계산해야 합니다.
레이아웃 세부 사항 및 인덱싱 수학은 products/cpmm/accountsproducts/clmm/accounts에 있습니다.

5. REST API + SDK + IDL

오프체인 표면은 모든 상품에서 사용되는 단일 트리오입니다:
  • REST APIhttps://api-v3.raydium.io. 모든 온체인 상태의 읽기 중심 인덱싱 뷰 및 견적 엔진. 하나의 호스트, 하나의 스키마.
  • TypeScript SDK — NPM의 @raydium-io/raydium-sdk-v2. 모든 프로그램에 대한 거래를 구축하고 서명합니다. 견적/메타데이터를 위해 API와 통신하고, 사전 서명 상태 새로고침을 위해 Solana RPC와 통신합니다.
  • IDL 레지스트리 — 모든 게시된 프로그램의 Anchor IDL은 raydium-idl 저장소에 있습니다 (프로그램당 하나의 JSON: CPMM, CLMM, LaunchLab). TypeScript SDK는 이러한 IDL을 내부적으로 사용합니다. 다운스트림 Rust / Python 클라이언트는 동일한 파일에서 재생성합니다.
그들 사이의 경계는 명확합니다: 일반적인 실수는 REST API 출력을 거래에 직접 공급하는 것입니다. 하지 마세요 — 서명하는 슬롯에서 Solana RPC에서 관련 풀/포지션 상태를 다시 가져오세요. SDK는 1차 흐름에 대해 자동으로 이를 수행합니다. SDK를 우회하면 직접 수행해야 합니다. 전체 참조는 sdk-api/에 있으며, IDL 표면은 특히 sdk-api/anchor-idl에 있습니다.

6. 인덱서 및 가격 피드

REST API는 Raydium의 자체 인덱서에 의해 공급되며, 이는 Solana RPC 플릿에서 프로그램 로그를 구독하고 비정규화된 레코드를 SQL 저장소에 씁니다. 통합자를 위한 두 가지 결과:
  • 인덱서가 “크로스 프로그램 상태를 아는” 유일한 것입니다. CPMM 풀을 CLMM 대응물에 매핑하기, 프로그램 버전 전체에서 24시간 거래량 계산하기, LP 민트와 연관된 팜 선택하기 — 이 모든 것이 인덱서 작업입니다. 프로그램 자체는 이를 수행하지 않습니다.
  • 인덱서 다운타임은 API 다운타임입니다. API가 오래된 또는 빈 데이터를 반환하면, 인덱서가 의심 대상입니다. 온체인 상태는 영향을 받지 않습니다. 자신의 RPC와 SDK를 가진 통합자는 계속 거래할 수 있습니다.
가격 피드는 별개의 관심사입니다. API는 대부분의 풀 응답에 priceUsd 필드를 게시합니다. 이는 인덱서의 풀 준비금 뷰 스냅샷과 인용된 참조 가격 (공통 피벗으로 USDC 풀)에서 오프체인으로 계산됩니다. UI에는 충분하지만 온체인 오라클로 사용하기에는 안전하지 않습니다. 그 목적으로 관찰 TWAP을 사용하세요.

공유되지 않는 것

새로운 독자들이 종종 존재하는 것보다 더 많은 공유를 가정하기 때문에 명시적으로 나열할 가치가 있습니다:
  • 프로그램은 서로를 호출하지 않습니다. CPMM 스왑은 절대 CLMM 또는 AMM v4로 CPI하지 않습니다. 여러 AMM을 구성하는 유일한 프로그램은 AMM 라우팅 프로그램입니다 — 그리고 그것도 얇으며, 각 AMM으로 순서대로 CPI를 내보낼 뿐입니다.
  • 프로그램 전체에서 공유 업그레이드 권한이 없습니다. 각 온체인 프로그램은 자신의 프로그램 업그레이드 키를 가집니다 (3/4 멀티시그 + 24시간 타임락). 이들은 연결되지 않습니다.
  • 팜과 AMM 사이에 공유 상태가 없습니다. 팜은 스테이킹하는 LP가 CPMM 풀, CLMM 포지션 NFT 민트, 또는 관련 없는 SPL 토큰에서 온 것인지 알지 못합니다. 팜 프로그램은 스테이킹 민트를 불투명하게 취급합니다.
  • 오라클 의존성이 없습니다. 가격 책정은 온체인 준비금입니다. Pyth/Switchboard 폴백이 없습니다. AMM은 청산 전에 오라클을 확인하지 않습니다.

포인터

출처: