code-423n4 / 2022-05-rubicon-findings

5 stars 2 forks source link

Gas Optimizations #379

Open code423n4 opened 2 years ago

code423n4 commented 2 years ago

1. Title: Set as immutable can save gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/peripheral_contracts/BathBuddy.sol#L31-L33 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/peripheral_contracts/TokenWithFaucet.sol#L12-L13

Recommended Mitigation Steps: can be set as immutable, which already set once in the constructor

========================================================================

2. Title: Using unchecked can save gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/peripheral_contracts/WETH9.sol#L50

Recommended Mitigation Steps: balanceOf[msg.sender] value was checked that it's >= than wad so using unchecked can save gas:

unchecked{
    balanceOf[msg.sender] -= wad;
}

========================================================================

3. Title: Using calldata to store struct data type can save gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L292

Recommended Mitigation Steps:

    function getOfferInfo(uint256 id) internal view returns (order calldata) {

========================================================================

4. Title: Using storage to declare Struct variable inside function

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L299 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L214

Recommended Mitigation Steps:

    order storage offerInfo = order(ask_amt, ask_gem, bid_amt, bid_gem);

========================================================================

5. Title: unnecessary variable set. the default value of bool is false

Proof of Concept: https://github.com/code-423n4/2022-05-enso/blob/main/contracts/routers/FullRouter.sol#L483

Recommended Mitigation Steps: remove false value for gas saving

========================================================================

6. Title: Using multiple require instead && can save gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L471-L477 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L120-L125 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L332-L336

Recommended Mitigation Steps:

        require(askNumerators.length == askDenominators.length, "not all input lengths match");
        require(askDenominators.length == bidNumerators.length, "not all input lengths match");
        require(bidNumerators.length == bidDenominators.length, "not all input lengths match");
        require(ids.length == askNumerators.length, "not all input lengths match");

========================================================================

7. Title: Using == true cost more gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathPair.sol#L148-L152 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathHouse.sol#L372 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathToken.sol#L227-L230

Recommended Mitigation Steps: Using == true to validate bool variable is unnecessary:

require(
            IBathHouse(bathHouse).isApprovedStrategist(targetStrategist),
            "you are not an approved strategist - bathPair"
        );

========================================================================

8. Title: Using delete statement to empty maxAssets can save gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathToken.sol#L481 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathToken.sol#L495

Recommended Mitigation Steps:

    delete maxAssets;

========================================================================

9. Title: Using > instead >= can save gas

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/rubiconPools/BathToken.sol#L722

Recommended Mitigation Steps: 1 second difference can be ignored to validate. using > operator can save gas

require(deadline >= block.timestamp, "bathToken: EXPIRED");

========================================================================

10. Title: Using != is more gas efficient

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconMarket.sol#L400 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconMarket.sol#L402 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconMarket.sol#L918 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconMarket.sol#L942

Recommended Mitigation Steps: Change to !=

    require(pay_amt != 0);

========================================================================

11. Title: unnecessary variable set. the default value of uint is 0

Proof of Concept: https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconMarket.sol#L990 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconRouter.sol#L82-L83 https://github.com/code-423n4/2022-05-rubicon/blob/main/contracts/RubiconRouter.sol#L168

Recommended Mitigation Steps: remove 0 value

========================================================================