In this section, we will be writing scripts to test the functionality of our smart contract . To get started, navigate to your scripts folder, create a new file named bmc-sample.js and paste the following code in it:
consthre=require("hardhat");// Logs the KLAY balances of a specific address.asyncfunctiongetBalance(address) {constbalanceBigInt=awaithre.ethers.provider.getBalance(address);returnhre.ethers.utils.formatEther(balanceBigInt)}// Logs the KLAY balances for a list of addresses.asyncfunctiongetBalances(addresses) {let idx =0;for (constaddressof addresses) {console.log(`address ${idx} balances`,awaitgetBalance(address)); idx++; }}// Logs all the coffee info stored on-chain from coffee tx.asyncfunctiongetAllCoffee(memos) {for (constmemoof memos) {consttimestamp=memo.timestamp;constsender=memo.sender;constname=memo.name;constmessage=memo.messageconsole.log(`At ${timestamp}, ${name}, with ${sender}, said: "${message}"`); }}asyncfunctionmain() {const [owner,tipper1,tipper2,tipper3 ] =awaithre.ethers.getSigners();constBuyMeACoffee=awaithre.ethers.getContractFactory("BuyMeACoffee");constbuyMeACoffe=awaitBuyMeACoffee.deploy();awaitbuyMeACoffe.deployed();console.log(`BuyMeACoffee Contract Address`,buyMeACoffe.address);// (========Check Balance==========)constaddressses= [owner.address,tipper1.address,buyMeACoffe.address];console.log("======GET BALANCE=======");awaitgetBalances(addressses);// Buy Coffee for ownerconsttip= {value:hre.ethers.utils.parseEther("1")}awaitbuyMeACoffe.connect(tipper1).buyCoffee("Alice","Hi Jude", tip);awaitbuyMeACoffe.connect(tipper2).buyCoffee("Bob","Hi Alice", tip);awaitbuyMeACoffe.connect(tipper3).buyCoffee("Japhet","Hi Ox", tip);// check balance after tipping console.log("======GET BALANCE AFTER TIPPING=======");awaitgetBalances(addressses);// withdraw coffee tipsawaitbuyMeACoffe.connect(owner).withdrawCoffeTips();// check balance after withdrawing tip console.log("======GET BALANCE AFTER WITHDRAWING TIP=======");awaitgetBalances(addressses);// get the current coffee tx id.constcoffeeId=awaitbuyMeACoffe.coffeeId()constid=coffeeId.toString();console.log(coffeeId.toString());// get all existing coffee txconstallCoffee=awaitbuyMeACoffe.getAllCoffee(id);awaitgetAllCoffee(allCoffee);}// We recommend this pattern to be able to use async/await everywhere// and properly handle errors.main().catch((error) => {console.error(error);process.exitCode =1;});
As always, lets go over what each line of code does:
You will notice that at the top of the code, there exist some helper functions for getting the balances of both a single address and multiple addresses. Also in the code exists the main function which houses the functionality of testing our smart contract.
Let's do a walk through of the code in the main() function.
First we set the list of accounts (owner, tipper1, tipper2, tipper3) for test purposes by calling await hre.ethers.getSigners()
Next we created a contract instance and deployed it. In this case the BuyMeACoffee.sol contract.
Then, we set a list of addressees, checked their balances using the getBalances() function. We then called the buyCoffee function on three different instances. Next we checked each addresses balance after the coffee transaction.
That said, we then called the withdraw function to withdraw all funds to the owner address. Next we checked the addresses balance after withdrawal.
Finally, we got all the coffee transactions in the smart contract by calling the getAllCoffee() function. To see the script in action, run the command below:
npxhardhatrunscripts/bmc-coffee.js
You should have an output in your terminal that looks like this: