Como criar bot/robô sniper para SushiSwap V3 em Node.js (Sniperbot)

Cripto

Como criar bot/robô sniper para SushiSwap V3 em Node.js (Sniperbot)

Luiz Duarte
Escrito por Luiz Duarte em 03/10/2024
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

As exchanges decentralizadas ou DEX, como são popularmente chamadas, são uma alternativa às exchanges tradicionais, ou centralizadas, como Binance e Coinbase. Enquanto que nas exchanges centralizadas você compra e vende moedas com a corretora como mediadora das negociações e sem a custódia das suas próprias moedas (“not your keys, not your money”), nas DEX temos todas as negociações, chamadas de swaps (trocas), sendo feitas através de usuários que se conectam à rede com suas próprias carteiras de criptomoedas (como MetaMask) e a mediação acontecendo através de contratos inteligentes (smart contracts). Ou seja, não é um P2P “cru”, direto, ainda existe um intermediador, mas ele é um software aberto e transparente, publicado na blockchain.

Como Chanpeng Zhao afirma, o próprio fundador da Binance, as DEX são o futuro das corretoras de criptomoedas já que por rodarem nativamente na blockchain eles garantem a segurança, o anonimato e a descentralização a todas as partes envolvidas, diferente das exchanges tradicionais que sofrem cada vez mais ataques dos órgãos reguladores nos países em que operam. No entanto, operar em uma DEX é ligeiramente mais complicado do que operar em exchanges comuns, pela própria natureza das criptomoedas e blockchain em si. Da mesma forma, programar bots para este tipo de corretora é um desafio maior também.

Desta forma, neste tutorial eu espero lhe ajudar a entender como criar um primeiro bot sniper de criptomoedas que fará swaps o mais rápido possível, assim que um novo pool de liquidez seja listado na dex SushiSwap (V3). Como ela nasceu a partir de um fork da Uniswap, você consegue aproveitar boa parte dos aprendizados desse bot para outras dex (sniperbot para Uniswap aqui).

É importante você entender, antes de começarmos a programar, que operar no mercado cripto é muito arriscado por este ser um mercado muito volátil e auto-regulado. Não posso prometer ou me responsabilizar por qualquer lucro ou prejuízo que você possa ter ao colocar o seu dinheiro em uma SushiSwap ou qualquer outra DEX, independente se usar os códigos que ensino ou não. Além disso, é imprescindível que você já possua conhecimentos básicos de programação para poder fazer este tutorial e também que já tenha feito swaps manualmente na SushiSwap antes, pois são coisas que não ensinarei aqui.

Dito isso, vamos ao tutorial.

#1 – O que é e como funciona um bot sniper?

Sniping é o ato de ficar mirando em um alvo, para acertá-lo no momento e local certos e sniper é o profissional especializado nesse tipo de tática. Inclusive aproveito para recomendar o filme Sniper Americano, com Bradley Cooper, que conta a história real de um famoso sniper. Mas e no mundo dos bots?

Antes de explicar sobre o bot sniper em si, é importante entender a oportunidade que torna-os interessantes. Quando uma nova criptomoeda surge em uma corretora, seja uma criptomoeda 100% original ou apenas uma nova oferta dela (não estava na exchange antes) é comum que ocorra uma corrida para aproveitar o seu preço antes de sua possível valorização. Acontece que essa corrida de compradores justamente é o que faz o valor da cripto inflacionar rapidamente graças à alta demanda logo no seu lançamento. Assim, não é incomum em bons projetos que o preço suba dezenas ou até mesmo milhares de % em poucas horas assim que o ativo é listado, o que permite que se você vender no topo, tenha um lucro expressivo mesmo com investimentos pequenos.

No entanto, considerando que a janela de oportunidade é curta, como conseguir comprar o mais cedo possível no lançamento e vender antes do preço cair novamente?

Aí que entram os sniping bots ou bots sniper.

No mundo dos bots cripto chamamos de sniper os robôs que ficam monitorando um ativo que ainda não foi lançado, para comprá-lo assim que ele for listado, seja em um exchange centralizada ou descentralizada. Em exchanges centralizadas, como a Binance, podemos usar dos anúncios que a exchange promove para nos prepararmos, alertando o mercado de que um novo token será listado e então comprarmos ele rapidamente (sniperbot para Binance aqui).

