Tutorial de Waffle "Hola, Mundo" con hardhat y ethers
En este tutorial de Waffle(opens in a new tab), aprenderemos cómo configurar un proyecto de contrato inteligente simple "Hola, Mundo" usando hardhat(opens in a new tab) y ethers(opens in a new tab). Luego aprenderemos cómo añadir una nueva funcionalidad a nuestro contrato inteligente y cómo hacer pruebas con Waffle.
Empecemos por la creación de un nuevo proyecto:
yarn init
o
npm init
y la instalación de los paquetes necesarios:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
o
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
El siguiente paso es crear un proyecto de hardhat de muestra ejecutando 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 👷? What do you want to do? …❯ Create a sample projectCreate an empty hardhat.config.jsQuitMostrar todo
Seleccione Create a sample project
.
La estructura del proyecto debería verse así:
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributes10├── .gitignore11├── hardhat.config.js12└── package.jsonMostrar todo
Ahora hablemos de algunos de estos archivos:
- Greeter.sol: nuestro contrato inteligente escrito en 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}Mostrar todoCopiar
Nuestro contrato inteligente se puede dividir en tres partes:
- constructor: donde declaramos una variable de tipo cadena llamada
greeting
; - función greet: una función que devolverá el
greeting
al ser invocada; - función setGreeting: una función que nos permite cambiar el valor de
greeting
.
- sample-test.js: nuestro archivo de pruebas
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})Mostrar todoCopiar
El siguiente paso consiste en compilar nuestro contrato y ejecutar pruebas:
Las pruebas de Waffle usan Mocha (un framework de pruebas) con Chai (una biblioteca de afirmaciones). Todo lo que tiene que hacer es ejecutar npx hardhat test
y esperar a que aparezca el siguiente mensaje.
✓ Should return the new greeting once it's changed
Todo se ve bien hasta ahora, vamos a añadir un poco más de complejidad a nuestro proyecto
Imagine una situación en la que alguien añade una cadena vacía como saludo. No sería un saludo cálido, ¿cierto?
Asegurémonos de que eso no suceda:
Queremos usar revert
de solidity cuando alguien pase una cadena vacía. Algo bueno es que podemos probar esta funcionalidad fácilmente con el emparejador de chai de 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})Mostrar todoCopiar
Parece que nuestra nueva prueba no pasó:
Deploying a Greeter with greeting: Hello, world!Changing greeting from 'Hello, world!' to 'Hola, mundo!'✓ Should return the new greeting once it's changed (1514ms)Deploying a Greeter with greeting: Hello, world!Changing greeting from 'Hello, world!' to ''1) Should revert when passing an empty string1 passing (2s)1 failingMostrar todo
Vamos a implementar esta funcionalidad en nuestro contrato inteligente:
1require(bytes(_greeting).length > 0, "Greeting should not be empty");Copiar
Ahora, nuestra función setGreeting se ve así:
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 a ejecutar pruebas de nuevo:
✓ Should return the new greeting once it's changed (1467ms)✓ Should revert when passing an empty string (276ms)2 passing (2s)
¡Felicidades! Lo logró :)
Conclusión
Hicimos un proyecto sencillo con Waffle, Hardhat y ethers.js. Aprendimos a crear un proyecto, añadir una prueba e implementar nuevas funcionalidades.
Para ver más excelentes emparejadores de chai para probar su contrato inteligente, consulte los documentos oficiales de Waffle(opens in a new tab).
Última edición: @pettinarip(opens in a new tab), 8 de diciembre de 2023