code-423n4 / 2021-09-wildcredit-findings

0 stars 0 forks source link

Cache and check decimals before write storage can save gas #73

Open code423n4 opened 3 years ago

code423n4 commented 3 years ago

Handle

WatchPug

Vulnerability details

https://github.com/code-423n4/2021-09-wildcredit/blob/main/contracts/LendingPair.sol#L93-L96

  function initialize(
    address _lpTokenMaster,
    address _lendingController,
    address _uniV3Helper,
    address _feeRecipient,
    address _tokenA,
    address _tokenB
  ) external {
    require(tokenA == address(0), "LendingPair: already initialized");
    require(_tokenA != address(0) && _tokenB != address(0), "LendingPair: cannot be ZERO address");

    lendingController = ILendingController(_lendingController);
    uniV3Helper       = IUniswapV3Helper(_uniV3Helper);
    feeRecipient      = _feeRecipient;
    tokenA = _tokenA;
    tokenB = _tokenB;
    lastBlockAccrued[tokenA] = block.number;
    lastBlockAccrued[tokenB] = block.number;

    decimals[tokenA] = IERC20(tokenA).decimals();
    decimals[tokenB] = IERC20(tokenB).decimals();

    require(decimals[tokenA] >= 6 && decimals[tokenB] >= 6, "LendingPair: min 6 decimals");

    lpToken[tokenA] = _createLpToken(_lpTokenMaster, tokenA);
    lpToken[tokenB] = _createLpToken(_lpTokenMaster, tokenB);
  }

Cache and check token decimals before write storage can save gas.

Recommendation

Consider changing to:

uint decimalsTokenA = IERC20(tokenA).decimals();
uint decimalsTokenB = IERC20(tokenB).decimals();

require(decimalsTokenA  >= 6 && decimalsTokenB >= 6, "LendingPair: min 6 decimals");

decimals[tokenA] = decimalsTokenA;
decimals[tokenB] = decimalsTokenB;