Omniscia DappRadar Audit
RadarStakingLogic Code Style Findings
RadarStakingLogic Code Style Findings
RSL-01C: Ineffectual Usage of Safe Arithmetics
Type | Severity | Location |
---|---|---|
Language Specific | RadarStakingLogic.sol:L116 |
Description:
The linked mathematical operation is guaranteed to be performed safely by surrounding conditionals evaluated in either require
checks or if-else
constructs.
Example:
115require(myStake.totalStaked >= amount, "RadarStakingLogic: Amount you want to unstake exceeds your staked amount");116require((myStake.totalStaked - amount >= stakeForDappRadarPro) || (myStake.totalStaked - amount == 0), "RadarStakingLogic: Either unstake all or keep more than the minimum stake required");
Recommendation:
Given that safe arithmetics are toggled on by default in pragma
versions of 0.8.X
, we advise the linked statement to be wrapped in an unchecked
code block thereby optimizing its execution cost.
Alleviation (8614454f02ec2934ccfdc3f17974be01ca6c1709):
The DappRadar team has not provided any remediation for this exhibit instead opting to acknowledge it.
RSL-02C: Loop Iterator Optimizations
Type | Severity | Location |
---|---|---|
Gas Optimization | RadarStakingLogic.sol:L144, L183 |
Description:
The linked for
loops increment / decrement their iterator "safely" due to Solidity's built - in safe arithmetics (post-0.8.X
).
Example:
144for (uint256 i = 0; i < allAprs.length; i++) {
Recommendation:
We advise the increment / decrement operations to be performed in an unchecked
code block as the last statement within each for
loop to optimize their execution cost.
Alleviation (8614454f02ec2934ccfdc3f17974be01ca6c1709):
The DappRadar team has not provided any remediation for this exhibit instead opting to acknowledge it.
RSL-03C: Redundant EIP-20 Token Evaluations
Type | Severity | Location |
---|---|---|
Gas Optimization | RadarStakingLogic.sol:L54, L56 |
Description:
The referenced require
statements within RadarStakingLogic::stake
are redundant as their failure would cause the ensuing ERC20::transferFrom
operation to fail regardless.
Example:
47function stake(uint256 amount) external nonReentrant {48 require(amount >= 0, "RadarStakingLogic: Amount must be above 0");49 50 iRadarStake.Stake memory myStake = radarStakeContract.getStake(_msgSender());51 require(myStake.totalStaked + amount >= stakeForDappRadarPro, "RadarStakingLogic: You cannot stake less than the minimum");52
53 // check if the user owns the amount of tokens he wants to stake54 require(radarTokenContract.balanceOf(_msgSender()) >= amount, "RadarStakingLogic: Not enough tokens to stake");55 // check if this contract is allowed to move users RADAR to the staking contract56 require(radarTokenContract.allowance(_msgSender(), address(this)) >= amount, "RadarStakingLogic: This contact is not allowed to move the amount of tokens you want to stake");57
58 // move tokens from the user to the staking contract59 radarTokenContract.transferFrom(_msgSender(), address(radarStakeContract), amount);60 61 // calculate reward in case the user already had a stake and now added to it62 uint256 tokenReward = calculateReward(_msgSender());63 64 // move additional tokens to the staking contract so it can later pay out the already accrued rewards65 if (tokenReward > 0) {66 radarTokenContract.transferFrom(rewardAddress, address(radarStakeContract), tokenReward);67 }68
69 // add to stake, which updates totals and timestamps70 radarStakeContract.addToStake(amount + tokenReward, _msgSender());71 72 emit TokensStaked(_msgSender(), amount + tokenReward);73}
Recommendation:
We advise them to be safely omitted from the codebase, optimizing its gas cost significantly.
Alleviation (8614454f02ec2934ccfdc3f17974be01ca6c1709):
The DappRadar team has not provided any remediation for this exhibit instead opting to acknowledge it.
RSL-04C: Redundant Parenthesis Statements
Type | Severity | Location |
---|---|---|
Code Style | RadarStakingLogic.sol:L116, L150, L151, L168 |
Description:
The referenced statements are redundantly wrapped in parenthesis' (()
).
Example:
116require((myStake.totalStaked - amount >= stakeForDappRadarPro) || (myStake.totalStaked - amount == 0), "RadarStakingLogic: Either unstake all or keep more than the minimum stake required");
Recommendation:
We advise them to be safely omitted, increasing the legibility of the codebase.
Alleviation (8614454f02ec2934ccfdc3f17974be01ca6c1709):
The DappRadar team has not provided any remediation for this exhibit instead opting to acknowledge it.
RSL-05C: Variable Mutability Specifiers (Immutable)
Type | Severity | Location |
---|---|---|
Gas Optimization | RadarStakingLogic.sol:L27, L29, L31 |
Description:
The linked variables are assigned to only once during the contract's constructor
.
Example:
13constructor(address rewardAddr, address radarTokenContractAddr, address radarStakeContractAddr) {14 rewardAddress = rewardAddr;15 radarTokenContract = iRadarToken(radarTokenContractAddr);16 radarStakeContract = iRadarStake(radarStakeContractAddr);17}
Recommendation:
We advise them to be set as immutable
greatly optimizing their read-access gas cost.
Alleviation (8614454f02ec2934ccfdc3f17974be01ca6c1709):
The DappRadar team has not provided any remediation for this exhibit instead opting to acknowledge it.