Platform: Code4rena
Start Date: 22/08/2022
Pot Size: $50,000 USDC
Total HM: 4
Participants: 160
Period: 5 days
Judge: gzeon
Total Solo HM: 2
Id: 155
League: ETH
Rank: 143/160
Findings: 1
Award: $16.66
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: IllIllI
Also found by: 0x040, 0x1f8b, 0xDjango, 0xNazgul, 0xNineDec, 0xSmartContract, 0xbepresent, 0xc0ffEE, 0xkatana, 2997ms, ACai, Amithuddar, Aymen0909, Ben, BipinSah, Bjorn_bug, Bnke0x0, CertoraInc, Ch_301, Chom, CodingNameKiki, Deivitto, DevABDee, DimitarDimitrov, Diraco, Dravee, ElKu, EthLedger, Fitraldys, Funen, GalloDaSballo, GimelSec, Guardian, IgnacioB, JC, JohnSmith, Junnon, KIntern_NA, Lambda, LeoS, Noah3o6, Olivierdem, Polandia94, R2, Randyyy, RaymondFam, Respx, ReyAdmirado, Rohan16, RoiEvenHaim, Rolezn, Ruhum, SaharAP, Saintcode_, SerMyVillage, Shishigami, Sm4rty, SooYa, TomJ, Tomio, Tomo, Waze, Yiko, _Adam, __141345__, a12jmx, ajtra, ak1, bobirichman, brgltd, bulej93, c3phas, cRat1st0s, carlitox477, catchup, ch0bu, d3e4, delfin454000, djxploit, durianSausage, erictee, exolorkistis, fatherOfBlocks, francoHacker, gogo, hyh, ignacio, jag, joestakey, karanctf, ladboy233, lucacez, lukris02, m_Rassska, martin, medikko, mics, mrpathfindr, natzuu, newfork01, oyc_109, pauliax, peritoflores, pfapostol, prasantgupta52, rbserver, ret2basic, rfa, robee, rokinot, rotcivegaf, rvierdiiev, sach1r0, saian, samruna, seyni, shark, shr1ftyy, sikorico, simon135, sryysryy, tay054, tnevler, wagmi, zishansami
16.6568 USDC - $16.66
Overriting varibles with defualt values with their default value will waste only gas and not necessary.
There are 28 instances of this issue:
File: ./contracts/NounsArt.sol 131: for (uint256 i = 0; i < _backgrounds.length; i++) { 431: uint256 pageFirstImageIndex = 0; 432: for (uint256 i = 0; i < len; i++) {
File: ./contracts/NounsDescriptor.sol 110: for (uint256 i = 0; i < newColors.length; i++) { 120: for (uint256 i = 0; i < _backgrounds.length; i++) { 130: for (uint256 i = 0; i < _bodies.length; i++) { 140: for (uint256 i = 0; i < _accessories.length; i++) { 150: for (uint256 i = 0; i < _heads.length; i++) { 160: for (uint256 i = 0; i < _glasses.length; i++) {
File: ./contracts/governance/NounsDAOLogicV1.sol 281: for (uint256 i = 0; i < proposal.targets.length; i++) { 319: for (uint256 i = 0; i < proposal.targets.length; i++) { 346: for (uint256 i = 0; i < proposal.targets.length; i++) { 371: for (uint256 i = 0; i < proposal.targets.length; i++) {
File: ./contracts/governance/NounsDAOLogicV2.sol 292: for (uint256 i = 0; i < proposal.targets.length; i++) { 330: for (uint256 i = 0; i < proposal.targets.length; i++) { 357: for (uint256 i = 0; i < proposal.targets.length; i++) { 382: for (uint256 i = 0; i < proposal.targets.length; i++) { 948: uint256 lower = 0;
File: ./contracts/SVGRenderer.sol 100: for (uint8 p = 0; p < params.parts.length; p++) { 111: for (uint256 i = 0; i < image.draws.length; i++) { 168: for (uint256 i = 0; i < cursor; i += 4) {
File: ./contracts/base/ERC721Checkpointable.sol 181: uint32 lower = 0;
File: ./contracts/libs/Inflate.sol 150: uint256 code = 0; 152: uint256 first = 0; 156: uint256 index = 0;
File: ./contracts/libs/MultiPartRLEToSVG.sol 81: for (uint8 p = 0; p < params.parts.length; p++) { 90: for (uint256 i = 0; i < image.rects.length; i++) { 127 for (uint256 i = 0; i < cursor; i += 4) {
unchecked{++i}
/unchecked{i++}
rather than this ++i
/i++
in for
-loopsUsing a unchecked{++i}
/unchecked{i++}
is recommended in for loops if underflow and overflow is not possible. This will save some gas because the compiler woudn't make a safety check. This safety checks is came from version 0.8.0 and that applies also to above versions.
There are 14 instances of this issue:
File: ./contracts/NounsArt.sol 131: for (uint256 i = 0; i < _backgrounds.length; i++) {
File: ./contracts/NounsDescriptor.sol 110: for (uint256 i = 0; i < newColors.length; i++) { 120: for (uint256 i = 0; i < _backgrounds.length; i++) { 130: for (uint256 i = 0; i < _bodies.length; i++) { 150: for (uint256 i = 0; i < _heads.length; i++) { 160: for (uint256 i = 0; i < _glasses.length; i++) {
File: ./contracts/governance/NounsDAOLogicV1.sol 281: for (uint256 i = 0; i < proposal.targets.length; i++) { 319: for (uint256 i = 0; i < proposal.targets.length; i++) { 346: for (uint256 i = 0; i < proposal.targets.length; i++) { 371: for (uint256 i = 0; i < proposal.targets.length; i++) {
File: ./contracts/governance/NounsDAOLogicV2.sol 292: for (uint256 i = 0; i < proposal.targets.length; i++) { 330: for (uint256 i = 0; i < proposal.targets.length; i++) { 357: for (uint256 i = 0; i < proposal.targets.length; i++) { 382: for (uint256 i = 0; i < proposal.targets.length; i++) {
++i
/--i
are more cheap operations than i++
/i--
Using a ++i
/--i
operations can save about 6 gas for loop/instance because compiler will make less operations
There are 14 instances of this issue:
File: ./contracts/NounsArt.sol 131: for (uint256 i = 0; i < _backgrounds.length; i++) {
File: ./contracts/NounsDescriptor.sol 110: for (uint256 i = 0; i < newColors.length; i++) { 120: for (uint256 i = 0; i < _backgrounds.length; i++) { 130: for (uint256 i = 0; i < _bodies.length; i++) { 150: for (uint256 i = 0; i < _heads.length; i++) { 160: for (uint256 i = 0; i < _glasses.length; i++) {
File: ./contracts/governance/NounsDAOLogicV1.sol 281: for (uint256 i = 0; i < proposal.targets.length; i++) { 319: for (uint256 i = 0; i < proposal.targets.length; i++) { 346: for (uint256 i = 0; i < proposal.targets.length; i++) { 371: for (uint256 i = 0; i < proposal.targets.length; i++) {
File: ./contracts/governance/NounsDAOLogicV2.sol 292: for (uint256 i = 0; i < proposal.targets.length; i++) { 330: for (uint256 i = 0; i < proposal.targets.length; i++) { 357: for (uint256 i = 0; i < proposal.targets.length; i++) { 382: for (uint256 i = 0; i < proposal.targets.length; i++) {
For loop written like thisfor (uint256 i; i < array.length; ++i) {
will cost more gas than for (uint256 i; i < _lengthOfArray; ++i) {
because for every iteration we use mload and memory_offset
that will cost about 6 gas
There are 14 instances of this issue:
File: ./contracts/NounsArt.sol 131: for (uint256 i = 0; i < _backgrounds.length; i++) {
File: ./contracts/NounsDescriptor.sol 110: for (uint256 i = 0; i < newColors.length; i++) { 120: for (uint256 i = 0; i < _backgrounds.length; i++) { 130: for (uint256 i = 0; i < _bodies.length; i++) { 150: for (uint256 i = 0; i < _heads.length; i++) { 160: for (uint256 i = 0; i < _glasses.length; i++) {
File: ./contracts/governance/NounsDAOLogicV1.sol 281: for (uint256 i = 0; i < proposal.targets.length; i++) { 319: for (uint256 i = 0; i < proposal.targets.length; i++) { 346: for (uint256 i = 0; i < proposal.targets.length; i++) { 371: for (uint256 i = 0; i < proposal.targets.length; i++) {
File: ./contracts/governance/NounsDAOLogicV2.sol 292: for (uint256 i = 0; i < proposal.targets.length; i++) { 330: for (uint256 i = 0; i < proposal.targets.length; i++) { 357: for (uint256 i = 0; i < proposal.targets.length; i++) { 382: for (uint256 i = 0; i < proposal.targets.length; i++) {