Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Diese Seite ist die maßgebliche Anweisungsreferenz. Für Code, der diese Anweisungen tatsächlich zusammensetzt, siehe
products/cpmm/code-demos. Für Fehlercodes siehe reference/error-codes.Das Programm-Upgrade 2026-09 hat CPMM auf Anchor 1.0.2 / Solana 3.1.10 neu aufgebaut, die Admin-Anweisung CollectExcessLamports hinzugefügt, die hardcodierte Token-2022-Mint-Whitelist entfernt und geändert, was CreateAmmConfig in protocol_owner / fund_owner schreibt. Keine benutzergerichtete Anweisung hat ihre Konten, Argumente oder Mathematik geändert. Siehe den Changelog-Eintrag vom 2026-09-09.Anweisungsübersicht
Status-Bitmaske: Der
status jedes Pools ist ein u8, wobei Bit 0 = Deposit deaktiviert, Bit 1 = Withdraw deaktiviert, Bit 2 = Swap deaktiviert (PoolStatusBitIndex { Deposit, Withdraw, Swap } im Programm). Ein gelöschtes Bit bedeutet, die Operation ist erlaubt; ein gesetztes Bit bedeutet, sie ist pausiert. UpdatePoolStatus nimmt ein rohes u8 und überschreibt den vorhandenen Wert.
Die nächsten Abschnitte gehen durch jede im Detail. Die Kontoordnung folgt der CPMM-IDL; das SDK und der Rust-Client in raydium-cp-swap/programs/cp-swap/src/instructions entsprechen dieser Ordnung.
Initialize
Erstellt einen neuen CPMM-Pool.
Argumente
* pool_state signiert nur auf dem zufälligen-Keypair-Pfad; der kanonische-PDA-Pfad läuft ohne pool_state-Signatur.
Vorbedingungen
- Mints sind sortiert (
token_0_mint < token_1_mintnach Byte-Ordnung). - Kein Mint verwendet eine Erweiterung außerhalb der CPMM-Allowlist (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — sieheproducts/cpmm/accounts. Ein Mint mit einerSupportMintAssociated-PDA (Seed[b"support_mint", mint]) überspringt die Prüfung; diese Registrierung ist die einzige Umgehung, seit das 2026-09-Upgrade die hardcodierte Vier-Mint-Whitelist entfernt hat. creatorhat mindestensinit_amount_0undinit_amount_1in den jeweiligen ATAs.amm_config.disable_create_pool == false.
pool_stateexistiert mitlp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- Der LP-Starter von
LOCKED_LP(100Lamports von LP-Token) ist dauerhaft im Pool gesperrt —pool_state.lp_supplyzeichnetliquidity − 100auf, während100LP-Einheiten außerhalb des Umlaufs bleiben, was verhindert, dass der Pool vollständig geleert wird und durch Null geteilt wird. observation_statewird initialisiert;observation_index = 0undpool_id = pool_state.key().create_pool_fee-Lamports werden vom Ersteller zum Empfänger übertragen und als natives SOL synchronisiert (es ist eine wSOL-ATA).- Die Status-Bitmaske des Pools ist
0(Deposit / Withdraw / Swap alle aktiviert). enable_creator_fee = falseundcreator_fee_on = BothToken.Initializeunterstützt nicht das Aktivieren der Ersteller-Gebühr — dieser Pfad istInitializeWithPermission.open_timewird aufblock_timestamp + 1erhöht, wenn der Aufrufer einen Wert<= block_timestampübergeben hat. Swaps werden voropen_timeabgelehnt; Deposits und Withdrawals funktionieren sofort.
reference/error-codes)
InvalidInput— Mints unsortiert oder identisch.NotSupportMint— blockierte Token-2022-Erweiterung.ExceededSlippage— selten; wenninit_amount_0/1aufgrund von Dezimalstellen-Nichtübereinstimmung zu null LP führen.
Deposit
Fügt Liquidität in beiden Token proportional zum Pool hinzu.
Argumente
Mathematik
k — beide Vaults und lp_supply skalieren um denselben Faktor.
Nachbedingungen
lp_supply += lp_token_amount.vault_0 += needed_token_0(netto von Token-2022-Transfergebühr auf Eingabe).vault_1 += needed_token_1(netto von Token-2022-Transfergebühr auf Eingabe).
ExceededSlippage, ZeroTradingTokens, InvalidStatus wenn Deposit pausiert ist.
Withdraw
Verbrennt LP-Token und erhält beide zugrunde liegenden Token anteilsmäßig.
Argumente
(Identisch mit
Deposit; lp_mint ist schreibbar, weil die LP-Token verbrannt werden.)
Mathematik
lp_supply -= lp_token_amount.- Vaults senden
out_token_0/out_token_1(brutto; der Benutzer erhält netto von Token-2022-Transfergebühr).
SwapBaseInput
Exakte-Eingabe-Swap.
Argumente
Die Ordnung Eingabe → Ausgabe ist nach der Richtung des Benutzers, nicht nach dem kanonischen
token_0 / token_1 des Pools. Das Programm ermittelt, welcher Vault welcher ist, durch Abgleich der Mints.
Mathematik — siehe products/cpmm/math.
Vorbedingungen
open_time <= now.pool_statuserlaubt Swap.- Kein Mint pausiert oder eingefroren für diese Autorität.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— der Handel rundet auf Null.NotApproved— Pool ist für Swaps überUpdatePoolStatuspausiert.InvalidInput— Mints stimmen nicht mit einem der Pool-Vault-Mints überein.
SwapBaseOutput
Exakte-Ausgabe-Swap.
Argumente
SwapBaseInput.
Mathematik — inverse Kurve mit Ceiling, siehe products/cpmm/math.
Häufige Fehler — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
Sammelt aufgelaufene Protokollgebühren aus den Vaults zum Protokoll-Ziel.
Argumente — keine.
Konten
Effekt
NotApproved wenn Unterzeichner nicht protocol_owner ist.
CollectFundFee
Gleiche Form wie CollectProtocolFee, aber signiert von fund_owner und setzt die fund_fees_*-Zähler auf Null.
CollectCreatorFee
Signiert von pool_state.pool_creator. Es überträgt die vollständigen creator_fees_token_0- und creator_fees_token_1-Bilanzen auf die Token-Konten des Erstellers, setzt dann beide Zähler auf Null. Es gibt NoFeeCollect zurück, wenn beide Zähler Null sind.
CollectCreatorFeePermissionless
Jeder kann die Ersteller-Gebührensammlung auslösen. Die Anweisung sendet immer die vollständigen aufgelaufenen Bilanzen an die kanonischen zugeordneten Token-Konten, die pool_state.pool_creator gehören; der Aufrufer kann keinen anderen Ersteller oder Ziel wählen. Wenn eine ATA fehlt, finanziert der Zahler ihre Erstellung.
Das ursprüngliche CollectCreatorFee bleibt aufrufbar, sodass bestehende Clients kompatibel bleiben.
Argumente — keine.
Konten
Effekt
- Überträgt alle
creator_fees_token_0undcreator_fees_token_1aus den Pool-Vaults zu den Ersteller-ATAs. - Setzt beide Ersteller-Gebühren-Zähler auf Null und aktualisiert
pool_state.recent_epoch. - Gibt
NoFeeCollectzurück, wenn beide Zähler Null sind.
UpdatePoolStatus
Pausiert oder setzt einzelne Operationen auf einem Pool fort. Das status-Feld ist eine Bitmaske:
Argumente
Der Admin-Schlüssel ist die Upgrade-Autorität des CPMM-Programms — in der Praxis das Raydium-Multisig. Siehe
security/admin-and-multisig.
CreateAmmConfig
Erstellt eine neue Gebührenstufe.
Argumente
Vorbedingungen
- Keine bestehende
AmmConfigmit demselbenindex. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
Geändert in 2026-09: Die Gebührenbesitzer der neuen Config stammen nicht mehr vom Unterzeichner.
create_amm_config schreibt jetzt die hardcodierten protocol_fee_owner::ID des Programms in protocol_owner und fund_fee_owner::ID in fund_owner, anstatt den Schlüssel des Admin-Unterzeichners in beide zu kopieren. Adressen sind in reference/program-addresses.Konsequenzen: Eine neu erstellte AmmConfig wird sofort von den dedizierten Gebühren-Wallets geleert, anstatt vom Admin-Schlüssel, und der Admin kann nicht von einer Config, die er gerade erstellt hat, sammeln, ohne das Feld zuerst zu rotieren. Bestehende AmmConfig-Konten werden nicht umgeschrieben — was auf ihnen gespeichert ist, regiert immer noch, also lesen Sie protocol_owner / fund_owner immer vom Konto ab, anstatt einen Wert anzunehmen. UpdateAmmConfig-Parameter 3 und 4 rotieren sie immer noch.UpdateAmmConfig
Ändert Gebührensätze oder Besitz auf einer bestehenden AmmConfig. Nimmt einen param: u8 (Diskriminator für welches Feld zu aktualisieren) und einen value: u64. Die Wert-Semantik pro Parameter sind in der Quelle; häufig:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(übergeben SiePubkey-Bytes als Reinterpretation)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig gebunden ist beim nächsten Swap. Keine Migration; Pools lesen einfach die neuen Werte.
CollectExcessLamports
Admin-Sammlung von Lamports, die über dem Rent-Exempt-Minimum auf Konten sitzen, die CPMM kontrolliert. Hinzugefügt im 2026-09-Upgrade, damit das Protokoll die Überfinanzierung zurückfordern kann, die die SIMD-0437-Rent-Reduktion auf Konten hinterlässt, die vor jedem Schritt erstellt wurden.
Nur der Überschuss bewegt sich. Token-Bilanzen, Kontodaten, Besitzer, Pool-Status und die Kurve bleiben unverändert, und die Anweisung ist ein No-Op gegen ein Konto, das bereits bei seinem Minimum ist — daher ist es sicher, nach jedem Rollout-Schritt erneut auszuführen.
Argumente — keine.
Konten
Wie jedes Quellkonto behandelt wird
Das Programm verteilt basierend auf dem
owner des Quellkontos:
Da es eine unbegrenzte
remaining_accounts-Liste nimmt, ist die Transaktionsgröße die echte Grenze — die gleiche Einschränkung wie die Wallet-seitige Sammlung, die in solana-fundamentals/rent-and-reclaimable-rent beschrieben ist.
Häufige Fehler — InvalidOwner (6001, falscher Unterzeichner), LamportsCalculateError (6015, die wSOL-Rundreise nettete nicht zu Null), und InsufficientFunds aus dem Programm-eigenen Pfad, wenn ein Konto weniger als sein eigenes Rent-Minimum hält.
Kein SDK-Builder. @raydium-io/raydium-sdk-v2 liefert keinen Builder für diese Anweisung, und auch das raydium-sdk-V2-demo-Repo nicht — es ist ein Admin-Pfad. Codieren Sie es von Hand, wie die Wallet-seitige Sammlung in solana-fundamentals/rent-and-reclaimable-rent für die Token-Programm-Anweisung.
Zustandsänderungs-Matrix
Nächste Schritte
products/cpmm/code-demos— ausführbare TypeScript-Beispiele für die obigen.reference/error-codes— die vollständige Anchor-Fehlertabelle.products/cpmm/fees— das Gebühren-Aufzinsungs-Modell, das dieCollect*Fee-Anweisungen leeren.

