Compare commits

...

14 Commits

Author SHA1 Message Date
Vivian Plasencia
d99c5644c9 fix(website): update nextjs version 2025-12-13 17:11:55 +01:00
Vivian Plasencia
1dc597a175 chore: v4.14.0 2025-10-27 11:21:28 +01:00
Lautaro Di Sanza
b55bf7fd4d feat(data): add semaphore event listeners (#1054)
* feat(data): add semaphore event listeners

add listeners for groups and members

re #326

* feat(data): add semaphore event listeners

add listeners for ProoValidated and GroupAdminUpdated events

re #326

* feat(data): add semaphore event listeners

* feat(data): feat(data): add semaphore event listeners

the onMember method is separated and some names are adjusted

BREAKING CHANGE: N

re #326

* feat(data): feat(data): add semaphore event listeners

the onMember method is separated and some names are adjusted

BREAKING CHANGE: N

re #326

* feat(data): feat(data) add semaphore event listeners

add missing merkleTreeRoot element in onMember events

re #326

* feat(data): feat(data) add semaphore event listeners

fix name listener of GroupAdminUpdated event

re #326

* feat(data): feat(data) add semaphore event listeners

add groupId param to listener onGroupAdminUpdated

re #326

* feat(data): feat(data) add semaphore event listeners

Update method description

re #326

* feat(data): feat(data) add semaphore event listeners

fix descriptions

re #326

* feat(data): feat(data) add semaphore event listeners

Add short descriptions to off listeners methods

re #326
2025-10-24 00:13:58 +02:00
Cristian
496e18ecab fix(scripts): replaced map with foreach func (#1061)
fix: fix(scripts): replaced map with foreach func

re #1056
2025-10-23 12:46:53 +02:00
Vivian Plasencia
d4fb23a7af chore: update roadmap website and license year (#1060)
* chore(website): update roadmap

* chore(website): update license year 2024 -> 2025

re #947
2025-10-23 00:39:16 +02:00
Vivian Plasencia
411667f5c7 Dev (#1059)
* docs(proof): add documentation on terminating the bn128 curve to prevent resource leaks (#998)

* style(proof): format code with prettier

---------

Co-authored-by: VolodymyrBg <aqdrgg19@gmail.com>
2025-10-23 00:23:55 +02:00
bigbear
87709224a3 docs: fix incorrect default value in chunkArray JSDoc (#1038) 2025-10-22 11:14:46 +02:00
Fibonacci747
0e20c6884f docs(identity): correct @returns to bigint for secretScalar and commitment (#1028) 2025-10-22 11:12:23 +02:00
radik878
e1e893004d fix(data/ethers): correct MembersAdded map type to string[] (#1033) 2025-10-22 10:52:09 +02:00
Luciano Lupo
2e6bef51d4 docs(website): added Bring ID data to projects list (#1055)
re #1001
2025-10-22 10:32:30 +02:00
Vivian Plasencia
9e7b2900cf chore: v4.13.2 2025-10-13 10:31:58 +02:00
Vivian Plasencia
cd02f49173 feat: support gnosis-chiado and gnosis networks
re #1051
2025-10-12 21:25:10 -05:00
Vivian Plasencia
a8787bd1fc docs(website): add poll.cc (#1050)
docs(website): add poll.cc to website
2025-10-04 00:13:10 +02:00
Vivian Plasencia
2c6f7846d7 docs: update benachmarks page (#1045)
* docs(docs): update benchmarks page

re #1044

* docs(docs): update browser benchmarks

* docs(docs): update contracts image size

* docs(docs): update solidity benchmark info
2025-09-09 23:54:54 +02:00
57 changed files with 643 additions and 220 deletions

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -19,7 +19,7 @@
"@docusaurus/core": "3.5.2",
"@docusaurus/preset-classic": "3.5.2",
"@mdx-js/react": "^3.0.0",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/utils": "4.14.0",
"@svgr/webpack": "^5.5.0",
"clsx": "^1.2.1",
"docusaurus-plugin-sass": "^0.2.5",

View File

@@ -42,13 +42,13 @@ Chip: Apple M2 Pro
Memory (RAM): 16 GB
Operating System: macOS Sequoia version 15.0.1
Operating System: macOS Sequoia version 15.6.1
**Software environment**
Node.js version: 20.18.0
Node.js version: 23.10.0
Browser: Google Chrome Version 130.0.6723.92 (Official Build) (arm64)
Browser: Google Chrome Version 139.0.7258.156 (Official Build) (arm64)
## Running the benchmarks
@@ -60,6 +60,8 @@ GitHub repository to the run Node.js, browser and Circom benchmarks: https://git
GitHub repository to run the Solidity benchmarks: https://github.com/semaphore-protocol/semaphore
Semaphore V3 benchmarks were obtained using the code from the latest v3 Git tag (`v3.15.2`), with the Solidity optimizer enabled.
## Node.js benchmarks
### Identities
@@ -98,6 +100,8 @@ Main functions used in the browser.
## Circuit benchmarks
Tree depth = 20
### Semaphore V3
<img
@@ -119,7 +123,7 @@ style={{ width: '300px', height: 'auto' }}
<img
src={require('../../assets/img-benchmarks/contracts/contract-benchmarks.png').default}
alt="Contract Benchmarks"
style={{ width: '590px', height: 'auto' }}
style={{ width: '560px', height: 'auto' }}
/>
### Semaphore V3 gas report

View File

@@ -59,6 +59,8 @@ Supported networks:
- `linea-sepolia`
- `linea`
- `scroll-sepolia`
- `gnosis-chiado`
- `gnosis`
## 🛠 Install

View File

@@ -14,7 +14,7 @@
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"framer-motion": "^10.16.4",
"next": "13.5.5",
"next": "14.2.35",
"react": "^18",
"react-code-blocks": "^0.1.4",
"react-dom": "^18"

View File

@@ -586,5 +586,26 @@
"github": "https://github.com/jimmychu0807/semaphore-msa-modules",
"website": "https://semaphore-msa-modules.jimmychu0807.hk"
}
},
{
"name": "Poll.cc",
"categories": ["Voting", "Social"],
"tagline": "Public online voting on social and political issues. Semaphore is used for anonymous voting while proving you're a real human verified by KYC.",
"pse": false,
"icon": "",
"links": {
"website": "https://poll.cc"
}
},
{
"name": "BringID",
"tagline": "Privacy-preserving proof of humanity using verifiable Internet credentials",
"categories": ["Identity", "Authenticity", "Trust"],
"pse": false,
"icon": "",
"links": {
"website": "https://www.bringid.org",
"github": "https://github.com/BringID/whitepaper"
}
}
]

View File

@@ -20,7 +20,7 @@
"done": true
},
{
"name": "Support more Testnets/Mainnets",
"name": "Support more Testnets & Mainnets",
"done": true
},
{
@@ -37,10 +37,14 @@
},
{
"name": "Semaphore Noir Implementation",
"done": false
"done": true
},
{
"name": "Scaling Semaphore with PIR",
"done": true
},
{
"name": "Maintenance",
"done": false
}
]

View File

@@ -2,7 +2,7 @@
* This function takes an array and divides it into smaller arrays,
* or "chunks", each containing a specified number of elements.
* @param array The array to be split into chunks.
* @param size The size of each chunk. The default size is 10.
* @param size The size of each chunk. The default size is 15.
* @returns An array containing smaller subarrays (chunks), each with a length defined by the size.
*/
export function chunkArray(array: any[], size = 15): any[] {

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/circuits",
"version": "4.13.1",
"version": "4.14.0",
"description": "Semaphore Circom circuits to generate zero-knowledge proofs.",
"license": "MIT",
"files": [

View File

@@ -1,10 +1,10 @@
{
"name": "@semaphore-protocol/cli-template-contracts-foundry",
"version": "4.13.1",
"version": "4.14.0",
"description": "Semaphore Foundry template.",
"license": "Unlicense",
"devDependencies": {
"@semaphore-protocol/contracts": "4.13.1",
"@semaphore-protocol/contracts": "4.14.0",
"@zk-kit/lean-imt.sol": "2.0.1",
"forge-std": "github:foundry-rs/forge-std#v1.9.4",
"poseidon-solidity": "0.0.5",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-contracts-hardhat",
"version": "4.13.1",
"version": "4.14.0",
"description": "Semaphore Hardhat template.",
"license": "Unlicense",
"files": [
@@ -42,9 +42,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.13.1",
"@semaphore-protocol/hardhat": "4.13.1",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/hardhat": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"@typechain/ethers-v6": "^0.5.0",
"@typechain/hardhat": "^9.0.0",
"@types/chai": "^4.2.0",
@@ -72,7 +72,7 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@semaphore-protocol/contracts": "4.13.1"
"@semaphore-protocol/contracts": "4.14.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -20,9 +20,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.13.1",
"@semaphore-protocol/hardhat": "4.13.1",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/hardhat": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"@typechain/ethers-v6": "^0.5.0",
"@typechain/hardhat": "^9.0.0",
"@types/chai": "^4.2.0",
@@ -50,7 +50,7 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@semaphore-protocol/contracts": "4.13.1"
"@semaphore-protocol/contracts": "4.14.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -9,9 +9,9 @@
"lint": "next lint"
},
"dependencies": {
"@semaphore-protocol/core": "4.13.1",
"@semaphore-protocol/data": "4.13.1",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/data": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"ethers": "^6.13.4",
"next": "14.1.0",
"next-pwa": "^5.6.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-monorepo-ethers",
"version": "4.13.1",
"version": "4.14.0",
"description": "Semaphore Hardhat + Next.js + SemaphoreEthers template.",
"license": "Unlicense",
"files": [

View File

@@ -20,9 +20,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.13.1",
"@semaphore-protocol/hardhat": "4.13.1",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/hardhat": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"@typechain/ethers-v6": "^0.5.0",
"@typechain/hardhat": "^9.0.0",
"@types/chai": "^4.2.0",
@@ -50,7 +50,7 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@semaphore-protocol/contracts": "4.13.1"
"@semaphore-protocol/contracts": "4.14.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -9,9 +9,9 @@
"lint": "next lint"
},
"dependencies": {
"@semaphore-protocol/core": "4.13.1",
"@semaphore-protocol/data": "4.13.1",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/data": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"ethers": "^6.13.4",
"next": "14.1.0",
"next-pwa": "^5.6.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-monorepo-subgraph",
"version": "4.13.1",
"version": "4.14.0",
"description": "Semaphore Hardhat + Next.js + SemaphoreSubgraph template.",
"license": "Unlicense",
"files": [

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,7 +1,7 @@
{
"name": "@semaphore-protocol/cli",
"type": "module",
"version": "4.13.1",
"version": "4.14.0",
"description": "A command line tool to set up your Semaphore project and get group data.",
"license": "MIT",
"bin": {
@@ -41,8 +41,8 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@semaphore-protocol/data": "4.13.1",
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/data": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"axios": "^1.6.7",
"boxen": "^7.1.1",
"chalk": "^5.3.0",

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/contracts",
"version": "4.13.1",
"version": "4.14.0",
"description": "Semaphore contracts to manage groups and broadcast anonymous signals.",
"license": "MIT",
"files": [

View File

@@ -72,6 +72,22 @@ const hardhatConfig: HardhatUserConfig = {
apiURL: "https://api-sepolia.scrollscan.com/api",
browserURL: "https://sepolia.scrollscan.com"
}
},
{
network: "gnosis-chiado",
chainId: 10200,
urls: {
apiURL: "https://gnosis-chiado.blockscout.com/api",
browserURL: "https://gnosis-chiado.blockscout.com"
}
},
{
network: "gnosis",
chainId: 100,
urls: {
apiURL: "https://api.etherscan.io/v2/api?chainid=100",
browserURL: "https://gnosisscan.io"
}
}
]
},

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/core",
"version": "4.13.1",
"version": "4.14.0",
"description": "Core library for the essential Semaphore features.",
"type": "module",
"license": "MIT",
@@ -42,8 +42,8 @@
"access": "public"
},
"dependencies": {
"@semaphore-protocol/group": "4.13.1",
"@semaphore-protocol/identity": "4.13.1",
"@semaphore-protocol/proof": "4.13.1"
"@semaphore-protocol/group": "4.14.0",
"@semaphore-protocol/identity": "4.14.0",
"@semaphore-protocol/proof": "4.14.0"
}
}

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/data",
"version": "4.13.1",
"version": "4.14.0",
"description": "A library for querying Semaphore smart contract.",
"type": "module",
"license": "MIT",
@@ -37,7 +37,7 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/utils": "4.14.0",
"@zk-kit/utils": "1.3.0",
"axios": "1.6.6",
"ethers": "6.13.4",

View File

@@ -208,7 +208,7 @@ export default class SemaphoreEthers {
const membersAddedEvents = await getEvents(this._contract, "MembersAdded", [groupId], this._options.startBlock)
const membersAddedEventsMap = new Map<string, [string]>()
const membersAddedEventsMap = new Map<string, string[]>()
for (const [, startIndex, identityCommitments] of membersAddedEvents) {
membersAddedEventsMap.set(
@@ -295,4 +295,156 @@ export default class SemaphoreEthers {
return this._contract.hasMember(groupId, member)
}
/**
* Listens to the GroupCreated event.
* @param callback Called with the groupId of the newly created group.
*/
onGroupCreated(callback: (groupId: string, event: any) => void): void {
this._contract.on("GroupCreated", (groupId, event) => {
callback(groupId.toString(), event)
})
}
/**
* Removes all listeners for the GroupCreated event.
* Stop receiving group creation notifications.
*/
offGropupCreated(): void {
this._contract.removeAllListeners("GroupCreated")
}
/**
* Listens to MemberAdded events.
* @param callback Receives the groupId, identityCommitment and event metadata.
*/
onMemberAdded(
callback: (groupId: string, identityCommitment: string, merkleTreeRoot: string, event: any) => void
): void {
this._contract.on("MemberAdded", (groupId, _index, identityCommitment, merkleTreeRoot, event) => {
callback(groupId.toString(), identityCommitment.toString(), merkleTreeRoot.toString(), event)
})
}
/**
* Removes all listeners for the MemberAdded event.
* Stop tracking when new members are added.
*/
offMemberAdded(): void {
this._contract.removeAllListeners("MemberAdded")
}
/**
* Listens to MemberUpdated events.
* @param callback Receives the groupId, old identityCommitment, new identityCommitment, and event metadata.
*/
onMemberUpdated(
callback: (
groupId: string,
oldIdentityCommitment: string,
newIdentityCommitment: string,
merkleTreeRoot: string,
event: any
) => void
): void {
this._contract.on(
"MemberUpdated",
(groupId, _index, oldIdentityCommitment, newIdentityCommitment, merkleTreeRoot, event) => {
callback(
groupId.toString(),
oldIdentityCommitment.toString(),
newIdentityCommitment.toString(),
merkleTreeRoot.toString(),
event
)
}
)
}
/**
* Removes all listeners for the MemberUpdated event.
* Stop receiving updates when members change their commitment.
*/
offMemberUpdated(): void {
this._contract.removeAllListeners("MemberUpdated")
}
/**
* Listens to MemberRemoved events.
* @param callback Receives the groupId, identityCommitment and event metadata.
*/
onMemberRemoved(
callback: (groupId: string, identityCommitment: string, merkleTreeRoot: string, event: any) => void
): void {
this._contract.on("MemberRemoved", (groupId, _index, identityCommitment, merkleTreeRoot, event) => {
callback(groupId.toString(), identityCommitment.toString(), merkleTreeRoot.toString(), event)
})
}
/**
* Removes all listeners for the MemberRemoved event.
* Stop listening for member removals.
*/
offMemberRemoved(): void {
this._contract.removeAllListeners("MemberRemoved")
}
/**
* Listens to the ProofValidated event.
* @param callback Called with proof parameters and event metadata.
*/
onProofValidated(
callback: (proof: {
groupId: string
merkleTreeDepth: number
merkleTreeRoot: string
nullifier: string
message: string
scope: string
points: string[]
event: any
}) => void
): void {
this._contract.on(
"ProofValidated",
(groupId, merkleTreeDepth, merkleTreeRoot, nullifier, message, scope, points, event) => {
callback({
groupId: groupId.toString(),
merkleTreeDepth: Number(merkleTreeDepth),
merkleTreeRoot: merkleTreeRoot.toString(),
nullifier: nullifier.toString(),
message: message.toString(),
scope: scope.toString(),
points: points.map((p: any) => p.toString()),
event
})
}
)
}
/**
* Removes all listeners for the ProofValidated event.
* Stop receiving proof validation notifications.
*/
offProofValidated(): void {
this._contract.removeAllListeners("ProofValidated")
}
/**
* Listens to the GroupAdminUpdated event.
* @param callback Receives the groupId, old admin and new admin addresses and event metadata.
*/
onGroupAdminUpdated(callback: (groupId: string, oldAdmin: string, newAdmin: string, event: any) => void): void {
this._contract.on("GroupAdminUpdated", (groupId, oldAdmin, newAdmin, event) => {
callback(groupId.toString(), oldAdmin.toString(), newAdmin.toString(), event)
})
}
/**
* Removes all listeners for the GroupAdminUpdated event.
* Stop tracking when a group's admin is updated.
*/
offGroupAdminUpdated(): void {
this._contract.removeAllListeners("GroupAdminUpdated")
}
}

View File

@@ -257,4 +257,140 @@ describe("SemaphoreEthers", () => {
expect(isMember).toBeFalsy()
})
})
describe("Event listeners", () => {
let mockOn: jest.Mock
let mockRemove: jest.Mock
beforeEach(() => {
mockOn = jest.fn()
mockRemove = jest.fn()
ContractMocked.mockImplementation(
() =>
({
on: mockOn,
removeAllListeners: mockRemove
}) as any
)
})
it("onGroupCreated should call the callback with groupId and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onGroupCreated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "GroupCreated")![1]
const fakeEvent = { blockNumber: 123 }
handler("42", fakeEvent)
expect(cb).toHaveBeenCalledWith("42", fakeEvent)
expect(mockOn).toHaveBeenCalledWith("GroupCreated", expect.any(Function))
})
it("offGroupCreated should remove all listeners for GroupCreated", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offGropupCreated()
expect(mockRemove).toHaveBeenCalledWith("GroupCreated")
})
it("onMemberAdded should call callback with groupId, identityCommitment and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onMemberAdded(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "MemberAdded")![1]
const fakeEvent = { txHash: "0xabc" }
handler("group1", 0, "identity123", "root111", fakeEvent)
expect(cb).toHaveBeenCalledWith("group1", "identity123", "root111", fakeEvent)
})
it("onMemberUpdated should call callback with groupId, old and new identity commitments", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onMemberUpdated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "MemberUpdated")![1]
const fakeEvent = { blockNumber: 200 }
handler("groupX", 1, "old123", "new456", "root111", fakeEvent)
expect(cb).toHaveBeenCalledWith("groupX", "old123", "new456", "root111", fakeEvent)
})
it("onMemberRemoved should call callback with groupId, identityCommitment and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onMemberRemoved(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "MemberRemoved")![1]
const fakeEvent = { txHash: "0xdeadbeef" }
handler("groupZ", 2, "identity999", "root111", fakeEvent)
expect(cb).toHaveBeenCalledWith("groupZ", "identity999", "root111", fakeEvent)
})
it("offMemberAdded/Updated/Removed should remove all corresponding listeners", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offMemberAdded()
semaphore.offMemberUpdated()
semaphore.offMemberRemoved()
expect(mockRemove).toHaveBeenCalledWith("MemberAdded")
expect(mockRemove).toHaveBeenCalledWith("MemberUpdated")
expect(mockRemove).toHaveBeenCalledWith("MemberRemoved")
})
it("onProofValidated should call callback with proof object", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onProofValidated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "ProofValidated")![1]
const fakeEvent = { blockNumber: 400 }
handler("group1", 3, "root123", "nullifierXYZ", "msg1", "scope1", ["p1", "p2"], fakeEvent)
expect(cb).toHaveBeenCalledWith({
groupId: "group1",
merkleTreeDepth: 3,
merkleTreeRoot: "root123",
nullifier: "nullifierXYZ",
message: "msg1",
scope: "scope1",
points: ["p1", "p2"],
event: fakeEvent
})
})
it("offProofValidated should remove all ProofValidated listeners", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offProofValidated()
expect(mockRemove).toHaveBeenCalledWith("ProofValidated")
})
it("onGroupAdminUpdated should call callback with groupId, oldAdmin, newAdmin and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onGroupAdminUpdated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "GroupAdminUpdated")![1]
const fakeEvent = { txHash: "0xbeef" }
handler("group1", "0xOLD", "0xNEW", fakeEvent)
expect(cb).toHaveBeenCalledWith("group1", "0xOLD", "0xNEW", fakeEvent)
})
it("offGroupAdminUpdated should remove all GroupAdminUpdated listeners", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offGroupAdminUpdated()
expect(mockRemove).toHaveBeenCalledWith("GroupAdminUpdated")
})
})
})

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/group",
"version": "4.13.1",
"version": "4.14.0",
"description": "A library to create and manage Semaphore groups.",
"type": "module",
"license": "MIT",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/hardhat",
"version": "4.13.1",
"version": "4.14.0",
"description": "A Hardhat plugin to deploy Semaphore contracts.",
"type": "module",
"license": "MIT",
@@ -41,7 +41,7 @@
},
"dependencies": {
"@nomicfoundation/hardhat-ethers": "^3.0.0",
"@semaphore-protocol/contracts": "4.13.1",
"@semaphore-protocol/contracts": "4.14.0",
"ethers": "^6.13.4",
"hardhat-dependency-compiler": "^1.1.3"
}

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/identity",
"version": "4.13.1",
"version": "4.14.0",
"description": "A library to create Semaphore identities.",
"type": "module",
"license": "MIT",

