이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
이 페이지는 권위 있는 명령어 참고서입니다. 이 명령어들을 실제로 구성하는 코드는
products/cpmm/code-demos를 참고하세요. 오류 코드의 의미는 reference/error-codes를 참고하세요.명령어 요약
상태 비트마스크: 각 풀의
status는 u8이며, 비트 0 = 입금 비활성화, 비트 1 = 출금 비활성화, 비트 2 = 스왑 비활성화 (PoolStatusBitIndex { Deposit, Withdraw, Swap } 프로그램에서). 비트가 0이면 작업이 허용되고, 비트가 1이면 일시 중지됩니다. UpdatePoolStatus는 원시 u8을 받아 기존 값을 덮어씁니다.
다음 섹션에서는 각각을 자세히 설명합니다. 계정 순서는 CPMM IDL을 따릅니다. SDK와 raydium-cp-swap/programs/cp-swap/src/instructions의 Rust 클라이언트가 이 순서를 따릅니다.
Initialize
새로운 CPMM 풀을 생성합니다.
인자
* pool_state는 임의 키페어 경로에서만 서명합니다. 정규-PDA 경로는 pool_state 서명 없이 실행됩니다.
사전 조건
- 민트가 정렬되어 있습니다 (바이트 순서로
token_0_mint < token_1_mint). - 어느 민트도 CPMM 허용 목록 외의 확장을 사용하지 않습니다 (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) —products/cpmm/accounts를 참고하세요. 프로그램 내의 작은 민트별 허용 목록은 경우별 온보딩을 위해 확인을 우회합니다. creator는 각 ATA에서 최소init_amount_0과init_amount_1을 보유합니다.amm_config.disable_create_pool == false.
pool_state가lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP로 존재합니다.LOCKED_LP(100LP 토큰의 lamport)의 LP 스타터는 풀에 영구적으로 잠깁니다 —pool_state.lp_supply는liquidity − 100을 기록하고100LP 단위는 순환 외부에 남아 풀이 완전히 소진되고 0으로 나누는 것을 방지합니다.observation_state가 초기화됩니다.observation_index = 0이고pool_id = pool_state.key()입니다.create_pool_feelamport가 생성자에서 수신자로 전송되고 네이티브 SOL로 동기화됩니다 (wSOL ATA입니다).- 풀의 상태 비트마스크는
0입니다 (입금/출금/스왑 모두 활성화됨). enable_creator_fee = false이고creator_fee_on = BothToken입니다.Initialize는 생성자 수수료 활성화를 지원하지 않습니다 — 그 경로는InitializeWithPermission입니다.open_time은 호출자가<= block_timestamp값을 전달한 경우block_timestamp + 1로 범프됩니다. 스왑은open_time이전에 거부됩니다. 입금과 출금은 즉시 작동합니다.
reference/error-codes에서)
InvalidInput— 민트가 정렬되지 않았거나 동일한 민트입니다.NotSupportMint— 차단된 Token-2022 확장입니다.ExceededSlippage— 드물게 발생합니다.init_amount_0/1이 소수 자릿수 불일치로 인해 0 LP를 초래하는 경우입니다.
Deposit
풀에 비례하여 두 토큰 모두에 유동성을 추가합니다.
인자
수학
k의 비례성에 변화가 없습니다 — 볼트와 lp_supply 모두 동일한 계수로 확장됩니다.
사후 조건
lp_supply += lp_token_amount.vault_0 += needed_token_0(입력의 Token-2022 전송 수수료 순).vault_1 += needed_token_1(입력의 Token-2022 전송 수수료 순).
ExceededSlippage, ZeroTradingTokens, 입금이 일시 중지된 경우 InvalidStatus.
Withdraw
LP 토큰을 소각하고 기초 토큰을 비례적으로 받습니다.
인자
(
Deposit과 동일합니다. lp_mint는 LP 토큰이 소각되기 때문에 쓰기 가능합니다.)
수학
lp_supply -= lp_token_amount.- 볼트가
out_token_0/out_token_1을 전송합니다 (총액; 사용자는 Token-2022 전송 수수료 순을 받습니다).
SwapBaseInput
정확한 입력 스왑입니다.
인자
순서는 입력 → 출력이며, 풀의 정규
token_0 / token_1이 아닌 사용자의 방향입니다. 프로그램은 민트를 일치시켜 어느 볼트가 어느 것인지 파악합니다.
수학 — products/cpmm/math를 참고하세요.
사전 조건
open_time <= now.pool_status가 스왑을 허용합니다.- 어느 민트도 이 권한에 대해 일시 중지되거나 동결되지 않습니다.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— 거래가 0으로 반올림됩니다.NotApproved— 풀이UpdatePoolStatus를 통해 스왑에 대해 일시 중지됩니다.InvalidInput— 민트가 풀의 볼트 민트 중 어느 것과도 일치하지 않습니다.
SwapBaseOutput
정확한 출력 스왑입니다.
인자
SwapBaseInput과 동일합니다.
수학 — 천장이 있는 역곡선, products/cpmm/math를 참고하세요.
일반적인 오류 — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
볼트에서 프로토콜 목적지로 누적된 프로토콜 수수료를 수거합니다.
인자 — 없음.
계정
효과
protocol_owner가 아닌 경우 NotApproved.
CollectFundFee
CollectProtocolFee와 동일한 형태이지만 fund_owner가 서명하고 fund_fees_* 카운터를 0으로 설정합니다.
CollectCreatorFee
pool_state.pool_creator가 서명합니다. 전체 creator_fees_token_0과 creator_fees_token_1 잔액을 생성자의 토큰 계정으로 전송한 다음 두 카운터를 0으로 설정합니다. 두 카운터가 모두 0일 때 NoFeeCollect를 반환합니다.
CollectCreatorFeePermissionless
누구나 생성자 수수료 수거를 트리거할 수 있습니다. 명령어는 항상 전체 누적 잔액을 pool_state.pool_creator가 소유한 정규 관련 토큰 계정으로 전송합니다. 호출자는 다른 생성자나 목적지를 선택할 수 없습니다. 어느 ATA가 누락된 경우, 지불자가 생성 비용을 지불합니다.
원래 CollectCreatorFee는 호출 가능하므로 기존 클라이언트는 호환성을 유지합니다.
인자 — 없음.
계정
효과
- 풀 볼트에서 생성자 ATA로
creator_fees_token_0과creator_fees_token_1전체를 전송합니다. - 두 생성자 수수료 카운터를 0으로 설정하고
pool_state.recent_epoch을 업데이트합니다. - 두 카운터가 모두 0일 때
NoFeeCollect를 반환합니다.
UpdatePoolStatus
풀의 개별 작업을 일시 중지하거나 재개합니다. status 필드는 비트마스크입니다:
인자
관리자 키는 CPMM 프로그램의 업그레이드 권한입니다 — 실제로는 Raydium 멀티시그입니다.
security/admin-and-multisig를 참고하세요.
CreateAmmConfig
새로운 수수료 계층을 생성합니다.
인자
사전 조건
- 동일한
index를 가진 기존AmmConfig가 없습니다. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
UpdateAmmConfig
기존 AmmConfig의 수수료율 또는 소유권을 변경합니다. param: u8 (업데이트할 필드의 판별자)과 value: u64를 받습니다. 매개변수별 값 의미는 소스에 있습니다. 일반적으로:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(재해석으로Pubkey바이트 전달)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig에 바인딩된 모든 풀에 영향을 미칩니다. 마이그레이션 없음. 풀은 단순히 새 값을 읽습니다.
상태 변경 매트릭스
다음 단계
products/cpmm/code-demos— 위의 실행 가능한 TypeScript 샘플입니다.reference/error-codes— 완전한 Anchor 오류 테이블입니다.products/cpmm/fees—Collect*Fee명령어가 소진하는 수수료 누적 모델입니다.

