Fully-Fledged Hardhat Project Template Based on TypeScript
Installation
It is recommended to install Yarn through the npm
package manager, which comes bundled with Node.js when you install it on your system. It is recommended to use a Node.js version >= 18.0.0
.
Once you have npm
installed, you can run the following both to install and upgrade Yarn:
npm install --global yarn
After having installed Yarn, simply run:
yarn install
Running Deployments
Example Goerli:
yarn deploy:goerli
The deployment script
deploy.ts
includes thetenderly
Hardhat Runtime Environment (HRE) extension with theverify
method. Please consider uncommenting and configuring the Tenderlyproject
,username
,forkNetwork
,privateVerification
, anddeploymentsDir
attributes in thehardhat.config.ts
file before deploying or remove this call. Also, for this plugin to function you need to create aconfig.yaml
file at$HOME/.tenderly/config.yaml
or%HOMEPATH%\.tenderly\config.yaml
and add anaccess_key
field to it. For further information, see here.
For the deployment on the zkSync Era test network, you must add your to-be-deployed contract artifact to
deploy-zksync.ts
, enablezksync
in thehardhat.config.ts
file, and then runyarn compile
. Next, fund your deployer account on zkSync Era Testnet, configure your.env
file accordingly, and simply runyarn deploy:zksynctestnet
. Eventually, to verify the contract you can invoke:npx hardhat verify --network zkSyncTestnet --constructor-args arguments.js <YOUR_CONTRACT_ADDRESS>
. The same approach applies if you want to deploy on the production network, except that you need to runyarn deploy:zksyncmain
and use--network zkSyncMain
for the contract verification.
CREATE2
Deployments
Running yarn xdeploy
This template uses the xdeploy Hardhat plugin. Check out the documentation for more information on the specifics of the deployments.
.env
File
In the .env
file, place the private key of your wallet in the PRIVATE_KEY
variable. This allows secure access to your wallet to use with both testnet and mainnet funds during Hardhat deployments. For more information on how this works, please read the documentation of the npm
package dotenv
.
Using a Ledger Hardware Wallet
This template implements the hardhat-ledger
plugin. In the .env
file, place your Ledger account in the LEDGER_ACCOUNT
variable.
Using the Truffle Dashboard
Truffle developed the Truffle Dashboard to provide an easy way to use your existing MetaMask wallet for your deployments and for other transactions that you need to send from a command line context. Because the Truffle Dashboard connects directly to MetaMask it is also possible to use it in combination with hardware wallets like Ledger or Trezor.
First, it is recommended that you install Truffle globally by running:
npm install -g truffle
If you have already installed Truffle, you need to ensure that you have at least version
5.11.3
installed and otherwise upgrade.
To start a Truffle Dashboard, you need to run the following command in a separate terminal window:
truffle dashboard
By default, the command above starts a Truffle Dashboard at http://localhost:24012 and opens the Dashboard in a new tab in your default browser. The Dashboard then prompts you to connect your wallet and confirm that you're connected to the right network. You should double check your connected network at this point, since switching to a different network during a deployment can have unintended consequences.
Eventually, in order to deploy with the Truffle Dashboard, you can simply run:
yarn deploy:dashboard
Mainnet Forking
You can start an instance of the Hardhat network that forks the mainnet. This means that it will simulate having the same state as the mainnet, but it will work as a local development network. That way you can interact with deployed protocols and test complex interactions locally. To use this feature, you need to connect to an archive node.
This template is currently configured via the hardhat.config.ts as follows:
forking: {
url: process.env.ETH_MAINNET_URL || "",
// The Hardhat network will by default fork from the latest mainnet block
// To pin the block number, specify it below
// You will need access to a node with archival data for this to work!
// blockNumber: 14743877,
// If you want to do some forking, set `enabled` to true
enabled: false,
}
Contract Verification
Change the contract address to your contract after the deployment has been successful. This works for both testnet and mainnet. You will need to get an API key from etherscan, snowtrace etc.
Example:
npx hardhat verify --network fantomMain --constructor-args arguments.js <YOUR_CONTRACT_ADDRESS>
Contract Interaction
This template includes an example script that shows how to interact programmatically with a deployed contract. You must customise it according to your contract's specifications. The script can be simply invoked via:
npx hardhat run scripts/interact.ts --network <network_name>
Foundry
This template repository also includes the Foundry toolkit.
If you need help getting started with Foundry, I recommend reading the ๐ Foundry Book.
Dependencies
make update
or
forge update
Compilation
make build
or
forge build
Testing
To run only TypeScript tests:
yarn test:hh
To run only Solidity tests:
yarn test:forge
or
make test-forge
To additionally display the gas report, you can run:
make test-gasreport
Deployment and Etherscan Verification
Inside the scripts/
folder are a few preconfigured scripts that can be used to deploy and verify contracts via Foundry. These scripts are required to be executable meaning they must be made executable by running:
make scripts