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: 126/198
Findings: 2
Award: $27.95
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: AkshaySrivastav
Also found by: 0v3rf10w, 0x040, 0x1f8b, 0x4non, 0x5rings, 0x85102, 0xA5DF, 0xDecorativePineapple, 0xNazgul, 0xSky, 0xSmartContract, 0xbepresent, 0xf15ers, 0xmatt, 2997ms, Aeros, Aymen0909, B2, Bahurum, Bnke0x0, CertoraInc, Chom, ChristianKuri, CodingNameKiki, Deivitto, Diana, Diraco, Dravee, ElKu, Funen, IllIllI, JC, JLevick, JohnSmith, JohnnyTime, KIntern_NA, Lambda, Margaret, MasterCookie, OptimismSec, RaymondFam, Respx, ReyAdmirado, RockingMiles, Rohan16, Rolezn, Ruhum, RustyRabbit, Sm4rty, SooYa, StevenL, TomJ, Tomo, V_B, Waze, Yiko, __141345__, a12jmx, ajtra, ak1, async, ayeslick, aysha, berndartmueller, bin2chen, bobirichman, brgltd, bulej93, c3phas, carrotsmuggler, cccz, ch13fd357r0y3r, chatch, cryptostellar5, cryptphi, csanuragjain, d3e4, datapunk, delfin454000, dic0de, djxploit, durianSausage, eighty, erictee, exd0tpy, fatherOfBlocks, gogo, got_targ, hansfriese, ignacio, ikbkln, indijanc, innertia, joestakey, karanctf, ladboy233, leosathya, lukris02, martin, medikko, millersplanet, nalus, natzuu, neko_nyaa, neumo, obront, oyc_109, pcarranzav, peanuts, pedr02b2, pedroais, peiw, peritoflores, prasantgupta52, rajatbeladiya, rbserver, reassor, ret2basic, rokinot, romand, rotcivegaf, rvierdiiev, sach1r0, seyni, sikorico, slowmoses, sorrynotsorry, supernova, tibthecat, tnevler, ubermensch, yongskiws, zzykxx, zzzitron
18.8574 USDC - $18.86
🌟 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
VTVLVesting.sol
:353: ++i is more efficient than i++i++ increments i and returns the initial value of i, but ++i returns the actual incremented value skipping the creation of a temporary variable, saving ~5 gas/iteration.
VTVLVesting.sol
:374,377,381 usrClaim.amountWithdrawn should be cached in memoryrequire(allowance > usrClaim.amountWithdrawn, "NOTHING_TO_WITHDRAW"); // uint112 amountRemaining = allowance - usrClaim.amountWithdrawn; // usrClaim.amountWithdrawn += amountRemaining;
Multiple use of storage variable costs 100 gas to load from warm state each time. Caching in memory makes future calls cost 3 gas, saving ~97 gas each call. Caching here changes average gas cost from 69082 to 68740 (hardhat gas reporter average)
Use cached value for increment as:
numTokensReservedForVesting = cached + allocatedAmount;
VTVLVesting.sol
:426,429 usrClaim.amountWithdrawn should be cached in memoryrequire( _claim.amountWithdrawn < finalVestAmt, "NO_UNVESTED_AMOUNT"); // uint112 amountRemaining = finalVestAmt - _claim.amountWithdrawn;
Multiple use of storage variable costs 100 gas to load from warm state each time. Caching in memory makes future calls cost 3 gas, saving ~97 gas each call. Caching here changes average gas cost from 36548 to 36451 (hardhat gas reporter average)
VTVLVesting.sol
:295,301 numTokensReservedForVesting should be cached in memoryrequire(tokenAddress.balanceOf(address(this)) >= numTokensReservedForVesting + allocatedAmount, "INSUFFICIENT_BALANCE"); // numTokensReservedForVesting += allocatedAmount; // track the allocated amount
Multiple use of storage variable costs 100 gas to load from warm state each time. Caching in memory makes future calls cost 3 gas, saving ~97 gas each call. Caching here changes average gas cost from 36548 to 36451 (hardhat gas reporter average)
Use cached value for increment as:
numTokensReservedForVesting = cached + allocatedAmount;
VTVLVesting.sol
:166,167,170 startTimestamp should be cached in memoryif(_referenceTs > _claim.startTimestamp) { // uint40 currentVestingDurationSecs = _referenceTs - _claim.startTimestamp; // How long since the start // uint40 finalVestingDurationSecs = _claim.endTimestamp - _claim.startTimestamp; // length of the interval
Multiple use of storage variable costs 100 gas to load from warm state each time. Caching in memory makes future calls cost 3 gas, saving ~97 gas each call. Caching here changes average gas cost from 36548 to 36451 (hardhat gas reporter average)