From ffdb0c2d93c0f7d754e1519cf8d64d1a6155ebd5 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Wed, 26 Jul 2023 19:28:53 +0100 Subject: [PATCH 1/6] feat: viem setup and hello world script --- contracts/package.json | 3 +++ contracts/scripts/viem-test.ts | 25 +++++++++++++++++++++++ contracts/wagmi.config.hardhat.ts | 12 +++++++++++ contracts/wagmi.config.ts | 34 +++++++++++++++++++++++++++++++ yarn.lock | 1 + 5 files changed, 75 insertions(+) create mode 100644 contracts/scripts/viem-test.ts create mode 100644 contracts/wagmi.config.hardhat.ts create mode 100644 contracts/wagmi.config.ts diff --git a/contracts/package.json b/contracts/package.json index 0c3699c1b..ea6e513ef 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -25,6 +25,8 @@ "deploy-local": "hardhat deploy --tags Arbitration,HomeArbitrable --network localhost", "simulate": "hardhat simulate:all", "simulate-local": "hardhat simulate:all --network localhost", + "viem:generate": "NODE_NO_WARNINGS=1 wagmi generate", + "viem:test": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./scripts/viem-test.ts", "bot:keeper": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch hardhat run ./scripts/keeperBot.ts", "bot:relayer-from-chiado": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch hardhat run ./scripts/disputeRelayerBotFromChiado.ts", "bot:relayer-from-sepolia": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch hardhat run ./scripts/disputeRelayerBotFromSepolia.ts", @@ -55,6 +57,7 @@ "@types/chai": "^4.3.11", "@types/mocha": "^10.0.6", "@types/node": "^16.18.68", + "@wagmi/cli": "^1.5.2", "chai": "^4.3.10", "dotenv": "^16.3.1", "ethereumjs-util": "^7.1.5", diff --git a/contracts/scripts/viem-test.ts b/contracts/scripts/viem-test.ts new file mode 100644 index 000000000..752e51be8 --- /dev/null +++ b/contracts/scripts/viem-test.ts @@ -0,0 +1,25 @@ +import { createPublicClient, http, getContract } from "viem"; +import { arbitrumGoerli } from "viem/chains"; +import { homeGatewayToGnosisConfig } from "../viem/generated"; + +const main = async () => { + const client = createPublicClient({ + chain: arbitrumGoerli, + transport: http(), + }); + + const homeGateway = getContract({ + address: homeGatewayToGnosisConfig.address[arbitrumGoerli.id], + abi: homeGatewayToGnosisConfig.abi, + publicClient: client, + }); + + await homeGateway.read.governor().then(console.log); +}; + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/contracts/wagmi.config.hardhat.ts b/contracts/wagmi.config.hardhat.ts new file mode 100644 index 000000000..497ae6a49 --- /dev/null +++ b/contracts/wagmi.config.hardhat.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "@wagmi/cli"; +import { hardhat } from "@wagmi/cli/plugins"; + +export default defineConfig({ + out: "viem/generated.hardhat.ts", + contracts: [], + plugins: [ + hardhat({ + project: ".", + }), + ], +}); diff --git a/contracts/wagmi.config.ts b/contracts/wagmi.config.ts new file mode 100644 index 000000000..62a90cf2b --- /dev/null +++ b/contracts/wagmi.config.ts @@ -0,0 +1,34 @@ +import { Config, ContractConfig, defineConfig } from "@wagmi/cli"; +import { arbitrumGoerli, gnosisChiado } from "wagmi/chains"; +import HomeGatewayToGnosis from "@kleros/kleros-v2-contracts/deployments/arbitrumGoerli/HomeGatewayToGnosis.json" assert { type: "json" }; +import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; +import { Abi } from "viem"; + +type ArtifactPartial = { + abi: Abi; +}; + +const getAbi = (artifact: any) => { + return (artifact as ArtifactPartial).abi; +}; + +const getConfig = async (): Promise => { + return { + out: "viem/generated.ts", + contracts: [ + { + name: "HomeGatewayToGnosis", + address: { + [arbitrumGoerli.id]: HomeGatewayToGnosis.address as `0x{string}`, + }, + abi: getAbi(HomeGatewayToGnosis), + }, + { + name: "IHomeGateway", + abi: getAbi(IHomeGateway), + }, + ], + }; +}; + +export default defineConfig(getConfig); diff --git a/yarn.lock b/yarn.lock index 99598bc3f..01b2f210a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5363,6 +5363,7 @@ __metadata: "@types/chai": ^4.3.11 "@types/mocha": ^10.0.6 "@types/node": ^16.18.68 + "@wagmi/cli": ^1.5.2 chai: ^4.3.10 dotenv: ^16.3.1 ethereumjs-util: ^7.1.5 From a6b0dee232d4ccde22c0cd0f3b05f072bcd24112 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Wed, 26 Jul 2023 20:52:14 +0100 Subject: [PATCH 2/6] feat: generate the wagmi config dynamically by reading the deployment artifacts from all the chains --- contracts/wagmi.config.ts | 88 ++++++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 10 deletions(-) diff --git a/contracts/wagmi.config.ts b/contracts/wagmi.config.ts index 62a90cf2b..7d35a08c7 100644 --- a/contracts/wagmi.config.ts +++ b/contracts/wagmi.config.ts @@ -1,8 +1,9 @@ +import { readdir, readFile } from "fs/promises"; +import { parse, join } from "path"; import { Config, ContractConfig, defineConfig } from "@wagmi/cli"; -import { arbitrumGoerli, gnosisChiado } from "wagmi/chains"; -import HomeGatewayToGnosis from "@kleros/kleros-v2-contracts/deployments/arbitrumGoerli/HomeGatewayToGnosis.json" assert { type: "json" }; -import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; import { Abi } from "viem"; +import { Chain } from "@wagmi/chains"; +import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; type ArtifactPartial = { abi: Abi; @@ -12,17 +13,84 @@ const getAbi = (artifact: any) => { return (artifact as ArtifactPartial).abi; }; +const readArtifacts = async (viemChainName: string, hardhatChainName?: string) => { + const chains = await import("wagmi/chains"); + const chain = chains[viemChainName] as Chain; + if (!chain) { + throw new Error(`Viem chain ${viemChainName} not found`); + } + + const directoryPath = `./deployments/${hardhatChainName ?? viemChainName}`; + const files = await readdir(directoryPath); + + const results: ContractConfig[] = []; + for (const file of files) { + const { name, ext } = parse(file); + if (ext === ".json") { + const filePath = join(directoryPath, file); + const fileContent = await readFile(filePath, "utf-8"); + const jsonContent = JSON.parse(fileContent); + results.push({ + name: name, + address: { + [chain.id]: jsonContent.address as `0x{string}`, + }, + abi: jsonContent.abi, + }); + } + } + return results; +}; + +// Group contracts by name and merge the address dictionary +function merge(arr1: ContractConfig[], arr2: ContractConfig[]) { + const mergedArr: ContractConfig[] = [...arr1]; + for (const contract of arr2) { + const index = mergedArr.findIndex((c) => c.name === contract.name); + if (index === -1) { + mergedArr.push(contract); + } else { + mergedArr[index] = { + ...mergedArr[index], + address: { + ...(mergedArr[index].address as Record), + ...(contract.address as Record), + }, + }; + } + } + return mergedArr; +} + const getConfig = async (): Promise => { + const arbitrumGoerliContracts = await readArtifacts("arbitrumGoerli"); + arbitrumGoerliContracts.forEach((c) => console.log("✔ Found arbitrumGoerli artifact: %s", c.name)); + let contracts = arbitrumGoerliContracts; + + const chiadoContracts = await readArtifacts("gnosisChiado", "chiado"); // renaming the Hardhat network improves this but breaks many other scripts + chiadoContracts.forEach((c) => console.log("✔ Found chiado artifact: %s", c.name)); + contracts = merge(contracts, chiadoContracts); + + const goerliContracts = await readArtifacts("goerli"); + goerliContracts.forEach((c) => console.log("✔ Found goerli artifact: %s", c.name)); + contracts = merge(contracts, goerliContracts); + + const arbitrumContracts = await readArtifacts("arbitrum"); + arbitrumContracts.forEach((c) => console.log("✔ Found arbitrum artifact: %s", c.name)); + contracts = merge(contracts, arbitrumContracts); + + const gnosisContracts = await readArtifacts("gnosis", "gnosischain"); + gnosisContracts.forEach((c) => console.log("✔ Found gnosis artifact: %s", c.name)); + contracts = merge(contracts, gnosisContracts); + + const mainnetContracts = await readArtifacts("mainnet"); + mainnetContracts.forEach((c) => console.log("✔ Found mainnet artifact: %s", c.name)); + contracts = merge(contracts, mainnetContracts); + return { out: "viem/generated.ts", contracts: [ - { - name: "HomeGatewayToGnosis", - address: { - [arbitrumGoerli.id]: HomeGatewayToGnosis.address as `0x{string}`, - }, - abi: getAbi(HomeGatewayToGnosis), - }, + ...contracts, { name: "IHomeGateway", abi: getAbi(IHomeGateway), From c146566456ecbc19866266fda800fd40d0041359 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Thu, 28 Dec 2023 00:11:13 +0100 Subject: [PATCH 3/6] chore: migration to arbi sepolia, bumped typescription beause viem requires v5 --- contracts/package.json | 2 +- contracts/scripts/viem-test.ts | 14 +++++++------- contracts/wagmi.config.ts | 12 ++++++------ eslint-config/package.json | 2 +- web/package.json | 4 ++-- yarn.lock | 32 ++++++++++++++++---------------- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/contracts/package.json b/contracts/package.json index ea6e513ef..d99586502 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -81,7 +81,7 @@ "solidity-coverage": "0.8.2", "ts-node": "^10.9.2", "typechain": "^8.3.2", - "typescript": "^4.9.5" + "typescript": "^5.3.3" }, "dependencies": { "@kleros/vea-contracts": "^0.3.2" diff --git a/contracts/scripts/viem-test.ts b/contracts/scripts/viem-test.ts index 752e51be8..3e4dffe9c 100644 --- a/contracts/scripts/viem-test.ts +++ b/contracts/scripts/viem-test.ts @@ -1,20 +1,20 @@ import { createPublicClient, http, getContract } from "viem"; -import { arbitrumGoerli } from "viem/chains"; -import { homeGatewayToGnosisConfig } from "../viem/generated"; +import { arbitrumSepolia } from "viem/chains"; +import { disputeKitClassicConfig } from "../viem/generated"; const main = async () => { const client = createPublicClient({ - chain: arbitrumGoerli, + chain: arbitrumSepolia, transport: http(), }); - const homeGateway = getContract({ - address: homeGatewayToGnosisConfig.address[arbitrumGoerli.id], - abi: homeGatewayToGnosisConfig.abi, + const disputeKit = getContract({ + address: disputeKitClassicConfig.address[arbitrumSepolia.id], + abi: disputeKitClassicConfig.abi, publicClient: client, }); - await homeGateway.read.governor().then(console.log); + await disputeKit.read.governor().then(console.log); }; main() diff --git a/contracts/wagmi.config.ts b/contracts/wagmi.config.ts index 7d35a08c7..4e22e9425 100644 --- a/contracts/wagmi.config.ts +++ b/contracts/wagmi.config.ts @@ -63,17 +63,17 @@ function merge(arr1: ContractConfig[], arr2: ContractConfig[]) { } const getConfig = async (): Promise => { - const arbitrumGoerliContracts = await readArtifacts("arbitrumGoerli"); - arbitrumGoerliContracts.forEach((c) => console.log("✔ Found arbitrumGoerli artifact: %s", c.name)); - let contracts = arbitrumGoerliContracts; + const arbitrumSepoliaContracts = await readArtifacts("arbitrumSepolia", "arbitrumSepoliaDevnet"); + arbitrumSepoliaContracts.forEach((c) => console.log("✔ Found arbitrumSepolia artifact: %s", c.name)); + let contracts = arbitrumSepoliaContracts; const chiadoContracts = await readArtifacts("gnosisChiado", "chiado"); // renaming the Hardhat network improves this but breaks many other scripts chiadoContracts.forEach((c) => console.log("✔ Found chiado artifact: %s", c.name)); contracts = merge(contracts, chiadoContracts); - const goerliContracts = await readArtifacts("goerli"); - goerliContracts.forEach((c) => console.log("✔ Found goerli artifact: %s", c.name)); - contracts = merge(contracts, goerliContracts); + const sepoliaContracts = await readArtifacts("sepolia"); + sepoliaContracts.forEach((c) => console.log("✔ Found sepolia artifact: %s", c.name)); + contracts = merge(contracts, sepoliaContracts); const arbitrumContracts = await readArtifacts("arbitrum"); arbitrumContracts.forEach((c) => console.log("✔ Found arbitrum artifact: %s", c.name)); diff --git a/eslint-config/package.json b/eslint-config/package.json index 8764a6c99..f1bc07a90 100644 --- a/eslint-config/package.json +++ b/eslint-config/package.json @@ -18,7 +18,7 @@ "eslint-utils": "^3.0.0" }, "devDependencies": { - "typescript": "^4.9.5" + "typescript": "^5.3.3" }, "peerDependencies": { "eslint": "8.x" diff --git a/web/package.json b/web/package.json index 258e7cc63..e86fc436f 100644 --- a/web/package.json +++ b/web/package.json @@ -67,7 +67,7 @@ "lru-cache": "^7.18.3", "parcel": "2.8.3", "supabase": "^1.102.2", - "typescript": "^4.9.5" + "typescript": "^5.3.3" }, "dependencies": { "@filebase/client": "^0.0.5", @@ -104,7 +104,7 @@ "react-toastify": "^9.1.3", "react-use": "^17.4.0", "styled-components": "^5.3.9", - "viem": "^1.20.3", + "viem": "^1.21.1", "wagmi": "^1.4.12" }, "volta": { diff --git a/yarn.lock b/yarn.lock index 01b2f210a..ced0b478b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5387,7 +5387,7 @@ __metadata: solidity-coverage: 0.8.2 ts-node: ^10.9.2 typechain: ^8.3.2 - typescript: ^4.9.5 + typescript: ^5.3.3 languageName: unknown linkType: soft @@ -5406,7 +5406,7 @@ __metadata: eslint-plugin-promise: ^5.2.0 eslint-plugin-security: ^1.7.1 eslint-utils: ^3.0.0 - typescript: ^4.9.5 + typescript: ^5.3.3 peerDependencies: eslint: 8.x languageName: unknown @@ -5506,8 +5506,8 @@ __metadata: react-use: ^17.4.0 styled-components: ^5.3.9 supabase: ^1.102.2 - typescript: ^4.9.5 - viem: ^1.20.3 + typescript: ^5.3.3 + viem: ^1.21.1 wagmi: ^1.4.12 languageName: unknown linkType: soft @@ -31730,13 +31730,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9.5": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" +"typescript@npm:^5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 languageName: node linkType: hard @@ -31750,13 +31750,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^4.9.5#~builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=ad5954" +"typescript@patch:typescript@^5.3.3#~builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=ad5954" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 8f6260acc86b56bfdda6004bc53f32ea548f543e8baef7071c8e34d29d292f3e375c8416556c8de10b24deef6933cd1c16a8233dc84a3dd43a13a13265d0faab + checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 languageName: node linkType: hard @@ -32469,9 +32469,9 @@ __metadata: languageName: node linkType: hard -"viem@npm:^1.20.3": - version: 1.20.3 - resolution: "viem@npm:1.20.3" +"viem@npm:^1.21.1": + version: 1.21.1 + resolution: "viem@npm:1.21.1" dependencies: "@adraffy/ens-normalize": 1.10.0 "@noble/curves": 1.2.0 @@ -32486,7 +32486,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 92fffbc1715482969b6af7ac6df51cbd4cfe4e6d55226562eb0658a16b9a9b3df743c1ec1aebb63221b5117d4956fb2f71788bc06f6316d054ac402406614b31 + checksum: ba6d296ce271e8068d0dd3cecfbe254cc046cda4acf9393f36045d1a60aa6c669b259dc82a09a3a100c8cb0930142906280782181f341b43496789239332cd9b languageName: node linkType: hard From 9030b51f5f3367517a3ea006a3157cc4e10088d0 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Thu, 28 Dec 2023 00:14:36 +0100 Subject: [PATCH 4/6] chore: updated browserslist db --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index ced0b478b..e18b15aad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13029,9 +13029,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001464, caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001506 - resolution: "caniuse-lite@npm:1.0.30001506" - checksum: 0a090745824622df146e2f6dde79c7f7920a899dec1b3a599d2ef9acf41cef5e179fd133bb59f2030286a4ea935f4230e05438d7394694c414e8ada345eb5268 + version: 1.0.30001572 + resolution: "caniuse-lite@npm:1.0.30001572" + checksum: 7d017a99a38e29ccee4ed3fc0ef1eb90cf082fcd3a7909c5c536c4ba1d55c5b26ecc1e4ad82c1caa6bfadce526764b354608710c9b61a75bdc7ce8ca15c5fcf2 languageName: node linkType: hard From 16d8dc63d431178c3bcf8a60970e8b2711fdfa15 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Thu, 28 Dec 2023 01:13:07 +0100 Subject: [PATCH 5/6] refactor: extracted deployment-specific wagmi configs --- contracts/package.json | 5 +- contracts/tsconfig.json | 3 +- contracts/wagmi.config.devnet.ts | 30 +++++++++ contracts/wagmi.config.hardhat.ts | 4 +- contracts/wagmi.config.mainnet.ts | 30 +++++++++ contracts/wagmi.config.testnet.ts | 30 +++++++++ contracts/wagmi.config.ts | 102 ------------------------------ 7 files changed, 99 insertions(+), 105 deletions(-) create mode 100644 contracts/wagmi.config.devnet.ts create mode 100644 contracts/wagmi.config.mainnet.ts create mode 100644 contracts/wagmi.config.testnet.ts delete mode 100644 contracts/wagmi.config.ts diff --git a/contracts/package.json b/contracts/package.json index d99586502..f2c791b18 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -25,7 +25,10 @@ "deploy-local": "hardhat deploy --tags Arbitration,HomeArbitrable --network localhost", "simulate": "hardhat simulate:all", "simulate-local": "hardhat simulate:all --network localhost", - "viem:generate": "NODE_NO_WARNINGS=1 wagmi generate", + "viem:generate-devnet": "NODE_NO_WARNINGS=1 wagmi generate -c wagmi.config.devnet.ts", + "viem:generate-testnet": "NODE_NO_WARNINGS=1 wagmi generate -c wagmi.config.testnet.ts", + "viem:generate-mainnet": "NODE_NO_WARNINGS=1 wagmi generate -c wagmi.config.mainnet.ts", + "viem:generate-hardhat": "NODE_NO_WARNINGS=1 wagmi generate -c wagmi.config.hardhat.ts", "viem:test": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch ts-node ./scripts/viem-test.ts", "bot:keeper": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch hardhat run ./scripts/keeperBot.ts", "bot:relayer-from-chiado": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch hardhat run ./scripts/disputeRelayerBotFromChiado.ts", diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json index b6d222642..585063970 100644 --- a/contracts/tsconfig.json +++ b/contracts/tsconfig.json @@ -5,7 +5,8 @@ "./scripts", "./test", "./typechain-types", - "./deploy" + "./deploy", + "./viem" ], "files": [ "./hardhat.config.ts" diff --git a/contracts/wagmi.config.devnet.ts b/contracts/wagmi.config.devnet.ts new file mode 100644 index 000000000..3f21f32a4 --- /dev/null +++ b/contracts/wagmi.config.devnet.ts @@ -0,0 +1,30 @@ +import { Config, defineConfig } from "@wagmi/cli"; +import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; +import { getAbi, readArtifacts, merge } from "./scripts/wagmiHelpers"; + +const getConfig = async (): Promise => { + const arbitrumSepoliaContracts = await readArtifacts("arbitrumSepolia", "arbitrumSepoliaDevnet"); + arbitrumSepoliaContracts.forEach((c) => console.log("✔ Found arbitrumSepolia artifact: %s", c.name)); + let contracts = arbitrumSepoliaContracts; + + const chiadoContracts = await readArtifacts("gnosisChiado", "chiadoDevnet"); // renaming the Hardhat network improves this but breaks many other scripts + chiadoContracts.forEach((c) => console.log("✔ Found chiado artifact: %s", c.name)); + contracts = merge(contracts, chiadoContracts); + + const sepoliaContracts = await readArtifacts("sepolia", "sepoliaDevnet"); + sepoliaContracts.forEach((c) => console.log("✔ Found sepolia artifact: %s", c.name)); + contracts = merge(contracts, sepoliaContracts); + + return { + out: "viem/generated.devnet.ts", + contracts: [ + ...contracts, + { + name: "IHomeGateway", + abi: getAbi(IHomeGateway), + }, + ], + }; +}; + +export default defineConfig(getConfig); diff --git a/contracts/wagmi.config.hardhat.ts b/contracts/wagmi.config.hardhat.ts index 497ae6a49..41735176b 100644 --- a/contracts/wagmi.config.hardhat.ts +++ b/contracts/wagmi.config.hardhat.ts @@ -1,12 +1,14 @@ import { defineConfig } from "@wagmi/cli"; import { hardhat } from "@wagmi/cli/plugins"; +// Useful for contracts which are not deployed yet export default defineConfig({ out: "viem/generated.hardhat.ts", - contracts: [], plugins: [ hardhat({ project: ".", + namePrefix: "Hardhat", + exclude: ["Initializable.json", "UpgradedByRewrite.json"], // These artifacts crash the wagmi cli name generator }), ], }); diff --git a/contracts/wagmi.config.mainnet.ts b/contracts/wagmi.config.mainnet.ts new file mode 100644 index 000000000..c02e9e99c --- /dev/null +++ b/contracts/wagmi.config.mainnet.ts @@ -0,0 +1,30 @@ +import { Config, defineConfig } from "@wagmi/cli"; +import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; +import { getAbi, readArtifacts, merge } from "./scripts/wagmiHelpers"; + +const getConfig = async (): Promise => { + const arbitrumContracts = await readArtifacts("arbitrum"); + arbitrumContracts.forEach((c) => console.log("✔ Found arbitrum artifact: %s", c.name)); + let contracts = arbitrumContracts; + + const gnosisContracts = await readArtifacts("gnosis", "gnosischain"); + gnosisContracts.forEach((c) => console.log("✔ Found gnosis artifact: %s", c.name)); + contracts = merge(contracts, gnosisContracts); + + const mainnetContracts = await readArtifacts("mainnet"); + mainnetContracts.forEach((c) => console.log("✔ Found mainnet artifact: %s", c.name)); + contracts = merge(contracts, mainnetContracts); + + return { + out: "viem/generated.mainnet.ts", + contracts: [ + ...contracts, + { + name: "IHomeGateway", + abi: getAbi(IHomeGateway), + }, + ], + }; +}; + +export default defineConfig(getConfig); diff --git a/contracts/wagmi.config.testnet.ts b/contracts/wagmi.config.testnet.ts new file mode 100644 index 000000000..07c307510 --- /dev/null +++ b/contracts/wagmi.config.testnet.ts @@ -0,0 +1,30 @@ +import { Config, defineConfig } from "@wagmi/cli"; +import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; +import { getAbi, readArtifacts, merge } from "./scripts/wagmiHelpers"; + +const getConfig = async (): Promise => { + const arbitrumSepoliaContracts = await readArtifacts("arbitrumSepolia"); + arbitrumSepoliaContracts.forEach((c) => console.log("✔ Found arbitrumSepolia artifact: %s", c.name)); + let contracts = arbitrumSepoliaContracts; + + const chiadoContracts = await readArtifacts("gnosisChiado", "chiado"); // renaming the Hardhat network improves this but breaks many other scripts + chiadoContracts.forEach((c) => console.log("✔ Found chiado artifact: %s", c.name)); + contracts = merge(contracts, chiadoContracts); + + const sepoliaContracts = await readArtifacts("sepolia"); + sepoliaContracts.forEach((c) => console.log("✔ Found sepolia artifact: %s", c.name)); + contracts = merge(contracts, sepoliaContracts); + + return { + out: "viem/generated.testnet.ts", + contracts: [ + ...contracts, + { + name: "IHomeGateway", + abi: getAbi(IHomeGateway), + }, + ], + }; +}; + +export default defineConfig(getConfig); diff --git a/contracts/wagmi.config.ts b/contracts/wagmi.config.ts deleted file mode 100644 index 4e22e9425..000000000 --- a/contracts/wagmi.config.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { readdir, readFile } from "fs/promises"; -import { parse, join } from "path"; -import { Config, ContractConfig, defineConfig } from "@wagmi/cli"; -import { Abi } from "viem"; -import { Chain } from "@wagmi/chains"; -import IHomeGateway from "@kleros/kleros-v2-contracts/artifacts/src/gateway/interfaces/IHomeGateway.sol/IHomeGateway.json" assert { type: "json" }; - -type ArtifactPartial = { - abi: Abi; -}; - -const getAbi = (artifact: any) => { - return (artifact as ArtifactPartial).abi; -}; - -const readArtifacts = async (viemChainName: string, hardhatChainName?: string) => { - const chains = await import("wagmi/chains"); - const chain = chains[viemChainName] as Chain; - if (!chain) { - throw new Error(`Viem chain ${viemChainName} not found`); - } - - const directoryPath = `./deployments/${hardhatChainName ?? viemChainName}`; - const files = await readdir(directoryPath); - - const results: ContractConfig[] = []; - for (const file of files) { - const { name, ext } = parse(file); - if (ext === ".json") { - const filePath = join(directoryPath, file); - const fileContent = await readFile(filePath, "utf-8"); - const jsonContent = JSON.parse(fileContent); - results.push({ - name: name, - address: { - [chain.id]: jsonContent.address as `0x{string}`, - }, - abi: jsonContent.abi, - }); - } - } - return results; -}; - -// Group contracts by name and merge the address dictionary -function merge(arr1: ContractConfig[], arr2: ContractConfig[]) { - const mergedArr: ContractConfig[] = [...arr1]; - for (const contract of arr2) { - const index = mergedArr.findIndex((c) => c.name === contract.name); - if (index === -1) { - mergedArr.push(contract); - } else { - mergedArr[index] = { - ...mergedArr[index], - address: { - ...(mergedArr[index].address as Record), - ...(contract.address as Record), - }, - }; - } - } - return mergedArr; -} - -const getConfig = async (): Promise => { - const arbitrumSepoliaContracts = await readArtifacts("arbitrumSepolia", "arbitrumSepoliaDevnet"); - arbitrumSepoliaContracts.forEach((c) => console.log("✔ Found arbitrumSepolia artifact: %s", c.name)); - let contracts = arbitrumSepoliaContracts; - - const chiadoContracts = await readArtifacts("gnosisChiado", "chiado"); // renaming the Hardhat network improves this but breaks many other scripts - chiadoContracts.forEach((c) => console.log("✔ Found chiado artifact: %s", c.name)); - contracts = merge(contracts, chiadoContracts); - - const sepoliaContracts = await readArtifacts("sepolia"); - sepoliaContracts.forEach((c) => console.log("✔ Found sepolia artifact: %s", c.name)); - contracts = merge(contracts, sepoliaContracts); - - const arbitrumContracts = await readArtifacts("arbitrum"); - arbitrumContracts.forEach((c) => console.log("✔ Found arbitrum artifact: %s", c.name)); - contracts = merge(contracts, arbitrumContracts); - - const gnosisContracts = await readArtifacts("gnosis", "gnosischain"); - gnosisContracts.forEach((c) => console.log("✔ Found gnosis artifact: %s", c.name)); - contracts = merge(contracts, gnosisContracts); - - const mainnetContracts = await readArtifacts("mainnet"); - mainnetContracts.forEach((c) => console.log("✔ Found mainnet artifact: %s", c.name)); - contracts = merge(contracts, mainnetContracts); - - return { - out: "viem/generated.ts", - contracts: [ - ...contracts, - { - name: "IHomeGateway", - abi: getAbi(IHomeGateway), - }, - ], - }; -}; - -export default defineConfig(getConfig); From d8e6f2aabd52b17ba2abd03fba0013854b5c7573 Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Thu, 28 Dec 2023 01:14:06 +0100 Subject: [PATCH 6/6] fix: making the Constants library members internal so it doesn't produce its own ABI --- contracts/src/libraries/Constants.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/src/libraries/Constants.sol b/contracts/src/libraries/Constants.sol index 3f0b41409..ddf0adcb5 100644 --- a/contracts/src/libraries/Constants.sol +++ b/contracts/src/libraries/Constants.sol @@ -7,14 +7,14 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @title Constants library Constants { // Courts - uint96 public constant FORKING_COURT = 0; // Index of the forking court. - uint96 public constant GENERAL_COURT = 1; // Index of the default (general) court. + uint96 internal constant FORKING_COURT = 0; // Index of the forking court. + uint96 internal constant GENERAL_COURT = 1; // Index of the default (general) court. // Dispute Kits - uint256 public constant NULL_DISPUTE_KIT = 0; // Null pattern to indicate a top-level DK which has no parent. - uint256 public constant DISPUTE_KIT_CLASSIC = 1; // Index of the default DK. 0 index is skipped. + uint256 internal constant NULL_DISPUTE_KIT = 0; // Null pattern to indicate a top-level DK which has no parent. + uint256 internal constant DISPUTE_KIT_CLASSIC = 1; // Index of the default DK. 0 index is skipped. // Defaults - uint256 public constant DEFAULT_NB_OF_JURORS = 3; // The default number of jurors in a dispute. - IERC20 public constant NATIVE_CURRENCY = IERC20(address(0)); // The native currency, such as ETH on Arbitrum, Optimism and Ethereum L1. + uint256 internal constant DEFAULT_NB_OF_JURORS = 3; // The default number of jurors in a dispute. + IERC20 internal constant NATIVE_CURRENCY = IERC20(address(0)); // The native currency, such as ETH on Arbitrum, Optimism and Ethereum L1. }