diff --git a/contracts/package.json b/contracts/package.json index 0c3699c1b..f2c791b18 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -25,6 +25,11 @@ "deploy-local": "hardhat deploy --tags Arbitration,HomeArbitrable --network localhost", "simulate": "hardhat simulate:all", "simulate-local": "hardhat simulate:all --network localhost", + "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", "bot:relayer-from-sepolia": "NODE_NO_WARNINGS=1 NODE_OPTIONS=--experimental-fetch hardhat run ./scripts/disputeRelayerBotFromSepolia.ts", @@ -55,6 +60,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", @@ -78,7 +84,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 new file mode 100644 index 000000000..3e4dffe9c --- /dev/null +++ b/contracts/scripts/viem-test.ts @@ -0,0 +1,25 @@ +import { createPublicClient, http, getContract } from "viem"; +import { arbitrumSepolia } from "viem/chains"; +import { disputeKitClassicConfig } from "../viem/generated"; + +const main = async () => { + const client = createPublicClient({ + chain: arbitrumSepolia, + transport: http(), + }); + + const disputeKit = getContract({ + address: disputeKitClassicConfig.address[arbitrumSepolia.id], + abi: disputeKitClassicConfig.abi, + publicClient: client, + }); + + await disputeKit.read.governor().then(console.log); +}; + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); 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. } 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 new file mode 100644 index 000000000..41735176b --- /dev/null +++ b/contracts/wagmi.config.hardhat.ts @@ -0,0 +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", + 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/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 99598bc3f..e18b15aad 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 @@ -5386,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 @@ -5405,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 @@ -5505,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 @@ -13028,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 @@ -31729,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 @@ -31749,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 @@ -32468,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 @@ -32485,7 +32486,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 92fffbc1715482969b6af7ac6df51cbd4cfe4e6d55226562eb0658a16b9a9b3df743c1ec1aebb63221b5117d4956fb2f71788bc06f6316d054ac402406614b31 + checksum: ba6d296ce271e8068d0dd3cecfbe254cc046cda4acf9393f36045d1a60aa6c669b259dc82a09a3a100c8cb0930142906280782181f341b43496789239332cd9b languageName: node linkType: hard