Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d99c5644c9 | ||
|
|
1dc597a175 | ||
|
|
b55bf7fd4d | ||
|
|
496e18ecab | ||
|
|
d4fb23a7af | ||
|
|
411667f5c7 | ||
|
|
87709224a3 | ||
|
|
0e20c6884f | ||
|
|
e1e893004d | ||
|
|
2e6bef51d4 | ||
|
|
9e7b2900cf | ||
|
|
cd02f49173 | ||
|
|
a8787bd1fc | ||
|
|
2c6f7846d7 | ||
|
|
8c359ad594 | ||
|
|
7ccb14d362 | ||
|
|
7e60446268 | ||
|
|
5dcba7fb2e | ||
|
|
0394caf2f7 | ||
|
|
820f34ac90 | ||
|
|
81dbf8631c | ||
|
|
4e084b0589 | ||
|
|
210fed4a50 | ||
|
|
53f41879d1 | ||
|
|
4089bbedc7 | ||
|
|
6a2b28c34e | ||
|
|
dce9813c8e | ||
|
|
aba32d83b1 | ||
|
|
520a02698f | ||
|
|
128cbcee13 | ||
|
|
a224f95d77 | ||
|
|
bb089c5544 | ||
|
|
88004d9092 | ||
|
|
e7ca1d9487 | ||
|
|
1b82dcdded | ||
|
|
cd04b0c5c7 | ||
|
|
b6a7a9883b | ||
|
|
fc1fe4d086 | ||
|
|
feb8c9c97d | ||
|
|
b56e9690a8 | ||
|
|
c973bab503 | ||
|
|
27aee4bf43 | ||
|
|
ea62310df6 | ||
|
|
6bc415f4d5 | ||
|
|
18f77ac0bb | ||
|
|
f3c4cf27e2 | ||
|
|
57132a38df | ||
|
|
6ef16976f7 | ||
|
|
2849ca1d24 | ||
|
|
d05d783852 | ||
|
|
993e46a427 | ||
|
|
f984c1e864 | ||
|
|
5c9d1737d3 | ||
|
|
1318b0e74b | ||
|
|
c0fcc94e82 | ||
|
|
e70ae1151b | ||
|
|
fd38539908 | ||
|
|
8bd45d8c46 | ||
|
|
534e69683a | ||
|
|
a0a3b9380b |
2
.github/pull_request_template.md
vendored
@@ -37,4 +37,4 @@
|
||||
- [ ] New and existing unit tests pass locally with my changes
|
||||
|
||||
> [!IMPORTANT]
|
||||
> We do not accept minor grammatical fixes (e.g., correcting typos, rewording sentences) unless they significantly improve clarity in technical documentation. These contributions, while appreciated, are not a priority for merging. If there is a grammatical error feel free to message the team.
|
||||
> We do not accept pull requests for minor grammatical fixes (e.g., correcting typos, rewording sentences) or for fixing broken links, unless they significantly improve clarity or functionality. These contributions, while appreciated, are not a priority for merging. If you notice any of these issues, please create a [GitHub Issue](https://github.com/semaphore-protocol/semaphore/issues/new?template=BLANK_ISSUE) to report them so they can be properly tracked and addressed.
|
||||
|
||||
@@ -31,7 +31,7 @@ Pull requests are great if you want to add a feature or fix a bug. Here's a quic
|
||||
7. Push to your fork and submit a pull request on our `main` branch. Please provide us with some explanation of why you made the changes you made. For new features make sure to explain a standard use case to us.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> We do not accept minor grammatical fixes (e.g., correcting typos, rewording sentences) unless they significantly improve clarity in technical documentation. These contributions, while appreciated, are not a priority for merging. If there is a grammatical error feel free to message the team.
|
||||
> We do not accept pull requests for minor grammatical fixes (e.g., correcting typos, rewording sentences) or for fixing broken links, unless they significantly improve clarity or functionality. These contributions, while appreciated, are not a priority for merging. If you notice any of these issues, please create a [GitHub Issue](https://github.com/semaphore-protocol/semaphore/issues/new?template=BLANK_ISSUE) to report them so they can be properly tracked and addressed.
|
||||
|
||||
## CI (Github Actions) Tests
|
||||
|
||||
|
||||
2
LICENSE
@@ -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
|
||||
|
||||
22
README.md
@@ -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.
|
||||
|
||||
|
Before Width: | Height: | Size: 315 KiB After Width: | Height: | Size: 322 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 267 KiB |
|
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 215 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 124 KiB |
@@ -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.1",
|
||||
"@semaphore-protocol/utils": "4.14.0",
|
||||
"@svgr/webpack": "^5.5.0",
|
||||
"clsx": "^1.2.1",
|
||||
"docusaurus-plugin-sass": "^0.2.5",
|
||||
|
||||
196
apps/docs/static/llms.txt
vendored
Normal file
@@ -0,0 +1,196 @@
|
||||
# Semaphore V4 - llms.txt
|
||||
|
||||
> Zero-knowledge protocol for anonymous group membership and signaling
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Core Concept
|
||||
Semaphore allows users to cast messages (votes, endorsements) as provable group members without revealing identity, with built-in double-signaling prevention.
|
||||
|
||||
**Key Components:**
|
||||
- **Identity**: User's cryptographic identity (private key, public key, commitment)
|
||||
- **Group**: Merkle tree of identity commitments
|
||||
- **Proof**: Zero-knowledge proof of group membership + message
|
||||
- **Nullifier**: Unique identifier preventing double-signaling
|
||||
- **Scope**: Topic/context that limits one proof per user
|
||||
|
||||
### Essential Packages
|
||||
```bash
|
||||
# Core functionality
|
||||
npm install @semaphore-protocol/core
|
||||
|
||||
# Individual packages
|
||||
npm install @semaphore-protocol/identity
|
||||
npm install @semaphore-protocol/group
|
||||
npm install @semaphore-protocol/proof
|
||||
npm install @semaphore-protocol/contracts
|
||||
```
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### 1. Identity Management
|
||||
```javascript
|
||||
import { Identity } from "@semaphore-protocol/identity"
|
||||
|
||||
// Random identity
|
||||
const identity = new Identity()
|
||||
const { privateKey, publicKey, commitment } = identity
|
||||
|
||||
// Deterministic identity (from secret)
|
||||
const deterministicIdentity = new Identity("secret-value")
|
||||
|
||||
// Sign/verify messages
|
||||
const message = "Hello World"
|
||||
const signature = identity.signMessage(message)
|
||||
const isValid = Identity.verifySignature(message, signature, identity.publicKey)
|
||||
|
||||
// Export/import
|
||||
const exported = identity.export() // base64 private key
|
||||
const imported = Identity.import(exported)
|
||||
```
|
||||
|
||||
### 2. Group Operations
|
||||
```javascript
|
||||
import { Group } from "@semaphore-protocol/group"
|
||||
|
||||
// Create group
|
||||
const group = new Group()
|
||||
const groupWithMembers = new Group([commitment1, commitment2])
|
||||
|
||||
// Manage members
|
||||
group.addMember(identity.commitment)
|
||||
group.addMembers([commitment1, commitment2])
|
||||
group.removeMember(0) // sets to 0, doesn't change size
|
||||
group.updateMember(0, newCommitment)
|
||||
|
||||
// Generate Merkle proof
|
||||
const merkleProof = group.generateMerkleProof(0)
|
||||
```
|
||||
|
||||
### 3. Proof Generation & Verification
|
||||
```javascript
|
||||
import { generateProof, verifyProof } from "@semaphore-protocol/proof"
|
||||
|
||||
// Generate proof
|
||||
const scope = group.root // or any unique scope
|
||||
const message = 1
|
||||
const proof = await generateProof(identity, group, message, scope)
|
||||
|
||||
// Verify proof
|
||||
const isValid = await verifyProof(proof)
|
||||
```
|
||||
|
||||
### 4. On-Chain Integration
|
||||
```solidity
|
||||
// Contract setup
|
||||
import "@semaphore-protocol/contracts/interfaces/ISemaphore.sol";
|
||||
|
||||
contract YourContract {
|
||||
ISemaphore public semaphore;
|
||||
uint256 public groupId;
|
||||
|
||||
constructor(ISemaphore _semaphore) {
|
||||
semaphore = _semaphore;
|
||||
groupId = semaphore.createGroup();
|
||||
}
|
||||
|
||||
// Validate proof on-chain
|
||||
function validateProof(ISemaphore.SemaphoreProof calldata proof) external {
|
||||
semaphore.validateProof(groupId, proof);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration Reference
|
||||
|
||||
### Circuit Parameters
|
||||
- **MAX_DEPTH**: 1-32 (Merkle tree depth)
|
||||
- **Default proof validity**: 1 hour for old Merkle roots
|
||||
|
||||
### Key Security Settings
|
||||
- **Identity reuse warning**: Same identity across groups compromises all groups
|
||||
- **Nullifier uniqueness**: Prevents double-signaling within same scope
|
||||
- **Message tampering**: Circuit calculates dummy square to prevent tampering
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**"Proof verification failed"**
|
||||
- Check group contains identity commitment
|
||||
- Verify scope matches between generation and verification
|
||||
- Ensure Merkle proof is current (within validity window)
|
||||
|
||||
**"Nullifier already exists"**
|
||||
- User already submitted proof with this scope
|
||||
- Use different scope or implement nullifier tracking
|
||||
|
||||
**"Identity commitment not found"**
|
||||
- Add identity to group before generating proof
|
||||
- Verify correct group is being used
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
### Circuit Structure
|
||||
The Semaphore circuit proves three things:
|
||||
1. **Membership**: User belongs to group (Merkle proof verification)
|
||||
2. **Authorization**: Same user created message and proof (nullifier check)
|
||||
3. **Message integrity**: Message hasn't been tampered with
|
||||
|
||||
### Contract Architecture
|
||||
- **SemaphoreVerifier.sol**: Groth16 proof verification
|
||||
- **SemaphoreGroups.sol**: Group management (abstract)
|
||||
- **Semaphore.sol**: Complete implementation with proof validation
|
||||
|
||||
## Extended Resources
|
||||
|
||||
### 📚 Complete Guides
|
||||
- [Getting Started Tutorial](https://docs.semaphore.pse.dev/getting-started) - Full project setup with CLI
|
||||
- [Identities Deep Dive](https://docs.semaphore.pse.dev/guides/identities) - Advanced identity management
|
||||
- [Groups Management](https://docs.semaphore.pse.dev/guides/groups) - Comprehensive group operations
|
||||
- [Proof Generation](https://docs.semaphore.pse.dev/guides/proofs) - Detailed proof workflows
|
||||
|
||||
### 🔧 Technical References
|
||||
- [Semaphore V4 Specification](https://github.com/zkspecs/zkspecs/blob/main/specs/3/README.md) - Protocol specification
|
||||
- [Circuit Documentation](https://docs.semaphore.pse.dev/technical-reference/circuits) - Circuit internals
|
||||
- [Contract Reference](https://docs.semaphore.pse.dev/technical-reference/contracts) - Solidity implementation details
|
||||
- [Deployed Contracts](https://docs.semaphore.pse.dev/deployed-contracts) - Network addresses
|
||||
|
||||
### 🛠️ Development Tools
|
||||
- [GitHub Repository](https://github.com/semaphore-protocol/semaphore) - Source code and examples
|
||||
- [CLI Templates](https://github.com/semaphore-protocol/semaphore/tree/main/packages/cli) - Project boilerplates
|
||||
- [Boilerplate App](https://github.com/semaphore-protocol/boilerplate) - Complete example application
|
||||
|
||||
### 🔐 Security & Audits
|
||||
- [Trusted Setup Ceremony](https://ceremony.pse.dev/projects/Semaphore%20V4%20Ceremony) - 400+ participants, July 2024
|
||||
- [Security Audits](https://docs.semaphore.pse.dev/#audits) - PSE and Veridise audit reports
|
||||
- [Best Practices Guide](https://docs.semaphore.pse.dev/) - Security considerations section
|
||||
|
||||
### 🌐 Community & Support
|
||||
- [Documentation](https://docs.semaphore.pse.dev/) - Complete documentation
|
||||
- [GitHub Discussions](https://github.com/semaphore-protocol/semaphore/discussions) - Community support
|
||||
- [PSE Website](https://pse.dev/) - Privacy & Scaling Explorations team
|
||||
|
||||
### 📊 Data & Indexing
|
||||
- [@semaphore-protocol/data](https://github.com/semaphore-protocol/semaphore/tree/main/packages/data) - On-chain data fetching
|
||||
- [Subgraph Templates](https://github.com/semaphore-protocol/semaphore/tree/main/packages/cli-template-monorepo-subgraph) - Graph Protocol integration
|
||||
|
||||
## Quick Start Commands
|
||||
|
||||
```bash
|
||||
# Create new project
|
||||
npx @semaphore-protocol/cli create my-app --template monorepo-ethers
|
||||
|
||||
# Get on-chain groups
|
||||
semaphore get-groups --network sepolia
|
||||
|
||||
# Deploy contract
|
||||
yarn deploy --semaphore <address> --group <id> --network sepolia
|
||||
```
|
||||
|
||||
## Use Cases
|
||||
- **Private Voting**: Anonymous ballots with double-vote prevention
|
||||
- **Whistleblowing**: Anonymous reporting with verified membership
|
||||
- **Anonymous DAOs**: Governance without identity disclosure
|
||||
- **Mixers**: Privacy-preserving value transfers
|
||||
- **Anonymous Authentication**: Prove membership without revealing identity
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
sidebar_position: 13
|
||||
sidebar_position: 14
|
||||
---
|
||||
|
||||
# Credits
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
sidebar_position: 12
|
||||
sidebar_position: 13
|
||||
---
|
||||
|
||||
# FAQ
|
||||
|
||||
@@ -118,7 +118,7 @@ In the project root folder:
|
||||
2. Go to the `apps/contracts` folder and deploy your contract.
|
||||
|
||||
```bash
|
||||
yarn deploy --semaphore <semaphore-address> --group <group-id> --network sepolia
|
||||
yarn deploy --semaphore <semaphore-address> --network sepolia
|
||||
```
|
||||
|
||||
:::note
|
||||
|
||||
@@ -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.
|
||||
|
||||
55
apps/docs/versioned_docs/version-V4/llm-setup.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
sidebar_position: 11
|
||||
---
|
||||
|
||||
# Code editors and LLM setup
|
||||
|
||||
LLMs often rely on outdated or generic information. Use this guide to help set up your code editor to pull in more accurate, up-to-date documentation and examples. It will help provide better answers and generate more accurate Semaphore code using LLMs (large language models) and MCP (Model Context Protocol) servers.
|
||||
|
||||
## Quick use
|
||||
|
||||
[llms.txt](https://docs.semaphore.pse.dev/llms.txt) is a compact, text version of the Semaphore docs.
|
||||
|
||||
Add this link directly to your chat window for enhanced context.
|
||||
|
||||
## Permanent setup
|
||||
|
||||
Depending on your IDE, you can add custom docs to VS Code, Cursor or others.
|
||||
|
||||
Example for Cursor...
|
||||
|
||||
1. Press `CMD + Shift + P` (unix), `Ctrl + Shift + P` (Windows)
|
||||
1. Type `Add new custom docs`.
|
||||
1. Add https://docs.semaphore.pse.dev/llms.txt
|
||||
1. In chat you can know `@docs` and choose `semaphore` to provide additional context.
|
||||
|
||||
Refer to the documentation of your IDE to properly set it up.
|
||||
|
||||
## MCP Server
|
||||
|
||||
Depending on your IDE, you can add a MCP server to communicate your docs to the AI model.
|
||||
|
||||
- [Context7 MCP server](https://github.com/upstash/context7) is a server that provides many libraries, incl. Semaphore.
|
||||
|
||||
Example for Cursor...
|
||||
|
||||
1. Press `CMD + Shift + J` (unix), `Ctrl + Shift + J` (Windows)
|
||||
1. Click on `MCP` on the sidebar
|
||||
1. Click `Add new global MCP server`
|
||||
1. Add the following code to `mcp.json`
|
||||
|
||||
```
|
||||
{
|
||||
"mcpServers": {
|
||||
"Context7": {
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": ["-y", "@upstash/context7-mcp@latest"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
You can now prompt anything about Semaphore and write `use context7` at the end of your prompt. E.g. `create a new Semaphore identity in TypeScript. use context`. This will call the MCP tool and automatically fetch the latest documentation.
|
||||
|
||||
Refer to the documentation of your IDE to properly set it up.
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
sidebar_position: 11
|
||||
sidebar_position: 12
|
||||
---
|
||||
|
||||
import Tabs from "@theme/Tabs"
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -42,11 +42,12 @@
|
||||
|
||||
## Networks
|
||||
|
||||
You can access any subgraph supported by Semaphore with the following URL: `https://api.studio.thegraph.com/query/14377/semaphore-<network-name>/v4.2.0`.
|
||||
You can access any subgraph supported by Semaphore with the following URL: `https://api.studio.thegraph.com/query/14377/semaphore-<network-name>/v4.5.0`.
|
||||
|
||||
Supported networks:
|
||||
|
||||
- `sepolia`
|
||||
- `ethereum`
|
||||
- `optimism`
|
||||
- `optimism-sepolia`
|
||||
- `arbitrum`
|
||||
@@ -58,6 +59,8 @@ Supported networks:
|
||||
- `linea-sepolia`
|
||||
- `linea`
|
||||
- `scroll-sepolia`
|
||||
- `gnosis-chiado`
|
||||
- `gnosis`
|
||||
|
||||
## 🛠 Install
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -15,6 +15,10 @@ function mapNetwork(n) {
|
||||
return "arbitrum-one"
|
||||
}
|
||||
|
||||
if (n === "ethereum") {
|
||||
return "mainnet"
|
||||
}
|
||||
|
||||
return network
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -40,6 +40,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
||||
href="https://github.com/semaphore-protocol/semaphore/releases/tag/v4.0.0"
|
||||
ml="1"
|
||||
isExternal
|
||||
color="primary.500"
|
||||
>
|
||||
<b>Semaphore V4</b>
|
||||
</Link>{" "}
|
||||
|
||||
@@ -131,7 +131,7 @@ export default function Home() {
|
||||
>
|
||||
1
|
||||
</Heading>
|
||||
<VStack align="left">
|
||||
<VStack align="start">
|
||||
<Text
|
||||
fontSize={{ base: "18px", md: "20px" }}
|
||||
fontFamily={sora.style.fontFamily}
|
||||
@@ -152,7 +152,7 @@ export default function Home() {
|
||||
>
|
||||
3
|
||||
</Heading>
|
||||
<VStack align="left">
|
||||
<VStack align="start">
|
||||
<Text
|
||||
fontSize={{ base: "18px", md: "20px" }}
|
||||
fontFamily={sora.style.fontFamily}
|
||||
@@ -181,7 +181,7 @@ export default function Home() {
|
||||
>
|
||||
2
|
||||
</Heading>
|
||||
<VStack align="left">
|
||||
<VStack align="start">
|
||||
<Text
|
||||
fontSize={{ base: "18px", md: "20px" }}
|
||||
fontFamily={sora.style.fontFamily}
|
||||
@@ -203,7 +203,7 @@ export default function Home() {
|
||||
>
|
||||
4
|
||||
</Heading>
|
||||
<VStack align="left">
|
||||
<VStack align="start">
|
||||
<Text
|
||||
fontSize={{ base: "18px", md: "20px" }}
|
||||
fontFamily={sora.style.fontFamily}
|
||||
@@ -287,10 +287,10 @@ export default function Home() {
|
||||
Upcoming Events
|
||||
</Heading>
|
||||
|
||||
<VStack align="left" spacing="10" maxH="600px" overflowY="auto">
|
||||
<VStack align="start" spacing="10" maxH="600px" overflowY="auto">
|
||||
{events.map((event) => (
|
||||
<Link href={event.link} key={event.name} isExternal>
|
||||
<VStack align="left">
|
||||
<VStack align="start">
|
||||
<Heading fontSize={{ base: "20px", md: "24px" }}>
|
||||
{event.date} | {event.name}
|
||||
</Heading>
|
||||
|
||||
@@ -5,7 +5,7 @@ import ProjectsList from "../../components/ProjectsList"
|
||||
export default function Projects() {
|
||||
return (
|
||||
<>
|
||||
<VStack pt="170px" pb="56px" w="100%" justify="end" align="left" spacing="40" position="relative">
|
||||
<VStack pt="170px" pb="56px" w="100%" justify="end" align="start" spacing="40" position="relative">
|
||||
<Box
|
||||
zIndex="-1"
|
||||
top="0"
|
||||
@@ -25,7 +25,7 @@ export default function Projects() {
|
||||
/>
|
||||
</Box>
|
||||
|
||||
<VStack align="left" spacing="4" pb="16">
|
||||
<VStack align="start" spacing="4" pb="16">
|
||||
<Heading fontSize={{ base: "40px", sm: "46px", md: "72px" }}>Built with Semaphore</Heading>
|
||||
|
||||
<Text fontSize={{ base: "16px", sm: "18px", md: "20px" }}>
|
||||
@@ -35,7 +35,7 @@ export default function Projects() {
|
||||
</VStack>
|
||||
</VStack>
|
||||
|
||||
<ProjectsList w="100%" align="left" pt="16" spacing="14" />
|
||||
<ProjectsList w="100%" align="start" pt="16" spacing="14" />
|
||||
|
||||
<VStack my="128px">
|
||||
<ActionCard
|
||||
|
||||
@@ -46,7 +46,7 @@ export default function Carousel({ title, sizes, type, ...props }: CarouselProps
|
||||
}, [index, size])
|
||||
|
||||
return (
|
||||
<VStack align="left" w="full" spacing="16" {...props}>
|
||||
<VStack align="start" w="full" spacing="16" {...props}>
|
||||
<HStack justify={type === "projects" ? "center" : "space-between"}>
|
||||
<Heading fontSize={{ base: "30px", md: "44px" }}>{title}</Heading>
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@ export default function InfoCard({ texts }: InfoCardProps) {
|
||||
height={{ base: "auto", md: "474px" }}
|
||||
>
|
||||
<CardBody padding="0">
|
||||
<VStack align="left" spacing="10" maxH="500" overflowY="auto">
|
||||
<VStack align="start" spacing="10" maxH="500" overflowY="auto">
|
||||
{texts.map((text) => (
|
||||
<VStack key={text.title} align="left">
|
||||
<VStack key={text.title} align="start">
|
||||
<Heading textAlign="left" fontSize={{ base: "20px", md: "24px" }}>
|
||||
{text.title}
|
||||
</Heading>
|
||||
|
||||
@@ -52,7 +52,7 @@ export default function ProjectsList(props: any) {
|
||||
|
||||
return (
|
||||
<VStack {...props}>
|
||||
<VStack align="left" spacing="6">
|
||||
<VStack align="start" spacing="6">
|
||||
<Text fontSize="20">Projects created by</Text>
|
||||
|
||||
<HStack spacing="4" flexWrap="wrap">
|
||||
@@ -83,7 +83,7 @@ export default function ProjectsList(props: any) {
|
||||
</HStack>
|
||||
</VStack>
|
||||
|
||||
<VStack align="left" spacing="6" ref={viewToScrollRef}>
|
||||
<VStack align="start" spacing="6" ref={viewToScrollRef}>
|
||||
<Text fontSize="20">Category</Text>
|
||||
<HStack spacing="3" flexWrap="wrap">
|
||||
{getProjectCategories(sortedProjects).map((category) => (
|
||||
|
||||
@@ -23,7 +23,7 @@ export default function SectionBlock({ title, description, linkText, linkUrl, co
|
||||
return (
|
||||
<VStack w="full">
|
||||
<Flex flexDir={{ base: "column", lg: "row" }} gap="52px" w="full">
|
||||
<VStack align="left" gap="32px" flex="1">
|
||||
<VStack align="start" gap="32px" flex="1">
|
||||
<Text fontSize={{ base: "40px", md: "44px" }} fontWeight={{ base: "400", md: "500" }}>
|
||||
{title}
|
||||
</Text>
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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/"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -575,5 +575,37 @@
|
||||
"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"
|
||||
}
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
"name": "Support more Testnets/Mainnets",
|
||||
"name": "Support more Testnets & Mainnets",
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
@@ -28,11 +28,23 @@
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
"name": "Semaphore Spec",
|
||||
"done": false
|
||||
"name": "Semaphore V4 Specification",
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
"name": "Semaphore Rust Implementation",
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
"name": "Semaphore Noir Implementation",
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
"name": "Scaling Semaphore with PIR",
|
||||
"done": true
|
||||
},
|
||||
{
|
||||
"name": "Maintenance",
|
||||
"done": false
|
||||
}
|
||||
]
|
||||
|
||||
@@ -118,5 +118,21 @@
|
||||
"speakers": ["Vivian Plasencia"],
|
||||
"url": "https://youtu.be/ux5Xy_lpiYk",
|
||||
"thumbnail": "https://img.youtube.com/vi/ux5Xy_lpiYk/0.jpg"
|
||||
},
|
||||
{
|
||||
"title": "Scaling Semaphore",
|
||||
"eventName": "ETHDam",
|
||||
"date": "2025-05-10",
|
||||
"speakers": ["Vivian Plasencia"],
|
||||
"url": "https://youtu.be/IkYtKSQLR-A",
|
||||
"thumbnail": "https://img.youtube.com/vi/IkYtKSQLR-A/0.jpg"
|
||||
},
|
||||
{
|
||||
"title": "Scaling Semaphore: Noir in Action",
|
||||
"eventName": "NoirCon2",
|
||||
"date": "2025-06-19",
|
||||
"speakers": ["Vivian Plasencia"],
|
||||
"url": "https://youtu.be/vfL7z74jGyU",
|
||||
"thumbnail": "https://img.youtube.com/vi/vfL7z74jGyU/0.jpg"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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[] {
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
"prettier": "^3.2.5",
|
||||
"rimraf": "^5.0.5",
|
||||
"semver": "^7.6.2",
|
||||
"snarkjs": "0.7.4",
|
||||
"snarkjs": "0.7.5",
|
||||
"ts-jest": "^29.1.2",
|
||||
"ts-node": "^10.9.2",
|
||||
"tslib": "^2.6.2",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/circuits",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "Semaphore Circom circuits to generate zero-knowledge proofs.",
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
@@ -24,14 +24,14 @@
|
||||
"access": "public"
|
||||
},
|
||||
"dependencies": {
|
||||
"@zk-kit/binary-merkle-root.circom": "1.0.0",
|
||||
"@zk-kit/binary-merkle-root.circom": "2.0.0",
|
||||
"circomlib": "2.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@semaphore-protocol/core": "workspace:^",
|
||||
"@types/mocha": "^10.0.6",
|
||||
"@zk-kit/baby-jubjub": "1.0.3",
|
||||
"circomkit": "0.0.19",
|
||||
"circomkit": "0.3.3",
|
||||
"mocha": "^10.2.0",
|
||||
"poseidon-lite": "^0.3.0"
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ template Semaphore(MAX_DEPTH) {
|
||||
// See the Semaphore identity package to know more about how the identity is generated:
|
||||
// https://github.com/semaphore-protocol/semaphore/tree/main/packages/identity.
|
||||
signal input secret;
|
||||
signal input merkleProofLength, merkleProofIndices[MAX_DEPTH], merkleProofSiblings[MAX_DEPTH];
|
||||
signal input merkleProofLength, merkleProofIndex, merkleProofSiblings[MAX_DEPTH];
|
||||
signal input message;
|
||||
signal input scope;
|
||||
|
||||
@@ -56,9 +56,9 @@ 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);
|
||||
merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndex, merkleProofSiblings);
|
||||
|
||||
// Nullifier generation.
|
||||
// The nullifier is a value that essentially identifies the proof generated in a specific scope
|
||||
|
||||
@@ -12,21 +12,18 @@ export const circomkit = new Circomkit({
|
||||
})
|
||||
|
||||
export function generateMerkleProof(group: Group, _index: number, maxDepth: number) {
|
||||
const { siblings: merkleProofSiblings, index } = group.generateMerkleProof(_index)
|
||||
const { siblings: merkleProofSiblings, index: merkleProofIndex } = group.generateMerkleProof(_index)
|
||||
|
||||
// The index must be converted to a list of indices, 1 for each tree level.
|
||||
// The circuit tree depth is 20, so the number of siblings must be 20, even if
|
||||
// the tree depth is actually 3. The missing siblings can be set to 0, as they
|
||||
// won't be used to calculate the root in the circuit.
|
||||
const merkleProofIndices: number[] = []
|
||||
// For example, if the circuit expects a Merkle tree of depth 20,
|
||||
// the input must always include 20 sibling nodes, even if the actual
|
||||
// tree depth is smaller (e.g., 3). The unused sibling positions can be
|
||||
// filled with 0, as they won't affect the root calculation in the circuit.
|
||||
|
||||
for (let i = 0; i < maxDepth; i += 1) {
|
||||
merkleProofIndices.push((index >> i) & 1)
|
||||
|
||||
if (merkleProofSiblings[i] === undefined) {
|
||||
merkleProofSiblings[i] = BigInt(0)
|
||||
}
|
||||
}
|
||||
|
||||
return { merkleProofSiblings, merkleProofIndices }
|
||||
return { merkleProofSiblings, merkleProofIndex }
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ const r = 2188824287183927522224640574525727508854836440041603434369820418657580
|
||||
|
||||
describe("semaphore", () => {
|
||||
let circuit: WitnessTester<
|
||||
["secret", "merkleProofLength", "merkleProofIndices", "merkleProofSiblings", "scope", "message"],
|
||||
["secret", "merkleProofLength", "merkleProofIndex", "merkleProofSiblings", "scope", "message"],
|
||||
["nullifier", "merkleRoot"]
|
||||
>
|
||||
|
||||
@@ -36,12 +36,12 @@ describe("semaphore", () => {
|
||||
|
||||
const group = new Group([commitment, 2n, 3n])
|
||||
|
||||
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
|
||||
const INPUT = {
|
||||
secret,
|
||||
merkleProofLength: group.depth,
|
||||
merkleProofIndices,
|
||||
merkleProofIndex,
|
||||
merkleProofSiblings,
|
||||
scope,
|
||||
message
|
||||
@@ -61,12 +61,12 @@ describe("semaphore", () => {
|
||||
const commitment = poseidon2(mulPointEscalar(Base8, secret))
|
||||
const group = new Group([commitment, 2n, 3n])
|
||||
|
||||
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
|
||||
const INPUT = {
|
||||
secret,
|
||||
merkleProofLength: group.depth,
|
||||
merkleProofIndices,
|
||||
merkleProofIndex,
|
||||
merkleProofSiblings,
|
||||
scope,
|
||||
message
|
||||
@@ -81,12 +81,12 @@ describe("semaphore", () => {
|
||||
const commitment = poseidon2(mulPointEscalar(Base8, secret))
|
||||
const group = new Group([commitment, 2n, 3n])
|
||||
|
||||
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
|
||||
const INPUT = {
|
||||
secret,
|
||||
merkleProofLength: group.depth,
|
||||
merkleProofIndices,
|
||||
merkleProofIndex,
|
||||
merkleProofSiblings,
|
||||
scope,
|
||||
message
|
||||
@@ -100,12 +100,12 @@ describe("semaphore", () => {
|
||||
|
||||
const group = new Group([commitment, 2n, 3n])
|
||||
|
||||
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
|
||||
|
||||
const INPUT = {
|
||||
secret,
|
||||
merkleProofLength: group.depth,
|
||||
merkleProofIndices,
|
||||
merkleProofIndex,
|
||||
merkleProofSiblings,
|
||||
scope,
|
||||
message
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/cli-template-contracts-foundry",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "Semaphore Foundry template.",
|
||||
"license": "Unlicense",
|
||||
"devDependencies": {
|
||||
"@semaphore-protocol/contracts": "4.9.1",
|
||||
"@zk-kit/lean-imt.sol": "2.0.0",
|
||||
"@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",
|
||||
"prettier": "^3.2.5",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/cli-template-contracts-hardhat",
|
||||
"version": "4.9.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.9.1",
|
||||
"@semaphore-protocol/hardhat": "4.9.1",
|
||||
"@semaphore-protocol/utils": "4.9.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.9.1"
|
||||
"@semaphore-protocol/contracts": "4.14.0"
|
||||
},
|
||||
"packageManager": "yarn@4.1.0"
|
||||
}
|
||||
|
||||
@@ -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.1",
|
||||
"@semaphore-protocol/hardhat": "4.9.1",
|
||||
"@semaphore-protocol/utils": "4.9.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.9.1"
|
||||
"@semaphore-protocol/contracts": "4.14.0"
|
||||
},
|
||||
"packageManager": "yarn@4.1.0"
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@semaphore-protocol/core": "4.9.1",
|
||||
"@semaphore-protocol/data": "4.9.1",
|
||||
"@semaphore-protocol/utils": "4.9.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",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/cli-template-monorepo-ethers",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "Semaphore Hardhat + Next.js + SemaphoreEthers template.",
|
||||
"license": "Unlicense",
|
||||
"files": [
|
||||
|
||||
@@ -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.1",
|
||||
"@semaphore-protocol/hardhat": "4.9.1",
|
||||
"@semaphore-protocol/utils": "4.9.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.9.1"
|
||||
"@semaphore-protocol/contracts": "4.14.0"
|
||||
},
|
||||
"packageManager": "yarn@4.1.0"
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@semaphore-protocol/core": "4.9.1",
|
||||
"@semaphore-protocol/data": "4.9.1",
|
||||
"@semaphore-protocol/utils": "4.9.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",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/cli-template-monorepo-subgraph",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "Semaphore Hardhat + Next.js + SemaphoreSubgraph template.",
|
||||
"license": "Unlicense",
|
||||
"files": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/cli",
|
||||
"type": "module",
|
||||
"version": "4.9.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.9.1",
|
||||
"@semaphore-protocol/utils": "4.9.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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
import {ISemaphore} from "./interfaces/ISemaphore.sol";
|
||||
import {ISemaphoreVerifier} from "./interfaces/ISemaphoreVerifier.sol";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
/// @dev Minimum supported tree depth.
|
||||
uint8 constant MIN_DEPTH = 1;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//SPDX-License-Identifier: MIT
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
import {ISemaphoreGroups} from "../interfaces/ISemaphoreGroups.sol";
|
||||
import {InternalLeanIMT, LeanIMTData} from "@zk-kit/lean-imt.sol/InternalLeanIMT.sol";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Part of this file was generated with [snarkJS](https://github.com/iden3/snarkjs).
|
||||
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
import {MAX_DEPTH} from "./Constants.sol";
|
||||
import {SemaphoreVerifierKeyPts} from "./SemaphoreVerifierKeyPts.sol";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Part of this file was generated with [snarkJS](https://github.com/iden3/snarkjs).
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
library SemaphoreVerifierKeyPts {
|
||||
error Semaphore__VKPtBytesMaxDepthInvariantViolated(uint256 actual, uint256 expected);
|
||||
@@ -10,454 +10,454 @@ library SemaphoreVerifierKeyPts {
|
||||
// It allows to use the same verifier to verify proofs for all the tree depths supported by Semaphore.
|
||||
uint256 private constant SET_SIZE = 14;
|
||||
bytes private constant VK_POINT_BYTES =
|
||||
hex"289691d7705934b5504ae4bd7be283f3465af66f62fc7f1e66f03876b445efdd"
|
||||
hex"22a0bebada6ba60c3e190e9e8c2b1420244a14c9e02868b862c7945667416f9a"
|
||||
hex"036ab5249fee75e0644ed259d45fbbd0142b638e421b948f5dc00cf3ff14a530"
|
||||
hex"1bcf8d4f8bf886d2c7960badc94b3abf6beb4e43571d2b4b0f14928c10e0d594"
|
||||
hex"2d8c51b7fa4ea9ea16765377aaae4ae0a416a89b600fc0b8ec35e9e6e5621976"
|
||||
hex"1f2c636b4954a865946d69fed3ecd2bb60a61af38fa31f2a290ae28915d1f6e1"
|
||||
hex"0b412b14d9dddf3f9031ffb51eb3f73602b9e49cfa9bec4a02ec9c0e3020ccc3"
|
||||
hex"0ae9889ae5f4f6021af9e16dd1f2c445ed863fd6a374b329337f2fef4715350d"
|
||||
hex"07f75b300b401d2435b96459d2b64f6f848411f246d8478199dd2351a35c1b5e"
|
||||
hex"195a26806d907b6d9a9a9c235e09a48e94f8eb8da80f0d40bc4143e3d006e6d2"
|
||||
hex"2d0006337513747c51f8f3e87364d2852113a83e586ef629c88cee6d4cbd422f"
|
||||
hex"257aeaec24103ea15e4592c32d0ad9846ff1a2f3a836e0c19947980912b9006b"
|
||||
hex"294bead7a3378f80183af735f6bc8529ddc73d9e0a35d594dcf93524403c9e3e"
|
||||
hex"0cf84e9163744a9a65520f4b8cbb4ca35c428d1c4a5789e11f42636c6d197473"
|
||||
hex"21f43b1ffa301d565dbc37ef1eb2ef669b8a1876e3754b79657b26fe43c845ce"
|
||||
hex"1e558b2ca618dfa02f0d640fdd45f56492a577154989cd09523829b5e15f2d62"
|
||||
hex"04db437b7b4fa0f6eea95403dd25c6a674b3e81be98ad4532affe8507ec05380"
|
||||
hex"20376c16b97ad98b8dfaa6f10d42a3c5e264c56018d32b0e8af528db157eb60d"
|
||||
hex"234219fd49f941520883c13c1f01ff7b2f7f512a3046f91d33cdc3900ffb9de9"
|
||||
hex"1d754d84438f79e6b701f7d665d59755a7bcd0b63f7c2da94b737606c16de1d3"
|
||||
hex"287a08af195521f756271ec64bdc4ca8a7a95fae892c0fd2cf0c148d6c0cb653"
|
||||
hex"0e16af35936b356d5974b385528f6d9a873568eda614ed0e54be4494c2acdefd"
|
||||
hex"0fae7f745efa5884dc82f1595b5c10d931ed6da07b5dc4bd6f99dd5318c7c2a8"
|
||||
hex"21f41494c6685503d748b45672c65d059260bb205113882458c86f6da7ea3813"
|
||||
hex"1ec11e919c80981c8a905161c48caab360994e8f31cfe88536c5ad8b2c360039"
|
||||
hex"14f32ba1f584bafc3aa283f79d5d65e97a6a280c7c51cec192ee9e48d593a2be"
|
||||
hex"0cec3b3618ebb60152be2987b910940e79a421d666a71764f25ded99159de90f"
|
||||
hex"075a80d650b5c6f8a0b3261ae5ec4c5a1b53762f30c559aaa6c501e207c2514f"
|
||||
hex"026c5d81cf4e6cbade3622323c4ee3b4568333e79504044d2ad4d2ba01abefc5"
|
||||
hex"286bacad6fb92895c85483e837d7c821d3f7bd612ddd932c16d618455ee62a45"
|
||||
hex"11a11b68cb7aa85f42325a3d0fa45e0887719f05c9cd472183b1c7c78eabd0ef"
|
||||
hex"0674f14710e453bc1f9255babc8d2aeb3b2e321c68e6871b54c285e71456be4d"
|
||||
hex"11bf8be1878d5dee6820ec405b079360da81da7b79f29aa54096ae195ea1108d"
|
||||
hex"2a02d0a645dcfcafb2235e7f9ed37df27c3f7cbd5ad11ee831fa17cb36881d3f"
|
||||
hex"1e2338342dcdeec5d3ebd82d4b767ed93989d9147ac711dd07d8aebac0962c20"
|
||||
hex"174c21361611783b0dc90d87a6128cd4d7e427cca10db1d713495d8281ce3dac"
|
||||
hex"22654673d8af40026294acb3c0e51f0f367576d83a554bd9ad72de06a796095e"
|
||||
hex"08f410159146e32feb7a585ad437c4a48ff2109d7f74f58e709b66c292e1c690"
|
||||
hex"160928e9343db00c99255a53ea3948b547d0bb68332069c2d5ca632156a53ac8"
|
||||
hex"1b8e0ca895ea976f5d42029c964ea52d622388e90f947cba08b3924b470d84a0"
|
||||
hex"2f21e5bcc52e6d794afbf44a0dcb938554c7c94fbde66c1b7965ebb2d266d6be"
|
||||
hex"106d51a9231260949c37fcb7c8296c246566259829e98ef52683900a433ad7d7"
|
||||
hex"1f0691902d412d4afe6e49f546ad03d739f42a159af9530d717c01a3e9bc86b7"
|
||||
hex"26c15552cf455e161693ea7f01601fed166f79653153fb5beec9e8393c1efde5"
|
||||
hex"0223f9fa8192ae6be752d29b47e8b8a75e2172fbd4c89cfec400a9766e1430a8"
|
||||
hex"100341a4e94a5cfffa3c6cfa1be6ac3bf6b0c4fe578f8c99cc4f67e4d7bf4886"
|
||||
hex"1a9194b8c654ebf4f3cbb607c8bff2ddebaff87b8bdec06745ad4ed802728a6f"
|
||||
hex"0a7e869e75859fe47e51b3b79ad155670af4e6780d3edd3c13812db0197854d3"
|
||||
hex"0ef4a576b0bef4d037549aa24282378e13b438fc9bf49efcfd65cf3aa8935d28"
|
||||
hex"199af24c0e98e72c37d87bfb9386003c2a0192ccf015be777c4305d5eaaf0e81"
|
||||
hex"06e7f2d897f05617580ccc132040f3b83f3fe1a496354b33f39d27b15fb2a5fe"
|
||||
hex"07968d5b67877cf32da7858c85479a891164a19b1ddc26fdb2772d294addf3b6"
|
||||
hex"1b4dc215f06081e276803f1650d67324801c0a4f48d4b4fac9f6650d2fcd901c"
|
||||
hex"0c5a5f0969147d312118768cd73a762e53d3984088be93e46d8433d129939427"
|
||||
hex"1a948b5fcbf5918fad1f3c69d9d58c2df72cd9a15ff57a35c86c9e5082ee4090"
|
||||
hex"0532f7499522ad56592a815a303b33b648fe170e0c2f47d831255298200cd775"
|
||||
hex"22cce52f921a79b56993baaa1854b37ea74caf7e6f2d957048fe5e5d1e536ce2"
|
||||
hex"1ca9ca03dcd6b6539118fc036663b6deae0bdb0df258f18e23613f4e80bd5bca"
|
||||
hex"2f7a2d324bace30583592592d82bb970ed33f9753d03dcd3b54a44af04a0f1c0"
|
||||
hex"0f6008b6f13bcf8f2663e7392e2538406a7cdf15ad387e2eda92bb1de03f74f0"
|
||||
hex"06e30762808351c935656ddd7ac3499a2b497991d02f54c178277fce024ce89b"
|
||||
hex"1a087e883f78b0e1ecbc92dbe9d82258e4c91baac53d71836902953f8e5a6961"
|
||||
hex"0d35fd011b125ac12fd1d7c655fbb7b1ebc9eb47008676c750907f7768f6d644"
|
||||
hex"183a077e1a0a2dba1ffcf7e2a490859a5f60d5d04b3599506249b6d534848ba2"
|
||||
hex"24230c1864237bf6dc8d6b3e40bb277c02dab92e86aa515aaa62b1ad496b8290"
|
||||
hex"075a995ae152c5f9737f6848a2d5ef93a8e7809981a06834ef8b684390456011"
|
||||
hex"2dcfb2766574efd57331146186055ee967cdd14d5efac43389a29605d13d561c"
|
||||
hex"05a4a1353e53e1b5622a2200ee1fb2e1a8e224a8ec5554bb670bb377505cb615"
|
||||
hex"064cb205829acdaf1af3d45060ffa3433c02d3a7ae61b66ece50967b97e1f04a"
|
||||
hex"1af278018cfd4d2edc11dd77454ed0cc4ef3ca1dba5b0ba96bb2bdc43f1e8ef0"
|
||||
hex"23e7488f10d910e129d466443a7adb99fad7ac0b0bb37a51c9d0f1b7c527a98d"
|
||||
hex"29594b068af04ce6fe6b248aeb06051d6f66a39d9f3d13cdde5b343f31ec16ea"
|
||||
hex"1e63fabe17ec748ba86bf78cd84029d23ca6c543ee800179dad25964fae41cca"
|
||||
hex"2acc46fb9f4ba2abecc49ddb33c0314c7a940bfa021c07d44a73614599995ea1"
|
||||
hex"0d520400f15c87d18376ebfc03c8ed06b9ed713a654a0024cf310b64175d1064"
|
||||
hex"188ef3fd8a2134f2d4237dd7657f410ba5172ae081a6ca117dc21c7ffe71d6bf"
|
||||
hex"06a71b093737f1ebae5924f2d5f47b8b14526c4831c50f9e9c7c032dc011e511"
|
||||
hex"175921f58fb9fd90e2a1d2cf951ad606104a1676c9d2e6fc8fee6ea105239035"
|
||||
hex"236859cb45dff68ffa2524619936a9cb457d2c0defe59b5863607e439369f316"
|
||||
hex"28e0e101f6b62767f587d7dd8e0a4d4e32fbed3fc65c940d8aa8509bd826e33f"
|
||||
hex"0158d4f5cd5085c6e4ae2fd1330a52435eb0745d54c7c8a6ad5b7a3cf5333a7a"
|
||||
hex"05dfca18855acba1a5409f714a77297952277658af5e7d5e3a05bacd0b8005d1"
|
||||
hex"1edb9f2871655c1418f9c7b5851dd8b1713d1f9d7d78c9b915b2d3ecb62e7569"
|
||||
hex"10d33c3349ddff796b66b2c800a9fdf51d44235d14d74def1b2c112bf88647d0"
|
||||
hex"0e55341297ed43dfa1312685a260ec51b42ed6c24e46b79900549fd023441282"
|
||||
hex"0a1654efc1b702b4ffbcd21a9e0e3323a40e4a136bfa0cf81cf01bd89d433c56"
|
||||
hex"148f5bd214818a2b59ed67a8d79e54a048f357989e2046b3e7b587dc4893896b"
|
||||
hex"24d21716ac3c7fa8d8945b7b04479a0b397b8fe46e3424c0db7e1d7d824e40de"
|
||||
hex"2830e9e432e9bc3e8dc48c98c12ee9081273f5be246347769d0a34e2f0e7ec3f"
|
||||
hex"012e850e98e970f096522ef6f4f537529f296f7f3ec9ade921780c45fca74e57"
|
||||
hex"1eb45ad2eccb950133aec7d4da6d03c301cebe782ba71e3533d5a0879bd6d0c7"
|
||||
hex"1ce082f6108befc4c6133865cdf1b35a587868b99c36f59811bd3771a75c3753"
|
||||
hex"21d1d3327b86bcb2514eac6f11a77867856f5a2cb24ff4f72f65742854baa0a3"
|
||||
hex"072a1c2e8d55ba7a49807bbf09ad71e000d67b09bba8ea2ec6009086342753a7"
|
||||
hex"1c9b7142435f0c29a9ad5549dcb9ac289104f48d39d4e196025268dfa1b6a255"
|
||||
hex"00e7f5e830053d6bd9dbd5a2546f2b38820b7ec18b55b638f189c2cb86598288"
|
||||
hex"0ab8a2d0b81f7a40ac8a6a8bed4df0643df2a4dd4606194c8508595e116f39f3"
|
||||
hex"166b4f313145815f8ab8a09e6fac91e3cfa404438c8c430dda4d121eef70a9bc"
|
||||
hex"0937ff264a4c22904c66b8466165d9302052f5687326970486277a54f458717b"
|
||||
hex"23d014ce251eb044d74105355f1ae0b5dcdf0ef73fece10777328b86b0bb4d07"
|
||||
hex"276c1c219fdc62892dd095536db3525c18d0409121171197c99bdd8a95eb2f5a"
|
||||
hex"235d6ab6cef9830493b2c71bacd3782d67eeffacf4aed5bc07c2524203344cd3"
|
||||
hex"1ad0bb296be4e478c61149c736ad66168c2d0ba4410e05513c1af1ebe644b076"
|
||||
hex"0360722094dd4a26a16d8f12264b25accafdc6a3f55736f0de1e55dbdb28d02a"
|
||||
hex"088b276813522c901c6ac134a1ffa00cd61276e1221bbd7ff377d1dba5e1beb1"
|
||||
hex"243cd531b8f9fcb0cd9e8d9418c6e9306b89d96e0136eeaa66ebdb248bfd08f4"
|
||||
hex"02a12915178a6e7d4a612dbc3a878db9ce7153bdc9130d3df7308c13b2e97fb0"
|
||||
hex"05819bfdd569b0009e9bd1f9a41c7eb23ec33d8cd37d5d05b705b4511dc09f0e"
|
||||
hex"05d2260582a4a391c8180a17189b98a53b831ebced724333194f2f6809571401"
|
||||
hex"185017332cad227b54dca48915a4a78875967f8ed352fd96d5446946a64b4297"
|
||||
hex"08192db4386fcba811f000733a6f28b929be4f9aa1d2140ccc3f9616f82f34cc"
|
||||
hex"1281dc4a2838c70842102a997a6bc26a737209d42266e815738ec3943516e150"
|
||||
hex"279e9dd39bd768a08ad9ceca41993b8e8408d025affd64237b5985ed9a37d52a"
|
||||
hex"11bee6efbee9ff1ffe2f060d79bd751d43bfdec4d5fa5e323582f8d735f44c7b"
|
||||
hex"1bb75e2ad0bf3e1f255a9e983428b9baa96cfae8bf71d1aa4d3a786235e21065"
|
||||
hex"28941f264db478bce46c697bc574a5dc0b956d033eb29194de103a9a70bccdeb"
|
||||
hex"19d5cfb9c2ace7ec529ea27438d22668f09c2acbdc9c099bbd5554a6f3ae145a"
|
||||
hex"29fbde88fcb5e46ca563fad42cc7e26ddbdc0e655f88057a8a8f6e51354f74db"
|
||||
hex"1dd99423b0d860b8ee34e292b4616f7c870094c265f52cc450f98a575323872e"
|
||||
hex"2400a80de9d38f539c9b0b9580ccb9ae2e382f3092a657ff50a83ea03a4ba7d6"
|
||||
hex"20a5b9553d48bdf8ff66139e723e6a1655823b62add790b62e605d90044bec0e"
|
||||
hex"196df524c0987fe4b832add37f546b835dd259e7c03de7226a43a6a062b4e61c"
|
||||
hex"2ea4e4d02236497c570aeac4ea1896e1e3a19343f6e50eadb273cb5a7becdad2"
|
||||
hex"0800ed797700c5e269e0c1edf4947c65348976d4a67e16ee547c6c870c36e3d7"
|
||||
hex"09df4796e7cc0d89f1fc722c7d967d4c0baa823f93f9c4d6c7913edd185bc11c"
|
||||
hex"23442bab611ff64c7eb49ab07f32f52008673d80ba54e04bbc5c61ca1f0c3836"
|
||||
hex"2f5baea6ca93f7a41762a2b4f5b6c31c4e0d140e422fbe379f2686522dccb035"
|
||||
hex"288e0e05b537a48d5470921b9d724c26fb8d2900dc7d6f0741ba2c1a35138c17"
|
||||
hex"24584003a84247aeb78b30e2d8fb4cf7147785647ddeb68a7df6a79ff84fb008"
|
||||
hex"219b35214df5048253b823fcaf329a45a2ae7f959af6539ae7753e3554d28996"
|
||||
hex"21795fa4312815b80472036b9f35c1495378f172c7157a9440e62ee46692ace6"
|
||||
hex"1052d93c57b9902620b22e1c29b9106ad076f25f69fed4106736de133d72ecb7"
|
||||
hex"1948cc83425a81e7f7c6486e0f08b4b412724759ce41f950d65fa5283c31a4c2"
|
||||
hex"26769518d0ab71ba583b0022557cddceec3566637a6c1c519999523b44d953ba"
|
||||
hex"13a68997032013798fc580d466367a6a04502f500f7dcf4c2e6e03e777484908"
|
||||
hex"2668cc07461b1088861db6bf4c03528227a20d2b473e088aff34daa78be83800"
|
||||
hex"0bed18cab0f02716c9ee5e68f2434a241e6784ba03ca69df0edd97dd72038b6c"
|
||||
hex"2e04d93cc4f54309390fe572d6affd4cbb1989ddcf410fb476e3a8681656efaf"
|
||||
hex"18b0b7c0a137e1454dd3ca510d220987b5aaa51124e157fa372ec6099a03a714"
|
||||
hex"0354150d34ffc1b4ea2bcc2d705f72e2bfac4619f6ba35de7a5c08d5d7ec34b7"
|
||||
hex"12c1195df5fc75284ebe217430760ab4862de0255f75dbe24f4fe60f90c3419d"
|
||||
hex"03630b0da0e292c1088354c075dd1e00694fc14db1878a5cfacf2b7b797742e5"
|
||||
hex"16d451a52d64de482f4bf60beb30fa565a4e29904042fe36288002bb84325d5a"
|
||||
hex"0664003075b0ef9bfd1573f70b84f7b75ce76563169be92df533d5aeb47ffbe7"
|
||||
hex"0b41ef4deb720d4d2fe7dc11b4483b3d0b226ef5cfd8ba9a4e46bea1018fbb64"
|
||||
hex"298c7227e27ecf7291ff64ebbab81169202697e8e76afbe9fe1504243b4077b3"
|
||||
hex"0cddb62d67cbb120c38a93a9d10466381bcc71a202ee0a75f1bf952ac1c61a00"
|
||||
hex"1f251e0231fb968a4b39bd089704ca99438b645cfc29920e0f8f4988f77e9597"
|
||||
hex"0ec2e8e1aa9376bd31702a93e024f654ed26a324bf744d53271e510a1f7cc2ff"
|
||||
hex"1155f64822affa2c0d2fcd555aa5dad8698731fca61bd3a3d072cf33c1a8d9f8"
|
||||
hex"15699cea496017d4bf9fcf96e5a384e7c105d2ac074571e600afd0e9b4e7e8b2"
|
||||
hex"1e85323381cf7d3ba3431e64e894ce4d693f0c463b6d104dd33dedd7f1b9f081"
|
||||
hex"004b64f1d7c848aa7c28d6a815b7ec34ff2bb76d2d8c25f93265ad8b20b7140b"
|
||||
hex"0dd34779b2145df8b131bfb71ffed5c835d2b696299ed813bb472be2f3a880ea"
|
||||
hex"0e1abda56faf0df6daf6b166c95c5edc97bac1f73d539a4e419e36cae7ee1d92"
|
||||
hex"11c1659cf668bedf75fe21edb2ff2b1fc695bbd538c1331845f24839897b6200"
|
||||
hex"21bdf685c361d30014b4396b358599cefdc9d5f3b464d67a54c9cb2978925710"
|
||||
hex"1b7153446f1040fd153236c214b0b502ccb8c202c54ddfa527132962133d3988"
|
||||
hex"19a23ee53b40796801a094627b87364921ae981e57f9f478ddb3fe9e3050dbf3"
|
||||
hex"0c3793885e6423402d09a54736d9a0fab9f8e5edf858b7be1710b5ee2a46c8ae"
|
||||
hex"1dad8846162762182f95a6360199cd0ccad756cea2e4fbb6f17bf7bb643cc6ea"
|
||||
hex"0185b530295447254ce398130e4f1bac6a4135c8b9be462422bb6ed88d7d8156"
|
||||
hex"0cc09061f82989f499b935c855c6446ee4c02f2b5ec74205bb2681a3d39cae95"
|
||||
hex"1e785e3c3ce8c5a93d9a16f466e1df548f855d70d18613fe8dd861f3e4f486c6"
|
||||
hex"04715136d512b998cab28f4cada627caf8da082e1b11e2438ae4f8ed17b259ec"
|
||||
hex"16b21b75881cfd9f0ae30c2ebb472bcfafd4c09ff390f3a381e2098d9b057cf1"
|
||||
hex"1ce1a91c61b317ca6f871105d6034a1ae73832671555965c2deeb24c5da51ce2"
|
||||
hex"1382891a3df8d5ba54ddcbd4a9061a4574b0a4813c7d5fd49797bcd8ebbda4b6"
|
||||
hex"28b1699345f2327ed7e3a35dbcac11e9704a2d019568e273b2ddbbdda61b96f1"
|
||||
hex"1875cf03eaefd3c4a503d2499a9524ba9c8e8b1906511a4a85800ee21ad424b3"
|
||||
hex"2d1b12c661616bf91e9616cf0dd1823f5e33799035dd1bcb92bbb8bd7b9fb5cd"
|
||||
hex"1764a79b21973a65541bb9bf58bae57a63de6e20a207369f85b0ece77b1da388"
|
||||
hex"22852209e2034dac637154e40c26004c7d2f8d6b0f2f649fe920d916a0b9608b"
|
||||
hex"19bad11fd19291c1d7aba146796c8bc076303184293b05257a2e95aa1b35be93"
|
||||
hex"017ede6c3a4fadb0c3b384fc1bb3ba2515ede2ddf470bbc5279817dccba8486f"
|
||||
hex"20dc05e84fe2b3674dbf6cfbc4ea1888a95c385a682b198665ea24fe875f9182"
|
||||
hex"0c6eb30738c6c686153cef7a45b97d5da153ed62a67f725af666c8f545414326"
|
||||
hex"1b2e0303ea261450c0505cdcf6d8c5a1fe7c840287ff532d632de4cd4b899b07"
|
||||
hex"25d247a3eaf394fba18917bc67089efdf773445090ab333538b9db6dd2aa34bc"
|
||||
hex"0189a235ce7315920cc9633d5dc1c072cad0ebe0e95a07a0a7f6152bb14345c5"
|
||||
hex"118ec9dfcdb51980db3cdbc0b4917ecc57a03dd0c8586ed23145fb8af86e64f9"
|
||||
hex"2af16757fe4fb59efbf68b60493d51df19d06df73ff34828b9b0805b3a12512c"
|
||||
hex"0649e85e611b0ea226cd5195e88f479ca348748e3aceb994208fdeca397d1c93"
|
||||
hex"0d13a131ca0eb5a309eed385c046002c368bc570ea227bb02cc92be5e30820fd"
|
||||
hex"2444558ba0ba9ab3e990299dc09f450bae4c4c92829a42c6943c451cc858e346"
|
||||
hex"24e06233837107b33fc5cb27ac7baf78d48735d71cabebf68bbe8437ec15e57a"
|
||||
hex"1f5903dfda34ef89110f00cc07959025cf325ee02f81046cc48105d3e5930bfc"
|
||||
hex"20093ac8cbfca0030d78cc010018beb1b3e689d52956baa0c54ceaf858488e22"
|
||||
hex"2ee9cc8d4c5e47162bf7386e4325e3a513e6d4f4458f5e01fc343e340124c0fd"
|
||||
hex"1e2f5897ab3f2279bc761e37a8c20cf48a6bb27fb6da5bf0a5f67fca6ad93e1a"
|
||||
hex"0e9ae19d75c9f500b45f68de80244090eb66f42dab81886a78645cb1bfb27931"
|
||||
hex"0f78e982ab46a572920bb2e18383e1427da1df92db1f3665498c719a7af869d2"
|
||||
hex"22c0107166bb0aa5b0885983712566f8e0b4471e69d88ebdb7d0173345a2cee8"
|
||||
hex"0d8d1c4837d9de3b2d429fe96aa4f29fce440e52141ae4571cb1f1d7735af86c"
|
||||
hex"07240e3b2aa1472c3c81dbc49bfb3e866b43f778158a3fd6641a773da5241474"
|
||||
hex"037cb0fc644b2a88c90ee66cc4ddb962336347ccaecd1f4fa8eb567c04544655"
|
||||
hex"11badee113262abf691cc75f28c0236812d76537940e970f4488fbce2ccb46e7"
|
||||
hex"0e0fec7749cda728fb17b5b1ff968bd3b6433dd6dd6cc619e8ab2eae099ffb48"
|
||||
hex"28f906c82568287d2256b56129e8b83944f9ee180627afbc9d510fdb7b392458"
|
||||
hex"129e691ecb7b6fe77c01d70bf2628fe69e5f6e962f1029ce626a0d1888624145"
|
||||
hex"2f8d1c3dddbd8cb59cbec15b623aa1309d12221f7c62d956815c924114ec8677"
|
||||
hex"27db4f836bee8aa950940cc1732aa52d0e741ae355a8c3621ad068c043f77cff"
|
||||
hex"2005b28ce7c5532ebf6b7e51d10c344c9a9b00836e4fc37f7eb1176d640c1906"
|
||||
hex"0aa65efff54d1d497ece96910f6661001fb199d24c3cf997ce1e401788a382ac"
|
||||
hex"17dbdc878bd81276bd23b35fe31d93f4d7cb65b722e65d58fe039d126524bb4b"
|
||||
hex"26dadd32b90572e617c96576afcb2fcd9605b1d898b2366fd9a7cd0c23769da9"
|
||||
hex"2e46b7b8c48234c4466b0be922a9525a8896b2d6cc9651b2f6f291cf2bd72b85"
|
||||
hex"04523ff71405a30800020b61ac9a1e6b61ca68f9859f6bf1106f2a0fb66d5da3"
|
||||
hex"05a3e48cdcb56d89222f017078cf35af105ab2b2e2cdb7adc3d71de732d2f220"
|
||||
hex"08d6aec49dcb622b4b6033438a7b990f6e08a2d41909392a890d6ab2970c4fcb"
|
||||
hex"2de53850b4466695b93e50172ffcc6ff47c882aa9444bb09652ee9f5a4f43e82"
|
||||
hex"19963fd677971a8f8f1fe5d09bd27ad0676c59c6b99cc2c46d8a886716e16a0a"
|
||||
hex"2b0e85311370de1c8442d4216cb8ccff3d36a6765addb8a188408eff04a488a6"
|
||||
hex"30620acc22c938e923607f077ab953afc8412ab4cd325b812e18b36db9ea03c2"
|
||||
hex"1a2fd212df4bf20f8e47cfe5c5285a3706f8ab9863ea128054bafa1fe192afc2"
|
||||
hex"28dad5eeef0e864876e671e4a960e451d5cb11204eb0f7dedb1d1bea322aeaad"
|
||||
hex"09ce122c5b6d149f0192436aeccf959f73db3968cbe69f6c2dc955c1a8644eff"
|
||||
hex"00b33c6fe57db259f1f62f8df50692e8d8c36a22c77234e0d81dea745254adbf"
|
||||
hex"2b5b16738d4e4e8f30d8073c01e34d8a784bc6b41ec8e2afa5c8d2347b145ed4"
|
||||
hex"0ce970cfdbc28f9bb3195dd2fb274f9895a29a996aadbdaa4cee11b546cfdfdb"
|
||||
hex"0822416fe28cab89c713f9ab14d28a3d22a7033c1ada634ce7928681369e9b61"
|
||||
hex"15d6ee8f939ad0609d6eb842084c6ca07a055e83ae2d1a0109498f8b7ee9bbf0"
|
||||
hex"24cd8f5ffaa9da4f482d9efec43b3e1c77e8eab2f44007269b14614c932ebdd0"
|
||||
hex"2093e404029042625197d41362d07884031eb192890e18ac0b1e4237afe74020"
|
||||
hex"06c7641b87a6aff30a7828f5a61b6b79949489013a23ae8f138bb6458a727980"
|
||||
hex"11945363118e8c1728e09565b5ba8e9c322b281d50c81d9ff94a18612ac41f7e"
|
||||
hex"1e0557a57f3b98074694b3bc37edf005f0129ba8ab7aeef1346dc1b94cc283ef"
|
||||
hex"2be1c91a0c0747ed6b472d5a6103ca79844f6fac466e756e51599951b0ad1c8b"
|
||||
hex"0f4dca5aaa01292e52a8a19a994dfb8ae96163872353ec485ccf1a2c6bf2b0a3"
|
||||
hex"16be623636b1118ec0511c5c0aa630833c542c80ca87898c8d8a0c9c6432f920"
|
||||
hex"0dfe1f87f83f760e4779993ebb87b600763a78a1e0022f2a3c083730c09930e2"
|
||||
hex"185bb62bd0f1e1ec17991ed4246cbcadc9d17af7f85d2583b555b293b85cb3ba"
|
||||
hex"103959d3005c53566ecf636f2d99b94266ae10f20d7941d94ab52b1e66c99a2a"
|
||||
hex"24903de01d4c24236f18e0a72f1485b8e8e0eba5385dd2ccf3da36f42f29f29c"
|
||||
hex"0b5c24e7cd6e5d92ca2e92b79c3cd608a0cbfe8b2940aca50db477bbbf676188"
|
||||
hex"191656e0acf10df4d56c25255747160742762fc2d37e507e563b9c2b2158231c"
|
||||
hex"24fda5b8762d28c2cb390432cce54693def5c5d8cf3f1a820bff33763673116e"
|
||||
hex"0bb80254eea5b1630deb61300db47c2e3e9d43c0ae79ac6d8d8e5dacb30b421c"
|
||||
hex"0e88460520595dd83aefc1ea925bc7b76faabbd79339a6862c8b8ae500e61ad9"
|
||||
hex"244cffc3946a184f713d5239638a2e1d795aeee5ee445c9f9aab6409e735b88f"
|
||||
hex"021554cd4ee080447d929f96556906a5504df942919385bc5e64cedbf2ae394d"
|
||||
hex"27ace9d675fc4a5fbaa1418f1420ae54e57c8343a69843ac97c5ebcc81782032"
|
||||
hex"0e5d6c9eda47e171d3f5a2edb52448f00acda78580b066fc588b39aa09638a85"
|
||||
hex"0a2a0dcb9dd824a85d72255623c47308a71ac9c4b4f6bda9d273b1c1f88b629c"
|
||||
hex"2d80cf2b46f3ac5285aad169e96b067b01de824253f4156311196ba6e4bc2104"
|
||||
hex"0cf1b3cc75b68e63af37eb275714561af525bfbb82497cd4730215975d8a3cd6"
|
||||
hex"1df43394141f318ee9571c1ed93198d282288da8bcb5b33e3c6f1e9269a76304"
|
||||
hex"1064a0d92da154a1b43895e1833b6bac67e096996e0db5bc1447c30bbdcb5bc3"
|
||||
hex"0253f837b9e9f89777891e37357c8654e1a5d5ea0262afd58136f1c1c969d395"
|
||||
hex"0173e90b1dc6b589a510c7364be31128cacd0baf495fbb9161024b880c18e97e"
|
||||
hex"2a3395c5515973f8ebbdf18b8fb573eb46a4e8fc88c2f159cc6be94c7aa35e0d"
|
||||
hex"1be4bfc35f47cd93bee0e1adc16a0957f824a9e24f31a32c372e97b6a2f9a71d"
|
||||
hex"147f33857a0febcfe896dc770f9a2a86a7089b55a396afffe4bb21d5321e1d7a"
|
||||
hex"1230faf580d4ac8a0a7d8f3fcf457f63ab27cc54c5820739bf6437bc43eaecbb"
|
||||
hex"2cbf7af588268ced22cad9f5a9254d95c5f47127387655ee36dc94d70d139296"
|
||||
hex"0825e78b37cc551183bcb25b98363522c0a801206000c6ded60985718b46ab24"
|
||||
hex"00ad0b22c9addd5f71d90a7578913c0da692d7bb9230c78d6f6273114df69d73"
|
||||
hex"210957b327089cd3495ba001efc730c8f84d824fdf9448c277d02379b694d0bd"
|
||||
hex"1a4012ba18c18efb60b94d7fb0fb750ba948a5c73e55ffe464ebf7acbd04fb81"
|
||||
hex"24a0432f67e42bc4409433b85588fa6d16dc93432fb633ec1170e1de3d258e7e"
|
||||
hex"287d7479896cec61832a3e7e5e257209609c6af97c315bb08473de27be705f83"
|
||||
hex"1301c5336b7f37607888212f40b73bd0aea535cc7148be0f9cddeef1f397b8dc"
|
||||
hex"1c1bd11368695d776b6d4f51d8b9a3ff091dc23b438ad3a8e00f435768543c95"
|
||||
hex"20ed4fde81fe5b8cde1b1b005cc5a470003b8a12d74d4178d03351cfd620c9a4"
|
||||
hex"1861979a4209de561feab4faa20b540fafe14a2f47815d1d6f756882735645e3"
|
||||
hex"0f50fe0714b48545aad0aa47edf4cf85b77edef8420cadbb2ab055537896841d"
|
||||
hex"009bb5d21aeb5bf32e1a0a2c6d2f7a0044c7bae33fa95f6264135534b5aa1a17"
|
||||
hex"10398fce470a822d6e5bf4a572fc5aa091e664335a8f0e5f4b82ba80dbd25d8d"
|
||||
hex"050d8d517b496e2067860366e267a33cceafe24e53584565511927952e43f160"
|
||||
hex"218634834c0bd7a41a100548c68c54d6d47e30ba6841925ce0afeb3aea683856"
|
||||
hex"00156ed62144c5a67173008b02d76e28126ca00a2819c0bb3eb4cc92c196f893"
|
||||
hex"2b0efd5fccfbbd5f77198a0d800e01d63679db7ee5dc4213c4a1e82b47ce07ca"
|
||||
hex"040540c023f617d52c1ccbd2d9e825d8f60a2f6cc6c7e0230f8c259659cdc082"
|
||||
hex"11739844b03202e6faab271c897dfa7bef337a5b0672ab13ebe547f572a089fe"
|
||||
hex"304aeed0c9d0c871f87128dbbb634322c5449164a13028e7f8e46ea7eaf5861a"
|
||||
hex"1eb1cdadf95c5ae983ef642bfb86f103558afc4571483cb7585a00715580fdd8"
|
||||
hex"06c4f741b7246e5655a575e85661422ec7b71e79535db2ab86ca6105124a2f14"
|
||||
hex"28d9f82f7cf626d8bf29d5a074bf2e8a64a11e8b415465ec3366cc0e4af15eb0"
|
||||
hex"0af3afb40024843ffe9126a492594cff90682e2c4afa7237bc901e70a081e68a"
|
||||
hex"01e0d9ee7d4bfb5b07b2d9102409de25c281bbbdd10f2bbdb04adf4a2e467df3"
|
||||
hex"108a7206cd0ab67ebc298481ce73bbff082a5434b01e26d8ec53ea69f7dddf6b"
|
||||
hex"08619279b0aa0c5e4f7e0ba18b37dfcb3ab7762debd778e1675539e2023fe000"
|
||||
hex"26df8a6518857f2cf15a8dd27eb05fd4854710b80ae479cc3dbb4963dbb61401"
|
||||
hex"29ebe07739ab8b1f23d828751d533ea3630788c03835c7ade9de2fc725639be6"
|
||||
hex"27448ecbcaa51b958aee7c6415c041b815de8940e427fe2152c77639f3c5e7db"
|
||||
hex"0699e2a03a056f4a0323541d174c4d8c1d71a7b04c664aeea06aaf2f97849623"
|
||||
hex"1f2c0d82e6d3dbd8f29d81dcba037666a0567564fed3a90a34f4c2a0864fe6a1"
|
||||
hex"18678798666318a2f6c93fc93d788c258f01c5aa450b65f4927ba6308f7a99ab"
|
||||
hex"0fae315f1aa96516b51b9a35b0bf04a303290f7a4b0f107434e88c9b897d8ef3"
|
||||
hex"2dbea8b90191f27ec6c6a71c3b576ccc10b6945a2d651b526b36c86929d7dab3"
|
||||
hex"195b1cd7777a95a1dccfab7ad95d9815d143fc6d86f974cd07417038811e143f"
|
||||
hex"157f37337b54b492a344d0bdd2d2dfd3f27a74d529898ae3243bd532983b58d2"
|
||||
hex"2337c69e87af024d6cb0d8f29c96ee48114d2e7b2c1535ad6b00e178977380bb"
|
||||
hex"17569028d04252e77d46764676068c2e1d43bee814688c6881424210bee531ef"
|
||||
hex"156682b6b037656dd8a82fd83ca1924074f752a207b2585ae4c9ea6f4c78c75d"
|
||||
hex"1ed96542fc65f19260e0a755919c2e24659105c4c9df00ded15f93f442f6887c"
|
||||
hex"12fadbd7a3c4fe425a3f30f0ddb2f375e471a373f27e43c8a494d9678e8e6093"
|
||||
hex"1292950805f2f6b9f28b3182436c2a975dd365a59195dc4df585e87395c7c3a4"
|
||||
hex"236a0085c40b7af8c4448e830057b33fe8df95a33647c37c55b225bd5f8b1c59"
|
||||
hex"1db855703240e2f49d63e43c62f8c30b2a39b67bea6e9a9481146c046af276d6"
|
||||
hex"11b6ed9c39e7cc8f66dc7f9b386ba00528af573aea6d008433d39881470fb564"
|
||||
hex"29fde8616fbc9e483e1222d447832cb7bc58170c7ec86e8f4de9070e07eacaf6"
|
||||
hex"08aaaf73c42c827990cd0c64687ae8cfa0b373da849a767ef3b63ca08327663a"
|
||||
hex"0c85a554dd2ecef748e891cbd90386b5737d945603b56c887986f9a306d7de4b"
|
||||
hex"18564645c2a77acd8cde744455ead6f28819282b59f662f7da89dec13b7623df"
|
||||
hex"1b44633048278c6435e1449517b0235bc9f4c2cf39aaf34908726c3dd3a07a1b"
|
||||
hex"29aa41f4a0e91cec6a4481c3280a94398f6ff1b0b07b39ab0e6668dde4383082"
|
||||
hex"09a6e0f5ddbfbb30481e978e215f67468f31eaf930dca350f0fc53bee83f988b"
|
||||
hex"04310eb11496a8955d0a91b51aead8dcd1703cdc4b0e7f2f4674ae3e588b595b"
|
||||
hex"2a10a00f88b3abcfdb5d1c8dc9f8727d16373ae7fd05b239f7e5bc22909682d9"
|
||||
hex"0901653987feda97752895523e956cffbcaa8d3f088d280cb19cf4d71f010a67"
|
||||
hex"1d8b1d6227e7d72dbea884042ee1324bd31a5fbb7ed49b79f04e834245a552b5"
|
||||
hex"157fdd0e905e98e890291c69bdcdf6307771876bb8288809b44e63bdc934710e"
|
||||
hex"039909b2ef090b39137e7420aa7ef195656037f3482b4fc10e554341d68ec93d"
|
||||
hex"2294fcb6a8d69542b31f9942a59c4f4503e188912dd1cff39640cc2217e1cc87"
|
||||
hex"1865202fa3c02e817f2fcf395c446a3eecac5d97950a44ffe1e8d299e064e551"
|
||||
hex"2aab2c1581a7dde08e01d9efd6c7fdc561b8c7e6fa75020b9534f2d3b35afc0b"
|
||||
hex"0e550b117eb8b4be6223be3b32b3367819c099e5cee581ef44a2cc483073514b"
|
||||
hex"0c317541eccfeb5a470e62a4a7183b1b22839e1a1c23bf58b6ee43d1fe87fa10"
|
||||
hex"0c1bba8cab5dc7f68592841c2f9cee4e068d6791e55f4dd54edf7ecf336cef35"
|
||||
hex"10f331f64e0bfe4a9226e772e395f992634eeb6219cc239dd5d8e03cbe1f4581"
|
||||
hex"0bd16714d1d83b871586d6c721608db6150796aa7d942a7d6b7f37e1fe54d591"
|
||||
hex"0ff184c75453103ce3e832ab21e3f16110827890bdeaef035641417fcb9b2c3c"
|
||||
hex"142549f5302f25b6f4fd1abb1b586555dec7abb108c3d988222356f8845157a9"
|
||||
hex"1a934f239cf4d919aa5a54e5706f63ccaedaa2a523aa75b6cb425fccd9b30276"
|
||||
hex"0f63efea5bb28d9047c8ef3d06ef698f6eb8d69cc2968256b56ba2c6b1aa3250"
|
||||
hex"07ccc054bd8707ae6a7e1136a7d734ca437bc91640e819bdb1161db6285b8482"
|
||||
hex"09f695c935d12262fc81ea65c312cab7c604cebf8a7a8e32199912d3fc172f2d"
|
||||
hex"0c39e4c9610d79d226d090265c7f961ce63aeab2e824e029ce1b89601913496a"
|
||||
hex"0dc3486866c4ae74c9f7227bb2bc821fe2ea1a265a34e961cfe8e0548f0b2ff6"
|
||||
hex"29b111d35a7ba7b41a2e65e5412dcceb796b31d0d87b9f1a4d24b028f2377d52"
|
||||
hex"01ebd6d03eef5c45e78c52247c3282fcf64558e43ff15e1d39533389bd7a86f4"
|
||||
hex"037518906b748ee732531e22b29338f4a4f42a0f216226011632c4fc7a592872"
|
||||
hex"08482ad4d100cefeb5679cb8b4f6af5aa6b87f87d0a7815aebb30da0d927d3e6"
|
||||
hex"13ba71984e13a4480217ff47b1055dbef0ed7333ff8403935f10785b4d212031"
|
||||
hex"267080070a80b5f94ea5c4363d2d971036e8446f2c055ca49495145eca1ae9fe"
|
||||
hex"2992670c4c90a20991d63058dd4a885b9ec25f2307e6dfb364be99f0ab596b56"
|
||||
hex"0e91d00167f0fcdc484e4510cea659d39a58ea6d94188082c301d82be3a5beaa"
|
||||
hex"06007fd0fb2de248dbc4fe010a14285eb1c67ab1035575cfe2c4a46e7169be02"
|
||||
hex"24093f309708216779d4be610fbad6c37027359a6cd9af3253023c94bab25009"
|
||||
hex"27dca5e53ccf2bcfabd9f056b2381845a855bf7947d600e6f85117b69e57ab64"
|
||||
hex"124efae3d5bf327ab6ba6d4526a495aa613a1c141b4ccbe97dce4d2174af4975"
|
||||
hex"1a32d049a2624f7c385673c88d7fea82a5c517b7fac655774c395cdce73099b6"
|
||||
hex"0602b40c9255dbac3b084808ab31e76a1f050751bb6775dbada5d84691d27653"
|
||||
hex"27ca9346b73ccb979a8d2890fd43bf51eedcd0a78af072f64ee41abb954bacfb"
|
||||
hex"0b59bbaf1fcc4321f763a03b112189c055a31078afd0954b7d7ccf311615d3d0"
|
||||
hex"1712fa34ac64c32e7ba17168f04876190ff32077be969a20cf83be9d04ecc5ba"
|
||||
hex"2287f65a7cb3a473300d133636ba395a1cfe1b9cfbe68f106f114d46d453ac6e"
|
||||
hex"058d32c610ee7b8e0025aa2f8fa532b3a6a45214fd7df4c35ad5112f545fbde3"
|
||||
hex"14772040257c0366286283200970b7ee56d048cf3f6725fc8d9651a8234a6594"
|
||||
hex"149de5e4a643c98e7261b75a27baeb89147605258f470c0291bf22880e6a9006"
|
||||
hex"12c1e251dddced6445c3dcdcfcccc1c36736068f9e1f7bbc4063895df782b115"
|
||||
hex"10427a865028d998dcea094cc2f8d0fa2efbd0040d0b118e4415dae71c92cfa3"
|
||||
hex"1dced774d8572bfb42107f480682ff1c5ef95f657787a06997f53061d44cee6b"
|
||||
hex"2033fe9a65b025cd7e27764e34562fbc6391cf8d31623f31b68f03d6a1d1404d"
|
||||
hex"04b8c60cbb003fd65b2886da9263ee92021683e1af25189631d1725df8c16357"
|
||||
hex"2d5f76b195591eca401fbd5d43e2992245ea9a4009a8ed600fcb0962ea5b845a"
|
||||
hex"18cd73d9f8a31eab2560b9f00b08cc4517309f7100c34df4c3aeccbb3df8eb49"
|
||||
hex"244478321b4748aef75677808a6a5d92a6964f298eb5e5337621398b0c1a4355"
|
||||
hex"0700ca5f97215da057c3a4a16a260471ca887e12ab3a9fbaac6a61c67c38fb9b"
|
||||
hex"1c8b2eec6c0535832e1ea214b890bcc72682c5bddb39f4ddf34500a5cb9a81aa"
|
||||
hex"2d3d9f09f802a02b7324b79e9681debd2833f6238b22ae6622ba1a64e744f790"
|
||||
hex"29e3aef42dc679892840c82352fa28d9140106d6c2ba6ada66fae52bff965eb4"
|
||||
hex"0eb54e3e94c92cd24f6ec52eab577e80d8c8e9f2d39d6b8d69503967d9809fd2"
|
||||
hex"1036bd833a94dd6a85559c519bb7a2769b6486b00d34996da228c08994f285b2"
|
||||
hex"2f7362c30b976680185fcb2d6c1a9fc47ce47e77d3af5b773534e2ce7c2063dc"
|
||||
hex"0f148ba271ab4c9b17837d44c14d231fe85b7644462249299a68b506bff87f4d"
|
||||
hex"23eee74e2f9b8ee256ebaa6e03b545afa196f22ef7e96d7255f5e79bbb786c1c"
|
||||
hex"165a455c205655a47926176b91f2d2c02ac5c00ad29b467bfdbd51b0768b3529"
|
||||
hex"0d4bbf22a70348d22efdd5235eb6e682385197b4e17330c46c44ca6d5dfc6791"
|
||||
hex"2841ddb730006e521446f952117b78effc601d10372438c4ba4f6e2608e9a510"
|
||||
hex"21960d7a065af49c4c06053d32596d990c1a43cac1658dad807ae48de098e417"
|
||||
hex"2a749e9fc0fea8a55e57cdb05166ad9692c00bf103ac30881c6ea8c6b86c244a"
|
||||
hex"0792663fbe195bacf4bffe700777c5fb07db9bcf94404ce90d0ed74a50febf9e"
|
||||
hex"2b4d7bb4c6dae168809b1e8687e2e668d2680f40733b7d6877b27eaaa2021daa"
|
||||
hex"212f5c9650237c6013810fbf50f8c160395a487a5cd535ddcc85437383d7fd40"
|
||||
hex"1e42318881baf153d5c6a0f3ae7c933daff9cd10c89c0f7d9c1253e65995e7af"
|
||||
hex"082ba05d83761cb163b4ca9d55e5dbb43c74bf3f456988438da2b3e62a90097a"
|
||||
hex"188bb1d3cfb110267f28a328777328ee715c575923e5517216a551b7e4bca464"
|
||||
hex"26c9def697692dbd245316df1b3d3ebc23d2e7f26282bb8c3c77383b633d1fee"
|
||||
hex"09e269116a30414bd9701c5e0878caadf29773b5e4c010a7f519d6c8ed4ab64a"
|
||||
hex"0b0dd617d9c5b993d32b538129fa4404c7371453aec2448ad60caedef2521774"
|
||||
hex"2955e9b0087cc084f3750b6474cf9ccc1b91b93088093fb9b65512bb41c7fe13"
|
||||
hex"25742cb05d49c540c0db2fe8cecba3202fa75c3652f8a0632c901284718de2f0"
|
||||
hex"197e4469bc4e63f957318e61dfc0b47f3612c833faa62fbbc758bea7747a919c"
|
||||
hex"10434862eebeac7e95316632cb2a81e786f3148d551e82d4b5f3952dac0e84a8"
|
||||
hex"1a35b2d833ae99e441f064acd0efe3ec75d0180f0dc898edb2ec4e6104c43d91"
|
||||
hex"21095529dcc976329670baf3bc91051208b4d62984741144c2795189811c35d4"
|
||||
hex"1cb3ed4bbd682aa625880beac8855c5fea04d41e00eab4f0d06318c229f650e1"
|
||||
hex"0fdb194388dbc4bbbe4e95fd302d9cf15deba158f7c686da98f0c51b56a9c3bf"
|
||||
hex"2355c510225e1b58ab2af9314c08bd8adff1ada7c9a457c0c1deb47b814f2c2f"
|
||||
hex"2c04d7711fd02ba586d4a50ad99a1723e5bf2916b4b5ecba863947a98fbbbb30"
|
||||
hex"0bbfceff43f6717beb8ca8fcefb59c672661fb46da69df22870a4c52fa4cd0f2"
|
||||
hex"2bcca13d376d46c173fc2901c265dc09ad688e67b9726845e03944ee966ec01b"
|
||||
hex"285bd066f7c5357304cec840041d33e776badbda4e0007a505004e070b9520ed"
|
||||
hex"0794a82f878b218f741d0cb293956b5273b429c885d893d1113d73aa26c1d423"
|
||||
hex"271b72ec18a3db9d3d0e838edd70c2ce3869f8dfa7a2990839b8dd9e1172e87b"
|
||||
hex"0a636a0eaaf2172cf943d025179ff1617471d89f89258b34a3bbca00641a9cd8"
|
||||
hex"1a528d6c2a802448da3ad3d59f777313c16a671482e39b8cb7da9ac35c1ff2d8"
|
||||
hex"18c053d772d3b5a8a648244ccc209c808ebe141ba2f9d5650d0da14819aadde1"
|
||||
hex"1048336a6121c302669d43eec43639872901bf281af7a1688aa3d3928ebdd907"
|
||||
hex"12c4211198d7728995d57f5bcc090cf7beca8045d513deb1b175ebb36796f0e4"
|
||||
hex"1834db39abc7b5ecd1a514dcb9228530e81361aea5811ca208a650daf968e6d8"
|
||||
hex"10ec1c14ddd45f0d5cc72b4bb6c9b567381cd3f8ff34d9591c48f845ea50846b"
|
||||
hex"056e828c137df3632d6225d8c3c7df355ea62f2e0d113a7e36852b6764afb9f1"
|
||||
hex"1759ab5b4dc7063a18dd2b491a4a3d073bfdf8f4d33df3f339a83e3ba2953d7f"
|
||||
hex"09876c8f4e48e48b158ea3f41eb7f19716f44512bf7cdaaeb3915798ce22707b"
|
||||
hex"1a45579944f3cb644003ac2430ac63799964bce8f0125b487e5e84f986f46a83"
|
||||
hex"14921030ad6e51af6e9a654d191b8562e8acab6542844de111650de2ce37659f"
|
||||
hex"29baa8a03a66a40d48856ec10f47f554e884258e4eff26ce0f15c6b5171f9581"
|
||||
hex"2f14a2b03d6b68f4bf5be1acb77702105951d5f13a423c1b21960b0c129fa99d"
|
||||
hex"1a8dc9e0aba8f76e0f8bf6db5523758d5ec321d0857a2df1134b5dae2faccf3b"
|
||||
hex"2373925e13c17f70c80783a3664e984c082f251bbe3c4698dff5daf3c70e5fdf"
|
||||
hex"14c66f792e18c3133a0ec195583065986f5d8f297f5750ed78aee7b7fb6efaa1"
|
||||
hex"1546abb4feb014cf7206953bcb52e5f16ac8d232723683674bc02854efa9c811"
|
||||
hex"2dd9d7b31522a6b7fb653afd18e987a926fbd5377b5b0e415cf2614bdf0c2635"
|
||||
hex"0102b6d8a26892985e76fd744ab01d06b524f57d634fc0b69a5d91355398d6ac"
|
||||
hex"1ec5b7588982ece0b103edde74a6f327e6ccf694bc534195fe0effc7483f13a1"
|
||||
hex"2b278acb099ad84fbc96b27d36269ba06a660e2bc9093059a2acb1998cf3f1fe"
|
||||
hex"129253e64f00669a4cf7480180edd5c242544581499b9a233f0ce088acf1e4db"
|
||||
hex"14f35ce5d343461157dbe0adb07355d95d2cd5aa6dba222b6a702af1e325d2bc"
|
||||
hex"2d106ec5d71809dff7aec68762661bdfd5dbfe456cba5a7c150c73da2510f752"
|
||||
hex"16ed7e6f631af32c7e9c7884b0ab0cf71a834ddc4c825748eb5d35451d809240"
|
||||
hex"2dd68235d74c633a111bd167dec9a6371b137ae89530106a928c87743b38be3d"
|
||||
hex"0076cc22cae0c2544d7e6d49cb00182253dab5dfcf6cbdb378f56b0714b9d4bf"
|
||||
hex"2af75f56bee1cdbf00f1a0af44ee6ca3d7f8b3b42d38f87bf1da869240dc6477"
|
||||
hex"092f4b09a0af31220825e29d275eeb08977e8d3a6a934cc16a6d562b2eca001a"
|
||||
hex"04cb8d5ffe9fe85b21a785e261721288e9b5b75b400545a31d0d53270608b104"
|
||||
hex"08287f21c644121d27ec9aa9f50ccbce17e7ebe37a9858da78ca1d207bd9d637"
|
||||
hex"08d64375d1c8b872172ed0e50612b60c4b049e807f23d6fa8f4e61e06d52047a"
|
||||
hex"034d11c3fb63ed48fc75af072a1084b3d0982b796c9dbb70c295e4c938688dd6"
|
||||
hex"03457e18852f8480e869f8aa0665890d85a78c5458b77f682cbde6b7954b55d8"
|
||||
hex"2cdc590f35d097cd61fc65b0dbaac9cd05916c807ec0e318de09c55d6facb637"
|
||||
hex"0f2b077d67767da3df753109cb25329348253b3bb8a474b8f2383d269e7af7d3"
|
||||
hex"1188362ee1c47b51ae57ee87cdc133d212b205f43ad871011e82684b3251a168"
|
||||
hex"17b80922192c7ef6e95042838827e749bc017d1a96c6e69f4d945f6a40c80678"
|
||||
hex"09380df1270bf5638a0dd4f2c7b7af4a5798b4280a4c98abd97c99272b34488d"
|
||||
hex"055c100b6e332bb5d2bf6ba8f3f5945bd877926df3eaab055c5d42be090db0bf"
|
||||
hex"02cc36716e8608d8ddd908e019707e77d50ecaae8f83a61fac66303fe0d98038"
|
||||
hex"1913d591367d4749326ea822b20c1f015974fcd5ec6d659aedeac7b56f6fb789"
|
||||
hex"1706e619141f6b4a93840023bb2342e759da6438e07ed974a5f1e3d506144c96"
|
||||
hex"0bbe067b718cb861fe927716cba85cfc466eed0e9d2c1067bc7f9e356bc5d23c"
|
||||
hex"1094541933220c2bef5ec7afe91782ec245208d58f93a08ec25eb59710a73623"
|
||||
hex"03daf04d7a256119a10ba5f6653564dff54f8eb78577360ac477abab5ce87bf7"
|
||||
hex"0cce5000e4686fab8ca621f1c65dda94eb8b5892b1aff79a9a5eb0a2e65efd53"
|
||||
hex"14e0969768884cab782cafd4b81555a818559c4835fb6821ec46fd08ea418ac6"
|
||||
hex"1ff343732becbc72450b2faedef7112b951edf2ee03bebe4b71365755e6d5518"
|
||||
hex"10e06fbbc2176bff93433750bcbfec05aea120f193a1e4c5bf5993e098916f96";
|
||||
hex"15fd0f19bff5521edae5f6d895f4730c241ccc3d415eef6c9485d21914188c1d"
|
||||
hex"2446d537b3dbf1feba740b7657dc394b17e890cc1db8c77a1df7ddbf00c956cc"
|
||||
hex"0e8e971b94bc8945665a5a61d013e62406abdad7c304284ab3981bb120ddf221"
|
||||
hex"2bc9b3a8075e8affb419233bae1329c8b5a36dd5849d426b61896d79e5ace369"
|
||||
hex"2fad2a9783fc2ba49001eacd3a33e34c302753636d3c46357636dae6c8b2024b"
|
||||
hex"19c6002888dcd3e33699c10634a806d2aae224c3d7e59cec5a9b8719b066d264"
|
||||
hex"0c3bc3c927533404b7618b19082e24eb2ca334e7bf9dceb958bd3551e9fe7f57"
|
||||
hex"270e9bcc58594f6192a2b99d2846f622de39b5937b2a7323cc45e25fcb2093d0"
|
||||
hex"1e7d1a66aaffd026340c02261fd998650c044a8b0c7fd711e04213a1cd2cd351"
|
||||
hex"2424444f3b3621df8c36b258f3554a9c5e2a21a5331717c8aba346c7ac63c976"
|
||||
hex"16e036c1a88f983c82227849b01847266a1175919ac332c27799549ce18d36ee"
|
||||
hex"0b0ca3b0483c8e42c91944242fc36b40ca910518f9d85a25be8e4a7ef43663ad"
|
||||
hex"110cf5e0d819a05a811f7a0c166628530ba6f6d353e8e6a433c064d6fadf060c"
|
||||
hex"19bce756e115841dd94ff44541d5ad78130187d67f3c560c2a590bd093765709"
|
||||
hex"09257a78bf2bdbaec4a20392ebaef666111a0013e0d145e3b8538bf21c631b78"
|
||||
hex"054754fba6cbe53da1b0e9c8e6694c94e5c5784962cd792416d2e2a69c666d20"
|
||||
hex"1afd103f745dc8bd51a5433a7ac8419f1dedaafbcadd19048e9009d4c6241613"
|
||||
hex"245cd94a309bfb79ae8f5255803fc1fbdb80bb78ac6d5f68dd031a464a87ebf4"
|
||||
hex"14faebe5560369ec0b8807a88ecfa006f7f9795caf1bfcfe261555534cf4e78d"
|
||||
hex"0c962615261ca9c1f65cd755e00bc013abf1533a12e81b80b32fc41b0d1fa86d"
|
||||
hex"2792793df783c78305175c60e000c53fd96ee07ceb78e470a6c64a1b477c5534"
|
||||
hex"2096d8bc28b6870f36fc685e6509823ed594339011cb6dde0e8f8d7cc1cc582e"
|
||||
hex"109542c42e7879d5f2509059905ece1bd8860e7c820343aa1b30461df91eae95"
|
||||
hex"1eea6862ae37a2a4392c5801737849adb507f0a3137699241517a3f1ebbb3a48"
|
||||
hex"093d3e06748b6704617f4cffeeab1a9c5b788923f7fe09a498749dd9ac9f3253"
|
||||
hex"2e5f917fa4593965b59fbd36e7644390ba01391b8379a4a204c1c29fd1d17cde"
|
||||
hex"2a0dccfc2e6d40de5187062a63a944a907d0d7bb6eb30533a3454057778ed3af"
|
||||
hex"1b8f89159c77020c893f3cb7a2a4cc3085dafdab413391192963d2d6f8a71b7d"
|
||||
hex"241b04a42762b5922f9e96652279d739459c63ba99921d36047868be961392e4"
|
||||
hex"1f9a885deeb4ea645ceddc1b496d41a8b765b09c9fa5dd267644335f50b78827"
|
||||
hex"0903ca28b792a69f59d7499ed7e261840c1e20951bf0036cd34057859ea07c98"
|
||||
hex"0cf286f5af05fa35173dcabd94e3c7fb591b74607d58c397469cf09759e89b56"
|
||||
hex"1a465001f19b05dc38a491b248c97ec7920c03da29e69d805df6dae9ad29c6b8"
|
||||
hex"0ed2c6a0818f6e04bd3aa8e1a17b0d67c6815feeb8bfe9b3a575bde437ab7114"
|
||||
hex"1cb929c4998d91a32baae52fc164831ff6bd12474cd8c91189b69f1e8cdb7164"
|
||||
hex"0c5be902277c48337d1db6b1fb81c89e8689cb10b7ee6af8b9fc5975a730f6eb"
|
||||
hex"2dd837a46f2ba2ee8ea9442a9eebd87ed57f594f044c7860b39595eae6ce4d0e"
|
||||
hex"119bc8b722e52ff60236302b2e6f4a139f15e63aa0641ae765f3e71c32fb759d"
|
||||
hex"25214f618153620b583fbd2abc2eef9a26789f3b5296e90551877a37d362dc95"
|
||||
hex"013c611347b3d133ed9045be2c36f8689a0120c4078d12d8cd28c006bc61dda2"
|
||||
hex"2f0a9559eca7cc75db51c369b05e74c952d5a8ae39b06ed01c8698f4d74d58dc"
|
||||
hex"0fee282026bc113cc251580beab7bfbddf2209056fce08c4e356b1a06f1bc944"
|
||||
hex"14393956732c8d80c3f60ae0a275b3968c22c40e9054b3ad662671f4326f208e"
|
||||
hex"1ce66ceaedec3b13ac33cf1dacc63e7e68e3e7fdee08e91a54075cc0758a805a"
|
||||
hex"1abc1b6362a1a276f723f806d4a51d3b7ab592ac8f39e198cb5efcceaf0e48c1"
|
||||
hex"23f70ead154fd51f42a3de0ac2b61621f01a8b0899f46d2d9da1a8d620b88e98"
|
||||
hex"28358bc8e9b03c31481e07909d86cc8386494aa0c6b1fddb6e83911200d2d5bf"
|
||||
hex"21309d93ca7e97b55d43c9396f92716ff1ad99b73dc929c566de6c6c721bd048"
|
||||
hex"08666e4182c159d4cfd305e1f6f5cfe4ce9243ab5388c2a5a0ab74b600e4bd5e"
|
||||
hex"28cfb007611bda022f417d399841a00e543b14076672113b21e9bdf4942eb3fc"
|
||||
hex"1281dff49430dbc9d0748814312f5356a1024539516ae19e8b6eb6379421cc83"
|
||||
hex"243dc2b640abc1728422276ba4ad24cab39fc7d1ef6cf3d82fe82c9f89efaa7b"
|
||||
hex"005cff4d9542e3250c36bf32561e274f8fa928dd3a8d11f4f76c36a4cdeb5e64"
|
||||
hex"20b886f89543b54f0403091d51cd88895fbd55aea86d19db8b89cfd55255f803"
|
||||
hex"0c0aa8002fb14fb9b4feda737c210d4289d62a014e4bdbf708ad21b53ef62d96"
|
||||
hex"25e79b70d1ee02eb3f6c25bfaa7b9a4e1566b0fa70c6c0ca072191897838a360"
|
||||
hex"27218c7dc6af590ab65620d6f31dd4cbdf1eb86058151118bbdb80b8d96d0d80"
|
||||
hex"053653ac15a867afa2931d75116318a810d5512d871b71f4654c86acabde8c91"
|
||||
hex"1c48420d5581f37e60b15a6dfe652b9ce46e2de3414d252b18df5b1b8df2a818"
|
||||
hex"21fbada5ab40ee0640b13756b26a7fcfeb5f81de884fbb889f3ccba3fd64cce7"
|
||||
hex"0d6670f5a24582a747e1d1ae1e0e8da63d7d202210d96dd5078fa58eccd43e36"
|
||||
hex"1fe26476a17c1dda8d2d1b630ccd263ecd5644529afc3e2973f6961ff3f87126"
|
||||
hex"27464f05a8ebb85e8e465599614ced7bec41fcda74ec9f51ae39c392672bc724"
|
||||
hex"2ab9a6d1c669a478ceb584e3bc6e1635e3202ec53cbb6f3cc42bbfd7659607c0"
|
||||
hex"0dd63e17922e2e955c38d47347fd269336d27cb9b9c7a3218c3808507bbc994d"
|
||||
hex"19593a3350d5604598530c93362e2836f90f7daa675f73b40bc04d67b0625e3d"
|
||||
hex"1682034112be41166846a800dec3f04dc45f7878bd2c5493e443f44efc5c08af"
|
||||
hex"0828e223ee37c2d4dfa133c8df747c3ddd415da67e911f2f5cb609a58df64bd0"
|
||||
hex"127bfd549e5e8dcf4b22291715f2ad5668cd6c711c2a39c3ffebe93243df40b0"
|
||||
hex"0dc2c61595d602f4f7b03af6a919263956b5943cb3f5f890bde70de733623387"
|
||||
hex"1eecc3f4d0cf71749bb70475ee20a3d479719fcb7c7bea429059f6c1d18dd57e"
|
||||
hex"2d94c63811c0f21889beeecc4d7797f0fa87f0cd40fb84ac72f5537942b5bd7a"
|
||||
hex"07573806d926b6e92313c06ba464ac035746e0dc96b3d40db4020f72dbbf7153"
|
||||
hex"06fdd2c03d7f271f2969d465c7e86763751e29fa622a2715694c534b5e171b25"
|
||||
hex"19546a1616aca8f207e875ebf37977f96c1dfa32ddf16d7eaded9047ab15142f"
|
||||
hex"1953bcaad2e145cb2a759cdd65eb7cf493b281b71b0faa6010e30a38b5127519"
|
||||
hex"2fdb1ef3113503a9db688b32a0b79f3a8125d7967b3962373fb886332a135f77"
|
||||
hex"06d774b685f236c190a046ec7fc6147a84260794c543230c4d3f90cc091d0e60"
|
||||
hex"2cb5b76f44713c49cc24cb3e1715ba081787296b94dbe25ab57742ebf6553df4"
|
||||
hex"05159d91bd6a0a9c639b0cc27cc39dae457f45225c4bb554264af8e229a52524"
|
||||
hex"115001b9e8d8b1463cd86a016c3610f87fc2a10f63bdfcc00cfa99353a4c1a52"
|
||||
hex"125537cf6072615205c38045b8ad31d155bdd8acf80c7dc627a7506e642a177c"
|
||||
hex"2e83916c6303325ed9513361098830271102ac5dbf285e2645915eeda77a5693"
|
||||
hex"1ce67dd1edcaac1b03358eb6b2ad3780bd1cd201b91d4bb2e603e01279351fd1"
|
||||
hex"26e90bd7b6f903b9e517a0f77a7e4048033cb873b1da8cf190080e75cd1dfd6b"
|
||||
hex"1cf426585573250eb3432a5e80fc194c307c58c814ac37bde84125a5aef222a7"
|
||||
hex"10fe5c50f8fe71b1fb44251e5dcc90bd0d64844451329dcb49e241585406ef8b"
|
||||
hex"0c273841cf7228666b689b24a7022bc402815f77f71b43c1862f64853b6a47ca"
|
||||
hex"1255c43af69be48744c759de67f363030b809ea5be5de707545d1f29dbfcd272"
|
||||
hex"110b2f7ac7d7b3f94893762fca13700b74cec691bc57d216ba04e992bd0dc947"
|
||||
hex"0652c5b2ba7b972dd68bf8c271556b57ad4521c067a072d75ee09268562cea9d"
|
||||
hex"1e6db4b3e0185f2add0d49d60e16168c2f3ea91e2cb05678f2c9d9abe232b340"
|
||||
hex"0a96b6eed42e7041c98baa152253971225378ac4cd9589c80cea28c06b570678"
|
||||
hex"2650ef83382c54ccfabafaec8096c519ab5670c7d4dea2535c64db2b7dfcb553"
|
||||
hex"1664dbfaf0f45d6ce2782683f87e6c9e9b7176f08511ac1663869adf9337eef0"
|
||||
hex"212ae8907761700bdea4b480f20f788dd08ca4126dcf4ea462e890f302634476"
|
||||
hex"0e50a74cf13a9f5c3eac33a38c6f9e8d3c2638bee309a4180afd6097c52766e4"
|
||||
hex"1377037809e690222f9afca6e1ee39ba95846bbe912379a938f6ffcb493f5cbc"
|
||||
hex"094a2af179f583a4155dc7f2b191c036df4330c0eb75e1e70d2487431bb4b51f"
|
||||
hex"2b1bc223925afd7f4f7cdd038d39183e1364d1665dcb17cfc2e30da2edbda339"
|
||||
hex"019a6052e1c5cf66ec396956467e791a97506bb3291d1a149d863d9cc25d660d"
|
||||
hex"1f709b744826f4ce03d2ae0eb2a86613bc33b2bbed5e9ac6198f7e8df1afa8b2"
|
||||
hex"10cee567471a2b01cfa286f3095713ffe5855c06f17158e33e9ebfdc1c792a88"
|
||||
hex"239ea34b3e8a5d1d26599fcf453537fb16a91f9520317a01c7de1bb5a768d725"
|
||||
hex"09b3a1bb0c0be55876c4b91957b7e86412654bf272b7b9c52f2217e9713c7dcc"
|
||||
hex"2cea70065cb1bf0b68c86a3592a5134384be8b10de004c31233b783577694dc6"
|
||||
hex"13aa1864f9d5017a46cb107be441f821a85315b79f39968d6407f343a2c61998"
|
||||
hex"0005f278bae49a9a15a54132c50388e69f4211ceddee99195f07736b502fadee"
|
||||
hex"0302a786d79c25a2be297edd39eaee413dc553146ff7d83bbbb8bc71447b6605"
|
||||
hex"2eaf36a4dae40401cfa571b55ad8b5fbced37e67860085bc6afc5412d809ce8a"
|
||||
hex"166d04b67debdf8e674bd6074bf67031d3b4c558647dc4a3c5443eba23086683"
|
||||
hex"232f97fa7f391323e066175feb3572aed60c343c3e3c11ed309c00ffa29cdd37"
|
||||
hex"08f1791a609f8714b38f03cfeeb1a149adf524a946a397191b0986869458bb8a"
|
||||
hex"20e9ad3d16db1563e84154a169db5e81d0117d4914800772d4bf624317e32b36"
|
||||
hex"17a525ede8962fdfd05af9ba5ef109bd2f5de02524454aa25c696b7c6fb0757d"
|
||||
hex"0d71a275a14cfaa4f987cf2d2552add13d13fc7141c544a0ab457103e4b2d502"
|
||||
hex"1ff842cd59778fb6c75d197511f3158ecac8fafd21db5fa652725be434580ff9"
|
||||
hex"21095e6eefdda8f7648172826e435e08a93109b1f040d88ec1b01ce3e2dfa592"
|
||||
hex"02746d05612699c335d4031f388561fa2c6b3a4c224df74140c58c5dd7391459"
|
||||
hex"182427fdf7ec0b8c5a7003e3ae6c19d8da47804a75d62ba4a1f8ce1835d7eb66"
|
||||
hex"0dcfad648630a6037241a73af244b1612eb375d852712a10182e1339d176471f"
|
||||
hex"24611b2e7aad1a1fba1f1eb3193a87a0261e98dbe77fb30944edc6ef5726acda"
|
||||
hex"2df51df9c66f51695783648873bc167bc8199afdcf98a6a39dfc14933634cc25"
|
||||
hex"00ba85a4d757b2bb24f2686c8fc2b20d23f68ecc5bbd889d70db8222f9c94eeb"
|
||||
hex"2a615fc377bd707e1d297df70f60076d184ea30144439d2a02827ccc4b74d6d5"
|
||||
hex"083ff5f9b4474040e1db95e7dd4ac08bc49f0df5e04b1601e531087a66e1a9a0"
|
||||
hex"300192ff2b9358b371328362eab85f10b3b256562986b0222f90fde6285b2031"
|
||||
hex"2b9b6d2f72c215474b76c58be1bc8113aed21efc4bfeb76d432fadd1a143ae55"
|
||||
hex"1afc92793b1e3c7bc0fff4d51b34c751d6fd4f0b684fd36a5eb31f2e7d59bd08"
|
||||
hex"27a4788df73ad8b0a3db6dd0366131faff0cf443fdbe689b1811275524fe4f5b"
|
||||
hex"26e306f7f4400a8b466a46f73b1bb30628e8f53ae183179a89ea09bcab1abe8c"
|
||||
hex"1903a292e81db108e9af23cd1c7249087803195ef86af9d7aef43f671bbe28d5"
|
||||
hex"05c92b5167e06202018a4b1c482dde448604793a2b6d734c3a59f599b457794f"
|
||||
hex"109890a7f2fcb50131c7e510faf117da23344b6e50403670b103e8b1b0fea27f"
|
||||
hex"1fb6977c76473f7a1d148b69a5526768ac7032ce91f0e138973b3e4d30745fdf"
|
||||
hex"22846c8fc4704252020b4a141726ef713f5eda605ded818ee69d101490d5a8b6"
|
||||
hex"079b1bc515838f1ad835d87623adef3b1673ca9735ab72d8fc938e206a524e58"
|
||||
hex"20d47a675b313cd4b857527f3e6ddd2b5646e5fd9f206aad5bcfaae6cb0958e6"
|
||||
hex"064e79c61f6d53a00688e7f217a0c8579ba3daf9d4df5dec16f013a124413f15"
|
||||
hex"2383c6f75c1a392e6e1375277f1130c2274d8668773addb783207cf58cf4c0b6"
|
||||
hex"0f693e2f20b43eac0691b48a00fadf42143af8e21b080d41d1e71c8a02142da7"
|
||||
hex"264fba8810c9e1c00b512aab1d355bd7ccab52089768376d8a925cf1c3f927a1"
|
||||
hex"01c6986291edd61bf9888d6bbc0d0f802bbc4186a811b8107fcf306a557f0af6"
|
||||
hex"26cdd05df967801d477b1c344754c15f7a30b0bd75bb98985a0c2fff9ec80c06"
|
||||
hex"0c5e61cdfabe2eb8188f70cac4d7b7cdeed9b964792d7dfb6fc0b228a7270e54"
|
||||
hex"2a586a34c5b50461b05614cbf3ce228c130522513793ec263f9afa96e23f4e5a"
|
||||
hex"25ccf30168e9ef4fd1cb902c95ca8d67a13580dd07994094b221708f8c7d6797"
|
||||
hex"107dfa97fd9047fae9cf80f48b206884949b324e4ab03212f3298c4818987696"
|
||||
hex"1cff7a1fcb4f40c410ceb353cb8ab907a0f6b2821dbf82766ec762967ba23944"
|
||||
hex"20b8533e0ab744d5db86e30a3e73a80bf621a2b5d8555b0fc416389d5cf53265"
|
||||
hex"0c9d9b203b72e7887fbc30ac7978146860ea4aa1ff0d96dca2c65666304cacbb"
|
||||
hex"1b84d4afa11231f3a4a3c62a0029a39f5ea31d907a92070494990427e7ca6f88"
|
||||
hex"14107581ede64e20dce54fffbc6443cec3ca1cb0054c5142187cd21bcb166b79"
|
||||
hex"16737e84151e0282876e43177c3830524e3b6ac2eab243a067de3319f8d0b8b4"
|
||||
hex"2037cd61979b667fb80288588d2b095f0c4c34312d7c75a074beda537909cfa1"
|
||||
hex"04afc04e3f13c2d80fcfa1aa6e946499406ce541ca84527b75dd29881c09e6a1"
|
||||
hex"20a42ab93cae3bb2a7ac65c4952fcafa2b58f3d3c3b292246e292dc1d10ead44"
|
||||
hex"2294e0ac633d4e59ac74082946c67653dfd3b17220d05953f214328d778d6256"
|
||||
hex"019e150e3d992f5175dd609d7b7468a978428a5bbf291b77f900d1c682cba1bf"
|
||||
hex"2c04f3db93c0870db5a439e9ff0f2ac65d19edda31f6bf64e9f827516b3f68e7"
|
||||
hex"2e6c4ce5c33d2f1d00d4c7c691e5d39dfea1c0eb590de777e5fe64365545646f"
|
||||
hex"01879179e76aed29e2392a6df0ac85ea6a285e0d3a1112e8593c23c3e33df5a2"
|
||||
hex"086975bbb71f10a74a76f43bcb0035481860c6478f23fe914df449b50e56c492"
|
||||
hex"2c6feb5c47ad32b1054c98e31df1659881f884939536961bedeff8cfbb6e1282"
|
||||
hex"0549855c647dcdf03d05c6a490d5541098d6d83bae7da0112a822e0abcece250"
|
||||
hex"20f9c4e3fcfa0d305a923e4fb0d9ef583cb141debfeb931c909ef1d4fdf6eac9"
|
||||
hex"05a3b3663e889c49eb5920e769bbfe9f9dfc905554300bb2b4285c6a5889b274"
|
||||
hex"1f9e528d112bd8a059eaa510cbd9a7458598d27775bcf6d851a0d359ebb81dec"
|
||||
hex"15608ad6b67162915e05d6af1ba4b32eb4693f775ffc0a66485c3e5617dd37e0"
|
||||
hex"1bd2e26efa4fb0a842e03142af573fa9c16623542451b3e4e0af1970cd7e2b0a"
|
||||
hex"2b417cad2430c3018499a10488fedf9e5399ce6cf93819469c802bed6386d7b9"
|
||||
hex"230d363d8bacdd978d08dfbc44f1c3bbd3b2bc1e2aabc5c3759db87f8f895eab"
|
||||
hex"2f83002ed31eaca2531766a09552eb1667a9419192ca335b08d93693e5584abc"
|
||||
hex"0feccdb53345bdae7349c42b119570c762f1f5497eaf898e4ba2d378d9d8d20d"
|
||||
hex"18d01d38cb6ac78d93961c1ecbfaadd4b0cf999b972ce4900cee9faacdf8298a"
|
||||
hex"1f31cefa55f5f930d149b63b7a33e385a688aa8a4ff3ff8d88e501dd7466b475"
|
||||
hex"1a02607dc91fd27ebb066b51f8dca8d64dec062d3f8ea6a3e2859d139c17e9f2"
|
||||
hex"25bce5f60cf5c72fe58b511983c067ecab88071786feb4f6cf83e1b5ac35878e"
|
||||
hex"199ea7d2467ea66b53853f7ba20a91bb44a4a5f621404375051cbac31997a366"
|
||||
hex"1641e4ce35beb44e3d00fd9b7a3bd47e118fcb21c62281b148dfe4097c147e11"
|
||||
hex"227cf6075dbc7987ebce58711ed50e2b6a94c1478db414a834345cb2b5c21cb5"
|
||||
hex"252bdf93e4bc24d639e1ebd80550001fa9aa1e7d6abcba326c2b2feade8fd8d9"
|
||||
hex"073103523d7b0ce327314d3474aa6b77824a75862d0cbaa5af6e1d2cead16b9f"
|
||||
hex"050f7090cc1ece4b5217a0419fe3066d81ea2e19dc6c5410c770740c16875066"
|
||||
hex"2a4801a2483187073a17cd04890165ff19b24180cc8ed16870cfe0f2ccd82183"
|
||||
hex"24e27258b0e61cf13892a8b7abb13e0cc19faff40bbdd680a389f4918f63d9e2"
|
||||
hex"0f03cbd30fb82d7807479517b4e29b3da4950b96a023a331e52c721c66f5e229"
|
||||
hex"2bb6d910684eb13c86f172f66f59a093f8a002333c8767bd594ceb63e9c6a2c4"
|
||||
hex"1f32b4847858f72bc734df639c032604ae71ff65afbbdcf42acc7ec195f3a39c"
|
||||
hex"2a0f1adf6230de3995bce023cdfc6af1e85d9121f84de4a34b9c7fc4ff920c76"
|
||||
hex"17fa977e81dac861e637d8d9e4636487afa55618f35f7455af8321f8d6d50d6e"
|
||||
hex"09f9221e154ad381a5b58d1c8771be1f47f3aae8a9769151cd84c1434fabcb9b"
|
||||
hex"0ea204dbfbd3e404128c8252d607169ef5305bb12a59e44ac4be9147055a6f20"
|
||||
hex"0d2547a25e17e027bda4423048f3c6c595d6f83124767da34e0e4b96c26f5c94"
|
||||
hex"0cbd5f2d0cea7678b80aeed4b0de78259c86a2c207dc0f28fcbe22a1252e5d3c"
|
||||
hex"1a9b6c59c30e6d1e3c5efae27acc27e9b7bd23af3dd7963a0aa8361b4df2f243"
|
||||
hex"0cc761b549af62069ba3e0fa7ce6c75c9f6defed91e8f3314c4b1ed7a5e0c83c"
|
||||
hex"30264e78dcb1adb0d7503f80507ed4bf90271624d70dfca454d1990a2f755988"
|
||||
hex"28d55e9071501cbb4ae790279f996622466c1c9f131d667e8baf7bdbd5d9a455"
|
||||
hex"11ff42ce9d42c89d7687d469625b18c59b883833298af76480817907af2294a7"
|
||||
hex"04645153c868372f37d106c5c4bfba4e2f73309d53390894a6b2338810da3f0d"
|
||||
hex"103e33717f00caddc108323574de85c6887720561ad0c9946bc510bd3954ad4d"
|
||||
hex"264461fb0d2dea03b815969e1b2bbeb995d30f774fa49411323d20ea4f4f1652"
|
||||
hex"161a104ad60c9b35ef38783a9f951bd969e107846affc11754708b694168ab99"
|
||||
hex"22ae691abdea5ac8f12f90a1a147b5ac63088f4c3de32e81d38e79a93612d9f9"
|
||||
hex"1286d17dc13dcabf49975e2a37743d997ebc56d11b71c2e430890eb9fb7c7d3b"
|
||||
hex"1411153db07129358c9ebfd849d1a12de7ff39ec458b616a3e6885bee7114f7a"
|
||||
hex"0a98b996681afa7f3a7ea25fc6d9f2b48af7c5d8c8db0d55892bb64461752f93"
|
||||
hex"2838a60cc9aa8717f4308e6074996b7b71f077a1fd9d8353af5c086aebed16b7"
|
||||
hex"0ca941047448572c947a8308b479f74524a74c384d926e4be36e8068bc635df6"
|
||||
hex"10b06f989dfd1d445b6c4bbc386c1915d9c6775df42fd040826a8a95deb11561"
|
||||
hex"234bc8dba2ee31ad5b1dddb6946dbf1f2d9a2f7d71bbb45d94d7f9ff47afe936"
|
||||
hex"03b28511d097183cceb1250dd00dd4501789b25bb547cfe66eed09bec1871c59"
|
||||
hex"2d06d2e4acc30f60e54c1bec9442b8aa70137c37b798d2dd8dbeeea514f7907b"
|
||||
hex"08037905d11e86a5a9d3b03cbe3094e9468d3fb3c1a20738c08877269a69147e"
|
||||
hex"1f79d21604dcfb2ca75a44e38aa87cf8f3f56f639c8501d336f2e72a87486695"
|
||||
hex"20898e9f4eab7b0f918e10b9fc35a024f4d0578c0e46463cbf360606fa47ade4"
|
||||
hex"09b99372d699342f4c7e3c807a133ee3be1c92422cf2f0e5492136e815061041"
|
||||
hex"142ad77d8e80c9a778bc04e8a62e550908c55974693603d8670bf9205553bf7f"
|
||||
hex"22f3a31aa3f9f3c040048df27710a8e485049abfabb71b51cbbd87126e83cf24"
|
||||
hex"03459743b0ca82a0801415ea160bad9d326888db19ea8b86bbcfacb48ac3c412"
|
||||
hex"0491b8939d07f0074c444ee02f79917f5ded067d7e0529b0437b71fe6355170e"
|
||||
hex"2bcf73774c5976acfbc99b1116384b11930bca6187dac5e662bb9250487f0845"
|
||||
hex"244615cb6c1b8f74aad86d9f900ceff74ee731a9dffebc26096a1e6a772680f7"
|
||||
hex"23a077e52b600cefbef77eb273ea0d5d2d7b18099b4832772b56c6e822df0794"
|
||||
hex"227f9d7399bc220483caa969a8892901b894de900a1a20da29328343ce7cea1a"
|
||||
hex"1679302001981320168e8d8e921756f2ec22d21fd130d719eceaae1b19354bae"
|
||||
hex"118d5af95d648cf620249c405d77c7743089d9d262e29860cab3c292def4ffe4"
|
||||
hex"2284c84a005818061688fe45ff37d6fa24b4f99587fc5e9a1208b3edf4d060d0"
|
||||
hex"0cfc0f918b739604150598b74b981255a70d772a67f23f51c34212958b45a035"
|
||||
hex"2537c964c421601b62787e6eb7307b99a9d6eefd0286f927fb25f22e7e9eaf95"
|
||||
hex"1e30310e4606c228e2f5c3df3eea02457bb4777af8546fb61bb1434221d99884"
|
||||
hex"0f5caab9c8ada0b5a094dd9129eea5421c1320ae7a666b56c960be0dd4c1eddc"
|
||||
hex"1dd1def16e2a0ffc68a449be9d160b00ca35599e7ad7cd1afdae000cbc76dea8"
|
||||
hex"2ae0eb79a34fa9a3c73bd9f1eca8731aea913ca7d138958a32c09c1c521df6a2"
|
||||
hex"28ff689e68fdc639c190119604c98a1845806a317af901568ec8dc47593915f1"
|
||||
hex"1bd5a5860f93500e39351520da5f095ec6557f54e0d5628fe9cf1a20d52c426c"
|
||||
hex"021f0968bcefd07ac634d7e6e02d45eb6afa85d28b307f5d2e3f2cd6d744fb44"
|
||||
hex"1c0c5c153df6045c88bdc5d09dfc813cf8546d7344c70d194fcfd29f92f4b696"
|
||||
hex"1ca6c68abb475da1475efc1300855db5fd7374a5b92b4f90f49952a05aaf92ca"
|
||||
hex"2bda409f3445270ea3a6d128b46a5cd5cb245b5339a66fdf814f2b83f4c123d3"
|
||||
hex"05a71c398107a0314772fcd210e0c1d3ea35d99444a378e1213a9e10e6768daf"
|
||||
hex"11fdba29cb4c24bb0e770eb1d4e5c23d9a51a3cc86c7d41b35312fc5c943f965"
|
||||
hex"05f0e7da79e615a61755ed4526892b42ce1e80b5b027537bf53f0b536d4bbc0b"
|
||||
hex"1eb2f81535a276e50897a2baf3bbfd981468b91fccfbec6cec8bdc988f002350"
|
||||
hex"15d6ce1db45302f8e286e96e26e4f64ef5534ab8a55a9ffe215f896d7ae7bffd"
|
||||
hex"1315122998316a3bb389bfa1146d940d7e2718edb570f12cdcc57377f8ca2378"
|
||||
hex"023f10e9f89b3f0a2c44497c8a7b705786220397dce0083335027a9ce9839f60"
|
||||
hex"234a05bd730e143866824a0e9b7672adaa64b679dfdd86c8e54fb2df83438c20"
|
||||
hex"2d23c1a987db7a304a2d504e5c4573592c119fcda1ccfe5a07d5643c4a9c0633"
|
||||
hex"029b04e14de53677bf90dc7badde802e588fdca2b9081ba20f4712e662c12adb"
|
||||
hex"263f5e4fd893704c5f229914cd8f37bdc3f9409e617507850604f2f59d390fe6"
|
||||
hex"21c9780ceccc597c37b49b8742654a6d34f71cb32d1555e72c06004d06f6f5b2"
|
||||
hex"011c1683c09a02f63b38549eb958115f326fdc2bf0aa81247acfb1cc8554493f"
|
||||
hex"26430030fb83d387a990d785f38ef4669b2fc53ff8ebc2537009c8648232996f"
|
||||
hex"1247fe42d335f9252cf1f570316ae986b553044b0c81e635f764ab9915e11294"
|
||||
hex"1386af604cbb138efe8dda480060758e274bdf502d2bcf9b5210e31798b08adc"
|
||||
hex"06adec496d6a730820969cfbf60ab07a2a8f7cfcfcf2020d4cac60d127fefafe"
|
||||
hex"06c39f25af1748848c37d1eabbd6a84a9a735afce06a5922e8a80af1bfc7eb5f"
|
||||
hex"213dbb816f4ac87aa15aef8541b1abe3fb4d11d8b0b082989a0fff41ad9bdb2c"
|
||||
hex"1e41cbe348a7f3d5e2408d19b26817183d1f6d3b51f27a915274efd9598ff18a"
|
||||
hex"1568510b7bb366f4387eea8fd2b20fdd95fb6a612958b5c25262c32ab3eed75c"
|
||||
hex"08521336bddf41556b79cee9b90b0c1cb4d36245c25a7f8b248567fb4248313d"
|
||||
hex"2d0893b893b14eaf3aed6820ae987b88da0cba5dad3c5b267c9012405514767b"
|
||||
hex"01540a25e982ae7e1c98d06b14cc56241ab9b09543440957bfbeb9c384a74b65"
|
||||
hex"1744fc2b7ca4e19a45031fc838edb3805964d6533a4a5583ac57d9a9f6e6da65"
|
||||
hex"1230a42b5aa82168743e9817923ea3ebd1d3a55ef1bd91a89eacc55663a02640"
|
||||
hex"1673e455967762f96f57b413424631198e09e7bb1bb06844068fe44f307a8d59"
|
||||
hex"061d9c5b1f377adc54722ccaf3601332ebc07660fec4d89b5c8213031f0aa8b7"
|
||||
hex"2e92f89b6bd8472ef679fa5d617805180e6e0605423cac37fc15f281939770a7"
|
||||
hex"2d3c9778d5cb3ab0bfe4b296e2ed90ed19619b8b353c1043b40e03b568a049a4"
|
||||
hex"17276cb455cc5d461db37b0b4f6b34f1bb429a76968726205617095e1d39b92d"
|
||||
hex"09dae1c6d2e4114c5439c81baa28594cc0ab76e7f32c25c4f780c9e9d6e46a5a"
|
||||
hex"0a23d3bedfe1b14bff3eec36492bb9329f56ddbf7f5e1f122838e96dcfe98c46"
|
||||
hex"13a1149cf273a308c777146d7f4be2160aac12980d97661fad18cf682b7c5e24"
|
||||
hex"2b74aaa132494d280ca444d5d2a99cd2bd426ff82d443e2b44b8441733bd450d"
|
||||
hex"29b8403a3843d4a77b6c70539d8965e57af369d6f32feab13450f3fa985aed18"
|
||||
hex"142569f4ef08c2a1947dcb6e99b5ac52cdd5876c50f02bd6afd62fc810a75511"
|
||||
hex"0f47bd52a43c690f658374e9f7c2bc4285c641c7116a4ccd2c94f684cbeb7f2a"
|
||||
hex"17a29f16b646ebe94c4b2e2c4bc375cd7b002111dd55c4d212e9360cec88c188"
|
||||
hex"10416d05ee2eed34165a50f6648eb3e10f77247f711398a14fc77bd5711fc0fa"
|
||||
hex"046641ee77bf1c3c58b848252da5a88038a20ab22b0723c37de4753f40a110b4"
|
||||
hex"04c68b3d094b4cc491c55531f7ba1bbae0b554816f0c8bc3099061c83099f6fe"
|
||||
hex"0e3661a824f5e440eaf439395c1047754ec3e22f44a0f81d73a4dae283cbdf1a"
|
||||
hex"0f7226bcc9aed34857296ce6dd82b82f1d086ac24d3b9e51ec3c767a89e0e0d1"
|
||||
hex"0fdee6a4513d6ec8f9e2d416c8b87b0c1deaf66702ef14b11f42f9754ae688c2"
|
||||
hex"20151e7e27c0331111bf9346db0f4a36d000ac49d03c561a45e23383a0b61d27"
|
||||
hex"17cf331edb43a227be4cc3ae2dd0999e07593a95e62cb170d4e11787ca9032a4"
|
||||
hex"11b76e488a5eb5703a63e3c43341cd111141c3353d6c634422e63a8ee3a948e6"
|
||||
hex"2aaa17be5319a2c4b81597c87a78dd744742127d8f4c942e30a6884a7c40c05a"
|
||||
hex"1ceb38f341d5107f31308f3985d72707ee4cc450aeb79b3122d18ab3a811ca32"
|
||||
hex"26dbf8986be11183f7bd4bcfc17db4b68fe9a92cc4921fe17aa0352f57787186"
|
||||
hex"01a871c9a11ac0eac37adf26c0e380d9e4d4d4c1441bcd52438332f3ec1bce2c"
|
||||
hex"1dbda7ce884258ecbf26f6e40029d770ebbe895ac8ce51007d38939c48cf3ed3"
|
||||
hex"07109ce5258042b89a7e1969e498b5039080ea3912e326b5ed2cb2c484f1c873"
|
||||
hex"2aad746945530cbb6595e6f4038d89e1e0c0f978532ec02e5e12bc9115174a69"
|
||||
hex"01576cfa7df9b87f6b6685eaebb7ab84d90e036f352b9a3f32edc2d8fad897f6"
|
||||
hex"0a7ed0f5907aa3135577a8bd38c02250ce339b3e500000a8c0bc4dbcb58fae3e"
|
||||
hex"14b8a5528c397ee0565c1d305c4679583c7a2273a4263fd7c0e4c0c3cd1593d7"
|
||||
hex"0f1645829fddd22d3b28fe608eba622b2dd67dc8282192da3762413ba678ab7f"
|
||||
hex"0908dffa0610ac0133c5f7bdfe3469934c78bcb4177d2c1fc618bbac6c2ede6a"
|
||||
hex"05c83ee4f9ca0f735c449b31ebaf60e184880a7ce6053dbe5c6abf673b02bc22"
|
||||
hex"13ecf7b788d4fab17371a424493bb49447855cfb413af131de52bd75a50b706d"
|
||||
hex"0602afc4587fbcbe9da6daf807c3efc632bb8fbc8a3ccadaf73b827542745fa8"
|
||||
hex"28bd99e6ae097936294db584bb7eefa8dd7b63144064f7114041a88e69d6e9c6"
|
||||
hex"053751ef135a8f6549527e22bfc0580a02a7dd72e9eb6b6a6e73b3f6ec269025"
|
||||
hex"1c32a5e4b55b022f9cc73fd585424afedcd1ffbf7e46d2a8e3a86b52a937a629"
|
||||
hex"1abff8ffde1de3add8b76c0a6f372e2b921d601c5f3128e5851706eb60ae7b28"
|
||||
hex"152769798bc48f6622fdc54ec7efbe576bc6b263ade79359db0db98ee57d465d"
|
||||
hex"202fc4613d2f1988d409fce47fb6bf1adba6a9e18b97aae41f82dad5632fdb9f"
|
||||
hex"1c9d65765d702a6d24efe251836e629ffc2881d0c218e89cc6467cacec7b1cf7"
|
||||
hex"0b0cb3219a1c4f34ef384b4b972c7b045c4b931fd84b41ad619836b6d30b00cd"
|
||||
hex"2d79b8879e27e7000430adcd96d6f7c67fcf386a473752668e64c09b2f8010a3"
|
||||
hex"0475cfbf8a76a0346f7df43a3eba83f47f139060103130b1a484e7814623d854"
|
||||
hex"13be6b6d4ca7746460f0466a5068d54dc9378ec2e46cda7d08deb8a254260e27"
|
||||
hex"01edcd7cedeaae1c11de85b2fd1e5dab42fa36e547682937ff684364921b513f"
|
||||
hex"1f570a240fd09cbc6fdd1ffb9183668427b376483f723438dee5cc5a6eb961a1"
|
||||
hex"2eadf23a07b9fefd2e17ee0d74db1ef80caa7745b9c9f7685fec9b02e5ebb13b"
|
||||
hex"2f668953cf91fefe0b441ff07a2f2938f468bc7efd380bef43a030e5fdc41a71"
|
||||
hex"118eac608ef4b794efe03a23dd034f13156c02f2762e6e8772b11c7dcf8ddff3"
|
||||
hex"2b942a6404366c746c10e3065f1f7932e240446c85c3f8ee5aab85b7727506fb"
|
||||
hex"03f113eb05dac7306c758fb6565545232934cfe1a99a5fc63945a4b6d1a652d0"
|
||||
hex"2a6d353d3bafac324754fe1a00d57e7f020dbea17231f87d83307bf940e6d676"
|
||||
hex"1e7913c116465bfcf367aa331571c24cced6a4992e39ea9c482fc56383625971"
|
||||
hex"19111380fafd9f08783dd2497d64685aabb25f5acb60204fd378e0fb0e6da0da"
|
||||
hex"22b45e152cd7c40740eefe2d3fec07ea31872401ecbdb762cace9e92e7cbe34e"
|
||||
hex"1192d39b9a603bba160da80fda0469b41c2255ac4d0a46402a2844225ffd2539"
|
||||
hex"2f46658280ce7b17e40eefb529673a2b3d8f6e25757e9a445e44c7a7149bece4"
|
||||
hex"01de74823933559559239322e9363220d322cea2ddba2f6d5610fe883885986d"
|
||||
hex"15c53cfddb0f8bccedaee3a4492f2ac1be55d6f0b2f1e7af5f4caff10177904f"
|
||||
hex"2ba1a14949b45d15d45e07b4b3c206ed751f86b5f37d70a24a4d8a7dc389aaf7"
|
||||
hex"1839769f1f11e18063e3bc10c490bc546d8b35242a93ec4d6b61cacee4f1d4b0"
|
||||
hex"1800f7c3137ebc9ac731f7b4d6375c01a874f29000c1b3f4727b65c77a2d5105"
|
||||
hex"1bfcdece5c62826292caa2da6ec16b9974d2eb7fd3c2c20d1863db12ef1440be"
|
||||
hex"09c696e6067fa41ad890ee8388c0290186e494cbc202e7667d19b56353cece99"
|
||||
hex"092b1d93eed7d26456f285906aa196059ebbbc157fbde72b8acab6be8efce28d"
|
||||
hex"2fafe0589f5c826f419b1ec3ac176a42c52360e7b3edf90cd4c77c915e47ef06"
|
||||
hex"282d48bd742d9e20a5b8dc88aba0744a9124930cc1cc7d692decc7f0ee8a86d5"
|
||||
hex"06f42f74816d65e974086055ade94ff76a6fe5d14bd64a069b89b867989d12c8"
|
||||
hex"15b575413874cb060adc4fbde9da6215b08bd3c72b9f817bd4e227b818f70235"
|
||||
hex"225265caca14dccb262c43230defa44d79efbf96195b8852817b9c2a1a0cee7b"
|
||||
hex"065a720651f4d30a03b23445d588a657ec81881b38a6ca7c96ae7d30a228eda7"
|
||||
hex"2f8f278929640191de8b4c95a163f7b35d9fc5f38dd11499e2f3f0484fee4d4e"
|
||||
hex"2e67e80ed738c79c531bb034d0e3f7703ae1cd93d0334f8cce0e6fd7bbeeb9cd"
|
||||
hex"1a4ba16824f4df329914baf49fe4ae2e518d85cd88bc2a4d7511486305611aa9"
|
||||
hex"01d1333f199a38fc9c772c5b6dde72d9d9ef90dbe2a7ff20cb9685c2b30ef80c"
|
||||
hex"066995da220811544bd79b867d6a45c5f9d5f81246ee7bd867bae77ce1f1a5fd"
|
||||
hex"1347a12ac6258ea35211b6ba1a86831915843d88896e58f458f0d5765917c35e"
|
||||
hex"035fed90d06219d345c5ec7d3a0ae95883cede928acb380f8ef8b4b6859ef965"
|
||||
hex"2abcbb767e6e79b2dd22e5978eed3edd65fc15f583b875d14e2dc2f2a0d8543c"
|
||||
hex"2991e9e9d1214bf2bc8020c1c18d861b8fb8829af660a7dfd350321256775ca6"
|
||||
hex"13561a0b30e623640fa05d8a5f9540530ec9270d46c5f6607690c93e6e82655d"
|
||||
hex"295a4d3659bd1a055dd3f4bb626752a2d06759cdbbcd1bc79b83086649d106e5"
|
||||
hex"0ff647b8fb279b8ec301487a755b63b15410d9583977381e2060e794dde87459"
|
||||
hex"217e540739dd851a21e60d671a6dba94845f42487c32ec098a9c4c0c19819843"
|
||||
hex"1b389bd1a4d6c9f88d6fbb6beb8c25a7f86151da3048fb29ce506076f3b73397"
|
||||
hex"01f60ddbcde529f2adcdebd2bf02940c1a9a378e0488c29a0ac38a17a9118bc5"
|
||||
hex"165cea4c3361c2b7edc485fb90f788d1b4ecf249b38701ce1ef0472003d9dba7"
|
||||
hex"0bcbbc1e5599b61380fae8aa7c48f7dc2c543713ffc9a72a801e1a77f9f37c81"
|
||||
hex"0cf8a31e0bb5eb4cdb46f2fc5fca97133ad03ab9cf53883b270a01260c7c534a"
|
||||
hex"0e20cd40e05e747fb3bdc07b3cfc50b3ceac18f059ef4f65565f447208335fb8"
|
||||
hex"28df7cb07583a984136302cd3baf3b3d9f9177ef97f584b0daab7f0493d25773"
|
||||
hex"26d35e5c2e4f1092a1339918cbdbfcb5b1dda82c318103401d4a9e8fc3218159"
|
||||
hex"09daf60bcb32e37020e105d8b9bc3aa31900cd3459046ab97eb228675846b691"
|
||||
hex"268db848b42be0e8d96f73d79c16df5175b29d4c3e0351a24ee103d2cfe7c283"
|
||||
hex"1e4edc4d7bb561c29aafc6662191bcae8aebd4d5113e331b9b537f4fa8598905"
|
||||
hex"2d3c39a939554f2b9e6230e96a78c24be4d942154f765e6d4af53a8c4db9407a"
|
||||
hex"188b721b564daf9ebf33a146bccea52cbbcdcbfb50740e921f91f7e5672e5e7c"
|
||||
hex"2e59d3453f983dff90e45f917cd74501a646319fd22c952f3152b077d5655840"
|
||||
hex"1f0bf595db464070ab32553b095f4421524c20568df7ac803a3d299b3dab568d"
|
||||
hex"0b68d795eb7b68b11c333b381a2838bd9398fe371f08d48f2ded24e60e02654f"
|
||||
hex"18b33a4cd6eeb86b9fafe856f33753ca1cc6756dc4f843e03039dfde879a76b7"
|
||||
hex"15e0ee169afa10d37a8062aece61391764ffc6d4dc6ddcb56f35880bb13c7056"
|
||||
hex"25c616a97b05678348ce1d52718bb1d8521cff5a3d2ce5b37f7c190dc4786228"
|
||||
hex"26a0882f49d8c0fd3be124ef75a7a107778ff66b5be2b66c0b64c2084809ede3"
|
||||
hex"070dbc7e5de51ff90466ae52b47a293b4cff6f0cb064b6dde4e00650a68b1541"
|
||||
hex"29426faa9a237e4bf88eb59b094786cf49a96fdc54cf6c819e1b67e2b0d68707"
|
||||
hex"0f1bd148d0b2faf46659e6db194bfdd5d037aea060737952bc30026f8547737d"
|
||||
hex"1d861f4c7a0c0e5c99cd91e2869215dbde6c4fffe1ad1d8744f257aba5b503cb"
|
||||
hex"004ace6be69932572926930019040107ca38207eca80735d5de083cd596395ee"
|
||||
hex"154d83576e1821b8ecb4f1931ad7721cce29bc17fc237974322e248ada7c23f9"
|
||||
hex"2fe852eba0f03f71cdfc34e6193561d3423087aaac643a9edfe25fa2d7f3263c"
|
||||
hex"0ada5d6553e357275b59357fc2213e1faf714a22eee3d5d3d502838fcde32e54"
|
||||
hex"2e73f204baf6916a3af968db423019f558a87c104c514bd8f164d03d3deba7e8"
|
||||
hex"1d29d896aae409cad919a995cc8717b7a078c623bd3af80c056dc1716d043539"
|
||||
hex"03644e9c312415bd756683697eb1ba4fea32c710d0f0129ae756984b52611993"
|
||||
hex"255a0912167ac123d1a2c9b10380a309d7f3b067b628e9da5085d98b90b0cd85"
|
||||
hex"2d54cf1e2971b4c37d511fbd55ca08e2b56ee7fb91386192555f1757dde45860"
|
||||
hex"1ce287c5e5b611ff5fb58751b3eb8335a8b5cde2fd2873522cea0e9bf6f5c556"
|
||||
hex"0ca0091a58ee20042ac02237bf01843886e4439d859a785362913c0cead1e469"
|
||||
hex"1f47e5ac7ec132d0c7136a9487fb0c6cf292b07e5515eb2ae942d4aaef2dfc7f"
|
||||
hex"29b08f57557514cdeac066d9eea594a5c5388e8f1064dcf19fe4be16d57b0d41"
|
||||
hex"0f27f0132545e917cc90595e93c252a720b8d24b70bcfa0de03a6d3f5d50ef84"
|
||||
hex"0404810250839299f6b794c6e9f00432b60d7ca2dc6d754029cfac5b964f09aa"
|
||||
hex"0aca49db30da75f002bfb2ee498ac70a5b0f98245a1c2ee6da8c0dd3c59c0207"
|
||||
hex"30231cd053a7783a3ab43400f056f622b99507f09e1e16377e2d02c0c39faae9"
|
||||
hex"164f1b6eb4908f591b45bc4d4385a161cf46bc1b287369a5eecdfcfd140b62e0"
|
||||
hex"188576c886eecbe7191a7406798f0fb4bfa0c7182c135ef595ef570294f7aec7"
|
||||
hex"1396e7b28ab67accf1c37de37ebc942bed502f53651a61fc62a1dcfc29d1ce5e"
|
||||
hex"11aa2dd7e1659029917e203cc816abc533dca943664bfe41e3d298abf64dc30d"
|
||||
hex"0bd1ec3ca032b7d27b8bf71a2e76ccd0c4a313642b6aad073167b8b133ce7679"
|
||||
hex"0a7414fcd29c4f31df7e37573a174b7c889dd737f94b684a8b25d89723558978"
|
||||
hex"02e3d9093c471054ebfe17ab81c9b7c3ba9691693fe99c34802330498b1ed8fd"
|
||||
hex"2602a9d7085929301c5121009e4b9187a06c767ef9aceab2202d20926e03c1ef"
|
||||
hex"01e3862f91f2e868c1e148e0f7dc7297989c352cd6e56879888e7e21c0948f52"
|
||||
hex"29075542292ff5d8f4d6bf02b27e289f82bc3934ec7bcf5d4ce5d7aa9dbf2f5f"
|
||||
hex"11ea16238aa5d188eba8553b6ea4af29ca37201f1b9c9bf7ba44f78264aadabd"
|
||||
hex"0504068c9c7063a776872824e1ab4b34178621279772ca089c5ba6d7d4c0d4f5"
|
||||
hex"097cd8eccb72c01dc41c17197a0f4216ca4a0d3a476df762e4b3d4f87c8ff926"
|
||||
hex"2ce6d1e2f8c9185bd860b2b021b44db3713b420599d990195f8fe82dfaca2fc9"
|
||||
hex"305bc541a04645fb6f733b27d7950a233599ced31ad97e8d3297094dba4abd6f"
|
||||
hex"295be8a9589ac33d6f04a426390f6e6cd70aec289a6d1ef3264c887280ad42a8"
|
||||
hex"103c52bb2708e2a6917efb3fd9145bd1729c2c9fa67f01aba05ab47c56441cdf"
|
||||
hex"0816a0b76cabc81cc9f6bae4de63668f12ae669284b5aeca54be6780354b726e"
|
||||
hex"0a7bff238cb5cb4c216fcf0f507f40d3679c0acbaef83dd4b5b0db2a9e52c3a6"
|
||||
hex"048f17c79c4a7abafdff1d3f955b5da5e0816d44f817b705f484c771f1bac294"
|
||||
hex"28973b30874c1236177adc709f0a6b2d32745835162f5ed9ce69f36f156031e4"
|
||||
hex"0b2e26c32addc2ceb297648d3fc271a548b9bf788bff4b2023cab820c4a4ee8f"
|
||||
hex"201bbb92dcd070b78863668016c24160c2c053dadb24001af4042a1e51246033"
|
||||
hex"07507505dd11a39d879137103f9972ad0f6d79ea24cc16610e1c9dd1984cda87"
|
||||
hex"1f891703a5676db0633371eca0abacf30d3f4313fc807fbd98d613bef1b3854b"
|
||||
hex"16cbd386e41f6c4a173a1312f68148cbb308289a209c213fa51dbc31874fe1ee"
|
||||
hex"1e5c8047a5c0c014f7000ea5d3ca333306adef5755efff735059bc055bed75d7"
|
||||
hex"1fbb39800b056717d62e76315c4d3e05185e7ee2ece00adefba77bd5b1f4d7bb"
|
||||
hex"23fde2d94ad2036e9a94304bc121f6c1845a1327d89a6f55bb9ca81eb91e07cd"
|
||||
hex"0f43871c3ac1f1e37bd2755613ed7b3a3ec11a3eb8fff749ab22f92446f62f85"
|
||||
hex"152339e3e373c4e4ad9b657f5e665676790ca0bf8e005767aedd4269d107d4f1"
|
||||
hex"1e6b4bc7a2e4217c1c3cc2e298e450d010fd622c47e2cd7880e64b2e6b2e6fdf"
|
||||
hex"28958ca1ae65967871544bd1afd71c06b4b39318d5a076091a1266627ad1b40f"
|
||||
hex"0ceb66234377758d63f8c56e66c0af644ead06b4e987bde957467e75938f1404"
|
||||
hex"0e31fe264d2cc1f55a3fce3ce86a68196d2a06336102c14d0cc892fc871d6f42"
|
||||
hex"19b29228092e58a02047d8debf48ba1442ea38aceb82605e8bfa7460c49af496"
|
||||
hex"0e0528ae6d904bb6c6379fef10cb1d1bc6e867054acf978041ce99becefb2193"
|
||||
hex"22efa15c26a14170452119318cb1073b15b978fd05c40a5001560edf21df4aac"
|
||||
hex"2aeea52c33986c164976c52dfb73b8524b9e12650cc2e6614eb1efd1d3134f58"
|
||||
hex"25ca08820ba2a38dcd2561640ae9935ef47b5da8a801641a7066f7dbc52ff365"
|
||||
hex"1d8489971cf0f77a525cae847acd5056502177b00ca5b72b3f0fb32e0bb85bb8"
|
||||
hex"16d389fa12477aa6c862499500c516228cd9ae7c652c3f61f641b6590b800671"
|
||||
hex"16569eaf77c8ec57e85b52ee30cd6212133a17ca3a4e87bcfd7507598616214d"
|
||||
hex"0e2b188f173ee86cce1a411c0d2ff80e1ead326474358dbf412f8e540c01aa91"
|
||||
hex"173f752e069ecc268a7427e0935db3acd27fb7bc097e2b2c58d5a6acdd1fb4c1"
|
||||
hex"0ef703b9687c4c6f9deddc9c9d3ef5ba1d9a87529d0a7387bc569c6c642913c4"
|
||||
hex"25fa7538cb83e2a689d5caeac55b325d3597547ef6c8dc122a2a6d000c344eec"
|
||||
hex"023e56786b482a73477d0fd36701f0eddd08298e43913144c3f7b879d0988761"
|
||||
hex"2efec260abd0d45688e61558f0288cbddd8b5774e48466f164d5e522b5441314"
|
||||
hex"14d6f2fe1a75dc3f898674bca43b786b3eebb0e2ac53ea6336d2d0496f23399c"
|
||||
hex"133eef87007a5128b3f86d3ff94bdd1a0143b28d4b72e7b02b2022147764b03a"
|
||||
hex"20a11d5fb29aa2ab37f2917d0b42ef10170b5f8614bc6e4decda4186dfafba37";
|
||||
|
||||
function getPts(uint256 merkleTreeDepth) internal pure returns (uint256[SET_SIZE] memory pts) {
|
||||
bytes memory ptBytes = VK_POINT_BYTES;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//SPDX-License-Identifier: MIT
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
/// @title Semaphore contract interface.
|
||||
interface ISemaphore {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//SPDX-License-Identifier: MIT
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
/// @title SemaphoreGroups contract interface.
|
||||
interface ISemaphoreGroups {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//SPDX-License-Identifier: MIT
|
||||
pragma solidity >=0.8.23 <=0.8.28;
|
||||
pragma solidity >=0.8.23 <0.9.0;
|
||||
|
||||
/// @title SemaphoreVerifier contract interface.
|
||||
interface ISemaphoreVerifier {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/contracts",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/core",
|
||||
"version": "4.9.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.9.1",
|
||||
"@semaphore-protocol/identity": "4.9.1",
|
||||
"@semaphore-protocol/proof": "4.9.1"
|
||||
"@semaphore-protocol/group": "4.14.0",
|
||||
"@semaphore-protocol/identity": "4.14.0",
|
||||
"@semaphore-protocol/proof": "4.14.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
```
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/data",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"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.1",
|
||||
"@semaphore-protocol/utils": "4.14.0",
|
||||
"@zk-kit/utils": "1.3.0",
|
||||
"axios": "1.6.6",
|
||||
"ethers": "6.13.4"
|
||||
"ethers": "6.13.4",
|
||||
"viem": "2.23.7"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.5.0`
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Chain, PublicClient, 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,12 @@ 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
|
||||
publicClient?: PublicClient
|
||||
}
|
||||
|
||||
397
packages/data/src/viem.ts
Normal file
@@ -0,0 +1,397 @@
|
||||
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.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`)
|
||||
}
|
||||
|
||||
let transport: Transport
|
||||
if (options.transport) {
|
||||
transport = options.transport
|
||||
} else if (!networkOrEthereumURL.startsWith("http")) {
|
||||
transport = http()
|
||||
} else {
|
||||
transport = http(networkOrEthereumURL)
|
||||
}
|
||||
|
||||
this._network = networkOrEthereumURL
|
||||
this._options = options
|
||||
|
||||
// Create the public client
|
||||
this._client =
|
||||
options.publicClient ??
|
||||
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)
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
108
packages/data/tests/getEvents.test.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
import { Contract, EventLog } from "ethers/contract"
|
||||
import getEvents from "../src/getEvents"
|
||||
|
||||
jest.mock("ethers/contract", () => ({
|
||||
__esModule: true,
|
||||
Contract: jest.fn(),
|
||||
EventLog: jest.fn()
|
||||
}))
|
||||
|
||||
describe("getEvents", () => {
|
||||
let mockContract: jest.Mocked<Contract>
|
||||
|
||||
beforeEach(() => {
|
||||
mockContract = {
|
||||
filters: {
|
||||
TestEvent: jest.fn()
|
||||
},
|
||||
queryFilter: jest.fn()
|
||||
} as any
|
||||
})
|
||||
|
||||
describe("# getEvents", () => {
|
||||
it("should fetch events with basic parameters", async () => {
|
||||
const mockEvents = [
|
||||
{
|
||||
args: ["arg1", "arg2"],
|
||||
blockNumber: 123
|
||||
},
|
||||
{
|
||||
args: ["arg3", "arg4"],
|
||||
blockNumber: 124
|
||||
}
|
||||
] as EventLog[]
|
||||
|
||||
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
|
||||
|
||||
const result = await getEvents(mockContract, "TestEvent")
|
||||
|
||||
expect(mockContract.filters.TestEvent).toHaveBeenCalled()
|
||||
expect(mockContract.queryFilter).toHaveBeenCalled()
|
||||
expect(result).toEqual([
|
||||
["arg1", "arg2", 123],
|
||||
["arg3", "arg4", 124]
|
||||
])
|
||||
})
|
||||
|
||||
it("should handle filter arguments", async () => {
|
||||
const filterArgs = ["arg1", "arg2"]
|
||||
const mockEvents = [
|
||||
{
|
||||
args: ["arg1", "arg2"],
|
||||
blockNumber: 123
|
||||
}
|
||||
] as EventLog[]
|
||||
|
||||
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
|
||||
|
||||
await getEvents(mockContract, "TestEvent", filterArgs)
|
||||
|
||||
expect(mockContract.filters.TestEvent).toHaveBeenCalledWith(...filterArgs)
|
||||
})
|
||||
|
||||
it("should use startBlock parameter", async () => {
|
||||
const startBlock = 1000
|
||||
const mockEvents = [
|
||||
{
|
||||
args: ["arg1"],
|
||||
blockNumber: 1001
|
||||
}
|
||||
] as EventLog[]
|
||||
|
||||
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
|
||||
|
||||
await getEvents(mockContract, "TestEvent", [], startBlock)
|
||||
|
||||
expect(mockContract.queryFilter).toHaveBeenCalledWith(undefined, startBlock)
|
||||
})
|
||||
|
||||
it("should handle empty events array", async () => {
|
||||
mockContract.queryFilter.mockResolvedValueOnce([])
|
||||
|
||||
const result = await getEvents(mockContract, "TestEvent")
|
||||
|
||||
expect(result).toEqual([])
|
||||
})
|
||||
|
||||
it("should handle undefined filterArgs gracefully", async () => {
|
||||
const mockEvents = [
|
||||
{
|
||||
args: ["arg1"],
|
||||
blockNumber: 101
|
||||
}
|
||||
] as EventLog[]
|
||||
|
||||
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
|
||||
|
||||
await getEvents(mockContract, "TestEvent", undefined)
|
||||
|
||||
expect(mockContract.filters.TestEvent).toHaveBeenCalledWith()
|
||||
})
|
||||
|
||||
it("should handle contract errors", async () => {
|
||||
mockContract.queryFilter.mockRejectedValue(new Error("Contract error"))
|
||||
|
||||
await expect(getEvents(mockContract, "TestEvent")).rejects.toThrow("Contract error")
|
||||
})
|
||||
})
|
||||
})
|
||||
1110
packages/data/tests/viem.test.ts
Normal 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/group",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"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.3",
|
||||
"@zk-kit/lean-imt": "2.2.4",
|
||||
"@zk-kit/utils": "1.3.0",
|
||||
"poseidon-lite": "0.3.0"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/hardhat",
|
||||
"version": "4.9.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.9.1",
|
||||
"@semaphore-protocol/contracts": "4.14.0",
|
||||
"ethers": "^6.13.4",
|
||||
"hardhat-dependency-compiler": "^1.1.3"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/identity",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "A library to create Semaphore identities.",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/proof",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "A library to generate and verify Semaphore proofs.",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
@@ -47,14 +47,14 @@
|
||||
"rollup-plugin-cleanup": "^3.2.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@semaphore-protocol/group": "4.9.1",
|
||||
"@semaphore-protocol/identity": "4.9.1"
|
||||
"@semaphore-protocol/group": "4.14.0",
|
||||
"@semaphore-protocol/identity": "4.14.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@semaphore-protocol/utils": "4.9.1",
|
||||
"@zk-kit/artifacts": "1.8.0",
|
||||
"@semaphore-protocol/utils": "4.14.0",
|
||||
"@zk-kit/artifacts": "2.0.1",
|
||||
"@zk-kit/utils": "1.3.0",
|
||||
"ethers": "6.13.4",
|
||||
"snarkjs": "0.7.4"
|
||||
"snarkjs": "0.7.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,18 +86,14 @@ export default async function generateProof(
|
||||
// If the Snark artifacts are not defined they will be automatically downloaded.
|
||||
snarkArtifacts ??= await maybeGetSnarkArtifacts(Project.SEMAPHORE, {
|
||||
parameters: [merkleTreeDepth],
|
||||
version: "4.0.0"
|
||||
version: "4.13.0"
|
||||
})
|
||||
const { wasm, zkey } = snarkArtifacts
|
||||
|
||||
// The index must be converted to a list of indices, 1 for each tree level.
|
||||
// The missing siblings can be set to 0, as they won't be used in the circuit.
|
||||
const merkleProofIndices = []
|
||||
const merkleProofSiblings = merkleProof.siblings
|
||||
|
||||
for (let i = 0; i < merkleTreeDepth; i += 1) {
|
||||
merkleProofIndices.push((merkleProof.index >> i) & 1)
|
||||
|
||||
if (merkleProofSiblings[i] === undefined) {
|
||||
merkleProofSiblings[i] = 0n
|
||||
}
|
||||
@@ -107,7 +103,7 @@ export default async function generateProof(
|
||||
{
|
||||
secret: identity.secretScalar,
|
||||
merkleProofLength,
|
||||
merkleProofIndices,
|
||||
merkleProofIndex: merkleProof.index,
|
||||
merkleProofSiblings,
|
||||
scope: hash(scope),
|
||||
message: hash(message)
|
||||
|
||||
@@ -9,5 +9,5 @@ import { NumericString } from "snarkjs"
|
||||
* @returns The message digest.
|
||||
*/
|
||||
export default function hash(message: BigNumberish): NumericString {
|
||||
return (BigInt(keccak256(toBeHex(message, 32))) >> BigInt(8)).toString()
|
||||
return (BigInt(keccak256(toBeHex(message, 32))) >> 8n).toString()
|
||||
}
|
||||
|
||||
@@ -15,6 +15,6 @@ export default function toBigInt(value: BigNumberish | Uint8Array | string): big
|
||||
return _toBigInt(encodeBytes32String(value))
|
||||
}
|
||||
|
||||
throw TypeError(error.message)
|
||||
throw TypeError(error instanceof Error ? error.message : error.toString())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@semaphore-protocol/utils",
|
||||
"version": "4.9.1",
|
||||
"version": "4.14.0",
|
||||
"description": "A library to provide utility functions to the other Semaphore packages.",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -4,18 +4,38 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 6983614
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 9118042
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 6983614
|
||||
"startBlock": 9118042
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 6983614
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 9118042
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"network": "ethereum",
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 23311418
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 23311418
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 23311418
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -24,18 +44,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 93258221
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 190173122
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 93258221
|
||||
"startBlock": 190173122
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 93258221
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 190173122
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -44,18 +64,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 19289434
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 32508911
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 19289434
|
||||
"startBlock": 32508911
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 19289434
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 32508911
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -64,18 +84,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 13850778
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 25915415
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 13850778
|
||||
"startBlock": 25915415
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 13850778
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 25915415
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -84,18 +104,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 269586534
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 376612967
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 269586534
|
||||
"startBlock": 376612967
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 269586534
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 376612967
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -104,18 +124,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 63715311
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 76162950
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 63715311
|
||||
"startBlock": 76162950
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 63715311
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 76162950
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -124,18 +144,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 127391657
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 140821423
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 127391657
|
||||
"startBlock": 140821423
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 127391657
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 140821423
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -144,18 +164,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 17307202
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 30526193
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 17307202
|
||||
"startBlock": 30526193
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 17307202
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 30526193
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -164,18 +184,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 5225214
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 17778088
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 5225214
|
||||
"startBlock": 17778088
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 5225214
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 17778088
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -184,18 +204,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 21796660
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 35226469
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 21796660
|
||||
"startBlock": 35226469
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 21796660
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 35226469
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -204,18 +224,18 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 11459722
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 23030579
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 11459722
|
||||
"startBlock": 23030579
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 11459722
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"startBlock": 23030579
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -224,18 +244,58 @@
|
||||
"contracts": [
|
||||
{
|
||||
"name": "SemaphoreVerifier",
|
||||
"address": "0x6C42599435B82121794D835263C846384869502d",
|
||||
"startBlock": 7397758
|
||||
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
|
||||
"startBlock": 11979239
|
||||
},
|
||||
{
|
||||
"name": "PoseidonT3",
|
||||
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
|
||||
"startBlock": 7397758
|
||||
"startBlock": 11979239
|
||||
},
|
||||
{
|
||||
"name": "Semaphore",
|
||||
"address": "0x06d1530c829366A7fff0069e77c5af6A6FA7db2E",
|
||||
"startBlock": 7397758
|
||||
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -70,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"
|
||||
}
|
||||
}
|
||||
|
||||