Já em exchanges descentralizadas (dex), como SushiSwap, não temos anúncios comerciais porque qualquer investidor pode, a qualquer momento, criar um liquidity pool de um novo par de tokens e colocá-lo à disposição para swap na dex. Assim, a todo momento surgem “novas” criptomoedas nas dex o que parece impossibilitar o trabalho para um bot sniper, certo? Errado.

Acontece que toda vez que um novo pool de liquidez é criado em uma dex, ele é feito diretamente na blockchain e dispara um evento. Esses eventos podem ser monitorados e portanto identificados por um robô que então pode iniciar um swap tão logo receba o “sinal”. Depois para vender, é mais simples ainda, ficando a critério do desenvolvedor a lógica da decisão de venda baseado em %, tempo, etc conforme preferir.

O que vamos fazer neste tutorial é justamente isso: um bot que vai ficar monitorando eventos da dex SushiSwap na blockchain, e assim que um evento de pool de liquidez novo for identificado, ele vai comprar uma quantidade de tokens assim que possível.

#2 – Ambiente

Usaremos neste tutorial a tecnologia Node.js, cujo setup deve ser feito antes do projeto começar de fato. Baixe e instale diretamente do site oficial e caso tenha dificuldade, pode usar o vídeo abaixo. O vídeo também ensina a instalar o Visual Studio Code, que é a ferramenta de desenvolvimento que uso.

Você vai precisar também de uma carteira de criptomoedas e se já é usuário da SushiSwap certamente você já tem uma. Usarei aqui a MetaMask como exemplo pois é uma carteira bem popular e que consigo dar algum suporte. Via de regra, qualquer carteira compatível com rede ETH vai servir. Caso ainda não tenha uma MetaMask, no vídeo abaixo eu ensino a criar uma (é grátis). Usarei aqui a rede Sepolia Testnet, com saldos de teste obtidos neste faucet, mas você pode usar qualquer rede suportada pela SushiSwap.

Agora com saldo ETH na carteira e ela apontada para a Sepolia Testnet, pode trocar um pouco por WETH (Wrapped Ether) no contrato deste token (função deposit), pois costuma ser com WETH que os pares de novas moedas são lançados na rede Ethereum. No entanto, entenda que se um novo par, exemplo LTOOLS-XYZ for listado e você não tiver tokens XYZ na carteira, seu bot não conseguirá fazer swap, ok? É impossível prever e aproveitar 100% das oportunidades de listagens.

Para fazer chamadas aos smart contracts da SushiSwap você vai precisar ter acesso a um nó da blockchain que desejará monitorar. Você pode obter um nó gratuitamente com a Infura, um dos maiores provedores de Blockchain as a Service do mundo. Crie uma conta gratuita no site deles e depois crie um node da rede que deseja (eu vou usar Sepolia) para você assim que conseguir entrar no painel. Guarde a API Key que vai receber, vamos precisar dela mais tarde.

E com isso nós estamos com tudo preparado para começar a programar.

Curso Web3 para Iniciantes

#3 – Criando o Projeto

Agora vamos criar nosso projeto Node.js, começando pela criação de uma pasta sushiswap-sniper e inicialização de um projeto Node.js nela.

Depois, vamos instalar as dependências que vamos precisar:

A saber:

  • DotEnv: dependência para carregamento das variáveis de ambiente;
  • Ethers: biblioteca para integração com a blockchain;

Agora crie um arquivo .env na raiz do seu projeto e coloque nele as seguintes variáveis:

  • NETWORK: o nome da rede que vai monitorar, em minúsculas. Ex: sepolia
  • INFURA_API_KEY: informe sua API Key da Infura;
  • TOKEN_ADDRESS: o endereço do contrato do token que vai usar para pagar/receber. Se estiver na Sepolia Testnet, use 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14 para o token WETH, por exemplo;
  • WALLET: endereço público da carteira que vai usar para o bot (você pega ela na MetaMask);
  • PRIVATE_KEY: chave privada da carteira que vai usar para o bot (você pega ela dentro da MetaMask, em Detalhes da Conta);
  • ROUTER_ADDRESS: o endereço do contrato de swap routing da SushiSwap na rede em questão. No caso da Sepolia Testnet, é 0x93c31c9C729A249b2877F7699e178F4720407733;
  • FACTORY_ADDRESS: o endereço do contrato de pool factory da SushiSwap na rede em questão. No caso da Sepolia Testnet, é 0x1f2FCf1d036b375b384012e61D3AA33F8C256bbE;
  • AMOUNT_TO_BUY: a quantidade de TOKEN que será usada em cada compra, na escala ‘ether’, com até 18 casas decimais. Ex: 0.1;

