WEB3DEV

Jhonattan Farias
Jhonattan Farias

Posted on

Como automatizar o Yield Farming | Colhendo recompensas com um script rápido e sujo

Configurando uma hot wallet

Uma hot wallet é uma carteira digital que armazena fundos e sua chave privada é armazenada em um dispositivo conectado à Internet. Geralmente, eles devem ser evitados porque as hot wallets são mais fáceis de hackear do que as carteiras de armazenamento a frio ou um plug-in de navegador como a Metamask. No entanto, se você deseja executar scripts, precisa da carteira que detém os fundos para assinar a transação e reivindicá-los.

Este script usa dotenv para armazenar um endereço Ethereum e uma chave privada. Você pode dar um passo adiante e criptografar todos os dados e usar uma frase secreta na execução.

Se você não tiver um endereço de carteira, poderá exportar um da Metamask ou usar um gerador de carteira como este: https://github.com/jamesbachini/Ethers-Vanity-Address

O endereço pode então ser colocado em um arquivo de texto chamado .env com as variáveis ​​dispostas assim:

auroraAddress=0x0000000000123
auroraPrivateKey=0x000000000000000000456
Enter fullscreen mode Exit fullscreen mode

Também vale a pena pensar de onde você executará o script. Ele pode ser executado a partir de um computador pessoal, mas somente quando esse computador estiver ligado, você poderá configurar uma tarefa automatizada, por exemplo. Uma alternativa seria configurar uma instância de nuvem segura dedicada (servidor) e executar o script lá para que ele possa ser executado 24 horas por dia, 7 dias por semana, por meio de um cron job.


Usando um Explorador de Blocos

Vamos precisar de algumas informações, como endereços de contrato e nomes de funções. Para obtê-los, executaremos o processo de Yield Farming que queremos automatizar manualmente e depois colamos os endereços de transação em um explorador de blocos.

Para este tutorial, usarei uma exchange descentralizada chamada Trisolaris na blockchain Aurora do protocolo Near. A Aurora é uma cadeiacompatível com a EVM (máquina virtual Ethereum), portanto, esse tipo de script funcionará com outras plataformas como Sushiswap no Ethereum ou na camada 2 também. A Aurora também não possui taxas de transação, o que a torna ideal para esse tipo de script de composição automática, porque as taxas de gás não interferem nos lucros compostos.

A primeira etapa é reivindicar recompensas TRI para minha posição de liquidez TRI-USDT aqui: https://www.trisolaris.io/#/tri/0xFa94348467f64D5A457F75F8bc40495D33c65aBB/0x4988a896b1227218e4A686fdE5EabdcAbd91571f/11

A segunda etapa é apostar o TRI reivindicado aqui: https://www.trisolaris.io/#/stake

Assim que confirmarmos a transação no Metamask, recebemos um recibo com a opção de visualizar a tx em um explorador de blocos. Esta é a transação do explorador de blocos para a função de farming e para reivindicar recompensas.

Imagem que mostra a descrição do retorno da transação

Você pode ver que temos algumas informações úteis aqui. O endereço "Interacted With" nos fornece o endereço do contrato para o gerente do pool. O “Call” nos dá um layout para a função para que possamos escrever uma ABI improvisada e a variável pid ou pool ID é mostrada abaixo da qual precisaremos no script para informar ao contrato de qual pool queremos reivindicar tokens.


Automatize o Yield Farming com Node.js e Ethers.js

Para este script, estarei usando o NodeJS, que é um runtime Javascript para executar scripts de linha de comando. Ele pode ser instalado aqui: https://nodejs.org/

Também usarei Ethers.js, que é uma biblioteca para interagir com contratos inteligentes. Você também pode usar a popular biblioteca Web3.js, pois são muito semelhantes.

Depois que o node.js estiver instalado, vamos abrir um terminal (prompt de comando) e navegar até o diretório onde salvamos o arquivo .env. Em seguida, use o npm para instalar os dois módulos que discutimos.

cd c:\mydirectory\
npm install ethers
npm install dotenv
Enter fullscreen mode Exit fullscreen mode

A última coisa que precisamos é de um editor de texto e, para isso, recomendo o Microsoft VSCode.

Definir endereços e funções

Agora vamos criar um novo arquivo usando o editor de texto e chamá-lo de autocompound.js

Vamos importar e configurar nossas bibliotecas

import { ethers } from 'ethers';
import dotenv from 'dotenv';
dotenv.config();

const provider = new ethers.providers.JsonRpcProvider(`https://mainnet.aurora.dev`);
const signer = new ethers.Wallet(process.env.auroraPrivateKey, provider);
Enter fullscreen mode Exit fullscreen mode

Você notará que estou usando a URL mainnet.aurora.dev para o provedor RPC. Se você quisesse configurar o Ethereum, normalmente usaria um provedor de RPC como o Infura.

A variável signer usa a chave privada definida no arquivo .env anterior para criar uma instância da wallet.

Agora vamos definir algumas ABIs, uma ABI é como um plano de layout para um contrato inteligente e informa ao nosso script como empacotar dados para enviar em uma transação.

Nosso script precisa executar duas transações de contrato diferentes, uma para coletar tokens TRI e outra para apostar esses tokens TRI para tokens xTRI. Para isso, precisaremos de uma ABI de token ERC20 padrão para verificar os saldos, uma ABI para o contrato de farming e uma ABI para o contrato de staking.

const erc20Abi = ["function balanceOf(address) view returns (uint)"];
const poolAbi = ["function harvest(uint256 pid,address to)"];
const stakingAbi = ["function enter(uint256 _triAmount)"];
Enter fullscreen mode Exit fullscreen mode

Agora vamos configurar alguns endereços de contrato

const triToken= `0xFa94348467f64D5A457F75F8bc40495D33c65aBB`;
const xtriToken = `0x802119e4e253D5C19aA06A5d567C5a41596D6803`; // staking token
const triPool = `0x3838956710bcc9D122Dd23863a0549ca8D5675D6`; // TRI-USDT
const triStaking = `0x802119e4e253d5c19aa06a5d567c5a41596d6803`;
const poolID = 4; // TRI-USDT
Enter fullscreen mode Exit fullscreen mode

O contrato triPool foi o da captura de tela do explorador de blocos anterior. Também podemos ver os endereços do contrato do token clicando nos nomes dos tokens no explorador de blocos. O contrato triStaking é da segunda transação até as recompensas da aposta e o poolID é o que encontramos anteriormente em relação a qual pool queremos colher recompensas.


Verificar saldos

Agora vamos nos conectar aos contratos de token TRI e xTRI e verificar nossos saldos para garantir que tudo esteja funcionando.

const xtri = new ethers.Contract(xtriToken, erc20Abi, provider);
const tri = new ethers.Contract(triToken, erc20Abi, provider);
let xtriBalance = await xtri.balanceOf(process.env.auroraAddress);
console.log('$xTRI: ',ethers.utils.formatEther(xtriBalance.toString()));
let triBalance = await tri.balanceOf(process.env.auroraAddress);
console.log('$TRI: ',ethers.utils.formatEther(triBalance.toString()));
Enter fullscreen mode Exit fullscreen mode

Estamos usando o endereço do contrato de token e a ABI erc20 para configurar isso, chamando o balanceOf e passando nosso endereço do arquivo .env.

O resultado é então convertido em uma string legível e impresso na tela usando console.log();


Recompensas de coleta

Agora vamos entrar na parte divertida e colher algumas recompensas.

const pool = new ethers.Contract(triPool, poolAbi, provider);
const signedpool = pool.connect(signer);
const harvestTX = await signedpool.harvest(poolID, process.env.auroraAddress);
console.log(`harvestTX: ${harvestTX.hash}`);
Enter fullscreen mode Exit fullscreen mode

Observe que, porque esta é uma transação de gravação, precisamos assiná-la e criar uma instância signPool com nossa autorização de carteira.

Poderíamos então verificar novamente os saldos para garantir que as recompensas do TRI tenham sido colhidas.


Recompensas de Apostas

A partir daqui, queremos apostar nas recompensas do token TRI que acabamos de colher usando o contrato de aposta.

const staking = new ethers.Contract(triStaking, stakingAbi, provider);
const signedStaking = staking.connect(signer);
const stakingTX = await signedStaking.enter(triBalance);
console.log(`stakingTX: ${stakingTX.hash}`);
Enter fullscreen mode Exit fullscreen mode

Novamente, esta é uma transação de gravação que requer autorização, portanto, precisamos configurar uma instância de SignStaking. O nome da função é “enter” para entrar no staking pool e estamos passando por um triBalance atualizado.


Testes e tempos limite

Ao testar, tive problemas com ele indo rápido e obtendo problemas de nonce duplicados nas transações enfileiradas. Eu adicionei cerca de 2 segundos de tempo limite entre cada estágio que corrigiu esse problema e deu tempo a blockchain para recuperar o atraso.

await new Promise(r => setTimeout(r, 2000));
Enter fullscreen mode Exit fullscreen mode

Por fim, atualizei e imprimi os saldos de tokens mais uma vez para garantir que tudo tivesse saído conforme o esperado.

triBalance = await tri.balanceOf(process.env.auroraAddress);
console.log('$TRI: ',ethers.utils.formatEther(triBalance.toString()));
xtriBalance = await xtri.balanceOf(process.env.auroraAddress);
console.log('$xTRI: ',ethers.utils.formatEther(xtriBalance.toString())); 
Enter fullscreen mode Exit fullscreen mode

Código-fonte aberto

Claro que tudo isso é código-fonte aberto e está disponível no Github:

https://github.com/jamesbachini/Aurora-Trisolaris-Auto-Compound-Script

Observe que é para fins educacionais, não foi auditado e não está pronto para uso em transações financeiras.

Espero que este tutorial sobre como automatizar uma Yield Farming tenha servido como um bom exemplo de como você pode explorar as funções de contratos inteligentes por trás das interfaces do usuário e interagir com seu próprio código.

Isto é o que se parece quando executado: -

Imagem que mostra como se parece o script ao ser executado

Você quer se manter atualizado com os últimos desenvolvimentos na comunidade de criptomoedas? Receba o boletim informativo do setor Blockchain, faça uma maratona no canal do YouTube e conecte-se comigo no Twitter

Este artigo foi criado por James Bachini e traduzido por Jhonattan Farias, você pode encontrar o artigo original aqui.

Latest comments (0)