From adafa66d01a11a70037330538fe6e8f0007e62eb Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 10 Oct 2025 19:23:28 +0100 Subject: [PATCH 1/4] chore: remove semaphore and cleanup crisp --- examples/CRISP/.gitignore | 4 +- examples/CRISP/client/.env.example | 3 +- examples/CRISP/client/package.json | 4 - .../src/components/RegistrationModal.tsx | 53 -- .../voteManagement/VoteManagement.context.tsx | 16 - .../voteManagement/VoteManagement.types.ts | 6 - .../semaphore/useSemaphoreGroupManagement.ts | 126 --- .../client/src/hooks/voting/useVoteCasting.ts | 35 +- examples/CRISP/client/src/model/vote.model.ts | 1 - .../pages/Landing/components/DailyPoll.tsx | 34 +- .../CRISP/client/src/utils/proof-encoding.ts | 28 +- examples/CRISP/contracts/CRISPChecker.sol | 83 -- .../CRISP/contracts/CRISPCheckerFactory.sol | 34 - .../CRISP/contracts/CRISPInputValidator.sol | 58 +- .../contracts/CRISPInputValidatorFactory.sol | 7 +- examples/CRISP/contracts/CRISPPolicy.sol | 61 -- .../CRISP/contracts/CRISPPolicyFactory.sol | 30 - examples/CRISP/contracts/CRISPProgram.sol | 63 +- examples/CRISP/deploy/Deploy.s.sol | 29 - examples/CRISP/server/.env.example | 2 +- examples/CRISP/server/src/server/models.rs | 1 - .../CRISP/server/src/server/routes/voting.rs | 1 - examples/CRISP/test/crisp.spec.ts | 4 - pnpm-lock.yaml | 740 ------------------ 24 files changed, 61 insertions(+), 1362 deletions(-) delete mode 100644 examples/CRISP/client/src/components/RegistrationModal.tsx delete mode 100644 examples/CRISP/client/src/hooks/semaphore/useSemaphoreGroupManagement.ts delete mode 100644 examples/CRISP/contracts/CRISPChecker.sol delete mode 100644 examples/CRISP/contracts/CRISPCheckerFactory.sol delete mode 100644 examples/CRISP/contracts/CRISPPolicy.sol delete mode 100644 examples/CRISP/contracts/CRISPPolicyFactory.sol diff --git a/examples/CRISP/.gitignore b/examples/CRISP/.gitignore index d79ca3535e..6e1c55b0c6 100644 --- a/examples/CRISP/.gitignore +++ b/examples/CRISP/.gitignore @@ -47,4 +47,6 @@ playwright-report/ .enclave/data/ .enclave/config/ .enclave/caches/ -cache_hardhat/ \ No newline at end of file +cache_hardhat/ + +!sdk/src/artifacts/ERC20Votes.json diff --git a/examples/CRISP/client/.env.example b/examples/CRISP/client/.env.example index 9296e8aa99..f0c8dd2b20 100644 --- a/examples/CRISP/client/.env.example +++ b/examples/CRISP/client/.env.example @@ -1,5 +1,4 @@ VITE_ENCLAVE_API=http://127.0.0.1:4000 VITE_TWITTER_SERVERLESS_API= VITE_WALLETCONNECT_PROJECT_ID= -VITE_E3_PROGRAM_ADDRESS=0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44 # Default E3 program address from anvil -VITE_SEMAPHORE_ADDRESS=0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE +VITE_E3_PROGRAM_ADDRESS=0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1 # Default E3 program address from anvil diff --git a/examples/CRISP/client/package.json b/examples/CRISP/client/package.json index 1eb3c4fb56..06ad39fa1d 100644 --- a/examples/CRISP/client/package.json +++ b/examples/CRISP/client/package.json @@ -26,10 +26,6 @@ "@noir-lang/noir_js": "1.0.0-beta.3", "@noir-lang/noirc_abi": "1.0.0-beta.3", "@phosphor-icons/react": "^2.1.4", - "@semaphore-protocol/identity": "^4.12.1", - "@semaphore-protocol/data": "^4.12.1", - "@semaphore-protocol/group": "^4.12.1", - "@hashcloak/semaphore-noir-proof": "1.0.0", "@svgr/rollup": "^8.1.0", "@tanstack/react-query": "^5.74.3", "axios": "^1.6.8", diff --git a/examples/CRISP/client/src/components/RegistrationModal.tsx b/examples/CRISP/client/src/components/RegistrationModal.tsx deleted file mode 100644 index ad6ff0a55f..0000000000 --- a/examples/CRISP/client/src/components/RegistrationModal.tsx +++ /dev/null @@ -1,53 +0,0 @@ -// 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 React from 'react'; -import Modal from '@/components/Modal'; - -interface RegistrationModalProps { - isOpen: boolean; - onClose: () => void; - onRegister: () => void; - isRegistering: boolean; - explanation?: string; -} - -const DEFAULT_EXPLANATION = ( - <> - To vote anonymously using Semaphore, you first need to register your unique identity - with the polling group for this specific round. This action is required once per poll - and links your cryptographic identity to the group without revealing your wallet address during the vote. - -); - -const RegistrationModal: React.FC = ({ - isOpen, - onClose, - onRegister, - isRegistering, - explanation -}) => { - - return ( - -
-

Register Identity to Vote

-

- {explanation || DEFAULT_EXPLANATION} -

