Tutorial de Waffle «Hola, mundo» con Hardhat y ethers
En este tutorial de Waffleopens in a new tab, aprenderemos a configurar un proyecto simple de contrato inteligente «Hola, mundo», utilizando hardhatopens in a new tab y ethers.jsopens in a new tab. Luego aprenderemos cómo añadir una nueva funcionalidad a nuestro contrato inteligente y cómo probarlo con Waffle.
Empecemos creando un nuevo proyecto:
yarn inito
npm inity la instalación de los paquetes necesarios:
yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaio
npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chaiEl siguiente paso es crear un proyecto de muestra de Hardhat 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 todoSeleccione Create a sample project
La estructura de nuestro 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 todoAhora 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("Desplegando un Greeter con el saludo:", _greeting);6greeting = _greeting;7}89function greet() public view returns (string memory) {10return greeting;11}1213function setGreeting(string memory _greeting) public {14console.log("Cambiando el saludo de '%s' a '%s'", greeting, _greeting);15greeting = _greeting;16}17}Mostrar todoNuestro 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
greetingal 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("Debería devolver el nuevo saludo una vez que se ha cambiado", 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 todoEl siguiente paso consiste en compilar nuestro contrato y ejecutar las pruebas:
Las pruebas de Waffle utilizan Mocha (un marco de pruebas) con Chai (una biblioteca de aserciones). 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 changedTodo parece ir bien hasta ahora. Añadamos 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 muy cálido, ¿verdad?
Asegurémonos de que eso no ocurra:
Queremos usar el revert de Solidity cuando alguien pase una cadena vacía. Lo bueno es que podemos probar fácilmente esta funcionalidad con el comparador de Chai de Waffle to.be.revertedWith().
1it("Debería revertir al pasar una cadena vacía", 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 "El saludo no debe estar vacío"8 )9})Mostrar todoParece que nuestra nueva prueba no ha pasado:
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 string 1 passing (2s) 1 failingMostrar todoImplementemos esta funcionalidad en nuestro contrato inteligente:
1require(bytes(_greeting).length > 0, "El saludo no debe estar vacío");Ahora, nuestra función setGreeting se ve así:
1function setGreeting(string memory _greeting) public {2require(bytes(_greeting).length > 0, "El saludo no debe estar vacío");3console.log("Cambiando el saludo de '%s' a '%s'", greeting, _greeting);4greeting = _greeting;5}Ejecutemos las pruebas de nuevo:
✓ Should return the new greeting once it's changed (1467ms)✓ Should revert when passing an empty string (276ms)2 passing (2s)¡Enhorabuena! ¡Lo ha conseguido! :)
Conclusión
Hemos creado un proyecto sencillo con Waffle, Hardhat y ethers.js. Hemos aprendido a configurar un proyecto, añadir una prueba e implementar una nueva funcionalidad.
Para ver más comparadores de Chai excelentes con los que probar sus contratos inteligentes, consulte la documentación oficial de Waffleopens in a new tab.
Última actualización de la página: 8 de diciembre de 2023