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 →
Program ID và PDA seeds cho CPMM được liệt kê chính thức trong
reference/program-addresses. Trang này tập trung vào mục đích của mỗi tài khoản và các bất biến nó duy trì, không phải các địa chỉ được hardcode.Sáu tài khoản của một pool CPMM
Mỗi pool CPMM được mô tả hoàn toàn bởi sáu địa chỉ dẫn xuất từ chương trình (PDA) dưới chương trình CPMM, cộng với một tài khoảnAmmConfig dùng chung mà nó tham chiếu. Khi bạn có hai mint, bạn có thể dẫn xuất mọi thứ một cách xác định mà không cần chạm vào mạng.
Và cấu hình dùng chung:
Dẫn xuất một pool từ không có gì ngoài hai mint
Pool ID không phải lúc nào cũng là PDA chính tắc.
Initialize chấp nhận một keypair signer tùy ý làm pool_state ngoài PDA ở trên. Nếu tài khoản được truyền không khớp với PDA chính tắc, chương trình yêu cầu nó phải là một signer — tức là người tạo truyền một keypair mới mà họ ký. Đây là phòng chống front-run: bất kỳ bên thứ ba nào cố gắng chiếm PDA chính tắc có thể bị vượt qua bởi người tạo hợp pháp sử dụng một keypair ngẫu nhiên thay thế. Các PDA hạ lưu (lpMint, vault0, vault1, observation) vẫn được dẫn xuất từ poolState.key(), vì vậy chúng vẫn duy nhất cho bất kỳ địa chỉ nào được sử dụng. Khi bạn lập chỉ mục các pool, luôn khám phá pool ID từ trạng thái trên chuỗi (ví dụ: các tài khoản PoolState dưới chương trình CPMM), không phải bằng cách dẫn xuất PDA chính tắc — cách sau sẽ bỏ lỡ các pool keypair ngẫu nhiên.Bố cục tài khoản
Các định nghĩa Rust đầy đủ nằm trong nguồnraydium-cp-swap. Các trường dưới đây là những trường bạn sẽ đọc từ một tích hợp.
PoolState
lp_supply— bản sao nội bộ của pool về tổng cung cấp của LP mint. Sử dụng nó cho toán học cổ phần LP; giá trị phải khớp với cung cấp trên chuỗi của mint, nhưng đọc nó từPoolStatetránh được một lần tìm nạp tài khoản bổ sung.protocol_fees_token{0,1},fund_fees_token{0,1}— phí tích lũy chưa được quét. Những phí này không ảnh hưởng đến giá swap; chúng nằm trong vault cho đến khiCollectProtocolFee/CollectFundFeeđược gọi.status— một bitmask kiểm soát xemSwap,Deposit,Withdrawcó được phép hay không. Được cập nhật bởi quản trị viên thông quaUpdatePoolStatus. SDK kiểm tra điều này trước khi xây dựng một giao dịch; nếu bạn đang CPI trực tiếp, hãy kiểm tra nó yourself.token0_program/token1_program— chương trình token để CPI vào cho mỗi vault. Một có thể là SPL Token cổ điển và cái kia là Token-2022; chúng độc lập.open_time— một dấu thời gian Unix. Swap trước thời điểm này sẽ thất bại. Deposit được phép trướcopen_timeđể pool có thể được seeded.creator_fee_on/enable_creator_fee— cùng nhau kiểm soát xem phí người tạo tùy chọn có hoạt động cho pool này hay không và nó được thu từ phía nào của swap.enable_creator_fee == falseloại bỏ hoàn toàn đường dẫn phí người tạo. Khi được bật,creator_fee_onchọn:0= lấy phí từ bất kỳ token nào là đầu vào swap (BothToken);1= lấy phí từtoken_0chỉ (bỏ qua trên swaptoken_1 → token_0);2= lấy phí từtoken_1chỉ. Được đặt tại thời điểm tạo pool thông quaInitializeWithPermission; không thể thay đổi sau đó.creator_fees_token_{0,1}— phí người tạo tích lũy, được quét bởiCollectCreatorFeehoặcCollectCreatorFeePermissionless. Cả hai đường dẫn đều xóa các bộ đếm đầy đủ; đường dẫn không cần phép sửa các người nhận thành các ATA chính tắc củapool_creator.
AmmConfig
trade_fee_ratevàcreator_fee_ratelà phân số của khối lượng, cả hai được biểu thị bằng đơn vị1/1_000_000.2500có nghĩa là 0.25% của khối lượng giao dịch.protocol_fee_ratevàfund_fee_ratelà phân số của phí giao dịch (không phải của khối lượng), trong cùng mẫu số1/1_000_000. Phí người tạo không phải là phân số của phí giao dịch — nó là tỷ lệ độc lập của riêng nó. Số học đầy đủ nằm trongproducts/cpmm/fees.indexlà mộtu16, vì vậy seed hash sử dụng 2 byte big-endian. Sai một byte trong thứ tự byte là một lỗi tích hợp phổ biến.AmmConfiglà bất biến ở cấp pool. Một pool trỏ đến mộtAmmConfigtại thời điểm tạo và không bao giờ chuyển đổi. Các thay đổi phí được truyền vì pool đọc cấu hình mỗi swap — nhưng pool không thể được di chuyển giữa các tầng phí.
creator_fee_rate) nằm trên AmmConfig và được dùng chung trên tầng phí. Liệu một pool cụ thể có thực sự tính phí hay không (enable_creator_fee) và nó hạ cánh ở phía nào của swap (creator_fee_on) nằm trên PoolState. Phí người tạo độc lập với phí giao dịch — nó là tỷ lệ của riêng nó, tích lũy vào các bộ đếm của riêng nó (creator_fees_token_{0,1}), và không bao giờ giảm các cổ phần LP / giao thức / quỹ của phí giao dịch. Quét được thực hiện thông qua CollectCreatorFee hoặc CollectCreatorFeePermissionless bị ràng buộc bởi đích. Xem products/cpmm/fees để biết cơ chế đầy đủ.
Permission
Một tài khoản kiểm soát truy cập nhỏ được sử dụng bởi InitializeWithPermission. Chương trình CPMM hỗ trợ một đường dẫn tạo pool có quyền hạn để các chương trình khác (ví dụ: LaunchLab khi nâng cấp token lên CPMM) có thể chứng minh rằng họ được phép tạo pool chống lại một AmmConfig nhất định.
CreatePermissionPda bởi quản trị viên CPMM hoặc một quyền tạo PDA permission chuyên dụng. Chỉ quản trị viên CPMM mới có thể thu hồi nó thông qua ClosePermissionPda. Người dùng cuối không tương tác trực tiếp với tài khoản này — nó là đường ống cho các luồng chương trình chéo. Xem security/admin-and-multisig để biết ranh giới vai trò và reference/program-addresses để biết các địa chỉ chính tắc.
Vault và Token-2022
vault0 và vault1 được sở hữu bởi PDA authority của CPMM, và chủ sở hữu token-program của chúng (token_program) là SPL Token hoặc Token-2022, được xác định tại thời điểm tạo pool bởi chương trình của mint. Pool xử lý hai trường hợp một cách minh bạch — bạn truyền ID token-program đúng cho mỗi phía trong các tài khoản lệnh Swap / Deposit / Withdraw.
CPMM thực thi một danh sách cho phép extension nghiêm ngặt tại thời điểm tạo pool (is_supported_mint trong utils/token.rs). Một mint Token-2022 chỉ có thể được sử dụng trong một pool CPMM nếu mọi extension mà nó mang đều nằm trong danh sách này:
TransferFeeConfig. Được áp dụng bởi mint trên mỗi lần chuyển. Pool nằm ở phía nhận cho các depositSwapBaseInputvà phía gửi cho các withdrawal. Chương trình tính toán số tiền ròng hạ cánh trong vault và đặt đường cong tương ứng. Xemalgorithms/token-2022-transfer-fees.MetadataPointervàTokenMetadata. Siêu dữ liệu tiêu chuẩn trên mint. Không ảnh hưởng đến toán học swap.InterestBearingConfig. Số tiền UI của mint tích lũy lãi suất. Vault lưu trữ số tiền thô; đường cong hoạt động chỉ trên số tiền thô. UI hiển thị APR nên gọi các trợ giúp Token-2022 để hiển thị số tiền UI.ScaledUiAmount. Extension mở rộng quy mô hiển thị UI. Cách xử lý giống nhưInterestBearingConfig— đường cong sử dụng số tiền thô.
PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, v.v. — sẽ khiến Initialize từ chối với NotSupportMint. Ngoại lệ là một danh sách mint được phép cứng nhỏ trong chương trình (một số pubkey cụ thể) bỏ qua kiểm tra extension; nó được sử dụng để onboard các mint cụ thể từng trường hợp một.
Danh sách extension được kiểm chứng và danh sách mint được phép nằm trong nguồn CP-Swap dưới programs/cp-swap/src/utils/token.rs và có thể thay đổi với các nâng cấp chương trình trong tương lai.
Observation
Tài khoản observation là một ring buffer của các mục nhậpObservationState, mỗi mục lưu trữ một block_timestamp và một giá tích lũy. Trên mỗi swap, chương trình nối thêm một observation mới nếu đủ thời gian đã trôi qua kể từ lần cuối cùng. TWAP được tính toán bằng cách đọc hai observation và chia Δcumulative / Δtime.
ObservationState đầy đủ là khoảng 4.100 byte sau các trường xung quanh và discriminator.
Hai quy tắc người tiêu dùng:
- Không sử dụng một observation duy nhất làm giá. Nó là một tích lũy, không phải giá spot. Sử dụng hai trong số chúng để tính toán TWAP.
- Chọn observation cách nhau ít nhất một block. Swap trong cùng một block có thể không tạo ra một observation mới; đọc liên tiếp có thể trả về cùng một bản ghi.
products/clmm/accounts.
Vòng đời tài khoản
Các pool CPMM và PDA của chúng không bao giờ được đóng. Ngay cả ở mức thaningliquidity bằng không,
poolState vẫn tồn tại. Điều này là cố ý: tái seeding cùng một pool sau này bảo tồn bộ đệm observation lịch sử của nó và dẫn xuất PDA của nó vẫn ổn định.
Những gì cần đọc ở đâu
- Danh sách tài khoản lệnh (cái nào trong những cái trên có thể ghi/signer cho mỗi lệnh):
products/cpmm/instructions. - Ngữ nghĩa tích lũy phí:
products/cpmm/fees. - Toán học swap / quy tắc cập nhật observation:
products/cpmm/math. - Seed chính tắc / ID chương trình:
reference/program-addresses.