- -
-
- ); -}; - -export default RegistrationModal; \ No newline at end of file diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx b/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx index 31043516a4..20cb58434e 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx @@ -16,7 +16,6 @@ import { convertPollData, convertTimestampToDate } from '@/utils/methods' import { Poll, PollResult } from '@/model/poll.model' import { generatePoll } from '@/utils/generate-random-poll' import { handleGenericError } from '@/utils/handle-generic-error' -import { useSemaphoreGroupManagement } from '@/hooks/semaphore/useSemaphoreGroupManagement' const [useVoteManagementContext, VoteManagementContextProvider] = createGenericContext() @@ -53,15 +52,6 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { broadcastVote, } = useEnclaveServer() - const { - groupId: currentSemaphoreGroupId, - groupMembers: currentGroupMembers, - isFetchingMembers: fetchingMembers, - isRegistering, - isCommitted: isRegisteredForCurrentRound, - registerIdentity: registerIdentityOnContract, - } = useSemaphoreGroupManagement(roundState?.id, roundState?.start_block, semaphoreIdentity) - const initialLoad = async () => { console.log('Loading wasm') const currentRound = await getCurrentRound() @@ -149,11 +139,6 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { user, semaphoreIdentity, votingRound, - isRegistering, - fetchingMembers, - currentSemaphoreGroupId, - currentGroupMembers, - isRegisteredForCurrentRound, roundEndDate, pollOptions, roundState, @@ -171,7 +156,6 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { setPollOptions, initialLoad, broadcastVote, - registerIdentityOnContract, setVotingRound, setUser, encryptVote, diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index f66b342d25..556f57c377 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -13,11 +13,6 @@ export type VoteManagementContextType = { isLoading: boolean user: { address: string } | null semaphoreIdentity: Identity | null - isRegistering: boolean - isRegisteredForCurrentRound: boolean - fetchingMembers: boolean - currentGroupMembers: string[] - currentSemaphoreGroupId: bigint | null votingRound: VotingRound | null roundEndDate: Date | null pollOptions: Poll[] @@ -35,7 +30,6 @@ export type VoteManagementContextType = { setVotingRound: React.Dispatch> setUser: React.Dispatch> encryptVote: (voteId: bigint, publicKey: Uint8Array) => Promise - registerIdentityOnContract: () => void broadcastVote: (vote: BroadcastVoteRequest) => Promise getRoundStateLite: (roundCount: number) => Promise setPastPolls: React.Dispatch> diff --git a/examples/CRISP/client/src/hooks/semaphore/useSemaphoreGroupManagement.ts b/examples/CRISP/client/src/hooks/semaphore/useSemaphoreGroupManagement.ts deleted file mode 100644 index 05395f628e..0000000000 --- a/examples/CRISP/client/src/hooks/semaphore/useSemaphoreGroupManagement.ts +++ /dev/null @@ -1,126 +0,0 @@ -// 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 { - useAccount, - useReadContract, - useWriteContract, - useWaitForTransactionReceipt, -} from 'wagmi'; -import { useQuery, useQueryClient } from '@tanstack/react-query'; -import { useNotificationAlertContext } from '@/context/NotificationAlert/NotificationAlert.context'; -import { - E3_PROGRAM_ADDRESS, - E3_PROGRAM_ABI, -} from '@/config/Enclave.abi'; -import { SemaphoreEthers } from '@semaphore-protocol/data'; -import type { Identity } from '@semaphore-protocol/identity'; -import { useCallback, useEffect, useRef } from 'react'; - -interface SemaphoreGroupManagement { - groupId: bigint | null; - groupMembers: string[]; - isFetchingMembers: boolean; - isRegistering: boolean; - isCommitted: boolean; - registerIdentity: () => void; -} - -export const useSemaphoreGroupManagement = ( - roundId: number | null | undefined, - roundStartBlock: number | null | undefined, - semaphoreIdentity: Identity | null, -): SemaphoreGroupManagement => { - const { showToast } = useNotificationAlertContext(); - const { chain } = useAccount(); - const queryClient = useQueryClient(); - - const { data: rawGroupId } = useReadContract({ - address: roundId != null ? E3_PROGRAM_ADDRESS : undefined, - abi: roundId != null ? E3_PROGRAM_ABI : undefined, - functionName: 'groupIds', - args: roundId != null ? [BigInt(roundId)] : undefined, - query: { enabled: roundId != null }, - }); - const groupId: bigint | null = - rawGroupId !== undefined ? (rawGroupId as bigint) : null; - - const ethersRef = useRef(null); - useEffect(() => { - const rpcUrl = chain?.rpcUrls?.default?.http[0]; - if (!rpcUrl || !roundStartBlock) return; - const semaphoreAddress = import.meta.env.VITE_SEMAPHORE_ADDRESS; - if (!semaphoreAddress) { - throw new Error("VITE_SEMAPHORE_ADDRESS environment variable is not set."); - } - ethersRef.current = new SemaphoreEthers(rpcUrl, { - address: semaphoreAddress, - startBlock: roundStartBlock, - }); - }, [chain?.id, roundStartBlock]); - const { data: membersData, isFetching: isFetchingMembers } = useQuery({ - enabled: !(groupId == null) && !!ethersRef.current, - queryKey: ['semaphore-members', groupId?.toString()], - queryFn: async () => { - const raw = await ethersRef.current!.getGroupMembers(groupId!.toString()); - return raw.map((m: bigint | string) => m.toString()); - }, - staleTime: 1000 * 60 * 5, - }); - const groupMembers = membersData ?? []; - - const isCommitted = !!( - semaphoreIdentity && - groupMembers.includes(semaphoreIdentity.commitment.toString()) - ); - - const { - data: txHash, - writeContract, - error: writeError, - isPending: isWritePending, - } = useWriteContract(); - - const { isLoading: isConfirming, isSuccess: isRegConfirmed } = - useWaitForTransactionReceipt({ hash: txHash }); - - const registerIdentity = useCallback(() => { - if (roundId == null || !semaphoreIdentity) { - showToast({ type: 'danger', message: 'Round or identity missing.' }); - return; - } - writeContract({ - address: E3_PROGRAM_ADDRESS, - abi: E3_PROGRAM_ABI, - functionName: 'registerMember', - args: [BigInt(roundId), semaphoreIdentity.commitment], - }); - }, [roundId, semaphoreIdentity, writeContract]); - - useEffect(() => { - if (isRegConfirmed && groupId != null && semaphoreIdentity) { - showToast({ type: 'success', message: 'Identity registration confirmed!' }); - const key = ['semaphore-members', groupId.toString()]; - const c = semaphoreIdentity.commitment.toString(); - queryClient.setQueryData(key, (old) => - old?.includes(c) ? old : [...(old ?? []), c], - ); - queryClient.invalidateQueries({ queryKey: key, exact: true }); - } - if (writeError) { - showToast({ type: 'danger', message: 'Registration transaction failed' }); - } - }, [isRegConfirmed, queryClient, groupId, semaphoreIdentity]); - - return { - groupId, - groupMembers, - isFetchingMembers, - isCommitted, - isRegistering: isWritePending || isConfirming, - registerIdentity, - }; -}; diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index 27ab71db85..fd935c1fcc 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -10,9 +10,6 @@ import { useVoteManagementContext } from '@/context/voteManagement'; import { useNotificationAlertContext } from '@/context/NotificationAlert/NotificationAlert.context.tsx'; import { Poll } from '@/model/poll.model'; import { BroadcastVoteRequest } from '@/model/vote.model'; -import { Group } from '@semaphore-protocol/group'; -import { generateNoirProof, SemaphoreNoirProof, initSemaphoreNoirBackend } from '@hashcloak/semaphore-noir-proof'; -import { encodeSemaphoreProof } from '@/utils/proof-encoding'; export const useVoteCasting = () => { const { @@ -20,9 +17,6 @@ export const useVoteCasting = () => { roundState, votingRound, semaphoreIdentity, - currentGroupMembers, - fetchingMembers, - isRegisteredForCurrentRound, encryptVote, broadcastVote, setTxUrl, @@ -46,19 +40,9 @@ export const useVoteCasting = () => { showToast({ type: 'danger', message: 'Please select a poll option first.' }); return; } - if (!user || !isRegisteredForCurrentRound || !roundState || !semaphoreIdentity) { - console.error("Cannot cast vote: Missing user, registration, round state, or identity."); - showToast({ type: 'danger', message: 'Cannot cast vote. Ensure you are connected, registered, and the round is active.' }); - return; - } - if (fetchingMembers) { - console.log("Cannot cast vote: Still fetching group members."); - showToast({ type: 'danger', message: 'Group members are still loading. Please wait.' }); - return; - } - if (!currentGroupMembers || currentGroupMembers.length === 0) { - console.error("Cannot cast vote: No group members found for this round."); - showToast({ type: 'danger', message: 'Could not load group members for this round.' }); + if (!user || !roundState || !semaphoreIdentity) { + console.error("Cannot cast vote: Missing user, round state, or identity."); + showToast({ type: 'danger', message: 'Cannot cast vote. Ensure you are connected, and the round is active.' }); return; } @@ -71,22 +55,12 @@ export const useVoteCasting = () => { throw new Error("Failed to encrypt vote."); } - const group = new Group(currentGroupMembers); - const scope = String(roundState.id); - // the message does not matter - const message = "e3"; - const merkleTreeDepth = 10; - const noirBackend = await initSemaphoreNoirBackend(merkleTreeDepth); - const fullProof: SemaphoreNoirProof = await generateNoirProof(semaphoreIdentity, group, message, scope, noirBackend, true); - const proofBytes = encodeSemaphoreProof(fullProof); - const voteRequest: BroadcastVoteRequest = { round_id: roundState.id, enc_vote_bytes: Array.from(voteEncrypted.vote), proof: Array.from(voteEncrypted.proof), public_inputs: voteEncrypted.public_inputs, address: user.address, - proof_sem: Array.from(proofBytes) }; const broadcastVoteResponse = await broadcastVote(voteRequest); @@ -137,9 +111,6 @@ export const useVoteCasting = () => { roundState, votingRound, semaphoreIdentity, - currentGroupMembers, - fetchingMembers, - isRegisteredForCurrentRound, encryptVote, broadcastVote, setTxUrl, diff --git a/examples/CRISP/client/src/model/vote.model.ts b/examples/CRISP/client/src/model/vote.model.ts index 7667715a38..9c017a61e3 100644 --- a/examples/CRISP/client/src/model/vote.model.ts +++ b/examples/CRISP/client/src/model/vote.model.ts @@ -27,7 +27,6 @@ export interface BroadcastVoteRequest { proof: number[]; public_inputs: string[]; address: string; - proof_sem: number[]; } export type VoteResponseStatus = 'success' | 'user_already_voted' | 'failed_broadcast'; diff --git a/examples/CRISP/client/src/pages/Landing/components/DailyPoll.tsx b/examples/CRISP/client/src/pages/Landing/components/DailyPoll.tsx index 1e75ac2448..f5b96de3ba 100644 --- a/examples/CRISP/client/src/pages/Landing/components/DailyPoll.tsx +++ b/examples/CRISP/client/src/pages/Landing/components/DailyPoll.tsx @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import React, { useState, useEffect } from 'react' +import React, { useState } from 'react' import { Poll } from '@/model/poll.model' import Card from '@/components/Cards/Card' import CircularTiles from '@/components/CircularTiles' @@ -14,7 +14,6 @@ import LoadingAnimation from '@/components/LoadingAnimation' import { hasPollEnded } from '@/utils/methods' import CountdownTimer from '@/components/CountdownTime' import { useModal } from 'connectkit' -import RegistrationModal from '@/components/RegistrationModal' import { useVoteCasting } from '@/hooks/voting/useVoteCasting' type DailyPollSectionProps = { @@ -28,24 +27,13 @@ const DailyPollSection: React.FC = ({ loading, endTime }) pollOptions, setPollOptions, roundState, - isRegistering, - isRegisteredForCurrentRound, - registerIdentityOnContract, - fetchingMembers, } = useVoteManagementContext() const isEnded = roundState ? hasPollEnded(roundState?.duration, roundState?.start_time) : false const [pollSelected, setPollSelected] = useState(null) const [noPollSelected, setNoPollSelected] = useState(true) const { setOpen } = useModal() - const [showRegistrationModal, setShowRegistrationModal] = useState(false) const { castVoteWithProof, isLoading: isCastingVote } = useVoteCasting() - useEffect(() => { - if (isRegisteredForCurrentRound && showRegistrationModal) { - setShowRegistrationModal(false) - } - }, [isRegisteredForCurrentRound, showRegistrationModal]) - const statusClass = !isEnded ? 'lime' : 'red' const handleChecked = (selectedPoll: Poll) => { @@ -72,10 +60,6 @@ const DailyPollSection: React.FC = ({ loading, endTime }) setOpen(true) return } - if (!isRegisteredForCurrentRound) { - setShowRegistrationModal(true) - return - } await castVoteWithProof(pollSelected) } @@ -133,14 +117,10 @@ const DailyPollSection: React.FC = ({ loading, endTime }) {noPollSelected && !isEnded &&
Select your favorite
} @@ -148,14 +128,6 @@ const DailyPollSection: React.FC = ({ loading, endTime }) )} - setShowRegistrationModal(false)} - isRegistering={isRegistering} - onRegister={() => { - registerIdentityOnContract() - }} - /> ) } diff --git a/examples/CRISP/client/src/utils/proof-encoding.ts b/examples/CRISP/client/src/utils/proof-encoding.ts index 1aa69b6426..45283b2f69 100644 --- a/examples/CRISP/client/src/utils/proof-encoding.ts +++ b/examples/CRISP/client/src/utils/proof-encoding.ts @@ -4,43 +4,19 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { hexToBytes, encodeAbiParameters, parseAbiParameters, bytesToHex } from 'viem'; -import { type SemaphoreNoirProof } from '@hashcloak/semaphore-noir-proof'; - -const abi = parseAbiParameters( - '(uint256,uint256,uint256,uint256,uint256,bytes)' -); - -export function encodeSemaphoreProof( - { merkleTreeDepth, merkleTreeRoot, nullifier, message, scope, proofBytes }: SemaphoreNoirProof -): Uint8Array { - const hex = encodeAbiParameters(abi, [ - [ - BigInt(merkleTreeDepth), - BigInt(merkleTreeRoot), - BigInt(nullifier), - BigInt(message), - BigInt(scope), - bytesToHex(proofBytes), - ] - ]); - - return hexToBytes(hex); -} +import { encodeAbiParameters, parseAbiParameters, bytesToHex } from 'viem'; const crispAbi = parseAbiParameters( - '(bytes, bytes, bytes32[], bytes)' + '(bytes, bytes32[], bytes)' ); export const encodeCrispInputs = ( - semaphoreProof: Uint8Array, noirProof: Uint8Array, noirPublicInputs: string[], encryptedVote: Uint8Array ): string => { return encodeAbiParameters(crispAbi, [ [ - bytesToHex(semaphoreProof), bytesToHex(noirProof), noirPublicInputs.map(input => input as `0x${string}`), bytesToHex(encryptedVote) diff --git a/examples/CRISP/contracts/CRISPChecker.sol b/examples/CRISP/contracts/CRISPChecker.sol deleted file mode 100644 index d29ee40287..0000000000 --- a/examples/CRISP/contracts/CRISPChecker.sol +++ /dev/null @@ -1,83 +0,0 @@ -// 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.27; - -import {BaseChecker} from "@excubiae/contracts/checker/BaseChecker.sol"; -import {ISemaphore} from "@hashcloak/semaphore-contracts-noir/interfaces/ISemaphoreNoir.sol"; - -/// @title CRISPChecker. -/// @notice Enclave Input Validator -/// @dev Extends BaseChecker for input verification. -contract CRISPChecker is BaseChecker { - /// @notice Address of the Semaphore contract used for proof verification. - ISemaphore public semaphore; - - /// @notice Unique identifier for the Semaphore group. - /// @dev Proofs are validated against this specific group ID. - uint256 public groupId; - - /// @notice custom errors - error InvalidProver(); - error InvalidGroup(); - error InvalidProof(); - - /// @notice Initializes the SemaphoreChecker with the provided Semaphore contract address and group ID. - /// @dev Decodes initialization parameters from appended bytes for clone deployments. - function _initialize() internal override { - super._initialize(); - - bytes memory data = _getAppendedBytes(); - (address _semaphore, uint256 _groupId) = abi.decode( - data, - (address, uint256) - ); - - semaphore = ISemaphore(_semaphore); - groupId = _groupId; - } - - /// @notice Validates input - /// @param subject Address to check. - /// @param evidence mock proof - /// @return True if proof is valid - function _check( - address subject, - bytes calldata evidence - ) internal view override returns (bool) { - super._check(subject, evidence); - - ISemaphore.SemaphoreNoirProof memory proof = abi.decode( - evidence, - (ISemaphore.SemaphoreNoirProof) - ); - - // The proof scope encodes both the subject address and group ID to prevent front-running attacks. - uint256 _scope = proof.scope; - - // Extract the group ID (remaining 12 bytes, 96 bits) from the scope. - uint96 _groupId = uint96(_scope & ((1 << 96) - 1)); - - if (_groupId != groupId) { - revert InvalidGroup(); - } - - /// Uncomment this to check the prover, this checks that the prover is the same as the subject - /// This is not needed for the CRISP protocol, since the subject is the relayer - /// Extract the subject's address (first 20 bytes, 160 bits) from the scope. - // =============================== - // address _prover = address(uint160(_scope >> 96)); - // if (_prover != subject) { - // revert InvalidProver(); - // } - // =============================== - - if (!semaphore.verifyProof(_scope, proof)) { - revert InvalidProof(); - } - - return true; - } -} diff --git a/examples/CRISP/contracts/CRISPCheckerFactory.sol b/examples/CRISP/contracts/CRISPCheckerFactory.sol deleted file mode 100644 index 8c41bbbec6..0000000000 --- a/examples/CRISP/contracts/CRISPCheckerFactory.sol +++ /dev/null @@ -1,34 +0,0 @@ -// 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.27; - -import {Factory} from "@excubiae/contracts/proxy/Factory.sol"; -import {CRISPChecker} from "./CRISPChecker.sol"; - -/// @title CRISPCheckerFactory -/// @notice Factory contract for deploying minimal proxy instances of CRISPChecker. -/// @dev Utilizes the Factory pattern to streamline deployment of CRISPChecker clones with configuration data. -contract CRISPCheckerFactory is Factory { - /// @notice Initializes the factory with the CRISPChecker implementation. - /// @dev The constructor sets the CRISPChecker contract as the implementation for cloning. - constructor() Factory(address(new CRISPChecker())) {} - - /// @notice Deploys a new CRISPChecker clone with the specified Semaphore contract and group ID. - /// @dev Encodes the Semaphore contract address and group ID as initialization data for the clone. - /// @param semaphore Address of the Semaphore contract. - /// @param groupId Unique identifier of the Semaphore group. - /// @return clone The address of the newly deployed CRISPChecker clone. - function deploy( - address semaphore, - uint256 groupId - ) public returns (address clone) { - bytes memory data = abi.encode(semaphore, groupId); - - clone = super._deploy(data); - - CRISPChecker(clone).initialize(); - } -} diff --git a/examples/CRISP/contracts/CRISPInputValidator.sol b/examples/CRISP/contracts/CRISPInputValidator.sol index 4eccbdd0ed..ea5a1cfe25 100644 --- a/examples/CRISP/contracts/CRISPInputValidator.sol +++ b/examples/CRISP/contracts/CRISPInputValidator.sol @@ -6,59 +6,85 @@ pragma solidity >=0.8.27; import {IInputValidator} from "@enclave-e3/contracts/contracts/interfaces/IInputValidator.sol"; -import {IBasePolicy} from "@excubiae/contracts/interfaces/IBasePolicy.sol"; import {Clone} from "@excubiae/contracts/proxy/Clone.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + import {IVerifier} from "./CRISPVerifier.sol"; /// @title CRISPInputValidator. /// @notice Enclave Input Validator -contract CRISPInputValidator is IInputValidator, Clone { - /// @notice The policy that will be used to validate the input. - IBasePolicy internal policy; - +contract CRISPInputValidator is IInputValidator, Clone, Ownable(msg.sender) { /// @notice The verifier that will be used to validate the input. IVerifier internal noirVerifier; + /// @notice The governance token address. + address public token; + /// @notice The minimum balance required to pass the validation. + uint256 public balanceThreshold; + /// @notice The block number at which the balance will be checked. + uint256 public snapshotBlock; + /// @notice The Merkle root of the census. + uint256 public censusMerkleRoot; + + /// @notice Indicates if the the round data has been set. + bool public isDataSet; + /// @notice The error emitted when the input data is empty. error EmptyInputData(); /// @notice The error emitted when the input data is invalid. error InvalidInputData(bytes reason); /// @notice The error emitted when the Noir proof is invalid. error InvalidNoirProof(); + /// @notice The error emitted when the round data is not set. + error RounDataNotSet(); + /// @notice The error emitted when trying to set the round data more than once. + error RoundDataAlreadySet(); /// @notice Initializes the contract with appended bytes data for configuration. function _initialize() internal virtual override(Clone) { super._initialize(); - (address policyAddr, address verifierAddr) = abi.decode( + (address _verifierAddr, address _owner) = abi.decode( _getAppendedBytes(), (address, address) ); - policy = IBasePolicy(policyAddr); - noirVerifier = IVerifier(verifierAddr); + + noirVerifier = IVerifier(_verifierAddr); + _transferOwnership(_owner); + } + + /// @notice Sets the Merkle root of the census. Can only be set once. + /// @param _root The Merkle root to set. + function setRoundData(uint256 _root, address _token, uint256 _balanceThreshold, uint256 _snapshotBlock) external onlyOwner { + if (isDataSet) revert RoundDataAlreadySet(); + + isDataSet = true; + token = _token; + balanceThreshold = _balanceThreshold; + snapshotBlock = _snapshotBlock; + censusMerkleRoot = _root; } /// @notice Validates input - /// @param sender The account that is submitting the input. /// @param data The input to be verified. /// @return input The decoded, policy-approved application payload. function validate( - address sender, + address, bytes memory data ) external returns (bytes memory input) { + // we need to ensure that the CRISP admin set the merkle root of the census + // @todo update this once we have all components working + // if (!isDataSet) revert RounDataNotSet(); + if (data.length == 0) revert EmptyInputData(); ( - bytes memory semaphoreProof, bytes memory noirProof, bytes32[] memory noirPublicInputs, bytes memory vote - ) = abi.decode(data, (bytes, bytes, bytes32[], bytes)); - - // Reverts if the semaphore proof is invalid - policy.enforce(sender, semaphoreProof); + ) = abi.decode(data, (bytes, bytes32[], bytes)); - // Reverts if noir proof is invalid + // Check if the ciphertext was encrypted correctly if (!noirVerifier.verify(noirProof, noirPublicInputs)) revert InvalidNoirProof(); diff --git a/examples/CRISP/contracts/CRISPInputValidatorFactory.sol b/examples/CRISP/contracts/CRISPInputValidatorFactory.sol index 7c5350fe51..92cff1bd5f 100644 --- a/examples/CRISP/contracts/CRISPInputValidatorFactory.sol +++ b/examples/CRISP/contracts/CRISPInputValidatorFactory.sol @@ -15,13 +15,12 @@ contract CRISPInputValidatorFactory is Factory { constructor(address inputValidator) Factory(inputValidator) {} /// @notice Deploys a new CRISPInputValidator clone. - /// @param _policyAddr Address of the associated policy contract. /// @param _verifierAddr Address of the associated verifier contract. function deploy( - address _policyAddr, - address _verifierAddr + address _verifierAddr, + address _owner ) public returns (address clone) { - bytes memory data = abi.encode(_policyAddr, _verifierAddr); + bytes memory data = abi.encode(_verifierAddr, _owner); clone = super._deploy(data); CRISPInputValidator(clone).initialize(); diff --git a/examples/CRISP/contracts/CRISPPolicy.sol b/examples/CRISP/contracts/CRISPPolicy.sol deleted file mode 100644 index 5c0210b5f3..0000000000 --- a/examples/CRISP/contracts/CRISPPolicy.sol +++ /dev/null @@ -1,61 +0,0 @@ -// 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.27; - -import {BasePolicy} from "@excubiae/contracts/policy/BasePolicy.sol"; -import {BaseChecker} from "@excubiae/contracts/checker/BaseChecker.sol"; -import {ISemaphore} from "@hashcloak/semaphore-contracts-noir/interfaces/ISemaphoreNoir.sol"; - -/// @title CRISPPolicy -/// @notice Policy contract for validating inputs based on Semaphore proofs and usage limits. -contract CRISPPolicy is BasePolicy { - /// Errors - error MainCalledTooManyTimes(); - error AlreadyEnforced(); - - /// State Variables - uint8 public inputLimit; - mapping(address subject => uint8 count) public enforced; - mapping(uint256 => bool) public spentNullifiers; - - /// @notice Initializes the contract with appended bytes data for configuration. - /// @dev Decodes AdvancedChecker address and sets the owner. - function _initialize() internal virtual override { - bytes memory data = _getAppendedBytes(); - (address sender, address baseCheckerAddr, uint8 _inputLimit) = abi - .decode(data, (address, address, uint8)); - _transferOwnership(sender); - - BASE_CHECKER = BaseChecker(baseCheckerAddr); - inputLimit = _inputLimit; - } - - /// @notice Internal enforcement logic: checks nullifier, input limit, and marks nullifier spent. - /// @param subject The interacting address. - /// @param evidence Abi-encoded `ISemaphore.SemaphoreProof`. - function _enforce( - address subject, - bytes calldata evidence - ) internal override(BasePolicy) onlyTarget { - ISemaphore.SemaphoreNoirProof memory proof = abi.decode( - evidence, - (ISemaphore.SemaphoreNoirProof) - ); - uint256 n = proof.nullifier; - if (spentNullifiers[n]) revert AlreadyEnforced(); - if (inputLimit > 0 && enforced[subject] == inputLimit) - revert MainCalledTooManyTimes(); - - super._enforce(subject, evidence); - spentNullifiers[n] = true; - enforced[subject]++; - } - - /// @notice Returns policy identifier "CRISPPolicy". - function trait() external pure returns (string memory) { - return "CRISPPolicy"; - } -} diff --git a/examples/CRISP/contracts/CRISPPolicyFactory.sol b/examples/CRISP/contracts/CRISPPolicyFactory.sol deleted file mode 100644 index 2d02b79711..0000000000 --- a/examples/CRISP/contracts/CRISPPolicyFactory.sol +++ /dev/null @@ -1,30 +0,0 @@ -// 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.27; - -import {Factory} from "@excubiae/contracts/proxy/Factory.sol"; -import {CRISPPolicy} from "./CRISPPolicy.sol"; - -/// @title CRISPPolicyFactory -/// @notice Factory for deploying minimal proxy instances of CRISPPolicy. -/// @dev Encodes configuration data for multi-phase policy validation. -contract CRISPPolicyFactory is Factory { - /// @notice Initializes the factory with the CRISPPolicy implementation. - constructor() Factory(address(new CRISPPolicy())) {} - - /// @notice Deploys a new CRISPPolicy clone. - /// @param _checkerAddr Address of the associated checker contract. - /// @param _inputLimit Maximum number of times that input may be submitted. - function deploy( - address _checkerAddr, - uint8 _inputLimit - ) public returns (address clone) { - bytes memory data = abi.encode(msg.sender, _checkerAddr, _inputLimit); - - clone = super._deploy(data); - CRISPPolicy(clone).initialize(); - } -} diff --git a/examples/CRISP/contracts/CRISPProgram.sol b/examples/CRISP/contracts/CRISPProgram.sol index 03f20dd37b..be22cd131a 100644 --- a/examples/CRISP/contracts/CRISPProgram.sol +++ b/examples/CRISP/contracts/CRISPProgram.sol @@ -8,12 +8,8 @@ pragma solidity >=0.8.27; import {IRiscZeroVerifier} from "risc0/IRiscZeroVerifier.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IE3Program} from "@enclave-e3/contracts/contracts/interfaces/IE3Program.sol"; -import {IBasePolicy} from "@excubiae/contracts/interfaces/IBasePolicy.sol"; -import {ISemaphore} from "@hashcloak/semaphore-contracts-noir/interfaces/ISemaphoreNoir.sol"; import {IInputValidator} from "@enclave-e3/contracts/contracts/interfaces/IInputValidator.sol"; import {IEnclave} from "@enclave-e3/contracts/contracts/interfaces/IEnclave.sol"; -import {CRISPCheckerFactory} from "./CRISPCheckerFactory.sol"; -import {CRISPPolicyFactory} from "./CRISPPolicyFactory.sol"; import {CRISPInputValidatorFactory} from "./CRISPInputValidatorFactory.sol"; import {HonkVerifier} from "./CRISPVerifier.sol"; @@ -24,20 +20,13 @@ contract CRISPProgram is IE3Program, Ownable { // State variables IEnclave public enclave; IRiscZeroVerifier public verifier; - ISemaphore public semaphore; - CRISPCheckerFactory private immutable CHECKER_FACTORY; - CRISPPolicyFactory private immutable POLICY_FACTORY; CRISPInputValidatorFactory private immutable INPUT_VALIDATOR_FACTORY; HonkVerifier private immutable HONK_VERIFIER; - uint8 public constant INPUT_LIMIT = 100; bytes32 public imageId; // Mappings mapping(address => bool) public authorizedContracts; mapping(uint256 e3Id => bytes32 paramsHash) public paramsHashes; - mapping(uint256 e3Id => uint256 groupId) public groupIds; - mapping(uint256 groupId => mapping(uint256 identityCommitment => bool)) - public committed; // Events event InputValidatorUpdated(address indexed newValidator); @@ -48,41 +37,24 @@ contract CRISPProgram is IE3Program, Ownable { error E3DoesNotExist(); error EnclaveAddressZero(); error VerifierAddressZero(); - error SemaphoreAddressZero(); - error InvalidPolicyFactory(); - error InvalidCheckerFactory(); error InvalidInputValidatorFactory(); error InvalidHonkVerifier(); - error GroupDoesNotExist(); - error AlreadyRegistered(); /// @notice Initialize the contract, binding it to a specified RISC Zero verifier. /// @param _enclave The enclave address /// @param _verifier The RISC Zero verifier address - /// @param _semaphore The Semaphore address - /// @param _checkerFactory The checker factory address - /// @param _policyFactory The policy factory address /// @param _inputValidatorFactory The input validator factory address /// @param _honkVerifier The honk verifier address /// @param _imageId The image ID for the guest program constructor( IEnclave _enclave, IRiscZeroVerifier _verifier, - ISemaphore _semaphore, - CRISPCheckerFactory _checkerFactory, - CRISPPolicyFactory _policyFactory, CRISPInputValidatorFactory _inputValidatorFactory, HonkVerifier _honkVerifier, bytes32 _imageId ) Ownable(msg.sender) { require(address(_enclave) != address(0), EnclaveAddressZero()); require(address(_verifier) != address(0), VerifierAddressZero()); - require(address(_semaphore) != address(0), SemaphoreAddressZero()); - require( - address(_checkerFactory) != address(0), - InvalidCheckerFactory() - ); - require(address(_policyFactory) != address(0), InvalidPolicyFactory()); require( address(_inputValidatorFactory) != address(0), InvalidInputValidatorFactory() @@ -91,9 +63,6 @@ contract CRISPProgram is IE3Program, Ownable { enclave = _enclave; verifier = _verifier; - semaphore = _semaphore; - CHECKER_FACTORY = _checkerFactory; - POLICY_FACTORY = _policyFactory; INPUT_VALIDATOR_FACTORY = _inputValidatorFactory; HONK_VERIFIER = _honkVerifier; authorizedContracts[address(_enclave)] = true; @@ -112,19 +81,6 @@ contract CRISPProgram is IE3Program, Ownable { verifier = _verifier; } - /// @notice Register a Member to the semaphore group - /// @param e3Id The E3 program ID - /// @param identityCommitment The identity commitment - function registerMember(uint256 e3Id, uint256 identityCommitment) external { - require(paramsHashes[e3Id] != bytes32(0), GroupDoesNotExist()); - uint256 groupId = groupIds[e3Id]; - - require(!committed[groupId][identityCommitment], AlreadyRegistered()); - committed[groupId][identityCommitment] = true; - - semaphore.addMember(groupId, identityCommitment); - } - /// @notice Get the params hash for an E3 program /// @param e3Id The E3 program ID /// @return The params hash @@ -148,27 +104,14 @@ contract CRISPProgram is IE3Program, Ownable { require(paramsHashes[e3Id] == bytes32(0), E3AlreadyInitialized()); paramsHashes[e3Id] = keccak256(e3ProgramParams); - // Create a new group - uint256 groupId = semaphore.createGroup(address(this)); - groupIds[e3Id] = groupId; - - // Deploy a new checker - address checker = CHECKER_FACTORY.deploy(address(semaphore), groupId); - - // Deploy a new policy - IBasePolicy policy = IBasePolicy( - POLICY_FACTORY.deploy(checker, INPUT_LIMIT) - ); - // Deploy a new input validator inputValidator = IInputValidator( INPUT_VALIDATOR_FACTORY.deploy( - address(policy), - address(HONK_VERIFIER) + address(HONK_VERIFIER), + owner() ) ); - policy.setTarget(address(inputValidator)); - + return (ENCRYPTION_SCHEME_ID, inputValidator); } diff --git a/examples/CRISP/deploy/Deploy.s.sol b/examples/CRISP/deploy/Deploy.s.sol index b9da39c3d1..25c7842a48 100644 --- a/examples/CRISP/deploy/Deploy.s.sol +++ b/examples/CRISP/deploy/Deploy.s.sol @@ -23,15 +23,9 @@ import {RiscZeroGroth16Verifier} from "risc0/groth16/RiscZeroGroth16Verifier.sol import {ControlID} from "risc0/groth16/ControlID.sol"; import {CRISPProgram} from "../contracts/CRISPProgram.sol"; -import {CRISPPolicy} from "../contracts/CRISPPolicy.sol"; -import {CRISPChecker} from "../contracts/CRISPChecker.sol"; -import {SemaphoreNoir} from "@hashcloak/semaphore-contracts-noir/SemaphoreNoir.sol"; -import {SemaphoreNoirVerifier} from "@hashcloak/semaphore-contracts-noir/base/SemaphoreNoirVerifier.sol"; import {IVerifier} from "@hashcloak/semaphore-contracts-noir/interfaces/ISemaphoreNoirVerifier.sol"; import {IE3Program} from "@enclave-e3/contracts/contracts/interfaces/IE3Program.sol"; import {IEnclave} from "@enclave-e3/contracts/contracts/interfaces/IEnclave.sol"; -import {CRISPCheckerFactory} from "../contracts/CRISPCheckerFactory.sol"; -import {CRISPPolicyFactory} from "../contracts/CRISPPolicyFactory.sol"; import {CRISPInputValidator} from "../contracts/CRISPInputValidator.sol"; import {MockCRISPInputValidator} from "../contracts/Mocks/MockCRISPInputValidator.sol"; import {CRISPInputValidatorFactory} from "../contracts/CRISPInputValidatorFactory.sol"; @@ -161,26 +155,6 @@ contract CRISPProgramDeploy is Script { console2.log("Enclave Address: ", address(enclave)); console2.log("Verifier Address: ", address(verifier)); - SemaphoreNoirVerifier semaphoreVerifier = new SemaphoreNoirVerifier(); - console2.log( - "Deployed SemaphoreNoirVerifier to", - address(semaphoreVerifier) - ); - - SemaphoreNoir semaphore = new SemaphoreNoir( - IVerifier(address(semaphoreVerifier)) - ); - console2.log("Deployed Semaphore to", address(semaphore)); - - CRISPCheckerFactory checkerFactory = new CRISPCheckerFactory(); - console2.log( - "Deployed CRISPCheckerFactory to", - address(checkerFactory) - ); - - CRISPPolicyFactory policyFactory = new CRISPPolicyFactory(); - console2.log("Deployed CRISPPolicyFactory to", address(policyFactory)); - bool useMockIV = vm.envOr("USE_MOCK_INPUT_VALIDATOR", false); address inputValidatorAddress; if (useMockIV) { @@ -207,9 +181,6 @@ contract CRISPProgramDeploy is Script { CRISPProgram crisp = new CRISPProgram( enclave, verifier, - semaphore, - checkerFactory, - policyFactory, inputValidatorFactory, honkVerifier, ImageID.PROGRAM_ID diff --git a/examples/CRISP/server/.env.example b/examples/CRISP/server/.env.example index 76a7898084..aa715432c6 100644 --- a/examples/CRISP/server/.env.example +++ b/examples/CRISP/server/.env.example @@ -16,7 +16,7 @@ CRON_API_KEY=1234567890 ENCLAVE_ADDRESS="0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" CIPHERNODE_REGISTRY_ADDRESS="0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" NAIVE_REGISTRY_FILTER_ADDRESS="0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" -E3_PROGRAM_ADDRESS="0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44" # CRISPProgram Contract Address +E3_PROGRAM_ADDRESS="0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1" # CRISPProgram Contract Address # E3 Config E3_WINDOW_SIZE=40 diff --git a/examples/CRISP/server/src/server/models.rs b/examples/CRISP/server/src/server/models.rs index b46c7b033d..9c394398a6 100644 --- a/examples/CRISP/server/src/server/models.rs +++ b/examples/CRISP/server/src/server/models.rs @@ -73,7 +73,6 @@ pub struct EncryptedVote { pub proof: Vec, pub public_inputs: Vec<[u8; 32]>, pub address: String, - pub proof_sem: Vec, } #[derive(Debug, Deserialize, Serialize)] diff --git a/examples/CRISP/server/src/server/routes/voting.rs b/examples/CRISP/server/src/server/routes/voting.rs index b425825935..bcf1ee7ee8 100644 --- a/examples/CRISP/server/src/server/routes/voting.rs +++ b/examples/CRISP/server/src/server/routes/voting.rs @@ -83,7 +83,6 @@ async fn broadcast_encrypted_vote( let e3_id = U256::from(vote.round_id); let params_value = DynSolValue::Tuple(vec![ - DynSolValue::Bytes(vote.proof_sem), DynSolValue::Bytes(vote.proof), public_inputs_array, DynSolValue::Bytes(vote.enc_vote_bytes), diff --git a/examples/CRISP/test/crisp.spec.ts b/examples/CRISP/test/crisp.spec.ts index 097f2c5a13..95e554920b 100644 --- a/examples/CRISP/test/crisp.spec.ts +++ b/examples/CRISP/test/crisp.spec.ts @@ -58,10 +58,6 @@ test("CRISP smoke test", async ({ .locator("[data-test-id='poll-button-0'] > [data-test-id='card']") .click(); await page.locator('button:has-text("Cast Vote")').click(); - await page.locator('button:has-text("Register Identity")').click(); - await page.waitForTimeout(1000); - await metamask.confirmTransaction(); - await page.locator('button:has-text("Cast Vote")').click(); await page.waitForTimeout(220_000); await page.locator('a:has-text("Historic polls")').click(); await expect(page.locator("h1")).toHaveText("Historic polls"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5a1110884..f85750046a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -203,9 +203,6 @@ importers: '@enclave-e3/sdk': specifier: ^0.1.3 version: 0.1.3(@types/node@22.7.5)(bufferutil@4.0.9)(rollup@4.49.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(vite@5.4.19(@types/node@22.7.5))(zod@3.25.76) - '@hashcloak/semaphore-noir-proof': - specifier: 1.0.0 - version: 1.0.0(@semaphore-protocol/group@4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@semaphore-protocol/identity@4.13.0)(@types/snarkjs@0.7.9)(bufferutil@4.0.9)(commander@13.1.0)(utf-8-validate@5.0.10) '@noir-lang/acvm_js': specifier: 1.0.0-beta.3 version: 1.0.0-beta.3 @@ -218,15 +215,6 @@ importers: '@phosphor-icons/react': specifier: ^2.1.4 version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@semaphore-protocol/data': - specifier: ^4.12.1 - version: 4.13.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@semaphore-protocol/group': - specifier: ^4.12.1 - version: 4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@semaphore-protocol/identity': - specifier: ^4.12.1 - version: 4.13.0 '@svgr/rollup': specifier: ^8.1.0 version: 8.1.0(rollup@4.49.0)(typescript@5.8.3) @@ -815,10 +803,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@aztec/bb.js@0.82.2': - resolution: {integrity: sha512-MBOHFVHOtfsknyJ1IsHH30paYqf0qLwYkiDTPyH1/KtkMwemvo5VyIgY0Dsl81KQa388MzoKhC6qnaFgERiaog==} - hasBin: true - '@aztec/bb.js@0.82.3': resolution: {integrity: sha512-jtnCqf+/QLw5yJGOmy818RMQqzHzHqcROtTdQZJybSxp0z3h76xpLSwoDQUBmZZVbP9e46FJjOLqB6gM9gY5cw==} hasBin: true @@ -1434,11 +1418,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@commander-js/extra-typings@12.1.0': - resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==} - peerDependencies: - commander: ~12.1.0 - '@conventional-changelog/git-client@1.0.1': resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} engines: {node: '>=18'} @@ -2137,16 +2116,6 @@ packages: '@hashcloak/semaphore-contracts-noir@1.0.1': resolution: {integrity: sha512-ZPDAzlBXit/HLfP/KeuXfzOg0SP2Lc8t8cx/UZ7HF1M0RSDmp1nDn6Mq9s2lLwzeP1IQRb6IYqye+BrLTXXE/A==} - '@hashcloak/semaphore-noir-artifacts@1.0.0': - resolution: {integrity: sha512-etyUmus9UeXY30lJfU/7JPkx1vDff6MsWVhacE3qAQwYUCkGwl1yNt86QZ16Jd9LncWIIbzAwA5aVJjmD7Kldw==} - hasBin: true - - '@hashcloak/semaphore-noir-proof@1.0.0': - resolution: {integrity: sha512-/G8aPTYX2OJZ6GnOXuCflqKriA3MrQGb0CP+MpewO16IpC0K1345sEpjVBI0/92ty5zdLdlXCwUyHqeJP+OFIw==} - peerDependencies: - '@semaphore-protocol/group': 4.9.1 - '@semaphore-protocol/identity': 4.9.1 - '@headlessui/react@1.7.19': resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} engines: {node: '>=10'} @@ -2175,15 +2144,6 @@ packages: resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} engines: {node: '>=10.13.0'} - '@iden3/bigarray@0.0.2': - resolution: {integrity: sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==} - - '@iden3/binfileutils@0.0.11': - resolution: {integrity: sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==} - - '@iden3/binfileutils@0.0.12': - resolution: {integrity: sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==} - '@img/sharp-darwin-arm64@0.34.3': resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2306,30 +2266,6 @@ packages: cpu: [x64] os: [win32] - '@inquirer/core@9.2.1': - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} - engines: {node: '>=18'} - - '@inquirer/figures@1.0.13': - resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} - engines: {node: '>=18'} - - '@inquirer/input@2.3.0': - resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} - engines: {node: '>=18'} - - '@inquirer/select@2.5.0': - resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} - engines: {node: '>=18'} - - '@inquirer/type@1.5.5': - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} - engines: {node: '>=18'} - - '@inquirer/type@2.0.0': - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} - engines: {node: '>=18'} - '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -2717,9 +2653,6 @@ packages: '@noir-lang/noir_js@1.0.0-beta.3': resolution: {integrity: sha512-Nt/rP7zRMOfNq9urD8+GtRpYqEc0K10FoKXs/v+ZTbGaP6Jkm7+F+UPj2bkWy66k1HNzsN6ortli7c7mnLDHwA==} - '@noir-lang/noir_wasm@1.0.0-beta.3': - resolution: {integrity: sha512-1EZCmaSYISxJIBLZN1tEyu25E7WIWAYpT3JdnVx+YCHk5uPWtXgroZSqypkpi39TVOJZT6DU/bPfrx0N1GSyog==} - '@noir-lang/noirc_abi@1.0.0-beta.3': resolution: {integrity: sha512-L6BI64ennatwTUciHqQ14ahUFsgzL41tzghqUELzO7XojasStcWDaSMjlTxca/2pvpWtEJHDtseKe1VZWIIVXQ==} @@ -3230,21 +3163,6 @@ packages: '@semaphore-protocol/contracts@4.13.0': resolution: {integrity: sha512-MZeD3CJIgHn8WnEcUvWkQjncIcfdqPwzeb6tPX3Zf0n5VhRiigxBLSuQYY5QzFNd/mzgScLO6duwOq3T1Oup+A==} - '@semaphore-protocol/data@4.13.0': - resolution: {integrity: sha512-91dgssYuh4lbcelmNe/Mbq6riXr+zFIUQnUNCq8mxbCrDeX6RnUOQFfQ5XzGF1RNJQN4+wiESzipM7SrB4mhsQ==} - - '@semaphore-protocol/group@4.13.0': - resolution: {integrity: sha512-wj2g6lAa1l2eg6U9wu9PvjtgsynWLaXnRU5GGzOBwOZkOW66VdfyIE6a7tLxrvVVyZVRylIZ0Juhlo6NJVfwAA==} - - '@semaphore-protocol/identity@4.13.0': - resolution: {integrity: sha512-lszEOQFMMI12HmDL1rzPz6OQvlW1e2QVZsbKI5K4CnPYsnIh+yZ3i5PQKnCu7slT0mmObNlPQU2cpBbe4Vo9DQ==} - - '@semaphore-protocol/utils@4.13.0': - resolution: {integrity: sha512-5F05Hfbs+zuXgIMaefgnURCSQ5GW6Q0R8Ew1L+f9eFrHOrolPE9Oz3RV1dLw0zmA6s9PlUESo2g6S73XHhkLYg==} - - '@semaphore-protocol/utils@4.9.1': - resolution: {integrity: sha512-fhiVW/CL+zU/DvKAibBh3thEg2GKTMvNEl2V+fcJYbiyjxjZPfwvVHS/tP2wxBibU8bvtfcuqAk3WFdJXYFG2A==} - '@sentry/core@9.46.0': resolution: {integrity: sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==} engines: {node: '>=18'} @@ -3672,9 +3590,6 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -3719,9 +3634,6 @@ packages: '@types/serve-static@1.15.8': resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - '@types/snarkjs@0.7.9': - resolution: {integrity: sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g==} - '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} @@ -3734,9 +3646,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3979,12 +3888,6 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - '@zk-kit/baby-jubjub@1.0.3': - resolution: {integrity: sha512-Wl+QfV6XGOMk1yU2JTqHXeKWfJVXp83is0+dtqfj9wx4wsAPpb+qzYvwAxW5PBx5/Nu71Bh7jp/5vM+6QgHSwA==} - - '@zk-kit/eddsa-poseidon@1.0.4': - resolution: {integrity: sha512-w0HrF5F+Kh+77+VK/p9qzB7wvitiZMAoWnqrmzPUM+MWlaNp0ipmtuO8KTLxnj8ACjt98GAK4voxl7XeWjC4XQ==} - '@zk-kit/lean-imt.sol@2.0.0': resolution: {integrity: sha512-e9pAm+IXveLPy7b1h05ipIo6U44vp8g/2E+Ocx3PIloMu7lgTXFkIeZj/qZ/iLgEMsF74T0dsg7aVIT0B0nsDA==} @@ -3994,12 +3897,6 @@ packages: '@zk-kit/lean-imt@2.2.4': resolution: {integrity: sha512-uoRl99DID9Z5EuhfecDuIGP0KLrGEndVH0+texwVQBmlXTvve+grkKT4w06C+VFzRmfYNVuRo9tXvqIzQ3dqPA==} - '@zk-kit/utils@1.2.1': - resolution: {integrity: sha512-H2nTsyWdicVOyvqC5AjgU7tsTgmR6PDrruFJNmlmdhKp7RxEia/E1B1swMZjaasYa2QMp4Zc6oB7cWchty7B2Q==} - - '@zk-kit/utils@1.3.0': - resolution: {integrity: sha512-Gqsq5KLDf2WPuZSsNc2KZy25XeK5d5UV9hwLaPEM5wq+GD2qCi1ZBFzNs0OptiJ9GRGtP2J/xptrszWri+pRqQ==} - '@zk-kit/utils@1.4.1': resolution: {integrity: sha512-IoXzy3ElfkvRfC/s6uk3eFQO8uxkCdAOVxKlJlaEjM7pgckX5AK46Q+7n5yMQD/v/o6OL0mMtet065o5EpUocA==} @@ -4106,10 +4003,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} @@ -4259,15 +4152,9 @@ packages: axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - axios@1.6.6: - resolution: {integrity: sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==} - axios@1.6.7: resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -4316,10 +4203,6 @@ packages: peerDependencies: ajv: 4.11.8 - 8 - bfj@7.1.0: - resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} - engines: {node: '>= 8.0.0'} - big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -4339,18 +4222,9 @@ packages: binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - blake2b-wasm@2.4.0: - resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} - bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} @@ -4592,12 +4466,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - check-types@11.2.3: - resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} - - child_process@1.0.2: - resolution: {integrity: sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4614,33 +4482,6 @@ packages: resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} engines: {node: '>= 0.10'} - circom_runtime@0.1.21: - resolution: {integrity: sha512-qTkud630B/GK8y76hnOaaS1aNuF6prfV0dTrkeRsiJKnlP1ryQbP2FWLgDOPqn6aKyaPlam+Z+DTbBhkEzh8dA==} - hasBin: true - - circom_runtime@0.1.25: - resolution: {integrity: sha512-xBGsBFF5Uv6AKvbpgExYqpHfmfawH2HKe+LyjfKSRevqEV8u63i9KGHVIILsbJNW+0c5bm/66f0PUYQ7qZSkJA==} - hasBin: true - - circom_tester@0.0.19: - resolution: {integrity: sha512-SNHaBsGxcBH6XsVWfsRbRPA7NF8m8AMKJI9dtJJCFGUtOTT2+zsoIqAwi50z6XCnO4TtjyXq7AeXa1PLHqT0tw==} - - circomkit@0.2.1: - resolution: {integrity: sha512-7O8QsOLUq2QvwGMimvWxwdg7OgV33OT7ZBND+81dv3JrVp8ove93yV16jF3TW6XBncSY92/Aka8F4CAi/H9VQw==} - engines: {node: '>=12.0.0'} - hasBin: true - peerDependencies: - '@types/snarkjs': ^0.7.x - snarkjs: ^0.7.x - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} engines: {node: '>=6'} @@ -4649,10 +4490,6 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -4674,10 +4511,6 @@ packages: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -5231,9 +5064,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -5375,11 +5205,6 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - electron-to-chromium@1.5.209: resolution: {integrity: sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==} @@ -5490,11 +5315,6 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true - escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} @@ -5535,11 +5355,6 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@1.2.2: - resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} - engines: {node: '>=0.4.0'} - hasBin: true - esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} @@ -5562,10 +5377,6 @@ packages: resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} engines: {node: '>=0.10.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -5639,10 +5450,6 @@ packages: ethers@5.8.0: resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} - ethers@6.13.4: - resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} - engines: {node: '>=14.0.0'} - ethers@6.13.5: resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} engines: {node: '>=14.0.0'} @@ -5749,9 +5556,6 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fastfile@0.0.20: - resolution: {integrity: sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==} - fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -5767,15 +5571,6 @@ packages: picomatch: optional: true - ffjavascript@0.2.56: - resolution: {integrity: sha512-em6G5Lrj7ucIqj4TYEgyoHs/j99Urwwqa4+YxEVY2hggnpRimVj+noX5pZQTxI1pvtiekZI4rG65JBf0xraXrg==} - - ffjavascript@0.2.63: - resolution: {integrity: sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==} - - ffjavascript@0.3.0: - resolution: {integrity: sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==} - fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -5783,9 +5578,6 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - filename-reserved-regex@2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} @@ -5849,9 +5641,6 @@ packages: fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} - fnv-plus@1.3.1: - resolution: {integrity: sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==} - focus-visible@5.2.1: resolution: {integrity: sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==} @@ -6268,10 +6057,6 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hoopy@0.1.4: - resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} - engines: {node: '>= 6.0.0'} - hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6478,10 +6263,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -6568,11 +6349,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -6673,9 +6449,6 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonpath@1.1.1: - resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} - jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -6821,13 +6594,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - - logplease@1.2.15: - resolution: {integrity: sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -7210,10 +6976,6 @@ packages: resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -7312,16 +7074,9 @@ packages: murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoassert@2.0.0: - resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7514,10 +7269,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -7530,10 +7281,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - ordinal@1.0.3: resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} @@ -8056,12 +7803,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - r1csfile@0.0.41: - resolution: {integrity: sha512-Q1WDF3u1vYeAwjHo4YuddkA8Aq0TulbKjmGm99+Atn13Lf5fTsMZBnBV9T741w8iSyPFG6Uh6sapQby77sREqA==} - - r1csfile@0.0.48: - resolution: {integrity: sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==} - radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -8322,10 +8063,6 @@ packages: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -8539,14 +8276,6 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - snarkjs@0.5.0: - resolution: {integrity: sha512-KWz8mZ2Y+6wvn6GGkQo6/ZlKwETdAGohd40Lzpwp5TUZCn6N6O4Az1SuX1rw/qREGL6Im+ycb19suCFE8/xaKA==} - hasBin: true - - snarkjs@0.7.4: - resolution: {integrity: sha512-x4cOCR4YXSyBlLtfnUUwfbZrw8wFd/Y0lk83eexJzKwZB8ELdpH+10ts8YtDsm2/a3WK7c7p514bbE8NpqxW8w==} - hasBin: true - socket.io-client@4.8.1: resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} engines: {node: '>=10.0.0'} @@ -8644,9 +8373,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - static-eval@2.0.2: - resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} - statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -8918,13 +8644,6 @@ packages: resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} engines: {node: '>=0.10.0'} - tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - to-buffer@1.2.1: resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} engines: {node: '>= 0.4'} @@ -8964,9 +8683,6 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tryer@1.0.1: - resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -9076,10 +8792,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -9135,9 +8847,6 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - underscore@1.12.1: - resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -9575,24 +9284,9 @@ packages: resolution: {integrity: sha512-P9exD4YkjpDbw68xUhF3MDm/CC/3eTmmthyG5bHJ56kalxOTewOunxTke4SyF8MTXV6jUtNjXggPgrGmMtczGg==} hasBin: true - wasmbuilder@0.0.16: - resolution: {integrity: sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==} - - wasmcurves@0.2.0: - resolution: {integrity: sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==} - - wasmcurves@0.2.2: - resolution: {integrity: sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-worker@1.2.0: - resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} - web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} @@ -9816,10 +9510,6 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - zksync-ethers@5.10.0: resolution: {integrity: sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==} engines: {node: '>=16.0.0'} @@ -9900,17 +9590,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.30 - '@aztec/bb.js@0.82.2': - dependencies: - comlink: 4.4.2 - commander: 12.1.0 - debug: 4.4.1(supports-color@5.5.0) - fflate: 0.8.2 - pako: 2.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - '@aztec/bb.js@0.82.3': dependencies: comlink: 4.4.2 @@ -10766,10 +10445,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commander-js/extra-typings@12.1.0(commander@13.1.0)': - dependencies: - commander: 13.1.0 - '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)': dependencies: '@types/semver': 7.7.1 @@ -11534,38 +11209,6 @@ snapshots: dependencies: '@zk-kit/lean-imt.sol': 2.0.0 - '@hashcloak/semaphore-noir-artifacts@1.0.0(@types/snarkjs@0.7.9)(commander@13.1.0)': - dependencies: - '@commander-js/extra-typings': 12.1.0(commander@13.1.0) - '@inquirer/input': 2.3.0 - '@inquirer/select': 2.5.0 - '@noir-lang/noir_js': 1.0.0-beta.3 - circomkit: 0.2.1(@types/snarkjs@0.7.9)(snarkjs@0.7.4) - ora: 5.4.1 - snarkjs: 0.7.4 - transitivePeerDependencies: - - '@types/snarkjs' - - commander - - '@hashcloak/semaphore-noir-proof@1.0.0(@semaphore-protocol/group@4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@semaphore-protocol/identity@4.13.0)(@types/snarkjs@0.7.9)(bufferutil@4.0.9)(commander@13.1.0)(utf-8-validate@5.0.10)': - dependencies: - '@aztec/bb.js': 0.82.2 - '@noir-lang/noir_js': 1.0.0-beta.3 - '@noir-lang/noir_wasm': 1.0.0-beta.3 - '@semaphore-protocol/group': 4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@semaphore-protocol/identity': 4.13.0 - '@semaphore-protocol/utils': 4.9.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@zk-kit/artifacts': '@hashcloak/semaphore-noir-artifacts@1.0.0(@types/snarkjs@0.7.9)(commander@13.1.0)' - '@zk-kit/utils': 1.3.0 - ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - snarkjs: 0.7.4 - transitivePeerDependencies: - - '@types/snarkjs' - - bufferutil - - commander - - supports-color - - utf-8-validate - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11589,18 +11232,6 @@ snapshots: '@hutson/parse-repository-url@5.0.0': {} - '@iden3/bigarray@0.0.2': {} - - '@iden3/binfileutils@0.0.11': - dependencies: - fastfile: 0.0.20 - ffjavascript: 0.2.63 - - '@iden3/binfileutils@0.0.12': - dependencies: - fastfile: 0.0.20 - ffjavascript: 0.3.0 - '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.0 @@ -11687,44 +11318,6 @@ snapshots: '@img/sharp-win32-x64@0.34.3': optional: true - '@inquirer/core@9.2.1': - dependencies: - '@inquirer/figures': 1.0.13 - '@inquirer/type': 2.0.0 - '@types/mute-stream': 0.0.4 - '@types/node': 22.7.5 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - - '@inquirer/figures@1.0.13': {} - - '@inquirer/input@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - - '@inquirer/select@2.5.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.13 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 - - '@inquirer/type@1.5.5': - dependencies: - mute-stream: 1.0.0 - - '@inquirer/type@2.0.0': - dependencies: - mute-stream: 1.0.0 - '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -12205,11 +11798,6 @@ snapshots: '@noir-lang/noirc_abi': 1.0.0-beta.3 '@noir-lang/types': 1.0.0-beta.3 - '@noir-lang/noir_wasm@1.0.0-beta.3': - dependencies: - '@noir-lang/types': 1.0.0-beta.3 - pako: 2.1.0 - '@noir-lang/noirc_abi@1.0.0-beta.3': dependencies: '@noir-lang/types': 1.0.0-beta.3 @@ -13086,50 +12674,6 @@ snapshots: dependencies: '@zk-kit/lean-imt.sol': 2.0.1 - '@semaphore-protocol/data@4.13.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@semaphore-protocol/utils': 4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@zk-kit/utils': 1.3.0 - axios: 1.6.6 - ethers: 6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - viem: 2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - debug - - typescript - - utf-8-validate - - zod - - '@semaphore-protocol/group@4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - '@zk-kit/lean-imt': 2.2.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@zk-kit/utils': 1.3.0 - poseidon-lite: 0.3.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@semaphore-protocol/identity@4.13.0': - dependencies: - '@zk-kit/baby-jubjub': 1.0.3 - '@zk-kit/eddsa-poseidon': 1.0.4 - '@zk-kit/utils': 1.3.0 - poseidon-lite: 0.3.0 - - '@semaphore-protocol/utils@4.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@semaphore-protocol/utils@4.9.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@sentry/core@9.46.0': {} '@sideway/address@4.1.5': @@ -13678,10 +13222,6 @@ snapshots: '@types/ms@2.1.0': {} - '@types/mute-stream@0.0.4': - dependencies: - '@types/node': 22.7.5 - '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -13728,8 +13268,6 @@ snapshots: '@types/node': 22.7.5 '@types/send': 0.17.5 - '@types/snarkjs@0.7.9': {} - '@types/tinycolor2@1.4.6': {} '@types/trusted-types@2.0.7': {} @@ -13738,8 +13276,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/wrap-ansi@3.0.0': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -14537,17 +14073,6 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@zk-kit/baby-jubjub@1.0.3': - dependencies: - '@zk-kit/utils': 1.2.1 - - '@zk-kit/eddsa-poseidon@1.0.4': - dependencies: - '@zk-kit/baby-jubjub': 1.0.3 - '@zk-kit/utils': 1.2.1 - buffer: 6.0.3 - poseidon-lite: 0.3.0 - '@zk-kit/lean-imt.sol@2.0.0': dependencies: poseidon-solidity: 0.0.5 @@ -14563,14 +14088,6 @@ snapshots: - bufferutil - utf-8-validate - '@zk-kit/utils@1.2.1': - dependencies: - buffer: 6.0.3 - - '@zk-kit/utils@1.3.0': - dependencies: - buffer: 6.0.3 - '@zk-kit/utils@1.4.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: buffer: 6.0.3 @@ -14673,10 +14190,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@3.0.1: {} ansi-regex@5.0.1: {} @@ -14806,14 +14319,6 @@ snapshots: transitivePeerDependencies: - debug - axios@1.6.6: - dependencies: - follow-redirects: 1.15.11(debug@4.4.1) - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.6.7: dependencies: follow-redirects: 1.15.11(debug@4.4.1) @@ -14822,8 +14327,6 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.6.7: {} - babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.28.3 @@ -14887,14 +14390,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - bfj@7.1.0: - dependencies: - bluebird: 3.7.2 - check-types: 11.2.3 - hoopy: 0.1.4 - jsonpath: 1.1.1 - tryer: 1.0.1 - big-integer@1.6.52: {} big.js@6.2.2: {} @@ -14914,21 +14409,8 @@ snapshots: buffers: 0.1.1 chainsaw: 0.1.0 - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - blake2b-wasm@2.4.0: - dependencies: - b4a: 1.6.7 - nanoassert: 2.0.0 - bluebird@3.4.7: {} - bluebird@3.7.2: {} - bn.js@4.11.6: {} bn.js@4.12.2: {} @@ -15200,10 +14682,6 @@ snapshots: check-error@2.1.1: {} - check-types@11.2.3: {} - - child_process@1.0.2: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -15227,39 +14705,6 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - circom_runtime@0.1.21: - dependencies: - ffjavascript: 0.2.56 - - circom_runtime@0.1.25: - dependencies: - ffjavascript: 0.3.0 - - circom_tester@0.0.19: - dependencies: - chai: 4.5.0 - child_process: 1.0.2 - ffjavascript: 0.2.63 - fnv-plus: 1.3.1 - r1csfile: 0.0.41 - snarkjs: 0.5.0 - tmp-promise: 3.0.3 - util: 0.12.5 - - circomkit@0.2.1(@types/snarkjs@0.7.9)(snarkjs@0.7.4): - dependencies: - '@types/snarkjs': 0.7.9 - circom_tester: 0.0.19 - commander: 12.1.0 - loglevel: 1.9.2 - snarkjs: 0.7.4 - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} - cli-table3@0.5.1: dependencies: object-assign: 4.1.1 @@ -15273,8 +14718,6 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - cli-width@4.1.0: {} - client-only@0.0.1: {} clipboardy@1.2.2: @@ -15306,8 +14749,6 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - clone@1.0.4: {} - clsx@1.2.1: {} clsx@2.1.1: {} @@ -15911,10 +15352,6 @@ snapshots: deepmerge@4.3.1: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 - defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -16053,10 +15490,6 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: - dependencies: - jake: 10.9.4 - electron-to-chromium@1.5.209: {} elkjs@0.9.3: {} @@ -16224,15 +15657,6 @@ snapshots: escape-string-regexp@5.0.0: {} - escodegen@1.14.3: - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - escodegen@1.8.1: dependencies: esprima: 2.7.3 @@ -16310,8 +15734,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 - esprima@1.2.2: {} - esprima@2.7.3: {} esprima@4.0.1: {} @@ -16326,8 +15748,6 @@ snapshots: estraverse@1.9.3: {} - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-util-attach-comments@2.1.1: @@ -16470,19 +15890,6 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 22.7.5 - aes-js: 4.0.0-beta.5 - tslib: 2.7.0 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -16637,8 +16044,6 @@ snapshots: fast-uri@3.1.0: {} - fastfile@0.0.20: {} - fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -16651,34 +16056,12 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - ffjavascript@0.2.56: - dependencies: - wasmbuilder: 0.0.16 - wasmcurves: 0.2.0 - web-worker: 1.5.0 - - ffjavascript@0.2.63: - dependencies: - wasmbuilder: 0.0.16 - wasmcurves: 0.2.2 - web-worker: 1.2.0 - - ffjavascript@0.3.0: - dependencies: - wasmbuilder: 0.0.16 - wasmcurves: 0.2.2 - web-worker: 1.2.0 - fflate@0.8.2: {} file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - filename-reserved-regex@2.0.0: {} filenamify@4.3.0: @@ -16750,8 +16133,6 @@ snapshots: dependencies: imul: 1.0.1 - fnv-plus@1.3.1: {} - focus-visible@5.2.1: {} follow-redirects@1.15.11(debug@4.4.1): @@ -17406,8 +16787,6 @@ snapshots: dependencies: react-is: 16.13.1 - hoopy@0.1.4: {} - hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -17576,8 +16955,6 @@ snapshots: is-hexadecimal@2.0.1: {} - is-interactive@1.0.0: {} - is-nan@1.3.2: dependencies: call-bind: 1.0.8 @@ -17648,12 +17025,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 - javascript-natural-sort@0.7.1: {} jest-diff@29.7.0: @@ -17735,12 +17106,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonpath@1.1.1: - dependencies: - esprima: 1.2.2 - static-eval: 2.0.2 - underscore: 1.12.1 - jsonpointer@5.0.1: {} jsonschema@1.5.0: {} @@ -17872,10 +17237,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loglevel@1.9.2: {} - - logplease@1.2.15: {} - longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -18676,8 +18037,6 @@ snapshots: dependencies: mime-db: 1.54.0 - mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} mimic-response@3.1.0: {} @@ -18796,16 +18155,12 @@ snapshots: fmix: 0.1.0 imul: 1.0.1 - mute-stream@1.0.0: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - nanoassert@2.0.0: {} - nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -19059,10 +18414,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -19085,18 +18436,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - ordinal@1.0.3: {} os-browserify@0.3.0: {} @@ -19567,20 +18906,6 @@ snapshots: quick-lru@5.1.1: {} - r1csfile@0.0.41: - dependencies: - '@iden3/bigarray': 0.0.2 - '@iden3/binfileutils': 0.0.11 - fastfile: 0.0.20 - ffjavascript: 0.2.56 - - r1csfile@0.0.48: - dependencies: - '@iden3/bigarray': 0.0.2 - '@iden3/binfileutils': 0.0.12 - fastfile: 0.0.20 - ffjavascript: 0.3.0 - radix3@1.1.2: {} randombytes@2.1.0: @@ -19901,11 +19226,6 @@ snapshots: dependencies: lowercase-keys: 3.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - reusify@1.1.0: {} rfdc@1.4.1: {} @@ -20206,32 +19526,6 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - snarkjs@0.5.0: - dependencies: - '@iden3/binfileutils': 0.0.11 - bfj: 7.1.0 - blake2b-wasm: 2.4.0 - circom_runtime: 0.1.21 - ejs: 3.1.10 - fastfile: 0.0.20 - ffjavascript: 0.2.56 - js-sha3: 0.8.0 - logplease: 1.2.15 - r1csfile: 0.0.41 - - snarkjs@0.7.4: - dependencies: - '@iden3/binfileutils': 0.0.12 - bfj: 7.1.0 - blake2b-wasm: 2.4.0 - circom_runtime: 0.1.25 - ejs: 3.1.10 - fastfile: 0.0.20 - ffjavascript: 0.3.0 - js-sha3: 0.8.0 - logplease: 1.2.15 - r1csfile: 0.0.48 - socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 @@ -20367,10 +19661,6 @@ snapshots: stackback@0.0.2: {} - static-eval@2.0.2: - dependencies: - escodegen: 1.14.3 - statuses@2.0.1: {} statuses@2.0.2: {} @@ -20691,12 +19981,6 @@ snapshots: titleize@1.0.0: {} - tmp-promise@3.0.3: - dependencies: - tmp: 0.2.5 - - tmp@0.2.5: {} - to-buffer@1.2.1: dependencies: isarray: 2.0.5 @@ -20729,8 +20013,6 @@ snapshots: trough@2.2.0: {} - tryer@1.0.1: {} - ts-api-utils@1.4.3(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -20848,8 +20130,6 @@ snapshots: type-fest@0.20.2: {} - type-fest@0.21.3: {} - type-fest@1.4.0: {} type-fest@4.41.0: {} @@ -20903,8 +20183,6 @@ snapshots: uncrypto@0.1.3: {} - underscore@1.12.1: {} - undici-types@6.19.8: {} undici@5.29.0: @@ -21412,24 +20690,8 @@ snapshots: transitivePeerDependencies: - debug - wasmbuilder@0.0.16: {} - - wasmcurves@0.2.0: - dependencies: - wasmbuilder: 0.0.16 - - wasmcurves@0.2.2: - dependencies: - wasmbuilder: 0.0.16 - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - web-namespaces@2.0.1: {} - web-worker@1.2.0: {} - web-worker@1.5.0: {} web3-utils@1.10.4: @@ -21636,8 +20898,6 @@ snapshots: yocto-queue@1.2.1: {} - yoctocolors-cjs@2.1.3: {} - zksync-ethers@5.10.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) From 829ddfc0935ddb832bec455db347ca3c03bb65a7 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 10 Oct 2025 19:29:04 +0100 Subject: [PATCH 2/4] chore: remove last semaphore mention --- .../voteManagement/VoteManagement.context.tsx | 21 ------------------- .../voteManagement/VoteManagement.types.ts | 2 -- .../client/src/hooks/voting/useVoteCasting.ts | 6 ++---- examples/CRISP/contracts/README.md | 2 +- examples/CRISP/deploy/Deploy.s.sol | 1 - examples/CRISP/package.json | 1 - examples/CRISP/remappings.txt | 1 - pnpm-lock.yaml | 10 --------- 8 files changed, 3 insertions(+), 41 deletions(-) diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx b/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx index 20cb58434e..21fed90add 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.context.tsx @@ -9,7 +9,6 @@ import { VoteManagementContextType, VoteManagementProviderProps } from '@/contex import { useWebAssemblyHook } from '@/hooks/wasm/useWebAssembly' import { useEffect, useState } from 'react' import { useAccount } from 'wagmi' -import { Identity } from '@semaphore-protocol/identity' import { VoteStateLite, VotingRound } from '@/model/vote.model' import { useEnclaveServer } from '@/hooks/enclave/useEnclaveServer' import { convertPollData, convertTimestampToDate } from '@/utils/methods' @@ -28,7 +27,6 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { /** * Voting Management States **/ - const [semaphoreIdentity, setSemaphoreIdentity] = useState(null) const [user, setUser] = useState<{ address: string } | null>(null) const [roundState, setRoundState] = useState(null) const [votingRound, setVotingRound] = useState(null) @@ -106,24 +104,6 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { setIsLoading(false) }, [wasmLoading, enclaveLoading]) - useEffect(() => { - if (!(votingRound?.round_id == null) && user?.address) { - // TODO: important: generate this from signature entropy and store encrypted in browser storage based on a password - const seedString = `semaphore-identity-${user.address}-${votingRound.round_id}` - try { - const identity = new Identity(seedString) - setSemaphoreIdentity(identity) - console.log('Deterministic Semaphore identity generated.') - } catch (error) { - console.error('Failed to generate deterministic Semaphore identity.', error) - setSemaphoreIdentity(null) - } - } else { - setSemaphoreIdentity(null) - console.log('No round ID or user address found, Semaphore identity set to null.') - } - }, [user?.address, votingRound?.round_id]) - useEffect(() => { if (isConnected && address) { setUser({ address }) @@ -137,7 +117,6 @@ const VoteManagementProvider = ({ children }: VoteManagementProviderProps) => { value={{ isLoading, user, - semaphoreIdentity, votingRound, roundEndDate, pollOptions, diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index 556f57c377..042a367242 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -7,12 +7,10 @@ import { ReactNode } from 'react' import { BroadcastVoteRequest, BroadcastVoteResponse, VoteStateLite, VotingRound, EncryptedVote } from '@/model/vote.model' import { Poll, PollRequestResult, PollResult } from '@/model/poll.model' -import { Identity } from '@semaphore-protocol/identity' export type VoteManagementContextType = { isLoading: boolean user: { address: string } | null - semaphoreIdentity: Identity | null votingRound: VotingRound | null roundEndDate: Date | null pollOptions: Poll[] diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index fd935c1fcc..9d3db15744 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -16,7 +16,6 @@ export const useVoteCasting = () => { user, roundState, votingRound, - semaphoreIdentity, encryptVote, broadcastVote, setTxUrl, @@ -40,8 +39,8 @@ export const useVoteCasting = () => { showToast({ type: 'danger', message: 'Please select a poll option first.' }); return; } - if (!user || !roundState || !semaphoreIdentity) { - console.error("Cannot cast vote: Missing user, round state, or identity."); + if (!user || !roundState) { + console.error("Cannot cast vote: Missing user or round state."); showToast({ type: 'danger', message: 'Cannot cast vote. Ensure you are connected, and the round is active.' }); return; } @@ -110,7 +109,6 @@ export const useVoteCasting = () => { user, roundState, votingRound, - semaphoreIdentity, encryptVote, broadcastVote, setTxUrl, diff --git a/examples/CRISP/contracts/README.md b/examples/CRISP/contracts/README.md index dd099e3ada..145108f1ee 100644 --- a/examples/CRISP/contracts/README.md +++ b/examples/CRISP/contracts/README.md @@ -18,6 +18,6 @@ It exposes two main functions: The input validator contract is used to validate the input data that is submitted to the E3 instance. It is called by the Enclave contract when a new input is published (`Enclave.publishInput`). In CRISP, the data providers (the ones submitting the inputs) are the voters, and the input submitted is the vote itself. -The validator checks that gating conditions are satisfied (uses [Semaphore](https://semaphore.pse.dev/) by default) and that the ciphertext is constructed correctly using [Greco](https://github.com/gnosisguild/enclave/tree/main/packages/circuits/crates/libs/greco). See the Greco [paper](https://eprint.iacr.org/2024/594). +The validator checks that gating conditions are satisfied and that the ciphertext is constructed correctly using [Greco](https://github.com/gnosisguild/enclave/tree/main/packages/circuits/crates/libs/greco). See the Greco [paper](https://eprint.iacr.org/2024/594). diff --git a/examples/CRISP/deploy/Deploy.s.sol b/examples/CRISP/deploy/Deploy.s.sol index 25c7842a48..aac97e4098 100644 --- a/examples/CRISP/deploy/Deploy.s.sol +++ b/examples/CRISP/deploy/Deploy.s.sol @@ -23,7 +23,6 @@ import {RiscZeroGroth16Verifier} from "risc0/groth16/RiscZeroGroth16Verifier.sol import {ControlID} from "risc0/groth16/ControlID.sol"; import {CRISPProgram} from "../contracts/CRISPProgram.sol"; -import {IVerifier} from "@hashcloak/semaphore-contracts-noir/interfaces/ISemaphoreNoirVerifier.sol"; import {IE3Program} from "@enclave-e3/contracts/contracts/interfaces/IE3Program.sol"; import {IEnclave} from "@enclave-e3/contracts/contracts/interfaces/IEnclave.sol"; import {CRISPInputValidator} from "../contracts/CRISPInputValidator.sol"; diff --git a/examples/CRISP/package.json b/examples/CRISP/package.json index 817c04fe79..9320528ab0 100644 --- a/examples/CRISP/package.json +++ b/examples/CRISP/package.json @@ -26,7 +26,6 @@ }, "dependencies": { "@excubiae/contracts": "^0.4.0", - "@hashcloak/semaphore-contracts-noir": "1.0.1", "@enclave-e3/sdk": "^0.1.3", "@enclave-e3/contracts": "^0.1.3", "@zk-kit/lean-imt.sol": "2.0.0", diff --git a/examples/CRISP/remappings.txt b/examples/CRISP/remappings.txt index 2cfa5adb37..a4b388e869 100644 --- a/examples/CRISP/remappings.txt +++ b/examples/CRISP/remappings.txt @@ -5,6 +5,5 @@ risc0/=lib/risc0-ethereum/contracts/src/ @enclave-e3/contracts/=node_modules/@enclave-e3/contracts/ @excubiae/contracts/=node_modules/@excubiae/contracts/ solady/=node_modules/solady/ -@hashcloak/semaphore-contracts-noir/=node_modules/@hashcloak/semaphore-contracts-noir/ @zk-kit/lean-imt.sol=node_modules/@zk-kit/lean-imt.sol poseidon-solidity/=node_modules/poseidon-solidity/ \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f85750046a..24d3296028 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,9 +88,6 @@ importers: '@excubiae/contracts': specifier: ^0.4.0 version: 0.4.0 - '@hashcloak/semaphore-contracts-noir': - specifier: 1.0.1 - version: 1.0.1 '@zk-kit/lean-imt.sol': specifier: 2.0.0 version: 2.0.0 @@ -2113,9 +2110,6 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@hashcloak/semaphore-contracts-noir@1.0.1': - resolution: {integrity: sha512-ZPDAzlBXit/HLfP/KeuXfzOg0SP2Lc8t8cx/UZ7HF1M0RSDmp1nDn6Mq9s2lLwzeP1IQRb6IYqye+BrLTXXE/A==} - '@headlessui/react@1.7.19': resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} engines: {node: '>=10'} @@ -11205,10 +11199,6 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hashcloak/semaphore-contracts-noir@1.0.1': - dependencies: - '@zk-kit/lean-imt.sol': 2.0.0 - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) From f29a23d273eb5388c1c23e976acdfc9f3d9e9e20 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 10 Oct 2025 19:48:04 +0100 Subject: [PATCH 3/4] chore: coderabbit comments --- examples/CRISP/.gitignore | 2 -- examples/CRISP/contracts/CRISPInputValidator.sol | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/CRISP/.gitignore b/examples/CRISP/.gitignore index 6e1c55b0c6..99c0e6ea24 100644 --- a/examples/CRISP/.gitignore +++ b/examples/CRISP/.gitignore @@ -48,5 +48,3 @@ playwright-report/ .enclave/config/ .enclave/caches/ cache_hardhat/ - -!sdk/src/artifacts/ERC20Votes.json diff --git a/examples/CRISP/contracts/CRISPInputValidator.sol b/examples/CRISP/contracts/CRISPInputValidator.sol index ea5a1cfe25..50c8b099f1 100644 --- a/examples/CRISP/contracts/CRISPInputValidator.sol +++ b/examples/CRISP/contracts/CRISPInputValidator.sol @@ -36,7 +36,7 @@ contract CRISPInputValidator is IInputValidator, Clone, Ownable(msg.sender) { /// @notice The error emitted when the Noir proof is invalid. error InvalidNoirProof(); /// @notice The error emitted when the round data is not set. - error RounDataNotSet(); + error RoundDataNotSet(); /// @notice The error emitted when trying to set the round data more than once. error RoundDataAlreadySet(); @@ -74,7 +74,7 @@ contract CRISPInputValidator is IInputValidator, Clone, Ownable(msg.sender) { ) external returns (bytes memory input) { // we need to ensure that the CRISP admin set the merkle root of the census // @todo update this once we have all components working - // if (!isDataSet) revert RounDataNotSet(); + // if (!isDataSet) revert RoundDataNotSet(); if (data.length == 0) revert EmptyInputData(); From 23fff2fb9293ad3e80afd9ff9ec23148a248c7ad Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Sun, 12 Oct 2025 14:37:01 +0100 Subject: [PATCH 4/4] chore: remove commented tests --- examples/CRISP/tests/crisp.contracts.test.ts | 186 ------------------- 1 file changed, 186 deletions(-) diff --git a/examples/CRISP/tests/crisp.contracts.test.ts b/examples/CRISP/tests/crisp.contracts.test.ts index 5d7b004e6f..ed43edd985 100644 --- a/examples/CRISP/tests/crisp.contracts.test.ts +++ b/examples/CRISP/tests/crisp.contracts.test.ts @@ -3,193 +3,7 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -// import { EnclaveSDK, FheProtocol } from "@enclave-e3/sdk" -// import { Enclave, Enclave__factory as EnclaveFactory } from "@enclave-e3/contracts/types" -// import { expect } from "chai" -// import fs from "fs" -// import path from "path" -// import { Signer, AbiCoder } from "ethers" -// import { SemaphoreEthers } from '@semaphore-protocol/data'; -// import { Group, generateNoirProof, SemaphoreNoirProof, initSemaphoreNoirBackend, Identity } from '@semaphore-protocol/core'; -// import dotenv from "dotenv" -// import { hexToBytes, encodeAbiParameters, parseAbiParameters, bytesToHex } from 'viem'; -// import { CRISPProgram, CRISPProgram__factory as CRISPProgramFactory } from "../types" -// import { ethers } from "hardhat" -// dotenv.config() - -// const rpcUrl = process.env.RPC_URL ?? "http://localhost:8545" - -// interface Round { -// id: number -// } - -// interface State { -// id: number -// chain_id: number -// enclave_address: string -// status: string -// vote_count: number -// start_time: number -// duration: number -// expiration: number -// start_block: number -// committee_public_key: Uint8Array -// emojis: string[2] -// } - -// const merkleTreeDepth = 10 -// const semaphoreIdentity = new Identity() - -// const abi = parseAbiParameters( -// '(uint256,uint256,uint256,uint256,uint256,bytes)' -// ); - -// export function encodeSemaphoreProof( -// { merkleTreeDepth, merkleTreeRoot, nullifier, message, scope, proofBytes }: SemaphoreNoirProof -// ): Uint8Array { -// const hex = encodeAbiParameters(abi, [ -// [ -// BigInt(merkleTreeDepth), -// BigInt(merkleTreeRoot), -// BigInt(nullifier), -// BigInt(message), -// BigInt(scope), -// bytesToHex(proofBytes), -// ] -// ]); - -// return hexToBytes(hex); -// } - -// export const generateSemaphoreProof = async ( -// startBlock: number, -// groupId: bigint, -// semaphoreAddress: string -// ) => { -// let ethersRef = new SemaphoreEthers(rpcUrl, { -// address: semaphoreAddress, -// startBlock, -// }); - -// const groupMembers = await ethersRef.getGroupMembers(groupId.toString()); -// const group = new Group(groupMembers); -// const scope = groupId.toString(); -// const message = "0"; -// const noirBackend = await initSemaphoreNoirBackend(merkleTreeDepth); -// const fullProof: SemaphoreNoirProof = await generateNoirProof(semaphoreIdentity, group, message, scope, noirBackend, true); -// const proofBytes = encodeSemaphoreProof(fullProof); - -// return proofBytes -// } - -// /** -// * @note In order to run these tests, you need the relayer server up and running. -// */ -// describe("CRISP contracts", () => { -// const enclaveAddress = "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" -// const crispProgramAddress = "0xc6e7DF5E7b4f2A278906862b61205850344D4e7d" - -// const sdk = EnclaveSDK.create({ -// rpcUrl: "http://localhost:8545", -// contracts: { -// enclave: enclaveAddress, -// ciphernodeRegistry: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" -// }, -// chainId: 31337, -// protocol: FheProtocol.BFV, -// privateKey: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" -// }) -// const server = "http://localhost:4000" -// const stateEndpoint = `${server}/rounds/current` - -// let signer: Signer -// let enclaveContract: Enclave -// let crispProgramContract: CRISPProgram - -// const circuit = JSON.parse(fs.readFileSync(path.resolve(__dirname, "crisp_circuit.json"), "utf-8")) - -// before(async () => { -// [signer] = await ethers.getSigners(); - -// enclaveContract = EnclaveFactory.connect(enclaveAddress, signer) - -// crispProgramContract = CRISPProgramFactory.connect(crispProgramAddress, signer) -// }) - -// describe("voting", async () => { -// it("should get the current round", async () => { -// const data = await fetch(stateEndpoint) -// const json = await data.json() as Round - -// const roundId = json.id - -// expect(roundId).to.be.not.null -// expect(roundId).to.be.gte(0) - -// const state = await fetch(`${server}/state/lite`, { -// method: "POST", -// body: JSON.stringify({ -// round_id: roundId -// }), -// headers: { -// "Content-Type": "application/json" -// } -// }) -// const stateJson = await state.json() as State - -// expect(stateJson).to.be.instanceOf(Object) -// }) - -// it("should allow to vote", async () => { -// const data = await fetch(stateEndpoint) -// const json = await data.json() as Round - -// const roundId = json.id - -// const state = await fetch(`${server}/state/lite`, { -// method: "POST", -// body: JSON.stringify({ -// round_id: roundId -// }), -// headers: { -// "Content-Type": "application/json" -// } -// }) -// const stateJson = await state.json() as State - -// expect(stateJson).to.be.instanceOf(Object) - -// const publicKey = stateJson.committee_public_key - -// const semaphoreAddr = await crispProgramContract.semaphore() -// const groupId = await crispProgramContract.groupIds(roundId) - -// // register the member -// const registerTx = await crispProgramContract.registerMember(roundId, semaphoreIdentity.commitment) -// await registerTx.wait() - -// const { proof, encryptedVote } = await sdk.encryptNumberAndGenProof(0n, publicKey, circuit) -// const semaphoreProof = await generateSemaphoreProof(stateJson.start_block, groupId, semaphoreAddr) - -// const encodedInputs = AbiCoder.defaultAbiCoder().encode( -// ["bytes", "bytes", "bytes32[]", "bytes"], -// [ -// semaphoreProof, -// proof.proof, -// proof.publicInputs, -// encryptedVote -// ] -// ) - -// const tx = await enclaveContract.publishInput(roundId, encodedInputs) -// const receipt = await tx.wait() - -// expect(receipt).to.be.not.null -// expect(receipt?.status).to.be.equal(1) -// }) -// }) -// }) import { network } from "hardhat"; import { zeroAddress, zeroHash } from "viem";