Tutorial Waffle diz hello world com hardhat e ethers
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 888888 888 888 888 888888 888 888 888 8888888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888888 888 "88b 888P" d88" 888 888 "88b "88b 888888 888 .d888888 888 888 888 888 888 .d888888 888888 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 exemploCrie um hardhat.config.js vazioSaiaExibir tudo
Selecione Create a sample project
A nossa estrutura de projetos deverá ficar assim:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributs10├── .gitignore11├── hardhat.config.js12└── package.jsonExibir tudo
Agora vamos falar sobre alguns desses arquivos:
- Greeter.sol - nosso smart contract escrito em Solidity;
1contract Greeter {2string greeting;34constructor(string memory _greeting) public {5console.log("Deploying a Greeter with greeting:", _greeting);6greeting = _greeting;7}89function greet() public view returns (string memory) {10return greeting;11}1213function setGreeting(string memory _greeting) public {14console.log("Changing greeting from '%s' to '%s'", greeting, _greeting);15greeting = _greeting;16}17}Exibir tudoCopiar
Nosso contrato inteligente pode ser dividido em três partes:
- constructor - onde declaramos uma variável de tipo string chamada
greeting
, - function greet - função que retornará
greeting
quando chamada, - 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!")56 await greeter.deployed()7 expect(await greeter.greet()).to.equal("Hello, world!")89 await greeter.setGreeting("Hola, mundo!")10 expect(await greeter.greet()).to.equal("Hola, mundo!")11 })12})Exibir tudoCopiar
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!")45 await greeter.deployed()6 await expect(greeter.setGreeting("")).to.be.revertedWith(7 "Greeting should not be empty"8 )9})Exibir tudoCopiar
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 vazia1 passagem (2s)1 falhandoExibir 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).
Última edição: @pettinarip(opens in a new tab), 8 de dezembro de 2023