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: 82/133
Findings: 2
Award: $62.35
๐ Selected for report: 0
๐ Solo Findings: 0
๐ Selected for report: Lambda
Also found by: 0x1f8b, 0x52, 0xA5DF, 0xNazgul, 0xNineDec, 0xSmartContract, 0xSolus, 0xf15ers, 0xkatana, 0xsolstars, 8olidity, Aymen0909, Bahurum, Bnke0x0, CertoraInc, Chom, CodingNameKiki, Deivitto, Dravee, ElKu, Extropy, Funen, GalloDaSballo, Guardian, IllIllI, JC, Jujic, MEP, Noah3o6, ReyAdmirado, Rohan16, Rolezn, Ruhum, Sm4rty, SooYa, Soosh, Throne6g, TomJ, Tomio, TrungOre, Waze, Yiko, _Adam, __141345__, a12jmx, ajtra, ak1, arcoun, asutorufos, ayeslick, benbaessler, berndartmueller, bin2chen, bobirichman, brgltd, bulej93, byndooa, c3phas, codexploder, cryptonue, cryptphi, defsec, delfin454000, dipp, djxploit, erictee, exd0tpy, fatherOfBlocks, gogo, hake, hansfriese, horsefacts, hyh, ignacio, indijanc, joestakey, kaden, mics, minhquanym, neumo, obront, oyc_109, p_crypt0, pfapostol, poirots, rbserver, robee, rokinot, rotcivegaf, sach1r0, saian, samruna, saneryee, scaraven, sikorico, simon135, sseefried, supernova
40.621 USDC - $40.62
https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L94-L105
OpenZeppelin recommends that the initializer
modifier be applied to constructors in order to avoid potential griefs, social engineering, or exploits. Ensure that the modifier is applied to the implementation contract. If the default constructor is currently being used, it should be changed to be an explicit one with the modifier applied.
https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/ProjectFactory.sol#L16-L20
๐ 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.7291 USDC - $21.73
Explicit initialization with zero and false are not required for variable declaration because uints are 0 and bool are false by default. Removing this will reduce contract size and save a bit of gas.
contracts/Community.sol:L624 for (uint256 i = 0; i < _communities[_communityID].memberCount; i++) { contracts/HomeFiProxy.sol:L87 for (uint256 i = 0; i < _length; i++) { contracts/HomeFiProxy.sol:L136 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L248 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L311 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L322 for (uint256 i = 0; i < _length; i++) { contracts/libraries/Tasks.sol:L181 for (uint256 i = 0; i < _length; i++) _alerts[i] = _self.alerts[i]; contracts/Project.sol:L412 bool _unapproved = false;
Cache array length outside of loop to save gas.
contracts/Project.sol:L603 for (; i < _changeOrderedTask.length; i++) {
When dealing with unsigned integer types, comparisons with != 0 are cheaper then with > 0.
contracts/Community.sol:L261 => if (projectPublished[_project] > 0) { contracts/Community.sol:L425 => // First claim interest if principal lent > 0 contracts/Community.sol:L427 => _communities[_communityID].projectDetails[_project].lentAmount > 0 contracts/Community.sol:L764 => require(_repayAmount > 0, "Community:L!repay"); contracts/Community.sol:L840 => if (_interestEarned > 0) { contracts/Disputes.sol:L107 => _actionType > 0 && _actionType <= uint8(ActionType.TaskPay), contracts/HomeFi.sol:L245 => return projectTokenId[_project] > 0; contracts/Project.sol:L195 => require(_cost > 0, "Project:L!value>0"); contracts/Project.sol:L380 => if (_leftOutTokens > 0) { contracts/Project.sol:L601 => if (_changeOrderedTask.length > 0) { contracts/Project.sol:L691 => if (_loopCount > 0) emit TaskAllocated(_tasksAllocated); contracts/mock/HomeFiMock.sol:L171 => return projectTokenId[_project] > 0;
The unchecked keyword is new in solidity version 0.8.0, so this only applies to that version or higher, which these instances are. This saves 30-40 gas per loop
contracts/Community.sol:L624 for (uint256 i = 0; i < _communities[_communityID].memberCount; i++) { contracts/HomeFiProxy.sol:L87 for (uint256 i = 0; i < _length; i++) { contracts/HomeFiProxy.sol:L136 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L248 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L311 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L322 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L603 for (; i < _changeOrderedTask.length; i++) {
contracts/Community.sol:L624 for (uint256 i = 0; i < _communities[_communityID].memberCount; i++) { contracts/HomeFiProxy.sol:L87 for (uint256 i = 0; i < _length; i++) { contracts/HomeFiProxy.sol:L136 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L248 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L311 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L322 for (uint256 i = 0; i < _length; i++) { contracts/Project.sol:L603 for (; i < _changeOrderedTask.length; i++) {
Similar issue can be found here. Split the require statements to save gas.
https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L353-L357 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L61-L65 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L106-L109
Custom errors are available from solidity version 0.8.4. Custom errors save ~50 gas each time theyโre hit by avoiding having to allocate and store the revert string. Consider using custom errors rather than revert()/require() strings to save gas.
https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L69 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L75 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L81-L84 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L90-L93 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L131-L134 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L159-L162 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L191-L194 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L235-L238 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L241 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L248 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L251-L254 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L312-L315 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L347-L350 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L353-L357 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L384-L387 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L400-L409 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L491-L494 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L536 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L539-L542 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L557 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L568 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L764 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L792 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Community.sol#L886-L889 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/DebtToken.sol#L31-L34 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/DebtToken.sol#L50 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L39 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L46 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L52 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L61-L65 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L106-L109 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Disputes.sol#L183 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFiProxy.sol#L41 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFiProxy.sol#L81 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFiProxy.sol#L105-L108 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFiProxy.sol#L133 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFi.sol#L73 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFi.sol#L78 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFi.sol#L84 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFi.sol#L142 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFi.sol#L191 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/HomeFi.sol#L255-L260 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/ProjectFactory.sol#L36 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/ProjectFactory.sol#L64-L67 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/ProjectFactory.sol#L84 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L123 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L132 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L135 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L150 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L153 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L176 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L189-L192 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L195 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L199-L202 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L238 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L241 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L245 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L277 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L301-L304 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L308 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L341 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L369 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L406 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L511 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L515-L518 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L521-L526 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L530 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L753 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L886-L889 https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L906-L909
#0 - zgorizzo69
2022-08-09T09:47:38Z
thanks for your work