Skip to content

Commit 5b084ac

Browse files
committed
feat: add valdation when reading mapping values
1 parent 9fbba73 commit 5b084ac

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

contracts/interfaces/IPermissionedAssessment.sol

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ interface IPermissionedAssessment {
132132
error ClaimIdsCidsLengthMismatch();
133133
error ClaimAssessmentNotFinished();
134134
error EmptyAssessorGroup();
135-
error InvalidVote();
136135
error InvalidAssessor();
136+
error InvalidClaimId();
137+
error InvalidVote();
138+
error InvalidProductType();
137139
}

contracts/modules/assessment/PermissionedAssessment.sol

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,26 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
4848
}
4949

5050
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;
5255
}
5356

5457
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;
5661
}
5762

5863
function getAssessmentInfo(bytes32 claimId) external view returns (uint32 start, uint32 end, uint256 accepts, uint256 denies) {
5964

6065
Assessment storage assessment = _assessments[claimId];
66+
require(assessment.start != 0, InvalidClaimId());
67+
6168
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
69+
require(assessorGroup.length() > 0, EmptyAssessorGroup());
70+
6271
(accepts, denies) = _getVoteTally(claimId, assessorGroup);
6372

6473
return (assessment.start, assessment.end, accepts, denies);
@@ -86,9 +95,12 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
8695
function getOutcome(bytes32 claimId) external view returns (bool accepted) {
8796

8897
Assessment storage assessment = _assessments[claimId];
89-
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
98+
require(assessment.start != 0, InvalidClaimId());
9099

91100
// 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+
92104
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(claimId, assessorGroup);
93105
require(_isAssessmentDecided(acceptCount, denyCount, assessment), ClaimAssessmentNotFinished());
94106

@@ -103,7 +115,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
103115
function isAssessmentDecided(bytes32 claimId) external view returns (bool) {
104116

105117
Assessment storage assessment = _assessments[claimId];
118+
require(assessment.start != 0, InvalidClaimId());
119+
106120
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
121+
require(assessorGroup.length() > 0, EmptyAssessorGroup());
122+
107123
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(claimId, assessorGroup);
108124

109125
return _isAssessmentDecided(acceptCount, denyCount, assessment);
@@ -116,7 +132,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
116132
/// @dev This function considers only votes from current assessors in the group
117133
function getVoteTally(bytes32 claimId) external view returns (uint256 acceptCount, uint256 denyCount) {
118134
Assessment storage assessment = _assessments[claimId];
135+
require(assessment.start != 0, InvalidClaimId());
136+
119137
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
138+
require(assessorGroup.length() > 0, EmptyAssessorGroup());
139+
120140
return _getVoteTally(claimId, assessorGroup);
121141
}
122142

@@ -128,10 +148,14 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
128148
/// @dev Only callable by internal contracts
129149
/// @dev Reverts if an assessment already exists for the given claimId
130150
function startAssessment(bytes32 claimId, uint16 productTypeId) external onlyInternal {
151+
// TODO: call CoverProduct to validate productTypeId?
131152

132153
Assessment storage assessment = _assessments[claimId];
133154
require(assessment.start == 0, AssessmentAlreadyExists());
134155

156+
AssessmentData storage assessmentData = _assessmentData[productTypeId];
157+
require(assessmentData.assessingGroupId != 0, InvalidProductType());
158+
135159
assessment.start = uint32(block.timestamp);
136160
assessment.end = uint32(block.timestamp + MIN_VOTING_PERIOD);
137161
assessment.assessorGroupId = _assessmentData[productTypeId].assessingGroupId;
@@ -152,6 +176,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
152176
// Validate assessor and get assessment data
153177
(uint256 assessorMemberId, Assessment storage assessment) = _validateAssessor(claimId, msg.sender);
154178
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
179+
require(assessorGroup.length() > 0, EmptyAssessorGroup());
155180

156181
// Only allow voting if the poll is not yet decided (no votes, a draw or voting period hasn't ended)
157182
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(claimId, assessorGroup);
@@ -168,6 +193,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
168193
(acceptCount, denyCount) = _getVoteTally(claimId, assessorGroup);
169194

170195
// Check if we can close the poll early
196+
// NOTE: the check against assessorGroup being empty is done by _validateAssessory
171197
bool allVoted = acceptCount + denyCount == assessorGroup.length();
172198
bool notADraw = acceptCount != denyCount;
173199
bool canCloseEarly = allVoted && notADraw;
@@ -197,7 +223,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
197223
/// @param assessment The assessment data for the claim
198224
/// @return true if the assessment is decided, false otherwise
199225
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)
201227
if (acceptCount == denyCount) return false;
202228

203229
// 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
215241
) internal view returns (uint256 acceptCount, uint256 denyCount) {
216242

217243
Assessment storage assessment = _assessments[claimId];
244+
require(assessment.start != 0, InvalidClaimId());
245+
218246
acceptCount = 0;
219247
denyCount = 0;
220248

221249
uint256 length = assessorGroup.length();
222-
require(length > 0, EmptyAssessorGroup());
223250

224251
for (uint i = 0; i < length;) {
225252
uint256 assessorMemberId = assessorGroup.at(i);
@@ -242,6 +269,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
242269
// TODO: implement memberRoles.getMemberId - can be memberId be 0?
243270
assessorMemberId = _memberRoles().getMemberId(assessor);
244271
assessment = _assessments[claimId];
272+
require(assessment.start != 0, InvalidClaimId());
245273
require(_assessorGroups[assessment.assessorGroupId].contains(assessorMemberId), InvalidAssessor());
246274
return (assessorMemberId, assessment);
247275
}

0 commit comments

Comments
 (0)