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 contratPoolConfig enregistré dans la factory, indexé à partir de 0n. Chaque pool en référence exactement un.
Recherche de pools
getPoolState(poolId)
object
PoolNotFoundError si le pool n’existe pas.
Autres lectures de pool
Swaps
simulateSwap(params)
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)
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.
swapTo(params)
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(...)
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.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)
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.
0n pour les deux minimums afin de désactiver le contrôle.
collectTokens(params)
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)
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’openTimeet 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 dansfees[0], en token1 dansfees[1], et dans tout autre token dansfees[2]. Elles sont versées viacollectTokens.
Comptes de parrainage (DEX)
Powfi suit les parrainages grâce à des contratsDexAccount par utilisateur, sous un DexAccountRoot.
Configuration
getClmmConfig() et surchargez-la avec setConfig(). getConfig() relit le déploiement inclus.