Como criar robô/bot trader para PancakeSwap (V3) em Node.js

Cripto

Como criar robô/bot trader para PancakeSwap (V3) em Node.js

Luiz Duarte
Escrito por Luiz Duarte em 28/03/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 trader de criptomoedas que fará swaps em seu nome em uma DEX, a PancakeSwap. A escolha por essa DEX não é por acaso: além dela ser uma das maiores DEX existentes, ela opera em cima da BNB Smart Chain, a blockchain da Binance e com isso acaba aproveitando muito de seu ecossistema como ferramentas de desenvolvimento, documentações e base de usuários. Não obstante, a PancakeSwap é um fork da UniSwap (ensino bot pra ela aqui), a maior DEX do mercado, o que garante que ela segue muitos padrões de desenvolvimento para redes “EVM compatible” (compatíveis com Ethereum Virtual Machine). Assim, uma vez que consiga programar um bot para PancakeSwap, possivelmente conseguirá criar bots para outras redes “EVM compatible” no futuro.

É 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 PancakeSwap 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 PancakeSwap antes, pois são coisas que não ensinarei aqui.

Dito isso, vamos ao tutorial.

#1 – 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 PancakeSwap 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 Ethereum (e consequentemente BNB Smart Chain) vai servir. Caso ainda não tenha uma MetaMask, no vídeo abaixo eu ensino a criar uma (é grátis) e a configurar ela com as configurações e saldo de teste. Também mostro isso nesse tutorial, caso prefira ler ao invés de assistir. Usarei aqui a rede BSC (BNB Smart Chain, antiga Binance Smart Chain), mas você pode usar qualquer rede compatível com EVM.

Agora com saldo na carteira e ela apontada para a Testnet, pode testar as suas configurações na PancakeSwap apontada para Testnet. Experimente se autenticar com sua carteira apontada para Testnet, escolher a rede testnet na PancakeSwap e fazer alguns swaps a fim de ter algumas moedas na carteira de testes, recomendo WBNB e CAKE, além do BNB em si (você pode trocar BNB para WBNB pelo próprio contrato do WBNB, chamando a função deposit).

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

Curso Node.js e MongoDB

#2 – Criando o Projeto

Agora vamos criar nosso projeto Node.js, começando pela criação de uma pasta uniswap 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;
  • Axios: biblioteca para chamadas HTTP;

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

  • INTERVAL: a recorrência do monitoramento, recomendo 300000, que é equivalente a 5 minutos;
  • TOKEN0_ADDRESS: o endereço do contrato do token que vai negociar via bot. Se estiver na BSC Testnet, use
    0x8d008B313C1d6C7fE2982F62d32Da7507cF43551 para o token CAKE, por exemplo;
  • TOKEN1_ADDRESS: o endereço do contrato do token que vai usar para pagar/receber. Se estiver na BSC Testnet, use
    0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd para o token WBNB, 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 PancakeSwap v3 na rede em questão. No caso da BSC Testnet, é
    0x1b81D678ffb9C0263b24A97847620C99d213eB14;
    PROVIDER_URL: o endereço RPC do nó da blockchain que seu robô vai se conectar. Se estiver na BSC Testenet, use https://data-seed-prebsc-1-s1.binance.org:8545
    API_KEY: a sua chave da API de monitoramento de preço (falarei dela mais adiante);
  • PRICE_TO_BUY: o preço que servirá como gatilho para o bot comprar a moeda, em dólares. Ex: 5;
  • AMOUNT_TO_BUY: a quantidade de TOKEN1 que será usada em cada compra, na escala ‘ether’, com até 18 casas decimais. Ex: 0.1;
  • PROFITABILITY: o multiplicador percentual que será usado como gatilho de venda. Ou seja, define a sua lucratividade. Ex: 1.1 (=10%);

Muita atenção aqui à variável INTERVAL, pois cada chamada à API de monitoramento de preço consome créditos e o plano free deles tem limitação de uso (falarei disso mais adiante). Outro 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 a cada 5 minutos do preço em dólar do token CAKE e estarei comprando e vendendo ele usando WBNB, tudo na rede BSC Testnet.

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.

#3 – Monitorando o Mercado

A primeira coisa que vamos programar em nosso bot é o monitoramento do mercado. Diferente das exchanges centralizadas, que nos fornecem APIs com dados prontos para tudo, nas DEX não temos tanto ferramental para construir bots e espero que isso no futuro mude. No caso da PancakeSwap eles até tinham uma API básica de preço, mas que não está mais disponível e o caminho recomendado é consultar diretamente na blockchain. Felizmente existem projetos como da 0x.org que fazem isso pra gente, desde que respeitemos o rate limit de 40 requests por minuto e 1 request por segundo (conta free).

Para usar a 0x.org você precisará de uma API Key, que você obtém ao se inscrever em qualquer um dos planos do site, incluindo o gratuito. Faça a criação da sua conta, confirme seu email clicando no link que vão enviar e assim que chegar no seu dashboard, terá sua API Key para copiar, como abaixo.

Para usar a nossa recém criada API Key primeiro você deve colocá-la no arquivo .env, na variável API_KEY mais especificamente. É importante salientar que a 0x.org não fornece APIs apontadas para a Testnet e na data que escrevo este tutorial não encontrei ninguém que tenha feito este trabalho pela comunidade, então iremos pegar os preços de produção mesmo, ok? Isso certamente vai atrapalhar qualquer estratégia que tente elaborar em seus testes de desenvolvimento, mas não deve impactar quando estiver apontado para produção.

A função de obter o preço (em dólares) pode ser vista abaixo e é explicada logo em seguida (coloque no index.js).

Nesta função nós fazemos uma chamada GET simples à URL da API, informando o endereço do contrato do Token que queremos consultar o preço e passando nossa API Key no header exigido na documentação deles. Enquanto que os endereços dos contratos de produção você pode obter no site BSCScan ou no site da PancakeSwap, os endereços dos contratos de teste devem ser obtidos na no Testnet BSCScan. Atenção a essa mistura: sempre consulte preços usando os endereços dos tokens de produção, mas mais tarde, durante os swaps, deverá usar os endereços da Testnet, a menos que já queira operar apontado para produção (mainnet).

Esta chamada GET retorna um objeto com uma série de informações sobre o token, sendo a mais importante delas o preço do mesmo (em dólares, pois nosso buyToken é USDT). Importante salientar novamente que este preço é o de produção e que na Testnet os preços são completamente zoados uma vez que os mercados não possuem liquidez. Novamente: isto não atrapalha nosso desenvolvimento, mas esqueça teste de estratégia na Testnet.

Agora vamos chamar esta função getPrice no index.js.

Assim, a cada x tempo o seu bot monitora o preço chamando a API, o que no futuro nos permitirá usar essa informação como gatilho para os swaps.

A próxima etapa é justamente fazer a compra ou a venda literalmente, mas este é um assunto para a parte dois deste tutorial que você confere aqui.

Teve algum problema? Confira este artigo com os erros mais comuns!

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 *