Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Ce que cela fait. Crée un nouveau pool CLMM au niveau de frais de votre choix, puis ouvre une position concentrée initiale. Deux transactions réparties sur quatre fichiers — config.ts, createPool.ts, createPosition.ts et utils.ts — à exécuter avec npx tsx. Le code provient des démos officielles dans raydium-sdk-V2-demo/src/clmm et a été adapté pour fonctionner de manière autonome.

Configuration

Assurez-vous d’avoir lu les prérequis du démarrage rapide et que vous disposez de RPC_URL, KEYPAIR et des dépendances installées. En plus des dépendances du démarrage rapide, vous avez besoin de :
  • decimal.js — calculs de prix et de tick dans createPool.ts et createPosition.ts.
  • bs58 — décode une clé secrète encodée en base58 dans config.ts si vous utilisez KEYPAIR_BS58 au lieu d’un fichier JSON.
  • tsx — exécute directement les fichiers .ts ci-dessous via npx tsx ; contrairement aux scripts de swap et CPMM, celui-ci n’est pas un fichier .mjs ordinaire exécuté avec node.
La création d’un pool CLMM entraîne des frais uniques plus un loyer par tableau de ticks pour la position initiale. Vous devez également avoir les deux mints de départ dans votre portefeuille — ouvrir une position quand le prix se situe dans la plage choisie nécessite de la liquidité des deux côtés. Exécution sur devnet. Changer cluster en "devnet" dans config.ts ne suffit pas à lui seul. createPool.ts passe un programId: CLMM_PROGRAM_ID explicite, une constante mainnet fixe qui ne suit pas cluster — remplacez-le par la ligne DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID commentée juste au-dessus. createPosition.ts code également en dur un poolId mainnet (le pool RAY-USDC) ; remplacez-le par l’ID du pool devnet que vous avez créé à l’étape 2.

Étape 1 — config.ts

Enregistrez sous config.ts. Cela a la même structure que le src/config.ts.template du dépôt de démo — disableFeatureCheck est forcé à true (recommandé pour toute intégration non triviale afin que le SDK ne soit pas bloqué par son appel de détection de fonctionnalités au démarrage) :
config.ts

Étape 2 — createPool.ts

Enregistrez aux côtés de config.ts. Source : src/clmm/createPool.ts.
createPool.ts

Étape 3 — createPosition.ts

Source : src/clmm/createPosition.ts.
createPosition.ts

Étape 4 — utils.ts

Source : src/clmm/utils.ts.
utils.ts

Exécution

Ce qui vient de se passer

Transaction 1 — raydium.clmm.createPool a initialisé :
  • l’état du pool au PDA canonique pour (mint1, mint2, ammConfig),
  • token_0_vault et token_1_vault (triés par ordre d’octets du mint),
  • la mémoire tampon de l’anneau observation,
  • la bitmap du tableau de ticks en ligne,
et a défini le sqrt_price_x64 initial à partir de votre initialPrice. Transaction 2 — raydium.clmm.openPositionFromBase a ouvert une position concentrée :
  • a frappé un NFT de position dans votre portefeuille (le NFT est la position ; le transférer transfère la position),
  • a alloué des tableaux de ticks aux limites inférieure et supérieure (loyer unique si première position dans ces plages ; les tableaux de ticks ne sont jamais fermés par le programme, donc les positions ultérieures dans les mêmes tableaux ne paient pas de loyer supplémentaire),
  • a déposé inputAmount de mint1 et le montant de la paire correspondante de mint2 (calculé par PoolUtils.getLiquidityAmountOutFromAmountIn),
  • a crédité la position avec une liquidité proportionnelle à la largeur de la plage.
Plus la plage est étroite, plus l’efficacité du capital par dollar de TVL est élevée — et plus la perte impermanente est douloureuse quand le prix sort de la plage. La plage utilisée ci-dessus ([0.000001, 100000]) est effectivement pleine plage ; resserrez-la pour concentrer les frais près du spot actuel.

Choix d’un niveau de frais

clmmConfigs[0] est le niveau de frais le plus bas. L’ensemble complet est publié à GET https://api-v3.raydium.io/main/clmm-config : Consultez user-flows/choosing-a-pool-type pour une matrice de décision complète.

Erreurs courantes

  • Pool already exists for this config — Un pool CLMM existe déjà pour ce triplet (mint1, mint2, ammConfig). Recherchez l’ID du pool existant et ignorez l’étape 2.
  • Insufficient funds for amount B — Votre portefeuille a le montant demandé de mintA mais pas le mintB correspondant. Ouvrir une position quand le prix se situe dans la plage nécessite de la liquidité des deux côtés.
  • Tick out of range — Votre lowerPrice ou upperPrice sort de la plage de prix représentable. Utilisez une plage plus raisonnable par rapport au prix actuel.
  • Prix obsolète — Un devis de l’API peut être obsolète de 5 à 60 secondes. Si executePosition échoue sur le slippage, décommentez le bloc getRpcClmmPoolInfo dans createPosition.ts pour récupérer le prix en direct juste avant la signature.

Mises en garde

  • Le NFT de position est votre seul accès. Perdez le NFT ou transférez-le, perdez l’accès à la position. Traitez-le comme une clé.
  • Les positions hors plage ne gagnent pas de frais. Si le prix sort de [lowerPrice, upperPrice], votre position est entièrement garée dans un actif et ne gagne rien jusqu’à ce que vous la rééquilibriez.
  • Le loyer du tableau de ticks est unidirectionnel. La première position à toucher un tableau de ticks jamais initialisé paie son loyer ; le programme n’expose pas de chemin pour fermer les tableaux de ticks, donc ce loyer est permanent. Les positions ultérieures dans le même tableau sont gratuites.

Suivant

Sources :