Skip to main content
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
Konten (W = schreibbar, S = Unterzeichner) * 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_mint nach Byte-Ordnung).
  • Kein Mint verwendet eine Erweiterung außerhalb der CPMM-Allowlist (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — siehe products/cpmm/accounts. Ein Mint mit einer SupportMintAssociated-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.
  • creator hat mindestens init_amount_0 und init_amount_1 in den jeweiligen ATAs.
  • amm_config.disable_create_pool == false.
Nachbedingungen
  • pool_state existiert mit lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.
  • Der LP-Starter von LOCKED_LP (100 Lamports von LP-Token) ist dauerhaft im Pool gesperrt — pool_state.lp_supply zeichnet liquidity − 100 auf, während 100 LP-Einheiten außerhalb des Umlaufs bleiben, was verhindert, dass der Pool vollständig geleert wird und durch Null geteilt wird.
  • observation_state wird initialisiert; observation_index = 0 und pool_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 = false und creator_fee_on = BothToken. Initialize unterstützt nicht das Aktivieren der Ersteller-Gebühr — dieser Pfad ist InitializeWithPermission.
  • open_time wird auf block_timestamp + 1 erhöht, wenn der Aufrufer einen Wert <= block_timestamp übergeben hat. Swaps werden vor open_time abgelehnt; Deposits und Withdrawals funktionieren sofort.
Häufige Fehler (vollständige Liste in reference/error-codes)
  • InvalidInput — Mints unsortiert oder identisch.
  • NotSupportMint — blockierte Token-2022-Erweiterung.
  • ExceededSlippage — selten; wenn init_amount_0/1 aufgrund von Dezimalstellen-Nichtübereinstimmung zu null LP führen.

Deposit

Fügt Liquidität in beiden Token proportional zum Pool hinzu. Argumente
Konten Mathematik
Keine Änderung an der Proportionalität von 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).
Häufige FehlerExceededSlippage, ZeroTradingTokens, InvalidStatus wenn Deposit pausiert ist.

Withdraw

Verbrennt LP-Token und erhält beide zugrunde liegenden Token anteilsmäßig. Argumente
Konten (Identisch mit Deposit; lp_mint ist schreibbar, weil die LP-Token verbrannt werden.) Mathematik
Nachbedingungen
  • 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
Konten 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_status erlaubt Swap.
  • Kein Mint pausiert oder eingefroren für diese Autorität.
  • amount_in > 0.
Häufige Fehler
  • ExceededSlippageamount_out < minimum_amount_out.
  • ZeroTradingTokens — der Handel rundet auf Null.
  • NotApproved — Pool ist für Swaps über UpdatePoolStatus pausiert.
  • InvalidInput — Mints stimmen nicht mit einem der Pool-Vault-Mints überein.

SwapBaseOutput

Exakte-Ausgabe-Swap. Argumente
Konten — gleich wie SwapBaseInput. Mathematik — inverse Kurve mit Ceiling, siehe products/cpmm/math. Häufige FehlerExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Sammelt aufgelaufene Protokollgebühren aus den Vaults zum Protokoll-Ziel. Argumente — keine. Konten Effekt
Keine Änderung an den effektiven Bilanzen der Kurve (aufgelaufene Gebühren waren bereits ausgeschlossen). Häufiger FehlerNotApproved 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_0 und creator_fees_token_1 aus den Pool-Vaults zu den Ersteller-ATAs.
  • Setzt beide Ersteller-Gebühren-Zähler auf Null und aktualisiert pool_state.recent_epoch.
  • Gibt NoFeeCollect zurück, wenn beide Zähler Null sind.

UpdatePoolStatus

Pausiert oder setzt einzelne Operationen auf einem Pool fort. Das status-Feld ist eine Bitmaske: Argumente
Konten 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
Konten Vorbedingungen
  • Keine bestehende AmmConfig mit demselben index.
  • 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 = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (übergeben Sie Pubkey-Bytes als Reinterpretation)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
Änderungen werden vom Admin signiert und beeinflussen jeden Pool, der an diese 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 FehlerInvalidOwner (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

Quellen: