Pular para o conteúdo principal

Tutorial Waffle diz hello world com hardhat e ethers

wafflecontratos inteligentessoliditytestandohardhatethers.js
Intermediário
MiZiet
16 de outubro de 2020
4 minutos de leitura minute read

Neste tutorial do Waffle(opens in a new tab), aprenderemos como criar um simples projeto de contrato inteligente "Hello world", usando hardhat(opens in a new tab) e ethers. s(opens in a new tab). Em seguida, aprenderemos como adicionar uma nova funcionalidade ao nosso contrato inteligente e como testá-lo com Waffle.

Vamos começar criando um novo projeto:

yarn init

ou

npm init

e instalando os pacotes necessários:

yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

ou

npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai

O próximo passo é criar um projeto hardhat de amostra, executando npx hardhat.

888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
888 888 "88b 888P" d88" 888 888 "88b "88b 888
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
👷 Welcome to Hardhat v2.0.3 👷‍
? O que você deseja fazer? …
★ Crie um projeto de exemplo
Crie um hardhat.config.js vazio
Saia
Exibir tudo

Selecione Create a sample project

A nossa estrutura de projetos deverá ficar assim:

1MyWaffleProject
2├── contracts
3│ └── Greeter.sol
4├── node_modules
5├── scripts
6│ └── sample-script.js
7├── test
8│ └── sample-test.js
9├── .gitattributs
10├── .gitignore
11├── hardhat.config.js
12└── package.json
Exibir tudo

Agora vamos falar sobre alguns desses arquivos:

  • Greeter.sol - nosso smart contract escrito em Solidity;
1contract Greeter {
2string greeting;
3
4constructor(string memory _greeting) public {
5console.log("Deploying a Greeter with greeting:", _greeting);
6greeting = _greeting;
7}
8
9function greet() public view returns (string memory) {
10return greeting;
11}
12
13function setGreeting(string memory _greeting) public {
14console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
15greeting = _greeting;
16}
17}
Exibir tudo
Copiar

Nosso contrato inteligente pode ser dividido em três partes:

  1. constructor - onde declaramos uma variável de tipo string chamada greeting,
  2. function greet - função que retornará greeting quando chamada,
  3. function setGreeting - uma função que nos permite alterar o valor da função greeting.
  • sample-test.js - nosso arquivo de testes
1describe("Greeter", function () {
2 it("Should return the new greeting once it's changed", async function () {
3 const Greeter = await ethers.getContractFactory("Greeter")
4 const greeter = await Greeter.deploy("Hello, world!")
5
6 await greeter.deployed()
7 expect(await greeter.greet()).to.equal("Hello, world!")
8
9 await greeter.setGreeting("Hola, mundo!")
10 expect(await greeter.greet()).to.equal("Hola, mundo!")
11 })
12})
Exibir tudo
Copiar

O próximo passo consiste em compilar nosso contrato e executar testes:

Testes de Waffle usam Mocha (um framework de teste) com Chai (uma biblioteca de asserção). Tudo o que você precisa fazer é executar npx hardhat test e esperar que a seguinte mensagem apareça.

✓ Deve retornar a nova saudação uma vez alterada

Tudo parece ótimo até agora, vamos adicionar mais complexidade ao nosso projeto

Imagine uma situação quando alguém adiciona uma string vazia como saudação. Não seria uma saudação calorosa, né?
Vamos nos certicar que isso não aconteça:

Queremos usar o revert do Solidity quando alguém passar uma string vazia. Uma coisa boa é que podemos facilmente testar esta funcionalidade com o chai matcher do Waffle to.be.revertedWith().

1it("Should revert when passing an empty string", async () => {
2 const Greeter = await ethers.getContractFactory("Greeter")
3 const greeter = await Greeter.deploy("Hello, world!")
4
5 await greeter.deployed()
6 await expect(greeter.setGreeting("")).to.be.revertedWith(
7 "Greeting should not be empty"
8 )
9})
Exibir tudo
Copiar

Parece que o nosso novo teste não passou:

Implantando um Greeter com saudação: Olá, mundo!
Mude de saudação de 'Hello, world!' para 'Hola, mundo!'
✓ Deve devolver a nova saudação uma vez que ela tenha sido alterada (1514ms)
Implantando um Greeter com saudação: Olá, mundo!
Mudar saudação de 'Olá, mundo!' para ''
1) Deve reverter quando passar uma seqüência vazia
1 passagem (2s)
1 falhando
Exibir tudo

Vamos implementar esta funcionalidade em nosso contrato inteligente:

1require(bytes(_greeting).length > 0, "Greeting message is empty");
Copiar

Agora, nossa função setGreeting se parece com isso:

1function setGreeting(string memory _greeting) public {
2require(bytes(_greeting).length > 0, "Greeting should not be empty");
3console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);
4greeting = _greeting;
5}
Copiar

Vamos executar os testes novamente:

✓ Deve retornar a nova saudação quando ela for alterada (1467ms)
✓ Deve reverter quando passar uma string vazia (276ms)
2 passagem (2s)

Parabéns! Você terminou :)

Conclusão

Fizemos um projeto simples com Waffle, Hardhat e ethers.js. Aprendemos como criar um projeto, adicionar um teste e implementar novas funcionalidades.

Para mais combinações excelentes de chai para testar seus smart contracts, confira a documentação oficial da Waffle(opens in a new tab).

Este tutorial foi útil?