Um ponto de atenção é com os endereços dos tokens ERC-20 que você vai monitorar, pois eles mudam de rede para rede. Usarei como exemplo aqui o monitoramento de pools criados que usem WETH, tudo na rede Sepolia (Ethereum Testnet). Já os endereços dos contratos você obtém aqui.

Crie o arquivo index.js e coloque o código abaixo dentro dele, para carregar o .env e também para testar o carregamento.

Além de carregar o .env para memória, o código acima importa as bibliotecas que vamos usar e guarda as variáveis de ambiente em constantes locais, para facilitar seu uso mais tarde. Também adicionei algumas variáveis auxiliares ao final do código, que vamos precisar e recomendo que coloque algum console.log também, para ver mais facilmente se subiu o projeto com sucesso.

Ainda sobre o código acima, a maioria das constantes e variáveis ainda serão usadas ao longo do código, quando serão melhor explicadas.

Agora ajuste o seu package.json, na seção scripts, para iniciar o index.js, que será o arquivo principal da aplicação.

Assim, se quiser fazer um teste, use sempre o comando abaixo.

O resultado deve ser o código que colocou no index.js, se tiver algum console.log.

#4 – Monitorando os Eventos

A primeira coisa que vamos programar em nosso bot é o monitoramento dos eventos de criação de pools na SushiSwap. Eu discuti bastante o monitoramento ou escuta de eventos, nos mínimos detalhes, neste tutorial, então aqui vamos ser mais diretos.

Primeiro, vamos precisar de 3 ABIs, sendo que o primeiro é para comunicação com a Pool Factory da SushiSwap e os outros dois usaremos mais à frente, quando estivermos nos preocupando com swaps.

Abaixo o ABI da SushiSwap V3 Factory, que você deve salvar na raiz do seu projeto em um arquivo abi.factory.json.

Abaixo o ABI da SushiSwap V3 Router,, que você deve salvar na raiz do seu projeto em um arquivo abi.router.json.

E abaixo o ABI de ERC20 Token, largamente discutido aqui, que você deve salvar na raiz do seu projeto em um arquivo abi.erc20.json.

Agora vamos carregar esses três ABIs logo abaixo das demais variáveis e constantes que definimos no index.js:

Ao final do index.js, adicione uma função start que será responsável pela inicialização do robô, com o código abaixo.

O que esse código faz é:

  1. configura um provedor de websockets na Infura (para receber dados em tempo real);
  2. configura um objeto de comunicação com o contrato Factory da SushiSwap V3 (responsável pela criação dos pools);
  3. definimos um listener que vai ficar escutando via websocket os eventos do tipo PoolCreated, que são disparados sempre que um novo pool é criado;
  4. imprime no console as informações do novo pool

Adicionei ao final um PING a cada 1 minuto, para garantir que a conexão com o nó RPC se mantenha ativa, caso contrário ela pode ser derrubada por ociosidade se ficar vários minutos sem uso.

Com isso rodando, você já tem um bot monitorando o surgimento de novos pools de liquidez (aka novos tokens na dex). Deixe ele rodando e vai perceber como funciona ou então vá no contrato de factory e crie um pool manualmente para ver funcionando mais rapidamente (use WETH e um token ERC20 qualquer, o pool não terá liquidez mas irá disparar nosso monitoramento). Caso queira adicionar um pool já com liquidez, terá de criar um token ERC20 novo e adicionar pela interface web da SushiSwap na Sepolia.

A próxima etapa é justamente fazer a compra, mas este é um assunto para a parte dois deste tutorial, confira aqui!

TAGS:

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

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