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,