Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
PantherPair._update(uint256,uint256,uint112,uint112) (#368-381) uses a weak PRNG: "blockTimestamp = uint32(block.timestamp % 2 ** 32) (#370)"
Do not use block.timestamp, now or blockhash as a source of randomness
Additional information: link
PantherPair._safeTransfer(address,address,uint256) (#339-342) uses a dangerous strict equality:
- require(bool,string)(success && (data.length == 0 || abi.decode(data,(bool))),Panther: TRANSFER_FAILED) (#341)
PantherPair.mint(address) (#405-426) uses a dangerous strict equality:
- _totalSupply == 0 (#414)
Don't use strict equality to determine if an account has enough Ether or tokens.
Additional information: link
Pragma version>=0.5.0 (#3) allows old versions
Pragma version>=0.5.0 (#58) allows old versions
Pragma version>=0.5.0 (#249) allows old versions
Pragma version>=0.5.0 (#269) allows old versions
Pragma version>=0.5.0 (#289) allows old versions
Deploy with any of the following Solidity versions: 0.5.16 - 0.5.17, 0.6.11 - 0.6.12, 0.7.5 - 0.7.6 Use a simple pragma version that allows any of these versions. Consider using the latest version of Solidity for testing.
Additional information: link
Low level call in PantherPair._safeTransfer(address,address,uint256) (#339-342):
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Function IPantherPair.DOMAIN_SEPARATOR() (#20) is not in mixedCase
Function IPantherPair.PERMIT_TYPEHASH() (#21) is not in mixedCase
Function IPantherPair.MINIMUM_LIQUIDITY() (#38) is not in mixedCase
Function IPantherERC20.DOMAIN_SEPARATOR() (#75) is not in mixedCase
Function IPantherERC20.PERMIT_TYPEHASH() (#76) is not in mixedCase
Variable PantherERC20.DOMAIN_SEPARATOR (#118) is not in mixedCase
Parameter PantherPair.initialize(address,address)._token0 (#361) is not in mixedCase
Parameter PantherPair.initialize(address,address)._token1 (#361) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Variable PantherPair.swap(uint256,uint256,address,bytes).balance0Adjusted (#475) is too similar to PantherPair.swap(uint256,uint256,address,bytes).balance1Adjusted (#476)
Variable PantherPair.price0CumulativeLast (#321) is too similar to PantherPair.price1CumulativeLast (#322)
Prevent variables from having similar names.
Additional information: link
Contract ticker (PANTHER-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.
Reentrancy in PantherPair.burn(address) (#429-451):
External calls:
- _safeTransfer(_token0,to,amount0) (#443)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- _safeTransfer(_token1,to,amount1) (#444)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
Event emitted after the call(s):
- Burn(msg.sender,amount0,amount1,to) (#450)
- Sync(reserve0,reserve1) (#380)
- _update(balance0,balance1,_reserve0,_reserve1) (#448)
Reentrancy in PantherPair.swap(uint256,uint256,address,bytes) (#454-482):
External calls:
- _safeTransfer(_token0,to,amount0Out) (#465)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- _safeTransfer(_token1,to,amount1Out) (#466)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- IPantherCallee(to).pantherCall(msg.sender,amount0Out,amount1Out,data) (#467)
Event emitted after the call(s):
- Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to) (#481)
- Sync(reserve0,reserve1) (#380)
- _update(balance0,balance1,_reserve0,_reserve1) (#480)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in PantherPair.burn(address) (#429-451):
External calls:
- _safeTransfer(_token0,to,amount0) (#443)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- _safeTransfer(_token1,to,amount1) (#444)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#448)
- blockTimestampLast = blockTimestamp (#379)
- kLast = uint256(reserve0).mul(reserve1) (#449)
- _update(balance0,balance1,_reserve0,_reserve1) (#448)
- reserve0 = uint112(balance0) (#377)
- _update(balance0,balance1,_reserve0,_reserve1) (#448)
- reserve1 = uint112(balance1) (#378)
Reentrancy in PantherPair.swap(uint256,uint256,address,bytes) (#454-482):
External calls:
- _safeTransfer(_token0,to,amount0Out) (#465)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- _safeTransfer(_token1,to,amount1Out) (#466)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- IPantherCallee(to).pantherCall(msg.sender,amount0Out,amount1Out,data) (#467)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#480)
- blockTimestampLast = blockTimestamp (#379)
- _update(balance0,balance1,_reserve0,_reserve1) (#480)
- reserve0 = uint112(balance0) (#377)
- _update(balance0,balance1,_reserve0,_reserve1) (#480)
- reserve1 = uint112(balance1) (#378)
Apply the check-effects-interactions pattern.
Additional information: link
PantherPair.initialize(address,address)._token0 (#361) lacks a zero-check on :
- token0 = _token0 (#363)
PantherPair.initialize(address,address)._token1 (#361) lacks a zero-check on :
- token1 = _token1 (#364)
Check that the address is not zero.
Additional information: link
Reentrancy in PantherPair.burn(address) (#429-451):
External calls:
- _safeTransfer(_token0,to,amount0) (#443)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- _safeTransfer(_token1,to,amount1) (#444)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#448)
- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (#374)
- _update(balance0,balance1,_reserve0,_reserve1) (#448)
- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (#375)
Reentrancy in PantherPair.swap(uint256,uint256,address,bytes) (#454-482):
External calls:
- _safeTransfer(_token0,to,amount0Out) (#465)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- _safeTransfer(_token1,to,amount1Out) (#466)
- (success,data) = token.call(abi.encodeWithSelector(SELECTOR,to,value)) (#340)
- IPantherCallee(to).pantherCall(msg.sender,amount0Out,amount1Out,data) (#467)
State variables written after the call(s):
- _update(balance0,balance1,_reserve0,_reserve1) (#480)
- price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed (#374)
- _update(balance0,balance1,_reserve0,_reserve1) (#480)
- price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed (#375)
Apply the check-effects-interactions pattern.
Additional information: link
PantherERC20.permit(address,address,uint256,uint256,uint8,bytes32,bytes32) (#183-195) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(deadline >= block.timestamp,Panther: EXPIRED) (#184)
PantherPair._update(uint256,uint256,uint112,uint112) (#368-381) uses timestamp for comparisons
Dangerous comparisons:
- timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0 (#372)
Avoid relying on block.timestamp.
Additional information: link
PantherERC20.constructor() (#126-140) uses assembly
- INLINE ASM (#128-130)
Do not use evm assembly.
Additional information: link
Different versions of Solidity is used:
- Version used: ['=0.5.16', '>=0.5.0']
- >=0.5.0 (#3)
- >=0.5.0 (#58)
- =0.5.16 (#84)
- =0.5.16 (#104)
- =0.5.16 (#200)
- =0.5.16 (#226)
- >=0.5.0 (#249)
- >=0.5.0 (#269)
- >=0.5.0 (#289)
- =0.5.16 (#297)
Use one Solidity version.
Additional information: link
Unable to find website, listings and other project-related information
Token has a considerable age, but we're still unable to find its website
Token has no active CoinGecko listing / rank
Token has no active CoinMarketCap listing / rank
Token has a considerable age, but social accounts / website are missing or have few users
Token has a considerable age, but average PancakeSwap 30d trading volume is low
Young tokens have high risks of price dump / death
Unable to find Telegram and Twitter accounts