BTC NOON
  • Home
  • Cryptocurrency
  • Bitcoin
  • Ethereum
  • Blockchain
  • Regulations
  • Altcoin
  • DeFi
  • Web 3.0
No Result
View All Result
BTC NOON
No Result
View All Result
Home Web 3.0

Unit testing and deploying smart contracts with Forge

Xiao Chen Sun by Xiao Chen Sun
March 11, 2023
in Web 3.0
0
Unit testing and deploying smart contracts with Forge
74
SHARES
1.2k
VIEWS
Share on FacebookShare on Twitter


In December 2021, the world’s largest crypto-native funding agency, Paradigm Lab’s CTO Georgios launched a weblog concerning the discharge of a brand new framework for (evm-based) good contract improvement, known as Foundry.

It took the Crypto neighborhood by storm, and shortly grew to become the trade commonplace for improvement and testing of good contracts, owing a lot to its effectivity compared to different frameworks.

With a purpose to perceive the importance of Foundry, we have to first look into the issues it tries to resolve.

The principle drawback that lies with frameworks like Hardhat and Truffle is that they require the builders to know a scripting language like JavaScript/TypeScript with a view to work with the framework.

As these scripting languages are net development-heavy, the solidity developer needn’t know such languages for the good contract improvement as it’s thought of extra backend oriented.

One other subject is that hardhat itself is carried out utilizing TypeScript, so it’s slower than Foundry because the latter is carried out utilizing Rust.

(Notice: In case you are excited about checking the benchmarks, please take a look at this simulation)

Graph comparing compilation times between Forge and Hardhat

Foundry has loads of cool options apart from this like:

  • Name stack traces
  • Interactive debugger
  • Inbuilt-fuzzing
  • Solidity scripting

Now, I hope you might have an outline of Foundry and the need of testing good contracts utilizing Solidity. Foundry ships with two wonderful CLI instruments out-of-the-box:

  • Forge: Used for testing and deployment of good contracts
  • Solid: Used to work together with deployed good contracts

On this article we’re going to cowl the next:

Let’s get began.

Putting in Foundry

Putting in Foundry is easy and simple.

Open up your terminal and run:

curl -L https://foundry.paradigm.xyz | bash && foundryup

As soon as Foundry is put in, you can begin utilizing Forge and Solid straightaway.

For some OS, you may need to install rust earlier than putting in Foundry.

Establishing a Foundry challenge

You may immediately setup a Foundry challenge by instantly by working

forge init <PROJECT_NAME>

To make your life simpler, I’ve created a template repository, with which you may get began extra simply. It incorporates the required libraries, scripts and listing setup. So, all you could do is simply run the next command in your terminal:

The above command creates a brand new listing known as foundry-faucet and initializes a brand new Foundry challenge utilizing my template. This is able to be the listing construction. The essential directories and information that we need to deal with are:

Directory structure

  • lib: This incorporates all of the dependencies/libraries that we’re going to use. For instance, if we wanna use Solmate, it should reside as a git submodule inside this folder
  • scripts: This folder has all of the scripts, like deploying and verifying contracts
  • src: This folder has all of the contracts and the exams related to the contracts
  • foundry.toml: This file incorporates the configuration choices for the present Foundry challenge

We must also replace and set up the libraries used; for that run the next instructions:

git submodule replace --init --recursive
forge set up

Making a easy Faucet contract

Now, we’re going to implement a faucet contract for our ERC20 token which may drip tokens when requested. We will additionally limit the quantity of tokens per request by setting a restrict which can be 100 by default in our contract.

Open up the src/Faucet.sol file and add the next code:

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.13;

import {Ownable} from "openzeppelin-contracts/entry/Ownable.sol";
import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol";

contract Faucet is Ownable {
   /// Deal with of the token that this faucet drips
   IERC20 public token;

   /// For fee limiting
   mapping(tackle => uint256) public nextRequestAt;
   /// Max token restrict per request
   uint256 public restrict = 100;

   /// @param _token The tackle of the tap's token
   constructor(IERC20 _token) {
       token = _token;
   }

   /// Used to ship the tokens
   /// @param _recipient The tackle of the tokens recipient
   /// @param _amount The quantity of tokens required from the tap
   perform drip(tackle _recipient, uint256 _amount) exterior {
       require(_recipient != tackle(0), "INVALID_RECIPIENT");

       require(_amount <= restrict, "EXCEEDS_LIMIT");

       require(nextRequestAt[_recipient] <= block.timestamp, "TRY_LATER");
       nextRequestAt[_recipient] = block.timestamp + (5 minutes);

       token.switch(_recipient, _amount);
   }

   /// Used to set the max restrict per request
   /// @dev This technique is restricted and ought to be known as solely by the proprietor
   /// @param _limit The brand new restrict for the tokens per request
   perform setLimit(uint256 _limit) exterior onlyOwner {
       restrict = _limit;
   }
}

