From 7b447f9f638733686fb52300218724cd6fb29f70 Mon Sep 17 00:00:00 2001 From: cedoor Date: Mon, 22 Jan 2024 12:29:33 +0000 Subject: [PATCH] fix: adjust cli and data packages --- packages/cli/package.json | 2 +- packages/cli/src/index.ts | 6 +- packages/data/src/ethers.ts | 36 ++-- packages/data/src/getEvents.ts | 4 +- packages/data/src/getURL.ts | 2 +- packages/data/src/semaphoreABI.json | 239 +++++++++++++++++++++------ packages/data/src/subgraph.ts | 5 +- packages/data/src/types/index.ts | 2 +- packages/data/tests/ethers.test.ts | 2 +- packages/data/tests/subgraph.test.ts | 20 +-- 10 files changed, 230 insertions(+), 88 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 8dfb5ae56..0b15f7565 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -23,7 +23,7 @@ "node": ">=14.16" }, "scripts": { - "start": "ts-node --esm src/index.ts", + "start": "node --loader ts-node/esm --no-warnings src/index.ts", "build:watch": "rollup -c rollup.config.ts -w --configPlugin typescript", "build": "rimraf dist && rollup -c rollup.config.ts --configPlugin typescript", "prepublishOnly": "yarn build" diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index c2a2ae0b6..d4ab0bfbc 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,11 +1,11 @@ import { GroupResponse, SemaphoreEthers, SemaphoreSubgraph, getSupportedNetworks } from "@semaphore-protocol/data" import chalk from "chalk" import { program } from "commander" +import decompress from "decompress" import figlet from "figlet" -import { existsSync, readFileSync, unlinkSync, copyFileSync } from "fs" +import { copyFileSync, existsSync, readFileSync, unlinkSync } from "fs" import logSymbols from "log-symbols" import pacote from "pacote" -import decompress from "decompress" import { dirname } from "path" import { fileURLToPath } from "url" import checkLatestVersion from "./checkLatestVersion.js" @@ -209,7 +209,7 @@ program content += ` ${chalk.bold("Merkle tree")}:\n` content += ` Root: ${group.merkleTree.root}\n` content += ` Depth: ${group.merkleTree.depth}\n` - content += ` Number of leaves: ${group.merkleTree.numberOfLeaves}` + content += ` Size: ${group.merkleTree.size}` console.info(`\n${content}\n`) }) diff --git a/packages/data/src/ethers.ts b/packages/data/src/ethers.ts index d1149ecd1..4867f6114 100644 --- a/packages/data/src/ethers.ts +++ b/packages/data/src/ethers.ts @@ -55,8 +55,8 @@ export default class SemaphoreEthers { options.startBlock ??= 33995010 break case "sepolia": - options.address ??= "0x3889927F0B5Eb1a02C6E2C20b39a1Bd4EAd76131" - options.startBlock ??= 3231111 + options.address ??= "0x021dC8BF0eADd9C128490A976756C1b052edF99d" + options.startBlock ??= 5108003 break case "optimism-sepolia": options.address ??= "0x3889927F0B5Eb1a02C6E2C20b39a1Bd4EAd76131" @@ -154,13 +154,13 @@ export default class SemaphoreEthers { const merkleTreeRoot = await this._contract.getMerkleTreeRoot(groupId) const merkleTreeDepth = await this._contract.getMerkleTreeDepth(groupId) - const numberOfLeaves = await this._contract.getNumberOfMerkleTreeLeaves(groupId) + const merkleTreeSize = await this._contract.getMerkleTreeSize(groupId) const group: GroupResponse = { id: groupId, merkleTree: { - depth: merkleTreeDepth.toNumber(), - numberOfLeaves: numberOfLeaves.toNumber(), + depth: Number(merkleTreeDepth), + size: Number(merkleTreeSize), root: merkleTreeRoot.toString() } } @@ -187,7 +187,7 @@ export default class SemaphoreEthers { throw new Error(`Group '${groupId}' not found`) } - return groupAdminUpdatedEvents[groupAdminUpdatedEvents.length - 1].newAdmin.toString() + return groupAdminUpdatedEvents[groupAdminUpdatedEvents.length - 1][2] } /** @@ -218,11 +218,11 @@ export default class SemaphoreEthers { ) const memberUpdatedEventsMap = new Map() - for (const { blockNumber, index, newIdentityCommitment } of memberUpdatedEvents) { + for (const [, index, , newIdentityCommitment, , blockNumber] of memberUpdatedEvents) { memberUpdatedEventsMap.set(index.toString(), [blockNumber, newIdentityCommitment.toString()]) } - for (const { blockNumber, index } of memberRemovedEvents) { + for (const [, index, , , blockNumber] of memberRemovedEvents) { const groupUpdate = memberUpdatedEventsMap.get(index.toString()) if (!groupUpdate || (groupUpdate && groupUpdate[0] < blockNumber)) { @@ -234,7 +234,7 @@ export default class SemaphoreEthers { const membersAddedEventsMap = new Map() - for (const { startIndex, identityCommitments } of membersAddedEvents) { + for (const [, startIndex, identityCommitments] of membersAddedEvents) { membersAddedEventsMap.set( startIndex.toString(), identityCommitments.map((i: any) => i.toString()) @@ -245,11 +245,11 @@ export default class SemaphoreEthers { const members: string[] = [] - const numberOfLeaves = await this._contract.getNumberOfMerkleTreeLeaves(groupId) + const merkleTreeSize = await this._contract.getMerkleTreeSize(groupId) let i = 0 - while (i < numberOfLeaves.toNumber()) { + while (i < Number(merkleTreeSize)) { const identityCommitments = membersAddedEventsMap.get(i.toString()) if (identityCommitments) { @@ -257,7 +257,7 @@ export default class SemaphoreEthers { i += identityCommitments.length } else { - members.push(memberAddedEvents[i].identityCommitment) + members.push(memberAddedEvents[i][2]) i += 1 } @@ -296,12 +296,12 @@ export default class SemaphoreEthers { ) return proofValidatedEvents.map((event) => ({ - message: event.message.toString(), - merkleTreeDepth: event.merkleTreeDepth.toString(), - merkleTreeRoot: event.merkleTreeRoot.toString(), - scope: event.scope.toString(), - nullifier: event.nullifier.toString(), - proof: event.proof.map((p: any) => p.toString()) + merkleTreeDepth: Number(event[1]), + merkleTreeRoot: event[2].toString(), + nullifier: event[3].toString(), + message: event[4].toString(), + scope: event[5].toString(), + proof: event[6].map((p: any) => p.toString()) })) } diff --git a/packages/data/src/getEvents.ts b/packages/data/src/getEvents.ts index 8b7437563..a29798057 100644 --- a/packages/data/src/getEvents.ts +++ b/packages/data/src/getEvents.ts @@ -14,9 +14,9 @@ export default async function getEvents( eventName: string, filterArgs: any[] = [], startBlock: number = 0 -): Promise { +): Promise { const filter = contract.filters[eventName](...filterArgs) const events = (await contract.queryFilter(filter, startBlock)) as EventLog[] - return events.map(({ args, blockNumber }) => ({ ...args, blockNumber })) + return events.map(({ args, blockNumber }) => [...args, blockNumber]) } diff --git a/packages/data/src/getURL.ts b/packages/data/src/getURL.ts index dbd36ec2a..876612b54 100644 --- a/packages/data/src/getURL.ts +++ b/packages/data/src/getURL.ts @@ -12,7 +12,7 @@ export default function getURL(supportedNetwork: SupportedNetwork | string): str case "optimism-sepolia": case "arbitrum-sepolia": case "arbitrum": - return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v4.0.0-alpha.1` + return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v4.0.0-alpha.2` default: throw new TypeError(`Network '${supportedNetwork}' is not supported`) } diff --git a/packages/data/src/semaphoreABI.json b/packages/data/src/semaphoreABI.json index 8e427a541..80cd80dcb 100644 --- a/packages/data/src/semaphoreABI.json +++ b/packages/data/src/semaphoreABI.json @@ -10,6 +10,26 @@ "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", @@ -25,6 +45,16 @@ "name": "Semaphore__GroupDoesNotExist", "type": "error" }, + { + "inputs": [], + "name": "Semaphore__GroupHasNoMembers", + "type": "error" + }, + { + "inputs": [], + "name": "Semaphore__InvalidProof", + "type": "error" + }, { "inputs": [], "name": "Semaphore__MerkleTreeDepthIsNotSupported", @@ -45,6 +75,11 @@ "name": "Semaphore__YouAreUsingTheSameNullifierTwice", "type": "error" }, + { + "inputs": [], + "name": "WrongSiblingNodes", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -78,18 +113,6 @@ "internalType": "uint256", "name": "groupId", "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "merkleTreeDepth", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "zeroValue", - "type": "uint256" } ], "name": "GroupCreated", @@ -229,31 +252,74 @@ "type": "uint256" }, { - "indexed": true, + "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": "externalNullifier", + "name": "merkleTreeRoot", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "nullifierHash", + "name": "nullifier", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "signal", + "name": "message", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scope", "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[8]", + "name": "proof", + "type": "uint256[8]" } ], - "name": "ProofVerified", + "name": "ProofValidated", "type": "event" }, { @@ -299,11 +365,6 @@ "name": "groupId", "type": "uint256" }, - { - "internalType": "uint256", - "name": "merkleTreeDepth", - "type": "uint256" - }, { "internalType": "address", "name": "admin", @@ -327,11 +388,6 @@ "name": "groupId", "type": "uint256" }, - { - "internalType": "uint256", - "name": "merkleTreeDepth", - "type": "uint256" - }, { "internalType": "address", "name": "admin", @@ -389,7 +445,7 @@ "type": "uint256" } ], - "name": "getNumberOfMerkleTreeLeaves", + "name": "getMerkleTreeSize", "outputs": [ { "internalType": "uint256", @@ -411,13 +467,56 @@ "name": "groups", "outputs": [ { - "internalType": "address", - "name": "admin", - "type": "address" + "internalType": "uint256", + "name": "merkleTreeDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "groupId", + "type": "uint256" }, { "internalType": "uint256", - "name": "merkleTreeDuration", + "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" } ], @@ -438,13 +537,8 @@ }, { "internalType": "uint256[]", - "name": "proofSiblings", + "name": "merkleProofSiblings", "type": "uint256[]" - }, - { - "internalType": "uint8[]", - "name": "proofPathIndices", - "type": "uint8[]" } ], "name": "removeMember", @@ -507,16 +601,54 @@ }, { "internalType": "uint256[]", - "name": "proofSiblings", + "name": "merkleProofSiblings", "type": "uint256[]" + } + ], + "name": "updateMember", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "groupId", + "type": "uint256" + }, + { + "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": "uint8[]", - "name": "proofPathIndices", - "type": "uint8[]" + "internalType": "uint256[8]", + "name": "proof", + "type": "uint256[8]" } ], - "name": "updateMember", + "name": "validateProof", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -541,6 +673,11 @@ "name": "groupId", "type": "uint256" }, + { + "internalType": "uint256", + "name": "merkleTreeDepth", + "type": "uint256" + }, { "internalType": "uint256", "name": "merkleTreeRoot", @@ -548,17 +685,17 @@ }, { "internalType": "uint256", - "name": "signal", + "name": "nullifier", "type": "uint256" }, { "internalType": "uint256", - "name": "nullifierHash", + "name": "message", "type": "uint256" }, { "internalType": "uint256", - "name": "externalNullifier", + "name": "scope", "type": "uint256" }, { @@ -568,8 +705,14 @@ } ], "name": "verifyProof", - "outputs": [], - "stateMutability": "nonpayable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", "type": "function" } ] diff --git a/packages/data/src/subgraph.ts b/packages/data/src/subgraph.ts index 46a574b19..2c61a1c1e 100644 --- a/packages/data/src/subgraph.ts +++ b/packages/data/src/subgraph.ts @@ -102,7 +102,7 @@ export default class SemaphoreSubgraph { merkleTree { root depth - numberOfLeaves + size } admin ${ @@ -165,8 +165,7 @@ export default class SemaphoreSubgraph { merkleTree { root depth - zeroValue - numberOfLeaves + size } admin ${ diff --git a/packages/data/src/types/index.ts b/packages/data/src/types/index.ts index 9245ad860..7b64df33c 100644 --- a/packages/data/src/types/index.ts +++ b/packages/data/src/types/index.ts @@ -34,7 +34,7 @@ export type GroupResponse = { merkleTree: { root: string depth: number - numberOfLeaves: number + size: number } admin?: string members?: string[] diff --git a/packages/data/tests/ethers.test.ts b/packages/data/tests/ethers.test.ts index ef28456d3..2cf00fe32 100644 --- a/packages/data/tests/ethers.test.ts +++ b/packages/data/tests/ethers.test.ts @@ -140,7 +140,7 @@ describe("SemaphoreEthers", () => { expect(group.merkleTree.depth).toBe(3) expect(group.merkleTree.root).toBe("222") - expect(group.merkleTree.numberOfLeaves).toBe(8) + expect(group.merkleTree.size).toBe(8) }) it("Should throw an error if the group does not exist", async () => { diff --git a/packages/data/tests/subgraph.test.ts b/packages/data/tests/subgraph.test.ts index 6d4772b2e..e5f399c72 100644 --- a/packages/data/tests/subgraph.test.ts +++ b/packages/data/tests/subgraph.test.ts @@ -72,7 +72,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286" @@ -89,7 +89,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286" @@ -110,7 +110,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286", @@ -158,7 +158,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286", @@ -194,7 +194,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286" @@ -216,7 +216,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286" @@ -233,7 +233,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286" @@ -249,7 +249,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286" @@ -270,7 +270,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286", @@ -317,7 +317,7 @@ describe("SemaphoreSubgraph", () => { id: "1", merkleTree: { depth: 20, - numberOfLeaves: 2, + size: 2, root: "2" }, admin: "0x7bcd6f009471e9974a77086a69289d16eadba286",