code-423n4 / 2022-06-nested-findings

0 stars 1 forks source link

Gas Optimizations #44

Open code423n4 opened 2 years ago

code423n4 commented 2 years ago

Issue: Require message is too long Explanation: The require revert strings below can be shortened to 32 characters or fewer (as shown) to save gas

All four lines referenced below incorporate the same long require() string:

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L229

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L230

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L319

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L320

Example:

        require(targets.length == values.length, "TimelockController: length mismatch");

Change message to TimelockController: len mismatch in each case

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L243

        require(!isOperation(id), "TimelockController: operation already scheduled");

Change message to TimelockController: op alr sched

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L244

        require(delay >= getMinDelay(), "TimelockController: insufficient delay");

Change message to TimelockController: insuf delay

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L256

        require(isOperationPending(id), "TimelockController: operation cannot be cancelled");

Change message to TimelockController: can't cxl op

Both lines referenced below incorporate the same long require() string:

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L334

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L342

        require(isOperationReady(id), "TimelockController: operation is not ready");

Change message to TimelockController: op not ready

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L335

        require(predecessor == bytes32(0) || isOperationDone(predecessor), "TimelockController: missing dependency");

Change message to TimelockController:no dependency

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L359

        require(success, "TimelockController: underlying transaction reverted");

Not clear how to shorten message

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/governance/TimelockControllerEmergency.sol#L375

        require(msg.sender == address(this), "TimelockController: caller must be timelock");

Not clear how to shorten message

Issue: Use of '&&' within a require function

Explanation: Splitting such require() statements into separate requires saves gas

https://github.com/code-423n4/2022-02-nested/blob/fe6f9ef7783c3c84798c8ab5fc58085a55cebcfc/contracts/NestedFactory.sol#L54-L62

        require(
            address(_nestedAsset) != address(0) &&
                address(_nestedRecords) != address(0) &&
                address(_reserve) != address(0) &&
                address(_feeSplitter) != address(0) &&
                address(_weth) != address(0) &&
                _operatorResolver != address(0),
            "NF: INVALID_ADDRESS"
        );

Recommendation:

        require(address(_nestedAsset) != address(0), "NF: INVALID_ADDRESS");
        require(address(_nestedRecords) != address(0), "NF: INVALID_ADDRESS");
        require(address(_reserve) != address(0), "NF: INVALID_ADDRESS");
        require(address(_feeSplitter) != address(0), "NF: INVALID_ADDRESS");
        require(address(_weth) != address(0), "NF: INVALID_ADDRESS");
        require( _operatorResolver != address(0), "NF: INVALID_ADDRESS");

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/operators/Beefy/BeefyVaultOperator.sol#L54

        require(vaultAmount != 0 && vaultAmount >= minVaultAmount, "BVO: INVALID_AMOUNT_RECEIVED");

Recommendation:

        require(vaultAmount != 0, "BVO: INVALID_AMOUNT_RECEIVED");
        require(vaultAmount >= minVaultAmount, "BVO: INVALID_AMOUNT_RECEIVED");

Similarly for the following require statements:

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/operators/Beefy/lp/BeefyZapBiswapLPVaultOperator.sol#L64

        require(vaultAmount != 0 && vaultAmount >= minVaultAmount, "BLVO: INVALID_AMOUNT_RECEIVED");

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/operators/Beefy/lp/BeefyZapBiswapLPVaultOperator.sol#L65

        require(depositedAmount != 0 && amountToDeposit >= depositedAmount, "BLVO: INVALID_AMOUNT_DEPOSITED");

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/operators/Beefy/lp/BeefyZapUniswapLPVaultOperator.sol#L64

        require(vaultAmount != 0 && vaultAmount >= minVaultAmount, "BLVO: INVALID_AMOUNT_RECEIVED");

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/operators/Beefy/lp/BeefyZapUniswapLPVaultOperator.sol#L65

        require(depositedAmount != 0 && amountToDeposit >= depositedAmount, "BLVO: INVALID_AMOUNT_DEPOSITED");

https://github.com/code-423n4/2022-06-nested/blob/b4a153c943d54755711a2f7b80cbbf3a5bb49d76/contracts/operators/Paraswap/ParaswapOperator.sol#L16

        require(_tokenTransferProxy != address(0) && _augustusSwapper != address(0), "PSO: INVALID_ADDRESS");
obatirou commented 2 years ago

Issue: Require message is too long (duplicate)

https://github.com/code-423n4/2022-06-nested-findings/issues/62#issuecomment-1165547704

obatirou commented 2 years ago

Issue: Use of '&&' within a require function (duplicate)

https://github.com/code-423n4/2022-06-nested-findings/issues/29#issuecomment-1165702145