Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Die Program ID und PDA-Seeds für CPMM sind kanonisch in
reference/program-addresses aufgelistet. Diese Seite konzentriert sich auf wofür jedes Konto da ist und welche Invarianten es aufrechterhält, nicht auf die hartcodierten Adressen.Die sechs Konten eines CPMM-Pools
Jeder CPMM-Pool wird vollständig durch sechs programmabgeleitete Adressen (PDAs) unter dem CPMM-Programm beschrieben, plus ein gemeinsamesAmmConfig-Konto, auf das er verweist. Sobald Sie die beiden Mints haben, können Sie alles deterministisch ableiten, ohne das Netzwerk zu berühren.
Und die gemeinsame Konfiguration:
Ableitung eines Pools aus nichts als zwei Mints
Pool-ID ist nicht immer die kanonische PDA.
Initialize akzeptiert einen beliebigen Unterzeichner-Keypair als pool_state zusätzlich zur obigen PDA. Wenn das übergebene Konto nicht der kanonischen PDA entspricht, erfordert das Programm, dass es ein Unterzeichner ist — d. h., der Ersteller übergibt einen neuen Keypair, den er signiert. Dies ist die Front-Run-Verteidigung: Jeder Dritte, der versucht, die kanonische PDA zu schnappen, kann vom legitimen Ersteller umgangen werden, indem stattdessen ein zufälliger Keypair verwendet wird. Die nachgelagerten PDAs (lpMint, vault0, vault1, observation) werden immer noch von poolState.key() abgeleitet, daher bleiben sie eindeutig für die verwendete Adresse. Wenn Sie Pools indizieren, entdecken Sie die Pool-ID immer aus dem On-Chain-State (z. B. PoolState-Konten unter dem CPMM-Programm), nicht durch Ableitung der kanonischen PDA — letztere werden Zufalls-Keypair-Pools übersehen.Kontenlayouts
Die vollständigen Rust-Definitionen befinden sich in derraydium-cp-swap-Quelle. Die folgenden Felder sind diejenigen, die Sie aus einer Integration lesen werden.
PoolState
lp_supply— die interne Spiegelung des Pools des LP-Mint-Gesamtangebots. Verwenden Sie es für LP-Anteil-Mathematik; der Wert sollte dem On-Chain-Angebot des Mints entsprechen, aber das Lesen ausPoolStatevermeidet einen zusätzlichen Kontenabruf.protocol_fees_token{0,1},fund_fees_token{0,1}— akkumulierte Gebühren, die noch nicht eingezogen wurden. Diese beeinflussen nicht die Swap-Preisgestaltung; sie sitzen in den Vaults, bisCollectProtocolFee/CollectFundFeeaufgerufen wird.status— eine Bitmaske, die steuert, obSwap,Deposit,Withdrawerlaubt sind. Wird vom Admin überUpdatePoolStatusaktualisiert. Das SDK prüft dies vor dem Erstellen einer Transaktion; wenn Sie direkt CPI verwenden, prüfen Sie es selbst.token0_program/token1_program— das Token-Programm, in das für jeden Vault CPI durchgeführt werden soll. Eines kann klassisches SPL Token und das andere Token-2022 sein; sie sind unabhängig.open_time— ein Unix-Zeitstempel. Swaps vor dieser Zeit schlagen fehl. Einzahlungen sind voropen_timeerlaubt, damit der Pool gesät werden kann.creator_fee_on/enable_creator_fee— zusammen steuern, ob die optionale Creator-Gebühr für diesen Pool aktiv ist und von welcher Seite des Swaps sie eingezogen wird.enable_creator_fee == falsesetzt den Creator-Fee-Pfad vollständig auf Null. Wenn aktiviert, wähltcreator_fee_on:0= Gebühr von welchem Token auch immer der Swap-Input ist (BothToken);1= Gebühr nur vontoken_0(überspringen beitoken_1 → token_0Swaps);2= Gebühr nur vontoken_1. Wird bei der Pool-Erstellung überInitializeWithPermissiongesetzt; kann sich später nicht ändern.creator_fees_token_{0,1}— akkumulierte Creator-Gebühren, eingezogen durchCollectCreatorFeeoderCollectCreatorFeePermissionless. Beide Pfade setzen die vollständigen Zähler auf Null; der erlaubnislose Pfad behebt die Empfänger auf die kanonischen ATAs vonpool_creator.
AmmConfig
trade_fee_rateundcreator_fee_ratesind Bruchteile des Volumens, beide in Einheiten von1/1_000_000angegeben.2500bedeutet 0,25 % des Handelsvolumens.protocol_fee_rateundfund_fee_ratesind Bruchteile der Handelsgebühr (nicht des Volumens), mit demselben1/1_000_000-Nenner. Die Creator-Gebühr ist nicht ein Bruchteil der Handelsgebühr — sie ist ihre eigene unabhängige Rate. Die vollständige Arithmetik befindet sich inproducts/cpmm/fees.indexist einu16, daher verwendet der Seed-Hash 2 Bytes Big-Endian. Ein Fehler um eins in der Byte-Reihenfolge ist ein häufiger Integrationsfehler.AmmConfigist auf Pool-Ebene unveränderlich. Ein Pool verweist bei der Erstellung auf eineAmmConfigund wechselt nie. Gebührenänderungen werden verbreitet, weil der Pool die Konfiguration bei jedem Swap liest — aber der Pool kann nicht zwischen Gebühren-Tiers verschoben werden.
creator_fee_rate) lebt auf AmmConfig und wird über das Gebühren-Tier hinweg geteilt. Ob ein bestimmter Pool sie tatsächlich berechnet (enable_creator_fee) und von welcher Seite des Swaps sie landet (creator_fee_on), lebt auf PoolState. Die Creator-Gebühr ist unabhängig von der Handelsgebühr — sie ist ihre eigene Rate, akkumuliert auf ihre eigenen Zähler (creator_fees_token_{0,1}), und reduziert niemals die LP-/Protokoll-/Fonds-Anteile der Handelsgebühr. Das Einziehen erfolgt über CollectCreatorFee oder das zielgerichtete CollectCreatorFeePermissionless. Siehe products/cpmm/fees für die vollständige Mechanik.
Permission
Ein kleines Zugriffskontroll-Konto, das von InitializeWithPermission verwendet wird. Das CPMM-Programm unterstützt einen genehmigten Pool-Erstellungspfad, damit andere Programme (z. B. LaunchLab beim Upgrade eines Tokens zu CPMM) nachweisen können, dass sie berechtigt sind, einen Pool gegen eine bestimmte AmmConfig zu erstellen.
CreatePermissionPda entweder vom CPMM-Admin oder einer dedizierten Permission-PDA-Creator-Authority erstellt. Nur der CPMM-Admin kann sie über ClosePermissionPda widerrufen. Endbenutzer interagieren nicht direkt mit diesem Konto — es ist Rohrleitungen für Cross-Program-Flows. Siehe security/admin-and-multisig für die Rollengrenzen und reference/program-addresses für kanonische Adressen.
Vaults und Token-2022
vault0 und vault1 werden von der CPMM-Authority-PDA besessen, und ihr Token-Programm-Besitzer (token_program) ist entweder SPL Token oder Token-2022, bestimmt bei der Pool-Erstellung durch das Mint-Programm. Der Pool behandelt die beiden Fälle transparent — Sie übergeben die richtige Token-Programm-ID für jede Seite in den Swap / Deposit / Withdraw-Anweisungskonten.
CPMM erzwingt eine strikte Extension-Zulassungsliste bei der Pool-Erstellung (is_supported_mint in utils/token.rs). Ein Token-2022-Mint kann in einem CPMM-Pool verwendet werden, nur wenn jede Extension, die er trägt, auf dieser Liste steht:
TransferFeeConfig. Angewendet vom Mint bei jedem Transfer. Der Pool ist auf der Empfängerseite fürSwapBaseInput-Einzahlungen und auf der Senderseite für Abhebungen. Das Programm berechnet den Netto-Betrag, der im Vault landet, und setzt die Kurve entsprechend. Siehealgorithms/token-2022-transfer-fees.MetadataPointerundTokenMetadata. Standard-On-Mint-Metadaten. Keine Auswirkung auf die Swap-Mathematik.InterestBearingConfig. Der UI-Betrag des Mints sammelt Zinsen an. Der Vault speichert Rohbeträge; die Kurve arbeitet nur mit Rohbeträgen. UIs, die APR anzeigen, sollten die Token-2022-Helfer aufrufen, um den UI-Betrag zu rendern.ScaledUiAmount. UI-Display-Skalierungs-Extension. Gleiche Behandlung wieInterestBearingConfig— die Kurve verwendet Rohbeträge.
PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, usw. — führt dazu, dass Initialize mit NotSupportMint abgelehnt wird. Die Ausnahme ist eine kleine hartcodierte Mint-Zulassungsliste im Programm (eine Handvoll spezifischer Pubkeys), die die Extension-Prüfung umgeht; sie wird verwendet, um spezifische Mints fallweise zu integrieren.
Die überprüfte Extension-Liste und die Mint-Zulassungsliste befinden sich in der CP-Swap-Quelle unter programs/cp-swap/src/utils/token.rs und können sich mit zukünftigen Programm-Upgrades ändern.
Observation
Das Observation-Konto ist ein Ringpuffer vonObservationState-Einträgen, von denen jeder einen block_timestamp und einen kumulativen Preis speichert. Bei jedem Swap hängt das Programm eine neue Observation an, wenn genug Zeit seit der letzten vergangen ist. TWAPs werden berechnet, indem zwei Observations gelesen und Δcumulative / Δtime dividiert werden.
ObservationState-PDA ist nach den umgebenden Feldern und dem Diskriminator etwa 4.100 Bytes.
Zwei Verbraucherregeln:
- Verwenden Sie nicht eine einzelne Observation als Preis. Es ist ein kumulativer, kein Spot-Preis. Verwenden Sie zwei davon, um einen TWAP zu berechnen.
- Wählen Sie Observations mindestens einen Block auseinander. Swaps innerhalb desselben Blocks können keine neue Observation erzeugen; das Zurücklesen kann denselben Datensatz zurückgeben.
products/clmm/accounts.
Konten-Lebenszyklus
CPMM-Pools und ihre PDAs werden nie geschlossen. Auch bei Null-Liquidität bleibt die
poolState bestehen. Dies ist beabsichtigt: Das erneute Seeding desselben Pools später bewahrt seinen historischen Observation-Puffer und seine PDA-Ableitung bleibt stabil.
Was wo zu lesen ist
- Anweisungs-Kontenlisten (welche der obigen sind beschreibbar/Unterzeichner für jede Anweisung):
products/cpmm/instructions. - Gebühren-Akkumulationssemantik:
products/cpmm/fees. - Swap-Mathematik / Observation-Update-Regel:
products/cpmm/math. - Kanonische Seeds / Program IDs:
reference/program-addresses.

