Documentation Index
Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
Use this file to discover all available pages before exploring further.
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
L’invariant
Un teneur de marché à produit constant (CPMM) détient deux réservesx et y et maintient :
k est le produit des réserves avant la transaction. Pour un marché sans frais, x · y = k exactement. Avec des frais, k augmente strictement (la part des frais allouée aux LP est conservée dans les réserves).
L’invariant est délibérément géométrique : il garantit que, peu importe à quel point une réserve devient faible, l’autre augmente sans limite pour la compenser — c’est-à-dire que le pool ne peut jamais être vidé d’un côté ou de l’autre.
Tarification
Prix au comptant
Le prix marginal dey libellé en x à tout instant est la tangente de la courbe :
x · y = k donne dy/dx = −y/x ; en ignorant le signe, |dy/dx| = y/x).
C’est le prix que le pool propose pour une transaction infinitésimalement petite. Pour toute transaction finie, le prix réalisé est moins avantageux en raison du slippage le long de la courbe.
Swap à montant exact en entrée (donner Δx, recevoir Δy)
Avec des frais, soit f le taux de frais (par ex. f = 0.0025 pour 25 bps). Appliquez les frais à l’entrée, puis utilisez l’invariant pour résoudre la sortie :
Δx complet entre dans les réserves. La portion des frais allouée aux LP reste dans x' ; la portion destinée au protocole est exclue de la courbe via une étape de comptabilité distincte (voir Variantes de comptabilité des frais ci-dessous).
Swap à montant exact en sortie (recevoir Δy, payer le minimum Δx)
Δx est arrondi vers le haut pour garantir que le pool ne fait pas de sous-facturation.
Slippage et impact de prix
L’impact de prix mesure le changement du prix au comptant du pool suite à la transaction :Δx / x, une expansion au premier ordre donne :
p_before et effective est le slippage. Le slippage dans l’interface utilisateur on-chain est généralement exprimé comme (effective − p_before) / p_before ; la méthode computeAmountOut du SDK retourne à la fois amountOut et priceImpact pour cette raison.
Vérification de l’invariant dans le code
Après un swap, les protocoles re-vérifient :Variantes de comptabilité des frais
La vérification de l’invariant suppose que les frais des LP restent dans les réserves. Différents produits Raydium gèrent différemment les composantes protocole / fonds / créateur :Convention CPMM
Les frais sont des taux similaires aux points de baseu64 sur un dénominateur 1_000_000. Les frais de transaction sont divisés en trade_fee_rate (total) puis subdivisés via protocol_fee_rate, fund_fee_rate, creator_fee_rate. À chaque swap :
protocol_fees_*, fund_fees_*, creator_fees_*) qui sont exclus des réserves utilisées dans l’invariant. C’est ainsi que les frais peuvent être prélevés sans modifier la courbe. Voir products/cpmm/fees.
Convention AMM v4
Les frais sont des ratiosnumerator / denominator sur un dénominateur 10_000. La répartition est fixée à la création du pool et stockée sur AmmInfo.fees :
pnl_share s’accumule dans state_data.need_take_pnl_* et est exclue des réserves ; lp_share reste dans le coffre. Voir products/amm-v4/fees.
Les deux conventions préservent l’invariant de la même manière — la différence est cosmétique (dénominateur + nombre de sous-catégories).
Règles d’arrondi
- Le calcul des frais arrondit vers le haut. Garantit que le pool ne fait jamais de sous-facturation sur les frais.
- Le montant de sortie arrondit vers le bas. Garantit que l’invariant est strictement respecté (
k' > kmême avant que les frais soient ajoutés). - Le montant d’entrée pour une sortie exacte arrondit vers le haut. Garantit que l’utilisateur ne sous-paie pas.
u128 pour les produits intermédiaires x · Δx pour éviter les débordements sur les grandes réserves. Les résultats finaux sont recastés vers u64 avec une vérification de saturation.
Cas limites
Pool vide
Avant le premierDeposit, x = y = 0. Les instructions de swap rejettent le pré-dépôt.
Sortie zéro
SiΔx est suffisamment petit pour que le Δy arrondi vers le bas soit 0, l’instruction revient avec ZeroTradingTokens. Cela empêche l’extraction de valeur sans paiement ; cela signifie également que les petites transactions sur des pools très déséquilibrés échouent.
Poussière LP
Le premierDeposit a un traitement spécial : il calcule l’approvisionnement initial en LP comme sqrt(x · y) et brûle une petite quantité « init burn » (généralement 100 unités LP) pour prévenir l’« attaque par inflation du premier déposant » (où un attaquant donne au coffre et gonfle la valeur du jeton LP). Les dépôts ultérieurs utilisent une mathématique pro-rata.
Relation avec l’arbitrage
Le prix d’un pool CPMM ne change que via :- Les transactions via le pool lui-même (les utilisateurs qui parcourent la courbe).
- Les donations (envoyer des jetons au coffre sans effectuer un swap).
Exemples détaillés
Exemple 1 — petite transaction, slippage négligeable
Pool :x = 1_000_000, y = 2_000_000, k = 2·10^12. Frais f = 0.0025.
Transaction Δx = 1_000 :
1000 / 1993.01 ≈ 0.5018. Prix au comptant avant : 0.5. Impact : ~0.36%.
Exemple 2 — transaction de taille moyenne, slippage visible
Même pool,Δx = 100_000 (10% de x) :
100_000 / 181_405 ≈ 0.5513. Impact : ~10.3% — environ la moitié de la règle empirique 2 · 10% = 20% (la règle est un plafond dans le pire des cas pour une courbe à produit constant sans frais ; les frais de transaction plus l’inversion dans la formule la ramènent vers le bas).
Références
products/cpmm/math— les choix spécifiques d’arrondi et de dénominateur des frais du CPMM.products/amm-v4/math— comment les réserves intégrées à OpenBook de l’AMM v4 étendent ce modèle.algorithms/slippage-and-price-impact— page dédiée au dimensionnement de la tolérance de slippage pour les interfaces utilisateur.
- Livre blanc Uniswap v2 — l’énoncé canonique de
x · y = k. - Code source du programme CPMM de Raydium.
- Code source du programme AMM v4 de Raydium.


