LibMarket Code Style Findings
LibMarket Code Style Findings
LMT-01C: Code Duplication
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | LibMarket.sol:L55-L60, L62-L67 |
Description:
The linked functions perform the exact same statements.
Example:
55function buy(uint256 buyBeanAmount) internal returns (uint256 amount) {56 (uint256 ethAmount, uint256 beanAmount) = _buy(buyBeanAmount, msg.value, msg.sender);57 (bool success,) = msg.sender.call{ value: msg.value.sub(ethAmount) }("");58 require(success, "Market: Refund failed.");59 return beanAmount;60}61
62function buyAndDeposit(uint256 buyBeanAmount) internal returns (uint256 amount) {63 (uint256 ethAmount, uint256 beanAmount) = _buy(buyBeanAmount, msg.value, address(this));64 (bool success,) = msg.sender.call{ value: msg.value.sub(ethAmount) }("");65 require(success, "Market: Refund failed.");66 return beanAmount;67}
Recommendation:
We advise either one to be removed or both to utilise a secondary private function to reduce the byte code size of the contract.
Alleviation:
The optimization outlined is no longer relevant as refunds are performed at a different level.
LMT-02C: Redundant Future Trade Timestamp
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | LibMarket.sol:L104, L237, L255, L274, L290, L306 |
Description:
The linked addition of 1 to the current block.timestamp for the Uniswap trade execution is redundant as the trade system of Uniswap [simply evaluates that the value passed in is greater-than-or-equal (>=) the current block.timestamp].
Example:
93function removeLiquidity(uint256 liqudity, uint256 minBeanAmount,uint256 minEthAmount)94 internal95 returns (uint256 beanAmount, uint256 ethAmount)96{97 DiamondStorage storage ds = diamondStorage();98 return IUniswapV2Router02(ds.router).removeLiquidityETH(99 ds.bean,100 liqudity,101 minBeanAmount,102 minEthAmount,103 msg.sender,104 block.timestamp.add(1)105 );106}
Recommendation:
We advise the addition to be removed optimising the codebase.
Alleviation:
The block.timestamp value is now directly utilized as advised.
LMT-03C: Redundant Usage of SafeMath
| Type | Severity | Location |
|---|---|---|
| Gas Optimization | LibMarket.sol:L131, L167, L168, L179, L181, L208, L212, L325, L328 |
Description:
The linked SafeMath operations are guaranteed to be performed safely by their surrounding if clauses and general logical constraints.
Example:
318function transferAllocatedBeans(uint256 allocatedBeans, uint256 transferBeans) internal {319 DiamondStorage storage ds = diamondStorage();320 if (allocatedBeans == 0) {321 IBean(ds.bean).transferFrom(msg.sender, address(this), transferBeans);322 }323 else if (allocatedBeans >= transferBeans) {324 emit BeanAllocation(msg.sender, transferBeans);325 if (allocatedBeans > transferBeans) IBean(ds.bean).transfer(msg.sender, allocatedBeans.sub(transferBeans));326 } else {327 emit BeanAllocation(msg.sender, allocatedBeans);328 IBean(ds.bean).transferFrom(msg.sender, address(this), transferBeans.sub(allocatedBeans));329 }330}
Recommendation:
We advise them to be performed without the usage of SafeMath to optimise the code.
Alleviation:
The code was updated to omit all redundant SafeMath calculations thereby optimizing it extensively.