Compare commits

...

23 Commits

Author SHA1 Message Date
cedoor
48b0694586 chore: v4.3.0 2024-10-03 12:46:01 +01:00
Cedoor
28684fdb1a Chore/mainnet deployments (#869)
* chore(contracts): deploy semaphore contracts on base

re #865

* chore(contracts): deploy semaphore contracts on linea

re #865

* refactor(data): add types for new networks

re #865
2024-10-03 12:42:36 +01:00
Cedoor
49a16635d8 chore(website): update roadmap.json (#866) 2024-10-01 19:04:11 +01:00
cedoor
4bfe6d8791 chore: v4.2.0 2024-10-01 18:48:37 +01:00
Cedoor
a3d97795fe Chore/new testnets (#864)
* chore(contracts): deploy contracts on base sepolia

re #863

* chore(contracts): deploy contracts on linea sepolia

re #863
2024-10-01 18:36:55 +01:00
cedoor
4c8d297902 chore: v4.1.0 2024-10-01 11:35:27 +01:00
Cedoor
fdbadf5b71 Chore/mainnet deployments (#862)
* chore(contracts): deploy contracts on arbitrum

re #859

* chore(contracts): deploy contracts on polygon

re #859

* chore(contracts): deploy contracts on optimism

re #859
2024-10-01 11:31:29 +01:00
Vivian Plasencia
4496eee137 docs(website): update events (#857) 2024-09-20 17:53:55 +02:00
Cedoor
215a12e25c docs(website): add new project (#856)
re #855
2024-09-20 16:24:23 +01:00
Cedoor
87331114c1 chore: replace discord link with telegram (#853) 2024-09-03 12:49:31 +02:00
sripwoud
0d41562dad chore: publish contracts to soldeer (#820)
* chore: define separate version.ts script

* chore: include publishing to soldeer in script

* fix(contracts): push to soldeer

re 800

* ci: fetch latest contract version from soldeer

* refactor: do not use execa in scripts

* fix: do not exit process in script

* chore: remove comments

* refactor: use shebang in ts scripts

* chore(contracts): add soldeerignore

* chore: inherit stdio in scripts

* chore: remove dry run flag

* chore: uncomment

* chore: fix typo in comment
2024-08-28 16:26:48 +02:00
Elias Rad
c435712656 docs fix spelling issues (#852)
* Update README.md

* Update contract-api.md

* Update howitworks.md

* Update libsemaphore.md
2024-08-28 16:26:31 +02:00
Vivian Plasencia
7d48311474 chore: v4.0.3 2024-08-13 09:53:22 +02:00
csiejimmyliu
5ef73e2819 Semaphore Identity example code bug fix (Fix #848) (#849)
* Semaphore identity example code bug fix

* Receive suggestion for consistency

---------

Co-authored-by: weipooppys93030 <55434365+weipooppys93030@users.noreply.github.com>
2024-08-12 23:29:04 +02:00
cedoor
de7bdd6d17 chore: v4.0.2 2024-08-12 12:00:57 +02:00
Cedoor
21c2739f19 fix(group): update lean-imt dependency (#850)
re #847
2024-08-12 11:56:08 +02:00
Vivian Plasencia
1ed170d0db chore: add pairwise to the list of projects (#846)
* chore: add pairwise to the list of projects

re #845

* refactor: remove slash from the website url

* refactor: remove www from website url
2024-07-31 13:12:54 +01:00
Cedoor
bc041486b0 chore(website): add new project (#844)
re #839
2024-07-31 10:51:52 +01:00
cedoor
5db1bccb84 chore: v4.0.1 2024-07-31 10:39:27 +01:00
Cedoor
b2da0a685a fix(proof): replace root public signal with actual root (#843)
The public signal of proof related to the Merkle root could obviously be different from what is
expected to be the root of the group. Therefore, for the proof to be valid, it is necessary that the
group root passed as a parameter matches the proof/circuit root output.

re #842
2024-07-31 10:38:02 +01:00
Cedoor
9329eed754 docs(docs): update credits.md (#840) 2024-07-26 18:59:56 +02:00
Cedoor
75563ee0d5 docs(docs): update v4 doc (#837)
* docs(docs): update v4 doc

* Update apps/docs/docusaurus.config.ts

Co-authored-by: Vivian Plasencia <v.pcalana@gmail.com>

---------

Co-authored-by: Vivian Plasencia <v.pcalana@gmail.com>
2024-07-25 12:51:06 +01:00
Cedoor
368bbd4bcd docs(website): add roadmap to home page (#834)
* docs(website): add roadmap to home page

re #833

* fix(website): add key property

re #833

* docs(website): add vertical roadmap
2024-07-25 12:50:49 +01:00
98 changed files with 751 additions and 1929 deletions

View File

@@ -26,5 +26,13 @@
"no-console": ["warn", { "allow": ["info", "warn", "error"] }],
"@typescript-eslint/lines-between-class-members": "off",
"no-param-reassign": "off"
}
},
"overrides": [
{
"files": ["./scripts/*"],
"rules": {
"no-console": "off"
}
}
]
}

2
.gitignore vendored
View File

@@ -94,3 +94,5 @@ typechain-types
# Other
snark-artifacts
*.zip

1
.soldeerignore Normal file
View File

@@ -0,0 +1 @@
package.json

View File

@@ -53,7 +53,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
@@ -374,5 +374,5 @@ 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 pushed on the main branch. A workflow will be triggered and will
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.

View File

@@ -34,7 +34,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

@@ -67,7 +67,7 @@ const config: Config = {
announcementBar: {
id: "semaphore-v4-beta",
content:
'<b>Semaphore V4-beta is out 🎉 <a href="/getting-started">Try it out</a> and contribute to the <a href="/trusted-setup">Trusted Setup ceremony</a>. Let us know for any feedback on <a href="https://semaphore.pse.dev/discord" target="_blank">Discord</a> or <a href="https://github.com/orgs/semaphore-protocol/discussions" target="_blank">Github</a>!</b>',
'<b><a href="https://github.com/semaphore-protocol/semaphore/releases/tag/v4.0.0" target="_blank">Semaphore V4</a> is out 🎉 <a href="/getting-started">Try it out</a> and let us know if you have any feedback on <a href="https://semaphore.pse.dev/telegram" target="_blank">Telegram</a> or <a href="https://github.com/orgs/semaphore-protocol/discussions" target="_blank">Github</a>!</b>',
backgroundColor: "#dde6fc",
textColor: "#000000"
},

View File

@@ -386,7 +386,7 @@
"message": "Connect"
},
"footer.right.connect.link1": {
"message": "Discord"
"message": "Telegram"
},
"footer.right.connect.link2": {
"message": "X (Twitter)"

View File

@@ -386,7 +386,7 @@
"message": "Conecta con nosotros"
},
"footer.right.connect.link1": {
"message": "Discord"
"message": "Telegram"
},
"footer.right.connect.link2": {
"message": "X (Twitter)"

View File

@@ -14,7 +14,7 @@ También proporciona un mecanismo simple para evitar la doble señalización, lo
## ¿Dónde puedo hacer preguntas sobre Semaphore?
Puede hacer preguntas sobre Semaphore en [Discord](https://semaphore.pse.dev/discord) o abriendo un [Semaphore Discussion](https://github.com/semaphore-protocol/semaphore/discussions).
Puede hacer preguntas sobre Semaphore en [Telegram](https://semaphore.pse.dev/telegram) o abriendo un [Semaphore Discussion](https://github.com/semaphore-protocol/semaphore/discussions).
## ¿Por qué las identidades requieren tanto `identity trapdoor` como `identity nullifier`?

View File

@@ -7,7 +7,7 @@ import TabItem from "@theme/TabItem"
# Solución de problemas
Si estas sugerencias no funcionan, no dude en preguntar en las [Semaphore Discussions](https://github.com/semaphore-protocol/semaphore/discussions) o en el canal `dev-chat` en el [Semaphore Discord](https://semaphore.pse.dev/discord).
Si estas sugerencias no funcionan, no dude en preguntar en las [Semaphore Discussions](https://github.com/semaphore-protocol/semaphore/discussions) o en el canal [Semaphore Telegram](https://semaphore.pse.dev/telegram).
## Usando Semaphore en the frontend

View File

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

View File

@@ -32,7 +32,7 @@ function Footer() {
id: "footer.right.connect.title"
})}
</h3>
<Link href="https://semaphore.pse.dev/discord" target="_blank">
<Link href="https://semaphore.pse.dev/telegram" target="_blank">
{translate({
id: "footer.right.connect.link1"
})}

View File

@@ -21,7 +21,7 @@ The first external nullifier will be added as an external nullifier to the
contract, and this external nullifier will be active once the deployment
completes.
## Add, deactivate, or reactivate external nullifiiers
## Add, deactivate, or reactivate external nullifiers
**Contract ABI**:

View File

@@ -10,8 +10,8 @@ An identity is comprised of the following information:
1. An [EdDSA](https://en.wikipedia.org/wiki/EdDSA) private key. Note that it is
_not_ an Ethereum private key.
2. An identity nullifier, whih is a random 32-byte value.
3. An identity trapdoor, whih is a random 32-byte value.
2. An identity nullifier, which is a random 32-byte value.
3. An identity trapdoor, which is a random 32-byte value.
An identity commitment is the Pedersen hash of:

View File

@@ -204,7 +204,7 @@ It returns an object as such:
- `msg`: The hash of the external nullifier and the signal hash
- `signature`: The signature on the above msg.
- `tree`: The Merkle tree object after it has been updated with the identity commitment
- `identityPath`: The Merkle path to the identity commmitment
- `identityPath`: The Merkle path to the identity commitment
- `identityPathIndex`: The leaf index of the identity commitment
- `identityPathElements`: The elements along the above Merkle path

View File

@@ -14,7 +14,7 @@ It also provides a simple mechanism to prevent double-signaling, which means you
## Where can I ask questions about Semaphore?
You can ask questions about Semaphore on [Discord](https://semaphore.pse.dev/discord) or by opening a [Semaphore Discussion](https://github.com/semaphore-protocol/semaphore/discussions).
You can ask questions about Semaphore on [Telegram](https://semaphore.pse.dev/telegram) or by opening a [Semaphore Discussion](https://github.com/semaphore-protocol/semaphore/discussions).
## Why do identities require both the `identity trapdoor` and the `identity nullifier`?

View File

@@ -7,7 +7,7 @@ import TabItem from "@theme/TabItem"
# Troubleshooting
If these suggestions do not work, feel free to ask in the [Semaphore Discussions](https://github.com/semaphore-protocol/semaphore/discussions) or in the `dev-chat` channel in the [Semaphore Discord](https://semaphore.pse.dev/discord).
If these suggestions do not work, feel free to ask in the [Semaphore Discussions](https://github.com/semaphore-protocol/semaphore/discussions) or in the [Semaphore Telegram](https://semaphore.pse.dev/telegram).
## Using Semaphore in the frontend

View File

@@ -1,50 +0,0 @@
---
sidebar_position: 6
---
# Trusted Setup
gm, everyone 😎 we are excited to announce the upcoming Multi-Party Computation (MPC) Phase 2 Trusted Setup ceremony for the Semaphore V4 circuit - this is crucial for establishing a robust security foundation for the cryptographic protocol 🎉
The ceremony will take place from **June 10** to **July 10**. If all goes to plan, finalization should take place on **July 15** with the announcement of the final beacon on **July 12**.
## Securing Semaphore V4
To contribute to this ceremony, you will just need your browser!
1. Visit [ceremony.pse.dev](https://ceremony.pse.dev/projects/Semaphore%20V4%20Ceremony).
2. Login and associate your **Github** account.
3. Hit the `contribute` button and wait for your turn.
nb. you will find your contribution certificate on your GitHub gists - and, if all goes wrong or you feel lost, there are instructions on site or post a message on Semaphore / PSE discord.
## What You Need to Know About the Ceremony
### Your Role
Many zero-knowledge proof systems, including those based on the Groth16 scheme, require this layer of randomness, often referred to as "toxic waste” which must remain unknown to anyone to maintain the integrity of the zero-knowledge proof system. Trusted setups rely on a 1 of N honest participant assumption. As long as just one participant actually discards their “toxic waste”, the proof system will be secure. You can be that one participant by providing your unique entropy with your contribution, making the ceremony unpredictable and unbiased, safeguarding the entire process against potential vulnerabilities.
### Why It Matters
Trusted setups are crucial as they generate a set of parameters necessary to initiate SNARK-based systems. Through a series of computations performed by various participants. This sequence involves downloading previous contributions, adding generated randomness, and uploading the results of your contribution. These contributions are then integrated into the final artifacts crucial for proof generation/verification.
### Semaphore Circuit
The [Semaphore circuit](https://github.com/semaphore-protocol/semaphore/blob/main/packages/circuits/src/semaphore.circom) centered around the creation of the _Semaphore identity_ and _identity commitment_, includes verification processes, and facilitates the generation of the _nullifier_. We are going to support `MAX_DEPTH` from 1 to 32 - therefore you will have to contribute to 32 variants of the same circuit. Since the constraints will range from 2k to less than 10k with very small artifacts size (≤ 8mb x contribution), the waiting and contribution time shouldnt be much!
### Transparency and Fairness
We are committed to transparency on ceremony setup, execution, finalization, and later verification. Our primary goal is to **engage as many contributors as possible** to ensure the circuit is **secure** and **production-ready**. To this end, the ceremony is designed to _maximize contributor inclusion_, monitor & troubleshoot whenever is needed, _lower the entry barriers_, _making contributiong as effortless as possible_. A key step towards achieving these goals is running the ceremony w/ [p0tion](https://github.com/privacy-scaling-explorations/p0tion): an in-house developed, open-source, battle-tested tool that is fully equipped to meet our needs.
### Ceremony Settings
To protect the ceremony from sybils, in order to contribute you must have a GitHub account such that you have: 1 public repository, at least 1 follower, following at least 5 other accounts and, your account is at least 1 month old. While to protect from fake contributors or people hanging due to connection/machine resources, we are going to set a 10 minutes time-window on contributions (+ 1 hour verification) - after this amount of time, you will be kicked out and will have to wait **1 day** before you can contribute again.
## Troubleshooting
- If you have been idle longer than expected, it may be that the current contributor has been blocked for some reason. Do not worry, the maximum wait in this case is one hour, after which you will be able to continue contributing.
### Learn more about Trusted Setups
- [How Do Trusted Setups Work? - Vitalik](https://vitalik.eth.limo/general/2022/03/14/trustedsetup.html)
- [p0tion FAQs](https://p0tion.super.site/faqs#block-cebca23ebb514c2ea096ad44d4833356)

View File

@@ -17,3 +17,4 @@ Semaphore is the work of several people, for a complete list of contributors you
- [LauNaMu](https://github.com/0xyNaMu)
- [0xjei](https://github.com/0xjei)
- [Mari Poveda](https://github.com/maripoveda)
- [Gauthier](https://github.com/sripwoud)

View File

@@ -6,7 +6,7 @@ sidebar_position: 11
## Where can I ask questions about Semaphore?
You can ask questions about Semaphore on [Discord](https://semaphore.pse.dev/discord) or by opening a [Semaphore Discussion](https://github.com/semaphore-protocol/semaphore/discussions). The most frequent questions will be listed below.
You can ask questions about Semaphore on [Telegram](https://semaphore.pse.dev/telegram) or by opening a [Semaphore Discussion](https://github.com/semaphore-protocol/semaphore/discussions). The most frequent questions will be listed below.
## Why should I prevent proofs from being verified twice?

View File

@@ -7,13 +7,7 @@ import TabItem from "@theme/TabItem"
# Troubleshooting
If these suggestions do not work, feel free to ask for more help and support on [Github Discussions](https://github.com/semaphore-protocol/semaphore/discussions) or [Discord](https://semaphore.pse.dev/discord) ("dev-chat" channel).
## Creating a Group
When you create a group and the transaction is reverted, make sure that the group id you are using does not exist on the network you are using.
To check that, you can use the [Semaphore CLI](https://github.com/semaphore-protocol/semaphore/tree/main/packages/cli) with the command `get-groups` and the network you are using and then, make sure that your group id is not part of that list. You can also use the [Semaphore explorer](https://explorer.semaphore.pse.dev/).
If these suggestions do not work, feel free to ask for more help and support on [Github Discussions](https://github.com/semaphore-protocol/semaphore/discussions) or [Telegram](https://semaphore.pse.dev/telegram).
## Transaction reverted when using the same nullifier

View File

@@ -38,6 +38,10 @@ In addition to circuits,
Semaphore provides [Solidity contracts](https://github.com/semaphore-protocol/semaphore/tree/main/packages/contracts)
and [JavaScript libraries](https://github.com/semaphore-protocol/semaphore/tree/main#-packages) that allow developers to generate zero-knowledge proofs and verify them with minimal effort.
## Trusted Setup Ceremony
The [secure parameters](https://snark-artifacts.pse.dev) for generating valid proofs with Semaphore circuits were generated in a [Trusted Setup Ceremony](https://ceremony.pse.dev/projects/Semaphore%20V4%20Ceremony) that was completed with over 400 participants on [13 July 2024](https://etherscan.io/block/20300394).
### Audits
| Version | Auditors | Report | Scope |
@@ -46,7 +50,3 @@ and [JavaScript libraries](https://github.com/semaphore-protocol/semaphore/tree/
| v2.5.0 | [PSE](https://pse.dev/) | [Semaphore_2.5.0_Audit.pdf](https://semaphore.pse.dev/Semaphore_2.5.0_Audit.pdf) | `contracts`, `libraries` |
| v3.0.0 | [Veridise](https://veridise.com/) | [Semaphore_3.0.0_Audit.pdf](https://semaphore.pse.dev/Semaphore_3.0.0_Audit.pdf) | `circuits`, `contracts` |
| v4.0.0 | [PSE](https://pse.dev/) | [Semaphore_4.0.0_Audit.pdf](https://semaphore.pse.dev/Semaphore_4.0.0_Audit.pdf) | `circuits`, `contracts`, `libraries` |
:::caution
Semaphore V4 is in early testing and might have bugs. Please, don't use it in production.
:::

View File

@@ -1 +1 @@
["V4-beta", "V3", "V2", "V1"]
["V4", "V3", "V2", "V1"]

View File

@@ -31,7 +31,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>
@@ -42,15 +42,21 @@
## Networks
| Semaphore version | Sepolia | Polygon Mumbai | Optimism Sepolia | Arbitrum Sepolia | Arbitrum One | Polygon Amoy |
| ----------------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| v2.0 | N/A | N/A | N/A | N/A | [semaphore-protocol/arbitrum](https://thegraph.com/hosted-service/subgraph/semaphore-protocol/arbitrum) | N/A |
| v2.5 | N/A | N/A | N/A | N/A | N/A | N/A |
| v2.6 | N/A | N/A | N/A | N/A | [semaphore-protocol/arbitrum-86337c](https://thegraph.com/hosted-service/subgraph/semaphore-protocol/arbitrum-86337c) | N/A |
| v3.0 - v3.1 | N/A | N/A | N/A | N/A | [semaphore-protocol/arbitrum-72dca3](https://thegraph.com/hosted-service/subgraph/semaphore-protocol/arbitrum-72dca3) | N/A |
| >= v3.2 | [semaphore-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-sepolia/v3.6.1) | [semaphore-mumbai](https://api.studio.thegraph.com/query/14377/semaphore-mumbai/v3.6.1) | N/A | N/A | [semaphore-arbitrum](https://api.studio.thegraph.com/query/14377/semaphore-arbitrum/v3.6.1) | N/A |
| v4.0.0-beta | [semaphore-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-sepolia/v4.0.0-beta) | [semaphore-matic-mumbai](https://api.studio.thegraph.com/query/14377/semaphore-matic-mumbai/v4.0.0-beta) | [semaphore-optimism-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-optimism-sepolia/v4.0.0-beta) | [semaphore-arbitrum-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-arbitrum-sepolia/v4.0.0-beta) | N/A | N/A |
| >= v4.0.0-beta.17 | [semaphore-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-sepolia/v4.0.0-beta.17) | N/A | [semaphore-optimism-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-optimism-sepolia/v4.0.0-beta.17) | [semaphore-arbitrum-sepolia](https://api.studio.thegraph.com/query/14377/semaphore-arbitrum-sepolia/v4.0.0-beta.17) | N/A | [semaphore-matic-amoy](https://api.studio.thegraph.com/query/14377/semaphore-matic-amoy/v4.0.0-beta.17) |
You can access any subgraph supported by Semaphore with the following URL: https://api.studio.thegraph.com/query/14377/semaphore-<network-name>/v4.0.0-beta.17.
Supported networks:
- `sepolia`
- `optimism`
- `optimism-sepolia`
- `arbitrum-one`
- `arbitrum-sepolia`
- `matic`
- `polygon-amoy`
- `base-sepolia`
- `base`
- `linea-sepolia`
- `linea`
## 🛠 Install

View File

@@ -20,7 +20,7 @@
"dependencies": {
"@graphprotocol/graph-cli": "0.78.0",
"@graphprotocol/graph-ts": "0.35.1",
"@semaphore-protocol/utils": "4.0.0"
"@semaphore-protocol/utils": "workspace:packages/utils"
},
"devDependencies": {
"@types/mustache": "^4.2.2",

View File

@@ -6,8 +6,20 @@ const network = process.argv.at(2)
const template = readFileSync("./subgraph.template.yaml", "utf-8")
function mapNetwork(n) {
if (n === "matic-amoy") {
return "polygon-amoy"
}
if (n === "arbitrum") {
return "arbitrum-one"
}
return network
}
const subgraph = Mustache.render(template, {
network: network === "matic-amoy" ? "polygon-amoy" : network,
network: mapNetwork(network),
...getDeployedContract(network)
})

View File

@@ -34,7 +34,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

@@ -32,19 +32,18 @@ export default function RootLayout({ children }: { children: React.ReactNode })
<body suppressHydrationWarning>
<Providers>
<Banner>
Semaphore V4
<Link
_hover={{
textDecoration: "underline",
textDecorationColor: "primary.600"
}}
href="https://ceremony.pse.dev/projects/Semaphore%20V4%20Ceremony"
href="https://github.com/semaphore-protocol/semaphore/releases/tag/v4.0.0"
ml="1"
isExternal
>
<b>Trusted Setup</b>
<b>Semaphore V4</b>
</Link>{" "}
ceremony is open for contributions until <b>July 10</b>.
has been released 🚀
</Banner>
<Navbar />
<Container maxW="1440px" px={{ base: "5", md: "10" }}>

View File

@@ -1,11 +1,13 @@
import { Box, Button, Card, CardBody, HStack, Heading, Image, Link, Stack, Text, VStack } from "@chakra-ui/react"
import NextLink from "next/link"
import { Sora } from "next/font/google"
import NextLink from "next/link"
import Carousel from "../components/Carousel"
import ProjectCard from "../components/ProjectCard"
import events from "../data/events.json"
import allProjects from "../data/projects.json"
import IconDiscord from "../icons/IconDiscord"
import IconTelegram from "../icons/IconTelegram"
import HRoadmap from "@/components/HRoadmap"
import VRoadmap from "@/components/VRoadmap"
const sora = Sora({
subsets: ["latin"]
@@ -220,6 +222,35 @@ export default function Home() {
</Card>
</HStack>
<VStack mb="32" spacing="32">
<VStack w="full" maxW="1110px">
<Heading fontSize={{ base: "30px", md: "44px" }} pb="90px">
2024 Roadmap
</Heading>
<HStack display={{ base: "none", md: "flex" }} w="full" mt="60px">
<HRoadmap />
</HStack>
<VStack display={{ base: "flex", md: "none" }}>
<VRoadmap />
</VStack>
</VStack>
<VStack maxW="650" align="center" spacing="8">
<Heading fontSize={{ base: "30px", md: "44px" }}>Join the Semaphore community</Heading>
<Text fontSize={{ base: "16px", md: "18px" }} textAlign="center">
Ask questions, suggest ideas, stay up-to-date, and meet other people building privacy
applications with Zero Knowledge.
</Text>
<Link href="https://semaphore.pse.dev/telegram" isExternal>
<Button leftIcon={<IconTelegram />} size="lg">
Telegram
</Button>
</Link>
</VStack>
</VStack>
<VStack justify="center" spacing="40" py="32" position="relative">
<Box
zIndex="-1"
@@ -239,27 +270,16 @@ export default function Home() {
/>
</Box>
<Stack direction={{ base: "column", md: "row" }} px={{ base: "0", md: "12" }} spacing="32">
<VStack maxW="450" align="left" spacing="8">
<Heading fontSize={{ base: "30px", md: "44px" }}>Join the Semaphore community</Heading>
<Text fontSize={{ base: "16px", md: "18px" }}>
Ask questions, suggest ideas, stay up-to-date, and meet other people building privacy
applications with Zero Knowledge.
</Text>
<Link href="https://semaphore.pse.dev/discord" isExternal>
<Button leftIcon={<IconDiscord />} size="lg">
Discord
</Button>
</Link>
</VStack>
<Stack direction={{ base: "column", md: "row" }} px={{ base: "0", md: "12" }} w="full">
<Box flex="1" />
<Card
bg="inherit"
flex="1"
bg="darkBlue"
color="white"
backdropFilter="blur(4px)"
borderRadius="18px"
border="1px"
borderColor="white"
borderColor="text.900"
padding="50px"
>
<CardBody padding="0">

View File

@@ -2,7 +2,7 @@ import { Divider, Heading, HStack, Link, Stack, Text, VStack } from "@chakra-ui/
import Image from "next/image"
import NextLink from "next/link"
import IconArrowUpRight from "../icons/IconArrowUpRight"
import IconDiscord from "../icons/IconDiscord"
import IconTelegram from "../icons/IconTelegram"
import IconThumbsUp from "../icons/IconThumbsUp"
import IconX from "@/icons/IconX"
@@ -59,11 +59,11 @@ export default function Footer() {
<Divider />
<VStack spacing="5">
<HStack spacing="5">
<Link href="https://semaphore.pse.dev/discord" isExternal>
<Link href="https://semaphore.pse.dev/telegram" isExternal>
<HStack>
<IconDiscord boxSize={{ base: "16px", md: "24px" }} />
<IconTelegram boxSize={{ base: "16px", md: "24px" }} />
<Heading fontSize={{ base: "14px", md: "18px" }} fontWeight="normal">
Discord
Telegram
</Heading>
</HStack>
</Link>

View File

@@ -0,0 +1,58 @@
import { Box, Text } from "@chakra-ui/react"
import roadmap from "../data/roadmap.json"
import IconInnerCheck from "../icons/IconInnerCheck"
export default function HRoadmap() {
return roadmap.map((milestone, i) => (
<Box
key={milestone.name}
borderBottomWidth={i % 2 === 0 ? "5px" : "0px"}
borderTopWidth={i % 2 !== 0 ? "5px" : "0px"}
borderLeftWidth="1px"
borderColor="#1E46F2"
transform={i % 2 === 0 ? "translateY(-74px)" : ""}
h="80px"
w="full"
pos="relative"
>
{milestone.done ? (
<IconInnerCheck
pos="absolute"
top={i % 2 !== 0 ? "-14px" : "inherit"}
bottom={i % 2 === 0 ? "-14px" : "inherit"}
left="-12px"
bg="#1E46F2"
borderRadius="50px"
p="7px"
w="24px"
h="24px"
color="white"
/>
) : (
<Box
pos="absolute"
top={i % 2 !== 0 ? "-14px" : "inherit"}
bottom={i % 2 === 0 ? "-14px" : "inherit"}
left="-12px"
bg="darkBlueBg"
borderWidth="5px"
borderColor="#1E46F2"
borderRadius="50px"
w="24px"
h="24px"
/>
)}
<Text
pos="absolute"
bg="darkBlueBg"
fontSize="14px"
py="5px"
top={i % 2 === 0 ? "-35px" : "inherit"}
bottom={i % 2 !== 0 ? "-35px" : "inherit"}
left="-1px"
>
{milestone.name}
</Text>
</Box>
))
}

View File

@@ -20,7 +20,7 @@ import {
} from "@chakra-ui/react"
import Image from "next/image"
import NextLink from "next/link"
import IconDiscord from "../icons/IconDiscord"
import IconTelegram from "../icons/IconTelegram"
import IconMenu from "../icons/IconMenu"
import IconThumbsUp from "../icons/IconThumbsUp"
import NavbarLinks from "./NavbarLinks"
@@ -71,11 +71,11 @@ export default function Navbar() {
<VStack w="full" justify="center" spacing="5">
<HStack spacing="5">
<Link href="https://semaphore.pse.dev/discord" isExternal>
<Link href="https://semaphore.pse.dev/telegram" isExternal>
<HStack>
<IconDiscord boxSize={{ base: "16px", md: "24px" }} />
<IconTelegram boxSize={{ base: "16px", md: "24px" }} />
<Heading fontSize={{ base: "14px", md: "18px" }} fontWeight="normal">
Discord
Telegram
</Heading>
</HStack>
</Link>

View File

@@ -0,0 +1,61 @@
import { Box, Text } from "@chakra-ui/react"
import roadmap from "../data/roadmap.json"
import IconInnerCheck from "../icons/IconInnerCheck"
export default function VRoadmap() {
return roadmap.map((milestone, i) => (
<Box
key={milestone.name}
ml="-74px"
borderLeftWidth={i % 2 === 0 ? "5px" : "0px"}
borderRightWidth={i % 2 !== 0 ? "5px" : "0px"}
borderTopWidth="1px"
borderColor="#1E46F2"
transform={i % 2 === 0 ? "translateX(74px)" : ""}
h="80px"
w="80px"
pos="relative"
>
{milestone.done ? (
<IconInnerCheck
pos="absolute"
right={i % 2 !== 0 ? "-14px" : "inherit"}
left={i % 2 === 0 ? "-14px" : "inherit"}
top="-12px"
bg="#1E46F2"
borderRadius="50px"
p="7px"
w="24px"
h="24px"
color="white"
/>
) : (
<Box
pos="absolute"
right={i % 2 !== 0 ? "-14px" : "inherit"}
left={i % 2 === 0 ? "-14px" : "inherit"}
top="-12px"
bg="darkBlueBg"
borderWidth="5px"
borderColor="#1E46F2"
borderRadius="50px"
w="24px"
h="24px"
/>
)}
<Text
pos="absolute"
bg="darkBlueBg"
fontSize="14px"
w="140px"
px="16px"
textAlign={i % 2 === 0 ? "left" : "right"}
left={i % 2 === 0 ? "70px" : "inherit"}
right={i % 2 !== 0 ? "70px" : "inherit"}
top="-5px"
>
{milestone.name}
</Text>
</Box>
))
}

View File

@@ -1,15 +1,9 @@
[
{
"name": "Trusted Setup ceremony",
"date": "June 10 - July 10, 2024",
"description": "The Semaphore team will perform the Phase 2 MPC Trusted Setup ceremony to secure V4 circuit variants from 1 to 32 tree depths.",
"link": "https://docs.semaphore.pse.dev/trusted-setup"
},
{
"name": "ETHRome",
"date": "Oct 4-6, 2024",
"description": "Semaphore team will deliver an in-person talk and sponsor prizes for the hackathon.",
"link": "https://www.ethrome.org/"
"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": "Devcon",

View File

@@ -11,15 +11,14 @@
}
},
{
"name": "Unirep",
"tagline": "Private and nonrepudiable reputation system based on ZKP.",
"categories": ["Reputation", "Identity", "Social"],
"pse": true,
"name": "Worldcoin",
"categories": ["Identity"],
"tagline": "A global digital currency offering universal access to a more inclusive financial system.",
"pse": false,
"icon": "",
"links": {
"website": "https://developer.unirep.io",
"github": "https://github.com/Unirep",
"discord": "https://discord.gg/VzMMDJmYc5"
"github": "https://github.com/worldcoin",
"website": "https://worldcoin.org"
}
},
{
@@ -33,6 +32,26 @@
"website": "https://bandada.pse.dev"
}
},
{
"name": "ZkDemocracy",
"categories": ["Infra", "Data"],
"tagline": "ZkDemocracy is a ready-to-use anonymous voting system based on Semaphore.",
"pse": false,
"icon": "",
"links": {
"github": "https://github.com/TheBojda/zkdemocracy"
}
},
{
"name": "Super Secret ZK Ballot",
"tagline": "A Solidity contract for anonymous voting.",
"categories": ["Voting"],
"pse": false,
"icon": "",
"links": {
"github": "https://github.com/dutragustavo/super-secret-zkballot"
}
},
{
"name": "ZK Proof of Humanity",
"tagline": "A project that allows humans, registered in Proof of Humanity, to prove their humanity without doxing.",
@@ -106,20 +125,7 @@
"icon": "",
"links": {
"website": "https://explorer.semaphore.pse.dev",
"github": "https://github.com/semaphore-protocol/explorer",
"discord": "https://semaphore.pse.dev/discord"
}
},
{
"name": "Semaphore Discord Bot",
"tagline": "A Discord Bot for Semaphore",
"categories": ["Development"],
"pse": true,
"icon": "",
"links": {
"website": "https://discord.com/api/oauth2/authorize?client_id=1082429985496772628&permissions=1024&scope=bot",
"github": "https://github.com/semaphore-protocol/discord-bot",
"discord": "https://semaphore.pse.dev/discord"
"github": "https://github.com/semaphore-protocol/explorer"
}
},
{
@@ -487,14 +493,15 @@
}
},
{
"name": "Worldcoin",
"categories": ["Identity"],
"tagline": "A global digital currency offering universal access to a more inclusive financial system.",
"pse": false,
"name": "Unirep",
"tagline": "Private and nonrepudiable reputation system based on ZKP.",
"categories": ["Reputation", "Identity", "Social"],
"pse": true,
"icon": "",
"links": {
"github": "https://github.com/worldcoin",
"website": "https://worldcoin.org"
"website": "https://developer.unirep.io",
"github": "https://github.com/Unirep",
"discord": "https://discord.gg/VzMMDJmYc5"
}
},
{
@@ -537,5 +544,16 @@
"github": "https://github.com/AsteriskDAO",
"website": "https://ethglobal.com/showcase/asteriskdao-4hvhf"
}
},
{
"name": "Pairwise",
"tagline": "A fun pseudonymous way to signal in Retro Funding 4.",
"categories": ["Retro Funding", "Public Goods", "Privacy", "Community"],
"pse": false,
"icon": "",
"links": {
"github": "https://github.com/GeneralMagicio/pairwise-RPGF4",
"website": "https://pairwise.vote"
}
}
]

View File

@@ -0,0 +1,34 @@
[
{
"name": "Launched New Website",
"done": true
},
{
"name": "V4 Audit",
"done": true
},
{
"name": "V4 Trusted Setup",
"done": true
},
{
"name": "V4 Stable Release",
"done": true
},
{
"name": "LeanIMT Paper",
"done": true
},
{
"name": "Support more Testnets/Mainnets",
"done": true
},
{
"name": "RLN extension",
"done": false
},
{
"name": "Documentation improvements",
"done": false
}
]

View File

@@ -0,0 +1,15 @@
import { Icon, IconProps } from "@chakra-ui/react"
import React from "react"
export default function IconInnerCheck(props: IconProps): JSX.Element {
return (
<Icon viewBox="0 0 9 7" {...props}>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M7.84114 1.12297C8.23166 1.5135 8.23166 2.14666 7.84114 2.53718L3.84114 6.53718C3.45062 6.92771 2.81745 6.92771 2.42693 6.53718L0.426926 4.53718C0.0364021 4.14666 0.0364021 3.5135 0.426926 3.12297C0.817451 2.73245 1.45062 2.73245 1.84114 3.12297L3.13403 4.41586L6.42693 1.12297C6.81745 0.732447 7.45062 0.732447 7.84114 1.12297Z"
fill="white"
/>
</Icon>
)
}

View File

@@ -0,0 +1,13 @@
import { Icon, IconProps } from "@chakra-ui/react"
import React from "react"
export default function IconTelegram(props: IconProps): JSX.Element {
return (
<Icon viewBox="0 0 48 48" {...props}>
<path
d="M41.4193 7.30899C41.4193 7.30899 45.3046 5.79399 44.9808 9.47328C44.8729 10.9883 43.9016 16.2908 43.1461 22.0262L40.5559 39.0159C40.5559 39.0159 40.3401 41.5048 38.3974 41.9377C36.4547 42.3705 33.5408 40.4227 33.0011 39.9898C32.5694 39.6652 24.9068 34.7955 22.2086 32.4148C21.4531 31.7655 20.5897 30.4669 22.3165 28.9519L33.6487 18.1305C34.9438 16.8319 36.2389 13.8019 30.8426 17.4812L15.7331 27.7616C15.7331 27.7616 14.0063 28.8437 10.7686 27.8698L3.75342 25.7055C3.75342 25.7055 1.16321 24.0823 5.58815 22.459C16.3807 17.3729 29.6555 12.1786 41.4193 7.30899Z"
fill="currentColor"
/>
</Icon>
)
}

View File

@@ -23,12 +23,12 @@
"format": "concurrently -c auto -g -n prettier,embark \"prettier -c .\" \"yarn workspace semaphore-docs format\"",
"format:write": "concurrently -c auto -g -n prettier,embark \"prettier -w .\" \"yarn workspace semaphore-docs format:write\"",
"docs": "typedoc",
"version:bump": "yarn workspaces foreach -A --no-private version -d ${0} && yarn version apply --all && yarn remove:stable-version-field && NO_HOOK=1 git commit -am \"chore: v${0}\" && git tag v${0}",
"version:publish": "yarn build:libraries && yarn clean:cli-templates && yarn workspaces foreach -A --no-private npm publish --tolerate-republish --access public",
"version:bump": "scripts/version.ts ${0}",
"version:publish": "scripts/publish.ts",
"version:release": "changelogithub",
"clean": "ts-node scripts/clean-apps.ts && ts-node scripts/clean-packages.ts && yarn clean:cli-templates && rimraf node_modules",
"clean:cli-templates": "ts-node scripts/clean-cli-templates.ts",
"remove:stable-version-field": "ts-node scripts/remove-stable-version-field.ts && yarn format:write",
"clean": "scripts/clean-apps.ts && scripts/clean-packages.ts && yarn clean:cli-templates && rimraf node_modules",
"clean:cli-templates": "scripts/clean-cli-templates.ts",
"remove:stable-version-field": "scripts/remove-stable-version-field.ts && yarn format:write",
"precommit": "lint-staged",
"postinstall": "husky && git config --local core.editor cat"
},
@@ -57,6 +57,7 @@
"@types/glob": "^7.2.0",
"@types/jest": "^29.5.12",
"@types/node": "^20",
"@types/semver": "^7",
"@typescript-eslint/eslint-plugin": "^7.0.2",
"@typescript-eslint/parser": "^7.0.2",
"changelogithub": "0.12.7",
@@ -78,6 +79,7 @@
"lint-staged": "^15.2.2",
"prettier": "^3.2.5",
"rimraf": "^5.0.5",
"semver": "^7.6.2",
"snarkjs": "0.7.4",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",

View File

@@ -34,7 +34,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

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

View File

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

View File

@@ -20,9 +20,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.0.0",
"@semaphore-protocol/hardhat": "4.0.0",
"@semaphore-protocol/utils": "4.0.0",
"@semaphore-protocol/core": "4.3.0",
"@semaphore-protocol/hardhat": "4.3.0",
"@semaphore-protocol/utils": "4.3.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.0.0"
"@semaphore-protocol/contracts": "4.3.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -9,9 +9,9 @@
"lint": "next lint"
},
"dependencies": {
"@semaphore-protocol/core": "4.0.0",
"@semaphore-protocol/data": "4.0.0",
"@semaphore-protocol/utils": "4.0.0",
"@semaphore-protocol/core": "4.3.0",
"@semaphore-protocol/data": "4.3.0",
"@semaphore-protocol/utils": "4.3.0",
"ethers": "^6.11.1",
"next": "14.1.0",
"next-pwa": "^5.6.0",

View File

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

View File

@@ -20,9 +20,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.0.0",
"@semaphore-protocol/hardhat": "4.0.0",
"@semaphore-protocol/utils": "4.0.0",
"@semaphore-protocol/core": "4.3.0",
"@semaphore-protocol/hardhat": "4.3.0",
"@semaphore-protocol/utils": "4.3.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.0.0"
"@semaphore-protocol/contracts": "4.3.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -9,9 +9,9 @@
"lint": "next lint"
},
"dependencies": {
"@semaphore-protocol/core": "4.0.0",
"@semaphore-protocol/data": "4.0.0",
"@semaphore-protocol/utils": "4.0.0",
"@semaphore-protocol/core": "4.3.0",
"@semaphore-protocol/data": "4.3.0",
"@semaphore-protocol/utils": "4.3.0",
"ethers": "^6.11.1",
"next": "14.1.0",
"next-pwa": "^5.6.0",

View File

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

View File

@@ -40,7 +40,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

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

View File

@@ -34,7 +34,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

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

View File

@@ -48,6 +48,22 @@ const hardhatConfig: HardhatUserConfig = {
apiURL: "https://api-sepolia-optimistic.etherscan.io/api",
browserURL: "https://sepolia-optimistic.etherscan.io"
}
},
{
network: "linea-sepolia",
chainId: 59141,
urls: {
apiURL: "https://api-sepolia.lineascan.build/api",
browserURL: "https://sepolia.lineascan.build"
}
},
{
network: "linea",
chainId: 59144,
urls: {
apiURL: "https://api.lineascan.build/api",
browserURL: "https://lineascan.build"
}
}
]
},

View File

@@ -3,7 +3,7 @@
"private": true,
"scripts": {
"start": "hardhat node",
"copy:abi": "ncp artifacts/contracts/Semaphore.sol/Semaphore.json ../utils/src/semaphore-abi.json",
"copy:abi": "ncp artifacts/contracts/Semaphore.sol/Semaphore.json ../utils/src/semaphore-interface.json",
"compile": "hardhat compile",
"deploy": "hardhat deploy",
"verify": "hardhat run scripts/verify-contracts.ts",

View File

@@ -40,7 +40,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

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

View File

@@ -43,7 +43,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

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

View File

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

View File

@@ -1,761 +0,0 @@
[
{
"inputs": [
{
"internalType": "contract ISemaphoreVerifier",
"name": "_verifier",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "LeafAlreadyExists",
"type": "error"
},
{
"inputs": [],
"name": "LeafCannotBeZero",
"type": "error"
},
{
"inputs": [],
"name": "LeafDoesNotExist",
"type": "error"
},
{
"inputs": [],
"name": "LeafGreaterThanSnarkScalarField",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__CallerIsNotTheGroupAdmin",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__GroupDoesNotExist",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__GroupHasNoMembers",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__InvalidProof",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__MerkleTreeDepthIsNotSupported",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__MerkleTreeRootIsExpired",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__MerkleTreeRootIsNotPartOfTheGroup",
"type": "error"
},
{
"inputs": [],
"name": "Semaphore__YouAreUsingTheSameNullifierTwice",
"type": "error"
},
{
"inputs": [],
"name": "WrongSiblingNodes",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "oldAdmin",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "GroupAdminUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"name": "GroupCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "oldMerkleTreeDuration",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newMerkleTreeDuration",
"type": "uint256"
}
],
"name": "GroupMerkleTreeDurationUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
}
],
"name": "MemberAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
}
],
"name": "MemberRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newIdentityCommitment",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
}
],
"name": "MemberUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "startIndex",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "identityCommitments",
"type": "uint256[]"
},
{
"indexed": false,
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
}
],
"name": "MembersAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "merkleTreeDepth",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nullifier",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "message",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint256",
"name": "scope",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256[8]",
"name": "points",
"type": "uint256[8]"
}
],
"name": "ProofValidated",
"type": "event"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
}
],
"name": "addMember",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "identityCommitments",
"type": "uint256[]"
}
],
"name": "addMembers",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "admin",
"type": "address"
},
{
"internalType": "uint256",
"name": "merkleTreeDuration",
"type": "uint256"
}
],
"name": "createGroup",
"outputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "admin",
"type": "address"
}
],
"name": "createGroup",
"outputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"name": "getGroupAdmin",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"name": "getMerkleTreeDepth",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"name": "getMerkleTreeRoot",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
}
],
"name": "getMerkleTreeSize",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "groupCounter",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "groups",
"outputs": [
{
"internalType": "uint256",
"name": "merkleTreeDuration",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
}
],
"name": "hasMember",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
}
],
"name": "indexOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "merkleProofSiblings",
"type": "uint256[]"
}
],
"name": "removeMember",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "updateGroupAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newMerkleTreeDuration",
"type": "uint256"
}
],
"name": "updateGroupMerkleTreeDuration",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "identityCommitment",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newIdentityCommitment",
"type": "uint256"
},
{
"internalType": "uint256[]",
"name": "merkleProofSiblings",
"type": "uint256[]"
}
],
"name": "updateMember",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "merkleTreeDepth",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nullifier",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "message",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "scope",
"type": "uint256"
},
{
"internalType": "uint256[8]",
"name": "points",
"type": "uint256[8]"
}
],
"internalType": "struct ISemaphore.SemaphoreProof",
"name": "proof",
"type": "tuple"
}
],
"name": "validateProof",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "verifier",
"outputs": [
{
"internalType": "contract ISemaphoreVerifier",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "groupId",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "merkleTreeDepth",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "merkleTreeRoot",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nullifier",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "message",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "scope",
"type": "uint256"
},
{
"internalType": "uint256[8]",
"name": "points",
"type": "uint256[8]"
}
],
"internalType": "struct ISemaphore.SemaphoreProof",
"name": "proof",
"type": "tuple"
}
],
"name": "verifyProof",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
]

View File

@@ -7,6 +7,10 @@ export type EthersNetwork =
| "arbitrum-sepolia"
| "optimism"
| "optimism-sepolia"
| "base"
| "base-sepolia"
| "linea"
| "linea-sepolia"
export type GroupOptions = {
members?: boolean

View File

@@ -43,7 +43,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/group",
"version": "4.0.0",
"version": "4.3.0",
"description": "A library to create and manage Semaphore groups.",
"type": "module",
"license": "MIT",
@@ -39,7 +39,7 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@zk-kit/lean-imt": "2.0.1",
"@zk-kit/lean-imt": "2.1.0",
"@zk-kit/utils": "1.0.0"
}
}

View File

@@ -153,7 +153,7 @@ export class Group {
static import(nodes: string): Group {
const group = new Group()
group.leanIMT.import(nodes)
group.leanIMT = LeanIMT.import((a, b) => poseidon2([a, b]), nodes)
return group
}

View File

@@ -158,6 +158,7 @@ describe("Group", () => {
expect(group2.depth).toBe(group1.depth)
expect(group2.size).toBe(group1.size)
expect(group2.root).toBe(group1.root)
expect(group2.indexOf(2n)).toBe(group1.indexOf(2n))
})
})
})

View File

@@ -40,7 +40,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/hardhat",
"version": "4.0.0",
"version": "4.3.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.0.0",
"@semaphore-protocol/contracts": "4.3.0",
"ethers": "^6.4.0",
"hardhat-dependency-compiler": "^1.1.3"
}

View File

@@ -43,7 +43,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>
@@ -125,7 +125,7 @@ import { Identity } from "@semaphore-protocol/identity"
const message = "message"
const identity = new Identity()
const signature = identity.signMessage("message", signature)
const signature = identity.signMessage(message)
Identity.verifySignature(message, signature, identity.publicKey)
```

View File

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

View File

@@ -43,7 +43,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/proof",
"version": "4.0.0",
"version": "4.3.0",
"description": "A library to generate and verify Semaphore proofs.",
"type": "module",
"license": "MIT",
@@ -48,11 +48,11 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"peerDependencies": {
"@semaphore-protocol/group": "4.0.0",
"@semaphore-protocol/identity": "4.0.0"
"@semaphore-protocol/group": "4.3.0",
"@semaphore-protocol/identity": "4.3.0"
},
"dependencies": {
"@semaphore-protocol/utils": "4.0.0",
"@semaphore-protocol/utils": "4.3.0",
"@zk-kit/artifacts": "1.8.0",
"@zk-kit/utils": "1.0.0",
"ethers": "6.10.0",

View File

@@ -1,11 +1,11 @@
import type { Group, MerkleProof } from "@semaphore-protocol/group"
import type { Identity } from "@semaphore-protocol/identity"
import { MAX_DEPTH, MIN_DEPTH } from "@semaphore-protocol/utils/constants"
import { Project, maybeGetSnarkArtifacts, type SnarkArtifacts } from "@zk-kit/artifacts"
import { requireDefined, requireNumber, requireObject, requireTypes } from "@zk-kit/utils/error-handlers"
import { packGroth16Proof } from "@zk-kit/utils/proof-packing"
import { maybeGetSnarkArtifacts, Project, type SnarkArtifacts } from "@zk-kit/artifacts"
import type { BigNumberish } from "ethers"
import { type NumericString, groth16 } from "snarkjs"
import { groth16, type NumericString } from "snarkjs"
import hash from "./hash"
import toBigInt from "./to-bigint"
import type { SemaphoreProof } from "./types"
@@ -118,7 +118,7 @@ export default async function generateProof(
return {
merkleTreeDepth,
merkleTreeRoot: publicSignals[0],
merkleTreeRoot: merkleProof.root.toString(),
nullifier: publicSignals[1],
message: message.toString() as NumericString,
scope: scope.toString() as NumericString,

View File

@@ -55,7 +55,7 @@ describe("Proof", () => {
expect(typeof proof).toBe("object")
expect(BigInt(proof.merkleTreeRoot)).toBe(group.root)
}, 80000)
})
it("Should generate a Semaphore proof passing a Merkle proof instead of a group", async () => {
const group = new Group([1n, 2n, identity.commitment])
@@ -64,7 +64,7 @@ describe("Proof", () => {
expect(typeof proof).toBe("object")
expect(BigInt(proof.merkleTreeRoot)).toBe(group.root)
}, 80000)
})
it("Should generate a Semaphore proof without passing the tree depth", async () => {
const group = new Group([1n, 2n, identity.commitment])
@@ -73,7 +73,7 @@ describe("Proof", () => {
expect(typeof proof).toBe("object")
expect(BigInt(proof.merkleTreeRoot)).toBe(group.root)
}, 80000)
})
it("Should throw an error because snarkArtifacts is not an object", async () => {
const group = new Group([1n, 2n, identity.commitment])
@@ -103,7 +103,7 @@ describe("Proof", () => {
await expect(fun).rejects.toThrow("tree depth must be")
})
it("Should verify a Semaphore proof", async () => {
it("Should return true if the proof is valid", async () => {
const group = new Group([1n, 2n, identity.commitment])
const proof = await generateProof(identity, group, message, scope, treeDepth)
@@ -111,6 +111,16 @@ describe("Proof", () => {
const response = await verifyProof(proof)
expect(response).toBe(true)
}, 80_000)
})
it("Should return false if the proof is not valid", async () => {
const group = new Group([1n, 2n, identity.commitment])
const proof = await generateProof(identity, group.generateMerkleProof(0), message, scope, treeDepth)
const response = await verifyProof(proof)
expect(response).toBe(false)
})
})
})

View File

@@ -43,7 +43,7 @@
🔎 Issues
</a>
<span>&nbsp;&nbsp;|&nbsp;&nbsp;</span>
<a href="https://semaphore.pse.dev/discord">
<a href="https://semaphore.pse.dev/telegram">
🗣️ Chat &amp; Support
</a>
</h4>

View File

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

View File

@@ -78,5 +78,145 @@
"startBlock": 9636193
}
]
},
{
"network": "arbitrum",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 258951463
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 258951463
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 258951463
}
]
},
{
"network": "matic",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 62466952
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 62466952
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 62466952
}
]
},
{
"network": "optimism",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 126057798
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 126057798
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 126057798
}
]
},
{
"network": "base-sepolia",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 16008294
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 16008294
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 16008294
}
]
},
{
"network": "linea-sepolia",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 3928632
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 3928632
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 3928632
}
]
},
{
"network": "base",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 20553357
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 20553357
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 20553357
}
]
},
{
"network": "linea",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0xe538f9DeeE04A397decb1E7dc5D16fD6f123c043",
"startBlock": 10235849
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 10235849
},
{
"name": "Semaphore",
"address": "0x1e0d7FF1610e480fC93BdEC510811ea2Ba6d7c2f",
"startBlock": 10235849
}
]
}
]

View File

@@ -11,16 +11,58 @@ export default {
chainId: 421614,
explorer: "https://sepolia.arbiscan.io"
},
arbitrum: {
name: "Arbitrum",
url: "https://arb1.arbitrum.io/rpc",
chainId: 42161,
explorer: "https://arbiscan.io"
},
"optimism-sepolia": {
name: "Optimism Sepolia",
url: "https://sepolia.optimism.io",
chainId: 11155420,
explorer: "https://sepolia-optimism.etherscan.io"
},
optimism: {
name: "Optimism",
url: "https://mainnet.optimism.io ",
chainId: 10,
explorer: "https://optimistic.etherscan.io"
},
"matic-amoy": {
name: "Matic Amoy",
url: "https://rpc-amoy.polygon.technology",
chainId: 80002,
explorer: "https://amoy.polygonscan.com"
},
matic: {
name: "Matic",
url: "https://polygon-rpc.com",
chainId: 137,
explorer: "https://polygonscan.com"
},
"base-sepolia": {
name: "Base Sepolia",
url: "https://sepolia.base.org",
chainId: 84532,
explorer: "https://sepolia.basescan.org"
},
base: {
name: "Base",
url: "https://mainnet.base.org",
chainId: 8453,
explorer: "https://basescan.org"
},
"linea-sepolia": {
name: "Linea Sepolia",
url: "https://rpc.sepolia.linea.build",
chainId: 59141,
explorer: "https://sepolia.lineascan.build"
},
linea: {
name: "Linea",
url: "https://rpc.linea.build",
chainId: 59144,
explorer: "https://lineascan.build"
}
}

File diff suppressed because one or more lines are too long

1
scripts/clean-apps.ts Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!node_modules/.bin/ts-node
import { readdirSync, rmSync } from "fs"
const folderName = "apps"

1
scripts/clean-cli-templates.ts Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!node_modules/.bin/ts-node
import { rmSync } from "fs"
const folderName = "packages"

1
scripts/clean-packages.ts Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!node_modules/.bin/ts-node
import { readdirSync, rmSync } from "fs"
const folderName = "packages"

37
scripts/publish.ts Executable file
View File

@@ -0,0 +1,37 @@
#!node_modules/.bin/ts-node
import compare from "semver/functions/compare"
import { execSync } from "child_process"
import contractsPkgJson from "@semaphore-protocol/contracts/package.json"
const { version: contractsLocalVersion } = contractsPkgJson
async function maybePushToSoldeer() {
// api not documented, may change, found by inspecting the network tab
const response = await fetch(
"https://api.soldeer.xyz/api/v1/revision?project_name=semaphore-protocol-contracts&limit=1"
)
const { data, status } = await response.json()
// fail status if no version published at all yet
if (status === "fail" || compare(contractsLocalVersion, data[0].version) === 1)
execSync(`soldeer push semaphore-protocol-contracts~${contractsLocalVersion} packages/contracts/contracts`, {
stdio: "inherit"
})
}
async function main() {
execSync(`yarn build:libraries`, { stdio: "inherit" })
execSync(`yarn clean:cli-templates`)
execSync(`yarn workspaces foreach -A --no-private npm publish --tolerate-republish --access public`, {
stdio: "inherit"
})
await maybePushToSoldeer()
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})

11
scripts/remove-stable-version-field.ts Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!node_modules/.bin/ts-node
import { readFileSync, readdirSync, writeFileSync } from "node:fs"
const folderName = "packages"
@@ -19,9 +20,7 @@ async function main() {
}
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
main().catch((error) => {
console.error(error)
process.exit(1)
})

25
scripts/version.ts Executable file
View File

@@ -0,0 +1,25 @@
#!node_modules/.bin/ts-node
import { execSync } from "child_process"
async function main() {
const version = process.argv[2]
// Perform the workspaces version update
execSync(`yarn workspaces foreach -A --no-private version -d ${version}`, { stdio: "inherit" })
// Apply the versions
execSync("yarn version apply --all", { stdio: "inherit" })
await import("./remove-stable-version-field")
execSync("yarn format:write")
execSync(`NO_HOOK=1 git commit -am 'chore: v${version}'`)
execSync(`git tag v${version}`)
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})

100
yarn.lock
View File

@@ -5389,8 +5389,8 @@ __metadata:
linkType: hard
"@nomicfoundation/hardhat-verify@npm:^2.0.8":
version: 2.0.8
resolution: "@nomicfoundation/hardhat-verify@npm:2.0.8"
version: 2.0.11
resolution: "@nomicfoundation/hardhat-verify@npm:2.0.11"
dependencies:
"@ethersproject/abi": "npm:^5.1.2"
"@ethersproject/address": "npm:^5.0.2"
@@ -5403,7 +5403,7 @@ __metadata:
undici: "npm:^5.14.0"
peerDependencies:
hardhat: ^2.0.4
checksum: 10/f49d6615a45d063e8d361ea2029c80c351d4377925de6c229095619384353d3fa9463751beceae0d6ceaf26f60a99797a19abd16ae22258fba37aee26ee5576e
checksum: 10/edad30efeb0ab7c26fd0c5fd3f1d161733d51276435f77d9c58edaa4307171be40e8c65a24a8fb11481e1032e4eb72ac99cd11c6eaa0bbfabb493455e387e2e9
languageName: node
linkType: hard
@@ -6268,10 +6268,10 @@ __metadata:
"@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0"
"@nomicfoundation/hardhat-toolbox": "npm:^4.0.0"
"@nomicfoundation/hardhat-verify": "npm:^2.0.0"
"@semaphore-protocol/contracts": "npm:4.0.0"
"@semaphore-protocol/core": "npm:4.0.0"
"@semaphore-protocol/hardhat": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/contracts": "npm:4.3.0"
"@semaphore-protocol/core": "npm:4.3.0"
"@semaphore-protocol/hardhat": "npm:4.3.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -6321,8 +6321,8 @@ __metadata:
resolution: "@semaphore-protocol/cli@workspace:packages/cli"
dependencies:
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/data": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/data": "npm:4.3.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@types/figlet": "npm:^1.5.8"
"@types/inquirer": "npm:^9.0.7"
"@types/pacote": "npm:^11.1.8"
@@ -6346,7 +6346,7 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/contracts@npm:4.0.0, @semaphore-protocol/contracts@workspace:packages/contracts/contracts":
"@semaphore-protocol/contracts@npm:4.3.0, @semaphore-protocol/contracts@workspace:packages/contracts/contracts":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/contracts@workspace:packages/contracts/contracts"
dependencies:
@@ -6354,23 +6354,23 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/core@npm:4.0.0, @semaphore-protocol/core@workspace:^, @semaphore-protocol/core@workspace:packages/core":
"@semaphore-protocol/core@npm:4.3.0, @semaphore-protocol/core@workspace:^, @semaphore-protocol/core@workspace:packages/core":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/core@workspace:packages/core"
dependencies:
"@semaphore-protocol/group": "npm:4.0.0"
"@semaphore-protocol/identity": "npm:4.0.0"
"@semaphore-protocol/proof": "npm:4.0.0"
"@semaphore-protocol/group": "npm:4.3.0"
"@semaphore-protocol/identity": "npm:4.3.0"
"@semaphore-protocol/proof": "npm:4.3.0"
languageName: unknown
linkType: soft
"@semaphore-protocol/data@npm:4.0.0, @semaphore-protocol/data@workspace:packages/data":
"@semaphore-protocol/data@npm:4.3.0, @semaphore-protocol/data@workspace:packages/data":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/data@workspace:packages/data"
dependencies:
"@rollup/plugin-json": "npm:^6.1.0"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.3.0"
axios: "npm:1.6.6"
ethers: "npm:6.11.0"
rimraf: "npm:^5.0.5"
@@ -6379,14 +6379,14 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/group@npm:4.0.0, @semaphore-protocol/group@workspace:packages/group":
"@semaphore-protocol/group@npm:4.3.0, @semaphore-protocol/group@workspace:packages/group":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/group@workspace:packages/group"
dependencies:
"@rollup/plugin-commonjs": "npm:^25.0.7"
"@rollup/plugin-node-resolve": "npm:^15.2.3"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@zk-kit/lean-imt": "npm:2.0.1"
"@zk-kit/lean-imt": "npm:2.1.0"
"@zk-kit/utils": "npm:1.0.0"
poseidon-lite: "npm:^0.2.0"
rimraf: "npm:^5.0.5"
@@ -6395,13 +6395,13 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/hardhat@npm:4.0.0, @semaphore-protocol/hardhat@workspace:packages/hardhat":
"@semaphore-protocol/hardhat@npm:4.3.0, @semaphore-protocol/hardhat@workspace:packages/hardhat":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/hardhat@workspace:packages/hardhat"
dependencies:
"@nomicfoundation/hardhat-ethers": "npm:^3.0.0"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/contracts": "npm:4.0.0"
"@semaphore-protocol/contracts": "npm:4.3.0"
ethers: "npm:^6.4.0"
hardhat: "npm:^2.19.4"
hardhat-dependency-compiler: "npm:^1.1.3"
@@ -6413,7 +6413,7 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/identity@npm:4.0.0, @semaphore-protocol/identity@workspace:packages/identity":
"@semaphore-protocol/identity@npm:4.3.0, @semaphore-protocol/identity@workspace:packages/identity":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/identity@workspace:packages/identity"
dependencies:
@@ -6431,14 +6431,14 @@ __metadata:
languageName: unknown
linkType: soft
"@semaphore-protocol/proof@npm:4.0.0, @semaphore-protocol/proof@workspace:packages/proof":
"@semaphore-protocol/proof@npm:4.3.0, @semaphore-protocol/proof@workspace:packages/proof":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/proof@workspace:packages/proof"
dependencies:
"@rollup/plugin-alias": "npm:^5.1.0"
"@rollup/plugin-json": "npm:^6.1.0"
"@rollup/plugin-typescript": "npm:^11.1.6"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@types/snarkjs": "npm:^0"
"@zk-kit/artifacts": "npm:1.8.0"
"@zk-kit/utils": "npm:1.0.0"
@@ -6449,12 +6449,12 @@ __metadata:
rollup-plugin-cleanup: "npm:^3.2.1"
snarkjs: "npm:0.7.4"
peerDependencies:
"@semaphore-protocol/group": 4.0.0
"@semaphore-protocol/identity": 4.0.0
"@semaphore-protocol/group": 4.3.0
"@semaphore-protocol/identity": 4.3.0
languageName: unknown
linkType: soft
"@semaphore-protocol/utils@npm:4.0.0, @semaphore-protocol/utils@workspace:packages/utils":
"@semaphore-protocol/utils@npm:4.3.0, @semaphore-protocol/utils@workspace:packages/utils":
version: 0.0.0-use.local
resolution: "@semaphore-protocol/utils@workspace:packages/utils"
dependencies:
@@ -7872,7 +7872,7 @@ __metadata:
languageName: node
linkType: hard
"@types/semver@npm:^7.3.12, @types/semver@npm:^7.5.8":
"@types/semver@npm:^7, @types/semver@npm:^7.3.12, @types/semver@npm:^7.5.8":
version: 7.5.8
resolution: "@types/semver@npm:7.5.8"
checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178
@@ -8544,12 +8544,12 @@ __metadata:
languageName: node
linkType: hard
"@zk-kit/lean-imt@npm:2.0.1":
version: 2.0.1
resolution: "@zk-kit/lean-imt@npm:2.0.1"
"@zk-kit/lean-imt@npm:2.1.0":
version: 2.1.0
resolution: "@zk-kit/lean-imt@npm:2.1.0"
dependencies:
"@zk-kit/utils": "npm:1.0.0"
checksum: 10/33d03a20c3ce6270036d4cc0a96100b4f6e17f373688595937d2a0863883562b648a768c11ab938fd83ed65d7a70b542db647e3d9e0b5e050c02efc5df0543ce
"@zk-kit/utils": "npm:1.2.0"
checksum: 10/897f88204c9ee548a2a977ef1efac8e4c0d2efdf284c88f759fdefd53b2c51a36b536130eb3241e68bd14e5039bcb8d6d788e7fca46fe442cfa3eceeb9c0eddf
languageName: node
linkType: hard
@@ -20135,10 +20135,10 @@ __metadata:
"@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0"
"@nomicfoundation/hardhat-toolbox": "npm:^4.0.0"
"@nomicfoundation/hardhat-verify": "npm:^2.0.0"
"@semaphore-protocol/contracts": "npm:4.0.0"
"@semaphore-protocol/core": "npm:4.0.0"
"@semaphore-protocol/hardhat": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/contracts": "npm:4.3.0"
"@semaphore-protocol/core": "npm:4.3.0"
"@semaphore-protocol/hardhat": "npm:4.3.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -20171,9 +20171,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "monorepo-ethers-web-app@workspace:packages/cli-template-monorepo-ethers/apps/web-app"
dependencies:
"@semaphore-protocol/core": "npm:4.0.0"
"@semaphore-protocol/data": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/core": "npm:4.3.0"
"@semaphore-protocol/data": "npm:4.3.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -20198,10 +20198,10 @@ __metadata:
"@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0"
"@nomicfoundation/hardhat-toolbox": "npm:^4.0.0"
"@nomicfoundation/hardhat-verify": "npm:^2.0.0"
"@semaphore-protocol/contracts": "npm:4.0.0"
"@semaphore-protocol/core": "npm:4.0.0"
"@semaphore-protocol/hardhat": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/contracts": "npm:4.3.0"
"@semaphore-protocol/core": "npm:4.3.0"
"@semaphore-protocol/hardhat": "npm:4.3.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@typechain/ethers-v6": "npm:^0.5.0"
"@typechain/hardhat": "npm:^9.0.0"
"@types/chai": "npm:^4.2.0"
@@ -20234,9 +20234,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "monorepo-subgraph-web-app@workspace:packages/cli-template-monorepo-subgraph/apps/web-app"
dependencies:
"@semaphore-protocol/core": "npm:4.0.0"
"@semaphore-protocol/data": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/core": "npm:4.3.0"
"@semaphore-protocol/data": "npm:4.3.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -24650,7 +24650,7 @@ __metadata:
"@docusaurus/preset-classic": "npm:3.1.1"
"@docusaurus/tsconfig": "npm:3.1.1"
"@mdx-js/react": "npm:^3.0.0"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/utils": "npm:4.3.0"
"@svgr/webpack": "npm:^5.5.0"
"@types/react": "npm:^18.2.29"
clsx: "npm:^1.2.1"
@@ -24679,6 +24679,7 @@ __metadata:
"@types/glob": "npm:^7.2.0"
"@types/jest": "npm:^29.5.12"
"@types/node": "npm:^20"
"@types/semver": "npm:^7"
"@typescript-eslint/eslint-plugin": "npm:^7.0.2"
"@typescript-eslint/parser": "npm:^7.0.2"
changelogithub: "npm:0.12.7"
@@ -24700,6 +24701,7 @@ __metadata:
lint-staged: "npm:^15.2.2"
prettier: "npm:^3.2.5"
rimraf: "npm:^5.0.5"
semver: "npm:^7.6.2"
snarkjs: "npm:0.7.4"
ts-jest: "npm:^29.1.2"
ts-node: "npm:^10.9.2"
@@ -24715,7 +24717,7 @@ __metadata:
dependencies:
"@graphprotocol/graph-cli": "npm:0.78.0"
"@graphprotocol/graph-ts": "npm:0.35.1"
"@semaphore-protocol/utils": "npm:4.0.0"
"@semaphore-protocol/utils": "workspace:packages/utils"
"@types/mustache": "npm:^4.2.2"
matchstick-as: "npm:0.5.0"
mustache: "npm:^4.2.0"
@@ -24804,7 +24806,7 @@ __metadata:
languageName: node
linkType: hard
"semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0":
"semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2":
version: 7.6.2
resolution: "semver@npm:7.6.2"
bin: