Skip to main content
Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →

Dois conceitos distintos

Impacto de preço e slippage são frequentemente confundidos em interfaces, mas referem-se a coisas diferentes.
  • Impacto de preço é uma propriedade determinística de uma negociação contra um estado específico do pool. Dado (Δin, reserves), o impacto de preço é totalmente computável antes da negociação ser enviada.
  • Slippage é a diferença realizada entre o preço que você esperava no momento da cotação e o preço que você realmente obteve no momento da execução. É uma função de latência, transações concorrentes e ordem de inclusão de blocos — não da matemática do pool.
Uma cotação de 1% contra um pool caso contrário inativo tem 0% de slippage se chegar no próximo bloco; o 1% foi o impacto de preço. Essa mesma cotação chega 0,2% pior se outra negociação atingir o pool primeiro — o 0,2% adicional é slippage.

Definições formais

Impacto de preço

Para um CPMM: impact ≈ 2 · Δin / reserve_in para negociações pequenas. Para CLMM: depende de quantos ticks a negociação cruza; frequentemente plano dentro do intervalo de tick atual, saltando em cada cruzamento de tick.

Slippage realizado

Slippage é sempre não-negativo (ou zero), assumindo que a cotação foi honesta. Um valor negativo significaria que você obteve mais do que cotado — possível se o estado do pool se moveu a seu favor entre cotação e execução.

Dimensionando minAmountOut e maxAmountIn

Cada swap do Raydium leva um limite de proteção contra slippage:
  • SwapBaseInput(amount_in, min_amount_out) — entrada exata, limite inferior da saída.
  • SwapBaseOutput(max_amount_in, amount_out) — saída exata, limite superior da entrada.
O SDK computa esses por produto — os três não compartilham uma assinatura:
Em todos os três, minAmountOut é amountOut × (1 − slippage) e é o que vai on-chain como limite; priceImpact é determinístico apenas do estado do pool; fee é o total cobrado. A tolerância de slippage é um buffer em torno do impacto de preço, não o impacto de preço em si. Uma tolerância de 0,5% significa “aceitar no máximo 0,5% pior que minha cotação” — independentemente de o impacto de preço ter sido 0,01% (uma negociação minúscula) ou 2% (uma negociação grande). Para uma negociação com impacto de preço de 2% com tolerância de 0,5%, minAmountOut é 2,5% abaixo do spot pré-negociação — essencialmente a soma do impacto e tolerância.

Tolerâncias de slippage recomendadas

Não há um número único correto; o limite correto depende de:
  1. Estabilidade do par. Pools stablecoin-stablecoin podem usar com segurança 0,1%. Pools de pares meme voláteis frequentemente precisam de 3–5% apenas para pousar com confiabilidade.
  2. Tamanho da negociação. Negociações maiores têm impactos de preço maiores, então a tolerância precisa escalar com eles para evitar reversão. Os padrões de auto-slippage do SDK são em torno de max(0.5%, 2 × price_impact) por essa razão.
  3. Latência de inclusão de bloco. Transações que ficam no mempool por vários blocos são expostas a mais negociações concorrentes. Bundles Jito e taxas de prioridade reduzem isso.
Regras práticas (padrões da interface do Raydium):

Diferenças entre tipos de AMM

CPMM

O impacto de preço é suave e contínuo (forma fechada 2 · Δin / reserve_in). A tolerância de slippage escala linearmente com o tamanho da negociação.

AMM v4

Mesma matemática de curva que CPMM. Desde a remoção do OpenBook, as “reservas efetivas” são apenas os dois saldos de vault:
  • Cotação fora dos saldos de vault brutos. Não há componente on-book para adicionar — Initialize2 escreve AmmInfo.open_orders = Pubkey::default() em cada novo pool, e nenhuma instrução lê uma conta OpenOrders.
  • Subtraia o PnL de protocolo acumulado (state_data.need_take_pnl_coin / need_take_pnl_pc) dos saldos de vault para obter as reservas que o invariante realmente usa.
  • Não há crank para pré-executar: MonitorStep agora entra em pânico com unimplemented! e não deve ser enviado.

CLMM

O impacto de preço é por partes. Dentro do intervalo de tick atual, o impacto é aproximadamente linear em Δin / L. Cruzar um limite de tick pode mudar L discretamente, causando um salto repentino no preço marginal. Uma negociação que cruza vários ticks pouco populados pode ter muito mais impacto do que a regra prática 2 · Δin / reserve sugere. A cotação CLMM do SDK itera o passo de swap deterministicamente para retornar um amountOut esperado exato, então minAmountOut = amountOut · (1 − slippage) está correto. Mas o valor de retorno priceImpact deve ser interpretado como “o spread entre spot pré-negociação e spot pós-negociação”, que em CLMM pode ser muito maior que o slippage efetivo da negociação para um usuário que se importa apenas com amount_out.

Curva LaunchLab

Semelhante a CPMM, mas com uma curva assimétrica (quadrática ou virtual-reserves). O impacto cresce mais rápido para compradores tardios conforme a curva se inclina em direção à graduação. Interfaces pré-comprador devem avisar quando uma compra deve empurrar a curva mais de ~5% de quote_reserve_target em uma transação.

Considerações de MEV

Em Solana, a extração de MEV contra swaps principalmente assume a forma de ataques sanduíche: um bot coloca uma transação back-run que negocia depois da sua, mais um front-run que negocia antes, ambos no mesmo slot. Sua negociação é preenchida a um preço pior do que teria sido sem o sanduíche; o back-run captura a diferença. Mitigações:
  1. minAmountOut apertado. Limites de slippage agressivos fazem a transação da vítima reverter se sanduichada pesadamente, protegendo fundos (mas desperdiçando gás). Em Solana, essa é prática padrão — rejeição é barata.
  2. Bundles Jito. Enviar através do Jito com uma dica agrupada exclui intermediários de reordenar sua tx. Bundles pousam como blocos atômicos.
  3. Taxas de prioridade. Uma taxa de prioridade alta aumenta a chance de sua negociação pousar no bloco do líder atual antes de um sanduichador reagir. Menos robusto que bundles, mais padrão.
  4. RPC privado. Enviar através de um RPC privado (ou via endpoint direto de um validador) reduz a janela durante a qual um sanduichador de mempool pode observar sua transação.
O SDK do Raydium não agrupa; integradores tipicamente colocam Jito em cima. Veja integration-guides/routing-and-mev para padrões.

Slippage para rotas multi-hop

Quando um swap roteia através de múltiplos pools (por exemplo, USDC → SOL → RAY), a tolerância de slippage deve ser aplicada por-hop, não apenas end-to-end:
O roteador do SDK aplica limites por-hop automaticamente quando você chama raydium.tradeV2.swap. (A fachada é tradeV2 — raydium.trade não existe.) Para roteadores customizados, replique o padrão.

Relatando para usuários

Regras práticas para uma boa interface de swap:
  • Exiba ambos impacto de preço esperado e tolerância de slippage separadamente.
  • Destaque quando o impacto de preço excede ~2% — aviso de “impacto alto”.
  • Destaque quando o impacto de preço excede tolerância — a transação quase certamente reverterá.
  • Para pares voláteis, ofereça um “modo de slippage alto” que relaxa o limite e mostra um aviso mais forte.

Referências

Fontes:
  • Implementação de slippage / impacto do SDK Raydium v2.
  • Flashbots / Jito em MEV Solana.