Pular para o conteúdo
Skillpedia
Segurança280 mil · #174

defi-amm-security

Faz seu agente verificar a segurança de códigos de finanças (AMM, pools). Ele analisa riscos como ataques e manipulação. Essencial para quem escreve ou audita contratos financeiros.

O que ela faz

Este guia ajuda a tornar seguros contratos inteligentes de finanças (DeFi) que lidam com trocas de criptomoedas (AMM) e pools de liquidez. Ele verifica problemas comuns que podem levar a perdas de dinheiro.

Quando usar

  • ✓Ao criar um novo contrato para troca de criptomoedas.
  • ✓Ao revisar um contrato existente para encontrar falhas de segurança.
  • ✓Ao adicionar novas funções de controle a um protocolo DeFi.

Exemplo do que pedir para a IA

“Verifique este contrato de pool de liquidez para garantir que ele não seja vulnerável a ataques de reentrância ou manipulação de preços.”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/skills/defi-amm-security/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/skills/defi-amm-security/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Funciona como uma lista de verificação detalhada. Você compara seu código com exemplos seguros e padrões recomendados para evitar vulnerabilidades conhecidas.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill defi-amm-security

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/skills/defi-amm-security/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Segurança de AMMs em DeFi

Padrões de vulnerabilidade críticos e implementações reforçadas para contratos AMM em Solidity, cofres de LP e funções de swap.

Quando Usar

  • Ao escrever ou auditar um contrato AMM ou de pool de liquidez em Solidity
  • Ao implementar fluxos de swap, depósito, saque, mint ou burn que gerenciam saldos de tokens
  • Ao revisar qualquer contrato que use token.balanceOf(address(this)) em cálculos de participação ou reserva
  • Ao adicionar definidores de taxas, pausadores, atualizações de oráculo ou outras funções administrativas a um protocolo DeFi

Como Funciona

Use isto como uma lista de verificação mais uma biblioteca de padrões. Revise cada ponto de entrada do usuário em relação às categorias abaixo e prefira os exemplos reforçados em vez de variantes criadas manualmente.

Segurança de Execução

Os comandos shell nesta habilidade são exemplos de auditoria local. Execute-os apenas em um checkout confiável ou sandbox descartável, e não insira nomes de contrato não confiáveis, caminhos, URLs RPC, chaves privadas ou flags fornecidas pelo usuário em comandos shell. Pergunte antes de instalar ferramentas ou executar trabalhos longos de fuzzing/análise estática que possam consumir recursos locais ou pagos significativos.

Nunca inclua segredos, chaves privadas, frases de semente, tokens de API ou credenciais de assinatura da mainnet em exemplos de comandos, logs ou relatórios.

Exemplos

Reentrância: impor ordem CEI

Vulnerável:

function withdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount);
    token.transfer(msg.sender, amount);
    balances[msg.sender] -= amount;
}

Seguro:

import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

using SafeERC20 for IERC20;

function withdraw(uint256 amount) external nonReentrant {
    require(balances[msg.sender] >= amount, "Insufficient");
    balances[msg.sender] -= amount;
    token.safeTransfer(msg.sender, amount);
}

Não escreva sua própria guarda quando uma biblioteca reforçada existir.

Ataques de doação ou inflação

Usar token.balanceOf(address(this)) diretamente para cálculos de participação permite que atacantes manipulem o denominador enviando tokens para o contrato fora do caminho pretendido.

// Vulnerable
function deposit(uint256 assets) external returns (uint256 shares) {
    shares = (assets * totalShares) / token.balanceOf(address(this));
}
// Safe
uint256 private _totalAssets;

function deposit(uint256 assets) external nonReentrant returns (uint256 shares) {
    uint256 balBefore = token.balanceOf(address(this));
    token.safeTransferFrom(msg.sender, address(this), assets);
    uint256 received = token.balanceOf(address(this)) - balBefore;

    shares = totalShares == 0 ? received : (received * totalShares) / _totalAssets;
    _totalAssets += received;
    totalShares += shares;
}

Acompanhe a contabilidade interna e meça os tokens realmente recebidos.

Manipulação de oráculo

Preços pontuais são manipuláveis por flash loans. Prefira TWAP.

uint32[] memory secondsAgos = new uint32[](2);
secondsAgos[0] = 1800;
secondsAgos[1] = 0;
(int56[] memory tickCumulatives,) = IUniswapV3Pool(pool).observe(secondsAgos);
int24 twapTick = int24(
    (tickCumulatives[1] - tickCumulatives[0]) / int56(uint56(30 minutes))
);
uint160 sqrtPriceX96 = TickMath.getSqrtRatioAtTick(twapTick);

Proteção contra slippage

Todo caminho de swap precisa de slippage fornecido pelo chamador e um prazo.

function swap(
    uint256 amountIn,
    uint256 amountOutMin,
    uint256 deadline
) external returns (uint256 amountOut) {
    require(block.timestamp <= deadline, "Expired");
    amountOut = _calculateOut(amountIn);
    require(amountOut >= amountOutMin, "Slippage exceeded");
    _executeSwap(amountIn, amountOut);
}

Cálculos de reserva seguros

import {FullMath} from "@uniswap/v3-core/contracts/libraries/FullMath.sol";

uint256 result = FullMath.mulDiv(a, b, c);

Para cálculos de reserva grandes, evite a * b / c ingênuos quando houver risco de overflow.

Controles administrativos

import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";

contract MyAMM is Ownable2Step {
    function setFee(uint256 fee) external onlyOwner { ... }
    function pause() external onlyOwner { ... }
}

Prefira aceitação explícita para transferência de propriedade e restrinja cada caminho privilegiado.

Lista de Verificação de Segurança

  • Pontos de entrada expostos à reentrância usam nonReentrant
  • A ordem CEI é respeitada
  • Cálculos de participação não dependem de balanceOf(address(this)) brutos
  • Transferências ERC-20 usam SafeERC20

…

Perguntas frequentes

O que é 'reentrância'?

É um tipo de ataque onde um contrato chama outro contrato, que por sua vez chama o primeiro de volta antes que a primeira chamada seja concluída, podendo roubar fundos.

O que é 'manipulação de slippage'?

É quando o preço de uma negociação muda inesperadamente entre o momento em que você inicia a negociação e o momento em que ela é concluída, resultando em um valor recebido menor do que o esperado.

O que são 'contratos inteligentes de AMM'?

São programas em blockchain que permitem a troca automática de criptomoedas, como Uniswap ou PancakeSwap, sem a necessidade de um intermediário.

Detalhes

Descrição original do autor

Security checklist for Solidity AMM contracts, liquidity pools, and swap flows. Covers reentrancy, CEI ordering, donation or inflation attacks, oracle manipulation, slippage, admin controls, and integer math. Use when auditing or writing Solidity AMM, liquidity pool, or swap code.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#174
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas