Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →

Deux concepts distincts

L’impact de prix et le slippage sont souvent confondus dans les interfaces, mais ils désignent des choses différentes.
  • L’impact de prix est une propriété déterministe d’un échange contre un état de pool spécifique. Étant donné (Δin, reserves), l’impact de prix est entièrement calculable avant la soumission de l’échange.
  • Le slippage est la différence réalisée entre le prix que vous attendiez au moment du devis et le prix que vous avez réellement obtenu à l’exécution. C’est une fonction de la latence, des transactions concurrentes et de l’ordre d’inclusion des blocs — pas des mathématiques du pool.
Un devis de 1 % contre un pool autrement inactif a 0 % de slippage s’il arrive dans le bloc suivant ; le 1 % était l’impact de prix. Ce même devis arrive 0,2 % plus mal si un autre échange frappe le pool en premier — le 0,2 % supplémentaire est du slippage.

Définitions formelles

Impact de prix

Pour un CPMM : impact ≈ 2 · Δin / reserve_in pour les petits échanges. Pour CLMM : dépend du nombre de ticks traversés par l’échange ; souvent plat dans la plage de ticks actuelle, sautant à chaque franchissement de tick.

Slippage réalisé

Le slippage est toujours non-négatif (ou zéro), en supposant que le devis était honnête. Une valeur négative signifierait que vous avez obtenu plus que prévu — possible si l’état du pool s’est amélioré en votre faveur entre le devis et l’exécution.

Dimensionnement de minAmountOut et maxAmountIn

Chaque swap Raydium prend une limite de protection contre le slippage :
  • SwapBaseInput(amount_in, min_amount_out) — entrée exacte, limite inférieure de la sortie.
  • SwapBaseOutput(max_amount_in, amount_out) — sortie exacte, limite supérieure de l’entrée.
Le SDK calcule ces valeurs par produit — les trois n’ont pas la même signature :
Dans les trois cas, minAmountOut est amountOut × (1 − slippage) et c’est ce qui va on-chain comme limite ; priceImpact est déterministe à partir de l’état du pool seul ; fee est le total facturé. La tolérance de slippage est un tampon autour de l’impact de prix, pas l’impact de prix lui-même. Une tolérance de 0,5 % signifie « accepter au maximum 0,5 % pire que mon devis » — indépendamment du fait que l’impact de prix était de 0,01 % (un petit échange) ou de 2 % (un grand échange). Pour un échange avec un impact de prix de 2 % et une tolérance de 0,5 %, minAmountOut est 2,5 % en dessous du spot pré-échange — essentiellement la somme de l’impact et de la tolérance.

Tolérances de slippage recommandées

Il n’y a pas un seul bon chiffre ; la bonne limite dépend de :
  1. Stabilité de la paire. Les pools stablecoin-stablecoin peuvent utiliser en toute sécurité 0,1 %. Les pools de paires meme volatiles ont souvent besoin de 3–5 % juste pour atterrir de manière fiable.
  2. Taille de l’échange. Les échanges plus importants ont des impacts de prix plus importants, donc la tolérance doit s’adapter à eux pour éviter une annulation. Les valeurs par défaut de slippage automatique du SDK tournent autour de max(0.5%, 2 × price_impact) pour cette raison.
  3. Latence d’inclusion de bloc. Les transactions qui restent dans le mempool pendant plusieurs blocs sont exposées à plus d’échanges concurrents. Les bundles Jito et les frais de priorité réduisent cela.
Règles empiriques (valeurs par défaut de l’interface Raydium) :

Différences selon les types d’AMM

CPMM

L’impact de prix est lisse et continu (formule fermée 2 · Δin / reserve_in). La tolérance de slippage s’adapte linéairement à la taille de l’échange.

AMM v4

