Aula 225: Integrando Contratos Solidity com Hardhat
Nesta aula, vamos explorar como integrar contratos inteligentes Solidity com o Hardhat, um ambiente de desenvolvimento popular para Ethereum. O Hardhat oferece ferramentas poderosas para implantar, testar e interagir com contratos inteligentes de forma eficiente. Ao final desta aula, você deverá ser capaz de configurar um projeto Hardhat, escrever e compilar contratos Solidity, implantá-los em uma blockchain local e executar testes.
Pré-requisitos
Antes de começarmos, certifique-se de que você tem o seguinte instalado:
- Node.js (v12 ou posterior)
- npm (acompanha o Node.js)
- Conhecimento básico de Solidity e contratos inteligentes
Configurando um Projeto Hardhat
Primeiro, vamos criar um novo diretório para o nosso projeto Hardhat e inicializá-lo.
mkdir integracao-hardhat-solidity
cd integracao-hardhat-solidity
npm init -y
Em seguida, instale o Hardhat e as dependências necessárias.
npm install --save-dev hardhat
Agora, inicialize o Hardhat na raiz do seu projeto.
npx hardhat
Siga as instruções para criar um novo projeto Hardhat. Você pode selecionar a opção para criar um projeto de exemplo, que incluirá alguns arquivos e configurações básicas.
Escrevendo um Contrato Solidity
Vamos criar um contrato Solidity simples. Crie um novo arquivo no diretório contracts
chamado SimpleStorage.sol
.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 private storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
Este contrato possui uma variável de estado storedData
e duas funções: set
para armazenar um valor e get
para recuperá-lo.
Compilando o Contrato
Para compilar seu contrato Solidity, execute o seguinte comando:
npx hardhat compile
Você deverá ver os artefatos compilados nos diretórios artifacts
e cache
gerados pelo Hardhat.
Implantando o Contrato
A seguir, vamos criar um script de implantação. Crie um novo diretório chamado scripts
, se ele ainda não existir, e então crie um novo arquivo chamado deploy.js
no diretório scripts
:
async function main() {
const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const simpleStorage = await SimpleStorage.deploy();
await simpleStorage.deployed();
console.log("SimpleStorage implantado em:", simpleStorage.address);
}
// Recomendamos este padrão para poder usar async/await em todo lugar
// e tratar erros adequadamente.
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
Este script implanta o contrato SimpleStorage
na rede Ethereum local.
Para implantar o contrato, primeiro vamos iniciar uma rede local do Hardhat:
npx hardhat node
Em uma nova janela do terminal, implante o contrato:
npx hardhat run scripts/deploy.js --network localhost
Você deverá ver o endereço onde o contrato foi implantado.
Interagindo com o Contrato
Você pode interagir com seu contrato usando outro script. Crie um novo arquivo chamado interact.js
no diretório scripts
:
async function main() {
const [owner] = await ethers.getSigners();
const contractAddress = "SEU_ENDERECO_CONTRATO"; // Substitua pelo seu endereço de contrato implantado
const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const simpleStorage = SimpleStorage.attach(contractAddress);
// Definir valor
const tx = await simpleStorage.set(42);
await tx.wait();
// Obter valor
const storedValue = await simpleStorage.get();
console.log("O valor armazenado é:", storedValue.toString());
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
Certifique-se de substituir SEU_ENDERECO_CONTRATO
pelo endereço real exibido quando você implantou o contrato.
Agora, podemos executar o script para interagir com nosso contrato:
npx hardhat run scripts/interact.js --network localhost
Você deverá ver o valor armazenado sendo exibido no seu terminal.
Executando Testes
O Hardhat vem com suporte embutido para testes. Crie um novo arquivo de teste no diretório test
chamado simpleStorage.test.js
.
const { expect } = require("chai");
describe("SimpleStorage", function () {
let SimpleStorage;
let simpleStorage;
let owner;
beforeEach(async function() {
SimpleStorage = await ethers.getContractFactory("SimpleStorage");
simpleStorage = await SimpleStorage.deploy();
await simpleStorage.deployed();
[owner] = await ethers.getSigners();
});
it("Deve armazenar e recuperar o valor correto", async function () {
await simpleStorage.set(100);
expect(await simpleStorage.get()).to.equal(100);
});
});
Para executar seus testes, execute o seguinte comando:
npx hardhat test
O Hardhat irá compilar seus contratos e executar os testes, oferecendo uma saída sobre o sucesso deles.
Conclusão
Nesta aula, cobrimos como integrar contratos Solidity com o Hardhat. Criamos um contrato Solidity simples, o compilamos, o implantamos em uma blockchain local, interagimos com ele e escrevemos testes automatizados. O Hardhat fornece um conjunto poderoso de ferramentas que facilita o desenvolvimento e teste de contratos inteligentes em um ambiente local, garantindo um processo de desenvolvimento mais tranquilo.
À medida que você continua sua jornada no desenvolvimento Ethereum, considere explorar recursos mais avançados do Hardhat, como plugins, scripts personalizados e integração com frameworks de front-end. Boa codificação!