Documentation Index
Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
Use this file to discover all available pages before exploring further.
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Das Invariant
CPMM erhält das klassische Constant-Product-Invariant auf seinen zwei Vaults: wobeix der Vault0-Saldo nach etwaigen Token-2022-Transfergebühren beim Empfang ist, und analog für y. Jeder Swap muss k' ≥ k hinterlassen, nach Abrechnung der Handelsgebühren, die den LPs gutgeschrieben werden (die Protocol-, Fund- und Creator-Buckets zählen nicht zu k — sie befinden sich im Vault, sind aber vom Kurvenblick ausgeschlossen, siehe Gebühren auf der Kurve unten). k wächst daher im Laufe der Zeit monoton, während LPs Gebühren ansammeln.
LP-Anteile werden nach den Poolreserven bepreist, nicht nach k:
Das Verbrennen von ΔLP LP-Token gibt genau ΔLP × x / lpSupply von Token0 und ΔLP × y / lpSupply von Token1 zurück. Weder die Kurve noch k bewegen sich bei Einzahlungen oder Abhebungen — nur Swaps ändern den Preis.
Gebührenmodell auf dem Swap-Pfad
CPMM wendet zwei unabhängig bewertete Gebühren auf jeden Swap an:- Die Handelsgebühr wird auf der Eingabenseite erhoben, berechnet nach
AmmConfig.trade_fee_rate. Sie wird dann in LP-, Protocol- und Fund-Anteile aufgeteilt (der LP-Anteil bleibt im Vault und lässtkwachsen; die Protocol- und Fund-Anteile werden aus der Vault-Buchhaltung extrahiert). - Die Creator-Gebühr (aktiv nur wenn
enable_creator_fee == true) wird nachAmmConfig.creator_fee_rateberechnet. Sie wird auf der Eingabe- oder Ausgabeseite erhoben, je nachPoolState.creator_fee_onund Swap-Richtung (sieheproducts/cpmm/fees). Sie ist ihr eigener Bucket — nie ein Teil der Handelsgebühr.
FEE_RATE_DENOMINATOR = 1_000_000trade_fee_rate— vonAmmConfig, z.B.2500= 0,25% der relevanten Volumenseitecreator_fee_rate— vonAmmConfig, z.B.1000= 0,10% der relevanten Volumenseiteprotocol_fee_rate,fund_fee_rate— denominiert in Einheiten von1/FEE_RATE_DENOMINATORder Handelsgebühr, nicht des Volumens
protocol_fee + fund_fee + creator_fee-Betrag wird in den Vaults gehalten, aber separat im Pool-Status verfolgt (protocol_fees_token*, fund_fees_token*, creator_fees_token*). Wenn das Constant-Product-Invariant k' ≥ k überprüft, verwendet es Vault-Bilanzen minus alle drei aufgelaufenen, aber nicht eingezogenen Gebühren — sodass LPs nur lp_fee erfassen.
Siehe products/cpmm/fees für die Erfassungsanweisungen und ausgearbeitete numerische Beispiele.
SwapBaseInput (Input-Exact)
„Der Benutzer gibt uns genauamount_in des Input-Mints und erhält mindestens minimum_amount_out des Output-Mints.”
Ignorieren wir Token-2022 für einen Moment:
Δx_net = amount_in_after_trade_fee.
Das Programm aktualisiert dann die Vault-Buchhaltung so, dass der Anteil von trade_fee, der Protocol/Fund/Creator gehört, in „aufgelaufenen” Buckets sitzt (nicht in der nächsten x der Kurve enthalten), während der LP-Anteil x für den nächsten Swap beitritt.
Token-2022 auf der Eingabenseite
Wenn der Input-Mint eine Transfer-Fee-Erweiterung hat, zieht der Mint seine Gebühr bei der Übertragung vom Benutzer → Vault ab. Der Vault empfängt also tatsächlichamount_in − transfer_fee_in(amount_in). Das CPMM-Programm berechnet daher:
amount_in_after_trade_fee aus. Dies ist wichtig, weil der Kurvenkurs aus dem Nettobetrag berechnet wird, der im Vault gelandet ist, nicht aus dem Schlagzahlamount des Benutzers.
Token-2022 auf der Ausgabenseite
Wenn der Output-Mint eine Transfergebühr hat, sendet der Poolamount_out aus seinem Vault zum Benutzer. Der Mint wird dann seine Gebühr auf dem Weg nach draußen abziehen, sodass der Benutzer amount_out − transfer_fee_out(amount_out) erhält. Das Programm berechnet amount_out wie üblich aus der Kurve, aber es ist die Verantwortung des Integrators, die Zahl des Pools „Vault senden” in eine „Benutzer empfangen”-Zahl umzuwandeln, wenn Kurse angezeigt werden.
Slippage-Überprüfung
Nach der Berechnung vonamount_out:
minimum_amount_out gesetzt wird, sodass die Slippage-Konstante in dem Betrag denominiert ist, den der Benutzer tatsächlich erhält, nicht in dem, was der Vault sendet.
SwapBaseOutput (Output-Exact)
„Der Benutzer erhält genauamount_out des Output-Mints und ist bereit, bis zu maximum_amount_in des Input-Mints zu zahlen.”
Inversion der Kurve für Δx_net:
Die Obergrenze ist wichtig — sie garantiert k' ≥ k nach Integer-Kürzung. Dann:
gross_needed erhält.
Slippage-Überprüfung
Ausgearbeitetes Beispiel
Pool-Status, ignorieren Token-2022:x = 1_000_000_000_000(1.000.000,000000 von Token0, 6 Dezimalstellen)y = 2_000_000_000_000(2.000.000,000000 von Token1, 6 Dezimalstellen)AmmConfig:trade_fee_rate = 2500,protocol_fee_rate = 120_000,fund_fee_rate = 40_000,creator_fee_rate = 0
SwapBaseInput mit amount_in = 1_000_000_000 (1.000,000000 von Token0). Creator-Gebühr ist deaktiviert (enable_creator_fee = false).
enable_creator_fee = true mit creator_fee_rate = 1000 (0,10%) auf der Eingabenseite hätte, würde das Programm total_input_fee = ceil(1_000_000_000 * 3500 / 1_000_000) = 3_500_000 berechnen, dann als creator_fee = 1_000_000 und trade_fee = 2_500_000 aufteilen. Die Protocol/Fund/LP-Arithmetik auf trade_fee ist unverändert vom obigen Beispiel — die Creator-Gebühr ist ihr eigener Bucket, aufgelaufen zu creator_fees_token0 und ausgeschlossen von curve_x zusammen mit den Protocol- und Fund-Buckets.
Wenn der Input-Mint eine 1%-Token-2022-Transfergebühr hat, empfängt der Vault 990_000_000 Token statt 1_000_000_000, und jede nachfolgende Berechnung verwendet diesen Nettobetrag.
Regel für die Beobachtungsaktualisierung
Bei jedem Swap bewertet das Programm, ob eine neue Beobachtung in den Ringpuffer gepusht werden soll:- Kumulativer Preis, nicht Spotpreis. Eine einzelne Beobachtung ist kein Preis. Um einen TWAP von Zeit
t0zut1zu erhalten, lesen Sie die Beobachtungen, die dem Ende am nächsten sind, und berechnen Sie(cumulative(t1) − cumulative(t0)) / (t1 − t0). - Proben sind ratenbegrenzt. Back-to-Back-Swaps im selben Slot können eine Beobachtung teilen. Das Lesen einer Beobachtung unmittelbar nach einem Swap kann daher um einen Slot veraltet aussehen — dies ist normal.
products/clmm/accounts.
Gebühren auf der Kurve
Dies ist der subtile Teil und es lohnt sich, ihn hervorzuheben. Die Kurven-Arithmetik arbeitet gegen die Netto-Vault-Bilanzen — d.h. rohes SPL-Saldo minus aufgelaufene Protocol-, Fund- und Creator-Gebühren (alle drei sind unabhängige Buckets — sieheproducts/cpmm/fees). Ein konkretes Bild:
- Zitieren Sie nicht aus rohen Bilanzen. Subtrahieren Sie zuerst die aufgelaufenen Gebührenfelder, oder rufen Sie
SwapBaseInputals Simulation auf und nehmen Sie das Ergebnis. CollectProtocolFeebewegt Token aus dem Vault. Nach der Erfassung sinktraw_vault_balance, abercurve_balancebleibt unverändert; der Poolpreis bewegt sich nicht. Dies ist beabsichtigt.
Präzision und Überläufe
- Alle Kurven-Arithmetiken verwenden
u128-Intermediate, um Überläufe aufx * yzu verhindern. - Division rundet gegen Null, außer für
SwapBaseOutput’sΔx_net, die aufrundet, und Gebührenberechnung, die aufrundet auf dietrade_feeund abrundet auf die Unterteilungen. Diese Rundungsrichtungen werden gewählt, damit das Invariant aufgrund von Integer-Kürzung nicht abnimmt. - Pools mit extremen Vault-Verhältnissen (Milliarden : 1) können bei kleinen Trades auf Präzisions-Untergrenze treffen; das Programm gibt in diesem Fall
ZeroTradingTokenszurück. Siehereference/error-codes.
Nächste Schritte
products/cpmm/fees— die vollständige Gebührenstaffeln- und Erfassungssemantik.products/cpmm/instructions— die Anweisungen, die diese Mathematik aufrufen.algorithms/constant-product— die Herleitung und Grenzfälle vonx · y = k, geteilt über AMM v4 und CPMM.
raydium-io/raydium-cp-swap— Swap-Mathematik instates/curve.rs- Raydium-Auditenberichte, auf die in
security/auditsverwiesen wird


