INFO:Detectors:
MasterChef.pendingPavlova(uint256,address) (contracts/MasterChef.sol#139-152) performs a multiplication on the result of a division:
-pavlovaReward = multiplier.mul(pavlovaPerBlock).mul(pool.allocPoint).div(totalAllocPoint) (contracts/MasterChef.sol#146-148)
-accPavlovaPerShare = accPavlovaPerShare.add(pavlovaReward.mul(1e18).div(lpSupply)) (contracts/MasterChef.sol#149)
MasterChef.updatePool(uint256) (contracts/MasterChef.sol#163-183) performs a multiplication on the result of a division:
-pavlovaReward = multiplier.mul(pavlovaPerBlock).mul(pool.allocPoint).div(totalAllocPoint) (contracts/MasterChef.sol#174-176)
-pool.accPavlovaPerShare = pool.accPavlovaPerShare.add(pavlovaReward.mul(1e18).div(lpSupply)) (contracts/MasterChef.sol#179-181)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply
INFO:Detectors:
MasterChef.updatePool(uint256) (contracts/MasterChef.sol#163-183) uses a dangerous strict equality:
- lpSupply == 0 || pool.allocPoint == 0 (contracts/MasterChef.sol#169)
PavlovaToken._writeCheckpoint(address,uint32,uint256,uint256) (contracts/PavlovaToken.sol#198-217) uses a dangerous strict equality:
- nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber (contracts/PavlovaToken.sol#209)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities
INFO:Detectors:
Reentrancy in MasterChef.deposit(uint256,uint256) (contracts/MasterChef.sol#186-211):
External calls:
- updatePool(_pid) (contracts/MasterChef.sol#189)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
- safePavlovaTransfer(msg.sender,pending) (contracts/MasterChef.sol#195)
- transferSuccess = pavlova.transfer(_to,pavlovaBal) (contracts/MasterChef.sol#247)
- transferSuccess = pavlova.transfer(_to,_amount) (contracts/MasterChef.sol#249)
- pool.lpToken.safeTransferFrom(address(msg.sender),address(this),_amount) (contracts/MasterChef.sol#199)
- pool.lpToken.safeTransfer(feeAddress,depositFee) (contracts/MasterChef.sol#202)
State variables written after the call(s):
- user.amount = user.amount.add(_amount).sub(depositFee) (contracts/MasterChef.sol#204)
Reentrancy in MasterChef.deposit(uint256,uint256) (contracts/MasterChef.sol#186-211):
External calls:
- updatePool(_pid) (contracts/MasterChef.sol#189)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
- safePavlovaTransfer(msg.sender,pending) (contracts/MasterChef.sol#195)
- transferSuccess = pavlova.transfer(_to,pavlovaBal) (contracts/MasterChef.sol#247)
- transferSuccess = pavlova.transfer(_to,_amount) (contracts/MasterChef.sol#249)
- pool.lpToken.safeTransferFrom(address(msg.sender),address(this),_amount) (contracts/MasterChef.sol#199)
State variables written after the call(s):
- user.amount = user.amount.add(_amount) (contracts/MasterChef.sol#206)
Reentrancy in MasterChef.updateEmissionRate(uint256) (contracts/MasterChef.sol#270-274):
External calls:
- massUpdatePools() (contracts/MasterChef.sol#271)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
State variables written after the call(s):
- pavlovaPerBlock = _pavlovaPerBlock (contracts/MasterChef.sol#272)
Reentrancy in MasterChef.updatePool(uint256) (contracts/MasterChef.sol#163-183):
External calls:
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
State variables written after the call(s):
- pool.accPavlovaPerShare = pool.accPavlovaPerShare.add(pavlovaReward.mul(1e18).div(lpSupply)) (contracts/MasterChef.sol#179-181)
- pool.lastRewardBlock = block.number (contracts/MasterChef.sol#182)
Reentrancy in MasterChef.withdraw(uint256,uint256) (contracts/MasterChef.sol#214-229):
External calls:
- updatePool(_pid) (contracts/MasterChef.sol#218)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
- safePavlovaTransfer(msg.sender,pending) (contracts/MasterChef.sol#221)
- transferSuccess = pavlova.transfer(_to,pavlovaBal) (contracts/MasterChef.sol#247)
- transferSuccess = pavlova.transfer(_to,_amount) (contracts/MasterChef.sol#249)
State variables written after the call(s):
- user.amount = user.amount.sub(_amount) (contracts/MasterChef.sol#224)
Reentrancy in MasterChef.withdraw(uint256,uint256) (contracts/MasterChef.sol#214-229):
External calls:
- updatePool(_pid) (contracts/MasterChef.sol#218)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
- safePavlovaTransfer(msg.sender,pending) (contracts/MasterChef.sol#221)
- transferSuccess = pavlova.transfer(_to,pavlovaBal) (contracts/MasterChef.sol#247)
- transferSuccess = pavlova.transfer(_to,_amount) (contracts/MasterChef.sol#249)
- pool.lpToken.safeTransfer(address(msg.sender),_amount) (contracts/MasterChef.sol#225)
State variables written after the call(s):
- user.rewardDebt = user.amount.mul(pool.accPavlovaPerShare).div(1e18) (contracts/MasterChef.sol#227)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-1
INFO:Detectors:
MasterChef.constructor(PavlovaToken,uint256,address,address)._devAddress (contracts/MasterChef.sol#79) lacks a zero-check on :
- devAddress = _devAddress (contracts/MasterChef.sol#85)
MasterChef.constructor(PavlovaToken,uint256,address,address)._feeAddress (contracts/MasterChef.sol#80) lacks a zero-check on :
- feeAddress = _feeAddress (contracts/MasterChef.sol#86)
MasterChef.setDevAddress(address)._devAddress (contracts/MasterChef.sol#255) lacks a zero-check on :
- devAddress = _devAddress (contracts/MasterChef.sol#256)
MasterChef.setFeeAddress(address)._feeAddress (contracts/MasterChef.sol#260) lacks a zero-check on :
- feeAddress = _feeAddress (contracts/MasterChef.sol#261)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation
INFO:Detectors:
Reentrancy in MasterChef.deposit(uint256,uint256) (contracts/MasterChef.sol#186-211):
External calls:
- updatePool(_pid) (contracts/MasterChef.sol#189)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
- safePavlovaTransfer(msg.sender,pending) (contracts/MasterChef.sol#195)
- transferSuccess = pavlova.transfer(_to,pavlovaBal) (contracts/MasterChef.sol#247)
- transferSuccess = pavlova.transfer(_to,_amount) (contracts/MasterChef.sol#249)
- pool.lpToken.safeTransferFrom(address(msg.sender),address(this),_amount) (contracts/MasterChef.sol#199)
- pool.lpToken.safeTransfer(feeAddress,depositFee) (contracts/MasterChef.sol#202)
Event emitted after the call(s):
- Deposit(msg.sender,_pid,_amount) (contracts/MasterChef.sol#210)
Reentrancy in MasterChef.emergencyWithdraw(uint256) (contracts/MasterChef.sol#232-240):
External calls:
- pool.lpToken.safeTransfer(address(msg.sender),amount) (contracts/MasterChef.sol#238)
Event emitted after the call(s):
- EmergencyWithdraw(msg.sender,_pid,amount) (contracts/MasterChef.sol#239)
Reentrancy in MasterChef.updateEmissionRate(uint256) (contracts/MasterChef.sol#270-274):
External calls:
- massUpdatePools() (contracts/MasterChef.sol#271)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
Event emitted after the call(s):
- UpdateEmissionRate(msg.sender,_pavlovaPerBlock) (contracts/MasterChef.sol#273)
Reentrancy in MasterChef.withdraw(uint256,uint256) (contracts/MasterChef.sol#214-229):
External calls:
- updatePool(_pid) (contracts/MasterChef.sol#218)
- pavlova.mint(devAddress,pavlovaReward.div(10)) (contracts/MasterChef.sol#177)
- pavlova.mint(address(this),pavlovaReward) (contracts/MasterChef.sol#178)
- safePavlovaTransfer(msg.sender,pending) (contracts/MasterChef.sol#221)
- transferSuccess = pavlova.transfer(_to,pavlovaBal) (contracts/MasterChef.sol#247)
- transferSuccess = pavlova.transfer(_to,_amount) (contracts/MasterChef.sol#249)
- pool.lpToken.safeTransfer(address(msg.sender),_amount) (contracts/MasterChef.sol#225)
Event emitted after the call(s):
- Withdraw(msg.sender,_pid,_amount) (contracts/MasterChef.sol#228)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3
INFO:Detectors:
PavlovaToken.delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32) (contracts/PavlovaToken.sol#90-111) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(now <= expiry,PAVLOVA::delegateBySig: signature expired) (contracts/PavlovaToken.sol#109)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#block-timestamp
INFO:Detectors:
Address.isContract(address) (node_modules/@openzeppelin/contracts/utils/Address.sol#26-35) uses assembly
- INLINE ASM (node_modules/@openzeppelin/contracts/utils/Address.sol#33)
Address._verifyCallResult(bool,bytes,string) (node_modules/@openzeppelin/contracts/utils/Address.sol#171-188) uses assembly
- INLINE ASM (node_modules/@openzeppelin/contracts/utils/Address.sol#180-183)
PavlovaToken.getChainId() (contracts/PavlovaToken.sol#224-230) uses assembly
- INLINE ASM (contracts/PavlovaToken.sol#226-228)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage
INFO:Detectors:
MasterChef.nonDuplicated(IERC20) (contracts/MasterChef.sol#95-98) compares to a boolean constant:
-require(bool,string)(poolExistence[_lpToken] == false,nonDuplicated: duplicated) (contracts/MasterChef.sol#96)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#boolean-equality
INFO:Detectors:
Different versions of Solidity is used:
- Version used: ['0.6.12', '>=0.6.0<0.8.0', '>=0.6.2<0.8.0']
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/access/Ownable.sol#3)
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/math/SafeMath.sol#3)
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#3)
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol#3)
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol#3)
- >=0.6.2<0.8.0 (node_modules/@openzeppelin/contracts/utils/Address.sol#3)
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/utils/Context.sol#3)
- >=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol#3)
- 0.6.12 (contracts/MasterChef.sol#3)
- 0.6.12 (contracts/PavlovaToken.sol#3)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used
INFO:Detectors:
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/access/Ownable.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/math/SafeMath.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol#3) is too complex
Pragma version>=0.6.2<0.8.0 (node_modules/@openzeppelin/contracts/utils/Address.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/utils/Context.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol#3) is too complex
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity
INFO:Detectors:
Low level call in Address.sendValue(address,uint256) (node_modules/@openzeppelin/contracts/utils/Address.sol#53-59):
- (success) = recipient.call{value: amount}() (node_modules/@openzeppelin/contracts/utils/Address.sol#57)
Low level call in Address.functionCallWithValue(address,bytes,uint256,string) (node_modules/@openzeppelin/contracts/utils/Address.sol#114-121):
- (success,returndata) = target.call{value: value}(data) (node_modules/@openzeppelin/contracts/utils/Address.sol#119)
Low level call in Address.functionStaticCall(address,bytes,string) (node_modules/@openzeppelin/contracts/utils/Address.sol#139-145):
- (success,returndata) = target.staticcall(data) (node_modules/@openzeppelin/contracts/utils/Address.sol#143)
Low level call in Address.functionDelegateCall(address,bytes,string) (node_modules/@openzeppelin/contracts/utils/Address.sol#163-169):
- (success,returndata) = target.delegatecall(data) (node_modules/@openzeppelin/contracts/utils/Address.sol#167)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls
INFO:Detectors:
Parameter MasterChef.add(uint256,IERC20,uint16)._allocPoint (contracts/MasterChef.sol#102) is not in mixedCase
Parameter MasterChef.add(uint256,IERC20,uint16)._lpToken (contracts/MasterChef.sol#103) is not in mixedCase
Parameter MasterChef.add(uint256,IERC20,uint16)._depositFeeBP (contracts/MasterChef.sol#104) is not in mixedCase
Parameter MasterChef.set(uint256,uint256,uint16)._pid (contracts/MasterChef.sol#123) is not in mixedCase
Parameter MasterChef.set(uint256,uint256,uint16)._allocPoint (contracts/MasterChef.sol#124) is not in mixedCase
Parameter MasterChef.set(uint256,uint256,uint16)._depositFeeBP (contracts/MasterChef.sol#125) is not in mixedCase
Parameter MasterChef.getMultiplier(uint256,uint256)._from (contracts/MasterChef.sol#134) is not in mixedCase
Parameter MasterChef.getMultiplier(uint256,uint256)._to (contracts/MasterChef.sol#134) is not in mixedCase
Parameter MasterChef.pendingPavlova(uint256,address)._pid (contracts/MasterChef.sol#139) is not in mixedCase
Parameter MasterChef.pendingPavlova(uint256,address)._user (contracts/MasterChef.sol#139) is not in mixedCase
Parameter MasterChef.updatePool(uint256)._pid (contracts/MasterChef.sol#163) is not in mixedCase
Parameter MasterChef.deposit(uint256,uint256)._pid (contracts/MasterChef.sol#186) is not in mixedCase
Parameter MasterChef.deposit(uint256,uint256)._amount (contracts/MasterChef.sol#186) is not in mixedCase
Parameter MasterChef.withdraw(uint256,uint256)._pid (contracts/MasterChef.sol#214) is not in mixedCase
Parameter MasterChef.withdraw(uint256,uint256)._amount (contracts/MasterChef.sol#214) is not in mixedCase
Parameter MasterChef.emergencyWithdraw(uint256)._pid (contracts/MasterChef.sol#232) is not in mixedCase
Parameter MasterChef.safePavlovaTransfer(address,uint256)._to (contracts/MasterChef.sol#243) is not in mixedCase
Parameter MasterChef.safePavlovaTransfer(address,uint256)._amount (contracts/MasterChef.sol#243) is not in mixedCase
Parameter MasterChef.setDevAddress(address)._devAddress (contracts/MasterChef.sol#255) is not in mixedCase
Parameter MasterChef.setFeeAddress(address)._feeAddress (contracts/MasterChef.sol#260) is not in mixedCase
Parameter MasterChef.updateEmissionRate(uint256)._pavlovaPerBlock (contracts/MasterChef.sol#270) is not in mixedCase
Parameter MasterChef.updateStartBlock(uint256)._startBlock (contracts/MasterChef.sol#277) is not in mixedCase
Parameter PavlovaToken.mint(address,uint256)._to (contracts/PavlovaToken.sol#14) is not in mixedCase
Parameter PavlovaToken.mint(address,uint256)._amount (contracts/PavlovaToken.sol#14) is not in mixedCase
Variable PavlovaToken._delegates (contracts/PavlovaToken.sol#26) is not in mixedCase
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions
INFO:Detectors:
Redundant expression "this (node_modules/@openzeppelin/contracts/utils/Context.sol#21)" inContext (node_modules/@openzeppelin/contracts/utils/Context.sol#15-24)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#redundant-statements
INFO:Detectors:
renounceOwnership() should be declared external:
- Ownable.renounceOwnership() (node_modules/@openzeppelin/contracts/access/Ownable.sol#54-57)
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (node_modules/@openzeppelin/contracts/access/Ownable.sol#63-67)
symbol() should be declared external:
- ERC20.symbol() (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#72-74)
decimals() should be declared external:
- ERC20.decimals() (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#89-91)
totalSupply() should be declared external:
- ERC20.totalSupply() (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#96-98)
transfer(address,uint256) should be declared external:
- ERC20.transfer(address,uint256) (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#115-118)
allowance(address,address) should be declared external:
- ERC20.allowance(address,address) (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#123-125)
approve(address,uint256) should be declared external:
- ERC20.approve(address,uint256) (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#134-137)
transferFrom(address,address,uint256) should be declared external:
- ERC20.transferFrom(address,address,uint256) (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#152-156)
increaseAllowance(address,uint256) should be declared external:
- ERC20.increaseAllowance(address,uint256) (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#170-173)
decreaseAllowance(address,uint256) should be declared external:
- ERC20.decreaseAllowance(address,uint256) (node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol#189-192)
deposit(uint256,uint256) should be declared external:
- MasterChef.deposit(uint256,uint256) (contracts/MasterChef.sol#186-211)
withdraw(uint256,uint256) should be declared external:
- MasterChef.withdraw(uint256,uint256) (contracts/MasterChef.sol#214-229)
emergencyWithdraw(uint256) should be declared external:
- MasterChef.emergencyWithdraw(uint256) (contracts/MasterChef.sol#232-240)
mint(address,uint256) should be declared external:
- PavlovaToken.mint(address,uint256) (contracts/PavlovaToken.sol#14-17)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external
INFO:Slither:. analyzed (10 contracts with 75 detectors), 77 result(s) found