From bfbc98caec9d8d5f6c3357209d8f864a95725b24 Mon Sep 17 00:00:00 2001 From: Hamza Khalid Date: Wed, 12 Nov 2025 21:33:19 +0500 Subject: [PATCH 1/5] chore: user owner string instead of signer --- .../scripts/deployAndSave/bondingRegistry.ts | 20 +++++++++---------- .../ciphernodeRegistryOwnable.ts | 8 ++++---- .../scripts/deployAndSave/enclave.ts | 14 ++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts index a60c636013..ed639e21f2 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts @@ -16,15 +16,15 @@ import { readDeploymentArgs, storeDeploymentArgs } from "../utils"; * The arguments for the deployAndSaveBondingRegistry function */ export interface BondingRegistryArgs { - owner?: string; - ticketToken?: string; - licenseToken?: string; - registry?: string; - slashedFundsTreasury?: string; - ticketPrice?: string; - licenseRequiredBond?: string; - minTicketBalance?: number; - exitDelay?: number; + owner: string; + ticketToken: string; + licenseToken: string; + registry: string; + slashedFundsTreasury: string; + ticketPrice: string; + licenseRequiredBond: string; + minTicketBalance: number; + exitDelay: number; hre: HardhatRuntimeEnvironment; } @@ -115,7 +115,7 @@ export const deployAndSaveBondingRegistry = async ({ const ProxyCF = await ethers.getContractFactory( "TransparentUpgradeableProxy", ); - const proxy = await ProxyCF.deploy(bondingRegistryAddress, signer, initData); + const proxy = await ProxyCF.deploy(bondingRegistryAddress, owner, initData); await proxy.waitForDeployment(); const proxyAddress = await proxy.getAddress(); diff --git a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts index 70ac69b03c..b46708ce95 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts @@ -16,9 +16,9 @@ import { readDeploymentArgs, storeDeploymentArgs } from "../utils"; * The arguments for the deployAndSaveCiphernodeRegistryOwnable function */ export interface CiphernodeRegistryOwnableArgs { - enclaveAddress?: string; - owner?: string; - submissionWindow?: number; + enclaveAddress: string; + owner: string; + submissionWindow: number; poseidonT3Address: string; hre: HardhatRuntimeEnvironment; } @@ -91,7 +91,7 @@ export const deployAndSaveCiphernodeRegistryOwnable = async ({ ); const proxy = await ProxyCF.deploy( ciphernodeRegistryAddress, - signer, + owner, initData, ); await proxy.waitForDeployment(); diff --git a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts index ddf22355f7..b161da1131 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts @@ -17,12 +17,12 @@ import { * The arguments for the deployAndSaveEnclave function */ export interface EnclaveArgs { - params?: string[]; - owner?: string; - maxDuration?: string; - registry?: string; - bondingRegistry?: string; - feeToken?: string; + params: string[]; + owner: string; + maxDuration: string; + registry: string; + bondingRegistry: string; + feeToken: string; poseidonT3Address: string; hre: HardhatRuntimeEnvironment; } @@ -102,7 +102,7 @@ export const deployAndSaveEnclave = async ({ const ProxyCF = await ethers.getContractFactory( "TransparentUpgradeableProxy", ); - const proxy = await ProxyCF.deploy(enclaveAddress, signer, initData); + const proxy = await ProxyCF.deploy(enclaveAddress, owner, initData); await proxy.waitForDeployment(); const proxyAddress = await proxy.getAddress(); From c3801894f18e77c9afc927116e2ad86d0eb72af4 Mon Sep 17 00:00:00 2001 From: Hamza Khalid Date: Wed, 12 Nov 2025 22:28:04 +0500 Subject: [PATCH 2/5] chore: verify proxy and implementation --- .../enclave-contracts/deployed_contracts.json | 187 ++++++------------ .../scripts/deployAndSave/bondingRegistry.ts | 15 +- .../ciphernodeRegistryOwnable.ts | 15 +- .../scripts/deployAndSave/enclave.ts | 15 +- packages/enclave-contracts/scripts/utils.ts | 2 +- packages/enclave-contracts/scripts/verify.ts | 48 ++++- 6 files changed, 134 insertions(+), 148 deletions(-) diff --git a/packages/enclave-contracts/deployed_contracts.json b/packages/enclave-contracts/deployed_contracts.json index 3d4079522e..e753ae6695 100644 --- a/packages/enclave-contracts/deployed_contracts.json +++ b/packages/enclave-contracts/deployed_contracts.json @@ -1,49 +1,64 @@ { "sepolia": { "PoseidonT3": { - "blockNumber": 9479393, + "blockNumber": 9615389, "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" }, "Enclave": { "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", - "registry": "0xEC98074C1F64f820f897842d266e1091A0f47Ad8", - "bondingRegistry": "0xD461aeA2c84D3fD7D4B0E83E0035446f5A741d61", + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", + "registry": "0x11F647479bEd47cd0dd10276DDc04F2d4B20b1C7", + "bondingRegistry": "0x56368bB545Ab2D6811b4dffa8Ad4B8AF560406E3", "feeToken": "0xB58B762748c64f1a36B34012d1C52503617f4De0", "maxDuration": "2592000", "params": [ "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001" ] }, - "blockNumber": 9479401, - "address": "0x787e6e63EF62ad4a40ea19D117bD7343ee8F1eC0" + "proxyRecords": { + "initData": "0xefe0308b0000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b00000000000000000000000011f647479bed47cd0dd10276ddc04f2d4b20b1c700000000000000000000000056368bb545ab2d6811b4dffa8ad4b8af560406e3000000000000000000000000b58b762748c64f1a36b34012d1c52503617f4de00000000000000000000000000000000000000000000000000000000000278d0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001", + "initialOwner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", + "proxyAddress": "0x1E8BD97F15Cd94f250a4dd567d2fd2114303FAa6", + "proxyAdminAddress": "0x600262557f3E2bf718e33fc0936c2b2a72D95C45", + "implementationAddress": "0xEF832640696d7Df21C5c42B09FCbc8111BF0c6b8" + }, + "blockNumber": 9615399, + "address": "0x1E8BD97F15Cd94f250a4dd567d2fd2114303FAa6" }, "CiphernodeRegistryOwnable": { "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", - "enclaveAddress": "0x0000000000000000000000000000000000000001" + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", + "enclaveAddress": "0x0000000000000000000000000000000000000001", + "submissionWindow": "10" + }, + "proxyRecords": { + "initData": "0x1794bb3c0000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a", + "initialOwner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", + "proxyAddress": "0x11F647479bEd47cd0dd10276DDc04F2d4B20b1C7", + "proxyAdminAddress": "0xd7712F6E5e0dA1777b56A579392E7709be3Ec34E", + "implementationAddress": "0x197a86F8A64AB1a67ae07Fe034BCeC09B9Aa41cf" }, - "blockNumber": 9479399, - "address": "0xEC98074C1F64f820f897842d266e1091A0f47Ad8" + "blockNumber": 9615397, + "address": "0x11F647479bEd47cd0dd10276DDc04F2d4B20b1C7" }, "MockComputeProvider": { - "blockNumber": 9479402, - "address": "0xf428dc63Ef8df4AdB3C202983Ea3b00B6985a03b" + "blockNumber": 9615408, + "address": "0x40874299E9031Fe42cf756A6066Cc2654B79fa1c" }, "MockDecryptionVerifier": { - "blockNumber": 9479403, - "address": "0x09E79Fbcc3A5d9dc9f45920F7A8D15c7208Dd568" + "blockNumber": 9615410, + "address": "0x37007c28bCc6522Baf079B2D97F9f22ffe4b13b7" }, "MockInputValidator": { - "blockNumber": 9479404, - "address": "0x885F5D69D2aA3ec34bb2e2598529213D308B12CF" + "blockNumber": 9615411, + "address": "0x3d7C302270a85F6e8798b607275B1fF265514b38" }, "MockE3Program": { "constructorArgs": { - "mockInputValidator": "0x885F5D69D2aA3ec34bb2e2598529213D308B12CF" + "mockInputValidator": "0x3d7C302270a85F6e8798b607275B1fF265514b38" }, - "blockNumber": 9479405, - "address": "0x5a196784e60A6A18b86Af7a9e564A969F6d2bC76" + "blockNumber": 9615412, + "address": "0xeb3B7C06e7D327f377901356860D88AA50822a6b" }, "MockUSDC": { "constructorArgs": { @@ -54,42 +69,49 @@ }, "EnclaveToken": { "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676" + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B" }, - "blockNumber": 9479395, - "address": "0x9B3D470a2937c500632d382574EbD1D8FfCE3D63" + "blockNumber": 9615390, + "address": "0xc93f71D10874F09F7F514a3d160E5be21fD624ab" }, "EnclaveTicketToken": { "constructorArgs": { "baseToken": "0xB58B762748c64f1a36B34012d1C52503617f4De0", "registry": "0x0000000000000000000000000000000000000001", - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676" + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B" }, - "blockNumber": 9479396, - "address": "0xceb48a1bc9a3F160Ca687Da0a2A624F7a09a6158" + "blockNumber": 9615391, + "address": "0x72691272E10a8CA6499c3aa0d59c76E4C090c9E2" }, "SlashingManager": { "constructorArgs": { - "admin": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "admin": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", "bondingRegistry": "0x0000000000000000000000000000000000000001" }, - "blockNumber": 9479397, - "address": "0x4752200Fc26747672d6CD3abe2e9072152D46f04" + "blockNumber": 9615392, + "address": "0x50dfC643226f09423d51F81c7f37F7a5F1e8f359" }, "BondingRegistry": { "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", - "ticketToken": "0xceb48a1bc9a3F160Ca687Da0a2A624F7a09a6158", - "licenseToken": "0x9B3D470a2937c500632d382574EbD1D8FfCE3D63", + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", + "ticketToken": "0x72691272E10a8CA6499c3aa0d59c76E4C090c9E2", + "licenseToken": "0xc93f71D10874F09F7F514a3d160E5be21fD624ab", "registry": "0x0000000000000000000000000000000000000001", - "slashedFundsTreasury": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "slashedFundsTreasury": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", "ticketPrice": "10000000", "licenseRequiredBond": "100000000000000000000", "minTicketBalance": "1", "exitDelay": "604800" }, - "blockNumber": 9479398, - "address": "0xD461aeA2c84D3fD7D4B0E83E0035446f5A741d61" + "proxyRecords": { + "initData": "0x7333fa820000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b00000000000000000000000072691272e10a8ca6499c3aa0d59c76e4c090c9e2000000000000000000000000c93f71d10874f09f7f514a3d160e5be21fd624ab00000000000000000000000000000000000000000000000000000000000000010000000000000000000000008837e47c4bb520ade83aab761c3b60679443af1b00000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000056bc75e2d6310000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000093a80", + "initialOwner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", + "proxyAddress": "0x56368bB545Ab2D6811b4dffa8Ad4B8AF560406E3", + "proxyAdminAddress": "0x9d2B09AB8d5D2035CcF149231F8e32A631a51F58", + "implementationAddress": "0x8476eBFCea96b6Fda928255ceA636b09eBDa8B70" + }, + "blockNumber": 9615392, + "address": "0x56368bB545Ab2D6811b4dffa8Ad4B8AF560406E3" } }, "undefined": { @@ -113,102 +135,5 @@ "blockNumber": 1, "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3" } - }, - "localhost": { - "PoseidonT3": { - "blockNumber": 28, - "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" - }, - "MockUSDC": { - "constructorArgs": { - "initialSupply": "1000000" - }, - "blockNumber": 4, - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" - }, - "EnclaveToken": { - "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - }, - "blockNumber": 5, - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" - }, - "EnclaveTicketToken": { - "constructorArgs": { - "baseToken": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "registry": "0x0000000000000000000000000000000000000001", - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - }, - "blockNumber": 7, - "address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707" - }, - "SlashingManager": { - "constructorArgs": { - "admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "bondingRegistry": "0x0000000000000000000000000000000000000001" - }, - "blockNumber": 8, - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F" - }, - "BondingRegistry": { - "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "ticketToken": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", - "licenseToken": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "registry": "0x0000000000000000000000000000000000000001", - "slashedFundsTreasury": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "ticketPrice": "10000000", - "licenseRequiredBond": "100000000000000000000", - "minTicketBalance": "1", - "exitDelay": "604800" - }, - "blockNumber": 8, - "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "implementationAddress": "0x67d269191c92Caf3cD7723F116c85e6E9bf55933" - }, - "CiphernodeRegistryOwnable": { - "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "enclaveAddress": "0x0000000000000000000000000000000000000001", - "submissionWindow": "10" - }, - "blockNumber": 11, - "address": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "implementationAddress": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" - }, - "Enclave": { - "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "registry": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "bondingRegistry": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "feeToken": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "maxDuration": "2592000", - "params": [ - "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001" - ] - }, - "blockNumber": 13, - "address": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", - "implementationAddress": "0x09635F643e140090A9A8Dcd712eD6285858ceBef" - }, - "MockComputeProvider": { - "blockNumber": 23, - "address": "0x59b670e9fA9D0A427751Af201D676719a970857b" - }, - "MockDecryptionVerifier": { - "blockNumber": 24, - "address": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1" - }, - "MockInputValidator": { - "blockNumber": 25, - "address": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44" - }, - "MockE3Program": { - "constructorArgs": { - "mockInputValidator": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44" - }, - "blockNumber": 26, - "address": "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f" - } } } \ No newline at end of file diff --git a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts index ed639e21f2..d733706107 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts @@ -119,6 +119,8 @@ export const deployAndSaveBondingRegistry = async ({ await proxy.waitForDeployment(); const proxyAddress = await proxy.getAddress(); + const proxyAdminAddress = await getProxyAdmin(ethers.provider, proxyAddress); + storeDeploymentArgs( { constructorArgs: { @@ -132,9 +134,15 @@ export const deployAndSaveBondingRegistry = async ({ minTicketBalance: minTicketBalance.toString(), exitDelay: exitDelay.toString(), }, + proxyRecords: { + initData, + initialOwner: owner, + proxyAddress, + proxyAdminAddress, + implementationAddress: bondingRegistryAddress, + }, blockNumber, address: proxyAddress, - implementationAddress: bondingRegistryAddress, }, "BondingRegistry", chain, @@ -211,7 +219,10 @@ export const upgradeAndSaveBondingRegistry = async ({ storeDeploymentArgs( { ...preDeployedArgs, - implementationAddress: newImplementationAddress, + proxyRecords: { + // initData, //TODO: Add init data if needed + implementationAddress: newImplementationAddress, + }, }, "BondingRegistry", chain, diff --git a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts index b46708ce95..e8fa520daa 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts @@ -97,6 +97,8 @@ export const deployAndSaveCiphernodeRegistryOwnable = async ({ await proxy.waitForDeployment(); const proxyAddress = await proxy.getAddress(); + const proxyAdminAddress = await getProxyAdmin(ethers.provider, proxyAddress); + storeDeploymentArgs( { constructorArgs: { @@ -104,9 +106,15 @@ export const deployAndSaveCiphernodeRegistryOwnable = async ({ enclaveAddress: enclaveAddress, submissionWindow: submissionWindow.toString(), }, + proxyRecords: { + initData, + initialOwner: owner, + proxyAddress, + proxyAdminAddress, + implementationAddress: ciphernodeRegistryAddress, + }, blockNumber, address: proxyAddress, - implementationAddress: ciphernodeRegistryAddress, }, "CiphernodeRegistryOwnable", chain, @@ -188,7 +196,10 @@ export const upgradeAndSaveCiphernodeRegistryOwnable = async ({ storeDeploymentArgs( { ...preDeployedArgs, - implementationAddress: newImplementationAddress, + proxyRecords: { + // initData, //TODO: Add init data if needed + implementationAddress: newImplementationAddress, + }, }, "CiphernodeRegistryOwnable", chain, diff --git a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts index b161da1131..84fb50b119 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts @@ -106,6 +106,8 @@ export const deployAndSaveEnclave = async ({ await proxy.waitForDeployment(); const proxyAddress = await proxy.getAddress(); + const proxyAdminAddress = await getProxyAdmin(ethers.provider, proxyAddress); + storeDeploymentArgs( { constructorArgs: { @@ -116,9 +118,15 @@ export const deployAndSaveEnclave = async ({ maxDuration, params, }, + proxyRecords: { + initData, + initialOwner: owner, + proxyAddress, + proxyAdminAddress, + implementationAddress: enclaveAddress, + }, blockNumber, address: proxyAddress, - implementationAddress: enclaveAddress, }, "Enclave", chain, @@ -193,7 +201,10 @@ export const upgradeAndSaveEnclave = async ({ storeDeploymentArgs( { ...preDeployedArgs, - implementationAddress: newImplementationAddress, + proxyRecords: { + // initData, //TODO: Add init data if needed + implementationAddress: newImplementationAddress, + }, }, "Enclave", chain, diff --git a/packages/enclave-contracts/scripts/utils.ts b/packages/enclave-contracts/scripts/utils.ts index 206dfec664..857dfd79ae 100644 --- a/packages/enclave-contracts/scripts/utils.ts +++ b/packages/enclave-contracts/scripts/utils.ts @@ -12,8 +12,8 @@ export const deploymentsFile = path.join("deployed_contracts.json"); export interface DeploymentArgs { address: string; constructorArgs?: Record; + proxyRecords?: Record; blockNumber?: number | null; - implementationAddress?: string | null; } // Type for chain-specific deployments diff --git a/packages/enclave-contracts/scripts/verify.ts b/packages/enclave-contracts/scripts/verify.ts index 19ea7d94ea..61e92bfb95 100644 --- a/packages/enclave-contracts/scripts/verify.ts +++ b/packages/enclave-contracts/scripts/verify.ts @@ -145,28 +145,56 @@ export const verifyContracts = (chain: string): void => { } const deployment = chainDeployments[contractName]; + const isProxy = Boolean(deployment.proxyRecords?.implementationAddress); + + if (isProxy && deployment.proxyRecords) { + console.log(` šŸ“¦ Proxy deployment detected`); + + console.log(` ā”œā”€ Verifying TransparentUpgradeableProxy...`); + verifyContract( + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + deployment.address, + { + _logic: deployment.proxyRecords.implementationAddress, + _owner: deployment.proxyRecords.initialOwner, + _data: deployment.proxyRecords.initData, + }, + chain, + ); + + console.log(` ā”œā”€ Verifying ProxyAdmin...`); + verifyContract( + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + deployment.proxyRecords.proxyAdminAddress as string, + { owner: deployment.proxyRecords.initialOwner }, + chain, + ); + } - // Auto-discover the fully qualified contract name + // Verify the main contract (or implementation if proxy) const fullyQualifiedName = findContractPath(contractName); if (!fullyQualifiedName) { console.log( - `āŒ Could not find contract source for ${contractName}. Skipping verification.`, + ` āŒ Could not find contract source for ${contractName}. Skipping.\n`, ); return; } - verifyContract( - fullyQualifiedName, - deployment.address, - deployment.constructorArgs, - chain, - ); + const targetAddress = isProxy + ? (deployment.proxyRecords?.implementationAddress as string) + : deployment.address; + + const constructorArgs = isProxy ? undefined : deployment.constructorArgs; console.log( - `[${index + 1}/${contractNames.length}] Verifying ${contractName}...`, + ` ${isProxy ? "└─" : " "} Verifying ${isProxy ? "implementation" : "contract"} at ${targetAddress.slice(0, 10)}...`, ); + + verifyContract(fullyQualifiedName, targetAddress, constructorArgs, chain); + + console.log(` āœ… ${contractName} verification complete\n`); }); - console.log(`\nāœ… Verification process completed for ${chain}.\n`); + console.log(`\nšŸŽ‰ Verification process completed for ${chain}!\n`); }; From 40847f4e80f45ac02e1fa6e4c973cf0c35a0a0c9 Mon Sep 17 00:00:00 2001 From: Hamza Khalid Date: Wed, 12 Nov 2025 22:29:14 +0500 Subject: [PATCH 3/5] chore: lint --- packages/enclave-contracts/scripts/verify.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/enclave-contracts/scripts/verify.ts b/packages/enclave-contracts/scripts/verify.ts index 61e92bfb95..9b6c9bf0c1 100644 --- a/packages/enclave-contracts/scripts/verify.ts +++ b/packages/enclave-contracts/scripts/verify.ts @@ -135,7 +135,7 @@ export const verifyContracts = (chain: string): void => { `\nšŸ” Verifying ${contractNames.length} contracts on ${chain}...\n`, ); - contractNames.forEach((contractName, index) => { + contractNames.forEach((contractName, _) => { // we skip PoseidonT3 as it's a library if (contractName === "PoseidonT3") { console.log( From 8ecd1469529d9b40f2cd5c2ed79f93e7b7d78dbd Mon Sep 17 00:00:00 2001 From: Hamza Khalid Date: Wed, 12 Nov 2025 23:29:24 +0500 Subject: [PATCH 4/5] chore: lint --- .../scripts/deployAndSave/bondingRegistry.ts | 18 +++++++++--------- .../deployAndSave/ciphernodeRegistryOwnable.ts | 6 +++--- .../scripts/deployAndSave/enclave.ts | 12 ++++++------ .../scripts/upgrade/bondingRegistry.ts | 2 +- .../upgrade/ciphernodeRegistryOwnable.ts | 2 +- .../scripts/upgrade/enclave.ts | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts index d733706107..274f1a0179 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts @@ -16,15 +16,15 @@ import { readDeploymentArgs, storeDeploymentArgs } from "../utils"; * The arguments for the deployAndSaveBondingRegistry function */ export interface BondingRegistryArgs { - owner: string; - ticketToken: string; - licenseToken: string; - registry: string; - slashedFundsTreasury: string; - ticketPrice: string; - licenseRequiredBond: string; - minTicketBalance: number; - exitDelay: number; + owner?: string; + ticketToken?: string; + licenseToken?: string; + registry?: string; + slashedFundsTreasury?: string; + ticketPrice?: string; + licenseRequiredBond?: string; + minTicketBalance?: number; + exitDelay?: number; hre: HardhatRuntimeEnvironment; } diff --git a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts index e8fa520daa..87f60daa63 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts @@ -16,9 +16,9 @@ import { readDeploymentArgs, storeDeploymentArgs } from "../utils"; * The arguments for the deployAndSaveCiphernodeRegistryOwnable function */ export interface CiphernodeRegistryOwnableArgs { - enclaveAddress: string; - owner: string; - submissionWindow: number; + enclaveAddress?: string; + owner?: string; + submissionWindow?: number; poseidonT3Address: string; hre: HardhatRuntimeEnvironment; } diff --git a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts index 84fb50b119..550709a69c 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts @@ -17,12 +17,12 @@ import { * The arguments for the deployAndSaveEnclave function */ export interface EnclaveArgs { - params: string[]; - owner: string; - maxDuration: string; - registry: string; - bondingRegistry: string; - feeToken: string; + params?: string[]; + owner?: string; + maxDuration?: string; + registry?: string; + bondingRegistry?: string; + feeToken?: string; poseidonT3Address: string; hre: HardhatRuntimeEnvironment; } diff --git a/packages/enclave-contracts/scripts/upgrade/bondingRegistry.ts b/packages/enclave-contracts/scripts/upgrade/bondingRegistry.ts index 41d5e54cae..de36fc2ff7 100644 --- a/packages/enclave-contracts/scripts/upgrade/bondingRegistry.ts +++ b/packages/enclave-contracts/scripts/upgrade/bondingRegistry.ts @@ -26,7 +26,7 @@ export const upgradeBondingRegistry = async () => { ); } - if (!preDeployedArgs?.implementationAddress) { + if (!preDeployedArgs?.proxyRecords?.implementationAddress) { throw new Error( "Existing deployment is not proxy-based. Cannot upgrade non-proxy deployments.", ); diff --git a/packages/enclave-contracts/scripts/upgrade/ciphernodeRegistryOwnable.ts b/packages/enclave-contracts/scripts/upgrade/ciphernodeRegistryOwnable.ts index 9c21d726c3..32e095bb41 100644 --- a/packages/enclave-contracts/scripts/upgrade/ciphernodeRegistryOwnable.ts +++ b/packages/enclave-contracts/scripts/upgrade/ciphernodeRegistryOwnable.ts @@ -31,7 +31,7 @@ export const upgradeCiphernodeRegistryOwnable = async () => { ); } - if (!preDeployedArgs?.implementationAddress) { + if (!preDeployedArgs?.proxyRecords?.implementationAddress) { throw new Error( "Existing deployment is not proxy-based. Cannot upgrade non-proxy deployments.", ); diff --git a/packages/enclave-contracts/scripts/upgrade/enclave.ts b/packages/enclave-contracts/scripts/upgrade/enclave.ts index 24bb832e0b..fd291c598c 100644 --- a/packages/enclave-contracts/scripts/upgrade/enclave.ts +++ b/packages/enclave-contracts/scripts/upgrade/enclave.ts @@ -26,7 +26,7 @@ export const upgradeEnclave = async () => { throw new Error("Enclave proxy not found. Deploy first before upgrading."); } - if (!preDeployedArgs?.implementationAddress) { + if (!preDeployedArgs?.proxyRecords?.implementationAddress) { throw new Error( "Existing deployment is not proxy-based. Cannot upgrade non-proxy deployments.", ); From 48131272c0f027e7a875d607950cc29b73c17c4d Mon Sep 17 00:00:00 2001 From: Hamza Khalid Date: Thu, 13 Nov 2025 00:58:28 +0500 Subject: [PATCH 5/5] chore: fix existing record storage --- .../scripts/deployAndSave/bondingRegistry.ts | 22 +++++++++++--- .../ciphernodeRegistryOwnable.ts | 25 +++++++++++----- .../scripts/deployAndSave/enclave.ts | 29 ++++++++++++------- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts index 274f1a0179..771cb46987 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/bondingRegistry.ts @@ -216,13 +216,27 @@ export const upgradeAndSaveBondingRegistry = async ({ ); await upgradeTx.wait(); + const existingProxyRecords = preDeployedArgs.proxyRecords + ? Object.fromEntries( + Object.entries(preDeployedArgs.proxyRecords).filter( + ([, value]) => value !== undefined, + ), + ) + : {}; + + const proxyRecords: Record = { + ...existingProxyRecords, + implementationAddress: newImplementationAddress, + }; + + if (initData !== "0x") { + proxyRecords.initData = initData; + } + storeDeploymentArgs( { ...preDeployedArgs, - proxyRecords: { - // initData, //TODO: Add init data if needed - implementationAddress: newImplementationAddress, - }, + proxyRecords, }, "BondingRegistry", chain, diff --git a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts index 87f60daa63..dcdce4c5d8 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/ciphernodeRegistryOwnable.ts @@ -193,14 +193,25 @@ export const upgradeAndSaveCiphernodeRegistryOwnable = async ({ ); await upgradeTx.wait(); + const existingProxyRecords = preDeployedArgs.proxyRecords + ? Object.fromEntries( + Object.entries(preDeployedArgs.proxyRecords).filter( + ([, value]) => value !== undefined, + ), + ) + : {}; + + const proxyRecords: Record = { + ...existingProxyRecords, + implementationAddress: newImplementationAddress, + }; + + if (initData !== "0x") { + proxyRecords.initData = initData; + } + storeDeploymentArgs( - { - ...preDeployedArgs, - proxyRecords: { - // initData, //TODO: Add init data if needed - implementationAddress: newImplementationAddress, - }, - }, + { ...preDeployedArgs, proxyRecords }, "CiphernodeRegistryOwnable", chain, ); diff --git a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts index 550709a69c..4b7826665a 100644 --- a/packages/enclave-contracts/scripts/deployAndSave/enclave.ts +++ b/packages/enclave-contracts/scripts/deployAndSave/enclave.ts @@ -198,17 +198,24 @@ export const upgradeAndSaveEnclave = async ({ ); await upgradeTx.wait(); - storeDeploymentArgs( - { - ...preDeployedArgs, - proxyRecords: { - // initData, //TODO: Add init data if needed - implementationAddress: newImplementationAddress, - }, - }, - "Enclave", - chain, - ); + const existingProxyRecords = preDeployedArgs.proxyRecords + ? Object.fromEntries( + Object.entries(preDeployedArgs.proxyRecords).filter( + ([, value]) => value !== undefined, + ), + ) + : {}; + + const proxyRecords: Record = { + ...existingProxyRecords, + implementationAddress: newImplementationAddress, + }; + + if (initData !== "0x") { + proxyRecords.initData = initData; + } + + storeDeploymentArgs({ ...preDeployedArgs, proxyRecords }, "Enclave", chain); const enclaveContract = EnclaveFactory.connect(proxyAddress, signer); return {