Platform: Code4rena
Start Date: 01/08/2022
Pot Size: $50,000 USDC
Total HM: 26
Participants: 133
Period: 5 days
Judge: Jack the Pug
Total Solo HM: 6
Id: 151
League: ETH
Rank: 130/133
Findings: 1
Award: $21.72
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: c3phas
Also found by: 0x040, 0x1f8b, 0xA5DF, 0xNazgul, 0xSmartContract, 0xSolus, 0xc0ffEE, 0xkatana, 0xsam, 8olidity, Aymen0909, Bnke0x0, CertoraInc, Chinmay, Chom, CodingNameKiki, Deivitto, Dravee, ElKu, Extropy, Fitraldys, Funen, GalloDaSballo, Guardian, IllIllI, JC, Lambda, MEP, Metatron, MiloTruck, Noah3o6, NoamYakov, PaludoX0, ReyAdmirado, Rohan16, Rolezn, Ruhum, Sm4rty, SooYa, TomJ, Tomio, Waze, _Adam, __141345__, a12jmx, ajtra, ak1, apostle0x01, asutorufos, ballx, benbaessler, bharg4v, bobirichman, brgltd, cryptonue, defsec, delfin454000, dharma09, djxploit, durianSausage, eierina, erictee, fatherOfBlocks, gerdusx, gogo, hake, hyh, ignacio, jag, kaden, kyteg, lucacez, mics, minhquanym, oyc_109, pfapostol, rbserver, ret2basic, robee, rokinot, sach1r0, saian, samruna, scaraven, sikorico, simon135, supernova, teddav, tofunmi, zeesaw
21.7225 USDC - $21.72
Uninitialized variables are assigned with the types default value. Explicitly initializing a variable with it's default value costs unnecesary gas.
There are 7 instances of this issue:
File: contracts/Community.sol 624: for (uint256 i = 0; i < _communities[_communityID].memberCount; i++) {
File: contracts/HomeFiProxy.sol 87: for (uint256 i = 0; i < _length; i++) { 136: for (uint256 i = 0; i < _length; i++) {
File: contracts/Project.sol 248: for (uint256 i = 0; i < _length; i++) { 311: for (uint256 i = 0; i < _length; i++) { 322: for (uint256 i = 0; i < _length; i++) {
File: contracts/libraries/Tasks.sol 181: for (uint256 i = 0; i < _length; i++) _alerts[i] = _self.alerts[i];
Caching the array length outside a loop saves reading it on each iteration, as long as the array's length is not changed during the loop.
There are 1 instances of this issue:
File: contracts/Project.sol 603: for (; i < _changeOrderedTask.length; i++) {
When dealing with unsigned integer types, comparisons with != 0
are cheaper then with > 0
.
There are 10 instances of this issue:
File: contracts/Community.sol 261: if (projectPublished[_project] > 0) { 427: _communities[_communityID].projectDetails[_project].lentAmount > 0 764: require(_repayAmount > 0, "Community::!repay"); 840: if (_interestEarned > 0) {
File: contracts/Disputes.sol 107: _actionType > 0 && _actionType <= uint8(ActionType.TaskPay),
File: contracts/HomeFi.sol 245: return projectTokenId[_project] > 0;
File: contracts/Project.sol 195: require(_cost > 0, "Project::!value>0"); 380: if (_leftOutTokens > 0) { 601: if (_changeOrderedTask.length > 0) { 691: if (_loopCount > 0) emit TaskAllocated(_tasksAllocated);
Access roles marked as constant
results in computing the keccak256
operation each time the variable is used because assigned operations for constant
variables are re-evaluated every time.
Changing the variables to immutable
results in computing the hash only once on deployment, leading to gas savings.
There are 7 instances of this issue:
File: contracts\Community.sol 175: bytes32 _hash = keccak256(_data); 213: bytes32 _hash = keccak256(_data); 530: bytes32 _hash = keccak256(_data);
File: contracts\Disputes.sol 91: keccak256(_data),
File: contracts\Project.sol 499: keccak256(_data), 795: bytes32 _hash = keccak256(_data); 836: bytes32 _hash = keccak256(_data);