Este é o segundo artigo da nossa série “Predadores nos Pools: A Arte e a Matemática da Liquidez JIT”. Aqui, passamos da teoria do “roubo” para o cálculo frio: como um algoritmo decide em 200 milissegundos se vale a pena entrar no jogo.
Se o primeiro artigo tratava do “o que é”, este trata do “quanto custa”. Para que um ataque JIT não se torne caridade a favor de mineradores/validadores, o bot precisa resolver uma equação com cinco incógnitas antes que o bloco seja minerado.
1. Liquidez (L): A variável principal
No Uniswap v3, a liquidez não é apenas a soma de tokens, mas o fator L que determina quantos ativos se movem quando o preço muda. Fórmula do swap (invariante):

Para um bot JIT, é crucial calcular qual parte do L total em um determinado intervalo de preço (tick) ele deve ocupar.
Fórmula da participação na taxa (Fshare):
Fshare = Ljit / Lpool + Ljit
Onde:
- Ljit — liquidez fornecida pelo bot.
- Lpool — liquidez passiva existente dos LPs no tick alvo.
Regra prática: Para capturar 95% da taxa, a liquidez do bot deve ser 19 vezes maior que a liquidez atual do pool nesse intervalo.
2. Cálculo do lucro do swap (Gross Profit)
O bot vê no mempool uma transação do usuário no valor de $S$. Conhecendo a categoria de taxa do pool ($\phi$, por exemplo 0,05% ou 0,3%), ele calcula a taxa total da operação:

Lucro bruto esperado do bot (Pgross):

3. Consideração do “Imposto de Gas” (Custos Operacionais)
Diferente de um LP passivo, que paga gas uma vez por vários meses, o bot JIT paga gas duas vezes no mesmo bloco (ou uma transação cara com várias chamadas).
Custos de gas (Cgas):
mint(): ~150k–200k gas.decreaseLiquidity()+collect(): ~120k–180k gas.- Mais a taxa de prioridade (Priority Fee) para Flashbots, garantindo inclusão no bloco.
Na rede principal Ethereum (Mainnet) com gas a 30 gwei, os custos totais podem variar de $50–$150. Em L2 (Arbitrum/Polygon), os custos são mínimos ($0,10–$0,50), mas a concorrência por micro-swaps é maior.
4. Cálculo do ponto de equilíbrio (Break-even Point)
O ataque só faz sentido se:

Onde Cslippage é a perda ao retirar liquidez (Impermanent Loss durante um swap único) e Copportunity é o custo de oportunidade do capital (ex.: juros de um Flash Loan).
Detalhe pouco conhecido: Bots experientes consideram o “Shadow Slippage”. Quando o bot injeta grande liquidez, o preço se torna mais “rígido”. Se o swap do usuário for muito grande, o bot pode injetar menos liquidez para que o preço se mova mais, planejando arbitragem no próximo bloco. Mas para JIT puro — quanto mais liquidez, melhor.
5. Exemplo prático de cálculo (Mainnet)
- Pool: ETH/USDC (0,05%)
- Swap do usuário: $500,000.
- Lpool atual no tick: $2,000,000.
- Bot injeta Ljit: $18,000,000.
- Taxa total: $500,000 x 0.0005 = $250.
- Participação do bot: 18M / 18M + 2M = 90%.
- Receita do bot: $250 x 0.9 = $225.
- Custo de gas: $120 (condições médias).
- Lucro líquido: $225 - $120 = $105 por bloco.
Parece pouco? Mas os melhores bots realizam 500–1000 desses ataques por dia. Isso significa um lucro líquido de $50,000–$100,000 por dia, praticamente sem risco de mercado.
6. Detalhe técnico: escolha da largura do tick
O bot nunca define um intervalo amplo. Quanto mais estreito o intervalo (ticks), maior a concentração de capital e maior L para a mesma quantidade de tokens.
Padrão JIT: tickLower e tickUpper com diferença de 1 passo mínimo (ex.: 10 pontos para um pool de 0,05%).
Cálculo da liquidez a partir da quantidade de tokens (TypeScript/Ethers):
import { LiquidityAmounts } from '@uniswap/v3-sdk';
import { JSBI } from '@uniswap/sdk-core';
function calculateJitLiquidity(amount0, amount1, currentPrice, tickLower, tickUpper) {
const sqrtRatioX96 = encodePriceSqrt(currentPrice);
const sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower);
const sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper);
return LiquidityAmounts.getLiquidityForAmounts(
sqrtRatioX96,
sqrtRatioAX96,
sqrtRatioBX96,
amount0,
amount1,
false
);
}
Resumo do artigo
A matemática JIT é uma batalha pela eficiência. Se você vir que a rentabilidade de um pool com taxa de 1% caiu repentinamente — verifique o mempool. Muito provavelmente há um bot atuando que calculou que seu L é 50 vezes mais eficiente que o seu.
No próximo artigo: Passaremos das fórmulas para o hardware e código. Analisaremos a arquitetura do smart contract que executa esses cálculos em tempo real e entenderemos por que Rust superou todas as outras linguagens neste nicho.
Domínio de Liquidez JIT: O Guia Completo de MEV no Uniswap: Parte 2 de 5