Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Versionsbanner. Alle TypeScript-Demos zielen auf
@raydium-io/raydium-sdk-v2@0.2.64-alpha ab; sie wurden zuletzt gegen 0.2.42-alpha (2026-04) ausgeführt und ihre Aufrufsignaturen wurden am 2026-09-09 gegen die 0.2.64-alpha-Quelle auf Solana mainnet-beta überprüft. Das Rust-CPI-Skelett am Ende zielt auf raydium-clmm im Branch chore/upgrade-anchor, Anchor 1.0.2, denselben Pin wie die CPMM-Seite, sodass beide in einer Crate leben können. master pinnt immer noch 0.32.1. Programm-IDs stammen aus reference/program-addresses über das SDK.Setup
raydium-sdk-V2-demo/src/clmm wider; der GitHub-Link befindet sich neben jedem Abschnitt. Das Bootstrap folgt der config.ts.template des Demo-Repos (Quelle) — disableFeatureCheck: true ist die empfohlene Einstellung für jede nicht-triviale Integration:
Erstellen Sie einen CLMM-Pool
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 Konten
observationundtick_array_bitmap_extension. - Zahlt die von
ammConfigdefinierte Pool-Erstellungsgebühr.
Öffnen Sie eine Position in einem gewählten Bereich
Quelle:src/clmm/createPosition.ts
OpenPosition* weist selbst ein fehlendes Tick-Array zu, auf Kosten des Zahlers.
Erhöhen Sie die Liquidität einer bestehenden Position
Quelle:src/clmm/increaseLiquidity.ts
Verringern Sie die Liquidität (und sammeln Sie gleichzeitig Gebühren)
Quelle:src/clmm/decreaseLiquidity.ts und src/clmm/closePosition.ts
decreaseLiquidity mit liquidity = new BN(0) auf. Die Nebenwirkung der Anweisung ist die Abrechnung von token_fees_owed_{0,1} und reward_amount_owed und deren Übertragung — dies ist die einzige Möglichkeit, eine davon zu sammeln.
Um die Position nach dem Nullstellen der Liquidität und Gebühren vollständig zu schließen, übergeben Sie ownerInfo: { closePosition: true } beim letzten decreaseLiquidity-Aufruf. Das SDK hängt ClosePosition an und verbrennt das NFT.
Für einen direkten Anchor-Client halten Sie die deklarierten Konten unverändert und hängen Sie den Pool an:
poolId bei jedem Close übergeben. CLMM liest es nur, wenn positionNftAccount eingefroren ist, was einen Client-Pfad mit alten und neuen Positionen kompatibel hält.
Sammeln Sie Reward(s)
Quelle:src/clmm/harvestAllRewards.ts
harvestAllRewards durchläuft jede Position in jedem übergebenen Pool, bündelt die Zero-Liquidity-DecreaseLiquidity-Aufrufe, die Gebühren und Rewards abrechnen (plus alle UpdateRewardInfos), und teilt sie bei Bedarf auf Transaktionen auf.
Swap
Quelle:src/clmm/swap.ts
amountCalculated) plus die genaue Kontoliste zurück, die der Swap berührt (accounts).
Übergeben Sie immer die remainingAccounts, die die Simulation zurückgibt: zu wenige und der Swap wird mit NotEnoughTickArrayAccount mitten im Durchlauf rückgängig gemacht; veraltete verschwenden nur Compute.
PoolUtils.computeAmountOutFormat existiert immer noch, benötigt aber eine ComputeClmmPoolInfo (die
computePoolInfo aus getPoolInfoFromRpc, nicht ein API-Pool-Objekt) plus zwei weitere erforderliche
Argumente — tickarrayBitmapExtension und blockTimestamp — und es gibt keine
raydium.clmm.fetchTickArrays-Methode (fetchTickArrays ist eine freie Funktion; die Modul-Level-
Helfer sind PoolUtils.fetchMultiplePoolTickArrays und die tickData / tickArrays von
getPoolInfoFromRpc).Erstellen Sie einen anpassbaren CLMM-Pool
createCustomizablePool ist der Einstiegspunkt, der die dynamischen Gebühren und Single-Sided-Fee-Umschalter zum Zeitpunkt der Pool-Erstellung verfügbar macht. Es nimmt die Form von createPool plus zwei Ergänzungen:
createPool funktioniert weiterhin für den Standard-Gebühren-, kein-dynamisches-Gebühren-Pfad. Verwenden Sie createCustomizablePool, wann immer Sie einen der beiden Schalter benötigen. Siehe products/clmm/instructions für die On-Chain-Kontoliste.
Limit Orders
Eine Limit Order parkt Benutzereingaben bei einem einzelnen Tick und wird FIFO gefüllt, wenn ein Swap diesen Tick kreuzt. Ausgaben werden zum Zeitpunkt der Abrechnung an die ATA des Eigentümers gepusht; der Eigentümer muss nicht online sein, um gefüllt zu werden.Öffnen Sie eine Limit Order
LimitOrderState-PDA aus (owner, nonce PDA, order nonce) ab, erhöht die Pro-Wallet-LimitOrderNonce und fügt die Order in die FIFO-Kohorte bei diesem Tick ein.
Erhöhen / verringern Sie eine offene Order
decreaseLimitOrder kann nur vom ungefüllten Teil der Order entfernen; der gefüllte Teil ist bis zur Abrechnung gesperrt. Beide Anweisungen werden mit InvalidOrderPhase rückgängig gemacht, wenn die Order bereits vollständig gefüllt wurde.
Begleichen Sie eine gefüllte Order
settleLimitOrder liest die unfilled_ratio_x64 der Order gegen den Kohorten-Tracker, berechnet die gefüllte Ausgabe und überträgt sie an die ATA des Eigentümers. Der Eigentümer kann dies selbst aufrufen; limit_order_admin (ein Off-Chain-Betriebswächter) kann es auch im Namen des Eigentümers aufrufen — die Ausgabe geht immer noch an den Eigentümer.
Zum Schließen vollständig abgerechneter Orders zur Rückgewinnung von Miete verwenden Sie closeLimitOrder (einzeln) oder closeAllLimitOrder (Batch). Zum Abrechnen vieler auf einmal packt settleAllLimitOrder so viele SettleLimitOrder-Aufrufe, wie in eine v0-Tx passen.
Auflisten der geparkten Orders eines Wallets (Off-Chain)
totalAmount / filledAmount / pendingSettle unterscheiden die Phasen). Für die Verlaufshistorie 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 verwenden Sie /limit-order/history/event/list-by-pda?pda=….
Rust-CPI-Skelett
SwapV2:
Häufige Fallstricke
- Off-Spacing-Tick-Endpunkte →
TickAndSpacingNotMatch. Immer überTickUtil.getPriceAndTickausrichten (SingularTickUtil). - Nicht genug Tick-Arrays in
SwapV2bereitgestellt →NotEnoughTickArrayAccount. Nehmen Sie die Liste ausswapInternal(...).accounts. - Full-Range-Position ohne Bitmap-Erweiterung → die Erweiterungs-PDA muss beschreibbar sein; das SDK handhabt dies automatisch.
sqrt_price_x64mitpriceverwechseln → eine Faktor-2-Verwirrung hier ist besonders schmerzhaft. Im Zweifelsfall lassen Sie das SDK es aus einem menschenlesbaren Preis berechnen.- Rewards zu eifrig sammeln → jede Sammlung ist ein Zero-Liquidity-
DecreaseLiquidityund kostet eine Transaktion. Batch überharvestAllRewardsüber viele Positionen, und denken Sie daran, dass seinexecute{ sequentially: true }benötigt. - NFT-Konten selbst schließen →
ClosePositionverbrennt das NFT und schließt sein ATA. Es schließt auch ein Token-2022-NFT-Mint; ein klassisches SPL-Token-Mint bleibt bei Angebot Null, weil dieses Programm Mints nicht schließen kann. Schließen Sie unterstützte Konten nicht separat, oder die Anweisung wird rückgängig gemacht. - Öffnen einer Limit Order bei einem nicht-spaced Tick →
TickAndSpacingNotMatch. Immer über den exportiertengetOrderTick-Helfer quantisieren. - Aufrufen von
decreaseLimitOrderbei einer vollständig gefüllten Order →InvalidOrderPhase. Verwenden Sie stattdessensettleLimitOrderdanncloseLimitOrder. - Erwarten eines
enableDynamicFee-Flags → es gibt keines. Das Weglassen vondynamicFeeConfigerstellt einfach einen statischen Gebühren-Pool, stillschweigend und ohne Fehler. Wenn Sie dynamische Gebühren wollten, übergeben Sie diePublicKeydes Config-Kontos, ausgewählt aus/main/clmm-dynamic-config.
Wo es weitergeht
sdk-api/typescript-sdk— vollständige SDK-Oberfläche.sdk-api/rest-api— Quote- und Pool-Metadaten-Endpunkte.user-flows/create-clmm-pool— Nicht-Code-Durchgang.integration-guides/aggregator— Routing CLMM als Teil eines Pfads.

