Skip to main content
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →

Die Invariante

Ein Constant-Product Market Maker (CPMM) verwaltet zwei Reserven x und y und erzwingt:
wobei k das Produkt der Reserven vor dem Trade ist. Bei einem gebührenfreien Markt gilt x · y = k exakt. Mit Gebühren wächst k streng (der LP-Anteil der Gebühr bleibt in den Reserven). Die Invariante ist bewusst geometrisch gestaltet: Sie garantiert, dass unabhängig davon, wie klein eine Reserve wird, die andere unbegrenzt wächst, um sie auszugleichen – das heißt, der Pool kann auf keiner Seite jemals auf Null geleert werden.

Preisbildung

Spotpreis

Der Grenzpreis von y ausgedrückt in x zu jedem Zeitpunkt ist die Tangente der Kurve:
(Herleitung: implizite Differentiation von x · y = k ergibt dy/dx = −y/x; den Betrag ignorierend, |dy/dx| = y/x). Dies ist der Preis, den der Pool für einen infinitesimal kleinen Trade anbietet. Bei jedem endlichen Trade ist der realisierte Preis aufgrund von Slippage entlang der Kurve ungünstiger.

Exact-Input-Swap (geben Sie Δx, erhalten Sie Δy)

Mit Gebühren sei f der Gebührensatz (z. B. f = 0.0025 für 25 Basispunkte). Wenden Sie die Gebühr auf den Input an und verwenden Sie dann die Invariante, um den Output zu berechnen:
Reserven nach dem Trade:
Das vollständige Δx fließt in die Reserven ein. Der LP-Anteil der Gebühr bleibt in x'; der Protokoll-Anteil wird durch einen separaten Buchungsschritt aus der Kurve ausgeschlossen (siehe Gebührenabrechnung-Varianten unten).

Exact-Output-Swap (erhalten Sie Δy, zahlen Sie das minimale Δx)

Δx wird aufgerundet, um sicherzustellen, dass der Pool nicht unterberechnet.

Slippage und Preisauswirkung

Preisauswirkung misst, wie sehr sich der Spotpreis des Pools aufgrund des Trades verschiebt:
Für kleine Δx / x ergibt eine Entwicklung erster Ordnung:
Intuition: Ein 1%-Swap verursacht eine ~2%-Preisauswirkung. Dieser Faktor 2 ist der Grund, warum CPMM-Pools für mittlere Trades „dünn” wirken im Vergleich zu Orderbuch-Märkten – Sie kaufen nicht nur gegen das aktuelle beste Gebot, Sie gehen auch Ihre eigene Grenzpreis-Kurve hinauf. Effektiver Preis, den der Swapper zahlt:
Die Spanne zwischen p_before und effective ist Slippage. On-Chain-Slippage-UI wird normalerweise als (effective − p_before) / p_before ausgedrückt; das SDK’s computeAmountOut gibt sowohl amountOut als auch priceImpact aus diesem Grund zurück.

Invarianten-Überprüfung im Code

Nach einem Swap überprüfen Protokolle erneut:
Jede Verletzung ist ein Programmfehler oder ein arithmetischer Überlauf. Raydiums Swap-Anweisungen machen diese Überprüfung explizit als Nachbedingung:

Gebührenabrechnung-Varianten

Die Invarianten-Überprüfung setzt voraus, dass die LP-Gebühr in den Reserven bleibt. Verschiedene Raydium-Produkte handhaben die Protokoll-, Fonds- und Creator-Komponenten unterschiedlich:

CPMM-Konvention

Gebühren sind u64-Basispunkt-ähnliche Sätze mit einem 1_000_000-Nenner. Die Trade-Gebühr wird in trade_fee_rate (Gesamt) aufgeteilt und dann über protocol_fee_rate, fund_fee_rate, creator_fee_rate unterteilt. Bei jedem Swap:
Die drei Nicht-LP-Anteile sammeln sich in separaten Zählern (protocol_fees_*, fund_fees_*, creator_fees_*) an, die ausgeschlossen sind aus den Reserven, die in der Invariante verwendet werden. So können Gebühren abgerufen werden, ohne die Kurve zu verschieben. Siehe products/cpmm/fees.

AMM v4-Konvention

