import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; import { artifacts, ethers } from "hardhat"; import hre from "hardhat"; /** * Creates the interface for the IdentityVerificationHubImplV2 contract * Used to encode the initialize function call data for the proxy deployment * @returns ethers.Interface instance for the hub implementation contract */ function getHubImplV2InitializeData() { const hubArtifact = artifacts.readArtifactSync("IdentityVerificationHubImplV2"); return new ethers.Interface(hubArtifact.abi); } /** * Hardhat Ignition deployment module for Identity Verification Hub V2 * * This module deploys: * 1. All required libraries (7 total): * - CustomVerifier * - OutputFormatterLib * - ProofVerifierLib * - RegisterProofVerifierLib * - DscProofVerifierLib * - RootCheckLib * - OfacCheckLib * 2. IdentityVerificationHubImplV2 - The implementation contract with library linkage * 3. IdentityVerificationHub - The proxy contract pointing to the implementation * * Usage: * - Deploy: `npx hardhat ignition deploy ignition/modules/hub/deployHubV2.ts --network ` * - Deploy and verify: `npx hardhat ignition deploy ignition/modules/hub/deployHubV2.ts --network --verify` * - The proxy will be initialized with the V2 implementation * - Circuit version is automatically set to 2 during initialization * - After deployment, use the update functions to configure: * - Registry addresses via updateRegistry() * - Circuit verifiers via updateVcAndDiscloseCircuit(), updateRegisterCircuitVerifier(), updateDscVerifier() * - Verification configs via setVerificationConfigV2() * * Post-deployment configuration steps: * 1. Set registry addresses for each attestation type (E_PASSPORT, EU_ID_CARD, AADHAAR, KYC) * 2. Configure circuit verifiers for different signature types * 3. Set up verification configurations using setVerificationConfigV2() * 4. Transfer ownership to the appropriate address if needed * * Troubleshooting Verification Issues: * If contracts are not verified during deployment (common with API issues): * * 1. Manual verification for libraries (one command per library): * `npx hardhat verify --network ` * * 2. Manual verification for IdentityVerificationHubImplV2 (requires library linkage): * Create a libraries file (e.g., verify-libs.js): * ``` * module.exports = { * "contracts/libraries/CustomVerifier.sol:CustomVerifier": "", * "contracts/libraries/OutputFormatterLib.sol:OutputFormatterLib": "", * "contracts/libraries/ProofVerifierLib.sol:ProofVerifierLib": "", * "contracts/libraries/RegisterProofVerifierLib.sol:RegisterProofVerifierLib": "", * "contracts/libraries/DscProofVerifierLib.sol:DscProofVerifierLib": "", * "contracts/libraries/RootCheckLib.sol:RootCheckLib": "", * "contracts/libraries/OfacCheckLib.sol:OfacCheckLib": "" * }; * ``` * Then verify: `npx hardhat verify --network --libraries verify-libs.js ` * * 3. Manual verification for proxy contract: * `npx hardhat verify --network ` * * 4. Alternative verification command: * `npx hardhat ignition verify chain- --include-unrelated-contracts` * * Common verification failure reasons: * - API rate limits or temporary service issues * - Library linkage not properly detected * - Etherscan API v1/v2 configuration issues * * Note: Verification failures do NOT affect contract functionality - contracts work normally even if unverified. * Verification only affects source code display on block explorers. */ export default buildModule("DeployHubV2", (m) => { // Deploy all required libraries const customVerifier = m.library("CustomVerifier"); const outputFormatterLib = m.library("OutputFormatterLib"); const proofVerifierLib = m.library("ProofVerifierLib"); const registerProofVerifierLib = m.library("RegisterProofVerifierLib"); const dscProofVerifierLib = m.library("DscProofVerifierLib"); const rootCheckLib = m.library("RootCheckLib"); const ofacCheckLib = m.library("OfacCheckLib"); // Deploy the implementation contract with all library linkages const identityVerificationHubImplV2 = m.contract("IdentityVerificationHubImplV2", [], { libraries: { CustomVerifier: customVerifier, OutputFormatterLib: outputFormatterLib, ProofVerifierLib: proofVerifierLib, RegisterProofVerifierLib: registerProofVerifierLib, DscProofVerifierLib: dscProofVerifierLib, RootCheckLib: rootCheckLib, OfacCheckLib: ofacCheckLib, }, }); // Get the interface to encode the initialize function call const hubInterface = getHubImplV2InitializeData(); // The V2 initialize function takes no parameters (unlike V1) // It automatically sets circuit version to 2 and emits HubInitializedV2 event const initializeData = hubInterface.encodeFunctionData("initialize", []); // Deploy the proxy contract with the implementation address and initialization data const hub = m.contract("IdentityVerificationHub", [identityVerificationHubImplV2, initializeData]); return { // Libraries customVerifier, outputFormatterLib, proofVerifierLib, registerProofVerifierLib, dscProofVerifierLib, rootCheckLib, ofacCheckLib, // Contracts hub, identityVerificationHubImplV2, }; });