diff --git a/docs/package.json b/docs/package.json index c41021f909..fe7f08adb4 100644 --- a/docs/package.json +++ b/docs/package.json @@ -27,5 +27,6 @@ "name": "gnosisguild", "url": "https://github.com/gnosisguild" }, - "license": "LGPL-3.0-only" + "license": "LGPL-3.0-only", + "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" } diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol index d7857a0686..04a372f081 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPVerifier.sol @@ -1,5 +1,8 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2022 Aztec +// 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. pragma solidity >=0.8.21; uint256 constant N = 524288; diff --git a/examples/CRISP/patches/@aztec__bb.js@3.0.0-nightly.20251104.patch b/examples/CRISP/patches/@aztec__bb.js@3.0.0-nightly.20251104.patch new file mode 100644 index 0000000000..e1dc08c0a4 --- /dev/null +++ b/examples/CRISP/patches/@aztec__bb.js@3.0.0-nightly.20251104.patch @@ -0,0 +1,63 @@ +diff --git a/dest/browser/crs/net_crs.js b/dest/browser/crs/net_crs.js +index 752d48255a066027de44bcc5867647a717711ece..f9395f00ddb82cdb3559ed153342f5cf51bdee21 100644 +--- a/dest/browser/crs/net_crs.js ++++ b/dest/browser/crs/net_crs.js +@@ -65,7 +65,7 @@ export class NetCrs { + return new Response(new Uint8Array([])); + } + const g1End = this.numPoints * 64 - 1; +- return await retry(() => fetch('https://crs.aztec.network/g1.dat', { ++ return await retry(() => fetch('https://crs.aztec-cdn.foundation/g1.dat', { + headers: { + Range: `bytes=0-${g1End}`, + }, +@@ -76,7 +76,7 @@ export class NetCrs { + * Fetches the appropriate range of points from a remote source + */ + async fetchG2Data() { +- return await retry(() => fetch('https://crs.aztec.network/g2.dat', { ++ return await retry(() => fetch('https://crs.aztec-cdn.foundation/g2.dat', { + cache: 'force-cache', + }), makeBackoff([5, 5, 5])); + } +@@ -125,7 +125,7 @@ export class NetGrumpkinCrs { + return new Response(new Uint8Array([])); + } + const g1End = this.numPoints * 64 - 1; +- return await fetch('https://crs.aztec.network/grumpkin_g1.dat', { ++ return await fetch('https://crs.aztec-cdn.foundation/grumpkin_g1.dat', { + headers: { + Range: `bytes=0-${g1End}`, + }, +diff --git a/src/crs/net_crs.ts b/src/crs/net_crs.ts +index 51ce21ad57d8363323e6a14144bf3888e2937f45..4519a02eb205d6a14680552c9a26352e50293c3d 100644 +--- a/src/crs/net_crs.ts ++++ b/src/crs/net_crs.ts +@@ -78,7 +78,7 @@ export class NetCrs { + const g1End = this.numPoints * 64 - 1; + return await retry( + () => +- fetch('https://crs.aztec.network/g1.dat', { ++ fetch('https://crs.aztec-cdn.foundation/g1.dat', { + headers: { + Range: `bytes=0-${g1End}`, + }, +@@ -94,7 +94,7 @@ export class NetCrs { + private async fetchG2Data(): Promise { + return await retry( + () => +- fetch('https://crs.aztec.network/g2.dat', { ++ fetch('https://crs.aztec-cdn.foundation/g2.dat', { + cache: 'force-cache', + }), + makeBackoff([5, 5, 5]), +@@ -153,8 +153,7 @@ export class NetGrumpkinCrs { + } + + const g1End = this.numPoints * 64 - 1; +- +- return await fetch('https://crs.aztec.network/grumpkin_g1.dat', { ++ return await fetch('https://crs.aztec-cdn.foundation/grumpkin_g1.dat', { + headers: { + Range: `bytes=0-${g1End}`, + }, diff --git a/examples/CRISP/server/.env.example b/examples/CRISP/server/.env.example index 572f71fa70..934e446b43 100644 --- a/examples/CRISP/server/.env.example +++ b/examples/CRISP/server/.env.example @@ -23,7 +23,7 @@ FEE_TOKEN_ADDRESS="0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" # After this interval, the computation phase starts automatically # After activation + this interval, ciphernodes are then not responsing to # any more decryption requests -E3_DURATION=70 +E3_DURATION=100 E3_THRESHOLD_MIN=2 E3_THRESHOLD_MAX=5 diff --git a/package.json b/package.json index 0fbb7404a6..24111e3fcd 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,9 @@ "typescript": "5.8.3", "undici-types": "6.19.8", "viem": "2.38.6" + }, + "patchedDependencies": { + "@aztec/bb.js@3.0.0-nightly.20251104": "examples/CRISP/patches/@aztec__bb.js@3.0.0-nightly.20251104.patch" } }, "lint-staged": { diff --git a/packages/enclave-contracts/.solhint.json b/packages/enclave-contracts/.solhint.json index 876663a794..2a4cb232b2 100644 --- a/packages/enclave-contracts/.solhint.json +++ b/packages/enclave-contracts/.solhint.json @@ -1,6 +1,5 @@ { "extends": "solhint:recommended", - "plugins": ["prettier"], "rules": { "code-complexity": ["error", 8], "compiler-version": ["error", ">=0.8.27"], @@ -10,12 +9,6 @@ "no-console": "off", "not-rely-on-time": "off", "gas-custom-errors": "off", - "one-contract-per-file": "off", - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ] + "one-contract-per-file": "off" } } diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json index d2234a92a8..bfcb8a4f4c 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json @@ -890,5 +890,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IBondingRegistry.sol", - "buildInfoId": "solc-0_8_28-1274269bf8b5435b6fb6eba99e4eb3854e5d9864" + "buildInfoId": "solc-0_8_28-d7b7e823e5eb177cd42a96206dc5c5f8387609a9" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json index 08a2088fe2..a953710b9f 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json @@ -590,5 +590,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ICiphernodeRegistry.sol", - "buildInfoId": "solc-0_8_28-1274269bf8b5435b6fb6eba99e4eb3854e5d9864" + "buildInfoId": "solc-0_8_28-d7b7e823e5eb177cd42a96206dc5c5f8387609a9" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json index a9876f1f92..4578c7e43d 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json @@ -866,6 +866,11 @@ "internalType": "uint256", "name": "e3Id", "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "committeePublicKeyHash", + "type": "bytes32" } ], "name": "onCommitteePublished", @@ -1197,5 +1202,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IEnclave.sol", - "buildInfoId": "solc-0_8_28-1274269bf8b5435b6fb6eba99e4eb3854e5d9864" + "buildInfoId": "solc-0_8_28-d7b7e823e5eb177cd42a96206dc5c5f8387609a9" } \ No newline at end of file diff --git a/packages/enclave-contracts/contracts/Enclave.sol b/packages/enclave-contracts/contracts/Enclave.sol index afe1493979..16206aaf22 100644 --- a/packages/enclave-contracts/contracts/Enclave.sol +++ b/packages/enclave-contracts/contracts/Enclave.sol @@ -677,7 +677,8 @@ contract Enclave is IEnclave, OwnableUpgradeable { /// @inheritdoc IEnclave function onCommitteePublished( - uint256 e3Id + uint256 e3Id, + bytes32 committeePublicKeyHash ) external onlyCiphernodeRegistry { // DKG complete, key published E3Stage current = _e3Stages[e3Id]; @@ -686,6 +687,8 @@ contract Enclave is IEnclave, OwnableUpgradeable { } _e3Stages[e3Id] = E3Stage.KeyPublished; + e3s[e3Id].committeePublicKey = committeePublicKeyHash; + emit CommitteeFormed(e3Id); emit E3StageChanged( e3Id, diff --git a/packages/enclave-contracts/contracts/interfaces/IEnclave.sol b/packages/enclave-contracts/contracts/interfaces/IEnclave.sol index af45f5dfb9..8a7ead42f9 100644 --- a/packages/enclave-contracts/contracts/interfaces/IEnclave.sol +++ b/packages/enclave-contracts/contracts/interfaces/IEnclave.sol @@ -348,7 +348,8 @@ interface IEnclave { /// @notice Called by CiphernodeRegistry when committee public key is published (DKG complete). /// @dev Updates E3 lifecycle to KeyPublished stage. /// @param e3Id ID of the E3. - function onCommitteePublished(uint256 e3Id) external; + /// @param committeePublicKeyHash Hash of the committee public key. + function onCommitteePublished(uint256 e3Id, bytes32 committeePublicKeyHash) external; /// @notice Called by authorized contracts to mark an E3 as failed with a specific reason. /// @dev Updates E3 lifecycle to Failed stage with the given reason. diff --git a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol index 3d37836ab3..298ab77f9e 100644 --- a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol +++ b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol @@ -269,7 +269,7 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { c.publicKey = publicKeyHash; publicKeyHashes[e3Id] = publicKeyHash; // Progress E3 to KeyPublished stage - enclave.onCommitteePublished(e3Id); + enclave.onCommitteePublished(e3Id, publicKeyHash); emit CommitteePublished(e3Id, nodes, publicKey); } diff --git a/packages/enclave-contracts/tasks/ciphernode.ts b/packages/enclave-contracts/tasks/ciphernode.ts index 8007725b2c..f09a5a1bad 100644 --- a/packages/enclave-contracts/tasks/ciphernode.ts +++ b/packages/enclave-contracts/tasks/ciphernode.ts @@ -33,18 +33,14 @@ export const ciphernodeAdd = task( const [signer] = await ethers.getSigners(); console.log(`Registering ciphernode: ${signer.address}`); - const { deployAndSaveBondingRegistry } = await import( - "../scripts/deployAndSave/bondingRegistry" - ); - const { deployAndSaveEnclaveTicketToken } = await import( - "../scripts/deployAndSave/enclaveTicketToken" - ); - const { deployAndSaveEnclaveToken } = await import( - "../scripts/deployAndSave/enclaveToken" - ); - const { deployAndSaveMockStableToken } = await import( - "../scripts/deployAndSave/mockStableToken" - ); + const { deployAndSaveBondingRegistry } = + await import("../scripts/deployAndSave/bondingRegistry"); + const { deployAndSaveEnclaveTicketToken } = + await import("../scripts/deployAndSave/enclaveTicketToken"); + const { deployAndSaveEnclaveToken } = + await import("../scripts/deployAndSave/enclaveToken"); + const { deployAndSaveMockStableToken } = + await import("../scripts/deployAndSave/mockStableToken"); const { bondingRegistry } = await deployAndSaveBondingRegistry({ hre }); const { enclaveToken } = await deployAndSaveEnclaveToken({ hre }); const { enclaveTicketToken } = await deployAndSaveEnclaveTicketToken({ @@ -166,9 +162,8 @@ export const ciphernodeRemove = task( const [signer] = await ethers.getSigners(); console.log(`Deregistering ciphernode: ${signer.address}`); - const { deployAndSaveBondingRegistry } = await import( - "../scripts/deployAndSave/bondingRegistry" - ); + const { deployAndSaveBondingRegistry } = + await import("../scripts/deployAndSave/bondingRegistry"); const { bondingRegistry } = await deployAndSaveBondingRegistry({ hre }); const bondingRegistryConnected = bondingRegistry.connect(signer); @@ -227,14 +222,12 @@ export const ciphernodeMintTokens = task( ); } - const { deployAndSaveEnclaveToken } = await import( - "../scripts/deployAndSave/enclaveToken" - ); + const { deployAndSaveEnclaveToken } = + await import("../scripts/deployAndSave/enclaveToken"); const { enclaveToken } = await deployAndSaveEnclaveToken({ hre }); - const { deployAndSaveMockStableToken } = await import( - "../scripts/deployAndSave/mockStableToken" - ); + const { deployAndSaveMockStableToken } = + await import("../scripts/deployAndSave/mockStableToken"); const { mockStableToken } = await deployAndSaveMockStableToken({ hre, }); @@ -341,19 +334,16 @@ export const ciphernodeAdminAdd = task( console.log(`Admin wallet: ${adminWallet.address}`); console.log(`Registering ciphernode: ${ciphernodeAddress}`); - const { deployAndSaveBondingRegistry } = await import( - "../scripts/deployAndSave/bondingRegistry" - ); + const { deployAndSaveBondingRegistry } = + await import("../scripts/deployAndSave/bondingRegistry"); const { bondingRegistry } = await deployAndSaveBondingRegistry({ hre }); - const { deployAndSaveEnclaveToken } = await import( - "../scripts/deployAndSave/enclaveToken" - ); + const { deployAndSaveEnclaveToken } = + await import("../scripts/deployAndSave/enclaveToken"); const { enclaveToken } = await deployAndSaveEnclaveToken({ hre }); - const { deployAndSaveMockStableToken } = await import( - "../scripts/deployAndSave/mockStableToken" - ); + const { deployAndSaveMockStableToken } = + await import("../scripts/deployAndSave/mockStableToken"); const { mockStableToken: mockUSDC } = await deployAndSaveMockStableToken({ hre, }); @@ -546,13 +536,11 @@ export const updateSubmissionWindow = task( }) .setAction(async () => ({ default: async ({ newWindow }, hre) => { - const { deployAndSaveCiphernodeRegistryOwnable } = await import( - "../scripts/deployAndSave/ciphernodeRegistryOwnable" - ); + const { deployAndSaveCiphernodeRegistryOwnable } = + await import("../scripts/deployAndSave/ciphernodeRegistryOwnable"); - const { deployAndSavePoseidonT3 } = await import( - "../scripts/deployAndSave/poseidonT3" - ); + const { deployAndSavePoseidonT3 } = + await import("../scripts/deployAndSave/poseidonT3"); const poseidonT3 = await deployAndSavePoseidonT3({ hre }); const { ciphernodeRegistry } = diff --git a/packages/enclave-contracts/tasks/enclave.ts b/packages/enclave-contracts/tasks/enclave.ts index 7be1108a2c..1de9724a1d 100644 --- a/packages/enclave-contracts/tasks/enclave.ts +++ b/packages/enclave-contracts/tasks/enclave.ts @@ -85,12 +85,10 @@ export const requestCommittee = task( const connection = await hre.network.connect(); const { ethers } = connection; - const { deployAndSaveEnclave } = await import( - "../scripts/deployAndSave/enclave" - ); - const { deployAndSaveMockStableToken } = await import( - "../scripts/deployAndSave/mockStableToken" - ); + const { deployAndSaveEnclave } = + await import("../scripts/deployAndSave/enclave"); + const { deployAndSaveMockStableToken } = + await import("../scripts/deployAndSave/mockStableToken"); const { enclave } = await deployAndSaveEnclave({ hre, @@ -210,9 +208,8 @@ export const enableE3 = task("enclave:enableE3", "Enable an E3 program") }) .setAction(async () => ({ default: async ({ e3Address }, hre) => { - const { deployAndSaveEnclave } = await import( - "../scripts/deployAndSave/enclave" - ); + const { deployAndSaveEnclave } = + await import("../scripts/deployAndSave/enclave"); const { enclave } = await deployAndSaveEnclave({ hre, @@ -258,13 +255,11 @@ export const publishCommittee = task( }) .setAction(async () => ({ default: async ({ e3Id, nodes, publicKey, publicKeyHash }, hre) => { - const { deployAndSaveCiphernodeRegistryOwnable } = await import( - "../scripts/deployAndSave/ciphernodeRegistryOwnable" - ); + const { deployAndSaveCiphernodeRegistryOwnable } = + await import("../scripts/deployAndSave/ciphernodeRegistryOwnable"); - const { deployAndSavePoseidonT3 } = await import( - "../scripts/deployAndSave/poseidonT3" - ); + const { deployAndSavePoseidonT3 } = + await import("../scripts/deployAndSave/poseidonT3"); const poseidonT3 = await deployAndSavePoseidonT3({ hre }); const { ciphernodeRegistry } = @@ -336,9 +331,8 @@ export const publishCiphertext = task( }) .setAction(async () => ({ default: async ({ e3Id, data, dataFile, proof, proofFile }, hre) => { - const { deployAndSaveEnclave } = await import( - "../scripts/deployAndSave/enclave" - ); + const { deployAndSaveEnclave } = + await import("../scripts/deployAndSave/enclave"); const { enclave } = await deployAndSaveEnclave({ hre, @@ -408,9 +402,8 @@ export const publishPlaintext = task( }) .setAction(async () => ({ default: async ({ e3Id, data, dataFile, proof, proofFile }, hre) => { - const { deployAndSaveEnclave } = await import( - "../scripts/deployAndSave/enclave" - ); + const { deployAndSaveEnclave } = + await import("../scripts/deployAndSave/enclave"); const { enclave } = await deployAndSaveEnclave({ hre, diff --git a/packages/enclave-contracts/tasks/program.ts b/packages/enclave-contracts/tasks/program.ts index b9104227ce..e9aeffa234 100644 --- a/packages/enclave-contracts/tasks/program.ts +++ b/packages/enclave-contracts/tasks/program.ts @@ -38,9 +38,8 @@ export const publishInput = task( }) .setAction(async () => ({ default: async ({ e3Id, data, dataFile, programAddress }, hre) => { - const { deployAndSaveMockProgram } = await import( - "../scripts/deployAndSave/mockProgram" - ); + const { deployAndSaveMockProgram } = + await import("../scripts/deployAndSave/mockProgram"); const { MockE3Program__factory } = await import("../types"); const { ethers } = await hre.network.connect(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a609cd83fe..cedb640920 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,11 @@ overrides: undici-types: 6.19.8 viem: 2.38.6 +patchedDependencies: + '@aztec/bb.js@3.0.0-nightly.20251104': + hash: 9b211b3c4c21b184471aa037477136fed4b5f827a57f508ca07a2752d02097b4 + path: examples/CRISP/patches/@aztec__bb.js@3.0.0-nightly.20251104.patch + importers: .: @@ -347,7 +352,7 @@ importers: dependencies: '@aztec/bb.js': specifier: 3.0.0-nightly.20251104 - version: 3.0.0-nightly.20251104 + version: 3.0.0-nightly.20251104(patch_hash=9b211b3c4c21b184471aa037477136fed4b5f827a57f508ca07a2752d02097b4) '@crisp-e3/zk-inputs': specifier: workspace:* version: link:../crisp-zk-inputs @@ -608,7 +613,7 @@ importers: dependencies: '@aztec/bb.js': specifier: 3.0.0-nightly.20251104 - version: 3.0.0-nightly.20251104 + version: 3.0.0-nightly.20251104(patch_hash=9b211b3c4c21b184471aa037477136fed4b5f827a57f508ca07a2752d02097b4) '@enclave-e3/contracts': specifier: workspace:* version: link:../enclave-contracts @@ -10362,7 +10367,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@aztec/bb.js@3.0.0-nightly.20251104': + '@aztec/bb.js@3.0.0-nightly.20251104(patch_hash=9b211b3c4c21b184471aa037477136fed4b5f827a57f508ca07a2752d02097b4)': dependencies: comlink: 4.4.2 commander: 12.1.0