Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →

두 개의 독립적인 수수료, 네 개의 목적지

CPMM은 모든 스왑에 두 개의 별도 요율 수수료를 부과합니다:
  1. 거래 수수료 — AmmConfig.trade_fee_rate에서 부과되며 세 개의 목적지로 분배됩니다:
    • LP 몫 — 볼트에 남아 k를 증가시킵니다. LP 토큰을 소각하여 암묵적으로 청구됩니다.
    • 프로토콜 몫 — PoolState.protocol_fees_token*에 누적되며, protocol_owner가 CollectProtocolFee를 통해 회수합니다.
    • 펀드 몫 — PoolState.fund_fees_token*에 누적되며, fund_owner가 CollectFundFee를 통해 회수합니다.
  2. 크리에이터 수수료 (선택 사항, 풀별) — AmmConfig.creator_fee_rate에서 거래 수수료와 독립적으로 부과되며 PoolState.creator_fees_token*에 누적됩니다. 크리에이터는 CollectCreatorFee를 통해 회수하거나, 누구든지 목적지 제약이 있는 CollectCreatorFeePermissionless 경로를 트리거할 수 있습니다. enable_creator_fee = true로 풀을 생성했을 때만 활성화됩니다. 2026-09-19 업그레이드 이후 누적된 크리에이터 수수료는 수집 시점에 다시 한 번 분배됩니다: 설정 가능한 몫이 풀의 프로토콜 버킷으로 이동하고 나머지만 크리에이터에게 도달합니다 — 크리에이터 수수료의 프로토콜 몫을 참조하세요.
크리에이터 수수료는 거래 수수료의 일부가 아닙니다. 두 요율은 스왑 입력에서 수수료를 취할 때 함께 더해지지만, 각각은 자신의 버킷으로 유지됩니다 — 스왑에서 취한 프로토콜과 펀드 몫은 항상 trade_fee에서만 파생되며, creator_fee에서는 절대 파생되지 않습니다. creator_fee_rate = 1000 (0.10%)과 trade_fee_rate = 2500 (0.25%)인 풀은 크리에이터 수수료 온 입력 스왑에서 입력의 0.35%를 합쳐서 부과하며, 이 중 크리에이터 버킷이 0.10%를 받고 거래 수수료 버킷이 0.25%를 받습니다. 크리에이터 수수료의 프로토콜 몫은 반대 방향으로 작동하며 위의 내용과 혼동하기 쉽습니다: 거래 수수료에서가 아니라 크리에이터 버킷에서 잘려나가며, 스왑에서가 아니라 CollectCreatorFee 또는 CollectCreatorFeePermissionless가 누적된 잔액을 정산할 때 적용됩니다. 스왑 수학은 이로 인해 변경되지 않습니다. 거래 수수료 요율(trade_fee_rate, protocol_fee_rate, fund_fee_rate), creator_fee_rate 및 기본 creator_fee_share_rate는 모두 AmmConfig에 있습니다. 풀별 enable_creator_fee 플래그와 creator_fee_on 모드(거래의 어느 쪽에서 크리에이터 수수료를 취할지)는 PoolState에 있습니다. 크리에이터별 공유 요율 오버라이드는 자신의 CreatorFeeShare PDA에 있습니다. products/cpmm/accounts를 참조하세요.

요율 및 단위

모든 요율은 1 / FEE_RATE_DENOMINATOR 단위로 표시되는 u64이며, 여기서 FEE_RATE_DENOMINATOR = 1_000_000입니다.
  • trade_fee_rate 는 스왑 거래량의 분수입니다. 2500 ⇒ 관련 쪽(입력 또는 출력, creator_fee_on에 따라 다름 — 아래 “거래의 어느 쪽에서 수수료를 취할지” 참조)의 0.25%.
  • creator_fee_rate 는 스왑 거래량의 분수이며, 거래 수수료와 별도로 취합니다. 1000 ⇒ 관련 쪽의 0.10%.
  • protocol_fee_rate 및 fund_fee_rate 는 거래량이 아니라 거래 수수료의 분수입니다. 120_000 ⇒ 거래 수수료의 12%.
  • creator_fee_share_rate 는 거래량이나 거래 수수료가 아니라 누적된 크리에이터 수수료의 분수입니다. 200_000 ⇒ 수집 시점에 creator_fees_token*에 있는 것의 20%. 0 (기본값)은 전체 크리에이터 수수료를 크리에이터와 함께 둡니다.