Gebühren sind numerator / denominator-Verhältnisse mit einem 10_000-Nenner. Die Aufteilung ist bei der Pool-Erstellung festgelegt und auf AmmInfo.fees gespeichert:
pnl_share sammelt sich in state_data.need_take_pnl_* an und wird aus den Reserven ausgeschlossen; lp_share bleibt im Vault. Siehe products/amm-v4/fees. Beide Konventionen bewahren die Invariante auf die gleiche Weise – der Unterschied ist kosmetisch (Nenner + Anzahl der Unterkategorien).

Rundungsregeln

  • Gebührenberechnung rundet auf. Stellt sicher, dass der Pool nie unterberechnet.
  • Ausgabemenge rundet ab. Stellt sicher, dass die Invariante streng gilt (k' > k auch bevor die Gebühr hinzugefügt wird).
  • Exact-Output-Eingabemenge rundet auf. Stellt sicher, dass der Benutzer nicht unterberechnet.
Alle Arithmetik verwendet u128 für die Zwischenprodukte x · Δx, um Überläufe bei großen Reserven zu vermeiden. Endergebnisse werden mit einer Sättigungsprüfung auf u64 zurückgecastet.

Grenzfälle

Leerer Pool

Vor dem ersten Deposit gilt x = y = 0. Swap-Anweisungen lehnen Pre-Deposit ab.

Null-Ausgabe

Wenn Δx klein genug ist, dass das abgerundete Δy 0 ist, wird die Anweisung mit ZeroTradingTokens zurückgewiesen. Dies verhindert die Wertextraktion ohne Zahlung; bedeutet auch, dass Staub-Swaps auf stark unausgeglichenen Pools fehlschlagen.

Staub-LP

Der erste Deposit hat spezielle Behandlung: Er berechnet die anfängliche LP-Versorgung als sqrt(x · y) und verbrennt einen kleinen „Init-Burn”-Betrag (normalerweise 100 LP-Einheiten), um den „First-Depositor-Inflations-Angriff” zu verhindern (bei dem ein Angreifer an den Vault spendet und den LP-Token-Wert aufbläht). Nachfolgende Deposits verwenden Pro-Rata-Mathematik.

Beziehung zu Arbitrage

Der Preis eines CPMM-Pools ändert sich nur durch:
  1. Trades durch den Pool selbst (Benutzer gehen die Kurve entlang).
  2. Spenden (Senden von Tokens an den Vault ohne Swap).
Da Trades den Preis deterministisch mit der Kurve verschieben, erzeugt jeder Pool, dessen Preis vom breiteren Markt abweicht, eine Arbitrage-Gelegenheit. Arbitrageure bringen den Pool-Preis in Erwartung zurück zum Marktpreis. Dies ist der Grund, warum CPMM-Pools sagen, dass sie „einen Preis ohne Oracle anbieten”: Der Markt findet den Preis durch Arbitrage statt dass der Pool ihn extern liest. Die Kehrseite: Der Pool selbst ist die Gegenpartei des Arbitrageurs, daher ist jeder Arbitrage-Gewinn ein LP-Impermanent-Loss (minus der von LPs erfassten Gebühr).

Durchgerechnete Beispiele

Beispiel 1 – kleiner Trade, vernachlässigbarer Slippage

Pool: x = 1_000_000, y = 2_000_000, k = 2·10^12. Gebühr f = 0.0025. Trade Δx = 1_000:
Effektiver Preis: 1000 / 1993.01 ≈ 0.5018. Spot vorher: 0.5. Slippage vs Spot: ~0,35%. Preisauswirkung – die Bewegung des Pool-Spotpreises gemäß der obigen Definition – ist ~0,20%.

Beispiel 2 – mittlerer Trade, sichtbarer Slippage

Gleicher Pool, Δx = 100_000 (10% von x):
Effektiv: 100_000 / 181_405 ≈ 0.5513. Slippage vs Spot: ~10,3%. Preisauswirkung: ~17,3% – nahe an der 2 · 10% = 20%-Faustregel, die die Trade-Gebühr und die Kurven-Inversion leicht darunter ziehen. Die beiden Zahlen werden oft verwechselt: Slippage ist das, was der Swapper relativ zum Spot zahlt, Preisauswirkung ist, wie weit sich das eigene Angebot des Pools bewegt.

Verweise

Quellen:
  • Uniswap v2 Whitepaper – die kanonische Aussage von x · y = k.
  • Raydium CPMM Programmquelle.
  • Raydium AMM v4 Programmquelle.