From 88ad0d487856e82f0e8150d4f50e6448bdd3a28d Mon Sep 17 00:00:00 2001 From: Jawad Tariq Date: Fri, 1 Mar 2024 18:16:10 -0500 Subject: [PATCH] feat: add multi-target Typechain typings build option Signed-off-by: Jawad Tariq --- hardhat.config.ts | 48 ++++++++++++++++++- scripts/const-addr-deployer.ts | 2 +- scripts/deploy-subnet-registrator.ts | 2 +- scripts/deploy-topos-core.ts | 6 +-- scripts/deploy-topos-msg-protocol-dynamic.ts | 10 ++-- scripts/deploy-topos-msg-protocol.ts | 4 +- scripts/register-subnet.ts | 4 +- scripts/test/send-token.ts | 6 +-- scripts/upgrade-topos-core.ts | 4 +- .../BurnableMintableCappedERC20.test.ts | 4 +- test/topos-core/Bytes32Sets.test.ts | 4 +- test/topos-core/SubnetRegistrator.test.ts | 4 +- test/topos-core/ToposCore.test.ts | 8 ++-- test/topos-core/ToposMessaging.test.ts | 2 +- 14 files changed, 77 insertions(+), 31 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index bcedbd0..244194f 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,6 +1,47 @@ -import { HardhatUserConfig } from 'hardhat/config' +import { HardhatUserConfig, task } from 'hardhat/config' import '@nomicfoundation/hardhat-toolbox' +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) + } + }) + const config: HardhatUserConfig = { solidity: { version: '0.8.9', @@ -11,6 +52,11 @@ const config: HardhatUserConfig = { }, }, }, + typechain: { + // default 'ethers-v6' + outDir: 'typechain-types/ethers-v6', + target: 'ethers-v6', + }, } export default config diff --git a/scripts/const-addr-deployer.ts b/scripts/const-addr-deployer.ts index c28b98c..9202e45 100644 --- a/scripts/const-addr-deployer.ts +++ b/scripts/const-addr-deployer.ts @@ -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/factories/contracts/topos-core/ConstAddressDeployer__factory' export type Arg = string | number diff --git a/scripts/deploy-subnet-registrator.ts b/scripts/deploy-subnet-registrator.ts index ef95a51..f08ee00 100644 --- a/scripts/deploy-subnet-registrator.ts +++ b/scripts/deploy-subnet-registrator.ts @@ -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/factories/contracts/topos-core/SubnetRegistrator__factory' import { Arg, deployContractConstant } from './const-addr-deployer' const main = async function (..._args: Arg[]) { diff --git a/scripts/deploy-topos-core.ts b/scripts/deploy-topos-core.ts index 58b0a31..a2bfb75 100644 --- a/scripts/deploy-topos-core.ts +++ b/scripts/deploy-topos-core.ts @@ -1,8 +1,8 @@ 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__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCore__factory' +import { ToposCoreProxy__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCoreProxy__factory' +import { ToposCore } from '../typechain-types/ethers-v6/contracts/topos-core/ToposCore' const main = async function (...args: string[]) { const [_providerEndpoint, _sequencerPrivateKey, _gasLimit] = args diff --git a/scripts/deploy-topos-msg-protocol-dynamic.ts b/scripts/deploy-topos-msg-protocol-dynamic.ts index 72391f3..2b7f034 100644 --- a/scripts/deploy-topos-msg-protocol-dynamic.ts +++ b/scripts/deploy-topos-msg-protocol-dynamic.ts @@ -1,10 +1,10 @@ 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 { TokenDeployer__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/TokenDeployer__factory' +import { ToposCore__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCore__factory' +import { ToposCoreProxy__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCoreProxy__factory' +import { ERC20Messaging__factory } from '../typechain-types/ethers-v6/factories/contracts/examples/ERC20Messaging__factory' +import { ToposCore } from '../typechain-types/ethers-v6/contracts/topos-core/ToposCore' const main = async function (...args: string[]) { const [providerEndpoint, _sequencerPrivateKey] = args diff --git a/scripts/deploy-topos-msg-protocol.ts b/scripts/deploy-topos-msg-protocol.ts index d1002d6..e57b165 100644 --- a/scripts/deploy-topos-msg-protocol.ts +++ b/scripts/deploy-topos-msg-protocol.ts @@ -10,8 +10,8 @@ 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 } from '../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCore__factory' +import { ToposCore } from '../typechain-types/ethers-v6/contracts/topos-core/ToposCore' const main = async function (...args: string[]) { const [providerEndpoint, _sequencerPrivateKey] = args diff --git a/scripts/register-subnet.ts b/scripts/register-subnet.ts index cdd223f..ec37e3d 100644 --- a/scripts/register-subnet.ts +++ b/scripts/register-subnet.ts @@ -1,7 +1,7 @@ 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__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/SubnetRegistrator__factory' +import { SubnetRegistrator } from '../typechain-types/ethers-v6/contracts/topos-core/SubnetRegistrator' const main = async function (...args: string[]) { const [ diff --git a/scripts/test/send-token.ts b/scripts/test/send-token.ts index d1ef103..5d2c45c 100644 --- a/scripts/test/send-token.ts +++ b/scripts/test/send-token.ts @@ -1,7 +1,7 @@ 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 { ERC20Messaging__factory } from '../../typechain-types/ethers-v6/factories/contracts/examples/ERC20Messaging__factory' +import { BurnableMintableCappedERC20__factory } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/BurnableMintableCappedERC20__factory' +import { ERC20Messaging } from '../../typechain-types/ethers-v6/contracts/examples/ERC20Messaging' 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' diff --git a/scripts/upgrade-topos-core.ts b/scripts/upgrade-topos-core.ts index 700f93a..893a31f 100644 --- a/scripts/upgrade-topos-core.ts +++ b/scripts/upgrade-topos-core.ts @@ -8,8 +8,8 @@ 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 } from '../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCore__factory' +import { CodeHash__factory } from '../typechain-types/ethers-v6/factories/contracts/topos-core/CodeHash__factory' import toposCoreJSON from '../artifacts/contracts/topos-core/ToposCore.sol/ToposCore.json' diff --git a/test/topos-core/BurnableMintableCappedERC20.test.ts b/test/topos-core/BurnableMintableCappedERC20.test.ts index 66047a1..3370a24 100644 --- a/test/topos-core/BurnableMintableCappedERC20.test.ts +++ b/test/topos-core/BurnableMintableCappedERC20.test.ts @@ -2,8 +2,8 @@ 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 } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/BurnableMintableCappedERC20__factory' +import { TokenDeployer__factory } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/TokenDeployer__factory' import * as tc from './shared/constants/tokens' describe('BurnableMintableCappedERC20', () => { diff --git a/test/topos-core/Bytes32Sets.test.ts b/test/topos-core/Bytes32Sets.test.ts index 3f4eb18..3c171fc 100644 --- a/test/topos-core/Bytes32Sets.test.ts +++ b/test/topos-core/Bytes32Sets.test.ts @@ -1,8 +1,8 @@ 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__factory } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/Bytes32Sets.sol/Bytes32SetsTest__factory' +import { Bytes32SetsTest } from '../../typechain-types/ethers-v6/contracts/topos-core/Bytes32Sets.sol/Bytes32SetsTest' describe('Bytes32Sets', () => { let bytes32SetsTest: Bytes32SetsTest diff --git a/test/topos-core/SubnetRegistrator.test.ts b/test/topos-core/SubnetRegistrator.test.ts index 7061eff..b2d631b 100644 --- a/test/topos-core/SubnetRegistrator.test.ts +++ b/test/topos-core/SubnetRegistrator.test.ts @@ -2,8 +2,8 @@ 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 } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/SubnetRegistrator__factory' +import { SubnetRegistrator } from '../../typechain-types/ethers-v6' describe('SubnetRegistrator', () => { const chainId = 1 diff --git a/test/topos-core/ToposCore.test.ts b/test/topos-core/ToposCore.test.ts index 6f84417..3eb4012 100644 --- a/test/topos-core/ToposCore.test.ts +++ b/test/topos-core/ToposCore.test.ts @@ -2,10 +2,10 @@ 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 { ToposCore__factory } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCore__factory' +import { ToposCoreProxy__factory } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/ToposCoreProxy__factory' +import { CodeHash__factory } from '../../typechain-types/ethers-v6/factories/contracts/topos-core/CodeHash__factory' +import { ToposCoreProxy } from '../../typechain-types/ethers-v6/contracts/topos-core/ToposCoreProxy' import * as cc from './shared/constants/certificates' import * as testUtils from './shared/utils/common' diff --git a/test/topos-core/ToposMessaging.test.ts b/test/topos-core/ToposMessaging.test.ts index a12442c..5cb7a56 100644 --- a/test/topos-core/ToposMessaging.test.ts +++ b/test/topos-core/ToposMessaging.test.ts @@ -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'