메인넷의 AmmConfig[index=0] (표준 0.25% 풀)에 대한 기본 매개변수 (참고용): 따라서 AmmConfig[0]에 대한 $1,000 스왑에서 enable_creator_fee = false인 경우: $2.50 총 거래 수수료, 이 중 $2.10은 LP와 함께 유지되고, $0.30은 프로토콜로, $0.10은 펀드로 갑니다. 크리에이터 수수료가 비활성화되어 있으므로 크리에이터 버킷은 0입니다. 같은 풀이 enable_creator_fee = true이고 creator_fee_rate = 1000 (0.10%)이었다면, 사용자는 크리에이터 버킷에 추가로 $1.00을 지불합니다 — creator_fee_on으로 구성된 거래의 같은 쪽에서 취함 — 총 $3.50의 수수료입니다. 거래 수수료 버킷과 그 프로토콜/펀드 분배는 변경되지 않습니다. 현재 메인넷 값을 GET https://api-v3.raydium.io/main/cpmm-config에 대해 확인하세요 — 요율은 관리자가 변경 가능하며 하드코딩하기보다는 새로 읽어야 합니다.

코드의 분배

참고:
  • 입력의 총 수수료는 올림되므로 풀은 절대 과소 청구하지 않습니다.
  • trade_fee의 부분 분배(프로토콜, 펀드)는 내림되므로 그 합이 trade_fee를 초과하지 않습니다; 나머지는 LP 몫입니다.
  • lp_share = trade_fee − protocol_fee − fund_fee (creator_fee는 자신의 버킷이므로 여기서 빼지 않습니다).
  • 크리에이터 수수료는 PoolState.creator_fee_on에 따라 입력 또는 출력에서 취합니다 (다음 섹션 참조). 요율은 어느 쪽이든 변경되지 않습니다.

거래의 어느 쪽에서 수수료를 취할지

CPMM은 풀별 creator_fee_on 설정(BothToken / OnlyToken0 / OnlyToken1)을 가지고 있으며, 이는 크리에이터 수수료를 주어진 스왑의 입력 쪽에서 취할지 출력 쪽에서 취할지를 결정합니다. 런타임 헬퍼 is_creator_fee_on_input(direction)은 스왑별로 이를 부울로 축약합니다: 크리에이터 수수료가 입력 쪽에 있을 때, 거래 수수료와 크리에이터 수수료 모두 곡선이 실행되기 전에 amount_in에서 공제됩니다. 견적 수학: 입력에서 합친 trade_rate + creator_rate를 취합니다. 크리에이터 수수료가 출력 쪽에 있을 때, 거래 수수료만 amount_in에서 공제됩니다; 곡선은 수수료 없는 출력을 생성한 후, 크리에이터 수수료가 그 출력에서 공제됩니다. 견적 수학: 입력에서 trade_rate를 취합니다; 출력에서 creator_rate를 취합니다. 거래 수수료 자체는 항상 입력 쪽에서 취합니다 (표준 Uniswap-V2 패턴). 크리에이터 수수료만 출력에 도달할 수 있습니다.

”누적된” 수수료가 곡선과 상호작용하는 방식