View File

@@ -62,7 +62,7 @@ export class Identity {
/**
* Returns the secret scalar.
* @returns The secret scalar as a string.
* @returns The secret scalar as a bigint.
*/
public get secretScalar(): bigint {
return this._secretScalar
@@ -78,7 +78,7 @@ export class Identity {
/**
* Returns the commitment hash of the public key.
* @returns The commitment as a string.
* @returns The commitment as a bigint.
*/
public get commitment(): bigint {
return this._commitment

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -116,3 +116,25 @@ import { verifyProof } from "@semaphore-protocol/proof"
await verifyProof(proof1)
```
## Resource management: Terminating the bn128 curve
When using the Semaphore proof library in Node.js environments, especially in tests or scripts that create and use the `bn128` curve (for example, via `getCurveFromName("bn128")` from the `ffjavascript` package), it is important to properly release resources associated with the curve after use. Failing to do so can result in leaked handles (such as `MessagePort` handles), which may prevent Node.js from exiting cleanly. This is particularly relevant when running test suites.
**How to terminate the bn128 curve:**
If you create a curve instance using `getCurveFromName("bn128")`, you should call its `terminate()` method when you are done with it. For example:
```typescript
import { getCurveFromName } from "ffjavascript"
let curve
beforeAll(async () => {
curve = await getCurveFromName("bn128")
})
afterAll(async () => {
await curve.terminate()
})
```
This ensures that all resources are properly released and Node.js can exit cleanly after your script or tests finish.

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/proof",
"version": "4.13.1",
"version": "4.14.0",
"description": "A library to generate and verify Semaphore proofs.",
"type": "module",
"license": "MIT",
@@ -47,11 +47,11 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"peerDependencies": {
"@semaphore-protocol/group": "4.13.1",
"@semaphore-protocol/identity": "4.13.1"
"@semaphore-protocol/group": "4.14.0",
"@semaphore-protocol/identity": "4.14.0"
},
"dependencies": {
"@semaphore-protocol/utils": "4.13.1",
"@semaphore-protocol/utils": "4.14.0",
"@zk-kit/artifacts": "2.0.1",
"@zk-kit/utils": "1.3.0",
"ethers": "6.13.4",

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/utils",
"version": "4.13.1",
"version": "4.14.0",
"description": "A library to provide utility functions to the other Semaphore packages.",
"type": "module",
"license": "MIT",

View File

@@ -258,5 +258,45 @@
"startBlock": 11979239
}
]
},
{
"network": "gnosis-chiado",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 18246899
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 18246899
},
{
"name": "Semaphore",
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 18246899
}
]
},
{
"network": "gnosis",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 42592252
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 42592252
},
{
"name": "Semaphore",
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 42592252
}
]
}
]

View File

@@ -76,5 +76,17 @@ export default {
url: "https://sepolia-rpc.scroll.io",
chainId: 534351,
explorer: "https://sepolia.scrollscan.com"
},
"gnosis-chiado": {
name: "Gnosis Chiado",
url: "https://rpc.chiadochain.net",
chainId: 10200,
explorer: "https://blockscout.com/gnosis/chiado"
},
gnosis: {
name: "Gnosis",
url: "https://rpc.gnosischain.com",
chainId: 100,
explorer: "https://gnosisscan.io"
}
}

View File

@@ -20,7 +20,9 @@ async function main() {
.filter((file) => file.isDirectory())
.map((dir) => dir.name)
folders.map((app) => gitIgnored.map((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true })))
folders.forEach((app) =>
gitIgnored.forEach((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true }))
)
}
main()

View File

@@ -14,8 +14,8 @@ const gitIgnored = [
const folders = ["cli-template-monorepo-ethers", "cli-template-monorepo-subgraph"]
async function main() {
folders.map((pkg) =>
gitIgnored.map((f) => rmSync(`${folderName}/${pkg}/apps/${f}`, { recursive: true, force: true }))
folders.forEach((pkg) =>
gitIgnored.forEach((f) => rmSync(`${folderName}/${pkg}/apps/${f}`, { recursive: true, force: true }))
)
}

View File

@@ -10,7 +10,9 @@ async function main() {
.filter((file) => file.isDirectory())
.map((dir) => dir.name)
folders.map((app) => gitIgnored.map((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true })))
folders.forEach((app) =>
gitIgnored.forEach((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true }))
)
rmSync(`${folderName}/circuit/main`, { recursive: true, force: true })
rmSync(`${folderName}/circuit/test`, { recursive: true, force: true })

312
yarn.lock
View File

@@ -6408,13 +6408,6 @@ __metadata:
languageName: node
linkType: hard
"@next/env@npm:13.5.5":
version: 13.5.5
resolution: "@next/env@npm:13.5.5"
checksum: 10/519dc30be6db82d57194b6bfe50b397a37b7189a8f35d33061ae0d4f93bb8774ca7710f7da7150b3c85f329d412a35b49782d70e08e44816716b19c7ac463ae1
languageName: node
linkType: hard
"@next/env@npm:14.1.0":
version: 14.1.0
resolution: "@next/env@npm:14.1.0"
@@ -6422,6 +6415,13 @@ __metadata:
languageName: node
linkType: hard
"@next/env@npm:14.2.35":
version: 14.2.35
resolution: "@next/env@npm:14.2.35"
checksum: 10/5685145c9a6e6d21a85c012b023092ff50cfee61b73424d3c913d4155a89c85cf02867e79b5b3bde6ef9f6e6b2bec662cecd644d0d428082801e95c4cbe2393f
languageName: node
linkType: hard
"@next/eslint-plugin-next@npm:14.1.0":
version: 14.1.0
resolution: "@next/eslint-plugin-next@npm:14.1.0"
@@ -6431,13 +6431,6 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-darwin-arm64@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-darwin-arm64@npm:13.5.5"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@next/swc-darwin-arm64@npm:14.1.0":
version: 14.1.0
resolution: "@next/swc-darwin-arm64@npm:14.1.0"
@@ -6445,10 +6438,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-darwin-x64@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-darwin-x64@npm:13.5.5"
conditions: os=darwin & cpu=x64
"@next/swc-darwin-arm64@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-darwin-arm64@npm:14.2.33"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
@@ -6459,10 +6452,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-linux-arm64-gnu@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-linux-arm64-gnu@npm:13.5.5"
conditions: os=linux & cpu=arm64 & libc=glibc
"@next/swc-darwin-x64@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-darwin-x64@npm:14.2.33"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
@@ -6473,10 +6466,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-linux-arm64-musl@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-linux-arm64-musl@npm:13.5.5"
conditions: os=linux & cpu=arm64 & libc=musl
"@next/swc-linux-arm64-gnu@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-linux-arm64-gnu@npm:14.2.33"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
@@ -6487,10 +6480,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-linux-x64-gnu@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-linux-x64-gnu@npm:13.5.5"
conditions: os=linux & cpu=x64 & libc=glibc
"@next/swc-linux-arm64-musl@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-linux-arm64-musl@npm:14.2.33"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
@@ -6501,10 +6494,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-linux-x64-musl@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-linux-x64-musl@npm:13.5.5"
conditions: os=linux & cpu=x64 & libc=musl
"@next/swc-linux-x64-gnu@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-linux-x64-gnu@npm:14.2.33"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
@@ -6515,10 +6508,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-win32-arm64-msvc@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-win32-arm64-msvc@npm:13.5.5"
conditions: os=win32 & cpu=arm64
"@next/swc-linux-x64-musl@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-linux-x64-musl@npm:14.2.33"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
@@ -6529,10 +6522,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-win32-ia32-msvc@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-win32-ia32-msvc@npm:13.5.5"
conditions: os=win32 & cpu=ia32
"@next/swc-win32-arm64-msvc@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-win32-arm64-msvc@npm:14.2.33"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
@@ -6543,10 +6536,10 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-win32-x64-msvc@npm:13.5.5":
version: 13.5.5
resolution: "@next/swc-win32-x64-msvc@npm:13.5.5"
conditions: os=win32 & cpu=x64
"@next/swc-win32-ia32-msvc@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-win32-ia32-msvc@npm:14.2.33"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
@@ -6557,6 +6550,13 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-win32-x64-msvc@npm:14.2.33":
version: 14.2.33
resolution: "@next/swc-win32-x64-msvc@npm:14.2.33"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@noble/curves@npm:1.2.0":
version: 1.2.0
resolution: "@noble/curves@npm:1.2.0"
@@ -7613,7 +7613,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@semaphore-protocol/cli-template-contracts-foundry@workspace:packages/cli-template-contracts-foundry"
dependencies:
"@semaphore-protocol/contracts": "npm:4.13.1"
"@semaphore-protocol/contracts": "npm:4.14.0"
"@zk-kit/lean-imt.sol": "npm:2.0.1"
forge-std: "github:foundry-rs/forge-std#v1.9.4"
poseidon-solidity: "npm:0.0.5"
@@ -7633,10 +7633,10 @@ __metadata:
"@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0"
"@nomicfoundation/hardhat-toolbox": "npm:^4.0.0"
"@nomicfoundation/hardhat-verify": "npm:^2.0.0"
"@semaphore-protocol/contracts": "npm:4.13.1"
"@semaphore-protocol/core": "npm:4.13.1"
"@semaphore-protocol/hardhat": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/contracts": "npm:4.14.0"
"@semaphore-protocol/core": "npm:4.14.0"
"@semaphore-protocol/hardhat": "npm:4.14.0"
"@semaphore-protocol/utils": "npm:4.14.0"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -7686,8 +7686,8 @@ __metadata:
resolution: "@semaphore-protocol/cli@workspace:packages/cli"
dependencies:
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/data": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/data": "npm:4.14.0"
"@semaphore-protocol/utils": "npm:4.14.0"
"@types/figlet": "npm:^1.5.8"
"@types/inquirer": "npm:^9.0.7"
"@types/pacote": "npm:^11.1.8"
@@ -7711,7 +7711,7 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/contracts@npm:4.13.1, @semaphore-protocol/contracts@workspace:packages/contracts/contracts":
"@semaphore-protocol/contracts@npm:4.14.0, @semaphore-protocol/contracts@workspace:packages/contracts/contracts":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/contracts@workspace:packages/contracts/contracts"
dependencies:
@@ -7719,23 +7719,23 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/core@npm:4.13.1, @semaphore-protocol/core@workspace:^, @semaphore-protocol/core@workspace:packages/core":
"@semaphore-protocol/core@npm:4.14.0, @semaphore-protocol/core@workspace:^, @semaphore-protocol/core@workspace:packages/core":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/core@workspace:packages/core"
dependencies:
"@semaphore-protocol/group": "npm:4.13.1"
"@semaphore-protocol/identity": "npm:4.13.1"
"@semaphore-protocol/proof": "npm:4.13.1"
"@semaphore-protocol/group": "npm:4.14.0"
"@semaphore-protocol/identity": "npm:4.14.0"
"@semaphore-protocol/proof": "npm:4.14.0"
languageName: unknown
linkType: soft
"@semaphore-protocol/data@npm:4.13.1, @semaphore-protocol/data@workspace:packages/data":
"@semaphore-protocol/data@npm:4.14.0, @semaphore-protocol/data@workspace:packages/data":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/data@workspace:packages/data"
dependencies:
"@rollup/plugin-json": "npm:^6.1.0"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.14.0"
"@zk-kit/utils": "npm:1.3.0"
axios: "npm:1.6.6"
ethers: "npm:6.13.4"
@@ -7746,7 +7746,7 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/group@npm:4.13.1, @semaphore-protocol/group@workspace:packages/group":
"@semaphore-protocol/group@npm:4.14.0, @semaphore-protocol/group@workspace:packages/group":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/group@workspace:packages/group"
dependencies:
@@ -7760,13 +7760,13 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/hardhat@npm:4.13.1, @semaphore-protocol/hardhat@workspace:packages/hardhat":
"@semaphore-protocol/hardhat@npm:4.14.0, @semaphore-protocol/hardhat@workspace:packages/hardhat":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/hardhat@workspace:packages/hardhat"
dependencies:
"@nomicfoundation/hardhat-ethers": "npm:^3.0.0"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/contracts": "npm:4.13.1"
"@semaphore-protocol/contracts": "npm:4.14.0"
ethers: "npm:^6.13.4"
hardhat: "npm:^2.19.4"
hardhat-dependency-compiler: "npm:^1.1.3"
@@ -7778,7 +7778,7 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/identity@npm:4.13.1, @semaphore-protocol/identity@workspace:packages/identity":
"@semaphore-protocol/identity@npm:4.14.0, @semaphore-protocol/identity@workspace:packages/identity":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/identity@workspace:packages/identity"
dependencies:
@@ -7794,14 +7794,14 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/proof@npm:4.13.1, @semaphore-protocol/proof@workspace:packages/proof":
"@semaphore-protocol/proof@npm:4.14.0, @semaphore-protocol/proof@workspace:packages/proof":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/proof@workspace:packages/proof"
dependencies:
"@rollup/plugin-alias": "npm:^5.1.0"
"@rollup/plugin-json": "npm:^6.1.0"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.14.0"
"@types/snarkjs": "npm:^0"
"@zk-kit/artifacts": "npm:2.0.1"
"@zk-kit/utils": "npm:1.3.0"
@@ -7811,12 +7811,12 @@ __metadata:
rollup-plugin-cleanup: "npm:^3.2.1"
snarkjs: "npm:0.7.5"
peerDependencies:
"@semaphore-protocol/group": 4.13.1
"@semaphore-protocol/identity": 4.13.1
"@semaphore-protocol/group": 4.14.0
"@semaphore-protocol/identity": 4.14.0
languageName: unknown
linkType: soft
"@semaphore-protocol/utils@npm:4.13.1, @semaphore-protocol/utils@workspace:packages/utils":
"@semaphore-protocol/utils@npm:4.14.0, @semaphore-protocol/utils@workspace:packages/utils":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/utils@workspace:packages/utils"
dependencies:
@@ -8373,6 +8373,13 @@ __metadata:
languageName: node
linkType: hard
"@swc/counter@npm:^0.1.3":
version: 0.1.3
resolution: "@swc/counter@npm:0.1.3"
checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598
languageName: node
linkType: hard
"@swc/helpers@npm:0.5.2":
version: 0.5.2
resolution: "@swc/helpers@npm:0.5.2"
@@ -8382,6 +8389,16 @@ __metadata:
languageName: node
linkType: hard
"@swc/helpers@npm:0.5.5":
version: 0.5.5
resolution: "@swc/helpers@npm:0.5.5"
dependencies:
"@swc/counter": "npm:^0.1.3"
tslib: "npm:^2.4.0"
checksum: 10/1c5ef04f642542212df28c669438f3e0f459dcde7b448a5b1fcafb2e9e4f13e76d8428535a270e91ed123dd2a21189dbed34086b88a8cf68baf84984d6d0e39b
languageName: node
linkType: hard
"@szmarczak/http-timer@npm:^5.0.1":
version: 5.0.1
resolution: "@szmarczak/http-timer@npm:5.0.1"
@@ -11664,7 +11681,7 @@ __metadata:
languageName: node
linkType: hard
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001406, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599":
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599":
version: 1.0.30001620
resolution: "caniuse-lite@npm:1.0.30001620"
checksum: 10/d615ab66eb14d9b621004297a8f61e435dca67e9311f3979e47ee1af1be2a8f14997b947a101073d949b5454dad745cc35134bc3c4295c7f33968f3f665eba19
@@ -21721,10 +21738,10 @@ __metadata:
"@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0"
"@nomicfoundation/hardhat-toolbox": "npm:^4.0.0"
"@nomicfoundation/hardhat-verify": "npm:^2.0.0"
"@semaphore-protocol/contracts": "npm:4.13.1"
"@semaphore-protocol/core": "npm:4.13.1"
"@semaphore-protocol/hardhat": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/contracts": "npm:4.14.0"
"@semaphore-protocol/core": "npm:4.14.0"
"@semaphore-protocol/hardhat": "npm:4.14.0"
"@semaphore-protocol/utils": "npm:4.14.0"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -21757,9 +21774,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "monorepo-ethers-web-app@workspace:packages/cli-template-monorepo-ethers/apps/web-app"
dependencies:
"@semaphore-protocol/core": "npm:4.13.1"
"@semaphore-protocol/data": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/core": "npm:4.14.0"
"@semaphore-protocol/data": "npm:4.14.0"
"@semaphore-protocol/utils": "npm:4.14.0"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -21784,10 +21801,10 @@ __metadata:
"@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0"
"@nomicfoundation/hardhat-toolbox": "npm:^4.0.0"
"@nomicfoundation/hardhat-verify": "npm:^2.0.0"
"@semaphore-protocol/contracts": "npm:4.13.1"
"@semaphore-protocol/core": "npm:4.13.1"
"@semaphore-protocol/hardhat": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/contracts": "npm:4.14.0"
"@semaphore-protocol/core": "npm:4.14.0"
"@semaphore-protocol/hardhat": "npm:4.14.0"
"@semaphore-protocol/utils": "npm:4.14.0"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -21820,9 +21837,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "monorepo-subgraph-web-app@workspace:packages/cli-template-monorepo-subgraph/apps/web-app"
dependencies:
"@semaphore-protocol/core": "npm:4.13.1"
"@semaphore-protocol/data": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/core": "npm:4.14.0"
"@semaphore-protocol/data": "npm:4.14.0"
"@semaphore-protocol/utils": "npm:4.14.0"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -22009,61 +22026,6 @@ __metadata:
languageName: node
linkType: hard
"next@npm:13.5.5":
version: 13.5.5
resolution: "next@npm:13.5.5"
dependencies:
"@next/env": "npm:13.5.5"
"@next/swc-darwin-arm64": "npm:13.5.5"
"@next/swc-darwin-x64": "npm:13.5.5"
"@next/swc-linux-arm64-gnu": "npm:13.5.5"
"@next/swc-linux-arm64-musl": "npm:13.5.5"
"@next/swc-linux-x64-gnu": "npm:13.5.5"
"@next/swc-linux-x64-musl": "npm:13.5.5"
"@next/swc-win32-arm64-msvc": "npm:13.5.5"
"@next/swc-win32-ia32-msvc": "npm:13.5.5"
"@next/swc-win32-x64-msvc": "npm:13.5.5"
"@swc/helpers": "npm:0.5.2"
busboy: "npm:1.6.0"
caniuse-lite: "npm:^1.0.30001406"
postcss: "npm:8.4.31"
styled-jsx: "npm:5.1.1"
watchpack: "npm:2.4.0"
peerDependencies:
"@opentelemetry/api": ^1.1.0
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
dependenciesMeta:
"@next/swc-darwin-arm64":
optional: true
"@next/swc-darwin-x64":
optional: true
"@next/swc-linux-arm64-gnu":
optional: true
"@next/swc-linux-arm64-musl":
optional: true
"@next/swc-linux-x64-gnu":
optional: true
"@next/swc-linux-x64-musl":
optional: true
"@next/swc-win32-arm64-msvc":
optional: true
"@next/swc-win32-ia32-msvc":
optional: true
"@next/swc-win32-x64-msvc":
optional: true
peerDependenciesMeta:
"@opentelemetry/api":
optional: true
sass:
optional: true
bin:
next: dist/bin/next
checksum: 10/9e6aa7fd7df96caeeaaf5436b839fa85aedd8f1f9ee695add0e0346bf9941683dd5d81dbcc60d5e19e5b630959a8abee29c523856b21e13419c795882fcb8ef6
languageName: node
linkType: hard
"next@npm:14.1.0":
version: 14.1.0
resolution: "next@npm:14.1.0"
@@ -22119,6 +22081,64 @@ __metadata:
languageName: node
linkType: hard
"next@npm:14.2.35":
version: 14.2.35
resolution: "next@npm:14.2.35"
dependencies:
"@next/env": "npm:14.2.35"
"@next/swc-darwin-arm64": "npm:14.2.33"
"@next/swc-darwin-x64": "npm:14.2.33"
"@next/swc-linux-arm64-gnu": "npm:14.2.33"
"@next/swc-linux-arm64-musl": "npm:14.2.33"
"@next/swc-linux-x64-gnu": "npm:14.2.33"
"@next/swc-linux-x64-musl": "npm:14.2.33"
"@next/swc-win32-arm64-msvc": "npm:14.2.33"
"@next/swc-win32-ia32-msvc": "npm:14.2.33"
"@next/swc-win32-x64-msvc": "npm:14.2.33"
"@swc/helpers": "npm:0.5.5"
busboy: "npm:1.6.0"
caniuse-lite: "npm:^1.0.30001579"
graceful-fs: "npm:^4.2.11"
postcss: "npm:8.4.31"
styled-jsx: "npm:5.1.1"
peerDependencies:
"@opentelemetry/api": ^1.1.0
"@playwright/test": ^1.41.2
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
dependenciesMeta:
"@next/swc-darwin-arm64":
optional: true
"@next/swc-darwin-x64":
optional: true
"@next/swc-linux-arm64-gnu":
optional: true
"@next/swc-linux-arm64-musl":
optional: true
"@next/swc-linux-x64-gnu":
optional: true
"@next/swc-linux-x64-musl":
optional: true
"@next/swc-win32-arm64-msvc":
optional: true
"@next/swc-win32-ia32-msvc":
optional: true
"@next/swc-win32-x64-msvc":
optional: true
peerDependenciesMeta:
"@opentelemetry/api":
optional: true
"@playwright/test":
optional: true
sass:
optional: true
bin:
next: dist/bin/next
checksum: 10/3647056e208cf0b19821d761841b378c8fb489b291acc8dc4d80a7afe6b1850b30dad91e1766301feda03360275347881d6ead068f1f944d823b4f91177f35ae
languageName: node
linkType: hard
"no-case@npm:^3.0.4":
version: 3.0.4
resolution: "no-case@npm:3.0.4"
@@ -26328,7 +26348,7 @@ __metadata:
"@docusaurus/preset-classic": "npm:3.5.2"
"@docusaurus/tsconfig": "npm:3.5.2"
"@mdx-js/react": "npm:^3.0.0"
"@semaphore-protocol/utils": "npm:4.13.1"
"@semaphore-protocol/utils": "npm:4.14.0"
"@svgr/webpack": "npm:^5.5.0"
"@types/react": "npm:^18.2.29"
clsx: "npm:^1.2.1"
@@ -26416,7 +26436,7 @@ __metadata:
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
framer-motion: "npm:^10.16.4"
next: "npm:13.5.5"
next: "npm:14.2.35"
react: "npm:^18"
react-code-blocks: "npm:^0.1.4"
react-dom: "npm:^18"
@@ -29463,16 +29483,6 @@ __metadata:
languageName: node
linkType: hard
"watchpack@npm:2.4.0":
version: 2.4.0
resolution: "watchpack@npm:2.4.0"
dependencies:
glob-to-regexp: "npm:^0.4.1"
graceful-fs: "npm:^4.1.2"
checksum: 10/4280b45bc4b5d45d5579113f2a4af93b67ae1b9607cc3d86ae41cdd53ead10db5d9dc3237f24256d05ef88b28c69a02712f78e434cb7ecc8edaca134a56e8cab
languageName: node
linkType: hard
"watchpack@npm:^2.4.1":
version: 2.4.1
resolution: "watchpack@npm:2.4.1"