Our faucet contract has been added. Now we are able to go forward and compile the contracts by working:

forge construct

If the whole lot goes effectively, it’s best to see the same output:

[⠒] Compiling...
[⠒] Compiling 14 information with 0.8.13
Compiler run profitable

Candy! We’ve efficiently arrange our Foundry challenge and compiled our contract with none errors! Good job, anon 🎉

Now, we are able to go forward and begin testing our Faucet contract.

Unit testing utilizing Forge

As you already know, not like Hardhat, Forge helps us write unit exams utilizing Solidity.

In case you open the src/check/Faucet.t.sol file you’ll already see some imports of utils and a BaseSetup contract.

Base setup contract

It has some preliminary setup that initializes a number of variables that we are able to use in our exams. As well as, the setUp() perform is just like beforeEach in hardhat and it runs earlier than each check.

The setUp() perform creates two addresses and labels them Alice and Bob. It’s useful if you attempt to debug by way of name traces because the label seems within the traces together with the tackle.

(Notice: vm.label is known as a cheatcode and it’s particular to Forge; It helps us to do some particular operations by interacting with the digital machine within the check env. We’ll be seeing extra cheatcodes in the course of the course of the article. For the total listing of cheatcodes, you possibly can refer to this link)

Substitute the Faucet.t.sol with the next code to get began with the unit exams;


Extra nice articles from LogRocket:


// SPDX-License-Identifier: MIT
pragma solidity >=0.8;

import {console} from "forge-std/console.sol";
import {stdStorage, StdStorage, Check} from "forge-std/Check.sol";
import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol";

import {Utils} from "./utils/Utils.sol";
import {Faucet} from "../Faucet.sol";
import {MockERC20} from "../MockERC20.sol";

contract BaseSetup is Check {
   Utils inside utils;
   Faucet inside faucet;
   MockERC20 inside token;

   tackle payable[] inside customers;
   tackle inside proprietor;
   tackle inside dev;
   uint256 inside faucetBal = 1000;

   perform setUp() public digital {
       utils = new Utils();
       customers = utils.createUsers(2);
       proprietor = customers[0];
       vm.label(proprietor, "Proprietor");
       dev = customers[1];
       vm.label(dev, "Developer");

       token = new MockERC20();
       faucet = new Faucet(IERC20(token));
       token.mint(tackle(faucet), faucetBal);
   }
}

You may see that we have now now created new state variables like faucet, token and in addition we’ve renamed alice and bob to proprietor and dev for straightforward interpretation. On this context, dev is somebody who requests tokens from the tap whereas the proprietor is the proprietor of the tap itself.

Within the final three strains of the setUp() technique, we deploy a mock token for the tap, move its tackle within the constructor of the new Faucet() (faucet deployment), after which name and mint some tokens to the deployed faucet contract.

Now, we’ll inherit the BaseSetup contract to put in writing unit exams for our Faucet contract.

Under the BaseSetup contract, add the next code:

