Skip to content

Commit c795ddc

Browse files
authored
Merge pull request #732 from semaphore-protocol/fix/group-checks
Add checks for removed members Former-commit-id: 2faac4e
2 parents 764ff52 + 2b7dbf3 commit c795ddc

File tree

12 files changed

+32391
-9
lines changed

12 files changed

+32391
-9
lines changed

.yarn/releases/yarn-4.1.0.cjs

+893
Large diffs are not rendered by default.

.yarn/releases/yarn-4.1.0.cjs.REMOVED.git-id

-1
This file was deleted.

packages/cli-template-contracts-hardhat/.yarn/releases/yarn-4.1.0.cjs

+893
Large diffs are not rendered by default.

packages/cli-template-contracts-hardhat/.yarn/releases/yarn-4.1.0.cjs.REMOVED.git-id

-1
This file was deleted.

packages/cli-template-monorepo-ethers/.yarn/releases/yarn-4.1.0.cjs

+893
Large diffs are not rendered by default.

packages/cli-template-monorepo-ethers/.yarn/releases/yarn-4.1.0.cjs.REMOVED.git-id

-1
This file was deleted.

packages/cli-template-monorepo-subgraph/.yarn/releases/yarn-4.1.0.cjs

+893
Large diffs are not rendered by default.

packages/cli-template-monorepo-subgraph/.yarn/releases/yarn-4.1.0.cjs.REMOVED.git-id

-1
This file was deleted.

packages/group/src/index.ts

+21-3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ export class Group {
7272
* @param member The new member to be added.
7373
*/
7474
public addMember(member: BigNumber) {
75+
if (member === 0n || member === "0") {
76+
throw new Error("Failed to add member: value cannot be 0")
77+
}
78+
7579
this.leanIMT.insert(BigInt(member))
7680
}
7781

@@ -80,6 +84,12 @@ export class Group {
8084
* @param members New members.
8185
*/
8286
public addMembers(members: BigNumber[]) {
87+
for (const member of members) {
88+
if (member === 0n || member === "0") {
89+
throw new Error("Failed to add member: value cannot be 0")
90+
}
91+
}
92+
8393
this.leanIMT.insertMany(members.map(BigInt))
8494
}
8595

@@ -89,6 +99,10 @@ export class Group {
8999
* @param member New member value.
90100
*/
91101
public updateMember(index: number, member: BigNumber) {
102+
if (this.members[index] === 0n) {
103+
throw new Error("Failed to update member: it has been removed")
104+
}
105+
92106
this.leanIMT.update(index, BigInt(member))
93107
}
94108

@@ -97,16 +111,20 @@ export class Group {
97111
* @param index The index of the member to be removed.
98112
*/
99113
public removeMember(index: number) {
100-
this.leanIMT.update(index, BigInt(0))
114+
if (this.members[index] === 0n) {
115+
throw new Error("Failed to remove member: it has already been removed")
116+
}
117+
118+
this.leanIMT.update(index, 0n)
101119
}
102120

103121
/**
104122
* Creates a proof of membership for a member of the group.
105123
* @param index The index of the member.
106124
* @returns The {@link MerkleProof} object.
107125
*/
108-
public generateMerkleProof(_index: number): LeanIMTMerkleProof {
109-
return this.leanIMT.generateProof(_index)
126+
public generateMerkleProof(index: number): LeanIMTMerkleProof {
127+
return this.leanIMT.generateProof(index)
110128
}
111129

112130
/**

packages/group/tests/index.test.ts

+36-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ describe("Group", () => {
3333

3434
expect(group.size).toBe(1)
3535
})
36+
37+
it("Should not add a member to a group if its value is 0", () => {
38+
const group = new Group()
39+
40+
const fun = () => group.addMember(0n)
41+
42+
expect(fun).toThrow("Failed to add member: value cannot be 0")
43+
})
3644
})
3745

3846
describe("# addMembers", () => {
@@ -43,6 +51,14 @@ describe("Group", () => {
4351

4452
expect(group.size).toBe(2)
4553
})
54+
55+
it("Should not add many members to a group if any value is 0", () => {
56+
const group = new Group()
57+
58+
const fun = () => group.addMembers([1n, 0n])
59+
60+
expect(fun).toThrow("Failed to add member: value cannot be 0")
61+
})
4662
})
4763

4864
describe("# indexOf", () => {
@@ -66,6 +82,16 @@ describe("Group", () => {
6682
expect(group.size).toBe(2)
6783
expect(group.members[0]).toBe(1n)
6884
})
85+
86+
it("Should not update a member in a group if it has previously been removed", () => {
87+
const group = new Group()
88+
group.addMembers([1n, 3n])
89+
group.removeMember(0)
90+
91+
const fun = () => group.updateMember(0, 1n)
92+
93+
expect(fun).toThrow("Failed to update member: it has been removed")
94+
})
6995
})
7096

7197
describe("# removeMember", () => {
@@ -78,12 +104,21 @@ describe("Group", () => {
78104
expect(group.size).toBe(2)
79105
expect(group.members[0]).toBe(0n)
80106
})
107+
108+
it("Should not remove a member from a group if it has already been removed", () => {
109+
const group = new Group()
110+
group.addMembers([1n, 3n])
111+
group.removeMember(0)
112+
113+
const fun = () => group.removeMember(0)
114+
115+
expect(fun).toThrow("Failed to remove member: it has already been removed")
116+
})
81117
})
82118

83119
describe("# generateMerkleProof", () => {
84120
it("Should generate a proof of membership", () => {
85121
const group = new Group()
86-
87122
group.addMembers([1n, 3n])
88123

89124
const proof = group.generateMerkleProof(0)

0 commit comments

Comments
 (0)