Omniscia Platypus Finance Audit
MasterPlatypus Manual Review Findings
MasterPlatypus Manual Review Findings
MPS-01M: Conditional Emission Discrepancy
Type | Severity | Location |
---|---|---|
Logical Fault | Medium | MasterPlatypus.sol:L229, L230, L286, L292 |
Description:
The emission of a particular pool is dynamic depending on whether people have a non-diluted (factor
) power within it. This means that the emission rate of the whole contract will be discrepant and will not match the ptpPerSec
value if at least one of all pools has zero factor
given that the nonDialutingRepartition
is not emitted when pool.sumOfFactors
is 0
.
Example:
contracts/MasterPlatypus.sol
282// calculate ptp reward283uint256 ptpReward = (secondsElapsed * ptpPerSec * pool.allocPoint) / totalAllocPoint;284
285// update accPtpPerShare to reflect dialuting rewards286pool.accPtpPerShare += (ptpReward * 1e12 * dialutingRepartition) / (lpSupply * 1000);287
288// update accPtpPerFactorShare to reflect non-dialuting rewards289if (pool.sumOfFactors == 0) {290 pool.accPtpPerFactorShare = 0;291} else {292 pool.accPtpPerFactorShare += (ptpReward * 1e12 * nonDialutingRepartition) / (pool.sumOfFactors * 1000);293}
Recommendation:
We advise the code to introduce an else
statement that emits the full ptpReward
amount to simple stakers to ensure a consistent emission rate across the system.
Alleviation:
After discussion with the Platypus team, we identified that this is indeed desired behaviour as the system is not meant to emit the non diluting portion if no stakers exist. As such, we consider this exhibit null.