중요한 미묘함: 프로토콜, 펀드, 크리에이터 수수료는 각각의 Collect* 명령이 호출될 때까지 물리적으로 볼트에 남아 있습니다. 하지만 곡선의 볼트 잔액 보기에서는 제외됩니다. 한 번의 스왑 후의 구체적인 그림:
프로그램은 k' ≥ k를 강제할 때 curve_x (및 유사한 curve_y)를 사용합니다. 이것이 비-LP 수수료가 LP 몫을 부풀리지 않고 목적지에 도달하는 방식입니다. 설계할 때 고려해야 할 결과:
  • 원본 잔액에서 견적을 작성하는 것은 잘못되었습니다. getTokenAccountBalance에서 견적을 작성하면, 풀이 준수할 가격을 지속적으로 과대평가합니다. 항상 누적된 수수료를 빼거나 SwapBaseInput / API를 통해 시뮬레이션하세요.
  • CollectProtocolFee는 가격을 이동하지 않습니다. 볼트에서 토큰을 이동하고 protocol_fees_token* 카운터를 0으로 설정하므로, curve_x와 curve_y는 변경되지 않습니다.
  • LP 수수료는 카운터에 누적되지 않습니다. 이들은 볼트 잔액에 암묵적입니다. LP의 누적된 LP 수수료에 대한 권리는 LP 토큰을 소각하여 행사됩니다 (즉, Withdraw를 통해) — CollectLpFee는 없습니다.

Token-2022 전송 수수료와의 상호작용

Token-2022 전송 수수료는 CPMM이 아니라 민트에 의해 적용됩니다. 이들은 모든 토큰 전송 — 스왑, 예치, 인출, Collect* 회수에 작용합니다. CPMM의 거래 수수료 수학은 실제로 볼트에 도달한 금액, 즉 입력 민트의 전송 수수료를 뺀 금액(있는 경우)에 대해 계산됩니다. 따라서 최악의 경우 사용자는 입력 정확 스왑에서 세 가지 서로 다른 세금을 지불합니다:
  1. 입력 민트의 amount_in에 대한 전송 수수료 (민트의 수수료 권한에).
  2. 풀의 trade_fee (위에서 분배한 대로).
  3. 출력 민트의 amount_out에 대한 전송 수수료 (민트의 수수료 권한에).
SDK의 견적 도구는 세 가지 모두를 고려하므로 minimum_amount_out은 사용자가 실제로 받는 것으로 표시됩니다. 자신의 견적 도구를 작성하는 경우, 그 동작을 반영하거나 슬리피지 검사가 체계적으로 너무 관대할 것입니다. 자세한 유도는 algorithms/token-2022-transfer-fees를 참조하세요.

크리에이터 수수료

크리에이터 수수료는 선택 사항이며 풀별입니다. 요율은 AmmConfig.creator_fee_rate에 있습니다; 활성화 플래그와 쪽(creator_fee_on)은 PoolState에 있습니다:
  • 풀 생성 시 활성화됨. Initialize는 기본적으로 enable_creator_fee = false를 설정합니다; InitializeWithPermission을 통해 생성된 풀 (LaunchLab 졸업 및 기타 게이트된 경로에서 사용됨)은 enable_creator_fee = true를 전달하고 creator_fee_on을 선택할 수 있습니다.
  • 요율은 수수료 계층과 공유됩니다. 요율 자체는 AmmConfig.creator_fee_rate이며, 해당 구성에 바인딩된 모든 풀에서 동일한 값입니다. 각 풀은 그 후 그것을 청구할지(enable_creator_fee) 결정하고 스왑의 어느 쪽에서 청구할지(creator_fee_on) 결정합니다. enable_creator_fee = false일 때, 풀의 유효 크리에이터 수수료 요율은 구성 값에 관계없이 0입니다 (소스의 PoolState::adjust_creator_fee_rate 참조).
  • 거래 수수료와 독립적입니다. 크리에이터 수수료는 절대 LP / 프로토콜 / 펀드 몫을 줄이지 않습니다 — 이는 자신의 요율이며, 별도로 적용되고, 자신의 카운터에 누적됩니다.
  • CollectCreatorFee 또는 CollectCreatorFeePermissionless를 통해 회수됩니다. 원본 경로는 PoolState.pool_creator가 서명해야 합니다. 권한 없는 경로는 누구든지 수집을 트리거할 수 있지만 두 목적지를 모두 크리에이터의 정규 ATA로 고정합니다. 두 경로 모두 프로토콜의 몫을 먼저 정산합니다 — 다음 섹션을 참조하세요.
  • 생성 후 다시 활성화하거나 다시 라우팅할 수 없습니다. enable_creator_fee = false로 초기화된 풀은 절대 크리에이터 수수료를 청구하지 않습니다; 특정 creator_fee_on으로 초기화된 풀은 쪽을 전환할 수 없습니다.
