Skip to content

Commit

Permalink
feat: add multi-target Typechain typings build option
Browse files Browse the repository at this point in the history
Signed-off-by: Jawad Tariq <[email protected]>
  • Loading branch information
JDawg287 committed Mar 19, 2024
1 parent 0d43b80 commit ac1fdff
Show file tree
Hide file tree
Showing 17 changed files with 131 additions and 31 deletions.
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,38 @@ To build:
$ npm run build
```

## Build contracts with different Typechain target

To build different Typechain target:

```
npx hardhat compile --typechain-target target
```

Where `target` can be `ethers-v6`, `web3-v1`, etc.

*Note: you need to install the appropriate package for the target you want to build for. For example, to build for `web3-v1`, you need to install `@typechain/web3-v1` package.*

Default target is `ethers-v6` and it is output to `typechain-types/ethers-v6` directory.

You can specify the target in several ways:
- By setting the `TYPECHAIN_TARGET` environment variable
```bash
export TYPECHAIN_TARGET=web3-v1
```
- By setting the `--typechain-target` command line option
```bash
npx hardhat compile --typechain-target web3-v1
```
- By setting the `typechain` field in `hardhat.config.ts`
```typescript
module.exports = {
typechain: {
target: 'web3-v1'
}
}
```

## Tests

To run the tests:
Expand Down
7 changes: 7 additions & 0 deletions hardhat.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { HardhatUserConfig } from 'hardhat/config'
import '@nomicfoundation/hardhat-toolbox'

import './tasks/compile'

const config: HardhatUserConfig = {
solidity: {
version: '0.8.9',
Expand All @@ -11,6 +13,11 @@ const config: HardhatUserConfig = {
},
},
},
typechain: {
// default 'ethers-v6'
outDir: 'typechain-types/ethers-v6',
target: 'ethers-v6',
},
}

export default config
2 changes: 1 addition & 1 deletion scripts/const-addr-deployer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
Wallet,
} from 'ethers'

import { ConstAddressDeployer__factory } from '../typechain-types/factories/contracts/topos-core/ConstAddressDeployer__factory'
import { ConstAddressDeployer__factory } from '../typechain-types/ethers-v6'

export type Arg = string | number

Expand Down
2 changes: 1 addition & 1 deletion scripts/deploy-subnet-registrator.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { computeAddress, isHexString, JsonRpcProvider, Wallet } from 'ethers'

import subnetRegistratorJSON from '../artifacts/contracts/topos-core/SubnetRegistrator.sol/SubnetRegistrator.json'
import { SubnetRegistrator__factory } from '../typechain-types/factories/contracts/topos-core/SubnetRegistrator__factory'
import { SubnetRegistrator__factory } from '../typechain-types/ethers-v6'
import { Arg, deployContractConstant } from './const-addr-deployer'

const main = async function (..._args: Arg[]) {
Expand Down
8 changes: 5 additions & 3 deletions scripts/deploy-topos-core.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { isHexString, JsonRpcProvider, Wallet } from 'ethers'

import { ToposCore__factory } from '../typechain-types/factories/contracts/topos-core/ToposCore__factory'
import { ToposCoreProxy__factory } from '../typechain-types/factories/contracts/topos-core/ToposCoreProxy__factory'
import { ToposCore } from '../typechain-types/contracts/topos-core/ToposCore'
import {
ToposCore,
ToposCore__factory,
ToposCoreProxy__factory,
} from '../typechain-types/ethers-v6'

const main = async function (...args: string[]) {
const [_providerEndpoint, _sequencerPrivateKey, _gasLimit] = args
Expand Down
12 changes: 7 additions & 5 deletions scripts/deploy-topos-msg-protocol-dynamic.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { isHexString, JsonRpcProvider, Wallet } from 'ethers'

import { TokenDeployer__factory } from '../typechain-types/factories/contracts/topos-core/TokenDeployer__factory'
import { ToposCore__factory } from '../typechain-types/factories/contracts/topos-core/ToposCore__factory'
import { ToposCoreProxy__factory } from '../typechain-types/factories/contracts/topos-core/ToposCoreProxy__factory'
import { ERC20Messaging__factory } from '../typechain-types/factories/contracts/examples/ERC20Messaging__factory'
import { ToposCore } from '../typechain-types/contracts/topos-core/ToposCore'
import {
ERC20Messaging__factory,
TokenDeployer__factory,
ToposCore__factory,
ToposCoreProxy__factory,
ToposCore,
} from '../typechain-types/ethers-v6'

const main = async function (...args: string[]) {
const [providerEndpoint, _sequencerPrivateKey] = args
Expand Down
3 changes: 1 addition & 2 deletions scripts/deploy-topos-msg-protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ import {
deployContractConstant,
predictContractConstant,
} from './const-addr-deployer'
import { ToposCore__factory } from '../typechain-types/factories/contracts/topos-core/ToposCore__factory'
import { ToposCore } from '../typechain-types/contracts/topos-core/ToposCore'
import { ToposCore__factory, ToposCore } from '../typechain-types/ethers-v6'

const main = async function (...args: string[]) {
const [providerEndpoint, _sequencerPrivateKey] = args
Expand Down
6 changes: 4 additions & 2 deletions scripts/register-subnet.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { isHexString, JsonRpcProvider, Wallet } from 'ethers'

import { SubnetRegistrator__factory } from '../typechain-types/factories/contracts/topos-core/SubnetRegistrator__factory'
import { SubnetRegistrator } from '../typechain-types/contracts/topos-core/SubnetRegistrator'
import {
SubnetRegistrator,
SubnetRegistrator__factory,
} from '../typechain-types/ethers-v6'

const main = async function (...args: string[]) {
const [
Expand Down
9 changes: 6 additions & 3 deletions scripts/test/send-token.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { isHexString, JsonRpcProvider, Wallet } from 'ethers'
import { ERC20Messaging__factory } from '../../typechain-types/factories/contracts/examples/ERC20Messaging__factory'
import { BurnableMintableCappedERC20__factory } from '../../typechain-types/factories/contracts/topos-core/BurnableMintableCappedERC20__factory'
import { ERC20Messaging } from '../../typechain-types/contracts/examples/ERC20Messaging'

import {
BurnableMintableCappedERC20__factory,
ERC20Messaging,
ERC20Messaging__factory,
} from '../../typechain-types/ethers-v6'
import * as cc from '../../test/topos-core/shared/constants/certificates'
import * as tc from '../../test/topos-core/shared/constants/tokens'
import * as testUtils from '../../test/topos-core/shared/utils/common'
Expand Down
6 changes: 4 additions & 2 deletions scripts/upgrade-topos-core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ import {
Wallet,
} from 'ethers'

import { ToposCore__factory } from '../typechain-types/factories/contracts/topos-core/ToposCore__factory'
import { CodeHash__factory } from '../typechain-types/factories/contracts/topos-core/CodeHash__factory'
import {
ToposCore__factory,
CodeHash__factory,
} from '../typechain-types/ethers-v6'

import toposCoreJSON from '../artifacts/contracts/topos-core/ToposCore.sol/ToposCore.json'

Expand Down
42 changes: 42 additions & 0 deletions tasks/compile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { task } from 'hardhat/config'

enum SupportedTypechainTargets {
'ethers-v5' = 'ethers-v5',
'ethers-v6' = 'ethers-v6',
'truffle-v4' = 'truffle-v4',
'truffle-v5' = 'truffle-v5',
'web3-v1' = 'web3-v1',
}

/**
* This task overrides the original compile task to allow for setting the Typechain target
* via several methods:
* 1. Command line argument: `npx hardhat compile --typechain ethers-v5`
* 2. Environment variable: `TYPECHAIN_TARGET=ethers-v5 npx hardhat compile`
* 3. Hardhat config: `const config: HardhatUserConfig = { typechain: { target: 'ethers-v5' } }`
* @param args.typechainTarget (optional) The Typechain target to build for
*/
task(
'compile',
'Compiles the entire project, building all artifacts and custom Typechain typings'
)
.addOptionalParam('typechainTarget', 'The Typechain target to build for')
.setAction(async (args, hre, runSuper) => {
const typechainTarget =
args.typechainTarget ||
process.env.TYPECHAIN_TARGET ||
hre.config.typechain.target // default 'ethers-v6'

// Validate the Typechain target
if (!Object.values(SupportedTypechainTargets).includes(typechainTarget)) {
throw new Error(`Unsupported typechain target: ${typechainTarget}`)
}
// Override the Typechain target
hre.config.typechain.target = typechainTarget
hre.config.typechain.outDir = `typechain-types/${typechainTarget}`

// Call the original compile task
if (runSuper.isDefined) {
await runSuper(args)
}
})
6 changes: 4 additions & 2 deletions test/topos-core/BurnableMintableCappedERC20.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import { EventLog } from 'ethers'
import { expect } from 'chai'
import { ethers } from 'hardhat'

import { BurnableMintableCappedERC20__factory } from '../../typechain-types/factories/contracts/topos-core/BurnableMintableCappedERC20__factory'
import { TokenDeployer__factory } from '../../typechain-types/factories/contracts/topos-core/TokenDeployer__factory'
import {
BurnableMintableCappedERC20__factory,
TokenDeployer__factory,
} from '../../typechain-types/ethers-v6'
import * as tc from './shared/constants/tokens'

describe('BurnableMintableCappedERC20', () => {
Expand Down
6 changes: 4 additions & 2 deletions test/topos-core/Bytes32Sets.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { ethers } from 'hardhat'
import { expect } from 'chai'

import { Bytes32SetsTest__factory } from '../../typechain-types/factories/contracts/topos-core/Bytes32Sets.sol/Bytes32SetsTest__factory'
import { Bytes32SetsTest } from '../../typechain-types/contracts/topos-core/Bytes32Sets.sol/Bytes32SetsTest'
import {
Bytes32SetsTest,
Bytes32SetsTest__factory,
} from '../../typechain-types/ethers-v6'

describe('Bytes32Sets', () => {
let bytes32SetsTest: Bytes32SetsTest
Expand Down
6 changes: 4 additions & 2 deletions test/topos-core/SubnetRegistrator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import { Signer } from 'ethers'
import { ethers } from 'hardhat'
import { expect } from 'chai'

import { SubnetRegistrator__factory } from '../../typechain-types/factories/contracts/topos-core/SubnetRegistrator__factory'
import { SubnetRegistrator } from '../../typechain-types'
import {
SubnetRegistrator__factory,
SubnetRegistrator,
} from '../../typechain-types/ethers-v6'

describe('SubnetRegistrator', () => {
const chainId = 1
Expand Down
11 changes: 7 additions & 4 deletions test/topos-core/ToposCore.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'
import { ethers } from 'hardhat'
import { expect } from 'chai'

import { ToposCore__factory } from '../../typechain-types/factories/contracts/topos-core/ToposCore__factory'
import { ToposCoreProxy__factory } from '../../typechain-types/factories/contracts/topos-core/ToposCoreProxy__factory'
import { CodeHash__factory } from '../../typechain-types/factories/contracts/topos-core/CodeHash__factory'
import { ToposCoreProxy } from '../../typechain-types/contracts/topos-core/ToposCoreProxy'
import {
CodeHash__factory,
ToposCore__factory,
ToposCoreProxy,
ToposCoreProxy__factory,
} from '../../typechain-types/ethers-v6'

import * as cc from './shared/constants/certificates'
import * as testUtils from './shared/utils/common'

Expand Down
2 changes: 1 addition & 1 deletion test/topos-core/ToposMessaging.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
ToposCoreProxy__factory,
ERC20Messaging__factory,
ERC20Messaging,
} from '../../typechain-types'
} from '../../typechain-types/ethers-v6'
import * as cc from './shared/constants/certificates'
import * as testUtils from './shared/utils/common'
import { getReceiptMptProof } from './shared/utils/mpt_proof'
Expand Down
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@
"skipLibCheck": true,
"resolveJsonModule": true
},
"include": ["./scripts", "./test", "./typechain-types"],
"include": ["./scripts", "./test", "./typechain-types", "./tasks"],
"files": ["./hardhat.config.ts"]
}

0 comments on commit ac1fdff

Please sign in to comment.