contract FaucetTest is BaseSetup {
   uint256 amountToDrip = 1;

   perform setUp() public override {
       tremendous.setUp();
   }

As talked about earlier, the setUp() technique runs earlier than all of the testcases and right here we’re calling the setUp() technique of the bottom contract which is the BaseSetup contract by way of tremendous.setUp().

Alright, now allow us to begin including unit exams for our contract. Proper beneath the setUp() technique of the FaucetTest contract, add the next piece of code:

   perform test_drip_transferToDev() public {
       console.log(
           "Ought to switch tokens to recipient when `drip()` is known as"
       );
       uint256 _inititalDevBal = token.balanceOf(dev);

       /// Be sure that preliminary dev stability is Zero
       assertEq(_inititalDevBal, 0);

       /// Request some tokens to the dev pockets from the pockets
       faucet.drip(dev, amountToDrip);

       uint256 _devBalAfterDrip = token.balanceOf(dev);

      /// The distinction ought to be equal to the quantity requested from the tap
       assertEq(_devBalAfterDrip - _inititalDevBal, amountToDrip);
   }

The above code helps us to check the drip() technique. The workflow is easy.

  1. First, retailer the preliminary stability of the dev in a variable (_inititalDevBal)
  2. Be certain it’s 0, as we didn’t mint any tokens to the dev. That is what the road assertEq(_inititalDevBal, 0); does
  3. Then name the drip() technique from the faucet contract occasion
  4. Fetch the stability of dev after the drip() is known as
  5. The distinction between the stability of the dev account earlier than and after the drip() ought to be equal to amountToDrip, which is saved as a state variable within the FaucetTest contract

Now, allow us to save the file and run the check: forge check.

It is best to see the output in your terminal one thing just like this:

Compiling test results in terminal

Cool! Let’s add some extra exams.

The above check verifies that the drip() technique transfers the tokens to the dev. So, we must also examine that the switch is a sound one, which implies the token stability of the tap ought to be decreased.

Add the next check beneath — the test_drip_transferToDev() technique.

 perform test_drip_reduceFaucetBalance() public {
       console.log("The tap stability ought to be decreased");
       faucet.drip(dev, amountToDrip);
       assertEq(token.balanceOf(tackle(faucet)), faucetBal - amountToDrip);
   }

This makes positive that the tokens that the dev obtained are literally despatched from the tap — if that’s the case, the stability of the tap ought to be decreased.

We will be certain by working the check suite once more : forge check

If the whole lot goes effectively, then your output ought to be just like this:

Compiling test results in terminal

Candy! In case you have observed, we have now console.log statements in our check instances, however they don’t seem to be exhibiting up within the console. The reason being that Forge doesn’t show logs by default. To get the logs displayed, we have to run the command with verbosity 2 : forge check -vv will show the logs.

Compiling test results in terminal

Additionally if there are any occasions which are emitted by your contract, you possibly can view them within the exams with verbosity three (-vvv). You may get an in depth name hint to your exams as excessive as verbosity degree 5, which helps in higher debugging.

Alright, let’s preserve including extra exams. Now we’re going to check our fee restrict mechanism. There ought to be a minimum of a five-minute interval earlier than calling drip() with the identical recipient tackle.

   perform test_drip_revertIfThrottled() public {
       console.log("Ought to revert if tried to throttle");
       faucet.drip(dev, amountToDrip);

       vm.expectRevert(abi.encodePacked("TRY_LATER"));
       faucet.drip(dev, amountToDrip);
   }

vm.expectRevert(bytes32) is one other cheat code that checks if the subsequent name reverts with the given error message. On this case, the error message is TRY_LATER. It accepts the error message as bytes not as a string, therefore we’re utilizing abi.encodePacked.

In case you bear in mind, I discussed that Forge ships with a fuzzer out-the-box. Let’s give it a attempt.

We mix the exams test_drip_transferToDev and test_drip_reduceFaucetBalance, and as a substitute of passing the inputs manually, we might permit the fuzzer to enter the values in order that we are able to be sure that our contract handles completely different inputs.

   perform test_drip_withFuzzing(tackle _recipient, uint256 _amount) public {
       console.log("Ought to deal with fuzzing");
       /// inform the constraints to the fuzzer, in order that the exams do not revert on unhealthy inputs.
       vm.assume(_amount <= 100);
       vm.assume(_recipient != tackle(0));
       uint256 _inititalBal = token.balanceOf(_recipient);
       faucet.drip(_recipient, _amount);
       uint256 _balAfterDrip = token.balanceOf(_recipient);
       assertEq(_balAfterDrip - _inititalBal, _amount);
       assertEq(token.balanceOf(tackle(faucet)), faucetBal - _amount);
   }

Fuzzing is property-based testing. Forge will apply fuzzing to any check that takes a minimum of one parameter.

If you execute the check suite, you’ll find the next line within the output:

[PASS] test_drip_withFuzzing(tackle,uint256) (runs: 256)

From the above output we are able to infer that the Forge fuzzer known as the test_drip_withFuzzing() technique 256 instances with random inputs. Nevertheless, we are able to override this quantity utilizing the FOUNDRY_FUZZ_RUNS surroundings variable.

Now, allow us to add a pair extra exams for the owner-only technique setLimit()

perform test_setLimit() public {
       console.log("Ought to set the restrict when known as by the proprietor");
       faucet.setLimit(1000);

       /// the restrict ought to be up to date assertEq(faucet.restrict(), 1000); } perform test_setLimit_revertIfNotOwner() public { console.log("Ought to revert if not known as by Proprietor"); /// Units the msg.sender as dev for the subsequent tx vm.prank(dev); vm.expectRevert(abi.encodePacked("Ownable: caller will not be the proprietor")); faucet.setLimit(1000); }

Within the test_setLimit_revertIfNotOwner() technique, a brand new cheatcode vm.prank(tackle) is used. It pranks the vm by overriding the msg.sender with the given tackle; in our case it’s dev. So, the setLimit() ought to revert with the caller will not be the proprietor message as our Faucet contract inherits the Ownable contract.

Okay allow us to be sure that no exams fail by working forge check once more.

Forge test terminal output

Candy 🥳 Now it’s time for deployment.

Contract deployment to Kovan testnet

Create a brand new file from .env.instance file and identify it as .env. Please fill your INFURA_API_KEY and the PRIVATE_KEY (with Kovan testnet funds).

As soon as all of the fields are populated, you might be all set for deployment to Kovan. Earlier than deploying the tap, we have to deploy our ERC20 token.

You will discover the deployment scripts contained in the scripts listing, and deploy the MockERC20 token to Kovan testnet by executing the ./scripts/deploy_token_kovan.sh bash script.

The output would look one thing like this:

Deployer: (YOUR_DEPLOYMENT_ADDRESS)

Deployed to: 0x1a70d8a2a02c9cf0faa5551304ba770b5496ed80

Transaction hash: 0xa3780d2e3e1d1f9346035144f3c2d62f31918b613a370f416a4fb1a6c2eadc77

To be sure that the transaction truly went by, you possibly can search the transaction hash in https://kovan.etherscan.io

Copy the Deployed to: tackle, as it’s the tackle of the MockERC20 token that we should always use for deploying our Faucet contract. To deploy the tap, you possibly can execute the ./scripts/deploy_faucet_kovan.shscript.

It should immediate you to enter the token tackle; then enter the copied MockERC20 token tackle that was deployed earlier.

The output ought to look one thing like this:

Entering token contract address and compiling

Woohoo 🚀🚀 We’ve efficiently compiled, examined, and deployed our contract to the Kovan testnet utilizing Forge

We nonetheless have to confirm the contract on Etherscan and in addition mint some MockERC20 tokens to the Faucet (you should use forged for this!) for it to work as supposed. I’ll go away this to you guys as an train to attempt it yourselves!

As at all times, you’ll find the GitHub repository for this text here.

Conclusion

On this article we solely coated a number of items of Forge. Foundry is a really highly effective framework for good contracts and it’s quickly growing as effectively.

There are extra cool options like code-coverage, contract verification, gasoline snapshots, name traces, and interactive debugging. Be happy to mess around with the repo by testing out extra options. Completely satisfied coding 🎊

Be a part of organizations like Bitso and Coinsquare who use LogRocket to proactively monitor their Web3 apps

Shopper-side points that influence customers’ means to activate and transact in your apps can drastically have an effect on your backside line. In case you’re excited about monitoring UX points, robotically surfacing JavaScript errors, and monitoring sluggish community requests and element load time, try LogRocket.LogRocket Dashboard Free Trial Bannerhttps://logrocket.com/signup/

LogRocket is sort of a DVR for net and cell apps, recording the whole lot that occurs in your net app or web site. As a substitute of guessing why issues occur, you possibly can mixture and report on key frontend efficiency metrics, replay person periods together with software state, log community requests, and robotically floor all errors.

Modernize the way you debug net and cell apps — Start monitoring for free.





Source link

You might also like

Web3 for Frontend Developers – Getting Started With Moralis Web3UI Kit

What Is the Blockchain Trilemma? Blockchain Trilemma Explained

Web3 Privacy Guide – Creating an Anonymous Identity

Tags: contractsdeployingForgesmarttestingUnit
Share30Tweet19
Xiao Chen Sun

Xiao Chen Sun

Recommended For You

Web3 for Frontend Developers – Getting Started With Moralis Web3UI Kit

by Xiao Chen Sun
March 27, 2023
0
Web3 for Frontend Developers – Getting Started With Moralis Web3UI Kit

Introduction The web3 ecosystem has prioritized back-end development of blockchain-based projects, while giving little to no contribution to the front-end stack. The frontend is the development of the...

Read more

What Is the Blockchain Trilemma? Blockchain Trilemma Explained

by Xiao Chen Sun
March 27, 2023
0
What Is the Blockchain Trilemma? Blockchain Trilemma Explained

There are a whole lot of trilemmas out there. We've all struggled with the classic student trilemma, balancing good grades with social life, and sleep. But now we've...

Read more

Web3 Privacy Guide – Creating an Anonymous Identity

by Xiao Chen Sun
March 26, 2023
0
Web3 Privacy Guide – Creating an Anonymous Identity

Privacy is a right, not a privilege. This article is for web3 developers, founders, and builders who prefer to operate anonymously for a variety of reasons. The first...

Read more

What Is a Fork? Crypto Forks Explained

by Xiao Chen Sun
March 26, 2023
0
What Is a Fork? Crypto Forks Explained

We're not talking about cutlery today, instead, we're talking about what some crypto projects decide to do in the face of disaster or when attempting to upgrade. Let...

Read more

Contribute to the Web3 Blog and Get Paid

by Xiao Chen Sun
March 26, 2023
0
Contribute to the Web3 Blog and Get Paid

A few months ago, we launched the Web3 blog. It’s been an awesome success. With hundreds of thousands of views, 10+ awesome contributing expert writers, and with a...

Read more
Next Post
Sen. Warren calls out ‘sham audits’ while SVB threatens crypto bankruptcy

Sen. Warren calls out ‘sham audits’ while SVB threatens crypto bankruptcy

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Related News

Ledger launches browser extension to improve crypto wallet connectivity

Ledger launches browser extension to improve crypto wallet connectivity

March 16, 2023
Bitcoin Hits $27K for First Time since June 2022 amid Stuttering Banking Sector

Bitcoin Hits $27K for First Time since June 2022 amid Stuttering Banking Sector

March 18, 2023
Bitcoin And Crypto Face These Key Dates In The Week Ahead

Bitcoin And Crypto Face These Key Dates In The Week Ahead

March 27, 2023

Browse by Category

  • Altcoin
  • Artificial Intelligence
  • Bitcoin
  • Blockchain
  • Business
  • Cryptocurrencies
  • Cryptocurrency
  • Culture
  • DeFi
  • Education
  • Ethereum
  • Featured
  • News
  • Regulations
  • Uncategorized
  • Web 3.0

Recent News

Grindr Alerts Egyptian Users of Police-Operated Profiles

Grindr Alerts Egyptian Users of Police-Operated Profiles

March 27, 2023
Coinbase Chief Legal Officer Says SEC’s Wells Notice a Massive Overreach on Part of Regulator

Coinbase Chief Legal Officer Says SEC’s Wells Notice a Massive Overreach on Part of Regulator

March 27, 2023
Web3 for Frontend Developers – Getting Started With Moralis Web3UI Kit

Web3 for Frontend Developers – Getting Started With Moralis Web3UI Kit

March 27, 2023

Categories

  • Altcoin
  • Artificial Intelligence
  • Bitcoin
  • Blockchain
  • Business
  • Cryptocurrencies
  • Cryptocurrency
  • Culture
  • DeFi
  • Education
  • Ethereum
  • Featured
  • News
  • Regulations
  • Uncategorized
  • Web 3.0

Follow Us

Find Via Tags

Bank banks Binance Bitcoin Blockchain Blog BTC Chain Circle coin Coinbase Crypto data decentralized DeFi digital ETH Ethereum Exchange Fed finance Financial Foundation FTX Heres high hits IBM Launches market Network Platform Polygon Price Project Report SEC Shanghai Stablecoin Supply Token Top Trading USDC Web3

© 2023 BTC NOON | All Rights Reserved

No Result
View All Result
  • Home
  • Cryptocurrency
  • Bitcoin
  • Ethereum
  • Blockchain
  • Regulations
  • Altcoin
  • DeFi
  • Web 3.0

© 2023 BTC NOON | All Rights Reserved

Are you sure want to unlock this post?
Unlock left : 0
Are you sure want to cancel subscription?