Cheers Land Farm - Smart Contract Audit Report
Summary
Cheers Land Farm is a new yield farming contract that pays rewards to stakers in designated rewards tokens.
Notes on the CheersLpPool Contract:
- This contract allows anyone to stake a single asset determined by the project team in exchange for rewards.
- On initialization, the owner must specify the rewards token, the staking token, and the start of the staking period; rewards will stop being distributed 90 days after the start date.
- The team must exercise caution when deciding the staking token to avoid fee-on-transfer and ERC777-compliant tokens (this is uncommon).
- If a threshold value of staking tokens is reached during a deposit, users may be whitelisted in various "association pools".
- If a user falls below the threshold value of an association pool during a withdrawal, they may be removed from the whitelist for that association pool.
- The threshold value for each pool is independent and may be different for each pool.
- The team should exercise caution to not add too many association pools, as this may cause loops in the deposit and withdrawal function to hit the gas block limit.
- Users will receive a reward amount on each block based on the amount staked; staking rewards can be calculated and transferred to the user at any time.
- Rewards will not be received unless they are claimed, they are not distributed during regular deposits and withdrawals.
- A fee will be taken and sent to a fee address if tokens are withdrawn before the cooldown time since the the user's most recent deposit has passed.
- The owner is able to set the start/end time and stop reward distribution at any time.
- The owner is able to add and remove association pools at any time.
- The owner is able to update the fee percentage taken for early withdrawal, the cooldown period after staking, and the address that receives fees at any time.
- The owner is able to update the rewards rate at any time.
- The owner is able to update the designated staking token at any time.
Audit Findings Summary
- Utilization of SafeMath to prevent overflows.
- No external threats were identified.
- Ensure trust in the team as they have considerable control within the ecosystem.
- Date: November 16th, 2021.
Audit Results
Vulnerability Category | Notes | Result |
---|---|---|
Arbitrary Storage Write | N/A | PASS |
Arbitrary Jump | N/A | PASS |
Delegate Call to Untrusted Contract | N/A | PASS |
Dependence on Predictable Variables | N/A | PASS |
Deprecated Opcodes | N/A | PASS |
Ether Thief | N/A | PASS |
Exceptions | N/A | PASS |
External Calls | N/A | PASS |
Flash Loans | N/A | PASS |
Integer Over/Underflow | N/A | PASS |
Multiple Sends | N/A | PASS |
Oracles | N/A | PASS |
Suicide | N/A | PASS |
State Change External Calls | N/A | PASS |
Unchecked Retval | N/A | PASS |
User Supplied Assertion | N/A | PASS |
Critical Solidity Compiler | N/A | PASS |
Overall Contract Safety | PASS |
($) = payable function
# = non-constant function
+ [Lib] Address
- [Int] isContract
- [Int] sendValue #
- [Int] functionCall #
- [Int] functionCall #
- [Int] functionCallWithValue #
- [Int] functionCallWithValue #
- [Int] functionStaticCall
- [Int] functionStaticCall
- [Int] functionDelegateCall #
- [Int] functionDelegateCall #
- [Int] verifyCallResult
+ [Lib] Math
- [Int] max
- [Int] min
- [Int] average
- [Int] ceilDiv
+ [Lib] SafeMath
- [Int] tryAdd
- [Int] trySub
- [Int] tryMul
- [Int] tryDiv
- [Int] tryMod
- [Int] add
- [Int] sub
- [Int] mul
- [Int] div
- [Int] mod
- [Int] sub
- [Int] div
- [Int] mod
+ [Int] IERC20
- [Ext] totalSupply
- [Ext] balanceOf
- [Ext] transfer #
- [Ext] allowance
- [Ext] approve #
- [Ext] transferFrom #
+ [Lib] SafeERC20
- [Int] safeTransfer #
- [Int] safeTransferFrom #
- [Int] safeApprove #
- [Int] safeIncreaseAllowance #
- [Int] safeDecreaseAllowance #
- [Prv] _callOptionalReturn #
+ CheersLpPool (Auth)
- [Pub] Constructor #
- [Pub] lastTimeRewardApplicable
- [Pub] rewardPerToken
- [Pub] earned
- [Pub] stake #
- modifiers: checkStart,updateReward
- [Pub] withdraw #
- modifiers: updateReward
- [Pub] receiveRewards #
- modifiers: updateReward
- [Pub] addAssociationPool #
- modifiers: onlyOperator
- [Pub] deleteAssociationPool #
- modifiers: onlyOperator
- [Pub] updateMortgageLp #
- modifiers: onlyOperator
- [Pub] updateFeeAddress #
- modifiers: onlyOperator
- [Pub] updateStartTime #
- modifiers: onlyOperator
- [Pub] updateEndTime #
- modifiers: onlyOperator
- [Pub] updateMiningOutput #
- modifiers: onlyOperator
- [Pub] setWithDrawPunishTime #
- modifiers: onlyOperator
- [Pub] setFeeRatio #
- modifiers: onlyOperator
- [Pub] getMortgageNum
- [Pub] isMortgage
- [Pub] isStart
- [Pub] getDailyReward
- [Pub] getUserPunishTime
- [Pub] remainingTime
- [Pub] balanceOfByUser