@@ -66,9 +66,10 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
66
66
require (assessment.start != 0 , InvalidClaimId ());
67
67
68
68
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
69
- require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
69
+ uint256 assessorGroupLength = assessorGroup.length ();
70
+ require (assessorGroupLength > 0 , EmptyAssessorGroup ());
70
71
71
- (accepts, denies) = _getVoteTally (assessment, assessorGroup);
72
+ (accepts, denies) = _getVoteTally (assessment, assessorGroup, assessorGroupLength );
72
73
73
74
return (assessment.start, assessment.end, accepts, denies);
74
75
}
@@ -97,11 +98,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
97
98
Assessment storage assessment = _assessments[claimId];
98
99
require (assessment.start != 0 , InvalidClaimId ());
99
100
100
- // Check if the assessment has been decided (has votes, not a draw and voting period has ended)
101
101
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
102
- require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
102
+ uint256 assessorGroupLength = assessorGroup.length ();
103
+ require (assessorGroupLength > 0 , EmptyAssessorGroup ());
103
104
104
- (uint256 acceptCount , uint256 denyCount ) = _getVoteTally (assessment, assessorGroup);
105
+ (uint256 acceptCount , uint256 denyCount ) = _getVoteTally (assessment, assessorGroup, assessorGroupLength );
105
106
require (_isAssessmentDecided (acceptCount, denyCount, assessment), ClaimAssessmentNotFinished ());
106
107
107
108
return acceptCount > denyCount;
@@ -118,9 +119,10 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
118
119
require (assessment.start != 0 , InvalidClaimId ());
119
120
120
121
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
121
- require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
122
+ uint256 assessorGroupLength = assessorGroup.length ();
123
+ require (assessorGroupLength > 0 , EmptyAssessorGroup ());
122
124
123
- (uint256 acceptCount , uint256 denyCount ) = _getVoteTally (assessment, assessorGroup);
125
+ (uint256 acceptCount , uint256 denyCount ) = _getVoteTally (assessment, assessorGroup, assessorGroupLength );
124
126
125
127
return _isAssessmentDecided (acceptCount, denyCount, assessment);
126
128
}
@@ -131,13 +133,15 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
131
133
/// @return denyCount Number of assessors who voted to deny the claim
132
134
/// @dev This function considers only votes from current assessors in the group
133
135
function getVoteTally (bytes32 claimId ) external view returns (uint256 acceptCount , uint256 denyCount ) {
136
+
134
137
Assessment storage assessment = _assessments[claimId];
135
138
require (assessment.start != 0 , InvalidClaimId ());
136
139
137
140
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
138
- require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
141
+ uint256 assessorGroupLength = assessorGroup.length ();
142
+ require (assessorGroupLength > 0 , EmptyAssessorGroup ());
139
143
140
- return _getVoteTally (assessment, assessorGroup);
144
+ return _getVoteTally (assessment, assessorGroup, assessorGroupLength );
141
145
}
142
146
143
147
/* === MUTATIVE FUNCTIONS ==== */
@@ -148,17 +152,18 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
148
152
/// @dev Only callable by internal contracts
149
153
/// @dev Reverts if an assessment already exists for the given claimId
150
154
function startAssessment (bytes32 claimId , uint16 productTypeId ) external onlyInternal {
151
- // TODO: call CoverProduct to validate productTypeId?
152
155
153
156
Assessment storage assessment = _assessments[claimId];
154
157
require (assessment.start == 0 , AssessmentAlreadyExists ());
155
158
159
+ // TODO: call CoverProduct to validate productTypeId?
156
160
AssessmentData storage assessmentData = _assessmentData[productTypeId];
157
161
require (assessmentData.assessingGroupId != 0 , InvalidProductType ());
158
162
159
- assessment.start = uint32 (block .timestamp );
160
- assessment.end = uint32 (block .timestamp + MIN_VOTING_PERIOD);
161
- assessment.assessorGroupId = _assessmentData[productTypeId].assessingGroupId;
163
+ uint32 currentTime = block .timestamp .toUint32 ();
164
+ assessment.start = currentTime;
165
+ assessment.end = (currentTime + MIN_VOTING_PERIOD).toUint32 ();
166
+ assessment.assessorGroupId = assessmentData.assessingGroupId;
162
167
// all votes in assessment.ballot are initialized to NONE (0) by default
163
168
164
169
emit AssessmentStarted (claimId, assessment.assessorGroupId, assessment.start, assessment.end);
@@ -176,10 +181,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
176
181
// Validate assessor and get assessment data
177
182
(uint256 assessorMemberId , Assessment storage assessment ) = _validateAssessor (claimId, msg .sender );
178
183
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
179
- require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
184
+ uint256 assessorGroupLength = assessorGroup.length ();
185
+ require (assessorGroupLength > 0 , EmptyAssessorGroup ());
180
186
181
187
// Only allow voting if the poll is not yet decided (no votes, a draw or voting period hasn't ended)
182
- (uint256 acceptCount , uint256 denyCount ) = _getVoteTally (assessment, assessorGroup);
188
+ (uint256 acceptCount , uint256 denyCount ) = _getVoteTally (assessment, assessorGroup, assessorGroupLength );
183
189
require (! _isAssessmentDecided (acceptCount, denyCount, assessment), ClaimAssessmentAlreadyClosed ());
184
190
185
191
// Update ballot
@@ -190,11 +196,10 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
190
196
});
191
197
192
198
// Get the tally again after the vote
193
- (acceptCount, denyCount) = _getVoteTally (assessment, assessorGroup);
199
+ (acceptCount, denyCount) = _getVoteTally (assessment, assessorGroup, assessorGroupLength );
194
200
195
201
// Check if we can close the poll early
196
- // NOTE: the check against assessorGroup being empty is done by _validateAssessor
197
- bool allVoted = acceptCount + denyCount == assessorGroup.length ();
202
+ bool allVoted = acceptCount + denyCount == assessorGroupLength;
198
203
bool notADraw = acceptCount != denyCount;
199
204
bool canCloseEarly = allVoted && notADraw;
200
205
@@ -223,6 +228,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
223
228
/// @param assessment The assessment data for the claim
224
229
/// @return true if the assessment is decided, false otherwise
225
230
function _isAssessmentDecided (uint256 acceptCount , uint256 denyCount , Assessment storage assessment ) internal view returns (bool ) {
231
+
226
232
// The assessment is considered still open if it's a draw, or no votes (0 == 0)
227
233
if (acceptCount == denyCount) return false ;
228
234
@@ -233,19 +239,19 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
233
239
/// @dev Internal function to count votes that accepts a pre-loaded assessor group and assessment
234
240
/// @param assessment The pre-loaded assessment data
235
241
/// @param assessorGroup The pre-loaded assessor group to iterate through
242
+ /// @param assessorGroupLength The pre-loaded length of the assessor group
236
243
/// @return acceptCount Number of assessors who voted to accept the claim
237
244
/// @return denyCount Number of assessors who voted to deny the claim
238
245
function _getVoteTally (
239
246
Assessment storage assessment ,
240
- EnumerableSet.UintSet storage assessorGroup
247
+ EnumerableSet.UintSet storage assessorGroup ,
248
+ uint256 assessorGroupLength
241
249
) internal view returns (uint256 acceptCount , uint256 denyCount ) {
242
250
243
251
acceptCount = 0 ;
244
252
denyCount = 0 ;
245
253
246
- uint256 length = assessorGroup.length ();
247
-
248
- for (uint i = 0 ; i < length;) {
254
+ for (uint i = 0 ; i < assessorGroupLength;) {
249
255
uint256 assessorMemberId = assessorGroup.at (i);
250
256
Vote vote = assessment.ballot[assessorMemberId].vote;
251
257
@@ -293,7 +299,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
293
299
}
294
300
295
301
// Test cases
296
- // castVotes
302
+ // castVote
297
303
// assessor votes, before poll.end we remove the assessor
298
304
// after poll.end assessor should be able to vote again
299
305
// poll.end is extended to 24h from time of last vote
0 commit comments