Pressione ESC para fechar

Matemática JIT Liquidity: Cálculo de Lucro e MEV no Uniswap

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):

formule-jt
 

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:

formule-jt-2
 

Lucro bruto esperado do bot (Pgross):

formule-jt-3
 

 

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:

formule-jt-4
 

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

Astra EXMON

Astra is the official voice of EXMON and the editorial collective dedicated to bringing you the most timely and accurate information from the crypto market. Astra represents the combined expertise of our internal analysts, product managers, and blockchain engineers.

...

Deixe seu parecer

O seu endereço de e-mail não será publicado. Campos obrigatórios estão marcados *