크리에이터 수수료는 Raydium의 “Burn & Earn” 패턴의 메커니즘입니다: LP 토큰은 LP Lock 프로그램 아래에 잠겨 있으므로 크리에이터는 유동성을 인출할 수 없지만, 누적된 크리에이터 수수료는 무한정 수집할 수 있습니다.

크리에이터 수수료의 프로토콜 몫

2026-09-19 업그레이드 이후 프로토콜은 크리에이터 수수료의 설정 가능한 몫을 유지할 수 있습니다. 스왑에 대해 변경되는 것은 없습니다: 크리에이터 수수료는 여전히 creator_fee_rate에서 청구되고 여전히 creator_fees_token{0,1}에 전체로 누적됩니다. 분배는 한 번, 수집 시점에, CollectCreatorFee 및 CollectCreatorFeePermissionless 내부에서 발생합니다.

요율이 어디서 오는지

두 가지 출처, 우선순위 순서:
  1. CreatorFeeShare PDA — 시드 ["creator_fee_share", creator, amm_config]. 이 계정이 존재하고 CPMM이 소유할 때, 그 share_rate가 우선합니다. 이것은 계층 자체를 건드리지 않고 주어진 수수료 계층에서 크리에이터별 요율을 협상할 수 있게 합니다.
  2. AmmConfig.creator_fee_share_rate — 해당 수수료 계층의 모든 크리에이터에 대한 기본값. PDA가 존재하지 않을 때마다 사용됩니다.
둘 다 동일한 FEE_RATE_DENOMINATOR = 1_000_000에 대한 u64이며, 둘 다 분모로 제한됩니다. 수집 명령은 항상 creator_fee_share 계정을 취합니다, 생성된 적이 없더라도 — 프로그램은 비어 있는지 확인하고 구성으로 폴백합니다. 잘못된 주소를 전달하면 폴백이 아니라 PDA 제약이 실패합니다.

분배가 하는 것

creator_fees_token_0 및 creator_fees_token_1에 독립적으로 적용된 후:
  • creator_amount_{0,1}은 볼트에서 크리에이터의 토큰 계정으로 전송됩니다.
  • shared_amount_{0,1}은 protocol_fees_token_{0,1}에 추가되고 프로토콜 소유자가 CollectProtocolFee로 회수할 때까지 볼트에 남아 있습니다. 별도의 명령이나 별도의 카운터는 없습니다.
  • creator_fees_token_{0,1}은 이전과 정확히 같이 0으로 설정됩니다.
신뢰할 수 있는 세 가지 속성:
  • 반올림은 크리에이터를 선호합니다. 프로토콜 몫이 내림되므로, 먼지는 크리에이터와 함께 남습니다 — protocol_fee 및 fund_fee와 동일한 방향이며, 이들도 이미 누적된 수수료에서 몫을 잘라냅니다.
  • 값이 보존됩니다. creator_amount + shared_amount == creator_fee 모든 요율과 모든 수수료에 대해, u64::MAX 포함.
  • share_rate = 0은 작동하지 않습니다. 기본 구성 값과 CreatorFeeShare PDA의 부재 모두 전체 크리에이터 수수료를 크리에이터와 함께 두며, 이는 업그레이드 전 동작입니다.

