From 5e7cd2693ce46b5064babc1d687b641f1b3754ae Mon Sep 17 00:00:00 2001 From: Jeeiii <giacomo.corrias7@gmail.com> Date: Tue, 9 Jan 2024 10:30:50 +0100 Subject: [PATCH] fix: use merkleTreeSize instead of merkleTreeDepth to support groups with one member --- packages/contracts/contracts/Semaphore.sol | 4 +-- packages/contracts/test/Semaphore.ts | 38 +++++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/contracts/contracts/Semaphore.sol b/packages/contracts/contracts/Semaphore.sol index 6fbb0df86..42547ca20 100644 --- a/packages/contracts/contracts/Semaphore.sol +++ b/packages/contracts/contracts/Semaphore.sol @@ -109,9 +109,9 @@ contract Semaphore is ISemaphore, SemaphoreGroups { uint256 scope, uint256[8] calldata proof ) external override onlyExistingGroup(groupId) { - uint256 merkleTreeDepth = getMerkleTreeDepth(groupId); + uint256 merkleTreeSize = getMerkleTreeSize(groupId); - if (merkleTreeDepth == 0) { + if (merkleTreeSize == 0) { revert Semaphore__GroupHasNoMembers(); } diff --git a/packages/contracts/test/Semaphore.ts b/packages/contracts/test/Semaphore.ts index b875ddf9f..f1eea7c10 100644 --- a/packages/contracts/test/Semaphore.ts +++ b/packages/contracts/test/Semaphore.ts @@ -208,17 +208,31 @@ describe("Semaphore", () => { describe("# verifyProof", () => { const message = 2 const identity = new Identity("0") + const groupOneMemberId = 6 const group = new Group() + const groupOneMember = new Group() group.addMembers(members) + groupOneMember.addMember(members[0]) let fullProof: SemaphoreProof + let fullProofOneMember: SemaphoreProof before(async () => { + await semaphoreContract["createGroup(uint256,address)"](groupOneMemberId, accounts[0]) + await semaphoreContract.addMembers(groupId, [members[1], members[2]]) + await semaphoreContract.addMember(groupOneMemberId, members[0]) fullProof = await generateProof(identity, group, message, group.root as string, 10) + fullProofOneMember = await generateProof( + identity, + groupOneMember, + message, + groupOneMember.root as string, + 10 + ) }) it("Should not verify a proof if the group does not exist", async () => { @@ -249,7 +263,29 @@ describe("Semaphore", () => { await expect(transaction).to.be.revertedWithCustomError(semaphoreContract, "Semaphore__InvalidProof") }) - it("Should verify a proof for an onchain group correctly", async () => { + it("Should verify a proof for an onchain group with one member correctly", async () => { + const transaction = semaphoreContract.verifyProof( + groupOneMemberId, + fullProofOneMember.merkleRoot, + fullProofOneMember.nullifier, + fullProofOneMember.message, + fullProofOneMember.merkleRoot, + fullProofOneMember.proof + ) + + await expect(transaction) + .to.emit(semaphoreContract, "ProofVerified") + .withArgs( + groupOneMemberId, + fullProofOneMember.merkleRoot, + fullProofOneMember.nullifier, + fullProofOneMember.message, + fullProofOneMember.merkleRoot, + fullProofOneMember.proof + ) + }) + + it("Should verify a proof for an onchain group with more than one member correctly", async () => { const transaction = semaphoreContract.verifyProof( groupId, fullProof.merkleRoot,