Omniscia Vector Finance Audit
BaseRewardPool Manual Review Findings
BaseRewardPool Manual Review Findings
BRP-01M: Improper Invocation of EIP-20 transferFrom
| Type | Severity | Location |
|---|---|---|
| Standard Conformity | Minor | BaseRewardPool.sol:L230-L236 |
Description:
The linked statement does not properly validate the returned bool of the EIP-20 standard transferFrom function. As the standard dictates, callers must not assume that false is never returned, however, certain tokens such as USDT (Tether) are non-standard and yield no bool causing such checks to fail.
Example:
230require(231 IERC20(_rewardToken).transferFrom(232 msg.sender,233 address(this),234 _amountReward235 )236);Recommendation:
We advise a safe wrapper library to be utilized instead such as SafeERC20 by OpenZeppelin to opportunistically validate the returned bool only if it exists.
Alleviation:
The safeTransferFrom function is now correctly utilized.
BRP-02M: Improper Unit Neutralization
| Type | Severity | Location |
|---|---|---|
| Mathematical Operations | Major | BaseRewardPool.sol:L171 |
Description:
The linked unit neutralization appears incorrect as the rewardPerTokenStored value already represents the reward token's deicmals and the calculation performs a multiplication of the staking and reward token decimals. Given that earned is meant to represent the reward token's decimals at the end, the staking decimals should be neutralized.
Example:
162function earned(address _account, address _rewardToken)163 public164 view165 returns (uint256)166{167 return (168 (((balanceOf(_account) *169 (rewardPerToken(_rewardToken) -170 userRewardPerTokenPaid[_rewardToken][_account])) /171 (10**rewardDecimals(_rewardToken))) +172 userRewards[_rewardToken][_account])173 );174}Recommendation:
We advise the codebase to be updated accordingly to avoid incorrect rewards being distributed by the contract.
Alleviation:
The correct decimal units are now utilized by the earned function.