Skip to content

Commit 1c692e9

Browse files
committed
perf: reduce SLOAD for gas optimisation
1 parent 87bd2ed commit 1c692e9

File tree

1 file changed

+29
-23
lines changed

1 file changed

+29
-23
lines changed

contracts/modules/assessment/PermissionedAssessment.sol

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
6666
require(assessment.start != 0, InvalidClaimId());
6767

6868
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
69-
require(assessorGroup.length() > 0, EmptyAssessorGroup());
69+
uint256 assessorGroupLength = assessorGroup.length();
70+
require(assessorGroupLength > 0, EmptyAssessorGroup());
7071

71-
(accepts, denies) = _getVoteTally(assessment, assessorGroup);
72+
(accepts, denies) = _getVoteTally(assessment, assessorGroup, assessorGroupLength);
7273

7374
return (assessment.start, assessment.end, accepts, denies);
7475
}
@@ -97,11 +98,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
9798
Assessment storage assessment = _assessments[claimId];
9899
require(assessment.start != 0, InvalidClaimId());
99100

100-
// Check if the assessment has been decided (has votes, not a draw and voting period has ended)
101101
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
102-
require(assessorGroup.length() > 0, EmptyAssessorGroup());
102+
uint256 assessorGroupLength = assessorGroup.length();
103+
require(assessorGroupLength > 0, EmptyAssessorGroup());
103104

104-
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(assessment, assessorGroup);
105+
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(assessment, assessorGroup, assessorGroupLength);
105106
require(_isAssessmentDecided(acceptCount, denyCount, assessment), ClaimAssessmentNotFinished());
106107

107108
return acceptCount > denyCount;
@@ -118,9 +119,10 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
118119
require(assessment.start != 0, InvalidClaimId());
119120

120121
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
121-
require(assessorGroup.length() > 0, EmptyAssessorGroup());
122+
uint256 assessorGroupLength = assessorGroup.length();
123+
require(assessorGroupLength > 0, EmptyAssessorGroup());
122124

123-
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(assessment, assessorGroup);
125+
(uint256 acceptCount, uint256 denyCount) = _getVoteTally(assessment, assessorGroup, assessorGroupLength);
124126

125127
return _isAssessmentDecided(acceptCount, denyCount, assessment);
126128
}
@@ -131,13 +133,15 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
131133
/// @return denyCount Number of assessors who voted to deny the claim
132134
/// @dev This function considers only votes from current assessors in the group
133135
function getVoteTally(bytes32 claimId) external view returns (uint256 acceptCount, uint256 denyCount) {
136+
134137
Assessment storage assessment = _assessments[claimId];
135138
require(assessment.start != 0, InvalidClaimId());
136139

137140
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
138-
require(assessorGroup.length() > 0, EmptyAssessorGroup());
141+
uint256 assessorGroupLength = assessorGroup.length();
142+
require(assessorGroupLength > 0, EmptyAssessorGroup());
139143

140-
return _getVoteTally(assessment, assessorGroup);
144+
return _getVoteTally(assessment, assessorGroup, assessorGroupLength);
141145
}
142146

143147
/* === MUTATIVE FUNCTIONS ==== */
@@ -148,17 +152,18 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
148152
/// @dev Only callable by internal contracts
149153
/// @dev Reverts if an assessment already exists for the given claimId
150154
function startAssessment(bytes32 claimId, uint16 productTypeId) external onlyInternal {
151-
// TODO: call CoverProduct to validate productTypeId?
152155

153156
Assessment storage assessment = _assessments[claimId];
154157
require(assessment.start == 0, AssessmentAlreadyExists());
155158

159+
// TODO: call CoverProduct to validate productTypeId?
156160
AssessmentData storage assessmentData = _assessmentData[productTypeId];
157161
require(assessmentData.assessingGroupId != 0, InvalidProductType());
158162

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;
162167
// all votes in assessment.ballot are initialized to NONE (0) by default
163168

164169
emit AssessmentStarted(claimId, assessment.assessorGroupId, assessment.start, assessment.end);
@@ -176,10 +181,11 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
176181
// Validate assessor and get assessment data
177182
(uint256 assessorMemberId, Assessment storage assessment) = _validateAssessor(claimId, msg.sender);
178183
EnumerableSet.UintSet storage assessorGroup = _assessorGroups[assessment.assessorGroupId];
179-
require(assessorGroup.length() > 0, EmptyAssessorGroup());
184+
uint256 assessorGroupLength = assessorGroup.length();
185+
require(assessorGroupLength > 0, EmptyAssessorGroup());
180186

181187
// 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);
183189
require(!_isAssessmentDecided(acceptCount, denyCount, assessment), ClaimAssessmentAlreadyClosed());
184190

185191
// Update ballot
@@ -190,11 +196,10 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
190196
});
191197

192198
// Get the tally again after the vote
193-
(acceptCount, denyCount) = _getVoteTally(assessment, assessorGroup);
199+
(acceptCount, denyCount) = _getVoteTally(assessment, assessorGroup, assessorGroupLength);
194200

195201
// 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;
198203
bool notADraw = acceptCount != denyCount;
199204
bool canCloseEarly = allVoted && notADraw;
200205

@@ -223,6 +228,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
223228
/// @param assessment The assessment data for the claim
224229
/// @return true if the assessment is decided, false otherwise
225230
function _isAssessmentDecided(uint256 acceptCount, uint256 denyCount, Assessment storage assessment) internal view returns (bool) {
231+
226232
// The assessment is considered still open if it's a draw, or no votes (0 == 0)
227233
if (acceptCount == denyCount) return false;
228234

@@ -233,19 +239,19 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
233239
/// @dev Internal function to count votes that accepts a pre-loaded assessor group and assessment
234240
/// @param assessment The pre-loaded assessment data
235241
/// @param assessorGroup The pre-loaded assessor group to iterate through
242+
/// @param assessorGroupLength The pre-loaded length of the assessor group
236243
/// @return acceptCount Number of assessors who voted to accept the claim
237244
/// @return denyCount Number of assessors who voted to deny the claim
238245
function _getVoteTally(
239246
Assessment storage assessment,
240-
EnumerableSet.UintSet storage assessorGroup
247+
EnumerableSet.UintSet storage assessorGroup,
248+
uint256 assessorGroupLength
241249
) internal view returns (uint256 acceptCount, uint256 denyCount) {
242250

243251
acceptCount = 0;
244252
denyCount = 0;
245253

246-
uint256 length = assessorGroup.length();
247-
248-
for (uint i = 0; i < length;) {
254+
for (uint i = 0; i < assessorGroupLength;) {
249255
uint256 assessorMemberId = assessorGroup.at(i);
250256
Vote vote = assessment.ballot[assessorMemberId].vote;
251257

@@ -293,7 +299,7 @@ contract PermissionedAssessment is IPermissionedAssessment, MasterAwareV2, Multi
293299
}
294300

295301
// Test cases
296-
// castVotes
302+
// castVote
297303
// assessor votes, before poll.end we remove the assessor
298304
// after poll.end assessor should be able to vote again
299305
// poll.end is extended to 24h from time of last vote

0 commit comments

Comments
 (0)