From 214587016bf5cc4a81f27a543b2cb12ac43587a8 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Thu, 23 Oct 2025 15:17:26 +0100 Subject: [PATCH 1/2] feat: add contract verification on CRISP --- examples/CRISP/deploy/verify.ts | 15 ++++ examples/CRISP/deployed_contracts.json | 73 +++++++++++++++++++ examples/CRISP/hardhat.config.ts | 10 +++ examples/CRISP/package.json | 25 ++++--- .../enclave-contracts/deployed_contracts.json | 20 ++--- packages/enclave-contracts/scripts/index.ts | 1 + packages/enclave-contracts/scripts/verify.ts | 43 ++++++++--- pnpm-lock.yaml | 2 +- 8 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 examples/CRISP/deploy/verify.ts diff --git a/examples/CRISP/deploy/verify.ts b/examples/CRISP/deploy/verify.ts new file mode 100644 index 0000000000..b7d497b9ef --- /dev/null +++ b/examples/CRISP/deploy/verify.ts @@ -0,0 +1,15 @@ +import hre from "hardhat"; + +import { verifyContracts } from "@enclave-e3/contracts/scripts"; + +async function main() { + const { ethers } = await hre.network.connect(); + const [signer] = await ethers.getSigners(); + const chain = (await signer.provider?.getNetwork())?.name ?? "localhost"; + + verifyContracts(chain); +} + +main().catch((error) => { + console.error(error); +}); diff --git a/examples/CRISP/deployed_contracts.json b/examples/CRISP/deployed_contracts.json index 829bc69c13..b9500bd9c0 100644 --- a/examples/CRISP/deployed_contracts.json +++ b/examples/CRISP/deployed_contracts.json @@ -7,6 +7,79 @@ "sepolia": { "RiscZeroGroth16Verifier": { "address": "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" + }, + "PoseidonT3": { + "blockNumber": 9473284, + "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" + }, + "Enclave": { + "constructorArgs": { + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "registry": "0x0000000000000000000000000000000000000001", + "maxDuration": "2592000", + "params": [ + "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001" + ] + }, + "blockNumber": 9473285, + "address": "0xeF857ba8231E4B8ea4E5DC9CC0891D70BC8E35B8" + }, + "CiphernodeRegistryOwnable": { + "constructorArgs": { + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "enclaveAddress": "0xeF857ba8231E4B8ea4E5DC9CC0891D70BC8E35B8" + }, + "blockNumber": 9473286, + "address": "0x9c45A278A1C36B50fF1687C8DFdb123d2214BE34" + }, + "NaiveRegistryFilter": { + "constructorArgs": { + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "ciphernodeRegistryAddress": "0x9c45A278A1C36B50fF1687C8DFdb123d2214BE34" + }, + "blockNumber": 9473287, + "address": "0xbbdF6af7EBe4Ad730C726af2f40dAa867B2C0D35" + }, + "MockComputeProvider": { + "blockNumber": 9473289, + "address": "0x6C0cE8865D822803E072486D7ea0c5dEC076a066" + }, + "MockDecryptionVerifier": { + "blockNumber": 9473290, + "address": "0x3E6a993EE75C73dA0BAF5a86a9716190d2b0920f" + }, + "MockInputValidator": { + "blockNumber": 9473291, + "address": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F" + }, + "MockE3Program": { + "constructorArgs": { + "mockInputValidator": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F" + }, + "blockNumber": 9473292, + "address": "0xf69076Aa814a6206C3f049Ea8D1217495793AABa" + }, + "MockRISC0Verifier": { + "address": "0xb9384e2b88A69E69149554F31288a8c305859463" + }, + "CRISPInputValidatorFactory": { + "address": "0x20e599457c864241F46A38550ba3dCAAbeC20B48", + "constructorArgs": { + "inputValidator": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F" + } + }, + "HonkVerifier": { + "address": "0xD3c89CD0B492f55F49203A0Da25d7ca744298B8d" + }, + "CRISPProgram": { + "address": "0x26fd7066b28C0e18db3Bbfb7163f16e58597C273", + "constructorArgs": { + "enclave": "0xeF857ba8231E4B8ea4E5DC9CC0891D70BC8E35B8", + "verifierAddress": "0xb9384e2b88A69E69149554F31288a8c305859463", + "inputValidatorAddress": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F", + "honkVerifierAddress": "0xD3c89CD0B492f55F49203A0Da25d7ca744298B8d", + "imageId": "0x23734b77b0f76e85623a88d7a82f24c34c94834f2501964ea123b7a2027013a2" + } } } } \ No newline at end of file diff --git a/examples/CRISP/hardhat.config.ts b/examples/CRISP/hardhat.config.ts index 9ca0501460..25d623394e 100644 --- a/examples/CRISP/hardhat.config.ts +++ b/examples/CRISP/hardhat.config.ts @@ -13,6 +13,7 @@ import hardhatEthersChaiMatchers from "@nomicfoundation/hardhat-ethers-chai-matc import hardhatNetworkHelpers from "@nomicfoundation/hardhat-network-helpers"; import hardhatToolboxMochaEthersPlugin from "@nomicfoundation/hardhat-toolbox-mocha-ethers"; import hardhatTypechainPlugin from "@nomicfoundation/hardhat-typechain"; +import hardhatVerify from "@nomicfoundation/hardhat-verify"; dotenv.config(); @@ -68,6 +69,7 @@ const config: HardhatUserConfig = { hardhatEthersChaiMatchers, hardhatNetworkHelpers, hardhatToolboxMochaEthersPlugin, + hardhatVerify, ], tasks: [ cleanDeploymentsTask, @@ -118,6 +120,14 @@ const config: HardhatUserConfig = { outDir: "./types", tsNocheck: false, }, + verify: { + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY || "", + }, + blockscout: { + enabled: false, + }, + }, solidity: { version: "0.8.28", npmFilesToBuild: [ diff --git a/examples/CRISP/package.json b/examples/CRISP/package.json index d4592d407b..4b1bab9e4c 100644 --- a/examples/CRISP/package.json +++ b/examples/CRISP/package.json @@ -18,7 +18,7 @@ "dev:up": "bash ./scripts/dev.sh", "deploy:contracts": "pnpm hardhat run deploy/deploy.ts", "deploy:contracts:full": "export DEPLOY_ENCLAVE=true && pnpm deploy:contracts", - "deploy:contracts:full:mock": "export DEPLOY_ENCLAVE=true && export USE_MOCK_VERIFIER=true && export USE_MOCK_INPUT_VALIDATOR=true && pnpm deploy:contracts", + "deploy:contracts:full:mock": "export DEPLOY_ENCLAVE=true && export USE_MOCK_VERIFIER=true && export USE_MOCK_INPUT_VALIDATOR=true && pnpm deploy:contracts", "test:e2e": "bash ./scripts/test_e2e.sh", "test": "pnpm test:e2e", "test:contracts": "hardhat test tests/crisp.contracts.test.ts --network localhost", @@ -26,42 +26,43 @@ "test:circuits": "cd circuits && nargo test", "test:sdk": "cd sdk && pnpm test", "release:sdk": "cd sdk && pnpm release", - "report": "playwright show-report" + "report": "playwright show-report", + "verify": "pnpm hardhat run deploy/verify.ts" }, "dependencies": { - "@excubiae/contracts": "^0.4.0", "@enclave-e3/contracts": "workspace:*", + "@excubiae/contracts": "^0.4.0", "@zk-kit/lean-imt.sol": "2.0.0", "poseidon-solidity": "^0.0.5", "solady": "^0.1.13" }, "devDependencies": { "@aztec/bb.js": "^0.82.2", - "@noir-lang/noir_js": "1.0.0-beta.3", "@enclave-e3/config": "^0.1.5", - "@nomicfoundation/hardhat-toolbox": "^5.0.0", + "@noir-lang/noir_js": "1.0.0-beta.3", "@nomicfoundation/hardhat-ethers": "4", "@nomicfoundation/hardhat-ethers-chai-matchers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "3", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-toolbox-mocha-ethers": "3.0.0", "@nomicfoundation/hardhat-typechain": "3", - "@nomicfoundation/hardhat-verify": "3", - "@types/node": "^22.18.0", - "forge-std": "github:foundry-rs/forge-std#v1.9.4", + "@nomicfoundation/hardhat-verify": "^3.0.1", + "@playwright/test": "1.52.0", "@synthetixio/synpress": "^4.1.0", "@synthetixio/synpress-cache": "^0.0.12", "@typechain/ethers-v6": "^0.5.0", "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@playwright/test": "1.52.0", - "playwright": "1.52.0", + "@types/node": "^22.18.0", + "concurrently": "^9.1.2", "dotenv": "^16.4.5", "ethers": "^6.15.0", - "hardhat-deploy": "^0.12.4", - "concurrently": "^9.1.2", + "forge-std": "github:foundry-rs/forge-std#v1.9.4", "hardhat": "^3.0.1", + "hardhat-deploy": "^0.12.4", "hardhat-gas-reporter": "^1.0.8", + "playwright": "1.52.0", "solidity-coverage": "^0.8.1", "ts-node": "^10.9.2", "typechain": "^8.3.0", diff --git a/packages/enclave-contracts/deployed_contracts.json b/packages/enclave-contracts/deployed_contracts.json index 2c041285a0..3a532226f8 100644 --- a/packages/enclave-contracts/deployed_contracts.json +++ b/packages/enclave-contracts/deployed_contracts.json @@ -1,7 +1,7 @@ { "sepolia": { "PoseidonT3": { - "blockNumber": 9461441, + "blockNumber": 9473394, "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" }, "Enclave": { @@ -33,23 +33,23 @@ "address": "0x0DC777566d1255B871dda65dD770cDb0E0280223" }, "MockComputeProvider": { - "blockNumber": 9461446, - "address": "0x15b4159E8Cc37ce91c1C89cAcDCE71592A3D12cf" + "blockNumber": 9473395, + "address": "0x3528F39143034D0c84ebBAEc58407AD3775F26e1" }, "MockDecryptionVerifier": { - "blockNumber": 9461448, - "address": "0x4697A79238A021c17Ffb76cf0995d9ec41383692" + "blockNumber": 9473396, + "address": "0x1F48f9939b9bb53635264c88E3F956Ac4F56bB58" }, "MockInputValidator": { - "blockNumber": 9461452, - "address": "0x826C5Eb0C388fbCe7Ef483b9595749D42ACe14ad" + "blockNumber": 9473397, + "address": "0x645da3bFA7699d2006a34b1B223ecc712FD5d600" }, "MockE3Program": { "constructorArgs": { - "mockInputValidator": "0x826C5Eb0C388fbCe7Ef483b9595749D42ACe14ad" + "mockInputValidator": "0x645da3bFA7699d2006a34b1B223ecc712FD5d600" }, - "blockNumber": 9461453, - "address": "0x1375c3dB8De6F0b77B8AE2789DE2C953E96ca15e" + "blockNumber": 9473398, + "address": "0x40fF23DE7F572524CE9125E8EfDAd2aF1faFd929" } } } diff --git a/packages/enclave-contracts/scripts/index.ts b/packages/enclave-contracts/scripts/index.ts index b080e50ba0..b76aa75654 100644 --- a/packages/enclave-contracts/scripts/index.ts +++ b/packages/enclave-contracts/scripts/index.ts @@ -14,3 +14,4 @@ export * from "./deployAndSave/mockComputeProvider"; export * from "./deployAndSave/mockDecryptionVerifier"; export * from "./deployAndSave/mockInputValidator"; export * from "./deployAndSave/mockProgram"; +export * from "./verify"; diff --git a/packages/enclave-contracts/scripts/verify.ts b/packages/enclave-contracts/scripts/verify.ts index c70a3d7159..19ea7d94ea 100644 --- a/packages/enclave-contracts/scripts/verify.ts +++ b/packages/enclave-contracts/scripts/verify.ts @@ -17,7 +17,7 @@ import { readAllDeployments } from "./utils"; */ const findContractPath = ( contractName: string, - contractsDir: string = "contracts", + artifactsDir: string = "artifacts", ): string | undefined => { const searchDir = (dir: string): string | undefined => { const files = fs.readdirSync(dir); @@ -29,23 +29,42 @@ const findContractPath = ( if (stat.isDirectory()) { const result = searchDir(fullPath); if (result) return result; - } else if (file.endsWith(".sol")) { - const content = fs.readFileSync(fullPath, "utf-8"); - // Look for contract definition - const contractRegex = new RegExp( - `contract\\s+${contractName}\\s+`, - "m", - ); - if (contractRegex.test(content)) { - // Return in Hardhat's format: relative/path/File.sol:ContractName - return `${fullPath}:${contractName}`; + } else if (file === `${contractName}.json`) { + try { + const artifact = JSON.parse(fs.readFileSync(fullPath, "utf-8")); + + if (artifact.sourceName && artifact.contractName === contractName) { + const sourceName = artifact.sourceName; + + // Skip external packages - return undefined so they won't be verified + if ( + sourceName.startsWith("./@") || + sourceName.startsWith("@") || + sourceName.includes("node_modules") + ) { + console.log( + `⏭️ Skipping external contract: ${contractName} (from ${sourceName})`, + ); + return undefined; + } + + // For local contracts, remove leading './' and return the path + let localPath = sourceName; + if (localPath.startsWith("./")) { + localPath = localPath.slice(2); + } + + return `${localPath}:${contractName}`; + } + } catch (error) { + console.warn(`Failed to parse artifact at ${fullPath}:`, error); } } } return undefined; }; - return searchDir(contractsDir); + return searchDir(artifactsDir); }; /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68b6d8ca7e..aeb727d9f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,7 +129,7 @@ importers: specifier: '3' version: 3.0.0(@nomicfoundation/hardhat-ethers@4.0.0(bufferutil@4.0.9)(hardhat@3.0.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@3.0.4(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.8.3) '@nomicfoundation/hardhat-verify': - specifier: '3' + specifier: ^3.0.1 version: 3.0.1(hardhat@3.0.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@playwright/test': specifier: 1.52.0 From 200e78b55b77406698a3f5ad786a788fe9a2d036 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Thu, 23 Oct 2025 15:22:38 +0100 Subject: [PATCH 2/2] chore: update license --- examples/CRISP/deploy/verify.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/CRISP/deploy/verify.ts b/examples/CRISP/deploy/verify.ts index b7d497b9ef..87d09cc9d7 100644 --- a/examples/CRISP/deploy/verify.ts +++ b/examples/CRISP/deploy/verify.ts @@ -1,3 +1,9 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + import hre from "hardhat"; import { verifyContracts } from "@enclave-e3/contracts/scripts";