@@ -48,17 +48,26 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
48
48
}
49
49
50
50
function payoutCooldown (uint256 productTypeId ) external view returns (uint256 ) {
51
- return _assessmentData[productTypeId].cooldownPeriod;
51
+ // TODO: call CoverProduct to validate productTypeId?\
52
+ AssessmentData storage assessmentData = _assessmentData[productTypeId];
53
+ require (assessmentData.assessingGroupId != 0 , InvalidProductType ());
54
+ return assessmentData.cooldownPeriod;
52
55
}
53
56
54
57
function assessorGroupOf (bytes32 claimId ) external view returns (uint32 ) {
55
- return _assessments[claimId].assessorGroupId;
58
+ Assessment storage assessment = _assessments[claimId];
59
+ require (assessment.start != 0 , InvalidClaimId ());
60
+ return assessment.assessorGroupId;
56
61
}
57
62
58
63
function getAssessmentInfo (bytes32 claimId ) external view returns (uint32 start , uint32 end , uint256 accepts , uint256 denies ) {
59
64
60
65
Assessment storage assessment = _assessments[claimId];
66
+ require (assessment.start != 0 , InvalidClaimId ());
67
+
61
68
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
69
+ require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
70
+
62
71
(accepts, denies) = _getVoteTally (claimId, assessorGroup);
63
72
64
73
return (assessment.start, assessment.end, accepts, denies);
@@ -86,9 +95,12 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
86
95
function getOutcome (bytes32 claimId ) external view returns (bool accepted ) {
87
96
88
97
Assessment storage assessment = _assessments[claimId];
89
- EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId] ;
98
+ require (assessment.start != 0 , InvalidClaimId ()) ;
90
99
91
100
// Check if the assessment has been decided (has votes, not a draw and voting period has ended)
101
+ EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
102
+ require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
103
+
92
104
(uint256 acceptCount , uint256 denyCount ) = _getVoteTally (claimId, assessorGroup);
93
105
require (_isAssessmentDecided (acceptCount, denyCount, assessment), ClaimAssessmentNotFinished ());
94
106
@@ -103,7 +115,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
103
115
function isAssessmentDecided (bytes32 claimId ) external view returns (bool ) {
104
116
105
117
Assessment storage assessment = _assessments[claimId];
118
+ require (assessment.start != 0 , InvalidClaimId ());
119
+
106
120
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
121
+ require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
122
+
107
123
(uint256 acceptCount , uint256 denyCount ) = _getVoteTally (claimId, assessorGroup);
108
124
109
125
return _isAssessmentDecided (acceptCount, denyCount, assessment);
@@ -116,7 +132,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
116
132
/// @dev This function considers only votes from current assessors in the group
117
133
function getVoteTally (bytes32 claimId ) external view returns (uint256 acceptCount , uint256 denyCount ) {
118
134
Assessment storage assessment = _assessments[claimId];
135
+ require (assessment.start != 0 , InvalidClaimId ());
136
+
119
137
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
138
+ require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
139
+
120
140
return _getVoteTally (claimId, assessorGroup);
121
141
}
122
142
@@ -128,10 +148,14 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
128
148
/// @dev Only callable by internal contracts
129
149
/// @dev Reverts if an assessment already exists for the given claimId
130
150
function startAssessment (bytes32 claimId , uint16 productTypeId ) external onlyInternal {
151
+ // TODO: call CoverProduct to validate productTypeId?
131
152
132
153
Assessment storage assessment = _assessments[claimId];
133
154
require (assessment.start == 0 , AssessmentAlreadyExists ());
134
155
156
+ AssessmentData storage assessmentData = _assessmentData[productTypeId];
157
+ require (assessmentData.assessingGroupId != 0 , InvalidProductType ());
158
+
135
159
assessment.start = uint32 (block .timestamp );
136
160
assessment.end = uint32 (block .timestamp + MIN_VOTING_PERIOD);
137
161
assessment.assessorGroupId = _assessmentData[productTypeId].assessingGroupId;
@@ -152,6 +176,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
152
176
// Validate assessor and get assessment data
153
177
(uint256 assessorMemberId , Assessment storage assessment ) = _validateAssessor (claimId, msg .sender );
154
178
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
179
+ require (assessorGroup.length () > 0 , EmptyAssessorGroup ());
155
180
156
181
// Only allow voting if the poll is not yet decided (no votes, a draw or voting period hasn't ended)
157
182
(uint256 acceptCount , uint256 denyCount ) = _getVoteTally (claimId, assessorGroup);
@@ -168,6 +193,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
168
193
(acceptCount, denyCount) = _getVoteTally (claimId, assessorGroup);
169
194
170
195
// Check if we can close the poll early
196
+ // NOTE: the check against assessorGroup being empty is done by _validateAssessory
171
197
bool allVoted = acceptCount + denyCount == assessorGroup.length ();
172
198
bool notADraw = acceptCount != denyCount;
173
199
bool canCloseEarly = allVoted && notADraw;
@@ -197,7 +223,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
197
223
/// @param assessment The assessment data for the claim
198
224
/// @return true if the assessment is decided, false otherwise
199
225
function _isAssessmentDecided (uint256 acceptCount , uint256 denyCount , Assessment storage assessment ) internal view returns (bool ) {
200
- // The assessment is considered still open if it's a draw (includes case of no votes where 0 == 0)
226
+ // The assessment is considered still open if it's a draw, or no votes ( 0 == 0)
201
227
if (acceptCount == denyCount) return false ;
202
228
203
229
// The assessment is considered decided if there is at least 1 vote and the voting period has ended
@@ -215,11 +241,12 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
215
241
) internal view returns (uint256 acceptCount , uint256 denyCount ) {
216
242
217
243
Assessment storage assessment = _assessments[claimId];
244
+ require (assessment.start != 0 , InvalidClaimId ());
245
+
218
246
acceptCount = 0 ;
219
247
denyCount = 0 ;
220
248
221
249
uint256 length = assessorGroup.length ();
222
- require (length > 0 , EmptyAssessorGroup ());
223
250
224
251
for (uint i = 0 ; i < length;) {
225
252
uint256 assessorMemberId = assessorGroup.at (i);
@@ -242,6 +269,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
242
269
// TODO: implement memberRoles.getMemberId - can be memberId be 0?
243
270
assessorMemberId = _memberRoles ().getMemberId (assessor);
244
271
assessment = _assessments[claimId];
272
+ require (assessment.start != 0 , InvalidClaimId ());
245
273
require (_assessorGroups[assessment.assessorGroupId].contains (assessorMemberId), InvalidAssessor ());
246
274
return (assessorMemberId, assessment);
247
275
}
0 commit comments