When variables are created it is assumed to contain default values, explicit initialising with default values (0, address(0), false, ...) is not necessary
bool depositOnly = _stakeAddress == address(0);
if (depositOnly) {
Mitigation
The results can be used directly in the statements instead of storing in a variable
5. Cache storage read and save gas
When storage variables are read multiple times in the same function, it can be stored in a local variable and re-used instead of reading again from storage to save gas
Value read from storage can be stored in a local variable and re-used
6. for-loops can be optimized
In for-loops i++ can be replaced by ++i as it is cheaper and unchecked can be added to the incremented variable to save more gas,
Variable initialising with default values can be avoided as it contains the value by default
Array length can be cached in a local variables and used in the condition instead of querying length in every loop
post-increment can be converted to pre-increment, avoid default value initialisation of incremented varaible, array length can be stored in a local variable and used in the conditional statement
7. Function signature can be directly used
In Booster#setGaugeRedirect.sol function selector in the abi.encodeWithSelector can be directly added in code instead of computing the hash
1. Unnecessary initialising with default values
When variables are created it is assumed to contain default values, explicit initialising with default values (0, address(0), false, ...) is not necessary
Proof of concept
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VeAssetDepositor.sol#L28
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/Booster.sol#L110
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L66-L72
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VoterProxy.sol#L227
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VeTokenMinter.sol#L61-L63
Mitigation
Avoid initilising variables with default values
2. boolean comparison
expression that returns boolean value can be directly used in conditions instead of comparing it with boolean constants
Proof of concept
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/Booster.sol#L352
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/Booster.sol#L498
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VoterProxy.sol#L70
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VoterProxy.sol#L110
Mitigation
The result of the statement can be used directly instead of comparing with boolean constants
3.
> 0
can be replaced with!= 0
!= 0
is more efficient than> 0
when used with unsigned integers in reqquire statementsProof of concept
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VeAssetDepositor.sol#L132
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L173
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L196
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L215
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L210
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L234
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L253
Mitigation
> 0
can be replaced with!= 0
4. Unnecessary variable
Results of expression that is used only once can be used directly in statements instead of storing in a variable
Proof of concept
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VeAssetDepositor.sol#L155
Mitigation
The results can be used directly in the statements instead of storing in a variable
5. Cache storage read and save gas
When storage variables are read multiple times in the same function, it can be stored in a local variable and re-used instead of reading again from storage to save gas
Proof of concept
feeToken
,lockFees
,stakerLockRewards
inhttps://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/Booster.sol#L586-L592
Mitigation
Value read from storage can be stored in a local variable and re-used
6. for-loops can be optimized
In for-loops
i++
can be replaced by++i
as it is cheaper and unchecked can be added to the incremented variable to save more gas, Variable initialising with default values can be avoided as it contains the value by default Array length can be cached in a local variables and used in the condition instead of querying length in every loopProof of concept
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/Booster.sol#L329
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L176
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L199
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L218
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L245
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/BaseRewardPool.sol#L282
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L148
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L214
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L238
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L257
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L281
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VE3DRewardPool.sol#L325
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/VoterProxy.sol#L217
Mitigation
post-increment can be converted to pre-increment, avoid default value initialisation of incremented varaible, array length can be stored in a local variable and used in the conditional statement
7. Function signature can be directly used
In
Booster#setGaugeRedirect.sol
function selector in the abi.encodeWithSelector can be directly added in code instead of computing the hashProof of concept
https://github.com/code-423n4/2022-05-vetoken/blob/2d7cd1f6780a9bcc8387dea8fecfbd758462c152/contracts/Booster.sol#L488
Mitigation
The statement can be changed to