• Stars
    star
    1,179
  • Rank 38,382 (Top 0.8 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 3 years ago
  • Updated 8 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A repo for boilerplate code for testing, deploying, and shipping chainlink solidity code.

Chainlink Hardhat logo


Open in Gitpod

GitPOAP Badge

Chainlink Hardhat Starter Kit

Implementation of the following 4 Chainlink features using the Hardhat development environment:

Getting Started

It's recommended that you've gone through the hardhat getting started documentation before proceeding here.

Requirements

  • git
    • You'll know you did it right if you can run git --version and see a response like git version x.x.x
  • Nodejs
    • You'll know you've installed nodejs right if you can run:
      • node --version and get an output like: vx.x.x
  • Yarn instead of npm
    • You'll know you've installed yarn right if you can run:
      • yarn --version And get an output like: x.x.x
      • You might need to install it with npm

If you're familiar with npx and npm instead of yarn, you can use npx for execution and npm for installing dependencies.

Quickstart

  1. Clone and install dependencies

After installing all the requirements, run the following:

git clone https://github.com/smartcontractkit/hardhat-starter-kit/
cd hardhat-starter-kit

Then:

npm install

The recommendation is to use npm 7 or later. If you are using an older version of npm, you'll also need to install all the packages used by the toolbox.

npm install --save-dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers

That's also the case if you are using yarn.

yarn add --dev @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-network-helpers @nomicfoundation/hardhat-chai-matchers @nomiclabs/hardhat-ethers @nomiclabs/hardhat-etherscan chai ethers hardhat-gas-reporter solidity-coverage @typechain/hardhat typechain @typechain/ethers-v5 @ethersproject/abi @ethersproject/providers
  1. You can now do stuff!
npx hardhat test

or

npm run test

or

yarn test

Typescript

To use typescript, run:

git checkout typescript
npm install

Usage

If you run npx hardhat --help you'll get an output of all the tasks you can run.

Deploying Contracts

npm run deploy

This will deploy your contracts to a local network. Additionally, if on a local network, it will deploy mock Chainlink contracts for you to interact with. If you'd like to interact with your deployed contracts, skip down to Interacting with Deployed Contracts.

Run a Local Network

One of the best ways to test and interact with smart contracts is by using a local network. To run a local network with all your contracts in it, execute the following command:

npx hardhat node

You'll get a local blockchain, private keys, contracts deployed (from the deployment folder scripts), and an endpoint to potentially add to an EVM wallet.

Using a Testnet or Live Network (like Mainnet or Polygon)

In your hardhat.config.js you'll see section like:

module.exports = {
  defaultNetwork: "hardhat",
  networks: {

This section of the file is where you define which networks you want to interact with. You can read more about that whole file in the hardhat documentation.

To interact with a live or test network, you'll need:

  1. An rpc URL
  2. A Private Key
  3. ETH & LINK token (either testnet or real)

Let's look at an example of setting these up using the Sepolia testnet.

Sepolia Ethereum Testnet Setup

First, we will need to set environment variables. We can do so by setting them in our .env file (create it if it's not there). You can also read more about environment variables from the linked twilio blog. You'll find a sample of what this file will look like in .env.example

IMPORTANT: MAKE SURE YOU'D DON'T EXPOSE THE KEYS YOU PUT IN THIS .env FILE. By that, I mean don't push them to a public repo, and please try to keep them keys you use in development not associated with any real funds.

  1. Set your SEPOLIA_RPC_URL environment variable.

You can get one for free from Alchemy, Infura, or Moralis. This is your connection to the blockchain.

  1. Set your PRIVATE_KEY environment variable.

This is your private key from your wallet, ie MetaMask. This is needed for deploying contracts to public networks. You can optionally set your MNEMONIC environment variable instead with some changes to the hardhat.config.js.

WARNING WARNING WARNING

When developing, it's best practice to use a Metamask that isn't associated with any real money. A good way to do this is to make a new browser profile (on Chrome, Brave, Firefox, etc) and install Metamask on that browser, and never send this wallet money.

Don't commit and push any changes to .env files that may contain sensitive information, such as a private key! If this information reaches a public GitHub repository, someone can use it to check if you have any Mainnet funds in that wallet address, and steal them!

.env example:

SEPOLIA_RPC_URL='https://sepolia.infura.io/v3/asdfadsfafdadf'
PRIVATE_KEY='abcdef'

bash example:

export SEPOLIA_RPC_URL='https://sepolia.infura.io/v3/asdfadsfafdadf'
export PRIVATE_KEY='abcdef'

You can also use a MNEMONIC instead of a PRIVATE_KEY environment variable by uncommenting the section in the hardhat.config.js, and commenting out the PRIVATE_KEY line. However this is not recommended.

For other networks like mainnet and polygon, you can use different environment variables for your RPC URL and your private key. See the hardhat.config.js to learn more.

  1. Get some Sepolia Testnet ETH and LINK

Head over to the Chainlink faucets and get some ETH and LINK. Please follow the chainlink documentation if unfamiliar.

  1. Create VRF V2 subscription

Head over to VRF Subscription Page and create the new subscription. Save your subscription ID and put it in helper-hardhat-config.js file as subscriptionId

  1. Running commands

You should now be all setup! You can run any command and just pass the --network sepolia now!

To deploy contracts:

npm run deploy --network sepolia

To run staging testnet tests

npm run test-staging

Forking

If you would like to run tests on a forked network, follow these steps:

  1. Set a MAINNET_RPC_URL environment variable that connects to the mainnet.
  2. Choose a block number to select a state of the network you are forking and set it as FORKING_BLOCK_NUMBER environment variable. If ignored, it will use the latest block each time which can lead to test inconsistency.
  3. Set enabled flag to true/false to enable/disable forking feature
      forking: {
        url: MAINNET_RPC_URL,
        blockNumber: FORKING_BLOCK_NUMBER,
        enabled: false,
      }

Auto-Funding

This Starter Kit is configured by default to attempt to auto-fund any newly deployed contract that uses Any-API, to save having to manually fund them after each deployment. The amount in LINK to send as part of this process can be modified in the Starter Kit Config, and are configurable per network.

Parameter Description Default Value
fundAmount Amount of LINK to transfer when funding contracts 0.1 LINK

If you wish to deploy the smart contracts without performing the auto-funding, add an AUTO_FUND environment variable, and set it to false.

Test

Tests are located in the test directory, and are split between unit tests and staging/testnet tests. Unit tests should only be run on local environments, and staging tests should only run on live environments.

To run unit tests:

npx hardhat test

or

npm run test

or

yarn test

To run staging tests on Sepolia network:

npx hardhat test --network sepolia

or

npm run test-staging

Performance optimizations

Since all tests are written in a way to be independent from each other, you can save time by running them in parallel. Make sure that AUTO_FUND=false inside .env file. There are some limitations with parallel testing, read more about them here

To run tests in parallel:

npx hardhat test --parallel

or

npm run test --parallel

Interacting with Deployed Contracts

After deploying your contracts, the deployment output will give you the contract addresses as they are deployed. You can then use these contract addresses in conjunction with Hardhat tasks to perform operations on each contract.

Chainlink Price Feeds

The Price Feeds consumer contract has one task, to read the latest price of a specified price feed contract

npx hardhat read-price-feed --contract insert-contract-address-here --network network

Request & Receive Data

The APIConsumer contract has two tasks, one to request external data based on a set of parameters, and one to check to see what the result of the data request is. This contract needs to be funded with link first:

npx hardhat fund-link --contract insert-contract-address-here --network network

Once it's funded, you can request external data by passing in a number of parameters to the request-data task. The contract parameter is mandatory, the rest are optional

npx hardhat request-data --contract insert-contract-address-here --network network

Once you have successfully made a request for external data, you can see the result via the read-data task

npx hardhat read-data --contract insert-contract-address-here --network network

VRF Get a random number

The VRFConsumer contract has two tasks, one to request a random number, and one to read the result of the random number request. As explained in the developer documentation, there are two methods:

Read the docs first to understand which method is the most suitable for your use case.

VRF Subscription method

To start, go to VRF Subscription Page and create the new subscription. Save your subscription ID and put it in helper-hardhat-config.js file as subscriptionId:

5: {
    // rest of the config
    subscriptionId: "777"
}

Then, deploy your VRF V2 contract consumer to the network of your recent subscription using subscription id as constructor argument.

npm run deploy --network network   

Finally, you need to go to your subscription page one more time and add the address of deployed contract as a new consumer. Once that's done, you can perform a VRF request with the request-random-number task:

npx hardhat request-random-number --contract insert-contract-address-here --network network

Once you have successfully made a request for a random number, you can see the result via the read-random-number task:

npx hardhat read-random-number --contract insert-contract-address-here --network network

VRF Direct Funding method

Deploy your VRF V2 contract consumer to the network.

npm run deploy --network network   

or (if you are using yarn)

yarn deploy --network network   

Now you have to fund your consumer contract with LINK tokens:

npx hardhat transfer-link --recipient insert-contract-address-here --amount insert-amount-in-juels-here --network network

Once that's done, you can perform a VRF request with the request-random-number task:

npx hardhat request-random-number-direct-funding --callbackgaslimit insert-callback-gas-limit-here --requestconfirmations insert-request-confirmations-here --numwords insert-number-words-here --contract insert-contract-address-here --network network

Once you have successfully made a request for a random number, you can see the result via the read-random-number task:

npx hardhat read-random-number-direct-funding --contract insert-contract-address-here --network network

Automation

The AutomationCounter contract is a simple Chainlink Automation enabled contract that simply maintains a counter variable that gets incremented each time the performUpkeep task is performed by a Chainlink Automation. Once the contract is deployed, you should head to https://automation.chain.link/ to register it for upkeeps, then you can use the task below to view the counter variable that gets incremented by Chainlink Automation

npx hardhat read-automation-counter --contract insert-contract-address-here --network network

Verify on Etherscan

You'll need an ETHERSCAN_API_KEY environment variable. You can get one from the Etherscan API site.. If you have it set, your deploy script will try to verify them by default, but if you want to verify any manually, you can run:

npx hardhat verify --network <NETWORK> <CONTRACT_ADDRESS> <CONSTRUCTOR_PARAMETERS>

example:

npx hardhat verify --network sepolia 0x9279791897f112a41FfDa267ff7DbBC46b96c296 "0x694AA1769357215DE4FAC081bf1f309aDC325306"

Linting

This will lint your smart contracts.

npm run lint:fix

Code Formatting

This will format both your javascript and solidity to look nicer.

npm run format

Estimating Gas

To estimate gas, just set a REPORT_GAS environment variable to true, and then run:

npx hardhat test

If you'd like to see the gas prices in USD or other currency, add a COINMARKETCAP_API_KEY from Coinmarketcap.

Code coverage

To see a measure in percent of the degree to which the smart contract source code is executed when a particular test suite is run, type

npm run coverage

Fuzzing

We are going to use Echidna as a Fuzz testing tool. You need to have Docker installed with at least 8GB virtual memory allocated (To update this parameter go to Settings->Resources->Advanced->Memory).

To start Echidna instance run

npm run fuzzing

If you are using it for the first time, you will need to wait for Docker to download eth-security-toolbox image for us.

To start Fuzzing run

echidna-test /src/contracts/test/fuzzing/AutomationCounterEchidnaTest.sol --contract AutomationCounterEchidnaTest --config /src/contracts/test/fuzzing/config.yaml

To exit Echidna type

exit

Contributing

Contributions are always welcome! Open a PR or an issue!

Thank You!

Resources

More Repositories

1

full-blockchain-solidity-course-js

Learn Blockchain, Solidity, and Full Stack Web3 Development with Javascript
11,705
star
2

full-blockchain-solidity-course-py

Ultimate Solidity, Blockchain, and Smart Contract - Beginner to Expert Full Course | Python Edition
10,629
star
3

chainlink

node of the decentralized oracle network, bridging on and off-chain computation
Go
6,693
star
4

chainlink-mix

Working with smart contracts with eth-brownie, python, and Chainlink.
Solidity
484
star
5

defi-minimal

This repo is dedicated to making minimal repos of existing defi primatives.
JavaScript
459
star
6

documentation

https://docs.chain.link The Chainlink developer documentation website for Smart Contract Devs and Node Operators
MDX
360
star
7

foundry-starter-kit

Solidity
305
star
8

external-adapters-js

Monorepo containing JavaScript implementation of external adapters
TypeScript
264
star
9

truffle-starter-kit

An example smart contract utilizing Chainlink
JavaScript
258
star
10

starter-kits

A repo of starter kits for working with various languages and frameworks across the smart contract ecosystem.
228
star
11

foundry-starter-kit-old

Solidity
207
star
12

chainlink-brownie-contracts

A repository for automatically using the latest chainlink repo from the core chainlink repo.
Solidity
168
star
13

solana-starter-kit

Example code for using Chainlink on Solana
JavaScript
166
star
14

chainlink-ruby

Easily connect your applications to blockchains
Ruby
157
star
15

smart-contract-examples

Example and sample projects
TypeScript
150
star
16

chainlink-polkadot

Go
141
star
17

functions-hardhat-starter-kit

JavaScript
138
star
18

LinkToken

LINK Token Contracts for the Chainlink Network
Solidity
131
star
19

ccip

Cross Chain Interoperability Protocol
Go
105
star
20

huff-starter-kit

A template repo to work with huff smart contracts and learn about low level EVM opcodes. Also Horse ♘.
Solidity
100
star
21

apeworx-starter-kit

A repo dedicated to showing how to make smart contracts in a purely pythonic environment
Python
85
star
22

blockchain-developer-hub

Dive into blockchain and smart contract development.
JavaScript
79
star
23

chainlink-solana

Go
72
star
24

chainlink-fullstack

Full stack starter project showcasing Chainlink products on Ethereum (EVM)
TypeScript
68
star
25

hardhat-chainlink

Integrates Chainlink into Hardhat projects. This package is currently in the BETA testing phase and is not recommended for production usage yet.
TypeScript
64
star
26

solidity-cborutils

A library for encoding CBOR in Solidity.
Solidity
64
star
27

dapptools-starter-kit

Solidity
61
star
28

libocr

libocr consists of a Go library and a set of Solidity smart contracts that implement the Chainlink Offchain Reporting Protocol
Go
60
star
29

ccip-read

TypeScript
59
star
30

chainlink-testing-framework

A testing framework for smart contracts and Chainlink nodes
Go
56
star
31

ccip-starter-kit-foundry

This project demonstrates a couple of basic Chainlink CCIP use cases
Solidity
55
star
32

chainlink-starknet

Go
52
star
33

foundry-chainlink-toolkit

A plugin to use Chainlink products/services in Foundry
Solidity
51
star
34

ccip-cross-chain-nft

This project demonstrates how to mint an NFT on one blockchain from another blockchain using Chainlink CCIP
TypeScript
44
star
35

ccip-starter-kit-hardhat

This project demonstrates a couple of basic Chainlink CCIP use cases
TypeScript
42
star
36

smart-contract-db

This repository is an archive. This project has been superseded by blockchain.education https://github.com/smartcontractkit/blockchain-developer-hub
TypeScript
42
star
37

external-initiator

Initiate Chainlink job runs from external sources
Go
40
star
38

chainlink-solana-demo

Showing how to deploy a Solana program using Chainlink Price Feeds
TypeScript
37
star
39

prediction-game

Rugby prediction game using Chainlink Functions, Automation, and CCIP.
TypeScript
36
star
40

chainlink-automation-templates

Real-world sample projects using Chainlink Automation
Solidity
34
star
41

ccip-defi-lending

CCIP Launch Defi Demo
JavaScript
32
star
42

usechainlinkfunctions

TypeScript
28
star
43

near-protocol-contracts

Rust
26
star
44

functions-deepdive-constellation2023

Deepdive Workshop For Constellation 2023 Hackathon
JavaScript
24
star
45

chainlink-cosmos

Go
24
star
46

functions-toolkit

An NPM package with collection of tools that can be used for working with Chainlink Functions.
TypeScript
23
star
47

wasp

Protocol-agnostic load testing library for Go
Go
23
star
48

devnet

An Ethereum development network with preset configs for easy testing.
Makefile
22
star
49

run-functions-dapp

Demo dApp using Chainlink Functions to bring web2 data on-chain.
TypeScript
22
star
50

env-enc

TypeScript
22
star
51

chainlink-common

SDK for building Chainlink Services and Plugins
Go
20
star
52

chainlink-local

The Chainlink CCIP Local Simulator, visit documentation by clicking the link below:
Solidity
19
star
53

Blockchain-RPC-Exporter

Prometheus exporter for EVM compatible RPC endpoints.
Python
18
star
54

schemas

specification for offering and requesting off-blockchain services
17
star
55

paypal-adapter

TypeScript
17
star
56

chainlink-github-actions

Common action to run chainlink-testing-framework based tests in github ci
TypeScript
16
star
57

wei_watchers

A service for push notifications of Ethereum logs and account balances.
Ruby
15
star
58

arbitrum-quickstart

JavaScript
14
star
59

chainlink-env

Chainlink k8s environment library
Go
14
star
60

risk-management-network

Rust
14
star
61

solc-api

minimal Solidity compiler service
JavaScript
14
star
62

ccip-owner-contracts

A set of smart contracts used for administering Chainlink contracts, most notably CCIP
Solidity
13
star
63

chainlink-functions-demo-app

TypeScript
13
star
64

hello_chainlink

chainlink demos
JavaScript
12
star
65

chainlink-staking-v0.2-public-guide

12
star
66

operator-ui

TypeScript
12
star
67

functions-lens-eventbrite

Solidity
12
star
68

ccip-cross-chain-name-service

This project is an educational example of how to create a minimal cross-chain name service using Chainlink CCIP
TypeScript
12
star
69

chain-selectors

Go
12
star
70

tdh2

An implementation of the TDH2 protocol by Shoup & Gennaro (paper link https://www.shoup.net/papers/thresh1.pdf)
Go
11
star
71

chainlink-RSK

Solidity
11
star
72

wsrpc

A bi-directional Websockets RPC library
Go
11
star
73

quickstarts-historical-prices-api

TypeScript
11
star
74

functions-the-graph-uniswap

Solidity
11
star
75

chainlink-automation

Go
10
star
76

datastreams-demo

Demo dApp using Chainlink Data Streams.
TypeScript
10
star
77

ccip-tic-tac-toe

TypeScript
10
star
78

builder

A docker build file for chainlink
Dockerfile
10
star
79

chainlink-vrf

OCR2VRF (in development, do not use in production)
Go
10
star
80

chainlink-data-streams

Go
9
star
81

workshop-distributed-news

Solidity
9
star
82

hardhat-network

Deploys a basic hardhat chain for testing
Dockerfile
9
star
83

cairo-starter-kit

The boilerplate code for getting started with the usage of Chainlink services on Starknet
TypeScript
9
star
84

bq-example-contract

JavaScript
8
star
85

solana-prediction-game

JavaScript
8
star
86

chainlink-node-compose

Docker Compose script for launching multiple chainlink nodes
Shell
8
star
87

substrate-adapter

Go
7
star
88

link-token-sidechain-evm

LINK Token On EVM Sidechains
Solidity
7
star
89

DEVREL-collaborative-nft-tutorial

Solidity
7
star
90

blockchain-ecosystem-map

JavaScript
7
star
91

ccip-liquidation-protector

This project demonstrates how to automate preventing DeFi liquidations & optimizing interest rates on multiple blockchains using Chainlink CCIP, Chainlink Automation and Chainlink Functions
TypeScript
7
star
92

chainlink-solhint-rules

CLL custom Solhint rules
JavaScript
7
star
93

push-gha-metrics-action

Shell
6
star
94

functions-google-bigquery

Demonstration of accessing data from Google BigQuery via Chainlink Functions
JavaScript
6
star
95

ea-framework-js

TypeScript
6
star
96

chainlink-terra-feeds-demo

Showing how to deploy a Terra smart contract which utilizes Chainlink Data Feeds
Rust
6
star
97

datastreams-erc7412

Solidity
6
star
98

feed-registry-example

Example Hardhat project using the Chainlink Feed Registry
Solidity
6
star
99

pancake

JavaScript
6
star
100

havoc

Automatic chaos testing tool and CLI
Go
6
star