Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Zusammenfassung der Anweisungen
| Discriminator-Name | Unterzeichner | Funktion |
|---|---|---|
Initialize | Pool-Ersteller | Erstellt einen neuen CPMM-Pool aus zwei Mints und einer AmmConfig. Keine Genehmigung erforderlich; jeder kann aufrufen. Setzt enable_creator_fee = false hardcodiert auf dem neuen Pool. Das pool_state-Konto kann entweder die kanonische PDA oder ein frischer zufälliger Keypair sein (siehe Initialize-Konten). |
InitializeWithPermission | Zahler + Inhaber einer Permission-PDA | Berechtigte Variante von Initialize. Der Aufrufer (payer) muss eine Permission-PDA besitzen, die von seinem eigenen Public Key abgeleitet ist. Wird von Plattformen verwendet, die kontrollierte Pool-Erstellung benötigen (z. B. LaunchLab-Absolventinnen). Ermöglicht dem Aufrufer, creator_fee_on (BothToken / OnlyToken0 / OnlyToken1) zu setzen und erzwingt enable_creator_fee = true auf dem neuen Pool. Das creator-Feld auf pool_state wird auf ein separat übergebenes creator-Konto gesetzt, nicht auf den Zahler. Gleiche kanonische-PDA-oder-zufälliger-Keypair-Flexibilität für pool_state wie Initialize. |
Deposit | LP | Fügt Liquidität in beiden Token hinzu; erhält LP-Token. |
Withdraw | LP | Brennt LP-Token; erhält beide zugrunde liegenden Token anteilig. |
SwapBaseInput | Swapper | Swap mit exaktem Input (amount_in rein, ≥ minimum_amount_out raus). |
SwapBaseOutput | Swapper | Swap mit exaktem Output (≤ maximum_amount_in rein, amount_out raus). |
CollectProtocolFee | protocol_owner (aus AmmConfig) | Sammelt aufgelaufene Protokollgebühren aus Vaults. |
CollectFundFee | fund_owner (aus AmmConfig) | Sammelt aufgelaufene Fondsgebühren aus Vaults. |
CollectCreatorFee | pool_creator | Sammelt aufgelaufene Ersteller-Gebühren (falls aktiviert). |
UpdatePoolStatus | admin | Pausiert / setzt bestimmte Pool-Operationen über eine Bitmaske fort. |
UpdateAmmConfig | admin | Ändert Gebührensätze oder Protokoll-/Fondsbesitzer auf einer AmmConfig. |
CreateAmmConfig | admin | Erstellt eine neue Gebührenklasse (neues AmmConfig-Konto). |
CreatePermissionPda | admin | Prägt eine Permission-PDA, die einer bestimmten Autorität ermöglicht, InitializeWithPermission aufzurufen. |
ClosePermissionPda | admin | Widerruft eine zuvor ausgestellte Permission-PDA. |
status jedes Pools ist ein u8, wobei Bit 0 = Einzahlung deaktiviert, Bit 1 = Abhebung 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 einen rohen u8 und überschreibt den vorhandenen Wert.
Die nächsten Abschnitte gehen auf jede im Detail ein. Die Kontoreihenfolge folgt der CPMM-IDL; das SDK und der Rust-Client in raydium-cp-swap/programs/cp-swap/src/instructions entsprechen dieser Reihenfolge.
Initialize
Erstellt einen neuen CPMM-Pool.
Argumente
| # | Name | W | S | Hinweise |
|---|---|---|---|---|
| 1 | creator | W | S | Zahlt Miete; erfasst als pool_state.pool_creator. |
| 2 | amm_config | Die gewählte Gebührenklasse. | ||
| 3 | authority | Globale CPMM-Autoritäts-PDA. | ||
| 4 | pool_state | W | S* | Wird hier initialisiert. Entweder die kanonische PDA ["pool", amm_config, token_0_mint, token_1_mint] oder ein frischer zufälliger Keypair — wenn nicht die kanonische PDA, verlangt das Programm, dass pool_state unterzeichnet (require_eq!(pool_account_info.is_signer, true)). Der zufällige-Keypair-Pfad ermöglicht einem Ersteller, Front-Running-Versuchen auf der kanonischen PDA auszuweichen. Die nachgelagerten PDAs (lp_mint, vaults, observation_state) werden in jedem Fall von pool_state.key() abgeleitet. |
| 5 | token_0_mint | Sortiert: token_0_mint < token_1_mint. | ||
| 6 | token_1_mint | |||
| 7 | lp_mint | W | Wird hier initialisiert. Autorität auf authority gesetzt. | |
| 8 | creator_token_0 | W | Quell-ATA für init_amount_0. | |
| 9 | creator_token_1 | W | Quell-ATA für init_amount_1. | |
| 10 | creator_lp_token | W | Ziel für LP (wird erstellt, falls fehlend). | |
| 11 | token_0_vault | W | Wird hier initialisiert. Im Besitz von authority. | |
| 12 | token_1_vault | W | ||
| 13 | create_pool_fee | W | Ziel-ATA für die create_pool_fee, die vom Ersteller gezahlt wird. | |
| 14 | observation_state | W | Wird hier initialisiert. | |
| 15 | token_program | SPL Token (für LP-Mint). | ||
| 16 | token_0_program | SPL Token oder Token-2022. | ||
| 17 | token_1_program | SPL Token oder Token-2022. | ||
| 18 | associated_token_program | |||
| 19 | system_program | |||
| 20 | rent |
* pool_state unterzeichnet nur auf dem zufälligen-Keypair-Pfad; der kanonische-PDA-Pfad läuft ohne pool_state-Unterzeichnung.
Vorbedingungen
- Mints sind sortiert (
token_0_mint < token_1_mintnach Byte-Reihenfolge). - Kein Mint verwendet eine Erweiterung außerhalb der CPMM-Zulassungsliste (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — sieheproducts/cpmm/accounts. Eine kleine Pro-Mint-Zulassungsliste im Programm umgeht die Prüfung für Fall-für-Fall-Onboarding. 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 LP-Token) ist dauerhaft im Pool gesperrt —pool_state.lp_supplyerfasstliquidity − 100, während100LP-Einheiten außerhalb des Umlaufs verbleiben und verhindern, dass der Pool vollständig geleert wird und durch Null dividiert. observation_statewird initialisiert;observation_index = 0undpool_id = pool_state.key().create_pool_feeLamports werden vom Ersteller zum Empfänger übertragen und als natives SOL synchronisiert (es ist eine wSOL-ATA).- Die Status-Bitmaske des Pools ist
0(Einzahlung / Abhebung / Swap alle aktiviert). enable_creator_fee = falseundcreator_fee_on = BothToken.Initializeunterstützt nicht die Aktivierung der Ersteller-Gebühr — dieser Pfad istInitializeWithPermission.open_timewird aufblock_timestamp + 1erhöht, wenn der Aufrufer einen Wert<= block_timestampweitergegeben hat. Swaps werden voropen_timeabgelehnt; Einzahlungen und Abhebungen funktionieren sofort.
reference/error-codes)
InvalidInput— Mints unsortiert oder identisch.NotSupportMint— blockierte Token-2022-Erweiterung.ExceededSlippage— selten; wenninit_amount_0/1aufgrund von Dezimalstellen-Abweichung zu null LP führt.
Deposit
Fügt Liquidität in beiden Token anteilig zum Pool hinzu.
Argumente
| # | Name | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | authority | ||
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | ||
| 10 | token_program_2022 | ||
| 11 | vault_0_mint | ||
| 12 | vault_1_mint | ||
| 13 | lp_mint | W |
k — sowohl Vaults als auch lp_supply skalieren um denselben Faktor.
Nachbedingungen
lp_supply += lp_token_amount.vault_0 += needed_token_0(netto der Token-2022-Transfergebühr für Input, falls vorhanden).vault_1 += needed_token_1(netto der Token-2022-Transfergebühr für Input, falls vorhanden).
ExceededSlippage, ZeroTradingTokens, InvalidStatus, falls Einzahlung pausiert ist.
Withdraw
Brennt LP-Token und empfängt beide zugrunde liegenden Token anteilig.
Argumente
| # | Name | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | authority | ||
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | ||
| 10 | token_program_2022 | ||
| 11 | vault_0_mint | ||
| 12 | vault_1_mint | ||
| 13 | lp_mint | W |
Deposit; lp_mint ist schreibbar, da die LP-Token gebrannt werden.)
Mathematik
lp_supply -= lp_token_amount.- Vaults senden
out_token_0/out_token_1(brutto; der Benutzer erhält netto der Token-2022-Transfergebühr, falls vorhanden).
SwapBaseInput
Swap mit exaktem Input.
Argumente
| # | Name | W | S |
|---|---|---|---|
| 1 | payer | S | |
| 2 | authority | ||
| 3 | amm_config | ||
| 4 | pool_state | W | |
| 5 | input_token_account | W | |
| 6 | output_token_account | W | |
| 7 | input_vault | W | |
| 8 | output_vault | W | |
| 9 | input_token_program | ||
| 10 | output_token_program | ||
| 11 | input_token_mint | ||
| 12 | output_token_mint | ||
| 13 | observation_state | W |
token_0 / token_1 des Pools. Das Programm bestimmt, 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 pausiert für Swaps viaUpdatePoolStatus.InvalidInput— Mints stimmen mit keinem der Pool-Vault-Mints überein.
SwapBaseOutput
Swap mit exaktem Output.
Argumente
SwapBaseInput.
Mathematik — umgekehrte Kurve mit Obergrenze, 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
| # | Name | W | S | |
|---|---|---|---|---|
| 1 | owner | S | Muss amm_config.protocol_owner entsprechen. | |
| 2 | authority | |||
| 3 | pool_state | W | ||
| 4 | amm_config | |||
| 5 | token_0_vault | W | ||
| 6 | token_1_vault | W | ||
| 7 | vault_0_mint | |||
| 8 | vault_1_mint | |||
| 9 | recipient_token_0_account | W | ||
| 10 | recipient_token_1_account | W | ||
| 11 | token_program | |||
| 12 | token_program_2022 |
NotApproved, falls Unterzeichner nicht protocol_owner ist.
CollectFundFee
Gleiche Form wie CollectProtocolFee, aber unterzeichnet von fund_owner und setzt die fund_fees_*-Zähler auf Null.
CollectCreatorFee
Gleiche Form nochmals, unterzeichnet von pool_state.pool_creator. Emittiert Transfers nur, wenn der Pool mit einem Ersteller-Gebührensatz ungleich Null initialisiert wurde.
UpdatePoolStatus
Pausiert oder setzt einzelne Operationen auf einem Pool fort. Das status-Feld ist eine Bitmaske:
| Bit | Flag | Effekt, wenn gesetzt |
|---|---|---|
| 0 | DEPOSIT_DISABLED | Deposit lehnt mit NotApproved ab. |
| 1 | WITHDRAW_DISABLED | Withdraw lehnt ab. |
| 2 | SWAP_DISABLED | SwapBaseInput / SwapBaseOutput lehnen ab. |
| # | Name | W | S | |
|---|---|---|---|---|
| 1 | authority | S | Muss dem Admin-Schlüssel im CPMM-Programm entsprechen. | |
| 2 | pool_state | W |
security/admin-and-multisig.
CreateAmmConfig
Erstellt eine neue Gebührenklasse.
Argumente
| # | Name | W | S | |
|---|---|---|---|---|
| 1 | owner | W | S | Admin. |
| 2 | amm_config | W | Wird hier initialisiert. | |
| 3 | system_program |
- Keine existierende
AmmConfigmit demselbenindex. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
UpdateAmmConfig
Ändert Gebührensätze oder Eigentümerschaft auf einer existierenden AmmConfig. Nimmt einen param: u8 (Diskriminator für das zu aktualisierende Feld) und einen value: u64. Die Wert-Semantik pro Param 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.
Zustandsänderungs-Matrix
| Anweisung | lp_supply | Vault-Bilanzen | Aufgelaufene-Gebühren-Felder | observation |
|---|---|---|---|---|
Initialize | + init LP | + init_amount_{0,1} | 0 | init |
InitializeWithPermission | + init LP | + init_amount_{0,1} | 0 | init |
Deposit | + | + beide | — | — |
Withdraw | − | − beide | — | — |
SwapBaseInput | — | + in, − out | + trade_fee aufgeteilt in Protokoll/Fonds; + creator_fee, falls aktiviert | + (falls Intervall verstrichen) |
SwapBaseOutput | — | + in, − out | + trade_fee aufgeteilt in Protokoll/Fonds; + creator_fee, falls aktiviert | + (falls Intervall verstrichen) |
CollectProtocolFee | — | − (nach Protokoll-Buckets) | protocol_* → 0 | — |
CollectFundFee | — | − (nach Fonds-Buckets) | fund_* → 0 | — |
CollectCreatorFee | — | − (nach Ersteller-Buckets) | creator_* → 0 | — |
UpdatePoolStatus | — | — | — | — |
Weitere Ressourcen
products/cpmm/code-demos— ausführbare TypeScript-Beispiele für das Obige.reference/error-codes— die vollständige Anchor-Fehler-Tabelle.products/cpmm/fees— das Gebühren-Auflösungs-Modell, dasCollectProtocolFee/CollectFundFee/CollectCreatorFeeleert.

