Skip to main content
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Was dies bewirkt. Erstellt einen neuen CLMM-Pool in der Gebührenklasse Ihrer Wahl und öffnet dann eine initiale konzentrierte Position. Zwei Transaktionen über vier Dateien — config.ts, createPool.ts, createPosition.ts und utils.ts — werden mit npx tsx ausgeführt. Der Code stammt aus den offiziellen Demos in raydium-sdk-V2-demo/src/clmm und wurde für die eigenständige Ausführung angepasst.

Einrichtung

Stellen Sie sicher, dass Sie die Quick-Start-Voraussetzungen gelesen haben und RPC_URL, KEYPAIR sowie die Abhängigkeiten installiert sind. Zusätzlich zu den Abhängigkeiten aus dem Quick Start benötigen Sie:
  • decimal.js — Preis- und Tick-Mathematik in createPool.ts und createPosition.ts.
  • bs58 — dekodiert einen base58-kodierten Keypair in config.ts, wenn Sie KEYPAIR_BS58 statt einer JSON-Schlüsseldatei verwenden.
  • tsx — führt die .ts-Dateien unten direkt über npx tsx aus; anders als die Swap- und CPMM-Skripte ist dies keine einfache .mjs-Datei, die mit node ausgeführt wird.
Die Erstellung eines CLMM-Pools hat eine einmalige Gebühr plus Miete pro Tick-Array für die initiale Position. Sie benötigen auch beide Seed-Mints in Ihrer Wallet — das Öffnen einer Position, wenn der Preis innerhalb des gewählten Bereichs liegt, erfordert Liquidität auf beiden Seiten. Ausführung auf Devnet. Das Ändern von cluster zu "devnet" in config.ts reicht allein nicht aus. createPool.ts übergibt eine explizite programId: CLMM_PROGRAM_ID, eine feste Mainnet-Konstante, die nicht cluster folgt — ersetzen Sie sie durch die auskommentierte DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID-Zeile direkt darüber. createPosition.ts hardcodiert auch eine Mainnet-poolId (den RAY-USDC-Pool); ersetzen Sie sie durch die ID des Devnet-Pools, den Sie in Schritt 2 erstellt haben.

Schritt 1 — config.ts

Speichern Sie als config.ts. Dies hat die gleiche Form wie die src/config.ts.template des Demo-Repos — disableFeatureCheck ist auf true gesetzt (empfohlen für jede nicht-triviale Integration, damit das SDK nicht beim Startup-Feature-Detect blockiert):
config.ts

Schritt 2 — createPool.ts

Speichern Sie neben config.ts. Quelle: src/clmm/createPool.ts.
createPool.ts

Schritt 3 — createPosition.ts

Quelle: src/clmm/createPosition.ts.
createPosition.ts

Schritt 4 — utils.ts

Quelle: src/clmm/utils.ts.
utils.ts

Ausführung

Was ist gerade passiert

Transaktion 1 — raydium.clmm.createPool initialisierte:
  • den Pool-Status bei der kanonischen PDA für (mint1, mint2, ammConfig),
  • token_0_vault und token_1_vault (sortiert nach Mint-Byte-Reihenfolge),
  • den observation-Ringpuffer,
  • die Inline-Tick-Array-Bitmap,
und setzte die initiale sqrt_price_x64 aus Ihrer initialPrice. Transaktion 2 — raydium.clmm.openPositionFromBase öffnete eine konzentrierte Position:
  • prägte ein Positions-NFT in Ihre Wallet (das NFT ist die Position; das Übertragen überträgt die Position),
  • ordnete Tick-Arrays an den unteren und oberen Grenzen zu (einmalige Miete, wenn erste Position in diesen Bereichen; Tick-Arrays werden vom Programm nie geschlossen, daher zahlen nachfolgende Positionen in denselben Arrays keine zusätzliche Miete),
  • hinterlegte inputAmount von mint1 und den entsprechenden Paarungsbetrag von mint2 (berechnet durch PoolUtils.getLiquidityAmountOutFromAmountIn),
  • gutschrieb der Position Liquidität proportional zur Bereichsbreite.
Je enger der Bereich, desto höher die Kapitaleffizienz pro Dollar TVL — und desto schmerzhafter der unerwartete Verlust, wenn der Preis aus dem Bereich driftet. Der oben verwendete Bereich ([0.000001, 100000]) ist praktisch vollständig; verengen Sie ihn, um Gebühren in der Nähe des aktuellen Spot zu konzentrieren.

Auswahl einer Gebührenklasse

clmmConfigs[0] ist die niedrigste Gebührenklasse. Der vollständige Satz wird unter GET https://api-v3.raydium.io/main/clmm-config veröffentlicht: Siehe user-flows/choosing-a-pool-type für eine vollständige Entscheidungsmatrix.

Häufige Fehler

  • Pool already exists for this config — Ein CLMM-Pool existiert bereits für dieses (mint1, mint2, ammConfig)-Tripel. Schlagen Sie die vorhandene Pool-ID nach und überspringen Sie Schritt 2.
  • Insufficient funds for amount B — Ihre Wallet hat den angeforderten Betrag von mintA, aber nicht den entsprechenden mintB. Das Öffnen einer Position, wenn der Preis innerhalb des Bereichs liegt, erfordert Liquidität auf beiden Seiten.
  • Tick out of range — Ihr lowerPrice oder upperPrice liegt außerhalb des darstellbaren Preisbereichs. Verwenden Sie einen vernünftigeren Bereich relativ zum aktuellen Preis.
  • Veralteter Preis — Ein Angebot aus der API kann 5–60 Sekunden alt sein. Wenn executePosition bei Slippage fehlschlägt, kommentieren Sie den getRpcClmmPoolInfo-Block in createPosition.ts aus, um den Live-Preis direkt vor dem Signieren erneut abzurufen.

Vorbehalte

  • Positions-NFT ist Ihr einziger Zugriff. Verlieren Sie das NFT oder übertragen Sie es, verlieren Sie den Zugriff auf die Position. Behandeln Sie es wie einen Schlüssel.
  • Out-of-Range-Positionen verdienen keine Gebühren. Wenn der Preis außerhalb von [lowerPrice, upperPrice] driftet, ist Ihre Position vollständig in einem Asset geparkt und verdient nichts, bis Sie neu ausgleichen.
  • Tick-Array-Miete ist einseitig. Die erste Position, die ein nie initialisiertes Tick-Array berührt, zahlt seine Miete; das Programm stellt keinen Pfad zum Schließen von Tick-Arrays bereit, daher ist diese Miete dauerhaft. Nachfolgende Positionen im selben Array sind kostenlos.

Nächste Schritte

Quellen: