Commit a63b992b authored by Kelvin Fichter's avatar Kelvin Fichter Committed by Kelvin Fichter

feat: improve contract data autogen process

parent 8c8807c0
......@@ -39,7 +39,7 @@
"typescript": "^4.3.5"
},
"scripts": {
"clean": "yarn lerna run clean",
"clean": "yarn lerna run clean --parallel",
"build": "yarn lerna run build",
"test": "yarn lerna run test --parallel",
"test:coverage": "yarn lerna run test:coverage --parallel",
......
src/contract-artifacts.ts
src/contract-deployed-artifacts.ts
......@@ -7,42 +7,38 @@
"dist/types/*.ts",
"artifacts/contracts/**/*.json",
"deployments/**/*.json",
"OVM",
"iOVM",
"libraries",
"mockOVM"
"chugsplash",
"L1",
"L2",
"libraries"
],
"types": "dist/index",
"author": "Optimism PBC",
"license": "MIT",
"scripts": {
"all": "yarn clean && yarn build && yarn test && yarn lint:fix && yarn lint",
"build": "./scripts/build.sh",
"build:kovan": "yarn run build:contracts && yarn run build:typescript && yarn run build:copy && CHAIN_ID=69 yarn run build:dump && yarn run build:typechain",
"build:mainnet": "yarn run build:contracts && yarn run build:typescript && yarn run build:copy && CHAIN_ID=10 yarn run build:dump && yarn run build:typechain",
"build": "yarn build:contracts && yarn autogen:artifacts && yarn build:typescript",
"build:typescript": "tsc -p ./tsconfig.build.json",
"build:contracts": "hardhat compile --show-stack-traces",
"build:dump": "ts-node \"bin/take-dump.ts\"",
"build:typechain": "hardhat typechain",
"test": "yarn run test:contracts",
"build:dump": "ts-node bin/take-dump.ts",
"autogen:markdown": "node scripts/generate-markdown.js",
"autogen:artifacts": "node scripts/generate-artifacts.js && node scripts/generate-deployed-artifacts.js",
"test": "yarn test:contracts",
"test:contracts": "hardhat test --show-stack-traces",
"test:gas": "hardhat test \"test/contracts/OVM/execution/OVM_StateManager.gas-spec.ts\" --no-compile --show-stack-traces",
"test:coverage": "NODE_OPTIONS=--max_old_space_size=8192 hardhat coverage",
"test:slither": "slither .",
"pretest:slither": "rm -f @openzeppelin && rm -f @ens && rm -f hardhat && ln -s ../../node_modules/@openzeppelin @openzeppelin && ln -s ../../node_modules/@ens @ens && ln -s ../../node_modules/hardhat hardhat",
"posttest:slither": "rm -f @openzeppelin && rm -f @ens && rm -f hardhat",
"lint": "yarn lint:check",
"lint:check": "eslint .",
"lint:fix": "yarn lint:check --fix",
"lint:contracts": "yarn solhint -f table contracts/**/*.sol",
"clean": "rm -rf ./dist ./artifacts ./cache ./tsconfig.build.tsbuildinfo",
"deploy": "ts-node \"./bin/deploy.ts\" && yarn generate:markdown",
"deploy": "ts-node bin/deploy.ts && yarn autogen:markdown",
"serve": "./bin/serve_dump.sh",
"prepublishOnly": "yarn copyfiles -u 1 -e \"**/test-*/**/*\" \"contracts/**/*\" ./",
"postpublish": "rimraf OVM iOVM libraries mockOVM",
"postpublish": "rimraf chugsplash L1 L2 libraries",
"prepack": "yarn prepublishOnly",
"postpack": "yarn postpublish",
"generate:markdown": "node \"./scripts/generate-markdown.js\"",
"generate:artifacts": "node \"./scripts/generate-artifacts.js\"",
"pre-commit": "lint-staged"
},
"dependencies": {
......@@ -51,8 +47,7 @@
"@ethersproject/abstract-signer": "^5.4.1",
"@ethersproject/contracts": "^5.4.1",
"@ethersproject/hardware-wallets": "^5.4.0",
"@nomiclabs/hardhat-etherscan": "^2.1.5",
"glob": "^7.1.6"
"@nomiclabs/hardhat-etherscan": "^2.1.5"
},
"devDependencies": {
"@codechecks/client": "^0.1.11",
......@@ -92,6 +87,7 @@
"eslint-plugin-unicorn": "^32.0.1",
"ethereum-waffle": "^3.3.0",
"ethers": "^5.4.5",
"glob": "^7.1.6",
"hardhat": "^2.3.0",
"hardhat-deploy": "^0.7.4",
"hardhat-gas-reporter": "^1.0.4",
......
#!/bin/bash
set -e
yarn build:contracts
yarn generate:artifacts
yarn build:typescript
#!/usr/bin/env node
const path = require('path')
const glob = require('glob')
const fs = require('fs')
;(async () => {
console.log(`writing deployed contract artifacts typescript file`)
let content = `
/* eslint-disable @typescript-eslint/no-var-requires, no-empty */
/*
THIS FILE IS AUTOMATICALLY GENERATED.
DO NOT EDIT.
*/
`
const deploymentNames = fs
.readdirSync(path.resolve(__dirname, '../deployments'), {
withFileTypes: true,
})
.filter((entry) => {
return entry.isDirectory()
})
.map((entry) => {
return entry.name
})
const artifactNames = []
for (const deploymentName of deploymentNames) {
const deploymentArtifacts = glob.sync(
path.join(
path.resolve(__dirname, '../deployments'),
deploymentName,
'/*.json'
)
)
for (const artifactPath of deploymentArtifacts) {
const relPath = path.relative(__dirname, artifactPath)
const contractName = path.basename(artifactPath, '.json')
const artifactName = `${deploymentName}__${contractName}`.replace(
/-/g,
'_'
)
artifactNames.push(artifactName)
content += `const ${artifactName} = require('${relPath}')\n`
}
}
content += `
export const getDeployedContractArtifact = (name: string, network: string): any => {
return {
${artifactNames
.map((artifactName) => {
return `${artifactName}: ${artifactName}`
})
.join(',\n')}
}[(network + '__' + name).replace(/-/g, '_')]
}
`
fs.writeFileSync(`./src/contract-deployed-artifacts.ts`, content)
})().catch(console.error)
import { Signer, Contract } from 'ethers'
import { Provider } from '@ethersproject/abstract-provider'
import { getL1ContractData, getL2ContractData } from './contract-data'
import { getContractArtifact } from './contract-artifacts'
import { getDeployedContractArtifact } from './contract-deployed-artifacts'
import { predeploys } from './predeploys'
export type Network = 'goerli' | 'kovan' | 'mainnet'
interface L1Contracts {
......@@ -53,23 +55,21 @@ export const connectL1Contracts = async (
throw Error('Must specify network: mainnet, kovan, or goerli.')
}
const l1ContractData = getL1ContractData(network)
const toEthersContract = (data) =>
new Contract(data.address, data.abi, signerOrProvider)
const getEthersContract = (name: string) => {
const artifact = getDeployedContractArtifact(name, network)
return new Contract(artifact.address, artifact.abi, signerOrProvider)
}
return {
addressManager: toEthersContract(l1ContractData.Lib_AddressManager),
canonicalTransactionChain: toEthersContract(
l1ContractData.OVM_CanonicalTransactionChain
addressManager: getEthersContract('Lib_AddressManager'),
canonicalTransactionChain: getEthersContract(
'OVM_CanonicalTransactionChain'
),
stateCommitmentChain: toEthersContract(
l1ContractData.OVM_StateCommitmentChain
stateCommitmentChain: getEthersContract('OVM_StateCommitmentChain'),
xDomainMessengerProxy: getEthersContract(
'Proxy__OVM_L1CrossDomainMessenger'
),
xDomainMessengerProxy: toEthersContract(
l1ContractData.Proxy__OVM_L1CrossDomainMessenger
),
bondManager: toEthersContract(l1ContractData.OVM_BondManager),
bondManager: getEthersContract('mockOVM_BondManager'),
}
}
......@@ -80,21 +80,24 @@ export const connectL1Contracts = async (
* @returns l2 contracts connected to signer/provider
*/
export const connectL2Contracts = async (
signerOrProvider
signerOrProvider: any
): Promise<L2Contracts> => {
const l2ContractData = await getL2ContractData()
checkSignerType(signerOrProvider)
const toEthersContract = (data) =>
new Contract(data.address, data.abi, signerOrProvider)
const getEthersContract = (name: string, iface?: string) => {
const artifact = getContractArtifact(iface || name)
const address = predeploys[name]
return new Contract(address, artifact.abi, signerOrProvider)
}
return {
eth: toEthersContract(l2ContractData.OVM_ETH),
xDomainMessenger: toEthersContract(
l2ContractData.OVM_L2CrossDomainMessenger
eth: getEthersContract('OVM_ETH'),
xDomainMessenger: getEthersContract('OVM_L2CrossDomainMessenger'),
messagePasser: getEthersContract('OVM_L2ToL1MessagePasser'),
messageSender: getEthersContract(
'OVM_L1MessageSender',
'iOVM_L1MessageSender'
),
messagePasser: toEthersContract(l2ContractData.OVM_L2ToL1MessagePasser),
messageSender: toEthersContract(l2ContractData.OVM_L1MessageSender),
deployerWhiteList: toEthersContract(l2ContractData.OVM_DeployerWhitelist),
deployerWhiteList: getEthersContract('OVM_DeployerWhitelist'),
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment