Platform: Code4rena
Start Date: 20/09/2022
Pot Size: $30,000 USDC
Total HM: 12
Participants: 198
Period: 3 days
Judge: 0xean
Total Solo HM: 2
Id: 164
League: ETH
Rank: 178/198
Findings: 1
Award: $9.09
π Selected for report: 0
π Solo Findings: 0
π Selected for report: IllIllI
Also found by: 0v3rf10w, 0x040, 0x1f8b, 0x4non, 0x85102, 0xA5DF, 0xDanielC, 0xNazgul, 0xSmartContract, 0xbepresent, 0xc0ffEE, 0xsam, 2997ms, AkshaySrivastav, Amithuddar, Atarpara, Aymen0909, B2, Bnke0x0, CertoraInc, Chom, ChristianKuri, CodingNameKiki, Deivitto, Diana, DimitarDimitrov, Diraco, Funen, JC, JLevick, JohnSmith, Junnon, KIntern_NA, Lambda, MasterCookie, Matin, Noah3o6, Ocean_Sky, OptimismSec, RaymondFam, Respx, ReyAdmirado, RockingMiles, Rohan16, Rolezn, Ruhum, Saintcode_, Satyam_Sharma, Sm4rty, SnowMan, SooYa, Sta1400, StevenL, Tadashi, Tagir2003, TomJ, Tomio, Tomo, V_B, Waze, WilliamAmbrozic, Yiko, __141345__, a12jmx, adriro, ajtra, ak1, async, aysha, beardofginger, bobirichman, brgltd, bulej93, c3phas, carrotsmuggler, caventa, ch0bu, cryptostellar5, cryptphi, csanuragjain, d3e4, delfin454000, dharma09, djxploit, durianSausage, eighty, emrekocak, erictee, exd0tpy, fatherOfBlocks, francoHacker, gianganhnguyen, gogo, got_targ, hxzy, ignacio, ikbkln, imare, indijanc, jag, jpserrat, karanctf, ladboy233, leosathya, lucacez, lukris02, m9800, malinariy, martin, medikko, mics, millersplanet, mrpathfindr, nalus, natzuu, neko_nyaa, oyc_109, pauliax, peanuts, pedroais, peiw, pfapostol, prasantgupta52, rbserver, ret2basic, rokinot, rotcivegaf, rvierdiiev, sach1r0, samruna, seyni, slowmoses, subtle77, supernova, tgolding55, tibthecat, tnevler, w0Lfrum, yaemsobak, zishansami
9.0866 USDC - $9.09
File VTVLVesting.sol, line 353:
for (uint256 i = 0; i < length; i++) { ... }
Becomes:
for (uint256 i = 0; i < length; ++i) { ... }
File Vault.sol, line 443:
for (uint256 i = 0; i < length; i++) { ... }
Becomes:
for (uint256 i = 0; i < length; i++) { ... unchecked { ++i; } }
File VTVLVesting.sol, line 27:
uint112 public numTokensReservedForVesting = 0;
Becomes:
uint112 public numTokensReservedForVesting;
File VTVLVesting.sol, line 148:
uint112 vestAmt = 0;
Becomes:
uint112 vestAmt;
File VTVLVesting.sol, line 353:
for (uint256 i = 0; i < length; i++) {
Becomes:
for (uint256 i; i < length; i++) {
Solidity version 0.8+ comes with implicit overflow and underflow checks on unsigned integers. When an overflow or an underflow isnβt possible (as an example, when a comparison is made before the arithmetic operation), some gas can be saved by using an unchecked block
File VTVLVesting.sol, line 161:
vestAmt += _claim.cliffAmount;
Becomes:
unchecked { vestAmt += _claim.cliffAmount; }
File VTVLVesting.sol, line 167-179:
uint40 currentVestingDurationSecs = _referenceTs - _claim.startTimestamp; uint40 truncatedCurrentVestingDurationSecs = (currentVestingDurationSecs / _claim.releaseIntervalSecs) * _claim.releaseIntervalSecs; uint40 finalVestingDurationSecs = _claim.endTimestamp - _claim.startTimestamp; uint112 linearVestAmount = _claim.linearVestAmount * truncatedCurrentVestingDurationSecs / finalVestingDurationSecs; vestAmt += linearVestAmount;
Becomes:
uint40 currentVestingDurationSecs; uint40 truncatedCurrentVestingDurationSecs; uint40 finalVestingDurationSecs; uint112 linearVestAmount; unchecked { currentVestingDurationSecs = _referenceTs - _claim.startTimestamp; truncatedCurrentVestingDurationSecs = (currentVestingDurationSecs / _claim.releaseIntervalSecs) * _claim.releaseIntervalSecs; finalVestingDurationSecs = _claim.endTimestamp - _claim.startTimestamp; linearVestAmount = _claim.linearVestAmount * truncatedCurrentVestingDurationSecs / finalVestingDurationSecs; vestAmt += linearVestAmount; }
File VTVLVesting.sol, line 292:
uint112 allocatedAmount = _cliffAmount + _linearVestAmount;
Becomes:
uint112 allocatedAmount; unchecked { allocatedAmount = _cliffAmount + _linearVestAmount; }
File VTVLVesting.sol, line 301:
numTokensReservedForVesting += allocatedAmount;
Becomes:
unchecked { numTokensReservedForVesting += allocatedAmount; }
File VTVLVesting.sol, line 377-384:
uint112 amountRemaining = allowance - usrClaim.amountWithdrawn; usrClaim.amountWithdrawn += amountRemaining; numTokensReservedForVesting -= amountRemaining;
Becomes:
uint112 amountRemaining; unchecked { amountRemaining = allowance - usrClaim.amountWithdrawn; usrClaim.amountWithdrawn += amountRemaining; numTokensReservedForVesting -= amountRemaining; }
File VTVLVesting.sol, line 429:
uint112 amountRemaining = finalVestAmt - _claim.amountWithdrawn;
Becomes:
uint112 amountRemaining; unchecked { amountRemaining = finalVestAmt - _claim.amountWithdrawn; }
File VTVLVesting.sol, line 433:
numTokensReservedForVesting -= amountRemaining;
Becomes:
unchecked { numTokensReservedForVesting -= amountRemaining; }
File VTVLVesting.sol, line 106:
Claim storage _claim = claims[_recipient];
Becomes:
Claim memory _claim = claims[_recipient];
File VTVLVesting.sol, line 124, 197, 207, 216.
File VTVLVesting.sol, line 161:
vestAmt += _claim.cliffAmount;
Becomes:
vestAmt = vestAmt + _claim.cliffAmount;
File VTVLVesting.sol, line 383:
numTokensReservedForVesting -= amountRemaining;
Becomes:
numTokensReservedForVesting = numTokensReservedForVesting - amountRemaining;
File VTVLVesting.sol, line 179, 301, 381, 433. File VariableSupplyERC20Token.sol, line 43.