Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →
Trang này là tài liệu tham khảo chỉ thị có thẩm quyền. Để xem code thực tế tạo ra các chỉ thị này, xem
products/cpmm/code-demos. Để hiểu ý nghĩa mã lỗi, xem reference/error-codes.Tóm tắt chỉ thị
| Tên phân biệt | Ai ký | Nó làm gì |
|---|---|---|
Initialize | nhà tạo pool | Tạo pool CPMM mới từ hai mint và một AmmConfig. Không cần phép; bất kỳ ai cũng có thể gọi nó. Cứng mã enable_creator_fee = false trên pool mới. Tài khoản pool_state có thể là PDA chính tắc hoặc một keypair ngẫu nhiên mới (xem Accounts của Initialize). |
InitializeWithPermission | người trả tiền + chủ sở hữu PDA Permission | Phiên bản được phép của Initialize. Người gọi (payer) phải sở hữu một PDA Permission được dẫn xuất từ pubkey của họ. Được sử dụng bởi các nền tảng cần tạo pool có gating (ví dụ: graduations của LaunchLab). Cho phép người gọi ghim creator_fee_on (BothToken / OnlyToken0 / OnlyToken1) và bắt buộc enable_creator_fee = true trên pool mới. Trường creator trên pool_state được đặt thành tài khoản creator được truyền riêng biệt, không phải người trả tiền. Cùng tính linh hoạt PDA-chính-tắc-hoặc-random-keypair cho pool_state như Initialize. |
Deposit | LP | Thêm thanh khoản trong cả hai token; nhận token LP. |
Withdraw | LP | Đốt token LP; nhận cả hai token cơ sở theo tỷ lệ. |
SwapBaseInput | người trao đổi | Swap input chính xác (amount_in vào, ≥ minimum_amount_out ra). |
SwapBaseOutput | người trao đổi | Swap output chính xác (≤ maximum_amount_in vào, amount_out ra). |
CollectProtocolFee | protocol_owner (từ AmmConfig) | Thu gom phí giao thức tích lũy từ các kho. |
CollectFundFee | fund_owner (từ AmmConfig) | Thu gom phí quỹ tích lũy từ các kho. |
CollectCreatorFee | pool_creator | Thu gom phí tạo tích lũy (nếu phí tạo được bật). |
UpdatePoolStatus | admin | Tạm dừng / tiếp tục các hoạt động cụ thể trên pool thông qua một bitmask. |
UpdateAmmConfig | admin | Thay đổi tỷ lệ phí hoặc chủ sở hữu giao thức/quỹ trên một AmmConfig. |
CreateAmmConfig | admin | Tạo tầng phí mới (tài khoản AmmConfig mới). |
CreatePermissionPda | admin | Mint một PDA Permission cho phép một cơ quan cụ thể gọi InitializeWithPermission. |
ClosePermissionPda | admin | Thu hồi một PDA Permission đã phát hành trước đó. |
status của pool là u8 trong đó bit 0 = deposit bị vô hiệu hóa, bit 1 = withdraw bị vô hiệu hóa, bit 2 = swap bị vô hiệu hóa (PoolStatusBitIndex { Deposit, Withdraw, Swap } trong chương trình). Một bit rõ ràng có nghĩa là hoạt động được phép; một bit được đặt có nghĩa là nó bị tạm dừng. UpdatePoolStatus nhận một u8 thô và ghi đè giá trị hiện có.
Các phần tiếp theo đi qua từng phần chi tiết. Thứ tự tài khoản tuân theo IDL của CPMM; SDK và client Rust trong raydium-cp-swap/programs/cp-swap/src/instructions phù hợp với thứ tự này.
Initialize
Tạo pool CPMM mới.
Các đối số
| # | Tên | W | S | Ghi chú |
|---|---|---|---|---|
| 1 | creator | W | S | Trả tiền thuê; được ghi lại là pool_state.pool_creator. |
| 2 | amm_config | Tầng phí được chọn. | ||
| 3 | authority | PDA cơ quan toàn cầu CPMM. | ||
| 4 | pool_state | W | S* | Được init tại đây. Hoặc PDA chính tắc ["pool", amm_config, token_0_mint, token_1_mint] hoặc một keypair ngẫu nhiên mới — khi không phải PDA chính tắc, chương trình yêu cầu pool_state ký (require_eq!(pool_account_info.is_signer, true)). Đường dẫn keypair ngẫu nhiên cho phép người tạo tránh những nỗ lực front-running trên PDA chính tắc. Các PDA xuôi dòng (lp_mint, vaults, observation_state) được dẫn xuất từ pool_state.key() dù sao. |
| 5 | token_0_mint | Được sắp xếp: token_0_mint < token_1_mint. | ||
| 6 | token_1_mint | |||
| 7 | lp_mint | W | Được init tại đây. Cơ quan được đặt thành authority. | |
| 8 | creator_token_0 | W | ATA nguồn cho init_amount_0. | |
| 9 | creator_token_1 | W | ATA nguồn cho init_amount_1. | |
| 10 | creator_lp_token | W | Đích cho LP (tạo nếu thiếu). | |
| 11 | token_0_vault | W | Được init tại đây. Được sở hữu bởi authority. | |
| 12 | token_1_vault | W | ||
| 13 | create_pool_fee | W | ATA đích cho create_pool_fee được trả bởi người tạo. | |
| 14 | observation_state | W | Được init tại đây. | |
| 15 | token_program | SPL Token (cho LP mint). | ||
| 16 | token_0_program | SPL Token hoặc Token-2022. | ||
| 17 | token_1_program | SPL Token hoặc Token-2022. | ||
| 18 | associated_token_program | |||
| 19 | system_program | |||
| 20 | rent |
* pool_state chỉ ký trên đường dẫn random-keypair; đường dẫn PDA chính tắc chạy mà không cần pool_state ký.
Điều kiện tiền
- Mint được sắp xếp (
token_0_mint < token_1_minttheo thứ tự byte). - Không mint nào sử dụng extension ngoài danh sách cho phép CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — xemproducts/cpmm/accounts. Danh sách cho phép nhỏ cho mỗi mint bên trong chương trình bỏ qua kiểm tra để tự onboarding từng trường hợp. creatorcó ít nhấtinit_amount_0vàinit_amount_1trong các ATA tương ứng.amm_config.disable_create_pool == false.
pool_statetồn tại vớilp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- Người khởi tạo LP của
LOCKED_LP(100lamports token LP) bị khóa vĩnh viễn trong pool —pool_state.lp_supplyghiliquidity − 100trong khi100đơn vị LP vẫn ở ngoài lưu thông, ngăn pool bị thoát hoàn toàn và chia cho không. observation_stateđược khởi tạo;observation_index = 0vàpool_id = pool_state.key().create_pool_feelamports được chuyển từ người tạo đến người nhận và đồng bộ hóa dưới dạng SOL gốc (nó là một ATA wSOL).- Bitmask trạng thái của pool là
0(deposit / withdraw / swap tất cả đều được bật). enable_creator_fee = falsevàcreator_fee_on = BothToken.Initializekhông hỗ trợ bật phí tạo — đường dẫn đó làInitializeWithPermission.open_timeđược đẩy tớiblock_timestamp + 1nếu người gọi truyền một giá trị<= block_timestamp. Swap bị từ chối trướcopen_time; deposit và withdrawal hoạt động ngay lập tức.
reference/error-codes)
InvalidInput— mint không được sắp xếp, hoặc mint giống hệt nhau.NotSupportMint— extension Token-2022 bị chặn.ExceededSlippage— hiếm; nếuinit_amount_0/1dẫn đến zero LP do mismatch decimals.
Deposit
Thêm thanh khoản trong cả hai token theo tỷ lệ của pool.
Các đối số
| # | Tên | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | authority | ||
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | ||
| 10 | token_program_2022 | ||
| 11 | vault_0_mint | ||
| 12 | vault_1_mint | ||
| 13 | lp_mint | W |
k — cả kho và lp_supply tỷ lệ theo cùng một hệ số.
Điều kiện sau
lp_supply += lp_token_amount.vault_0 += needed_token_0(ròng của bất kỳ phí chuyển Token-2022 nào trên input).vault_1 += needed_token_1(ròng của bất kỳ phí chuyển Token-2022 nào trên input).
ExceededSlippage, ZeroTradingTokens, InvalidStatus nếu deposit bị tạm dừng.
Withdraw
Đốt token LP và nhận cả hai token cơ sở theo tỷ lệ.
Các đối số
| # | Tên | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | authority | ||
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | ||
| 10 | token_program_2022 | ||
| 11 | vault_0_mint | ||
| 12 | vault_1_mint | ||
| 13 | lp_mint | W |
Deposit; lp_mint có thể ghi vì token LP bị đốt.)
Toán học
lp_supply -= lp_token_amount.- Kho gửi
out_token_0/out_token_1(gross; người dùng nhận ròng của bất kỳ phí chuyển Token-2022 nào).
SwapBaseInput
Swap input chính xác.
Các đối số
| # | Tên | W | S |
|---|---|---|---|
| 1 | payer | S | |
| 2 | authority | ||
| 3 | amm_config | ||
| 4 | pool_state | W | |
| 5 | input_token_account | W | |
| 6 | output_token_account | W | |
| 7 | input_vault | W | |
| 8 | output_vault | W | |
| 9 | input_token_program | ||
| 10 | output_token_program | ||
| 11 | input_token_mint | ||
| 12 | output_token_mint | ||
| 13 | observation_state | W |
token_0 / token_1 chính tắc của pool. Chương trình tìm ra kho nào là kho nào bằng cách so khớp mint.
Toán học — xem products/cpmm/math.
Điều kiện tiền
open_time <= now.pool_statuscho phép swap.- Không mint nào bị tạm dừng hoặc đóng băng cho cơ quan này.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— giao dịch làm tròn xuống không.NotApproved— pool bị tạm dừng cho swap thông quaUpdatePoolStatus.InvalidInput— mint không khớp với bất kỳ mint kho nào của pool.
SwapBaseOutput
Swap output chính xác.
Các đối số
SwapBaseInput.
Toán học — đường cong nghịch đảo với ceiling, xem products/cpmm/math.
Lỗi phổ biến — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
Thu gom phí giao thức tích lũy từ các kho đến đích giao thức.
Các đối số — không có.
Tài khoản
| # | Tên | W | S | |
|---|---|---|---|---|
| 1 | owner | S | Phải khớp với amm_config.protocol_owner. | |
| 2 | authority | |||
| 3 | pool_state | W | ||
| 4 | amm_config | |||
| 5 | token_0_vault | W | ||
| 6 | token_1_vault | W | ||
| 7 | vault_0_mint | |||
| 8 | vault_1_mint | |||
| 9 | recipient_token_0_account | W | ||
| 10 | recipient_token_1_account | W | ||
| 11 | token_program | |||
| 12 | token_program_2022 |
NotApproved nếu người ký không phải là protocol_owner.
CollectFundFee
Cùng hình dạng như CollectProtocolFee nhưng được ký bởi fund_owner và zeroing các bộ đếm fund_fees_*.
CollectCreatorFee
Cùng hình dạng lần nữa, được ký bởi pool_state.pool_creator. Chỉ phát ra chuyển nếu pool được khởi tạo với tỷ lệ phí tạo không-không.
UpdatePoolStatus
Tạm dừng hoặc tiếp tục các hoạt động riêng lẻ trên pool. Trường status là một bitmask:
| Bit | Cờ | Hiệu ứng khi được đặt |
|---|---|---|
| 0 | DEPOSIT_DISABLED | Deposit từ chối với NotApproved. |
| 1 | WITHDRAW_DISABLED | Withdraw từ chối. |
| 2 | SWAP_DISABLED | SwapBaseInput / SwapBaseOutput từ chối. |
| # | Tên | W | S | |
|---|---|---|---|---|
| 1 | authority | S | Phải khớp với khóa admin trên chương trình CPMM. | |
| 2 | pool_state | W |
security/admin-and-multisig.
CreateAmmConfig
Tạo tầng phí mới.
Các đối số
| # | Tên | W | S | |
|---|---|---|---|---|
| 1 | owner | W | S | Admin. |
| 2 | amm_config | W | Được init tại đây. | |
| 3 | system_program |
- Không có
AmmConfighiện có với cùngindex. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
UpdateAmmConfig
Thay đổi tỷ lệ phí hoặc quyền sở hữu trên một AmmConfig hiện có. Nhận một param: u8 (phân biệt cho trường nào để cập nhật) và một value: u64. Ngữ nghĩa giá trị cho mỗi param trong nguồn; thường là:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(chuyển bytePubkeydưới dạng reinterpret)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig này trong swap tiếp theo. Không có migration; pool chỉ đơn giản đọc các giá trị mới.
Ma trận thay đổi trạng thái
| Chỉ thị | lp_supply | Cân bằng kho | Trường phí tích lũy | observation |
|---|---|---|---|---|
Initialize | + init LP | + init_amount_{0,1} | 0 | init |
InitializeWithPermission | + init LP | + init_amount_{0,1} | 0 | init |
Deposit | + | + cả hai | — | — |
Withdraw | − | − cả hai | — | — |
SwapBaseInput | — | + in, − out | + trade_fee chia thành giao thức/quỹ; + creator_fee nếu được bật | + (nếu khoảng thời gian đã trôi qua) |
SwapBaseOutput | — | + in, − out | + trade_fee chia thành giao thức/quỹ; + creator_fee nếu được bật | + (nếu khoảng thời gian đã trôi qua) |
CollectProtocolFee | — | − (bằng bucket giao thức) | protocol_* → 0 | — |
CollectFundFee | — | − (bằng bucket quỹ) | fund_* → 0 | — |
CollectCreatorFee | — | − (bằng bucket tạo) | creator_* → 0 | — |
UpdatePoolStatus | — | — | — | — |
Tiếp theo là gì
products/cpmm/code-demos— mẫu TypeScript có thể chạy được cho các điều trên.reference/error-codes— bảng lỗi Anchor đầy đủ.products/cpmm/fees— mô hình tích lũy phí màCollectProtocolFee/CollectFundFee/CollectCreatorFeethoát ra.

