Juicebox V2 contest - RedOneN's results

The decentralized fundraising and treasury protocol.

General Information

Platform: Code4rena

Start Date: 01/07/2022

Pot Size: $75,000 USDC

Total HM: 17

Participants: 105

Period: 7 days

Judge: Jack the Pug

Total Solo HM: 5

Id: 143

League: ETH

Juicebox

Findings Distribution

Researcher Performance

Rank: 77/105

Findings: 1

Award: $45.80

🌟 Selected for report: 0

🚀 Solo Findings: 0

[G-01] - Caching storage variable in memory to save gas :   8 instances across 3 contracts.

File : JBFundingCycleStore.sol function = "queudOf", var="latestConfigurationOf[_projectId]" (2sloads) JBFundingCycleStore.sol:143 JBFundingCycleStore.sol:158 function = "currentOf", var="latestConfigurationOf[_projectId]" (2sloads) JBFundingCycleStore.sol:201 JBFundingCycleStore.sol:224 function = "_configureIntrinsicPropertiesFor", var="latestConfigurationOf[_projectId]" (2sloads) JBFundingCycleStore.sol:392 JBFundingCycleStore.sol:403   File : JBDirectory.sol function = "primaryTerminalOf", var= "_primaryTerminalOf[_projectId][_token]" (3 sloads) JBDirectory.sol:134 JBDirectory.sol:135 JBDirectory.sol:136 function = "primaryTerminalOf", var= "_terminalOf[_projectId]" (2 sloads) JBDirectory.sol:139 JBDirectory.sol:140 function = "setControllerOf", var="controllerOf[_projectId]" (5sloads) JBDirectory.sol:218 JBDirectory.sol:219 JBDirectory.sol:230 JBDirectory.sol:231 JBDirectory.sol:236 function = "setTerminalsOf", var="controllerOf[_projectId]" (2sloads) JBDirectory.sol:258 JBDirectory.sol:266   File : JBController.sol function= "mintTokensOf", var="_processedTokenTrackerOf[_projectId]" (2sloads) JBController.sol:667 JBController.sol:680         [G-02] - Use informations already available in memory rather than re-calling them from storage

3 instances in one contract.   File: JBTokenStore.sol Function= "burnFrom", var= "unclaimedBalanceOf[_holder][_projectId]" already in line 330 JBTokenStore.sol:359 Function= "claimFrom", var= "unclaimedBalanceOf[_holder][_projectId]" already in line 403 JBTokenStore.sol:409 Function= "transferFrom", var= "unclaimedBalanceOf[_holder][_projectId]" already in line 442 JBTokenStore.sol:448     [G-03] - For memory variable "x"+="y" is more gas efficient than "x"="x"+"y" :   5 instances across 4 contracts.

File : JBTokenStore.sol JBTokenStore.sol:123 JBTokenStore.sol:148   File : JBSplitsStore.sol JBSplitsStore.sol:237   JBFundingCycleStore.sol JBFundingCycleStore.sol:686   File : JBSingleTokenPaymentTerminalStore.sol JBSingleTokenPaymentTerminalStore.sol:863         

  [G-04] - It costs more gas to initialize variables to zero than to let the default of zero be applied. This is mainly the case for storage but is also observed for memory.

17 instances across 7 contracts   File: JBProjects.sol JBProjects.sol:40   File: JBFundingCycleStore.sol JBFundingCycleStore.sol:724   File: JBSplitsStore.sol JBSplitsStore.sol:165 JBSplitsStore.sol:204 JBSplitsStore.sol:211 JBSplitsStore.sol:227 JBSplitsStore.sol:229 JBSplitsStore.sol:304   File: JBOperatorStore.sol JBOperatorStore.sol:85 JBOperatorStore.sol:135 JBOperatorStore.sol:165   File: JBDirectory.sol JBDirectory.sol:139 JBDirectory.sol:167 JBDirectory.sol:275   File: JBController.sol JBController.sol:913 JBController.sol:1014   File: JBSingleTokenPaymentTerminalStore.sol JBSingleTokenPaymentTerminalStore.sol:862         [G-05] -  ++i costs less gas than i++, especially when it’s used in for-loops. Saves 6 gas per loop 

15 instances across 6 contracts.

File: JBFundingCycleStore.sol JBFundingCycleStore.sol:724   File: JBSplitsStore.sol JBSplitsStore.sol:204 JBSplitsStore.sol:211 JBSplitsStore.sol:229 JBSplitsStore.sol:304   File: JBOperatorStore.sol JBOperatorStore.sol:85 JBOperatorStore.sol:135 JBOperatorStore.sol:165   File: JBDirectory.sol JBDirectory.sol:139 JBDirectory.sol:167 JBDirectory.sol:275 JBDirectory.sol:276   File: JBController.sol JBController.sol:913 JBController.sol:1014   File: JBSingleTokenPaymentTerminalStore.sol JBSingleTokenPaymentTerminalStore.sol:862         [G-06] - ++i/i++ should be unchecked{++i}/unchecked{i++} when it is not possible for them to overflow, as is the case when used in for- and while-loops

15 instances across 6 contracts.   File: JBFundingCycleStore.sol JBFundingCycleStore.sol:724   File: JBSplitsStore.sol JBSplitsStore.sol:204 JBSplitsStore.sol:211 JBSplitsStore.sol:229 JBSplitsStore.sol:304   File: JBOperatorStore.sol JBOperatorStore.sol:85 JBOperatorStore.sol:135 JBOperatorStore.sol:165   File: JBDirectory.sol JBDirectory.sol:139 JBDirectory.sol:167 JBDirectory.sol:275 JBDirectory.sol:276   File: JBController.sol JBController.sol:913 JBController.sol:1014   File: JBSingleTokenPaymentTerminalStore.sol JBSingleTokenPaymentTerminalStore.sol:862         [G-07] - Consider a more recent version of solidity   Use solidity 0.8.10 to have external calls skip contract existence checks if the external call has a return value.          [G-08] - Functions guaranteed to revert (such as onlyOwner) when called by normal users can be marked payable. If a function modifier such as onlyOwner is used, the function will revert if a normal user tries to pay the function. Marking the function as payable will lower the gas cost for legitimate callers because the compiler will not include checks for whether a payment was provided.

5 instances across 2 contracts.   File : JBTokenStore.sol JBTokenStore.sol:192 JBTokenStore.sol:240 JBTokenStore.sol:288 JBTokenStore.sol:325   File : JBFundingCycleStore.sol JBFundingCycleStore.sol:299         [G-09] - Cheaper input valdiations should come before expensive operations

1 instance

File: JBTokenStore.sol JBTokenStore.sol:246 -> could come before JBTokenStore.sol:242       [G-10] - Duplicated require()/revert() checks should be refactored to a modifier or function   File: JBTokenStore.sol revert TOKEN_NOT_FOUND() is called twice : JBTokenStore.sol:477 JBTokenStore.sol:400

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