code-423n4 / 2022-05-velodrome-findings

0 stars 0 forks source link

Gas Optimizations #214

Open code423n4 opened 2 years ago

code423n4 commented 2 years ago
  1. Title :Using ++i than i++ for saving more gas

Using i++ instead ++i for all the loops, the variable i is incremented using i++. It is known that implementation by using ++i costs less gas per iteration than i++.

Tools Used

Manual Review

Occurances

contracts/contracts/Gauge.sol#L179          for (uint i = 0; i < numRewards; i++) {
contracts/contracts/Gauge.sol#L353         for (uint i = 0; i < tokens.length; i++) {
contracts/contracts/Gauge.sol#L426         for (uint i = _startIndex; i < _endIndex; i++) {
contracts/contracts/Gauge.sol#L448         for (uint i; i < length; i++) {
contracts/contracts/Gauge.sol#L484          for (uint i = _startIndex; i < _endIndex; i++) {
contracts/contracts/Minter.sol#L57        for (uint i = 0; i < claimants.length; i++) {
contracts/contracts/Pair.sol#L257        for (uint i = 0; i < _prices.length; i++) {
contracts/contracts/Pair.sol#L389        for (uint i = 0; i < 255; i++) {
contracts/contracts/RewardsDistributor.sol#L75           for (uint i = 0; i < 20; i++) {
contracts/contracts/RewardsDistributor.sol#L105         for (uint i = 0; i < 128; i++) {
contracts/contracts/RewardsDistributor.sol#L121          for (uint i = 0; i < 128; i++) {
contracts/contracts/RewardsDistributor.sol#L148         for (uint i = 0; i < 20; i++) {
contracts/contracts/RewardsDistributor.sol#L195         for (uint i = 0; i < 50; i++) {
contracts/contracts/RewardsDistributor.sol#L252         for (uint i = 0; i < 50; i++) {
contracts/contracts/RewardsDistributor.sol#L301         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/Router.sol#L90           for (uint i = 0; i < routes.length; i++) { 
contracts/contracts/Router.sol#L316         for (uint i = 0; i < routes.length; i++) {
contracts/contracts/VelodromeLibrary.sol#L24         for (uint i = 0; i < 255; i++) {
contracts/contracts/Voter.sol#L76         for (uint i = 0; i < _tokens.length; i++) {
contracts/contracts/Voter.sol#L143       for (uint i = 0; i < _poolCnt; i++) {
contracts/contracts/Voter.sol#L147       for (uint i = 0; i < _poolCnt; i++) {
contracts/contracts/Voter.sol#L266      for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/Voter.sol#L272       for (uint i = start; i < end; i++) {
contracts/contracts/Voter.sol#L304      for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/Voter.sol#L310       for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/VotingEscrow.sol#L1146         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/VotingEscrow.sol#L1193         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/VotingEscrow.sol#L1225         for (uint i = 0; i < srcRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1249         for (uint i = 0; i < dstRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1295         for (uint i = 0; i < srcRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1320         for (uint i = 0; i < dstRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1325         for (uint i = 0; i < ownerTokenCount; i++) {
  1. Title : change uint256 i = 0 into uint256 i for saving more gas

using this implementation can saving more gas for each loops.

Tool Used

Manual Review

Recommended Mitigation

Change it

Occurances

contracts/contracts/Gauge.sol#L179          for (uint i = 0; i < numRewards; i++) {
contracts/contracts/Gauge.sol#L353         for (uint i = 0; i < tokens.length; i++) {
contracts/contracts/Minter.sol#L57        for (uint i = 0; i < claimants.length; i++) {
contracts/contracts/Pair.sol#L257        for (uint i = 0; i < _prices.length; i++) {
contracts/contracts/Pair.sol#L389        for (uint i = 0; i < 255; i++) {
contracts/contracts/RewardsDistributor.sol#L75           for (uint i = 0; i < 20; i++) {
contracts/contracts/RewardsDistributor.sol#L105         for (uint i = 0; i < 128; i++) {
contracts/contracts/RewardsDistributor.sol#L121          for (uint i = 0; i < 128; i++) {
contracts/contracts/RewardsDistributor.sol#L148         for (uint i = 0; i < 20; i++) {
contracts/contracts/RewardsDistributor.sol#L195         for (uint i = 0; i < 50; i++) {
contracts/contracts/RewardsDistributor.sol#L252         for (uint i = 0; i < 50; i++) {
contracts/contracts/RewardsDistributor.sol#L301         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/Router.sol#L90           for (uint i = 0; i < routes.length; i++) { 
contracts/contracts/Router.sol#L316         for (uint i = 0; i < routes.length; i++) {
contracts/contracts/VelodromeLibrary.sol#L24         for (uint i = 0; i < 255; i++) {
contracts/contracts/Voter.sol#L76         for (uint i = 0; i < _tokens.length; i++) {
contracts/contracts/Voter.sol#L143       for (uint i = 0; i < _poolCnt; i++) {
contracts/contracts/Voter.sol#L147       for (uint i = 0; i < _poolCnt; i++) {
contracts/contracts/Voter.sol#L266      for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/Voter.sol#L304      for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/Voter.sol#L310       for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/VotingEscrow.sol#L632          for (uint i = 0; i < 255; ++i) {
contracts/contracts/VotingEscrow.sol#L1146         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/VotingEscrow.sol#L1193         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/VotingEscrow.sol#L1225         for (uint i = 0; i < srcRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1249         for (uint i = 0; i < dstRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1295         for (uint i = 0; i < srcRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1320         for (uint i = 0; i < dstRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1325         for (uint i = 0; i < ownerTokenCount; i++) {
  1. Title : Caching array length can saving more gas

This implementation can be saving more gas, since if caching the array length is more gas efficient. just because access to a local variable in solidity is more efficient.

Tool Used

Manual Review

Occurances

contracts/contracts/Gauge.sol#L353         for (uint i = 0; i < tokens.length; i++) {
contracts/contracts/Minter.sol#L57        for (uint i = 0; i < claimants.length; i++) {
contracts/contracts/Pair.sol#L257        for (uint i = 0; i < _prices.length; i++) {
contracts/contracts/Pair.sol#L389        for (uint i = 0; i < 255; i++) {
contracts/contracts/RewardsDistributor.sol#L301         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/Router.sol#L90           for (uint i = 0; i < routes.length; i++) { 
contracts/contracts/Router.sol#L316         for (uint i = 0; i < routes.length; i++) {
contracts/contracts/Voter.sol#L76         for (uint i = 0; i < _tokens.length; i++) {
contracts/contracts/Voter.sol#L266      for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/Voter.sol#L304      for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/Voter.sol#L310       for (uint i = 0; i < _gauges.length; i++) {
contracts/contracts/VotingEscrow.sol#L1146         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/VotingEscrow.sol#L1193         for (uint i = 0; i < _tokenIds.length; i++) {
contracts/contracts/VotingEscrow.sol#L1225         for (uint i = 0; i < srcRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1249         for (uint i = 0; i < dstRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1295         for (uint i = 0; i < srcRepOld.length; i++) {
contracts/contracts/VotingEscrow.sol#L1320         for (uint i = 0; i < dstRepOld.length; i++) {
  1. Title : Using shortcode for saving more gas

1.) File : contracts/contracts/Pair.sol (Line.282)

            index = index + 1; 

changed to :

            index++;

2.) File : contracts/contracts/VotingEscrow.sol (Line.453)

        ownerToNFTokenCount[_to] += 1;

changed to :

         ownerToNFTokenCount[_to]++;
  1. Using > 0 costs more gas than != 0 when used on uints in a require() statement

1.) File : contracts/contracts/Gauge.sol (Line.512)

      require(amount > 0);

2.) File : contracts/contracts/Gauge.sol (Line.512)

      require(amount > 0);

3.) File : contracts/contracts/Gauge.sol (Line.592)

      require(amount > 0);

4.) File : contracts/contracts/Gauge.sol (Line.613)

      require(rewardRate[token] > 0);
GalloDaSballo commented 2 years ago

++i

32 * 5

change uint256 i = 0 into uint256 i for saving more gas

29 * 3

Caching array length can saving more gas

6 * 17

Other 2 findings don't save gas

Total Gas Saved: 349

Report is pretty neat and concise, unfortunately missing the bigger savings in avoiding SLOADS