Skip to main content
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Versionshinweis. Alle Demos richten sich an @raydium-io/raydium-sdk-v2@0.2.42-alpha gegen Solana mainnet-beta, verifiziert April 2026. Program IDs stammen aus reference/program-addresses via das SDK.

Setup

Jedes Demo auf dieser Seite entspricht einer Datei in raydium-sdk-V2-demo/src/clmm; der GitHub-Link steht jeweils neben dem entsprechenden Abschnitt. Das Bootstrap-Setup folgt der config.ts.template des Demo-Repos (Quelle) — disableFeatureCheck: true ist die empfohlene Einstellung für jede nicht-triviale Integration:

CLMM-Pool erstellen

Quelle: src/clmm/createPool.ts
Das SDK:
  • Sortiert mint1/mint2 nach Byte-Reihenfolge vor der Ableitung.
  • Berechnet sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64).
  • Erstellt die Accounts observation und tick_array_bitmap_extension.
  • Bezahlt die Pool-Erstellungsgebühr, die durch ammConfig definiert ist.

Position in einem gewählten Bereich eröffnen

Quelle: src/clmm/createPosition.ts
Das SDK berechnet automatisch, welche Tick-Arrays der Bereich berührt, und bündelt InitTickArray-Instruktionen, falls noch nicht initialisierte Arrays vorhanden sind.

Liquidität einer bestehenden Position erhöhen

Quelle: src/clmm/increaseLiquidity.ts

Liquidität verringern (und gleichzeitig Gebühren einsammeln)

Quelle: src/clmm/decreaseLiquidity.ts und src/clmm/closePosition.ts
Um ausschließlich Gebühren einzusammeln, rufen Sie decreaseLiquidity mit liquidity = new BN(0) auf. Der Nebeneffekt der Instruktion besteht darin, tokens_fees_owed_{0,1} abzurechnen und auszuzahlen. Um die Position vollständig zu schließen, nachdem Liquidität und Gebühren auf null gesetzt wurden, übergeben Sie closePosition: true beim letzten decreaseLiquidity-Aufruf. Das SDK hängt ClosePosition an und verbrennt das NFT.

Reward(s) einsammeln

Quelle: src/clmm/harvestAllRewards.ts
harvestAllRewards durchläuft jede Position in jedem übergebenen Pool, bündelt CollectReward- (und ggf. UpdateRewardInfos-) Instruktionen und verteilt sie bei Bedarf auf mehrere Transaktionen.

Swap

Quelle: src/clmm/swap.ts
computeAmountOutFormat durchläuft die Tick-Map off-chain mit derselben Logik wie das On-Chain-Programm und gibt zurück:
  • den erwarteten Ausgabebetrag,
  • den Mindestausgabebetrag nach Slippage,
  • die Liste der Tick-Array-Accounts, die der eigentliche Swap berühren wird (remainingAccounts).
Übergeben Sie stets die von der Simulation zurückgegebenen remainingAccounts: Werden zu wenige übergeben, bricht der Swap mittendrin mit TickArrayNotFound ab; veraltete Accounts verschwenden Compute-Budget.

Anpassbaren CLMM-Pool erstellen

createCustomizablePool ist der neue Einstiegspunkt, der zum Zeitpunkt der Pool-Erstellung die Optionen für dynamische Gebühren und einseitige Gebühren zugänglich macht. Die Signatur entspricht createPool zuzüglich drei weiterer Felder:
createPool funktioniert weiterhin für den Standardpfad ohne dynamische Gebühren, ohne Limit-Orders und ohne Sonderoptionen. Verwenden Sie createCustomizablePool, sobald Sie eine der drei neuen Optionen benötigen. Die On-Chain-Account-Liste finden Sie unter products/clmm/instructions.

Limit-Orders

Eine Limit-Order parkt den Benutzerinput an einem einzigen Tick und wird FIFO ausgeführt, sobald ein Swap diesen Tick kreuzt. Die Ausgaben werden zum Abrechnungszeitpunkt an die ATA des Eigentümers übertragen; der Eigentümer muss dafür nicht online sein.

Limit-Order eröffnen

Das SDK leitet die LimitOrderState-PDA aus (pool, owner, tick, nonce) ab, erhöht den LimitOrderNonce je (Pool, Eigentümer) und fügt die Order in die FIFO-Kohorte an diesem Tick ein.

Offene Order erhöhen / verringern

decreaseLimitOrder kann nur den nicht ausgeführten Teil der Order verringern; der bereits ausgeführte Teil ist bis zur Abrechnung gesperrt. Beide Instruktionen schlagen mit InvalidOrderPhase fehl, wenn die Order bereits vollständig ausgeführt wurde.

Ausgeführte Order abrechnen

settleLimitOrder liest das unfilled_ratio_x64 der Order gegen den Kohortentracker, berechnet den ausgeführten Ausgabebetrag und überträgt ihn an die ATA des Eigentümers. Der Eigentümer kann dies selbst aufrufen; limit_order_admin (ein Off-Chain-Keeper) kann es ebenfalls im Namen des Eigentümers aufrufen — die Ausgabe geht dennoch an den Eigentümer. Um vollständig abgerechnete Orders zu schließen und die Rent zurückzuerhalten, verwenden Sie closeLimitOrder (einzeln) oder closeAllLimitOrder (stapelweise). Zum gleichzeitigen Abrechnen mehrerer Orders packt settleAllLimitOrder so viele SettleLimitOrder-Aufrufe in eine v0-Transaktion, wie hineinpassen.

Geparkte Orders einer Wallet auflisten (Off-Chain)

Der Aktiv-Orders-Endpunkt gibt sowohl nicht ausgeführte als auch teilweise ausgeführte Orders in einer Nutzlast zurück (totalAmount / filledAmount / pendingSettle unterscheiden die Phasen). Für den Verlauf geschlossener Orders verwenden Sie /limit-order/history/order/list-by-user?wallet=… (pro Wallet, paginiert nach nextPageId); für das vollständige Ereignisprotokoll einer bestimmten Order nutzen Sie /limit-order/history/event/list-by-pda?pda=….

Rust-CPI-Gerüst

Reihenfolge der Remaining Accounts für SwapV2:
Wird die Extension beim Swap nicht benötigt, kann sie weggelassen werden; andernfalls ist sie der erste Remaining Account.

Häufige Fallstricke

  • Tick-Endpunkte nicht am Spacing ausgerichtetInvalidTickIndex. Verwenden Sie stets TickUtils.getPriceAndTick zum Ausrichten.
  • Zu wenige Tick-Arrays in SwapV2 übergebenTickArrayNotFound. Nutzen Sie computeAmountOutFormat, um die vollständige Liste zu erhalten.
  • Full-Range-Position ohne Bitmap-Extension → die Extension-PDA muss beschreibbar sein; das SDK kümmert sich automatisch darum.
  • sqrt_price_x64 mit price verwechseln → ein Faktor-2-Fehler ist hier besonders schmerzhaft. Im Zweifelsfall das SDK den Wert aus einem menschenlesbaren Preis berechnen lassen.
  • Rewards zu häufig einsammeln → jedes Einsammeln kostet eine Transaktion. Verwenden Sie harvestAllRewards für viele Positionen im Stapel.
  • NFT verbrennen, während noch Rent für den Mint ausstehtClosePosition schließt auch den NFT-Mint und die ATA; schließen Sie diese nicht separat, da das Programm sonst abbricht.
  • Limit-Order an einem nicht ausgerichteten Tick eröffnenInvalidTickIndex. Quantisieren Sie stets mit TickUtils.getPriceAndTick.
  • decreaseLimitOrder auf einer vollständig ausgeführten Order aufrufenInvalidOrderPhase. Verwenden Sie stattdessen settleLimitOrder und danach closeLimitOrder.
  • dynamicFeeConfigId vergessen, obwohl enableDynamicFee: true übergeben wird → der CreateCustomizablePool-Revert lautet InvalidDynamicFeeConfigParams. Entweder die dynamische Gebühr deaktivieren oder eine Konfiguration aus /main/clmm-dynamic-config wählen.

Nächste Schritte

Quellen: