Implantação de um contrato no Hardhat

Implantação de um smart contract no Hardhat

1. Instalação

Primeiro, certifique-se de ter o Node.js e o npm instalados. Em seguida, crie um novo projeto e adicione o Hardhat:

mkdir my-hardhat-project
cd my-hardhat-project
npm init -y
npm install --save-dev hardhat

2. Criar um Projeto Hardhat

Inicialize um novo projeto Hardhat:

npx hardhat init

Siga as instruções para criar um arquivo hardhat.config.js vazio.

Isso deixará apenas o arquivo hardhat.config.js no seu repositório.

3. Tarefas e Plugins

O Hardhat funciona executando tarefas (tasks) e utilizando plugins. Você pode ver as tarefas disponíveis executando:

npx hardhat

Como exemplos de tarefas, temos: compilar, executar scripts, habilitar um servidor JSON-RPC, acessar o console, verificar um contrato no Etherscan, entre outras. Além disso, é possível utilizar plugins criados pelo Hardhat ou por terceiros que oferecem diversas ferramentas úteis para as diferentes etapas do desenvolvimento. Um plugin essencial é:

@nomicfoundation/hardhat-toolbox ,que contém praticamente tudo que é necessário para desenvolver:

  • Usar ethers.js para interagir com contratos

  • Fazer testes com Mocha e Chai

  • Implantar contratos com Hardhat Ignition

  • Interagir com a rede local de testes do Hardhat

  • Obter métricas do uso de gás

  • Medir a cobertura de testes

Para instalá-lo, execute o seguinte comando no diretório raiz do seu projeto:

npm install --save-dev @nomicfoundation/hardhat-toolbox

Você também deve adicionar a seguinte linha no início do seu arquivo hardhat.config.js:

require("@nomicfoundation/hardhat-toolbox");

4. Escrever um Contrato Inteligente

Crie um diretório chamado contracts/ e dentro dele um arquivo Greeter.sol com o seguinte código:

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "hardhat/console.sol";

contract Greeter {
  string greeting;

  constructor(string memory _greeting) {
    console.log("Deploying a Greeter with greeting:", _greeting);
    greeting = _greeting;
  }

  function greet() public view returns (string memory) {
    return greeting;
  }

  function setGreeting(string memory _greeting) public {
    console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
    greeting = _greeting;
  }
}

5. Compilar Contratos

Para compilar seus contratos, execute:

npx hardhat compile

No nosso exemplo, a execução dessa tarefa criará um diretório chamado artifacts. O ABI do Greeter.sol estará localizado em .artifacts/contracts/Greeter.sol/ e se chamará Greeter.json.

6. Ativar uma Blockchain Local

Assim como o Remix, o Hardhat disponibiliza um blockchain local. Nessa rede, estarão disponíveis 20 contas (endereços com suas chaves privadas), cada uma com 10000 ETH de teste. Para ativar o blockchain local, execute no diretório raiz do seu repositório:

npx hardhat node

Lembre-se de que esses endereços e suas chaves privadas são públicas, pois todos os usuários do Hardhat têm acesso a elas. Se você usar esses endereços na mainnet ou em qualquer rede pública, perderá tudo que tiver neles. Esses endereços devem ser usados apenas no ambiente de testes do Hardhat.

7. Implantar um Contrato na Rede Local

Na raiz do seu repositório, crie um diretório chamado ignition e dentro dele outro chamado modules. Depois, dentro de ignition/modules, crie o script de implantação Greeter.js com o seguinte conteúdo:

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");

const GreeterModule = buildModule("GreeterModule", (m) => {
  const greet = m.contract("Greeter", ["Hola"]);

  return { greet };
});

module.exports = GreeterModule;

Este código faz o seguinte:

  • Chama a função buildModule, que requer um ID de módulo e uma função callback. Nosso módulo se chamará "GreeterModule".

  • A função callback é onde ocorre a definição do módulo. O parâmetro m passado ao callback é uma instância de ModuleBuilder, um objeto com métodos para definir e configurar instâncias de contratos.

  • Ao chamar os métodos do ModuleBuilder, é criado um objeto Future, que representa o resultado da execução de uma etapa que o Hardhat Ignition precisa para implantar uma instância de contrato ou interagir com uma existente.

  • Isso não executa nada na rede; apenas representa internamente.

  • Depois de criado o Future, ele é registrado no módulo e o método o retorna.

  • Neste módulo, é criado um objeto Future chamando o método contract, instruindo o Hardhat Ignition a implantar uma instância do contrato Greeter, especificando "Hola" como o único parâmetro do construtor.

  • Por fim, o objeto Future que representa a instância do contrato Greeter é retornado para ser acessível por outros módulos e para a realização de testes.

Para implantar o smart contract na rede local, execute o seguinte comando em um novo terminal:

npx hardhat ignition deploy ./ignition/modules/Greeter.js

Se tudo funcionar corretamente, você verá a mensagem com o endereço do contrato implantado na rede local.

Deployed Addresses

GreeterModule#Greeter - 0x5FbDB2315678afecb367f032d93F642f64180aa3

Last updated