hardhat-typechain
Version:
Hardhat TypeScript plugin boilerplate
131 lines (91 loc) • 3.45 kB
Markdown
_Zero-config Typechain support_
_Updated for Hardhat!_
_Now supports Ethers v5 and Truffle v5!_
_Updated for TypeChain v3!_
Add [Typechain](https://www.github.com/ethereum-ts/TypeChain) tasks to your hardhat project!
[](https://www.github.com/ethereum-ts/TypeChain) gives you Typescript bindings for your smart contracts. Now, your tests and frontend code can be typesafe and magically autocomplete smart contract function names!
```bash
npm i hardhat-typechain typechain ts-generator
npm i @typechain/ethers-v5 @typechain/truffle-v5 @typechain/web3-v1
```
And add the following statement to your `hardhat.config.js`:
```js
require("hardhat-typechain");
```
Or, if you are using TypeScript, add this to your `hardhat.config.ts`:
```js
import "hardhat-typechain";
```
Run the _compile_ task as normal, and Typechain artifacts will automatically be generated in a root directory called `typechain`. Further configuration options are detailed below.
This plugin overrides the _compile_ task and automatically generates new Typechain artifacts on each compilation.
There is an optional flag `--no-typechain` which can be passed in to skip Typechain compilation.
This plugin adds the _typechain_ task to hardhat:
```
Generate Typechain typings for compiled contracts
```
This plugin extends the `hardhatConfig` optional `typechain` object. The object contains two fields, `outDir` and `target`. `outDir` is the output directory of the artifacts that TypeChain creates (defaults to `typechain`). `target` is one of the targets specified by the TypeChain [docs](https://github.com/ethereum-ts/TypeChain#cli) (defaults to `ethers`).
This is an example of how to set it:
```js
module.exports = {
typechain: {
outDir: "src/types",
target: "ethers-v5",
},
};
```
`npx hardhat compile` - Compiles and generates Typescript typings for your contracts.
Example Waffle + Ethers test that uses typedefs for contracts:
```ts
import { ethers, waffle } from "@nomiclabs/hardhat";
import chai from "chai";
import { Wallet } from "ethers";
import CounterArtifact from "../artifacts/Counter.json";
import { Counter } from "../typechain/Counter";
const { deployContract } = waffle;
const { expect } = chai;
describe("Counter", () => {
let counter: Counter;
beforeEach(async () => {
// 1
const signers = await ethers.signers();
// 2
counter = (await deployContract(
<Wallet>signers[0],
CounterArtifact
)) as Counter;
const initialCount = await counter.getCount();
// 3
expect(initialCount).to.eq(0);
expect(counter.address).to.properAddress;
});
// 4
describe("count up", async () => {
it("should count up", async () => {
await counter.countUp();
let count = await counter.getCount();
expect(count).to.eq(1);
});
});
describe("count down", async () => {
// 5
it("should fail", async () => {
await counter.countDown();
});
it("should count down", async () => {
await counter.countUp();
await counter.countDown();
const count = await counter.getCount();
expect(count).to.eq(0);
});
});
});
```
See this [starter kit](https://github.com/rhlsthrm/typescript-solidity-dev-starter-kit) for a full example!