Tutoriel pour "dire bonjour au monde" avec hardhat et ethers
Dans ce tutoriel Waffle(opens in a new tab), nous apprendrons comment créer un simple contrat intelligent "Hello world", en utilisant hardhat(opens in a new tab) et ethers.js(opens in a new tab). Ensuite nous apprendrons conmment ajouter une nouvelle fonctionnalité à notre contrat intelligent et comment la tester avec « Waffle ».
Commençons par créer un nouveau projet :
yarn init
ou
npm init
et l'installation des paquets nécessaires :
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
L'étape suivante est la création d'un projet hardhat basique en exécutant 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👷 Bienvenue dans Hardhat v2.0.3 👷? Que voulez vous faire ? …❯ Create a sample projectCreate an empty hardhat.config.jsQuitAfficher tout
Sélectionnez Create a sample project
Notre structure de projet devrait ressembler à ceci :
1MyWaffleProject2├── contracts3│ └── Greeter.sol4├── node_modules5├── scripts6│ └── sample-script.js7├── test8│ └── sample-test.js9├── .gitattributs10├── .gitignore11├── hardhat.config.js12└── package.jsonAfficher tout
Maintenant, parlons de certains de ces fichiers :
- Greeter.sol - notre contrat intelligent écrit 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}Afficher toutCopier
Notre contrat intelligent peut être divisé en trois parties :
- constructeur - où nous déclarons une variable de type string appelée
greeting
, - function greet - une fonction qui retournera la valeur
greeting
lorsqu'elle est appelée, - function setGreeting - une fonction qui nous permet de changer la valeur
greeting
.
- sample-test.js - notre fichier de tests
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})Afficher toutCopier
La prochaîne étape consiste à compiler notre contrat et à exécuter nos tests :
Les tests Waffle utilisent Mocha (un framework de test) avec Chai (une bibliothèque d'assertions). Tout ce que vous avez à faire est d'exécuter npx hardhat test
et d'attendre que le message suivant apparaisse.
✓ Doit renvoyer le nouveau message de bienvenue une fois qu'il a changé
Tout semble bien pour l'instant, ajoutons une certaine complexité à notre projet
Imaginez une situation où quelqu'un ajoute une chaîne vide comme un salut. Ce ne serait pas un accueil chaleureux, n'est-ce pas ?
Veillons à ce que cela ne se produise pas :
Nous voulons utiliser la version de solidity revert
lorsque quelqu'un passe une chaîne vide. Une bonne chose est que nous pouvons facilement tester cette fonctionnalité avec la correspondance 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 wait greeter.deployed()6 await expect(greeter.setGreeting("")).to.be.revertedWith(7 "Greeting should not be empty"8 )9})Afficher toutCopier
Il semblerait que notre nouveau test n'ait pas réussi :
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 failingAfficher tout
Implémentons cette fonctionnalité dans notre contrat intelligent :
1require(bytes(_greeting).length > 0, "Greeting should not be empty");Copier
Maintenant, notre fonction setGreeting ressemble à ceci :
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}Copier
Exécutons les tests à nouveau :
✓ Should return the new greeting once it's changed (1467ms)✓ Should revert when passing an empty string (276ms)2 passing (2s)
Félicitations ! Vous y êtes arrivé :)
Conclusion
Nous avons réalisé un projet simple avec Waffle, Hardhat et ethers.js. Nous avons appris comment mettre en place un projet, ajouter un test et implémenter de nouvelles fonctionnalités.
Pour plus d'excellents correspondants chai pour tester vos contrats intelligents, consultez la documentation officielle de Waffle(opens in a new tab).
Dernière modification: @pettinarip(opens in a new tab), 8 décembre 2023