Même mathématique de courbe que CPMM. Depuis la suppression d’OpenBook, les « réserves effectives » sont simplement les deux soldes de coffre :
  • Cotez sur les soldes de coffre bruts. Il n’y a pas de composant on-book à ajouter — Initialize2 écrit AmmInfo.open_orders = Pubkey::default() sur chaque nouveau pool, et aucune instruction ne lit un compte OpenOrders.
  • Soustrayez le PnL de protocole accumulé (state_data.need_take_pnl_coin / need_take_pnl_pc) des soldes de coffre pour obtenir les réserves que l’invariant utilise réellement.
  • Il n’y a pas de crank à pré-exécuter : MonitorStep panique maintenant avec unimplemented! et ne doit pas être envoyé.

CLMM

L’impact de prix est par morceaux. Dans la plage de ticks actuelle, l’impact est approximativement linéaire en Δin / L. Franchir une limite de tick peut changer L discrètement, causant un saut soudain du prix marginal. Un échange qui traverse plusieurs ticks peu peuplés peut avoir un impact beaucoup plus élevé que la règle empirique 2 · Δin / reserve ne le suggère. La cotation CLMM du SDK itère l’étape de swap de manière déterministe pour retourner un amountOut attendu exact, donc minAmountOut = amountOut · (1 − slippage) est correct. Mais la valeur de retour priceImpact doit être interprétée comme « l’écart entre le spot pré-échange et le spot post-échange », qui sur CLMM peut être beaucoup plus grand que le slippage effectif de l’échange pour un utilisateur qui ne se soucie que de amount_out.

Courbe LaunchLab

Similaire à CPMM mais avec une courbe asymétrique (quadratique ou réserves virtuelles). L’impact croît plus rapidement pour les acheteurs tardifs à mesure que la courbe s’accentue vers la graduation. Les interfaces d’acheteur pré-achat doivent avertir quand un achat devrait pousser la courbe de plus de ~5 % de quote_reserve_target en une seule transaction.

Considérations MEV

Sur Solana, l’extraction de MEV contre les swaps prend principalement la forme d’attaques sandwich : un bot place une transaction de back-run qui échange après la vôtre, plus un front-run qui échange avant, tous deux au même slot. Votre échange se remplit à un prix pire qu’il ne l’aurait été sans le sandwich ; le back-run capture la différence. Atténuations :
  1. minAmountOut serré. Les limites de slippage agressives causent l’annulation de la transaction victime si elle est fortement sandwichée, protégeant les fonds (mais gaspillant du gaz). Sur Solana, c’est une pratique standard — le rejet est bon marché.
  2. Bundles Jito. Soumettre via Jito avec un pourboire groupé exclut les intermédiaires de réorganiser votre tx. Les bundles atterrissent comme des blocs atomiques.
  3. Frais de priorité. Un frais de priorité élevé augmente la chance que votre échange atterrisse dans le bloc du leader actuel avant qu’un sandwicher puisse réagir. Moins robuste que les bundles, plus standard.
  4. RPC privé. Soumettre via un RPC privé (ou via un endpoint direct du validateur) réduit la fenêtre pendant laquelle un sandwicher mempool peut observer votre transaction.
Le SDK de Raydium ne groupe pas ; les intégrateurs superposent généralement Jito. Voir integration-guides/routing-and-mev pour les modèles.

Slippage pour les routes multi-hop

Quand un swap route à travers plusieurs pools (par ex. USDC → SOL → RAY), la tolérance de slippage doit être appliquée par hop, pas seulement de bout en bout :
Le routeur du SDK applique automatiquement les limites par hop quand vous appelez raydium.tradeV2.swap. (La façade est tradeV2 — raydium.trade n’existe pas.) Pour les routeurs personnalisés, répliquez le modèle.

Rapport aux utilisateurs

Règles empiriques pour une bonne interface de swap :
  • Affichez à la fois l’impact de prix attendu et la tolérance de slippage séparément.
  • Mettez en évidence quand l’impact de prix dépasse ~2 % — avertissement « impact élevé ».
  • Mettez en évidence quand l’impact de prix dépasse la tolérance — la transaction est presque certaine d’être annulée.
  • Pour les paires volatiles, offrez un « mode slippage élevé » qui assouplit la limite et affiche un avertissement plus fort.

Pointeurs

Sources :
  • Implémentation du slippage / impact du SDK Raydium v2.
  • Flashbots / Jito sur Solana MEV.