Skip to main content
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 hướng dẫn chính thức. Để xem mã thực tế soạn các hướng dẫn này, hãy xem products/cpmm/code-demos. Để biết ý nghĩa mã lỗi, xem reference/error-codes.

Tóm tắt hướng dẫn

Bitmask trạng thái: status của mỗi pool là một 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). Bit rõ ràng có nghĩa là hoạt động được phép; bit được đặt có nghĩa là nó bị tạm dừng. UpdatePoolStatus lấy 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 CPMM IDL; SDK và client Rust trong raydium-cp-swap/programs/cp-swap/src/instructions khớp với thứ tự này.

Initialize

Tạo một pool CPMM mới. Đối số
Tài khoản (W = có thể ghi, S = người ký) * pool_state chỉ ký trên đường dẫn keypair ngẫu nhiên; đường dẫn PDA chính tắc chạy mà không cần pool_state ký. Điều kiện trước
  • Mint được sắp xếp (token_0_mint < token_1_mint theo thứ tự byte).
  • Không mint nào sử dụng phần mở rộng ngoài danh sách cho phép CPMM (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — xem products/cpmm/accounts. Một danh sách cho phép nhỏ cho mỗi mint bên trong chương trình bỏ qua kiểm tra để onboarding từng trường hợp.
  • creator có ít nhất init_amount_0init_amount_1 trong các ATA tương ứng.
  • amm_config.disable_create_pool == false.
Điều kiện sau
  • pool_state tồn tại với lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.
  • Người khởi động LP của LOCKED_LP (100 lamport của token LP) bị khóa vĩnh viễn trong pool — pool_state.lp_supply ghi lại liquidity − 100 trong khi 100 đơn vị LP vẫn ngoài lưu thông, ngăn pool bị thoát hết và chia cho không.
  • observation_state được khởi tạo; observation_index = 0pool_id = pool_state.key().
  • create_pool_fee lamport được chuyển từ người tạo đến người nhận và được đồ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 đều được bật).
  • enable_creator_fee = falsecreator_fee_on = BothToken. Initialize không hỗ trợ bật phí người tạo — đường dẫn đó là InitializeWithPermission.
  • open_time được tăng lên block_timestamp + 1 nếu người gọi truyền một giá trị <= block_timestamp. Swap bị từ chối trước open_time; deposit và withdraw hoạt động ngay lập tức.
Lỗi phổ biến (danh sách đầy đủ trong reference/error-codes)
  • InvalidInput — mint không được sắp xếp hoặc mint giống nhau.
  • NotSupportMint — phần mở rộng Token-2022 bị chặn.
  • ExceededSlippage — hiếm khi; nếu init_amount_0/1 dẫn đến LP bằng không do không khớp số thập phân.

Deposit

Thêm thanh khoản ở cả hai token theo tỷ lệ với pool. Đối số
Tài khoản Toán học
Không thay đổi tính tỷ lệ của k — cả vault và lp_supply được mở rộng 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 đầu vào).
  • vault_1 += needed_token_1 (ròng của bất kỳ phí chuyển Token-2022 nào trên đầu vào).
Lỗi phổ biếnExceededSlippage, ZeroTradingTokens, InvalidStatus nếu deposit bị tạm dừng.

Withdraw

Đốt token LP và nhận cả hai token cơ bản theo tỷ lệ. Đối số
Tài khoản (Giống hệt như Deposit; lp_mint có thể ghi vì token LP được đốt.) Toán học
Điều kiện sau
  • lp_supply -= lp_token_amount.
  • Vault gửi out_token_0 / out_token_1 (tổng; người dùng nhận ròng của bất kỳ phí chuyển Token-2022 nào).

SwapBaseInput

Swap đầu vào chính xác. Đối số
Tài khoản Thứ tự input → output là theo hướng của người dùng, không phải theo token_0 / token_1 chính tắc của pool. Chương trình tìm ra vault nào là cái nào bằng cách khớp mint. Toán học — xem products/cpmm/math. Điều kiện trước
  • open_time <= now.
  • pool_status cho phép swap.
  • Không mint nào bị tạm dừng hoặc đóng băng cho quyền hạn này.
  • amount_in > 0.
Lỗi phổ biến
  • ExceededSlippageamount_out < minimum_amount_out.
  • ZeroTradingTokens — giao dịch làm tròn thành không.
  • NotApproved — pool bị tạm dừng cho swap thông qua UpdatePoolStatus.
  • InvalidInput — mint không khớp với bất kỳ mint vault nào của pool.

SwapBaseOutput

Swap đầu ra chính xác. Đối số
Tài khoản — giống như SwapBaseInput. Toán học — đường cong nghịch đảo với trần, xem products/cpmm/math. Lỗi phổ biếnExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Quét phí giao thức tích lũy từ vault đến đích giao thức. Đối số — không có. Tài khoản Hiệu ứng
Không thay đổi số dư hiệu quả của đường cong (phí tích lũy đã bị loại trừ). Lỗi phổ biếnNotApproved 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à đặt lại các bộ đếm fund_fees_*.

CollectCreatorFee

Được ký bởi pool_state.pool_creator. Nó chuyển toàn bộ số dư creator_fees_token_0creator_fees_token_1 đến các tài khoản token của người tạo, sau đó đặt lại cả hai bộ đếm. Nó trả về NoFeeCollect khi cả hai bộ đếm bằng không.

CollectCreatorFeePermissionless

Bất kỳ ai cũng có thể kích hoạt việc thu thập phí người tạo. Hướng dẫn luôn gửi toàn bộ số dư tích lũy đến các tài khoản token liên kết chính tắc được sở hữu bởi pool_state.pool_creator; người gọi không thể chọn người tạo hoặc đích khác. Nếu bất kỳ ATA nào bị thiếu, payer tài trợ việc tạo của nó. CollectCreatorFee gốc vẫn có thể gọi được, vì vậy các client hiện có vẫn tương thích. Đối số — không có. Tài khoản Hiệu ứng
  • Chuyển tất cả creator_fees_token_0creator_fees_token_1 từ vault pool đến ATA người tạo.
  • Đặt lại cả hai bộ đếm phí người tạo và cập nhật pool_state.recent_epoch.
  • Trả về NoFeeCollect khi cả hai bộ đếm bằ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: Đối số
Tài khoản Khóa admin là quyền hạn nâng cấp trên chương trình CPMM — trong thực tế, multisig Raydium. Xem security/admin-and-multisig.

CreateAmmConfig

Tạo một tầng phí mới. Đối số
Tài khoản Điều kiện trước
  • Không có AmmConfig hiện có với cùng index.
  • 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ó. Lấy một param: u8 (discriminator cho trường nào cần cập nhật) và một value: u64. Ngữ nghĩa giá trị cho mỗi param nằm trong nguồn; thường:
  • param = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (chuyển byte Pubkey dưới dạng reinterpret)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
Các thay đổi được ký bởi admin và ảnh hưởng đến mọi pool liên kết với AmmConfig này trên swap tiếp theo. Không có di chuyển; pool chỉ đơn giản đọc các giá trị mới.

Ma trận thay đổi trạng thái

Tiếp theo

Nguồn: