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
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.
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
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);
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)"];
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
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()));
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}`);
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}`);
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));
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()));
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: -
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)