Skip to main content
Les pools CLMM sont de style Uniswap V3 : les fournisseurs de liquidité choisissent une plage de prix (tickLower–tickUpper) et ne gagnent des frais que lorsque le prix se trouve dans cette plage. Chaque pool est identifié par une paire de jetons et un palier de frais (configIndex). Les prix sont stockés sous la forme sqrtPriceX96 = sqrt(token1/token0) × 2^96.

Guide : swapper sur CLMM

Guide : ouvrir et gérer une position

Paliers de frais (configurations de pool)

Un palier de frais est un contrat PoolConfig enregistré dans la factory, indexé à partir de 0n. Chaque pool en référence exactement un.

Recherche de pools

getPoolState(poolId)

object
Lève PoolNotFoundError si le pool n’existe pas.

Autres lectures de pool

Swaps

simulateSwap(params)

Exécute la méthode de vue simulateSwap du pool sur le nœud (aucune transaction) et renvoie la courbe de liquidité parcourue par le swap. Passez le résultat à PoolUtils.offlineSwap pour calculer localement le montant de sortie.
bigint
requis
string
requis
Les jetons du pool (dans n’importe quel ordre, utilisés pour localiser le pool).
boolean
requis
true vend le token0 trié contre du token1 (le prix baisse).
bigint
requis
Positif = entrée exacte, négatif = sortie exacte.
string
Chemin multi-sauts issu de buildSwapPath (optionnel).
string[]
Adresses des pools supplémentaires traversés par un chemin multi-sauts.
object

swap(params)

Exécute un swap sur un seul pool via le script SwapWithoutAccount (ou SwapWithoutAccountWithFee si des frais d’intégrateur sont définis). Le signataire est à la fois payeur et destinataire.
string
requis
Le jeton d’entrée (pas forcément le token0 trié du pool).
string
requis
Le jeton de sortie.
bigint
requis
Montant spécifié : positif = entrée exacte, négatif = sortie exacte (l’opposé de la sortie souhaitée).
bigint
requis
Quantité de jeton d’entrée à joindre. En entrée exacte : identique à amount. En sortie exacte : votre entrée maximale (simulez, puis ajoutez le slippage).
bigint
requis
Points de base, convertis en sqrtPriceLimitX96.
bigint[]
requis
Paliers de frais à parcourir. Seul routePlan[0] est utilisé aujourd’hui.
bigint / string
Frais d’intégrateur optionnels, dans le jeton d’entrée.
swap() envoie toujours un chemin multi-sauts vide : il ne swappe donc que dans un seul pool. Pour du multi-sauts, construisez le chemin avec buildSwapPath et appelez directement le script SwapWithoutAccount de ClmmScripts.

swapTo(params)

Swappe jusqu’à ce que le pool atteigne targetSqrtPriceX96, en dépensant au plus amountInMax de tokenIn. Échoue on-chain (code d’erreur 106, InvalidSqrtPriceLimit) si la cible est du mauvais côté du prix actuel.

buildSwapPath(tokenId, configIndex)

Encode un saut supplémentaire pour simulateSwap({ data }) : tokenId + configIndex sur 4 caractères hexadécimaux.

Positions de liquidité

Une position est identifiée par pool + propriétaire + tickLower + tickUpper. L’identifiant du contrat de position sert aussi d’identifiant de jeton de position : le propriétaire en détient une unité, qui est jointe lors de la modification de la position.

getPositionId(poolId, owner, tickLower, tickUpper)

Dérive l’identifiant de position hors ligne. Pour les adresses sans groupe, passez owner sous forme normalisée (voir Groupes et adresses). PoolUtils.getPositionId(poolAddress, owner, ...) normalise pour vous.

createPool(...)

Crée un pool au prix tick et minte la première position dans [tickLower, tickUpper]. Les jetons, leurs montants et les ticks sont triés en interne. Joint 6 × MINIMAL_CONTRACT_DEPOSIT d’ALPH pour les nouveaux contrats.

addLiquidity(params)

string
requis
Jetons du pool. Passez-les triés (sortTokens) et faites correspondre amount0 / amount1 à cet ordre.
bigint
requis
bigint
requis
Multiples du tickSpacing du palier. Utilisez TickUtils.getAlignedTick.
bigint
requis
Montants souhaités. Le contrat dépose les montants équilibrés maximaux dans cette limite.
bigint
requis
Points de base sur le prix. Les montants minimaux sont déduits des bornes de prix.
string
Propriétaire de la position. Par défaut, le signataire.
boolean
Mettez true pour ajouter à une position que vous détenez déjà (joint le jeton de position). Le signataire doit détenir le NFT de la position, que le SDK joint automatiquement.
Le dépôt de la position (dustAmount) est lu on-chain via PositionManager.getSqrtPricesX96. Variante en deux étapes : getAddLiquidityParams(p) renvoie [positionId, positionManager, params] sans rien envoyer, et addLiquidityFromParams(positionId, positionManager, params) les exécute. Utile pour afficher un écran de confirmation avec les montants minimaux exacts.

removeLiquidity(params)

Réduit la liquidité de la position et, dans la même transaction, collecte tous les frais et récompenses accumulés. Les jetons sont envoyés au signataire.
requis
Identifient le pool.
requis
Identifient la position.
bigint
requis
Unités de liquidité à retirer (lisez la liquidity actuelle de la position, puis prenez-en une fraction).
'token0' | 'token1'
requis
Côté auquel se rapporte baseAmount.
bigint
requis
Montant minimal du jeton base à recevoir.
bigint
requis
Montant minimal de l’autre jeton à recevoir. Malgré son nom, il est transmis on-chain comme minimum.
Passez 0n pour les deux minimums afin de désactiver le contrôle.

collectTokens(params)

Collecte les frais et récompenses accumulés vers recipient. Ne retire pas de liquidité ; utilisez removeLiquidity pour cela.
requis
Identifient la position.
string
requis
bigint
requis
Plafonds de collecte. Utilisez des valeurs de l’ordre de U128_MAX (par exemple UNLIMITED_AMOUNT) pour tout collecter.

positionInfo(params)

Appelle la vue positionInfo du pool et renvoie son résultat tel quel. fees contient trois entrées : token0, token1 et le jeton de récompense du pool. Le SDK transmet directement au contrat les arguments d’accumulateur (acc, iacc0, iacc1, t0, acct0). Consultez le code source du contrat Pool pour leur signification. Pour lire la liquidité brute d’une position, récupérez l’état du contrat de position :

Récompenses de farming

Un pool peut avoir jusqu’à trois programmes de récompenses (MAX_REWARDS = 3), versées en token0, en token1 ou dans le jeton de récompense supplémentaire du pool (token2). Les programmes sont mis en place et financés par l’équipe Powfi.
  • getPoolRewardState(poolId) renvoie le jeton de récompense ainsi que l’amount, l’openTime et l’endTime (horodatages en millisecondes) de chaque programme.
  • Les récompenses accumulées par une position apparaissent dans positionInfo(...).fees : les récompenses en token0 dans fees[0], en token1 dans fees[1], et dans tout autre token dans fees[2]. Elles sont versées via collectTokens.

Comptes de parrainage (DEX)

Powfi suit les parrainages grâce à des contrats DexAccount par utilisateur, sous un DexAccountRoot.

Configuration

Lisez la configuration active avec getClmmConfig() et surchargez-la avec setConfig(). getConfig() relit le déploiement inclus.

Constantes