Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
PancakePair._update(uint256,uint256,uint112,uint112) (#322-335) uses a weak PRNG: "blockTimestamp = uint32(block.timestamp % 2 ** 32) (#324)"
Do not use block.timestamp, now or blockhash as a source of randomness
Additional information: link
PancakePair._safeTransfer(address,address,uint256) (#293-296) uses a dangerous strict equality:
- require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),Pancake: TRANSFER_FAILED) (#295)
PancakePair.mint(address) (#359-380) uses a dangerous strict equality:
- _totalSupply == 0 (#368)
Don't use strict equality to determine if an account has enough Ether or tokens.
Additional information: link
Reentrancy in PancakePair.burn(address) (#383-405):
External calls:
- _safeTransfer(_token0,to,amount0) (#397)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- _safeTransfer(_token1,to,amount1) (#398)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#402)
- blockTimestampLast = blockTimestamp (#333)
- kLast = uint256(reserve0).mul(reserve1) (#403)
- _update(balance0,balance1,_reserve0,_reserve1) (#402)
- reserve0 = uint112(balance0) (#331)
- _update(balance0,balance1,_reserve0,_reserve1) (#402)
- reserve1 = uint112(balance1) (#332)
Reentrancy in KnightFactory.createPair(address,address) (#471-486):
External calls:
- IPancakePair(pair).initialize(token0,token1) (#481)
State variables written after the call(s):
- getPair[token0][token1] = pair (#482)
- getPair[token1][token0] = pair (#483)
Reentrancy in PancakePair.swap(uint256,uint256,address,bytes) (#408-436):
External calls:
- _safeTransfer(_token0,to,amount0Out) (#419)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- _safeTransfer(_token1,to,amount1Out) (#420)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- IPancakeCallee(to).pancakeCall(msg.sender,amount0Out,amount1Out,data) (#421)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#434)
- blockTimestampLast = blockTimestamp (#333)
- _update(balance0,balance1,_reserve0,_reserve1) (#434)
- reserve0 = uint112(balance0) (#331)
- _update(balance0,balance1,_reserve0,_reserve1) (#434)
- reserve1 = uint112(balance1) (#332)
Apply the check-effects-interactions pattern.
Additional information: link
PancakePair.initialize(address,address)._token0 (#315) lacks a zero-check on :
- token0 = _token0 (#317)
PancakePair.initialize(address,address)._token1 (#315) lacks a zero-check on :
- token1 = _token1 (#318)
KnightFactory.constructor(address)._feeToSetter (#463) lacks a zero-check on :
- feeToSetter = _feeToSetter (#464)
KnightFactory.setFeeTo(address)._feeTo (#488) lacks a zero-check on :
- feeTo = _feeTo (#490)
KnightFactory.setFeeToSetter(address)._feeToSetter (#493) lacks a zero-check on :
- feeToSetter = _feeToSetter (#495)
Check that the address is not zero.
Additional information: link
Reentrancy in PancakePair.burn(address) (#383-405):
External calls:
- _safeTransfer(_token0,to,amount0) (#397)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- _safeTransfer(_token1,to,amount1) (#398)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#402)
- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (#328)
- _update(balance0,balance1,_reserve0,_reserve1) (#402)
- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (#329)
Reentrancy in KnightFactory.createPair(address,address) (#471-486):
External calls:
- IPancakePair(pair).initialize(token0,token1) (#481)
State variables written after the call(s):
- allPairs.push(pair) (#484)
Reentrancy in PancakePair.swap(uint256,uint256,address,bytes) (#408-436):
External calls:
- _safeTransfer(_token0,to,amount0Out) (#419)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- _safeTransfer(_token1,to,amount1Out) (#420)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- IPancakeCallee(to).pancakeCall(msg.sender,amount0Out,amount1Out,data) (#421)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#434)
- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (#328)
- _update(balance0,balance1,_reserve0,_reserve1) (#434)
- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (#329)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in PancakePair.burn(address) (#383-405):
External calls:
- _safeTransfer(_token0,to,amount0) (#397)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- _safeTransfer(_token1,to,amount1) (#398)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
Event emitted after the call(s):
- Burn(msg.sender,amount0,amount1,to) (#404)
- Sync(reserve0,reserve1) (#334)
- _update(balance0,balance1,_reserve0,_reserve1) (#402)
Reentrancy in KnightFactory.createPair(address,address) (#471-486):
External calls:
- IPancakePair(pair).initialize(token0,token1) (#481)
Event emitted after the call(s):
- PairCreated(token0,token1,pair,allPairs.length) (#485)
Reentrancy in PancakePair.swap(uint256,uint256,address,bytes) (#408-436):
External calls:
- _safeTransfer(_token0,to,amount0Out) (#419)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- _safeTransfer(_token1,to,amount1Out) (#420)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
- IPancakeCallee(to).pancakeCall(msg.sender,amount0Out,amount1Out,data) (#421)
Event emitted after the call(s):
- Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to) (#435)
- Sync(reserve0,reserve1) (#334)
- _update(balance0,balance1,_reserve0,_reserve1) (#434)
Apply the check-effects-interactions pattern.
Additional information: link
PancakeERC20.permit(address,address,uint256,uint256,uint8,bytes32,bytes32) (#187-199) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(deadline >= block.timestamp,Pancake: EXPIRED) (#188)
PancakePair._update(uint256,uint256,uint112,uint112) (#322-335) uses timestamp for comparisons
Dangerous comparisons:
- timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0 (#326)
Avoid relying on block.timestamp.
Additional information: link
PancakeERC20.constructor() (#130-144) uses assembly
- INLINE ASM (#132-134)
KnightFactory.createPair(address,address) (#471-486) uses assembly
- INLINE ASM (#478-480)
Do not use evm assembly.
Additional information: link
Low level call in PancakePair._safeTransfer(address,address,uint256) (#293-296):
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#294)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Function IPancakePair.DOMAIN_SEPARATOR() (#39) is not in mixedCase
Function IPancakePair.PERMIT_TYPEHASH() (#40) is not in mixedCase
Function IPancakePair.MINIMUM_LIQUIDITY() (#57) is not in mixedCase
Function IPancakeERC20.DOMAIN_SEPARATOR() (#90) is not in mixedCase
Function IPancakeERC20.PERMIT_TYPEHASH() (#91) is not in mixedCase
Variable PancakeERC20.DOMAIN_SEPARATOR (#122) is not in mixedCase
Parameter PancakePair.initialize(address,address)._token0 (#315) is not in mixedCase
Parameter PancakePair.initialize(address,address)._token1 (#315) is not in mixedCase
Parameter KnightFactory.setFeeTo(address)._feeTo (#488) is not in mixedCase
Parameter KnightFactory.setFeeToSetter(address)._feeToSetter (#493) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Variable PancakePair.swap(uint256,uint256,address,bytes).balance0Adjusted (#429) is too similar to PancakePair.swap(uint256,uint256,address,bytes).balance1Adjusted (#430)
Variable PancakePair.price0CumulativeLast (#275) is too similar to PancakePair.price1CumulativeLast (#276)
Prevent variables from having similar names.
Additional information: link
KnightFactory.createPair(address,address) (#471-486) uses literals with too many digits:
- bytecode = type(address)(PancakePair).creationCode (#476)
KnightFactory.slitherConstructorConstantVariables() (#452-498) uses literals with too many digits:
- INIT_CODE_PAIR_HASH = keccak256(bytes)(abi.encodePacked(type(address)(PancakePair).creationCode)) (#453)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
Contract ticker (Knight-LP) contains non-alphanumeric characters.
Not a direct threat, but may indicate unreliable intentions of developer. Non-alphanumeric chars (,.;!#*&") are extremely rare among low risk tokens.
Unable to find website, listings and other project-related information
Token has no active CoinGecko listing / rank
Token has no active CoinMarketCap listing / rank
Young tokens have high risks of price dump / death
Unable to find Telegram and Twitter accounts