이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
지시사항 요약
상태 비트마스크: 각 풀의
status는 u8이며, 비트 0 = 입금 비활성화, 비트 1 = 출금 비활성화, 비트 2 = 스왑 비활성화입니다(PoolStatusBitIndex { Deposit, Withdraw, Swap }). 클리어 비트는 작업이 허용됨을 의미하고, 설정 비트는 일시 중지됨을 의미합니다. 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(LP 토큰 100 라마포)의 LP 스타터는 풀에서 영구적으로 잠깁니다 —pool_state.lp_supply는liquidity − 100을 기록하는 동안100LP 단위는 순환 외부에 남아있어 풀이 완전히 비워지는 것과 0으로 나누는 것을 방지합니다.observation_state가 초기화됩니다;observation_index = 0이고pool_id = pool_state.key().create_pool_fee라마포는 생성자에서 수신자로 전송되고 네이티브 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가 서명합니다. 풀이 0이 아닌 생성자 수수료율로 초기화된 경우에만 이전을 내보냅니다.
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—CollectProtocolFee/CollectFundFee/CollectCreatorFee가 수집하는 수수료 축적 모델.

