Naar hoofdinhoud gaan

Help deze pagina te vertalen

🌏

Je bekijkt deze pagina in het Engels omdat we hem nog niet hebben vertaald. Help ons deze inhoud te vertalen.

Pagina vertalen

Geen bugs hier!πŸ›

Deze pagina wordt niet vertaald. We hebben deze pagina voorlopig bewust in het Engels laten staan.

Waffle say hello world tutorial with hardhat and ethers

waffle
smart contracts
solidity
testing
hardhat
ethers.js
page-tutorial-undefined
✍️MiZiet
πŸ“†16 oktober 2020
⏱️4 minute read

In this Waffle tutorial, we will learn how to set up a simple "Hello world" smart contract project, using hardhat and ethers.js. Then we will learn how to add a new functionality to our smart contract and how to test it with Waffle.

Let's start with creating new project:

yarn init

or

npm init

and installing required packages:

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

or

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

Next step is creating a sample hardhat project by running 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 πŸ‘·β€
? What do you want to do? …
❯ Create a sample project
Create an empty hardhat.config.js
Quit
Toon alle

Select Create a sample project

Our project's structure should look like this:

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
13
Toon alle

Now let's talk about some of these files:

  • Greeter.sol - our smart contract writen in 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}
18
Toon alle
πŸ“‹ KopiΓ«ren

Our smart contract can be divided into three parts:

  1. constructor - where we declare a string type variable called greeting,
  2. function greet - a function that will return the greeting when called,
  3. function setGreeting - a function that allows us to change the greeting value.
  • sample-test.js - our tests file
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})
13
Toon alle
πŸ“‹ KopiΓ«ren

Next step consists of compiling our contract and running tests:

Waffle tests use Mocha (a test framework) with Chai (an assertion library). All you have to do is run npx hardhat test and wait for the following message to appear.

βœ“ Should return the new greeting once it's changed

Everything looks great so far, let's add some more complexity to our project πŸ™‚

Imagine a situation where someone adds an empty string as a greeting. It wouldn't be a warm greeting, right?
Let's make sure that doesn't happen:

We want to use solidity's revert when someone passes an empty string. A good thing is that we can easily test this functionality with Waffle's chai matcher 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})
10
Toon alle
πŸ“‹ KopiΓ«ren

Looks like our new test didn't pass:

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 failing
Toon alle

Let's implement this functionality into our smart contract:

1require(bytes(_greeting).length > 0, "Greeting should not be empty");
2
πŸ“‹ KopiΓ«ren

Now, our setGreeting function looks like this:

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}
6
πŸ“‹ KopiΓ«ren

Let's run tests again:

βœ“ Should return the new greeting once it's changed (1467ms)
βœ“ Should revert when passing an empty string (276ms)
2 passing (2s)

Congrats! You made it :)

Conclusion

We made a simple project with Waffle, Hardhat and ethers.js. We learned how to set up a project, add a test and implement new functionality.

For more great chai matchers to test your smart contracts, check official Waffle's docs.

Laatst bewerkt: , Invalid DateTime
Pagina bewerken

Was deze pagina behulpzaam?

Website laatst bijgewerkt: 30 september 2022

Ethereum gebruiken

  • Zoek wallet
  • ETH verkrijgen
  • Gedecentraliseerde toepassingen (dapps)
  • Laag 2
  • Run een node
  • Stablecoins
  • Stake ETH

Ecosysteem

  • Community hub
  • Ethereum Foundation
  • Ethereum Foundation-blog
  • Ecosysteem Support Programma
  • Ethereum bug bounty-programma
  • Ecosysteem-subsidieprogramma's
  • Ethereum-merkcontent
  • Devcon