통합자에게 의미하는 것

  • LP와 견적은 영향을 받지 않습니다. 공유 금액은 이미 곡선의 볼트 보기에서 제외된 두 카운터 사이를 이동합니다 (vault_amount_without_fee), 따라서 curve_x와 curve_y는 수집 전체에서 이동하지 않습니다. k는 건드려지지 않습니다.
  • creator_fees_token*을 읽는 크리에이터 수수료 추정기는 이제 지급액을 과대평가합니다. (1 − share_rate / 1_000_000)을 곱하세요, 구성 기본값이 아니라 해당 (creator, amm_config) 쌍에 실제로 적용되는 요율을 사용합니다.
  • protocol_fees_token*은 스왑 외부에서 증가합니다. 프로토콜 누적을 스왑 거래량에 대해 조정하는 모니터는 각 크리에이터 수수료 수집에서 점프를 볼 것입니다. 프로토콜 누적은 더 이상 trade_fee × protocol_fee_rate만이 아닙니다.
  • 요율은 누적과 수집 사이에 변경될 수 있습니다. 수집 시점에 읽혀지므로, 한 요율 아래에서 누적된 수수료는 누군가 Collect*를 호출할 때 시행 중인 모든 요율에서 정산됩니다.
CreatorFeeShare 계정은 관리자 또는 전용 크리에이터 수수료 공유 권한에 의해 CreateCreatorFeeShare / CloseCreatorFeeShare를 통해 생성되고 닫혀집니다; 닫으면 쌍이 AmmConfig.creator_fee_share_rate로 돌아갑니다. 계정 레이아웃은 products/cpmm/accounts, 주소는 reference/program-addresses에 있습니다.

수집 운영 흐름

프로토콜 및 펀드 소유자는 메인넷의 Raydium 멀티시그입니다; security/admin-and-multisig를 참조하세요. 원본 크리에이터 전용 경로에서, 크리에이터 서명자는 PoolState에 기록된 계정입니다. 권한 없는 경로에서, 호출자는 누락된 크리에이터 ATA를 생성하기 위해 지불합니다. 프로그램은 creator를 pool_state.pool_creator로 제약하고 각 목적지를 해당 크리에이터와 해당 볼트 민트 및 토큰 프로그램에서 파생시키므로, 호출자는 자금을 리다이렉트할 수 없습니다.

수수료 계층 변경

수수료 요율은 관리자가 UpdateAmmConfig를 통해 변경할 수 있습니다 (products/cpmm/instructions 참조). 변경 사항은 해당 AmmConfig에 바인딩된 모든 풀에 대해 다음 스왑에 적용됩니다 — 마이그레이션이 없습니다, 풀이 각 스왑에서 구성을 로드하기 때문입니다. 관리자가 할 수 없는 것:
  • 풀을 한 AmmConfig에서 다른 것으로 이동합니다.
  • 이미 누적된 수수료를 소급해서 재가격합니다.
  • protocol_owner / fund_owner 서명자 없이 수수료를 수집합니다.

실행 중인 풀에서 수수료 읽기

공유 요율을 온체인에서 해결하세요, 캐시된 구성에서가 아니라. creator_fee_share_rate는 새로 추가된 AmmConfig 필드이므로, REST 구성 페이로드가 이를 전달한다고 가정하기보다는 계정에서 읽으세요, 그리고 CreatorFeeShare PDA가 ["creator_fee_share", creator, ammConfig]에 존재하는지 확인하세요, 크리에이터에게 지급액을 견적하기 전에. 부재한 PDA는 일반적인 경우이며 구성 기본값이 적용됨을 의미합니다.

CLMM 및 AMM v4와의 비교

reference/fee-comparison에서 나란히 비교 행렬을 참조하세요. 요약:
  • AMM v4는 고정 0.25% 거래 수수료를 사용하며 다른 LP/프로토콜 분배와 펀드 수수료가 없습니다.
  • CLMM 수수료는 틱 간격 계층별이며, 풀별이 아니라 포지션별로 누적되고, DecreaseLiquidity 또는 CollectFees를 통해 청구됩니다.

다음으로 갈 곳

출처: