Rigor Protocol contest - erictee's results

Community lending and instant payments for new home construction.

General Information

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

Rigor Protocol

Findings Distribution

Researcher Performance

Rank: 82/133

Findings: 2

Award: $62.35

๐ŸŒŸ Selected for report: 0

๐Ÿš€ Solo Findings: 0

[L-01] Missing checks for address(0x0) when assigning values to address state variables.

Code in Question

https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/Project.sol#L94-L105

[L-02] Missing Initializer modifier

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.

Code in Question

https://github.com/code-423n4/2022-08-rigor/blob/main/contracts/ProjectFactory.sol#L16-L20

[G- 01] Explicit initialization with zero and false not required

Impact

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.

Code in Question

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;

[G- 02] Cache Array Length Outside of Loop

Impact

Cache array length outside of loop to save gas.

Code in Question

contracts/Project.sol:L603 for (; i < _changeOrderedTask.length; i++) {

[G- 03] Use != 0 instead of > 0 for Unsigned Integer Comparison

Impact

When dealing with unsigned integer types, comparisons with != 0 are cheaper then with > 0.

Code in Question

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;

[G- 04] Replace ++I/I++ to UNCHECKED{++I}/UNCHECKED{I++} when it is not possible for them to overflow.

Impact

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

Code in Question

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++) {

[G- 05] ++i costs less gas than i++, especially when it's used in for-loops ( same for --i/i--)

Code in Question

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++) {

[G- 06] Splitting require() statements that use && saves gas

Impact

Similar issue can be found here. Split the require statements to save gas.

Code in Question

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

[G- 07] Use custom errors rather than revert()/require() strings

Impact

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.

Code in Question

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

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax ยฉ 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter