@@ -11,16 +11,13 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
11
11
/// @dev Gets a tree depth and returns its verifier address.
12
12
mapping (uint256 => IVerifier) public verifiers;
13
13
14
- /// @dev Gets a group id and returns the group admin address.
15
- mapping (uint256 => address ) public groupAdmins;
16
-
17
- /// @dev Gets a group id and returns data to check if a Merkle root is expired.
18
- mapping (uint256 => MerkleTreeExpiry) public merkleTreeExpiries;
14
+ /// @dev Gets a group id and returns the group parameters.
15
+ mapping (uint256 => Group) public groups;
19
16
20
17
/// @dev Checks if the group admin is the transaction sender.
21
18
/// @param groupId: Id of the group.
22
19
modifier onlyGroupAdmin (uint256 groupId ) {
23
- if (groupAdmins [groupId] != _msgSender ()) {
20
+ if (groups [groupId].admin != _msgSender ()) {
24
21
revert Semaphore__CallerIsNotTheGroupAdmin ();
25
22
}
26
23
_;
@@ -56,8 +53,8 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
56
53
) external override onlySupportedMerkleTreeDepth (merkleTreeDepth) {
57
54
_createGroup (groupId, merkleTreeDepth, zeroValue);
58
55
59
- groupAdmins [groupId] = admin;
60
- merkleTreeExpiries [groupId].rootDuration = 1 hours ;
56
+ groups [groupId].admin = admin;
57
+ groups [groupId].merkleRootDuration = 1 hours ;
61
58
62
59
emit GroupAdminUpdated (groupId, address (0 ), admin);
63
60
}
@@ -72,15 +69,15 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
72
69
) external override onlySupportedMerkleTreeDepth (merkleTreeDepth) {
73
70
_createGroup (groupId, merkleTreeDepth, zeroValue);
74
71
75
- groupAdmins [groupId] = admin;
76
- merkleTreeExpiries [groupId].rootDuration = merkleTreeRootDuration;
72
+ groups [groupId].admin = admin;
73
+ groups [groupId].merkleRootDuration = merkleTreeRootDuration;
77
74
78
75
emit GroupAdminUpdated (groupId, address (0 ), admin);
79
76
}
80
77
81
78
/// @dev See {ISemaphore-updateGroupAdmin}.
82
79
function updateGroupAdmin (uint256 groupId , address newAdmin ) external override onlyGroupAdmin (groupId) {
83
- groupAdmins [groupId] = newAdmin;
80
+ groups [groupId].admin = newAdmin;
84
81
85
82
emit GroupAdminUpdated (groupId, _msgSender (), newAdmin);
86
83
}
@@ -91,7 +88,7 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
91
88
92
89
uint256 merkleTreeRoot = getMerkleTreeRoot (groupId);
93
90
94
- merkleTreeExpiries [groupId].rootCreationDates [merkleTreeRoot] = block .timestamp ;
91
+ groups [groupId].merkleRootCreationDates [merkleTreeRoot] = block .timestamp ;
95
92
}
96
93
97
94
/// @dev See {ISemaphore-addMembers}.
@@ -110,7 +107,7 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
110
107
111
108
uint256 merkleTreeRoot = getMerkleTreeRoot (groupId);
112
109
113
- merkleTreeExpiries [groupId].rootCreationDates [merkleTreeRoot] = block .timestamp ;
110
+ groups [groupId].merkleRootCreationDates [merkleTreeRoot] = block .timestamp ;
114
111
}
115
112
116
113
/// @dev See {ISemaphore-updateMember}.
@@ -150,25 +147,29 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
150
147
}
151
148
152
149
if (merkleTreeRoot != currentMerkleTreeRoot) {
153
- uint256 rootCreationDate = merkleTreeExpiries [groupId].rootCreationDates [merkleTreeRoot];
154
- uint256 rootDuration = merkleTreeExpiries [groupId].rootDuration ;
150
+ uint256 merkleRootCreationDate = groups [groupId].merkleRootCreationDates [merkleTreeRoot];
151
+ uint256 merkleRootDuration = groups [groupId].merkleRootDuration ;
155
152
156
- if (rootCreationDate == 0 ) {
153
+ if (merkleRootCreationDate == 0 ) {
157
154
revert Semaphore__MerkleTreeRootIsNotPartOfTheGroup ();
158
155
}
159
156
160
- if (block .timestamp > rootCreationDate + rootDuration ) {
157
+ if (block .timestamp > merkleRootCreationDate + merkleRootDuration ) {
161
158
revert Semaphore__MerkleTreeRootIsExpired ();
162
159
}
163
160
}
164
161
162
+ if (groups[groupId].nullifierHashes[nullifierHash]) {
163
+ revert Semaphore__YouAreUsingTheSameNillifierTwice ();
164
+ }
165
+
165
166
uint256 merkleTreeDepth = getMerkleTreeDepth (groupId);
166
167
167
168
IVerifier verifier = verifiers[merkleTreeDepth];
168
169
169
170
_verifyProof (signal, merkleTreeRoot, nullifierHash, externalNullifier, proof, verifier);
170
171
171
- _saveNullifierHash ( uint256 ( keccak256 ( abi.encodePacked ( groupId, nullifierHash)))) ;
172
+ groups[ groupId].nullifierHashes[ nullifierHash] = true ;
172
173
173
174
emit ProofVerified (groupId, merkleTreeRoot, nullifierHash, externalNullifier, signal);
174
175
}
0 commit comments