Skip to main content
Les pools CPMM détiennent deux jetons et les valorisent selon l’invariant à produit constant reserve0 × reserve1 = k. Chaque swap verse des frais de 0,3 % aux fournisseurs de liquidité. La liquidité est représentée par un jeton LP fongible dont l’identifiant est celui du pool.

Guide : swapper sur CPMM

Guide : fournir de la liquidité CPMM

Recherche de pools

getPoolId(tokenA, tokenB)

Dérive hors ligne l’identifiant de contrat de la paire (les jetons sont triés d’abord, l’ordre n’a donc pas d’importance). C’est aussi l’identifiant du jeton LP.

getPoolAddress(tokenA, tokenB)

Renvoie l’adresse du contrat de la paire (addressFromContractId(getPoolId(...))).

poolExists(tokenA, tokenB)

getPoolState(tokenA, tokenB)

Récupère les réserves et l’offre de LP, et résout les deux jetons via la liste de jetons. Lève PoolNotFoundError si la paire n’existe pas. Les deux jetons doivent figurer dans la liste de jetons.
object

getPoolProtocolFees(poolAddress)

Frais de protocole accumulés dans la paire et pas encore collectés. Prend l’adresse du pool, pas les identifiants des jetons.

Cotations (statiques, hors ligne)

Toutes les fonctions de cotation sont statiques et pures. Passez un CpmmPoolContractState déjà récupéré.

CpmmModule.computeSwapAmount(params)

CpmmPoolContractState
requis
string
requis
string
requis
bigint
À renseigner pour une cotation en entrée exacte.
bigint
À renseigner pour une cotation en sortie exacte (utilisé seulement si amountIn est indéfini).
bigint
requis
Tolérance de slippage en points de base.
object
En sortie exacte, lève InsufficientLiquidityError si amountOut >= reserveOut.

CpmmModule.getAmountOut(state, tokenInId, amountIn) / getAmountIn(state, tokenOutId, amountOut)

Les formules x·y=k brutes avec les frais de 0,3 % :

CpmmModule.calcPriceImpact(reserve0, reserve1, tokenInId, token0Id, amountIn, amountOut)

Renvoie l’impact de prix en pourcentage.

CpmmModule.computeLiquidityAmounts(params)

  • Pool existant (poolState renseigné) : indiquez le montant d’un côté (inputType: 'TokenA' utilise amountA, 'TokenB' utilise amountB). La fonction en déduit l’autre côté à partir des réserves, ainsi que les jetons LP que vous recevrez.
  • Nouveau pool (poolState indéfini) : amountA et amountB sont tous deux requis. LP mintés = sqrt(amountA × amountB) − MINIMUM_LIQUIDITY (1000 unités sont verrouillées pour toujours). Lève InsufficientLiquidityError si sqrt(amountA × amountB) <= 1000.
Renvoie { tokenAId, tokenBId, amountA, amountB, shareAmount, sharePercentage, state? }, où sharePercentage est votre part du pool après le dépôt, en pourcentage.

CpmmModule.computeRemoveLiquidityAmounts(state, totalLiquidity, liquidityToRemove)

Montants de jetons rendus pour la destruction de liquidityToRemove jetons LP, plus votre part restante. totalLiquidity est votre solde de LP. Lève une erreur si liquidityToRemove > totalLiquidity.

CpmmModule.computeClaimableAmounts(state, liquidityBalance)

La valeur sous-jacente complète d’un solde de LP : { token0, amount0, token1, amount1, ... }.

CpmmModule.minimalAmount(amount, slippage) / maximalAmount(amount, slippage)

Helpers de slippage. Voir Montants et slippage.

Swaps

swap(params, balances?)

Récupère un état de pool frais, calcule la cotation, vérifie l’impact de prix et exécute SwapMinOut (entrée exacte) ou SwapMaxIn (sortie exacte) via le routeur. Nécessite un signataire.
string
requis
string
requis
bigint
Montant en entrée exacte.
bigint
Montant en sortie exacte (utilisé si amountIn est indéfini).
bigint
requis
Points de base.
string
requis
Adresse qui paie et reçoit, généralement celle du signataire.
number
défaut:"60"
Échéance.
bigint
Frais d’intégrateur optionnels, dans le jeton d’entrée.
string
Requis avec fee.
Map<tokenId, bigint>
Vérification préalable optionnelle : si elle est fournie et que balances.get(tokenIn) < entrée + frais, lève InsufficientBalanceError avant la signature. Pour l’ALPH, utilisez ALPH_TOKEN_ID comme clé.
Lève PriceImpactTooHighError si priceImpact >= 5.

simSwap(params)

Récupère l’état du pool et renvoie la cotation que swap utiliserait, sans rien envoyer. slippageBps vaut 100n par défaut s’il est nul.

swapTo(params)

Calcule le trade en entrée exacte qui amène le prix du pool à targetPrice, puis l’exécute. La direction est déduite automatiquement. Ignore le contrôle d’impact de prix. Lève une erreur si la cible est égale au prix actuel. Utile pour l’arbitrage et pour recaler le prix de pools de test.

Liquidité

addLiquidity(params, balances?)

CpmmPoolContractState
requis
État frais issu de getPoolState.
string
requis
Doivent tous deux être des jetons du pool (dans n’importe quel ordre).
bigint
requis
Montants souhaités, tous deux supérieurs à 0. Utilisez computeLiquidityAmounts pour obtenir une paire équilibrée.
bigint
requis
Appliqué aux deux montants comme minimums. Ignoré si le pool est vide.
string
requis
number
défaut:"60"
Le routeur dépose selon le ratio optimal et minte les jetons LP pour sender.

removeLiquidity(params)

CpmmPoolContractState
requis
bigint
requis
Jetons LP à détruire.
bigint
Votre solde de LP (utilisé pour le calcul de la part). Par défaut poolState.totalSupply.
bigint
requis
Appliqué aux deux montants de sortie comme minimums.
string
requis
number
défaut:"60"

computeClaimableAmounts(tokenAId, tokenBId, liquidityBalance)

Version d’instance : récupère l’état du pool puis renvoie { token0, amount0, token1, amount1 } pour un solde de LP.

Création de pool

createPool(params)

string
requis
string
requis
Paie le dépôt de contrat de 1 ALPH.
{ tokenAAmount: bigint; tokenBAmount: bigint }
Si renseigné, crée la paire et dépose la liquidité initiale en une seule transaction (CreatePairAndAddLiquidity). Le ratio fixe le prix de départ. S’il est omis, seule la paire est créée (CreatePair, qui joint 1 unité de base de chaque jeton).

Configuration

getConfig() renvoie la CpmmConfig active (groupIndex, factoryId, routerId). setConfig(config) la surcharge. getCpmmConfig() relit le déploiement inclus.

Constantes