메인 콘텐츠로 건너뛰기
이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →

지시사항 요약

상태 비트마스크: 각 풀의 statusu8이며, 비트 0 = 입금 비활성화, 비트 1 = 출금 비활성화, 비트 2 = 스왑 비활성화입니다(PoolStatusBitIndex { Deposit, Withdraw, Swap }). 클리어 비트는 작업이 허용됨을 의미하고, 설정 비트는 일시 중지됨을 의미합니다. 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(LP 토큰 100 라마포)의 LP 스타터는 풀에서 영구적으로 잠깁니다 — pool_state.lp_supplyliquidity − 100을 기록하는 동안 100 LP 단위는 순환 외부에 남아있어 풀이 완전히 비워지는 것과 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.
일반적인 오류
  • 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가 서명합니다. 풀이 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 = 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에 바인드된 모든 풀에 영향을 줍니다. 마이그레이션 없음; 풀은 단순히 새 값을 읽습니다.

상태 변경 매트릭스

다음 단계

소스: