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

2 stars 0 forks source link

Gas Optimizations #283

Open code423n4 opened 2 years ago

code423n4 commented 2 years ago

Gas Optimizations

These three optimizations gives us these changes: old code:

    function getDutchAuctionStrike(
        uint256 startingStrike,
        uint32 auctionEndTimestamp,
        uint256 reserveStrike
    ) public view returns (uint256 strike) {
        /*
            delta = max(auctionEnd - currentTimestamp, 0)
            progress = delta / auctionDuration
            auctionStrike = progress^2 * startingStrike
            strike = max(auctionStrike, reserveStrike)
        */
        uint256 delta = auctionEndTimestamp > block.timestamp ? auctionEndTimestamp - block.timestamp : 0;
        uint256 progress = (1e18 * delta) / AUCTION_DURATION;
        uint256 auctionStrike = (progress * progress * startingStrike) / (1e18 * 1e18);

        // max(auctionStrike, reserveStrike)
        strike = auctionStrike > reserveStrike ? auctionStrike : reserveStrike;
    }
new code:
```sol
function getDutchAuctionStrike(
    uint256 startingStrike,
    uint32 auctionEndTimestamp,
    uint256 reserveStrike
) public view returns (uint256 strike) {
    /*
        delta = max(auctionEnd - currentTimestamp, 0)
        progress = delta / auctionDuration
        auctionStrike = progress^2 * startingStrike
        strike = max(auctionStrike, reserveStrike)
    */
    // this is because `auctionStrike == 0` so `auctionStrike > reserveStrike == false` for every value of reserveStrike
    if (auctionEndTimestamp > block.timestamp) return reserveStrike;

    unchecked {
        uint256 delta = auctionEndTimestamp - block.timestamp; // it won't underflow because of the if statement
    }
    uint256 progress = (1e18 * delta) / AUCTION_DURATION;
    uint256 auctionStrike = (progress * progress * startingStrike) / 1e36; // instead of 1e18 * 1e18

    // max(auctionStrike, reserveStrike)
    strike = auctionStrike > reserveStrike ? auctionStrike : reserveStrike;
}
```