Como criar bot trader para PancakeSwap (V2) em Node.js

Bot Cripto

Como criar bot trader para PancakeSwap (V2) em Node.js

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

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

Este tutorial é para PancakeSwap v2. Se procura PancakeSwap v3, leia este.

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. Importante ressaltar que este é um tutorial para PancakeSwap v2. Se o que procura é robô para PancakeSwap v3, use este outro tutorial.

Se preferir, pode assistir ao vídeo abaixo, que possui o mesmo conteúdo.

#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 USDT (ou outra stable coin), WBNB e CAKE, além do BNB em si.

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

#2 – Criando o Projeto

Vamos começar criando nosso projeto. Para fazer isso, crie uma pasta no seu computador e dentro dela (navegue pelo terminal de linha de comando usando ‘cd’) rode o comando abaixo, para inicializar ela como um projeto Node.js.

Agora vamos criar um arquivo index.js, que será o coração do nosso bot. Esse arquivo deverá ter um mecanismo de execução infinita para garantir que nosso bot fique operando 24h por dia, 7 dias por semana. Para isso vou usar o setInterval do JavaScript, determinando um tempo x entre cada execução do nosso bot.

No exemplo acima coloquei para ele executar a cada 3 segundos (3000ms) e você pode testar esse código executando o programa. Para isso, você pode rodar o index.js com o comando abaixo, considerando que você esteja na pasta do projeto.

O resultado deve ser uma mensagem sendo impressa a cada 3 segundos ou outro tempo qualquer que você tenha definido.

Algumas informações que nosso bot vai precisar estão disponíveis na API da PancakeSwap. Outras, estão disponíveis na nossa carteira MetaMask. Em ambos os casos precisaremos de pacotes adicionais em nosso projeto para podermos consumir estes informações. Para isso, instale algumas dependências na pasta do projeto usando o comando abaixo.

As dependências que instalamos foram:

  • dotenv: pacote para fazer gestão de variáveis de ambiente;
  • axios: pacote para consumir API HTTP;
  • ethers: pacote para se integrar à MetaMask;

O pacote DotEnv requer que a gente crie um arquivo .env na raiz do nosso projeto e coloque dentro dele as nossas variáveis de ambiente. Faça isso e dentro defina as seguintes variáveis.

As variáveis que definimos e que você deve preencher, são:

  • WALLET: o endereço público da sua carteira MetaMask, criada na etapa anterior do tutorial;
  • MNEMONIC: a frase mnemônica (12 palavras) da sua carteira MetaMask, obtida na criação da carteira;
  • PROVIDER_URL: a URL de um full node da rede BNB Smart Chain. Aqui pode deixar o endereço que forneci, que é o de um nó da Testnet da Binance;
  • API_KEY: a sua chave de API que vamos usar para obter as cotações/preços, falarei sobre ela mais adiante;

Agora ajuste o seu package.json, na seção scripts, para que nosso .env seja carregado quando o programa iniciar.

Assim, se quiser fazer um novo teste agora, use sempre o comando abaixo ao invés do que usamos anteriormente.

O resultado deve ser o mesmo de antes, apenas que na memória do programa agora você tem acesso às variáveis de ambiente também.

#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. Depois, vamos criar um novo arquivo em nosso projeto que vai ser o api.js, onde vamos concentrar todas as funções de comunicação com a PancakeSwap, seja via 0x.org, seja via BNB Smart Chain. É 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 api.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 este nosso módulo api e sua função getPrice no index.js e adicionar algumas novas constantes para definir nosso preço e lucratividade alvos.

PRICE_TO_BUY define o gatilho de compra da moeda, baseado em preço. PROFITABILITY define o percentual de lucro que você quer ter em cima da compra, ou seja, seu gatilho de venda. Assim, a cada x tempo o seu bot monitora o preço chamando a API e se ele estiver abaixo do gatilho de compra, ele imprime uma mensagem. Agora, se o preço estiver acima do preço de compra mais uma lucratividade (10% no exemplo), ele imprime uma mensagem e venda. Já a variável isOpened serve para entender se a posição está aberta (comprada) ou não, o que evita compras ou vendas sucessivas, ele sempre vai comprar uma vez e aguardar para vender.

Com isso rodando, você já tem um bot monitorando o preço de um ativo e decidindo, baseado no preço, se é um bom momento para comprar ou para vender o ativo.

#4 – Conectando na Carteira

O próximo passo é obter uma conexão do seu bot com a sua carteira de criptomoedas, sendo que neste exemplo estou usando a MetaMask. Quando você criou a sua MetaMask (o que fizemos no passo anterior) você recebeu um endereço público e um frase mnemônica, certo? Estas duas informações devem estar agora no seu arquivo .env, sob as variáveis WALLET e MNEMONIC. Também incluímos no .env uma variável PROVIDER_URL que indica a URL de um full node que usaremos para nos conectar na BSC.

Resumindo: usaremos o full node para conexão na blockchain e a carteira para realizar as transações.

Abrindo o nosso api.js, vamos importar a biblioteca Ethers e vamos criar uma função getProvider, que faz a configuração de um objeto de conexão com o full node caso ela ainda não exista, como abaixo.

Repare que uso a classe JsonRpcProvider passando a URL do nosso full node. Simples assim, armazenando a conexão em uma variável “estilo” Singleton. Isto ainda não é a conexão com o full node, mas a configuração do provider.

Agora com esta função, vamos fazer a conexão no full node usando a carteira MetaMask do usuário através de uma função getWallet.

Primeiro obtemos o objeto de configuração do provider, depois recuperamos a carteira usando a frase mnemônica (que é equivalente a ter a chave privada da carteira) e com isso finalmente fazemos a conexão no full node usando a mesma. Com essa conexão, podemos enviar nossas transações para a blockchain a fim de fazer qualquer operação permitida por um smart contract, como os swaps.

Experimente chamar a função getWallet apenas para fins de teste, no index.js e verá se ela está funcionando ou não, já que caso tenha algo errado você terá um erro indicando o que errou. O erro mais comum nestes casos é o de endereço da carteira ou a frase mnemônica estarem errados ou não serem da mesma carteira, então verificar mais de uma vez pode ser uma boa dica aqui.

#5 – Fazendo Swap de Tokens

Agora que já sabemos como fazer a conexão no full node com controle total da nossa carteira cripto, é hora de implementarmos a primeira etapa da função que faz o swap dos tokens, lembrando que você não pode fazer swap de BNB desta forma que vou ensinar aqui, vai dar erro se tentar. Além disso, é importante salientar que todas transações na BSC exigem o pagamento da taxa de gás, que deve ser paga sempre em BNB. Ou seja, apesar de não estar negociando BNBs neste bot, você deve ter BNB na carteira a fim de pagar as taxas, ok?

Volte ao seu arquivo index.js e crie uma nova função, swapTokens, que vai ser usada para…bem…swap de tokens, hehe.

Para que você possa fazer swap de tokens é importante entender um pouco do ABI, ou Application Binary Interface, do contrato de roteamento da PancakeSwap. O contrato de roteamento é o Smart Contract responsável pelo swap dos tokens nas DEX. O ABI nada mais diz do que as regras para chamar as funções do contrato, sendo que existem várias funções ligadas a swap nele e a que julgo interessante de usarmos aqui é a swapExactTokensForTokens.

Nesta função, você tem a seguinte assinatura no ABI e consequentemente na documentação.

Isso quer dizer que o nome da função swapExactTokensForTokens e que ela espera 5 parâmetros.

  • amountIn: quantos tokens você quer gastar/enviar neste swap;
  • amountOutMin: o mínimo que você aceita receber do token-alvo neste swap (pode usar “0” se aceitar o máximo que der, não importando a cotação);
  • path: um array contendo os endereços de roteamento para que essa negociação ocorra (tipicamente o endereço do contrato do token a ser gasto e o do token a ser recebido);
  • to: qual carteira vai fazer a transação;
  • deadline: a data limite para a transação ser aprovada;

Além dos parâmetros o ABI define outras coisas, mas que não nos interessam aqui. Basicamente o que precisamos fazer é usar a biblioteca Ethers para nos conectar no full node, o que já vimos como fazer anteriormente, nos conectarmos no contrato de roteamento e fazermos a transação a partir dele. Tem alguns detalhes neste processo e vou explicando aos poucos pois realmente são vários detalhes.

Abaixo, a primeira parte da função. Nos parâmetros dela, vamos esperar que o usuário informe o endereço da carteira, o endereço do contrato ‘from’ (token que será gasto), a quantidade que vai gastar e o endereço do contrato ‘to’ (token que vai receber).

O primeiro passo é a conexão no full node através da carteira, o que podemos fazer facilmente apenas chamando a função anteriormente criada, getWallet.

A seguir, vamos usar a classe Contract da biblioteca Ethers para fazer a configuração do objeto que vai transacionar com o contrato da DEX. O endereço deste contrato eu coloquei em uma constante, sendo que neste exemplo de código está o endereço da PancakeSwap na Testnet. Mais tarde, troque para Mainnet (0x10ED43C718714eb63d5aA57B78B54704E256024E) quando estiver pronto para operar em produção.

O segundo parâmetro do constructor da classe Contract é um array contendo as funções presentes no ABI. Via de regra deveríamos colocar todas funções do ABI aí, cada uma em uma string do array, mas como só vamos usar uma, só vou colocar ela. Esse código você tira do ABI do contrato, disponível na BSC Scan (basta acessar o endereço do contrato de roteamento) ou na documentação oficial da PancakeSwap e da UniSwap (já que a primeira é um fork da segunda).

E por fim, o terceiro parâmetro do constructor é o objeto account devidamente conectado no full node com a carteira.

Agora temos de configurar a quantidade de tokens que vamos enviar, em wei e o preço do gás a ser pago nesta transação. Faremos isso na linha logo abaixo da configuração do objeto contract.

A variável quantity veio nos parâmetros da nossa função, lembra? Aqui convertemos ela para a notação 10^18 (wei) e depois em string hexadecimal para garantir a precisão da informação.

Na linha de baixo estimamos o preço de gás em 10 gwei, sendo que esse valor pode variar com o passar do tempo, então caso tenha problemas de transação rejeitada por causa de preço de gás muito baixo (“Error: transaction underpriced”), ajuste o valor de acordo. Na data que escrevo este tutorial 10 gwei tem funcionado bem, mas um erro comum que você pode ter é o “Error: insufficient funds for gas * price + value” caso tenha especificado algum desses valores exageradamente alto ou o “Error: insufficient funds for intrinsic transaction cost”, na mesma situação.

Agora, para finalizarmos a função, vamos chamar a função do contrato e passarmos todos os parâmetros necessários para que a transação aconteça, como abaixo.

A função swapExacyTokensForTokens vai disparar a função homônima no contrato, onde o primeiro parâmetro é a string hexadecimal contendo a quantidade de tokens a serem gastos/enviados, o segundo parâmetro é o mínimo que você espera receber, o terceiro parâmetro é o array com os endereços dos contratos que fazem parte do swap (recebidos via parâmetro da função da api.js), seguido do endereço da carteira que vai fazer a transação, do deadline (prazo máximo) para a transação ser concluída e as configurações de gás.

A deadline eu coloquei em 10 segundos no futuro, mas isso talvez você precise ajustar se quiser correr menos risco de variação de preço (diminua a deadline) ou estiver tendo problemas de não estar tendo tempo suficiente para as transações acontecerem (aumente a deadline, caso a rede esteja sobrecarregada).

Já as configurações de gás estou usando o gasPrice que definimos antes e o gasLimit como 25 mil, que você deve ajustar caso tenha problemas já que essas taxas de gás mudam dependendo da rede e do congestionamento da mesma. Se você não informar estas configurações terá um erro como “UNPREDICTABLE_GAS_LIMIT” ou “Cannot estimate gas; transaction may fail or may require manual gas limit”, indicando que é uma configuração obrigatória.

No final, apenas retorno a transação.

Isso quase deixa nossa função pronta. Quase.

Experimente chamar esta função no seu index.js, seja para comprar ou para vender, como abaixo.

Isso vai quase funcionar.

Curso Node.js

#6 – Aprovando a transferência

O código acima fará com que a transação seja corretamente gerada e enviada para a blockchain. Inclusive você vai receber um recibo da transação como retorno, como abaixo.

No entanto, você vai verificar que nada vai acontecer no saldo das moedas da sua carteira. Então experimente pegar o valor do campo hash e colocar no BSC Scan da Testnet e verá algo como neste exemplo, que contém a mensagem “Fail with error ‘TransferHelper: TRANSFER_FROM_FAILED'”, o que indica que internamente o contrato da DEX tentou fazer uma operação transferFrom, nativa dos tokens ERC20 (e BEP20 por consequência, pela BSC ser um fork da ETH) mas falhou.

Mas por que falhou, se o código estava todo correto?

Isso porque a função transferFrom, conforme especificação ERC-20, permite que um contrato faça transferência de fundos de uma conta para outra, no entanto isso requer uma aprovação prévia (allowance) do dono da carteira que terá seus fundos transferidos delegando essa permissão para o contrato que fará a transferência, a DEX neste caso.

Resumindo: a DEX não pode sair transferindo seus tokens sem a sua aprovação prévia e é isso o que aconteceu aqui. Tentamos fazer a transferência, mas mesmo com a chave privada em mãos, sem autorização prévia e específica para o contrato da DEX, não rola.

Para dar esta permissão vamos criar mais uma função em nosso api.js, que vou chamar de approve, já que este é o nome presente na especificação. Se olharmos olharmos a mesma veremos que a função approve do smart contract deve ter a seguinte assinatura (em Solidity).

O primeiro parâmetro é o endereço do contrato que vamos dar a permissão e o segundo parâmetro é a quantidade que vamos autorizar deste token. Esta função approve está presente em todos os contratos de token, e devemos chamá-la sempre antes de um transferFrom onde vamos gastar/enviar tokens daquele contrato em questão.

Assim, uma versão da função approve no api.js pode ser vista abaixo.

Primeiro obtemos a conexão com o full node através da carteira. Depois, configuramos o contrato com o token que pretendemos gastar/enviar, você vai precisar do endereço do contrato dele aqui.

O parâmetro seguinte é o ABI, que só precisamos ter a função approve, e por último o objeto de conexão à rede.

Uma vez com o contrato configurado para o token que vamos dar a permissão, nós chamamos a função approve passando o endereço do contrato de roteamento da PancakeSwap (que é quem vai gastar os tokens em nosso nome) e a quantidade que pretendemos gastar em nossa próxima transação.

Com esta função pronta, basta voltarmos à nossa função swapTokens e chamar a função approve uma linha antes da swapExactTokensForTokens que faz a transação de fato.

Isso ajusta o último ponto que estava pendente para que nossa função de swap de tokens (não-BNB) funcione corretamente.

Se rodar agora o programa, quando ele entrar na sua lógica de compra ou de venda, vai ver que a transação vai executar com sucesso.

#7 – Swap para BNB

A primeira função que vamos fazer no api.js é a swapToBNB, ou seja, trocar algum token da sua carteira pelo equivalente em BNB. Para fazer isso é muito parecido com o que fizemos na função swapTokens: temos de conectar no full node/provider usando a carteira, conectar no contrato de roteamento da dex, passar a interface da função, configurar parâmetros e aprovar o valor a ser transferido, tudo isso antes da transação em si, como abaixo.

Esta função vai esperar o endereço da carteira que fará o swap, o endereço do contrato do token que vai ser enviado e a quantidade de tokens. A constante ROUTER_CONTRACT é a que usamos anteriormente, indicando o endereço do contrato de roteamento na PancakeSwap, sendo que os dois valores possíveis para esta constante são:

  • Testnet: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1
  • Mainnet: 0x10ED43C718714eb63d5aA57B78B54704E256024E

Já o ABI que usamos é o swapExactTokensForETH, ou seja, trocar uma quantia específica de um token à nossa escolha por tantos BNB quanto for possível. Não se confunda com o ETH no nome da função, pois por questões de compatibilidade a BSC mantém todos os nomes de funções do mesmo jeito que na rede ETH. Assim, sempre que ver ETH ou Ether escrito, considere que estamos falando de BNB ou a moeda nativa da rede que estiver usando.

As configurações de gás permanecem as mesmas e o fluxo de pré-aprovação da quantia também. Já o envio da transação muda um pouco já que temos de informar no path do roteamento o endereço do contrato de WBNB, que aqui eu deixei fixo em uma constante. Os dois valores possíveis para esta constante são:

  • Testnet: 0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd
  • Mainnet: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c

Mas por que devemos usar o contrato de WBNB ao invés de BNB “normal”?

O contrato BNB normal é de autoria e propriedade da Binance, logo acabaríamos caindo na boa e velha centralização novamente. WBNB ou Wrapped BNB é um token associado ao BNB, ou seja, possui exatamente o mesmo valor do mesmo, mas é representado por outro token e possui outro contrato, sendo usado no roteamento dos swaps dentro da PancakeSwap.

Na prática, isso não muda nada na sua carteira, é apenas para fins de transacionar os swaps corretamente mesmo.

Agora você pode alterar o seu index.js caso queira trocar seus tokens para BNB.

Curso Web3 para Iniciantes

#8 – Swap de BNB

A função que ensinei a criar anteriormente serve para fazer o caminho de um token qualquer para BNB. Mas se você quiser fazer o caminho contrário deve utilizar outra função, que vamos chamar de swapFromBNB e que vai esperar a carteira, o contrato do token que deseja receber e quantos BNB deseja gastar. No mais esta função do api.js é bem parecida com a anterior, salvo alguns detalhes que falarei a seguir.

A primeira diferença é o uso da função swapExactETHForTokens, que serve para trocar uma quantia exata de BNB por algum outro token qualquer, na quantidade que for possível. Como esta função é no sentido contrário da anterior, você verá no envio da transação que passamos primeiro o contrato de WBNB e depois o contrato do token desejado.

Outra diferença significativa nesta função é o fato de não haver necessidade de pré-aprovação da quantia a ser gasta. Sim, isso mesmo: quando você quer trocar BNB por outro token não há necessidade de aprovação prévia já que é o token nativo da rede e desta forma possui mecanismos internos diferentes.

E a última diferença é que a quantia a ser gasta deve ser informada no campo value das configurações da transação, logo após as configs de gás. Novamente, essa diferença se deve ao fato de estarmos enviando a moeda nativa da rede.

Com isso, agora você tem todas as funções necessárias para que seu bot possa fazer o swap de qualquer token negociado na PancakeSwap e pode alterar o seu index.js com a sua lógica de swap que for mais vantajosa para você, usando as funções que ensinei.

#9 – Bônus: getBalance

Como bônus quero ensinar você a codificar mais uma função no api.js, desta vez para pegar o saldo de um token na sua carteira. Isso porque pode ser interessante o seu bot dar uma olhada na sua carteira para ver o quanto ele pode comprar ou vender de um token, antes de tentar fazê-lo, certo?

Assim, vamos criar uma nova função no api.js chamada getBalance que vai esperar o endereço da carteira, o endereço do contrato do token e o número de casas decimais do dito-cujo, que definiremos por padrão como sendo 18 casas.

O primeiro passo é obter o objeto provider, que informa onde está nosso full node. Na sequência configuramos nosso objeto Contract com o endereço do token, o ABI da função balanceOf, presente em todos tokens ERC20 e BEP20,  e o provider usado. Repare aqui que não precisamos nos conectar na carteira, isso porque as informações de saldo das carteiras são públicas na blockchain e como é uma operação somente de leitura, não haverá execução de transação e nem incidência de taxas.

Com o contract devidamente configurado, basta passar o endereço da carteira que queremos dar uma olhadinha e teremos o balance daquele token naquela carteira.

A cereja do bolo é a formatação do número que vai vir com a quantidade certa de casas decimais do seu token. Agora sim, todas as vezes que chamar a função getBalance do api.js você terá o saldo de um token à sua escolha na carteira informada.

E com isso espero ter contribuído para seu aprendizado de integração e automação com a dex PancakeSwap usando Node.js.

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

Até a próxima!

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 *