Compare commits

..

21 Commits

Author SHA1 Message Date
Vivian Plasencia
ea62310df6 chore: v4.11.1 2025-05-21 16:49:07 +02:00
Vivian Plasencia
6bc415f4d5 fix(data): fix semaphore viem class (#985)
re #984
2025-05-21 16:44:38 +02:00
Vivian Plasencia
18f77ac0bb chore: v4.11.0 2025-05-20 14:00:27 +02:00
Sarkazein
f3c4cf27e2 feat(data): implement Viem lib alternative to SemaphoreEthers (#966)
* feat(data): implement Viem lib alternative to Ethers for @semaphore-protocol/data package class

This adds a Viem-based alternative to SemaphoreEthers, allowing
developers to choose their preferred Ethereum library.

Closes #343

* chore(data): update yarn.lock for viem dependency

* chore(data): improve test coverage for SemaphoreViem class

* chore(data): improve test coverage for SemaphoreViem class
2025-05-20 13:51:34 +02:00
Sri Hari S
57132a38df Added warning to the Semaphore docs (#983)
Update identities.mdx

Added warning to the Semaphore docs
2025-05-19 13:54:36 +02:00
Vivian Plasencia
6ef16976f7 docs(website): update semaphore roadmap (#981) 2025-05-07 14:42:59 +02:00
Vivian Plasencia
2849ca1d24 chore: v4.10.0 2025-05-06 22:36:52 +02:00
Vivian Plasencia
d05d783852 chore:deploy contracts (#980)
* chore: update semaphore contract address

re #978

* feat: add ethereum as a supported network

re #977

* feat: add ethereum subgraph and deploy subgraphs

re #978, #977
2025-05-06 22:28:08 +02:00
Vivian Plasencia
993e46a427 docs(website): update events (#979) 2025-05-05 19:03:45 +02:00
Jimmy Chu
f984c1e864 chore(website): add a new project in project page (#972) 2025-04-03 00:11:54 +02:00
Vivian Plasencia
5c9d1737d3 chore: v4.9.2 2025-03-31 12:50:00 +02:00
Vivian Plasencia
1318b0e74b docs: update releases section in readme file 2025-03-31 12:44:51 +02:00
Vivian Plasencia
c0fcc94e82 docs: add more info to the readme file about the release of the packages (#971) 2025-03-31 12:41:49 +02:00
Vivian Plasencia
e70ae1151b chore: update leanimt sol version (#970) 2025-03-31 12:30:58 +02:00
Vivian Plasencia
fd38539908 docs(website): add scaling semaphore with pir to the roadmap (#969) 2025-03-18 01:03:24 +01:00
Vivian Plasencia
8bd45d8c46 docs: add specification document link to website and docs (#965) 2025-03-06 13:55:29 +01:00
Vivian Plasencia
534e69683a docs(website): update roadmap to add semaphore noir implementation (#962) 2025-03-04 12:35:58 +01:00
Vivian Plasencia
a0a3b9380b docs(website): update spec status to true on roadmap (#959) 2025-03-03 11:02:33 +01:00
Vivian Plasencia
bc9f7df1da chore: v4.9.1 2025-02-24 23:19:29 +01:00
Vivian Plasencia
571ffdab0e chore(group): update leanimt package version (#957) 2025-02-24 23:15:07 +01:00
ewynx
773696f40c Fix broken link for LeanMIT (#956)
chore: fixes broken link for LeanMIT
2025-02-24 22:26:29 +01:00
47 changed files with 1976 additions and 197 deletions

View File

@@ -373,12 +373,28 @@ The output will be placed on the `docs` folder.
### Releases
Bump a new version with:
Steps:
1. Bump a new version with:
```bash
yarn version:bump <version>
# e.g. yarn version:bump 2.0.0
```
It will create a commit and a git tag that will need to be pushed on the main branch. A workflow will be triggered and will
publish the Semaphore packages on [npm](https://www.npmjs.com/) and release a new version on Github with its changelogs automatically.
This step creates a commit and a git tag.
2. Push the changes to main:
```bash
git push origin main
```
3. Push the new git tag:
```bash
git push origin <version>
# e.g. git push origin v2.0.0
```
After pushing the new git tag, a workflow will be triggered to publish the Semaphore packages on [npm](https://www.npmjs.com/) and release a new version on GitHub with its changelogs automatically.

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.9.0",
"@semaphore-protocol/utils": "4.11.1",
"@svgr/webpack": "^5.5.0",
"clsx": "^1.2.1",
"docusaurus-plugin-sass": "^0.2.5",

View File

@@ -14,7 +14,7 @@ The public [Semaphore identity](#identity) value used in [Semaphore groups](#gro
## Group
A group is a [Merkle tree](#merkle-tree) in which each leaf is an [identity commitment](#identity-commitment) for a user. Semaphore uses the [LeanIMT](https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html) implementation, which is an optimized binary incremental Merkle tree. The tree nodes are calculated using [Poseidon](https://www.poseidon-hash.info).
A group is a [Merkle tree](#merkle-tree) in which each leaf is an [identity commitment](#identity-commitment) for a user. Semaphore uses the [LeanIMT](https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html) implementation, which is an optimized binary incremental Merkle tree. The tree nodes are calculated using [Poseidon](https://www.poseidon-hash.info).
## Merkle tree

View File

@@ -87,6 +87,11 @@ You may choose to delegate such functionality to existing wallets such as Metama
3. The user can now recreate their Semaphore identity whenever they want by signing the same message with their Ethereum account in Metamask.
:::
:::warning Privacy risk
If a user signs the **same message** on multiple websites using MetaMask, all those websites will be able to **generate the same Semaphore identity**. This undermines anonymity and may allow third parties to **link identities across platforms** or even **gain control over a user's identity**.\
To mitigate this, encourage users to sign **unique messages per application** or implement safeguards that detect and warn about reuse.
:::
## Sign and verify messages
Semaphore V4 uses asymmetric cryptography and in particular EdDSA to generate the identity keys. It is therefore also possible to sign messages and verify their signatures.

View File

@@ -11,6 +11,8 @@ slug: /
Additionally, it provides a simple mechanism to prevent double-signaling.
Use cases include private voting, whistleblowing, anonymous DAOs and mixers.
For in-depth technical details about Semaphore, refer to the [Semaphore V4 Specification](https://github.com/zkspecs/zkspecs/blob/main/specs/3/README.md).
## Features
With Semaphore, you can allow your users to do the following:

View File

@@ -47,6 +47,7 @@ You can access any subgraph supported by Semaphore with the following URL: `http
Supported networks:
- `sepolia`
- `ethereum`
- `optimism`
- `optimism-sepolia`
- `arbitrum`

View File

@@ -9,8 +9,8 @@
"codegen:sepolia": "yarn codegen sepolia",
"build": "graph build",
"build:sepolia": "yarn codegen:sepolia && graph build",
"auth": "graph auth --studio",
"deploy": "graph deploy --studio ${0}",
"auth": "graph auth",
"deploy": "graph deploy ${0}",
"start-ipfs": "node scripts/start-ipfs.js",
"create-local": "graph create --node http://localhost:8020/ semaphore",
"remove-local": "graph remove --node http://localhost:8020/ semaphore",

View File

@@ -15,6 +15,10 @@ function mapNetwork(n) {
return "arbitrum-one"
}
if (n === "ethereum") {
return "mainnet"
}
return network
}

View File

@@ -47,5 +47,12 @@
"date": "2024-12-09",
"authors": ["glasswing"],
"url": "https://mirror.xyz/0xBE98D44c29D179588b7E717Db8898529e5cD770F/5Xlv1jzwJKfKgP-m257kjivBlUIM_cwTzsmpf9F0Su8"
},
{
"title": "Semaphore V4 Specification",
"minRead": 10,
"date": "2025-03-01",
"authors": ["Semaphore Team"],
"url": "https://github.com/zkspecs/zkspecs/blob/main/specs/3/README.md"
}
]

View File

@@ -1,20 +1,20 @@
[
{
"name": "DIF - Decentralized Identity Foundation",
"date": "Oct 1 - Nov 4, 2024",
"description": "Semaphore team will deliver a talk and sponsor prizes for the online hackathon.",
"link": "https://identity.foundation/"
"name": "ETHDam",
"date": "May 9-11, 2025",
"description": "Semaphore team will deliver an in-person talk.",
"link": "https://www.ethdam.com/"
},
{
"name": "Devcon",
"date": "Nov 12-15, 2024",
"name": "ZuBerlin",
"date": "June 14-22, 2025",
"description": "Semaphore team will deliver an in-person talk.",
"link": "https://zuberlin.city/"
},
{
"name": "Devconnect",
"date": "Nov 17-22, 2025",
"description": "Semaphore team will deliver an in-person talk and run workshops.",
"link": "https://devcon.org/en/"
},
{
"name": "ETHIndia",
"date": "Dec 6-8, 2024",
"description": "Semaphore team will deliver an in-person talk on Semaphore and Bandada.",
"link": "https://ethindia.co"
"link": "https://devconnect.org/"
}
]

View File

@@ -575,5 +575,16 @@
"links": {
"github": "https://github.com/quartz-technology/obscurus"
}
},
{
"name": "Semaphore Modular Smart Account Modules",
"categories": ["Wallet", "Privacy"],
"tagline": "Anonymous multi-sig wallet with Semaphore",
"pse": false,
"icon": "",
"links": {
"github": "https://github.com/jimmychu0807/semaphore-msa-modules",
"website": "https://semaphore-msa-modules.jimmychu0807.hk"
}
}
]

View File

@@ -28,11 +28,19 @@
"done": true
},
{
"name": "Semaphore Spec",
"done": false
"name": "Semaphore V4 Specification",
"done": true
},
{
"name": "Semaphore Rust Implementation",
"done": true
},
{
"name": "Semaphore Noir Implementation",
"done": false
},
{
"name": "Scaling Semaphore with PIR",
"done": false
}
]

View File

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

View File

@@ -56,7 +56,7 @@ template Semaphore(MAX_DEPTH) {
// Proof of membership verification.
// The Merkle root passed as output must be equal to that calculated within
// the circuit through the inputs of the Merkle proof.
// See https://github.com/privacy-scaling-explorations/zk-kit/blob/main/packages/circuits/circom/binary-merkle-root.circom
// See https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/main/packages/binary-merkle-root/src/binary-merkle-root.circom
// to know more about how the 'BinaryMerkleRoot' template works.
merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndices, merkleProofSiblings);

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-contracts-hardhat",
"version": "4.9.0",
"version": "4.11.1",
"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.9.0",
"@semaphore-protocol/hardhat": "4.9.0",
"@semaphore-protocol/utils": "4.9.0",
"@semaphore-protocol/core": "4.11.1",
"@semaphore-protocol/hardhat": "4.11.1",
"@semaphore-protocol/utils": "4.11.1",
"@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.9.0"
"@semaphore-protocol/contracts": "4.11.1"
},
"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.9.0",
"@semaphore-protocol/hardhat": "4.9.0",
"@semaphore-protocol/utils": "4.9.0",
"@semaphore-protocol/core": "4.11.1",
"@semaphore-protocol/hardhat": "4.11.1",
"@semaphore-protocol/utils": "4.11.1",
"@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.9.0"
"@semaphore-protocol/contracts": "4.11.1"
},
"packageManager": "yarn@4.1.0"
}

View File

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

View File

@@ -114,7 +114,7 @@ export default function GroupsPage() {
</a>{" "}
are{" "}
<a
href="https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html"
href="https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html"
target="_blank"
rel="noreferrer noopener nofollow"
>

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-monorepo-ethers",
"version": "4.9.0",
"version": "4.11.1",
"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.9.0",
"@semaphore-protocol/hardhat": "4.9.0",
"@semaphore-protocol/utils": "4.9.0",
"@semaphore-protocol/core": "4.11.1",
"@semaphore-protocol/hardhat": "4.11.1",
"@semaphore-protocol/utils": "4.11.1",
"@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.9.0"
"@semaphore-protocol/contracts": "4.11.1"
},
"packageManager": "yarn@4.1.0"
}

View File

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

View File

@@ -114,7 +114,7 @@ export default function GroupsPage() {
</a>{" "}
are{" "}
<a
href="https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html"
href="https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html"
target="_blank"
rel="noreferrer noopener nofollow"
>

View File

@@ -90,7 +90,7 @@ export default function GroupsPage() {
</a>{" "}
are{" "}
<a
href="https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html"
href="https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html"
target="_blank"
rel="noreferrer noopener nofollow"
>

View File

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

View File

@@ -1,7 +1,7 @@
{
"name": "@semaphore-protocol/cli",
"type": "module",
"version": "4.9.0",
"version": "4.11.1",
"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.9.0",
"@semaphore-protocol/utils": "4.9.0",
"@semaphore-protocol/data": "4.11.1",
"@semaphore-protocol/utils": "4.11.1",
"axios": "^1.6.7",
"boxen": "^7.1.1",
"chalk": "^5.3.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/contracts",
"version": "4.9.0",
"version": "4.11.1",
"description": "Semaphore contracts to manage groups and broadcast anonymous signals.",
"license": "MIT",
"files": [
@@ -30,6 +30,6 @@
"access": "public"
},
"dependencies": {
"@zk-kit/lean-imt.sol": "2.0.0"
"@zk-kit/lean-imt.sol": "2.0.1"
}
}

View File

@@ -42,6 +42,6 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@zk-kit/lean-imt.sol": "2.0.0"
"@zk-kit/lean-imt.sol": "2.0.1"
}
}

View File

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

View File

@@ -49,8 +49,8 @@
</h4>
</div>
| This library provides tools for querying and interacting with the [`Semaphore.sol`](https://github.com/semaphore-protocol/semaphore/blob/main/packages/contracts/contracts/Semaphore.sol) smart contract. It supports both the Semaphore subgraph and direct Ethereum network connections via Ethers. Designed for use in both Node.js and browser environments, it facilitates the management of group data and verification processes within the Semaphore protocol. |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| This library provides tools for querying and interacting with the [`Semaphore.sol`](https://github.com/semaphore-protocol/semaphore/blob/main/packages/contracts/contracts/Semaphore.sol) smart contract. It supports the Semaphore subgraph and direct Ethereum network connections via Ethers or Viem. Designed for use in both Node.js and browser environments, it facilitates the management of group data and verification processes within the Semaphore protocol. |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
## 🛠 Install
@@ -173,10 +173,10 @@ const admin = await semaphoreEthers.getGroupAdmin("42")
const members = await semaphoreEthers.getGroupMembers("42")
```
**Fetch Verified Proofs**
**Fetch Validated Proofs**
```typescript
const verifiedProofs = await semaphoreEthers.getGroupVerifiedProofs("42")
const verifiedProofs = await semaphoreEthers.getGroupValidatedProofs("42")
```
**Check Group Membership**
@@ -187,3 +187,59 @@ const isMember = await semaphoreEthers.isGroupMember(
"16948514235341957898454876473214737047419402240398321289450170535251226167324"
)
```
### Using Viem for Direct Blockchain Interaction
**Initialize a Semaphore Viem instance**
```typescript
import { SemaphoreViem } from "@semaphore-protocol/data"
const semaphoreViem = new SemaphoreViem()
// or:
const semaphoreViemOnSepolia = new SemaphoreViem("sepolia", {
address: "semaphore-address",
startBlock: 0n
})
// or:
const localViemInstance = new SemaphoreViem("http://localhost:8545", {
address: "semaphore-address"
})
```
With your SemaphoreViem instance, you can:
**Fetch Group IDs**
```typescript
const groupIds = await semaphoreViem.getGroupIds()
```
**Fetch Group Details**
```typescript
const group = await semaphoreViem.getGroup("42")
```
**Fetch Group Members**
```typescript
const members = await semaphoreViem.getGroupMembers("42")
```
**Fetch Validated Proofs**
```typescript
const validatedProofs = await semaphoreViem.getGroupValidatedProofs("42")
```
**Check Group Membership**
```typescript
const isMember = await semaphoreViem.isGroupMember(
"42",
"16948514235341957898454876473214737047419402240398321289450170535251226167324"
)
```

View File

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

View File

@@ -12,5 +12,5 @@ export default function getURL(supportedNetwork: SupportedNetwork): string {
throw new TypeError(`Network '${supportedNetwork}' is not supported`)
}
return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v4.2.0`
return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v4.3.0`
}

View File

@@ -1,5 +1,6 @@
import SemaphoreEthers from "./ethers"
import SemaphoreSubgraph from "./subgraph"
import SemaphoreViem from "./viem"
export * from "./types"
export { SemaphoreSubgraph, SemaphoreEthers }
export { SemaphoreSubgraph, SemaphoreEthers, SemaphoreViem }

View File

@@ -10,7 +10,7 @@ import { jsDateToGraphqlDate } from "./utils"
* The SemaphoreSubgraph class provides an interface to interact with the Semaphore smart contract
* via subgraph queries. It enables operations such as retrieving lists of group members and validated proofs,
* as well as checking membership within groups.
* Each group in Semaphore is represented as a {@link https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html | LeanIMT}
* Each group in Semaphore is represented as a {@link https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html | LeanIMT}
* (Lean Incremental Merkle Tree). This class supports interaction through either a
* {@link SupportedNetwork} or a direct URL to the subgraph. The subgraphs themselves are hosted on
* {@link https://thegraph.com/ | The Graph} protocol, facilitating efficient and decentralized query processing.

View File

@@ -1,3 +1,5 @@
import { Chain, Transport } from "viem"
export type EthersNetwork =
| "mainnet"
| "sepolia"
@@ -12,6 +14,8 @@ export type EthersNetwork =
| "linea"
| "linea-sepolia"
export type ViemNetwork = EthersNetwork
export type GroupOptions = {
members?: boolean
validatedProofs?: boolean
@@ -54,3 +58,11 @@ export type EthersOptions = {
applicationId?: string // Pocket
applicationSecret?: string // Pocket
}
export type ViemOptions = {
address?: string
startBlock?: bigint | number
transport?: Transport // Transport from viem
chain?: Chain // Chain from viem
apiKey?: string
}

403
packages/data/src/viem.ts Normal file
View File

@@ -0,0 +1,403 @@
import {
SupportedNetwork,
defaultNetwork,
getDeployedContract,
isSupportedNetwork
} from "@semaphore-protocol/utils/networks"
import { SemaphoreABI } from "@semaphore-protocol/utils/constants"
import { requireString } from "@zk-kit/utils/error-handlers"
import {
Address,
createPublicClient,
http,
PublicClient,
getContract,
GetContractReturnType,
zeroAddress,
Transport,
Chain,
Log
} from "viem"
import { GroupResponse, ViemNetwork, ViemOptions } from "./types"
// Define types for the event logs to properly access args
type GroupCreatedLog = Log<bigint, number, boolean, any, any, any, "GroupCreated"> & {
args: {
groupId: bigint
}
}
type MemberRemovedLog = Log<bigint, number, boolean, any, any, any, "MemberRemoved"> & {
args: {
groupId: string
index: bigint
}
}
type MemberUpdatedLog = Log<bigint, number, boolean, any, any, any, "MemberUpdated"> & {
args: {
groupId: string
index: bigint
newIdentityCommitment: string
}
}
type MembersAddedLog = Log<bigint, number, boolean, any, any, any, "MembersAdded"> & {
args: {
groupId: string
startIndex: bigint
identityCommitments: string[]
}
}
type MemberAddedLog = Log<bigint, number, boolean, any, any, any, "MemberAdded"> & {
args: {
groupId: string
index: bigint
identityCommitment: string
}
}
type ProofValidatedLog = Log<bigint, number, boolean, any, any, any, "ProofValidated"> & {
args: {
groupId: string
message: string
merkleTreeRoot: string
merkleTreeDepth: string
scope: string
nullifier: string
x: string
y: string
}
}
/**
* The SemaphoreViem class provides a high-level interface to interact with the Semaphore smart contract
* using the {@link https://viem.sh | viem} library. It encapsulates all necessary functionalities to connect to Ethereum networks,
* manage contract instances, and perform operations such as retrieving group information or checking group memberships.
* This class simplifies the interaction with the Ethereum blockchain by abstracting the details of network connections
* and contract interactions.
*/
export default class SemaphoreViem {
private _network: ViemNetwork | string
private _options: ViemOptions
private _client: PublicClient
private _contract: GetContractReturnType<typeof SemaphoreABI, PublicClient>
/**
* Constructs a new SemaphoreViem instance, initializing it with a network or a custom Ethereum node URL,
* and optional configuration settings for the viem client and contract.
* @param networkOrEthereumURL The Ethereum network name or a custom JSON-RPC URL to connect to.
* @param options Configuration options for the viem client and the Semaphore contract.
*/
constructor(networkOrEthereumURL: ViemNetwork | string = defaultNetwork, options: ViemOptions = {}) {
requireString(networkOrEthereumURL, "networkOrEthereumURL")
if (options.transport) {
// Transport is provided directly
} else if (!networkOrEthereumURL.startsWith("http")) {
// Default to http transport if no transport is provided and network is not a URL
options.transport = http()
}
if (options.apiKey) {
requireString(options.apiKey, "apiKey")
}
if (isSupportedNetwork(networkOrEthereumURL)) {
const { address, startBlock } = getDeployedContract(networkOrEthereumURL as SupportedNetwork)
options.address ??= address
options.startBlock ??= BigInt(startBlock)
} else {
options.startBlock ??= 0n
}
if (options.address === undefined) {
throw new Error(`Network '${networkOrEthereumURL}' needs a Semaphore contract address`)
}
// Create the public client
let transport: Transport
if (options.transport) {
transport = options.transport
} else {
// If no transport is provided, use http transport with the URL
transport = http(networkOrEthereumURL)
}
this._network = networkOrEthereumURL
this._options = options
// Create the public client
this._client = createPublicClient({
transport,
chain: options.chain as Chain
})
// Create the contract instance
this._contract = getContract({
address: options.address as Address,
abi: SemaphoreABI,
client: this._client
})
}
/**
* Retrieves the Ethereum network or custom URL currently used by this instance.
* @returns The network or URL as a string.
*/
get network(): ViemNetwork | string {
return this._network
}
/**
* Retrieves the options used for configuring the viem client and the Semaphore contract.
* @returns The configuration options.
*/
get options(): ViemOptions {
return this._options
}
/**
* Retrieves the viem Contract instance used to interact with the Semaphore contract.
* @returns The Contract instance.
*/
get contract(): GetContractReturnType<typeof SemaphoreABI, PublicClient> {
return this._contract
}
/**
* Retrieves the viem Public Client instance used to interact with the blockchain.
* @returns The Public Client instance.
*/
get client(): PublicClient {
return this._client
}
/**
* Fetches the list of group IDs from the Semaphore contract by querying the "GroupCreated" events.
* @returns A promise that resolves to an array of group IDs as strings.
*/
async getGroupIds(): Promise<string[]> {
const logs = (await this._client.getContractEvents({
address: this._options.address as Address,
abi: SemaphoreABI,
eventName: "GroupCreated",
fromBlock: BigInt(this._options.startBlock || 0)
})) as GroupCreatedLog[]
return logs.map((log) => log.args.groupId.toString())
}
/**
* Retrieves detailed information about a specific group by its ID. This method queries the Semaphore contract
* to get the group's admin, Merkle tree root, depth, and size.
* @param groupId The unique identifier of the group.
* @returns A promise that resolves to a GroupResponse object.
*/
async getGroup(groupId: string): Promise<GroupResponse> {
requireString(groupId, "groupId")
const groupAdmin = await this._contract.read.getGroupAdmin([groupId])
if (groupAdmin === zeroAddress) {
throw new Error(`Group '${groupId}' not found`)
}
const merkleTreeRoot = await this._contract.read.getMerkleTreeRoot([groupId])
const merkleTreeDepth = await this._contract.read.getMerkleTreeDepth([groupId])
const merkleTreeSize = await this._contract.read.getMerkleTreeSize([groupId])
const group: GroupResponse = {
id: groupId,
admin: groupAdmin as string,
merkleTree: {
depth: Number(merkleTreeDepth),
size: Number(merkleTreeSize),
root: merkleTreeRoot ? merkleTreeRoot.toString() : ""
}
}
return group
}
/**
* Fetches a list of members from a specific group. This method queries the Semaphore contract for events
* related to member additions and updates, and constructs the list of current group members.
* @param groupId The unique identifier of the group.
* @returns A promise that resolves to an array of member identity commitments as strings.
*/
async getGroupMembers(groupId: string): Promise<string[]> {
requireString(groupId, "groupId")
const groupAdmin = await this._contract.read.getGroupAdmin([groupId])
if (groupAdmin === zeroAddress) {
throw new Error(`Group '${groupId}' not found`)
}
// Get member removed events
const memberRemovedEvents = (await this._client.getContractEvents({
address: this._options.address as Address,
abi: SemaphoreABI,
eventName: "MemberRemoved",
args: {
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MemberRemovedLog[]
// Get member updated events
const memberUpdatedEvents = (await this._client.getContractEvents({
address: this._options.address as Address,
abi: SemaphoreABI,
eventName: "MemberUpdated",
args: {
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MemberUpdatedLog[]
const memberUpdatedEventsMap = new Map<string, [bigint, string]>()
for (const event of memberUpdatedEvents) {
if (event.args.index && event.args.newIdentityCommitment && event.blockNumber) {
memberUpdatedEventsMap.set(event.args.index.toString(), [
event.blockNumber,
event.args.newIdentityCommitment.toString()
])
}
}
for (const event of memberRemovedEvents) {
if (event.args.index && event.blockNumber) {
const groupUpdate = memberUpdatedEventsMap.get(event.args.index.toString())
if (!groupUpdate || (groupUpdate && groupUpdate[0] < event.blockNumber)) {
memberUpdatedEventsMap.set(event.args.index.toString(), [event.blockNumber, "0"])
}
}
}
// Get members added events (batch additions)
const membersAddedEvents = (await this._client.getContractEvents({
address: this._options.address as Address,
abi: SemaphoreABI,
eventName: "MembersAdded",
args: {
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MembersAddedLog[]
const membersAddedEventsMap = new Map<string, string[]>()
for (const event of membersAddedEvents) {
if (event.args.startIndex && event.args.identityCommitments) {
membersAddedEventsMap.set(
event.args.startIndex.toString(),
event.args.identityCommitments.map((i) => i.toString())
)
}
}
// Get individual member added events
const memberAddedEvents = (await this._client.getContractEvents({
address: this._options.address as Address,
abi: SemaphoreABI,
eventName: "MemberAdded",
args: {
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MemberAddedLog[]
const members: string[] = []
const merkleTreeSize = await this._contract.read.getMerkleTreeSize([groupId])
let index = 0
while (index < Number(merkleTreeSize)) {
const identityCommitments = membersAddedEventsMap.get(index.toString())
if (identityCommitments) {
members.push(...identityCommitments)
index += identityCommitments.length
} else {
const currentIndex = index // Create a closure to capture the current index value
const event = memberAddedEvents.find((e) => Number(e.args.index) === currentIndex)
if (event && event.args.identityCommitment) {
members.push(event.args.identityCommitment.toString())
}
index += 1
}
}
// Apply updates to members
for (let j = 0; j < members.length; j += 1) {
const groupUpdate = memberUpdatedEventsMap.get(j.toString())
if (groupUpdate) {
members[j] = groupUpdate[1].toString()
}
}
return members
}
/**
* Fetches a list of validated proofs for a specific group. This method queries the Semaphore contract for events
* related to proof verification.
* @param groupId The unique identifier of the group.
* @returns A promise that resolves to an array of validated proofs.
*/
async getGroupValidatedProofs(groupId: string): Promise<any> {
requireString(groupId, "groupId")
const groupAdmin = await this._contract.read.getGroupAdmin([groupId])
if (groupAdmin === zeroAddress) {
throw new Error(`Group '${groupId}' not found`)
}
const proofValidatedEvents = (await this._client.getContractEvents({
address: this._options.address as Address,
abi: SemaphoreABI,
eventName: "ProofValidated",
args: {
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as ProofValidatedLog[]
return proofValidatedEvents.map((event) => ({
message: event.args.message?.toString() || "",
merkleTreeRoot: event.args.merkleTreeRoot?.toString() || "",
merkleTreeDepth: event.args.merkleTreeDepth?.toString() || "",
scope: event.args.scope?.toString() || "",
nullifier: event.args.nullifier?.toString() || "",
points: [event.args.x?.toString() || "", event.args.y?.toString() || ""],
timestamp: event.blockNumber ? new Date(Number(event.blockNumber) * 1000).toISOString() : undefined
}))
}
/**
* Checks if a given identity commitment is a member of a specific group.
* @param groupId The unique identifier of the group.
* @param member The identity commitment to check.
* @returns A promise that resolves to a boolean indicating whether the member is in the group.
*/
async isGroupMember(groupId: string, member: string): Promise<boolean> {
requireString(groupId, "groupId")
requireString(member, "member")
const members = await this.getGroupMembers(groupId)
return members.includes(member)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/group",
"version": "4.9.0",
"version": "4.11.1",
"description": "A library to create and manage Semaphore groups.",
"type": "module",
"license": "MIT",
@@ -36,7 +36,7 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@zk-kit/lean-imt": "2.2.2",
"@zk-kit/lean-imt": "2.2.3",
"@zk-kit/utils": "1.3.0",
"poseidon-lite": "0.3.0"
}

View File

@@ -3,7 +3,7 @@ import type { BigNumber } from "@zk-kit/utils"
import { poseidon2 } from "poseidon-lite/poseidon2"
/**
* The Semaphore group is a {@link https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html | LeanIMT}
* The Semaphore group is a {@link https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html | LeanIMT}
* (Lean Incremental Merkle Tree), i.e. an optimized version of the incremental binary Merkle tree
* used by Semaphore V3. The new tree does not use zero hashes, and its depth is dynamic.
* The members of a Semaphore group, or the leaves of a tree, are the identity commitments.
@@ -13,7 +13,7 @@ import { poseidon2 } from "poseidon-lite/poseidon2"
* generation and verification. Groups can also be exported or imported.
*/
export class Group {
// The {@link https://zkkit.pse.dev/classes/_zk_kit_imt.LeanIMT.html | LeanIMT} instance.
// The {@link https://zkkit.pse.dev/classes/_zk_kit_lean_imt.LeanIMT.html | LeanIMT} instance.
public leanIMT: LeanIMT
/**

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/hardhat",
"version": "4.9.0",
"version": "4.11.1",
"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.9.0",
"@semaphore-protocol/contracts": "4.11.1",
"ethers": "^6.13.4",
"hardhat-dependency-compiler": "^1.1.3"
}

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/proof",
"version": "4.9.0",
"version": "4.11.1",
"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.9.0",
"@semaphore-protocol/identity": "4.9.0"
"@semaphore-protocol/group": "4.11.1",
"@semaphore-protocol/identity": "4.11.1"
},
"dependencies": {
"@semaphore-protocol/utils": "4.9.0",
"@semaphore-protocol/utils": "4.11.1",
"@zk-kit/artifacts": "1.8.0",
"@zk-kit/utils": "1.3.0",
"ethers": "6.13.4",

View File

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

View File

@@ -5,17 +5,37 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 6983614
"startBlock": 8263690
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 6983614
"startBlock": 8263690
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 6983614
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 8263690
}
]
},
{
"network": "ethereum",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 22424592
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 22424592
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 22424592
}
]
},
@@ -25,17 +45,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 93258221
"startBlock": 149903019
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 93258221
"startBlock": 149903019
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 93258221
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 149903019
}
]
},
@@ -45,17 +65,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 19289434
"startBlock": 27341051
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 19289434
"startBlock": 27341051
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 19289434
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 27341051
}
]
},
@@ -65,17 +85,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 13850778
"startBlock": 21308099
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 13850778
"startBlock": 21308099
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 13850778
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 21308099
}
]
},
@@ -85,17 +105,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 269586534
"startBlock": 333645515
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 269586534
"startBlock": 333645515
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 269586534
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 333645515
}
]
},
@@ -105,17 +125,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 63715311
"startBlock": 71158898
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 63715311
"startBlock": 71158898
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 63715311
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 71158898
}
]
},
@@ -125,17 +145,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 127391657
"startBlock": 135443119
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 127391657
"startBlock": 135443119
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 127391657
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 135443119
}
]
},
@@ -145,17 +165,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 17307202
"startBlock": 25358716
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 17307202
"startBlock": 25358716
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 17307202
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 25358716
}
]
},
@@ -165,17 +185,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 5225214
"startBlock": 12757656
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 5225214
"startBlock": 12757656
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 5225214
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 12757656
}
]
},
@@ -185,17 +205,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 21796660
"startBlock": 29848242
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 21796660
"startBlock": 29848242
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 21796660
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 29848242
}
]
},
@@ -205,17 +225,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 11459722
"startBlock": 18707811
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 11459722
"startBlock": 18707811
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 11459722
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 18707811
}
]
},
@@ -225,17 +245,17 @@
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 7397758
"startBlock": 9604960
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 7397758
"startBlock": 9604960
},
{
"name": "Semaphore",
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
"startBlock": 7397758
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 9604960
}
]
}

View File

@@ -5,6 +5,12 @@ export default {
chainId: 11155111,
explorer: "https://sepolia.etherscan.io"
},
ethereum: {
name: "Ethereum",
url: "https://eth-mainnet.g.alchemy.com/v2/<your-api-key>",
chainId: 1,
explorer: "https://etherscan.io"
},
"arbitrum-sepolia": {
name: "Arbitrum Sepolia",
url: "https://sepolia-rollup.arbitrum.io/rpc",

File diff suppressed because one or more lines are too long

236
yarn.lock
View File

@@ -12,6 +12,13 @@ __metadata:
languageName: node
linkType: hard
"@adraffy/ens-normalize@npm:^1.10.1":
version: 1.11.0
resolution: "@adraffy/ens-normalize@npm:1.11.0"
checksum: 10/abef75f21470ea43dd6071168e092d2d13e38067e349e76186c78838ae174a46c3e18ca50921d05bea6ec3203074147c9e271f8cb6531d1c2c0e146f3199ddcb
languageName: node
linkType: hard
"@algolia/autocomplete-core@npm:1.9.3":
version: 1.9.3
resolution: "@algolia/autocomplete-core@npm:1.9.3"
@@ -6491,7 +6498,7 @@ __metadata:
languageName: node
linkType: hard
"@noble/curves@npm:^1.7.0":
"@noble/curves@npm:1.8.1, @noble/curves@npm:^1.6.0, @noble/curves@npm:^1.7.0, @noble/curves@npm:~1.8.1":
version: 1.8.1
resolution: "@noble/curves@npm:1.8.1"
dependencies:
@@ -6521,7 +6528,7 @@ __metadata:
languageName: node
linkType: hard
"@noble/hashes@npm:1.7.1, @noble/hashes@npm:^1.6.1":
"@noble/hashes@npm:1.7.1, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:^1.6.1, @noble/hashes@npm:~1.7.1":
version: 1.7.1
resolution: "@noble/hashes@npm:1.7.1"
checksum: 10/ca3120da0c3e7881d6a481e9667465cc9ebbee1329124fb0de442e56d63fef9870f8cc96f264ebdb18096e0e36cebc0e6e979a872d545deb0a6fed9353f17e05
@@ -7440,6 +7447,13 @@ __metadata:
languageName: node
linkType: hard
"@scure/base@npm:~1.2.2, @scure/base@npm:~1.2.4":
version: 1.2.4
resolution: "@scure/base@npm:1.2.4"
checksum: 10/4b61679209af40143b49ce7b7570e1d9157c19df311ea6f57cd212d764b0b82222dbe3707334f08bec181caf1f047aca31aa91193c678d6548312cb3f9c82ab1
languageName: node
linkType: hard
"@scure/bip32@npm:1.1.5":
version: 1.1.5
resolution: "@scure/bip32@npm:1.1.5"
@@ -7462,6 +7476,17 @@ __metadata:
languageName: node
linkType: hard
"@scure/bip32@npm:1.6.2, @scure/bip32@npm:^1.5.0":
version: 1.6.2
resolution: "@scure/bip32@npm:1.6.2"
dependencies:
"@noble/curves": "npm:~1.8.1"
"@noble/hashes": "npm:~1.7.1"
"@scure/base": "npm:~1.2.2"
checksum: 10/474ee315a8631aa1a7d378b0521b4494e09a231519ec53d879088cb88c8ff644a89b27a02a8bf0b5a9b1c4c0417acc70636ccdb121b800c34594ae53c723f8d7
languageName: node
linkType: hard
"@scure/bip39@npm:1.1.1":
version: 1.1.1
resolution: "@scure/bip39@npm:1.1.1"
@@ -7482,6 +7507,16 @@ __metadata:
languageName: node
linkType: hard
"@scure/bip39@npm:1.5.4, @scure/bip39@npm:^1.4.0":
version: 1.5.4
resolution: "@scure/bip39@npm:1.5.4"
dependencies:
"@noble/hashes": "npm:~1.7.1"
"@scure/base": "npm:~1.2.4"
checksum: 10/9f08b433511d7637bc48c51aa411457d5f33da5a85bd03370bf394822b0ea8c007ceb17247a3790c28237303d8fc20c4e7725765940cd47e1365a88319ad0d5c
languageName: node
linkType: hard
"@semaphore-protocol/circuits@workspace:packages/circuits":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/circuits@workspace:packages/circuits"
@@ -7501,8 +7536,8 @@ __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.9.0"
"@zk-kit/lean-imt.sol": "npm:2.0.0"
"@semaphore-protocol/contracts": "npm:4.11.1"
"@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"
prettier: "npm:^3.2.5"
@@ -7521,10 +7556,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.9.0"
"@semaphore-protocol/core": "npm:4.9.0"
"@semaphore-protocol/hardhat": "npm:4.9.0"
"@semaphore-protocol/utils": "npm:4.9.0"
"@semaphore-protocol/contracts": "npm:4.11.1"
"@semaphore-protocol/core": "npm:4.11.1"
"@semaphore-protocol/hardhat": "npm:4.11.1"
"@semaphore-protocol/utils": "npm:4.11.1"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -7574,8 +7609,8 @@ __metadata:
resolution: "@semaphore-protocol/cli@workspace:packages/cli"
dependencies:
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/data": "npm:4.9.0"
"@semaphore-protocol/utils": "npm:4.9.0"
"@semaphore-protocol/data": "npm:4.11.1"
"@semaphore-protocol/utils": "npm:4.11.1"
"@types/figlet": "npm:^1.5.8"
"@types/inquirer": "npm:^9.0.7"
"@types/pacote": "npm:^11.1.8"
@@ -7599,46 +7634,47 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/contracts@npm:4.9.0, @semaphore-protocol/contracts@workspace:packages/contracts/contracts":
"@semaphore-protocol/contracts@npm:4.11.1, @semaphore-protocol/contracts@workspace:packages/contracts/contracts":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/contracts@workspace:packages/contracts/contracts"
dependencies:
"@zk-kit/lean-imt.sol": "npm:2.0.0"
"@zk-kit/lean-imt.sol": "npm:2.0.1"
languageName: unknown
linkType: soft
"@semaphore-protocol/core@npm:4.9.0, @semaphore-protocol/core@workspace:^, @semaphore-protocol/core@workspace:packages/core":
"@semaphore-protocol/core@npm:4.11.1, @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.9.0"
"@semaphore-protocol/identity": "npm:4.9.0"
"@semaphore-protocol/proof": "npm:4.9.0"
"@semaphore-protocol/group": "npm:4.11.1"
"@semaphore-protocol/identity": "npm:4.11.1"
"@semaphore-protocol/proof": "npm:4.11.1"
languageName: unknown
linkType: soft
"@semaphore-protocol/data@npm:4.9.0, @semaphore-protocol/data@workspace:packages/data":
"@semaphore-protocol/data@npm:4.11.1, @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.9.0"
"@semaphore-protocol/utils": "npm:4.11.1"
"@zk-kit/utils": "npm:1.3.0"
axios: "npm:1.6.6"
ethers: "npm:6.13.4"
rimraf: "npm:^5.0.5"
rollup: "npm:^4.12.0"
rollup-plugin-cleanup: "npm:^3.2.1"
viem: "npm:2.23.7"
languageName: unknown
linkType: soft
"@semaphore-protocol/group@npm:4.9.0, @semaphore-protocol/group@workspace:packages/group":
"@semaphore-protocol/group@npm:4.11.1, @semaphore-protocol/group@workspace:packages/group":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/group@workspace:packages/group"
dependencies:
"@rollup/plugin-typescript": "npm:^11.1.6"
"@zk-kit/lean-imt": "npm:2.2.2"
"@zk-kit/lean-imt": "npm:2.2.3"
"@zk-kit/utils": "npm:1.3.0"
poseidon-lite: "npm:0.3.0"
rimraf: "npm:^5.0.5"
@@ -7647,13 +7683,13 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/hardhat@npm:4.9.0, @semaphore-protocol/hardhat@workspace:packages/hardhat":
"@semaphore-protocol/hardhat@npm:4.11.1, @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.9.0"
"@semaphore-protocol/contracts": "npm:4.11.1"
ethers: "npm:^6.13.4"
hardhat: "npm:^2.19.4"
hardhat-dependency-compiler: "npm:^1.1.3"
@@ -7665,7 +7701,7 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/identity@npm:4.9.0, @semaphore-protocol/identity@workspace:packages/identity":
"@semaphore-protocol/identity@npm:4.11.1, @semaphore-protocol/identity@workspace:packages/identity":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/identity@workspace:packages/identity"
dependencies:
@@ -7681,14 +7717,14 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/proof@npm:4.9.0, @semaphore-protocol/proof@workspace:packages/proof":
"@semaphore-protocol/proof@npm:4.11.1, @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.9.0"
"@semaphore-protocol/utils": "npm:4.11.1"
"@types/snarkjs": "npm:^0"
"@zk-kit/artifacts": "npm:1.8.0"
"@zk-kit/utils": "npm:1.3.0"
@@ -7698,12 +7734,12 @@ __metadata:
rollup-plugin-cleanup: "npm:^3.2.1"
snarkjs: "npm:0.7.4"
peerDependencies:
"@semaphore-protocol/group": 4.9.0
"@semaphore-protocol/identity": 4.9.0
"@semaphore-protocol/group": 4.11.1
"@semaphore-protocol/identity": 4.11.1
languageName: unknown
linkType: soft
"@semaphore-protocol/utils@npm:4.9.0, @semaphore-protocol/utils@workspace:packages/utils":
"@semaphore-protocol/utils@npm:4.11.1, @semaphore-protocol/utils@workspace:packages/utils":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/utils@workspace:packages/utils"
dependencies:
@@ -9752,21 +9788,21 @@ __metadata:
languageName: node
linkType: hard
"@zk-kit/lean-imt.sol@npm:2.0.0":
version: 2.0.0
resolution: "@zk-kit/lean-imt.sol@npm:2.0.0"
"@zk-kit/lean-imt.sol@npm:2.0.1":
version: 2.0.1
resolution: "@zk-kit/lean-imt.sol@npm:2.0.1"
dependencies:
poseidon-solidity: "npm:0.0.5"
checksum: 10/094a1788905c380ed5c767184938d3aa0d0b3ba8ad92e8d6efae1243e4d15103484ec1224163ae7d0c43e0095ae19f28e41a7877d37398ff60dcadbf1eb27a77
checksum: 10/debfd6caa46c6b4ff5dfa9a98d50656311ed5ba999417ae23f1b279c1c171d722de9b396bfbbf56705e7041bc3cc4f7d579f97653c97544fd160a834c1e427dd
languageName: node
linkType: hard
"@zk-kit/lean-imt@npm:2.2.2":
version: 2.2.2
resolution: "@zk-kit/lean-imt@npm:2.2.2"
"@zk-kit/lean-imt@npm:2.2.3":
version: 2.2.3
resolution: "@zk-kit/lean-imt@npm:2.2.3"
dependencies:
"@zk-kit/utils": "npm:1.2.1"
checksum: 10/321e1964a4a0b7a19083c01743f5ee2a7311b1eede6775ce952a6fecf07d347dc4cdb250a557ff459bc6d3bff030e2a571f5116510c2392ca523f50c4d02311d
"@zk-kit/utils": "npm:1.3.0"
checksum: 10/a651d9d3030a91f77d9fe3d781383776f9189d2f2d8d4d27b1692e6ea5522f7b81d6baeae2fbd6c41878bc66700ab358074bbd9d5bac109d4114138066312a05
languageName: node
linkType: hard
@@ -9834,6 +9870,21 @@ __metadata:
languageName: node
linkType: hard
"abitype@npm:1.0.8, abitype@npm:^1.0.6":
version: 1.0.8
resolution: "abitype@npm:1.0.8"
peerDependencies:
typescript: ">=5.0.4"
zod: ^3 >=3.22.0
peerDependenciesMeta:
typescript:
optional: true
zod:
optional: true
checksum: 10/878e74fbac6a971953649b6216950437aa5834a604e9fa833a5b275a6967cff59857c7e43594ae906387d2fb7cad9370138dec4298eb8814815a3ffb6365902c
languageName: node
linkType: hard
"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8":
version: 1.3.8
resolution: "accepts@npm:1.3.8"
@@ -15119,6 +15170,13 @@ __metadata:
languageName: node
linkType: hard
"eventemitter3@npm:5.0.1, eventemitter3@npm:^5.0.1":
version: 5.0.1
resolution: "eventemitter3@npm:5.0.1"
checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5
languageName: node
linkType: hard
"eventemitter3@npm:^4.0.0":
version: 4.0.7
resolution: "eventemitter3@npm:4.0.7"
@@ -15126,13 +15184,6 @@ __metadata:
languageName: node
linkType: hard
"eventemitter3@npm:^5.0.1":
version: 5.0.1
resolution: "eventemitter3@npm:5.0.1"
checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5
languageName: node
linkType: hard
"events@npm:^3.2.0":
version: 3.3.0
resolution: "events@npm:3.3.0"
@@ -18434,6 +18485,15 @@ __metadata:
languageName: node
linkType: hard
"isows@npm:1.0.6":
version: 1.0.6
resolution: "isows@npm:1.0.6"
peerDependencies:
ws: "*"
checksum: 10/ab9e85b50bcc3d70aa5ec875aa2746c5daf9321cb376ed4e5434d3c2643c5d62b1f466d93a05cd2ad0ead5297224922748c31707cb4fbd68f5d05d0479dce99c
languageName: node
linkType: hard
"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0":
version: 3.2.2
resolution: "istanbul-lib-coverage@npm:3.2.2"
@@ -21511,10 +21571,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.9.0"
"@semaphore-protocol/core": "npm:4.9.0"
"@semaphore-protocol/hardhat": "npm:4.9.0"
"@semaphore-protocol/utils": "npm:4.9.0"
"@semaphore-protocol/contracts": "npm:4.11.1"
"@semaphore-protocol/core": "npm:4.11.1"
"@semaphore-protocol/hardhat": "npm:4.11.1"
"@semaphore-protocol/utils": "npm:4.11.1"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -21547,9 +21607,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.9.0"
"@semaphore-protocol/data": "npm:4.9.0"
"@semaphore-protocol/utils": "npm:4.9.0"
"@semaphore-protocol/core": "npm:4.11.1"
"@semaphore-protocol/data": "npm:4.11.1"
"@semaphore-protocol/utils": "npm:4.11.1"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -21574,10 +21634,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.9.0"
"@semaphore-protocol/core": "npm:4.9.0"
"@semaphore-protocol/hardhat": "npm:4.9.0"
"@semaphore-protocol/utils": "npm:4.9.0"
"@semaphore-protocol/contracts": "npm:4.11.1"
"@semaphore-protocol/core": "npm:4.11.1"
"@semaphore-protocol/hardhat": "npm:4.11.1"
"@semaphore-protocol/utils": "npm:4.11.1"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -21610,9 +21670,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.9.0"
"@semaphore-protocol/data": "npm:4.9.0"
"@semaphore-protocol/utils": "npm:4.9.0"
"@semaphore-protocol/core": "npm:4.11.1"
"@semaphore-protocol/data": "npm:4.11.1"
"@semaphore-protocol/utils": "npm:4.11.1"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -22571,6 +22631,26 @@ __metadata:
languageName: node
linkType: hard
"ox@npm:0.6.7":
version: 0.6.7
resolution: "ox@npm:0.6.7"
dependencies:
"@adraffy/ens-normalize": "npm:^1.10.1"
"@noble/curves": "npm:^1.6.0"
"@noble/hashes": "npm:^1.5.0"
"@scure/bip32": "npm:^1.5.0"
"@scure/bip39": "npm:^1.4.0"
abitype: "npm:^1.0.6"
eventemitter3: "npm:5.0.1"
peerDependencies:
typescript: ">=5.4.0"
peerDependenciesMeta:
typescript:
optional: true
checksum: 10/442fb31e1afb68922bf942025930d8cd6d8c677696e9a6de308008b3608669f22127cadbc0f77181e012d23d7b74318e5f85e63b06b16eecbc887d7fac32a6dc
languageName: node
linkType: hard
"p-cancelable@npm:^3.0.0":
version: 3.0.0
resolution: "p-cancelable@npm:3.0.0"
@@ -26073,7 +26153,7 @@ __metadata:
"@types/mocha": "npm:^10.0.6"
"@types/ncp": "npm:^2"
"@types/node": "npm:^20.10.7"
"@zk-kit/lean-imt.sol": "npm:2.0.0"
"@zk-kit/lean-imt.sol": "npm:2.0.1"
chai: "npm:^4.2.0"
ethers: "npm:^6.13.4"
hardhat: "npm:^2.19.4"
@@ -26098,7 +26178,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.9.0"
"@semaphore-protocol/utils": "npm:4.11.1"
"@svgr/webpack": "npm:^5.5.0"
"@types/react": "npm:^18.2.29"
clsx: "npm:^1.2.1"
@@ -29125,6 +29205,27 @@ __metadata:
languageName: node
linkType: hard
"viem@npm:2.23.7":
version: 2.23.7
resolution: "viem@npm:2.23.7"
dependencies:
"@noble/curves": "npm:1.8.1"
"@noble/hashes": "npm:1.7.1"
"@scure/bip32": "npm:1.6.2"
"@scure/bip39": "npm:1.5.4"
abitype: "npm:1.0.8"
isows: "npm:1.0.6"
ox: "npm:0.6.7"
ws: "npm:8.18.0"
peerDependencies:
typescript: ">=5.0.4"
peerDependenciesMeta:
typescript:
optional: true
checksum: 10/bf1618f39ca3645082323776342c0f87fa37f60bcca0476a7db0f6fbb9d1b6db7ab1e434a57463e8486bea29f97c5ab01e95b6139190a008d6f9a30194b7b081
languageName: node
linkType: hard
"vscode-oniguruma@npm:^1.7.0":
version: 1.7.0
resolution: "vscode-oniguruma@npm:1.7.0"
@@ -30022,6 +30123,21 @@ __metadata:
languageName: node
linkType: hard
"ws@npm:8.18.0":
version: 8.18.0
resolution: "ws@npm:8.18.0"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ">=5.0.2"
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
checksum: 10/70dfe53f23ff4368d46e4c0b1d4ca734db2c4149c6f68bc62cb16fc21f753c47b35fcc6e582f3bdfba0eaeb1c488cddab3c2255755a5c3eecb251431e42b3ff6
languageName: node
linkType: hard
"ws@npm:^7.3.1, ws@npm:^7.4.6":
version: 7.5.9
resolution: "ws@npm:7.5.9"