Skip to main content
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
이 페이지는 권위 있는 명령어 참고서입니다. 이 명령어들을 실제로 구성하는 코드는 products/cpmm/code-demos를 참고하세요. 오류 코드의 의미는 reference/error-codes를 참고하세요.

명령어 요약

상태 비트마스크: 각 풀의 statusu8이며, 비트 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 풀을 생성합니다. 인자
계정 (W = 쓰기 가능, S = 서명자) * pool_state는 임의 키페어 경로에서만 서명합니다. 정규-PDA 경로는 pool_state 서명 없이 실행됩니다. 사전 조건
  • 민트가 정렬되어 있습니다 (바이트 순서로 token_0_mint < token_1_mint).
  • 어느 민트도 CPMM 허용 목록 외의 확장을 사용하지 않습니다 (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — products/cpmm/accounts를 참고하세요. 프로그램 내의 작은 민트별 허용 목록은 경우별 온보딩을 위해 확인을 우회합니다.
  • creator는 각 ATA에서 최소 init_amount_0init_amount_1을 보유합니다.
  • amm_config.disable_create_pool == false.
사후 조건
  • pool_statelp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP로 존재합니다.
  • LOCKED_LP (100 LP 토큰의 lamport)의 LP 스타터는 풀에 영구적으로 잠깁니다 — pool_state.lp_supplyliquidity − 100을 기록하고 100 LP 단위는 순환 외부에 남아 풀이 완전히 소진되고 0으로 나누는 것을 방지합니다.
  • observation_state가 초기화됩니다. observation_index = 0이고 pool_id = pool_state.key()입니다.
  • create_pool_fee lamport가 생성자에서 수신자로 전송되고 네이티브 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.
일반적인 오류
  • ExceededSlippageamount_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_0creator_fees_token_1 잔액을 생성자의 토큰 계정으로 전송한 다음 두 카운터를 0으로 설정합니다. 두 카운터가 모두 0일 때 NoFeeCollect를 반환합니다.

CollectCreatorFeePermissionless

누구나 생성자 수수료 수거를 트리거할 수 있습니다. 명령어는 항상 전체 누적 잔액을 pool_state.pool_creator가 소유한 정규 관련 토큰 계정으로 전송합니다. 호출자는 다른 생성자나 목적지를 선택할 수 없습니다. 어느 ATA가 누락된 경우, 지불자가 생성 비용을 지불합니다. 원래 CollectCreatorFee는 호출 가능하므로 기존 클라이언트는 호환성을 유지합니다. 인자 — 없음. 계정 효과
  • 풀 볼트에서 생성자 ATA로 creator_fees_token_0creator_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 = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (재해석으로 Pubkey 바이트 전달)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
변경 사항은 관리자가 서명하며 다음 스왑에서 AmmConfig에 바인딩된 모든 풀에 영향을 미칩니다. 마이그레이션 없음. 풀은 단순히 새 값을 읽습니다.

상태 변경 매트릭스

다음 단계

출처: