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
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
- Sortiert
mint1/mint2nach Byte-Reihenfolge vor der Ableitung. - Berechnet
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - Erstellt die Accounts
observationundtick_array_bitmap_extension. - Bezahlt die Pool-Erstellungsgebühr, die durch
ammConfigdefiniert ist.
Position in einem gewählten Bereich eröffnen
Quelle:src/clmm/createPosition.ts
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
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).
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
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)
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
SwapV2:
Häufige Fallstricke
- Tick-Endpunkte nicht am Spacing ausgerichtet →
InvalidTickIndex. Verwenden Sie stetsTickUtils.getPriceAndTickzum Ausrichten. - Zu wenige Tick-Arrays in
SwapV2übergeben →TickArrayNotFound. Nutzen SiecomputeAmountOutFormat, 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_x64mitpriceverwechseln → 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
harvestAllRewardsfür viele Positionen im Stapel. - NFT verbrennen, während noch Rent für den Mint aussteht →
ClosePositionschließ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öffnen →
InvalidTickIndex. Quantisieren Sie stets mitTickUtils.getPriceAndTick. decreaseLimitOrderauf einer vollständig ausgeführten Order aufrufen →InvalidOrderPhase. Verwenden Sie stattdessensettleLimitOrderund danachcloseLimitOrder.dynamicFeeConfigIdvergessen, obwohlenableDynamicFee: trueübergeben wird → derCreateCustomizablePool-Revert lautetInvalidDynamicFeeConfigParams. Entweder die dynamische Gebühr deaktivieren oder eine Konfiguration aus/main/clmm-dynamic-configwählen.
Nächste Schritte
sdk-api/typescript-sdk— vollständige SDK-Oberfläche.sdk-api/rest-api— Quote- und Pool-Metadaten-Endpunkte.user-flows/create-clmm-pool— Schritt-für-Schritt-Anleitung ohne Code.integration-guides/aggregator— CLMM als Teil eines Routing-Pfads einbinden.

