Skip to content

Commit

Permalink
fix: use merkleTreeSize instead of merkleTreeDepth to support groups …
Browse files Browse the repository at this point in the history
…with one member
  • Loading branch information
0xjei authored and cedoor committed Jan 12, 2024
1 parent ac26789 commit 5e7cd26
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
4 changes: 2 additions & 2 deletions packages/contracts/contracts/Semaphore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
38 changes: 37 additions & 1 deletion packages/contracts/test/Semaphore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 5e7cd26

Please sign in to comment.