From 51fd45515796e0224d8a456ed32cc5ebbebc2c14 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:40:42 +0000 Subject: [PATCH 1/2] chore: optimise crisp unit tests --- .../tests/crisp.contracts.test.ts | 136 ++++----- .../CRISP/packages/crisp-sdk/src/index.ts | 3 +- examples/CRISP/packages/crisp-sdk/src/vote.ts | 288 ++++++++++-------- .../packages/crisp-sdk/tests/vote.test.ts | 8 +- 4 files changed, 221 insertions(+), 214 deletions(-) diff --git a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts index caadcbe39c..7573cca5cb 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts @@ -14,19 +14,70 @@ import { generateMerkleTree, SIGNATURE_MESSAGE_HASH, generateMaskVoteProof, + destroyBBApi, } from '@crisp-e3/sdk' +import type { ProofData } from '@crisp-e3/sdk' import { expect } from 'chai' import { deployCRISPProgram, deployHonkVerifier, deployMockEnclave, ethers } from './utils' +import type { CRISPProgram, HonkVerifier, MockEnclave } from '../types' let keys = generateBFVKeys() let publicKey = keys.publicKey describe('CRISP Contracts', function () { + // Allow time for contract deployments + proof generation in before() + this.timeout(600000) + + let honkVerifier: HonkVerifier + let mockEnclave: MockEnclave + let crispProgram: CRISPProgram + let signature: `0x${string}` + let address: string + let leaves: bigint[] + let voteProof: ProofData + let maskProof: ProofData + const balance = 100n + const vote = [10, 0] + + before(async function () { + // Deploy contracts once + mockEnclave = await deployMockEnclave() + honkVerifier = await deployHonkVerifier() + crispProgram = await deployCRISPProgram({ mockEnclave, honkVerifier }) + + // Compute signature, address, and leaves once + const [signer] = await ethers.getSigners() + signature = (await signer.signMessage(SIGNATURE_MESSAGE)) as `0x${string}` + address = await getAddressFromSignature(signature, SIGNATURE_MESSAGE_HASH) + leaves = [...[10n, 20n, 30n], hashLeaf(address, balance)] + + // Generate proofs once + voteProof = await generateVoteProof({ + vote, + publicKey, + signature, + merkleLeaves: leaves, + balance, + messageHash: SIGNATURE_MESSAGE_HASH, + slotAddress: address, + }) + + maskProof = await generateMaskVoteProof({ + publicKey, + merkleLeaves: leaves, + balance, + slotAddress: address, + numOptions: 2, + }) + }) + + after(() => { + destroyBBApi() + }) + describe('decode tally', () => { it('should decode a tally correctly', async () => { - const mockEnclave = await deployMockEnclave() - const crispProgram = await deployCRISPProgram({ mockEnclave }) - + const e3Id = await mockEnclave.nextE3Id() await mockEnclave.request(await crispProgram.getAddress()) const tally = @@ -34,7 +85,7 @@ describe('CRISP Contracts', function () { await mockEnclave.setPlaintextOutput(tally) - const decodedTally1 = await crispProgram.decodeTally(0) + const decodedTally1 = await crispProgram.decodeTally(e3Id) expect(decodedTally1[0]).to.equal(10000000000n) expect(decodedTally1[1]).to.equal(30000000000n) @@ -43,96 +94,29 @@ describe('CRISP Contracts', function () { describe('validate input', () => { it('should verify the proof correctly with the crisp verifier', async function () { - // It needs some time to generate the proof. - this.timeout(300000) - - const honkVerifier = await deployHonkVerifier() - const [signer] = await ethers.getSigners() - - const vote = [10, 0] - const balance = 100n - const signature = (await signer.signMessage(SIGNATURE_MESSAGE)) as `0x${string}` - const address = await getAddressFromSignature(signature, SIGNATURE_MESSAGE_HASH) - const leaves = [...[10n, 20n, 30n], hashLeaf(address, balance)] - - const proof = await generateVoteProof({ - vote, - publicKey, - signature, - merkleLeaves: leaves, - balance, - messageHash: SIGNATURE_MESSAGE_HASH, - slotAddress: address, - }) - - const isValid = await honkVerifier.verify(proof.proof, proof.publicInputs) + const isValid = await honkVerifier.verify(voteProof.proof, voteProof.publicInputs) expect(isValid).to.be.true }) it('should verify the proof for a vote mask', async function () { - // It needs some time to generate the proof. - this.timeout(300000) - - const honkVerifier = await deployHonkVerifier() - const [signer] = await ethers.getSigners() - - const balance = 100n - const signature = (await signer.signMessage(SIGNATURE_MESSAGE)) as `0x${string}` - const address = await getAddressFromSignature(signature, SIGNATURE_MESSAGE_HASH) - const leaves = [...[10n, 20n, 30n], hashLeaf(address, balance)] - - const proof = await generateMaskVoteProof({ - publicKey, - merkleLeaves: leaves, - balance, - slotAddress: address, - numOptions: 2, - }) - - const isValid = await honkVerifier.verify(proof.proof, proof.publicInputs) + const isValid = await honkVerifier.verify(maskProof.proof, maskProof.publicInputs) expect(isValid).to.be.true }) it('should validate input correctly', async function () { - // It needs some time to generate the proof. - this.timeout(300000) - - const mockEnclave = await deployMockEnclave() - const crispProgram = await deployCRISPProgram({ mockEnclave }) + const e3Id = await mockEnclave.nextE3Id() await mockEnclave.request(await crispProgram.getAddress()) - const [signer] = await ethers.getSigners() - const e3Id = 0n - - await mockEnclave.request(await crispProgram.getAddress()) - - const vote = [10, 0] - const balance = 100n - const signature = (await signer.signMessage(SIGNATURE_MESSAGE)) as `0x${string}` - const address = await getAddressFromSignature(signature, SIGNATURE_MESSAGE_HASH) - const leaves = [...[10n, 20n, 30n], hashLeaf(address, balance)] const merkleTree = generateMerkleTree(leaves) - const proof = await generateVoteProof({ - vote, - publicKey, - signature, - merkleLeaves: leaves, - balance, - messageHash: SIGNATURE_MESSAGE_HASH, - slotAddress: address, - }) - - await mockEnclave.setCommitteePublicKey(proof.publicInputs[6]) + await mockEnclave.setCommitteePublicKey(voteProof.publicInputs[6]) - const encodedProof = encodeSolidityProof(proof) + const encodedProof = encodeSolidityProof(voteProof) - // Call next functions with fake data for testing. await crispProgram.setMerkleRoot(e3Id, merkleTree.root) - // If it doesn't throw, the test is successful. await crispProgram.publishInput(e3Id, encodedProof) }) }) diff --git a/examples/CRISP/packages/crisp-sdk/src/index.ts b/examples/CRISP/packages/crisp-sdk/src/index.ts index 975c4e2405..a5986495a9 100644 --- a/examples/CRISP/packages/crisp-sdk/src/index.ts +++ b/examples/CRISP/packages/crisp-sdk/src/index.ts @@ -17,8 +17,9 @@ export { encryptVote, encodeSolidityProof, validateVote, + destroyBBApi, } from './vote' export { CrispSDK } from './sdk' -export type { RoundDetails, RoundDetailsResponse, TokenDetails, Vote, MaskVoteProofInputs, VoteProofInputs } from './types' +export type { RoundDetails, RoundDetailsResponse, TokenDetails, Vote, MaskVoteProofInputs, VoteProofInputs, ProofData } from './types' export { CreditMode } from './types' diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index dbd99a41d4..a915c5a744 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -19,6 +19,37 @@ import userDataEncryptionCircuit from '../../../../../circuits/bin/recursive_agg import { bytesToHex, encodeAbiParameters, parseAbiParameters, numberToHex, getAddress } from 'viem/utils' import { Hex } from 'viem' +// Cached Barretenberg API instance — avoids re-initialising WASM + SRS on every proof. +let _bbApi: Barretenberg | null = null +let _bbApiInitPromise: Promise | null = null + +const getBBApi = async (): Promise => { + if (_bbApi) return _bbApi + if (_bbApiInitPromise) return _bbApiInitPromise + + _bbApiInitPromise = (async () => { + try { + const api = await Barretenberg.new() + await api.initSRSChonk(2 ** 21) + _bbApi = api + return api + } finally { + _bbApiInitPromise = null + } + })() + + return _bbApiInitPromise +} + +// Destroy the cached Barretenberg API and free its resources. +export const destroyBBApi = (): void => { + _bbApiInitPromise = null + if (_bbApi) { + _bbApi.destroy() + _bbApi = null + } +} + /** * Generate the circuit inputs for a vote proof. * Runs in a worker when available to avoid blocking the main thread. @@ -72,141 +103,135 @@ export const executeCircuit = async (circuit: CompiledCircuit, inputs: any): Pro * @returns The proof. */ export const generateProof = async (circuitInputs: any) => { - const api = await Barretenberg.new() - - try { - await api.initSRSChonk(2 ** 21) // fold circuit needs 2^21 points; default is 2^20 - - const { witness: userDataEncryptionCt0Witness } = await executeCircuit(userDataEncryptionCt0Circuit as CompiledCircuit, { - pk0is: circuitInputs.pk0is, - ct0is: circuitInputs.ct0is, - u: circuitInputs.u, - e0: circuitInputs.e0, - e0is: circuitInputs.e0is, - e0_quotients: circuitInputs.e0_quotients, - k1: circuitInputs.k1, - r1is: circuitInputs.r1is, - r2is: circuitInputs.r2is, - }) - const { witness: userDataEncryptionCt1Witness } = await executeCircuit(userDataEncryptionCt1Circuit as CompiledCircuit, { - pk1is: circuitInputs.pk1is, - ct1is: circuitInputs.ct1is, - u: circuitInputs.u, - e1: circuitInputs.e1, - p1is: circuitInputs.p1is, - p2is: circuitInputs.p2is, - }) - const { witness: crispWitness, returnValue: crispReturnValue } = await executeCircuit(crispCircuit as CompiledCircuit, { - prev_ct0is: circuitInputs.prev_ct0is, - prev_ct1is: circuitInputs.prev_ct1is, - prev_ct_commitment: circuitInputs.prev_ct_commitment, - sum_ct0is: circuitInputs.sum_ct0is, - sum_ct1is: circuitInputs.sum_ct1is, - sum_r0is: circuitInputs.sum_r0is, - sum_r1is: circuitInputs.sum_r1is, - ct0is: circuitInputs.ct0is, - ct1is: circuitInputs.ct1is, - k1: circuitInputs.k1, - public_key_x: circuitInputs.public_key_x, - public_key_y: circuitInputs.public_key_y, - signature: circuitInputs.signature, - hashed_message: circuitInputs.hashed_message, - merkle_root: circuitInputs.merkle_root, - merkle_proof_length: circuitInputs.merkle_proof_length, - merkle_proof_indices: circuitInputs.merkle_proof_indices, - merkle_proof_siblings: circuitInputs.merkle_proof_siblings, - slot_address: circuitInputs.slot_address, - balance: circuitInputs.balance, - is_first_vote: circuitInputs.is_first_vote, - is_mask_vote: circuitInputs.is_mask_vote, - num_options: circuitInputs.num_options, - }) + const api = await getBBApi() + + const { witness: userDataEncryptionCt0Witness } = await executeCircuit(userDataEncryptionCt0Circuit as CompiledCircuit, { + pk0is: circuitInputs.pk0is, + ct0is: circuitInputs.ct0is, + u: circuitInputs.u, + e0: circuitInputs.e0, + e0is: circuitInputs.e0is, + e0_quotients: circuitInputs.e0_quotients, + k1: circuitInputs.k1, + r1is: circuitInputs.r1is, + r2is: circuitInputs.r2is, + }) + const { witness: userDataEncryptionCt1Witness } = await executeCircuit(userDataEncryptionCt1Circuit as CompiledCircuit, { + pk1is: circuitInputs.pk1is, + ct1is: circuitInputs.ct1is, + u: circuitInputs.u, + e1: circuitInputs.e1, + p1is: circuitInputs.p1is, + p2is: circuitInputs.p2is, + }) + const { witness: crispWitness, returnValue: crispReturnValue } = await executeCircuit(crispCircuit as CompiledCircuit, { + prev_ct0is: circuitInputs.prev_ct0is, + prev_ct1is: circuitInputs.prev_ct1is, + prev_ct_commitment: circuitInputs.prev_ct_commitment, + sum_ct0is: circuitInputs.sum_ct0is, + sum_ct1is: circuitInputs.sum_ct1is, + sum_r0is: circuitInputs.sum_r0is, + sum_r1is: circuitInputs.sum_r1is, + ct0is: circuitInputs.ct0is, + ct1is: circuitInputs.ct1is, + k1: circuitInputs.k1, + public_key_x: circuitInputs.public_key_x, + public_key_y: circuitInputs.public_key_y, + signature: circuitInputs.signature, + hashed_message: circuitInputs.hashed_message, + merkle_root: circuitInputs.merkle_root, + merkle_proof_length: circuitInputs.merkle_proof_length, + merkle_proof_indices: circuitInputs.merkle_proof_indices, + merkle_proof_siblings: circuitInputs.merkle_proof_siblings, + slot_address: circuitInputs.slot_address, + balance: circuitInputs.balance, + is_first_vote: circuitInputs.is_first_vote, + is_mask_vote: circuitInputs.is_mask_vote, + num_options: circuitInputs.num_options, + }) - const userDataEncryptionCt0Backend = new UltraHonkBackend((userDataEncryptionCt0Circuit as CompiledCircuit).bytecode, api) - const userDataEncryptionCt1Backend = new UltraHonkBackend((userDataEncryptionCt1Circuit as CompiledCircuit).bytecode, api) - const userDataEncryptionBackend = new UltraHonkBackend((userDataEncryptionCircuit as CompiledCircuit).bytecode, api) - const crispBackend = new UltraHonkBackend((crispCircuit as CompiledCircuit).bytecode, api) - const foldBackend = new UltraHonkBackend((foldCircuit as CompiledCircuit).bytecode, api) + const userDataEncryptionCt0Backend = new UltraHonkBackend((userDataEncryptionCt0Circuit as CompiledCircuit).bytecode, api) + const userDataEncryptionCt1Backend = new UltraHonkBackend((userDataEncryptionCt1Circuit as CompiledCircuit).bytecode, api) + const userDataEncryptionBackend = new UltraHonkBackend((userDataEncryptionCircuit as CompiledCircuit).bytecode, api) + const crispBackend = new UltraHonkBackend((crispCircuit as CompiledCircuit).bytecode, api) + const foldBackend = new UltraHonkBackend((foldCircuit as CompiledCircuit).bytecode, api) - const { proof: userDataEncryptionCt0Proof, publicInputs: userDataEncryptionCt0PublicInputs } = - await userDataEncryptionCt0Backend.generateProof(userDataEncryptionCt0Witness, { - verifierTarget: 'noir-recursive-no-zk', - }) - const { proof: userDataEncryptionCt1Proof, publicInputs: userDataEncryptionCt1PublicInputs } = - await userDataEncryptionCt1Backend.generateProof(userDataEncryptionCt1Witness, { - verifierTarget: 'noir-recursive-no-zk', - }) - const { proof: crispProof, publicInputs: crispPublicInputs } = await crispBackend.generateProof(crispWitness, { + const { proof: userDataEncryptionCt0Proof, publicInputs: userDataEncryptionCt0PublicInputs } = + await userDataEncryptionCt0Backend.generateProof(userDataEncryptionCt0Witness, { verifierTarget: 'noir-recursive-no-zk', }) - - const userDataEncryptionCt0Artifacts = await userDataEncryptionCt0Backend.generateRecursiveProofArtifacts( - userDataEncryptionCt0Proof, - userDataEncryptionCt0PublicInputs.length, - { - verifierTarget: 'noir-recursive-no-zk', - }, - ) - const userDataEncryptionCt1Artifacts = await userDataEncryptionCt1Backend.generateRecursiveProofArtifacts( - userDataEncryptionCt1Proof, - userDataEncryptionCt1PublicInputs.length, - { - verifierTarget: 'noir-recursive-no-zk', - }, - ) - const crispArtifacts = await crispBackend.generateRecursiveProofArtifacts(crispProof, crispPublicInputs.length, { + const { proof: userDataEncryptionCt1Proof, publicInputs: userDataEncryptionCt1PublicInputs } = + await userDataEncryptionCt1Backend.generateProof(userDataEncryptionCt1Witness, { verifierTarget: 'noir-recursive-no-zk', }) + const { proof: crispProof, publicInputs: crispPublicInputs } = await crispBackend.generateProof(crispWitness, { + verifierTarget: 'noir-recursive-no-zk', + }) - const { witness: userDataEncryptionWitness } = await executeCircuit(userDataEncryptionCircuit as CompiledCircuit, { - ct0_verification_key: userDataEncryptionCt0Artifacts.vkAsFields, - ct0_proof: proofToFields(userDataEncryptionCt0Proof), - ct0_public_inputs: userDataEncryptionCt0PublicInputs, - ct0_key_hash: userDataEncryptionCt0Artifacts.vkHash, - ct1_verification_key: userDataEncryptionCt1Artifacts.vkAsFields, - ct1_proof: proofToFields(userDataEncryptionCt1Proof), - ct1_public_inputs: userDataEncryptionCt1PublicInputs, - ct1_key_hash: userDataEncryptionCt1Artifacts.vkHash, - }) + const userDataEncryptionCt0Artifacts = await userDataEncryptionCt0Backend.generateRecursiveProofArtifacts( + userDataEncryptionCt0Proof, + userDataEncryptionCt0PublicInputs.length, + { + verifierTarget: 'noir-recursive-no-zk', + }, + ) + const userDataEncryptionCt1Artifacts = await userDataEncryptionCt1Backend.generateRecursiveProofArtifacts( + userDataEncryptionCt1Proof, + userDataEncryptionCt1PublicInputs.length, + { + verifierTarget: 'noir-recursive-no-zk', + }, + ) + const crispArtifacts = await crispBackend.generateRecursiveProofArtifacts(crispProof, crispPublicInputs.length, { + verifierTarget: 'noir-recursive-no-zk', + }) - const { proof: userDataEncryptionProof, publicInputs: userDataEncryptionPublicInputs } = await userDataEncryptionBackend.generateProof( - userDataEncryptionWitness, - { - verifierTarget: 'noir-recursive-no-zk', - }, - ) - const userDataEncryptionArtifacts = await userDataEncryptionBackend.generateRecursiveProofArtifacts( - userDataEncryptionProof, - userDataEncryptionPublicInputs.length, - { - verifierTarget: 'noir-recursive-no-zk', - }, - ) - - const { witness: foldWitness } = await executeCircuit(foldCircuit as CompiledCircuit, { - user_data_encryption_verification_key: userDataEncryptionArtifacts.vkAsFields, - user_data_encryption_proof: proofToFields(userDataEncryptionProof), - user_data_encryption_public_inputs: userDataEncryptionPublicInputs, - user_data_encryption_key_hash: userDataEncryptionArtifacts.vkHash, - crisp_verification_key: crispArtifacts.vkAsFields, - crisp_proof: proofToFields(crispProof), - crisp_key_hash: crispArtifacts.vkHash, - prev_ct_commitment: circuitInputs.prev_ct_commitment, - merkle_root: circuitInputs.merkle_root, - slot_address: circuitInputs.slot_address, - is_first_vote: circuitInputs.is_first_vote, - num_options: circuitInputs.num_options, - final_ct_commitment: crispReturnValue[0].toString(), - ct_commitment: crispReturnValue[1].toString(), - k1_commitment: crispReturnValue[2].toString(), - }) + const { witness: userDataEncryptionWitness } = await executeCircuit(userDataEncryptionCircuit as CompiledCircuit, { + ct0_verification_key: userDataEncryptionCt0Artifacts.vkAsFields, + ct0_proof: proofToFields(userDataEncryptionCt0Proof), + ct0_public_inputs: userDataEncryptionCt0PublicInputs, + ct0_key_hash: userDataEncryptionCt0Artifacts.vkHash, + ct1_verification_key: userDataEncryptionCt1Artifacts.vkAsFields, + ct1_proof: proofToFields(userDataEncryptionCt1Proof), + ct1_public_inputs: userDataEncryptionCt1PublicInputs, + ct1_key_hash: userDataEncryptionCt1Artifacts.vkHash, + }) - const proof = await foldBackend.generateProof(foldWitness, { verifierTarget: 'evm' }) + const { proof: userDataEncryptionProof, publicInputs: userDataEncryptionPublicInputs } = await userDataEncryptionBackend.generateProof( + userDataEncryptionWitness, + { + verifierTarget: 'noir-recursive-no-zk', + }, + ) + const userDataEncryptionArtifacts = await userDataEncryptionBackend.generateRecursiveProofArtifacts( + userDataEncryptionProof, + userDataEncryptionPublicInputs.length, + { + verifierTarget: 'noir-recursive-no-zk', + }, + ) + + const { witness: foldWitness } = await executeCircuit(foldCircuit as CompiledCircuit, { + user_data_encryption_verification_key: userDataEncryptionArtifacts.vkAsFields, + user_data_encryption_proof: proofToFields(userDataEncryptionProof), + user_data_encryption_public_inputs: userDataEncryptionPublicInputs, + user_data_encryption_key_hash: userDataEncryptionArtifacts.vkHash, + crisp_verification_key: crispArtifacts.vkAsFields, + crisp_proof: proofToFields(crispProof), + crisp_key_hash: crispArtifacts.vkHash, + prev_ct_commitment: circuitInputs.prev_ct_commitment, + merkle_root: circuitInputs.merkle_root, + slot_address: circuitInputs.slot_address, + is_first_vote: circuitInputs.is_first_vote, + num_options: circuitInputs.num_options, + final_ct_commitment: crispReturnValue[0].toString(), + ct_commitment: crispReturnValue[1].toString(), + k1_commitment: crispReturnValue[2].toString(), + }) - return proof - } finally { - api.destroy() - } + const proof = await foldBackend.generateProof(foldWitness, { verifierTarget: 'evm' }) + + return proof } /** @@ -298,17 +323,10 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn * @returns True if the proof is valid, false otherwise. */ export const verifyProof = async (proof: ProofData): Promise => { - const api = await Barretenberg.new() - - try { - const foldBackend = new UltraHonkBackend(foldCircuit.bytecode, api) + const api = await getBBApi() + const foldBackend = new UltraHonkBackend(foldCircuit.bytecode, api) - const isValid = await foldBackend.verifyProof(proof, { verifierTarget: 'evm' }) - - return isValid - } finally { - api.destroy() - } + return foldBackend.verifyProof(proof, { verifierTarget: 'evm' }) } /** diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 5979136ed1..9fb9f0d51a 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -3,11 +3,11 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { describe, it, expect, beforeAll, beforeEach, afterEach, vi } from 'vitest' +import { describe, it, expect, beforeAll, beforeEach, afterEach, afterAll, vi } from 'vitest' import { Vote } from '../src/types' import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE } from '../src/constants' import { getZeroVote } from '../src/utils' -import { decodeTally, verifyProof, encodeVote, generateBFVKeys, encryptVote, decryptVote } from '../src/vote' +import { decodeTally, verifyProof, encodeVote, generateBFVKeys, encryptVote, decryptVote, destroyBBApi } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, SLOT_ADDRESS } from './constants' @@ -48,6 +48,10 @@ describe('Vote', () => { vi.restoreAllMocks() }) + afterAll(() => { + destroyBBApi() + }) + beforeAll(async () => { vote = [10, 0, 0] signature = await signMessage({ message: SIGNATURE_MESSAGE, privateKey: ECDSA_PRIVATE_KEY }) From 8cd44f78816936a31783ffee44c14268c353a516 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Sat, 28 Feb 2026 15:10:14 +0000 Subject: [PATCH 2/2] chore: use larger runner only for heavy workloads --- .github/workflows/ci.yml | 60 ++++++++++------------------------------ 1 file changed, 15 insertions(+), 45 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1008a85a12..eb834ff979 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,9 +81,7 @@ jobs: run: 'cargo test --test integration -- --nocapture' zk_prover_integration: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 @@ -112,9 +110,7 @@ jobs: run: 'cargo test -p e3-zk-prover --features integration-tests --test integration_tests -- --nocapture' build_e3_support_risc0: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 - name: Generate tags @@ -151,9 +147,7 @@ jobs: type=gha,mode=max,scope=e3-support build_ciphernode_image: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 @@ -193,9 +187,7 @@ jobs: type=gha,mode=max,scope=ciphernode test_contracts: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - name: 'Check out the repo' uses: 'actions/checkout@v6' @@ -230,9 +222,7 @@ jobs: echo "✅ Passed" >> $GITHUB_STEP_SUMMARY test_net: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - name: 'Check out the repo' uses: 'actions/checkout@v6' @@ -245,9 +235,7 @@ jobs: echo "✅ Passed" >> $GITHUB_STEP_SUMMARY integration_prebuild: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - name: 'Check out the repo' uses: 'actions/checkout@v6' @@ -368,9 +356,7 @@ jobs: echo "✅ Passed" >> $GITHUB_STEP_SUMMARY build_enclave_cli: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 with: @@ -401,9 +387,7 @@ jobs: retention-days: 1 crisp_unit: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' needs: [build_crisp_sdk] steps: - uses: actions/checkout@v6 @@ -589,9 +573,7 @@ jobs: retention-days: 30 build_circuits: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 with: @@ -644,9 +626,7 @@ jobs: if-no-files-found: error zk_prover_e2e: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' needs: [build_circuits] steps: - uses: actions/checkout@v6 @@ -685,9 +665,7 @@ jobs: run: cargo test -p e3-zk-prover --test local_e2e_tests -- --nocapture build_e3_support_dev: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 with: @@ -716,9 +694,7 @@ jobs: if-no-files-found: error build_sdk: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 with: @@ -774,9 +750,7 @@ jobs: if-no-files-found: warn build_crisp_sdk: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v6 @@ -897,9 +871,7 @@ jobs: pnpm test:integration test_enclave_init: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' needs: [build_enclave_cli, build_e3_support_dev] steps: - name: Install pnpm @@ -936,9 +908,7 @@ jobs: enclave init mycitest --verbose --template=${{ github.server_url }}/${{ github.repository }}.git#${BRANCH}:templates/default contrib-readme-job: - runs-on: - group: enclave-ci - labels: [enclave-ci-runner] + runs-on: 'ubuntu-latest' name: Populate Contributors List # Only run on main branch to avoid branch conflicts if: github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, 'contrib-readme-action')