Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
PEECOIN.swapBack() (#343-389) sends eth to arbitrary user
Dangerous calls:
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
Ensure that an arbitrary user cannot withdraw unauthorized funds.
Additional information: link
Reentrancy in PEECOIN._transferFrom(address,address,uint256) (#264-297):
External calls:
- swapBack() (#288)
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#361-367)
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
External calls sending eth:
- swapBack() (#288)
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
State variables written after the call(s):
- _balances[sender] = _balances[sender] - amount (#290)
- _balances[recipient] = _balances[recipient] + amountReceived (#293)
- amountReceived = takeFee(recipient,amount) (#292)
- _balances[address(this)] = _balances[address(this)] + (feeAmount) (#330)
Apply the check-effects-interactions pattern.
Additional information: link
Combination 1: Reentrancy vulnerabilities + Functions that send Ether to arbitraty destination. Usual for scams. May be justified by some complex mechanics (e.g. rebase, reflections). DYOR & manual audit are advised.
PEECOIN.takeFee(address,uint256) (#327-334) performs a multiplication on the result of a division:
-feeAmount = amount / 100 * (totalFee) (#328)
PEECOIN.swapBack() (#343-389) performs a multiplication on the result of a division:
-amountToLiquify = tokensToSell / (totalFee) * (liquidityFee) / (2) (#352)
PEECOIN.setSwapBackSettings(bool,uint256,uint256) (#450-454) performs a multiplication on the result of a division:
-swapThreshold = _totalSupply / (100) * (_percentage_min_base100) (#452)
PEECOIN.setSwapBackSettings(bool,uint256,uint256) (#450-454) performs a multiplication on the result of a division:
-maxSwapSize = _totalSupply / (100) * (_percentage_max_base100) (#453)
PEECOIN.setMaxWalletPercent_base100(uint256) (#464-466) performs a multiplication on the result of a division:
-_maxWalletToken = _totalSupply / (100) * (maxWallPercent_base100) (#465)
PEECOIN.setMaxBuyTxPercent_base100(uint256) (#468-470) performs a multiplication on the result of a division:
-_maxBuyTxAmount = _totalSupply / (100) * (maxBuyTXPercentage_base100) (#469)
PEECOIN.setMaxSellTxPercent_base100(uint256) (#472-474) performs a multiplication on the result of a division:
-_maxSellTxAmount = _totalSupply / (100) * (maxSellTXPercentage_base100) (#473)
PEECOIN.slitherConstructorVariables() (#162-494) performs a multiplication on the result of a division:
-_maxBuyTxAmount = _totalSupply / (100) * (2) (#198)
PEECOIN.slitherConstructorVariables() (#162-494) performs a multiplication on the result of a division:
-_maxSellTxAmount = _totalSupply / (100) * (2) (#199)
PEECOIN.slitherConstructorVariables() (#162-494) performs a multiplication on the result of a division:
-_maxWalletToken = _totalSupply / (100) * (6) (#200)
PEECOIN.slitherConstructorVariables() (#162-494) performs a multiplication on the result of a division:
-swapThreshold = _totalSupply / 1000 * 1 (#213)
PEECOIN.slitherConstructorVariables() (#162-494) performs a multiplication on the result of a division:
-maxSwapSize = _totalSupply / 100 * 1 (#214)
Consider ordering multiplication before division.
Additional information: link
PEECOIN.addLiquidity(uint256,uint256) (#391-403) ignores return value by router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
Ensure that all the return values of the function calls are used.
Additional information: link
PEECOIN.setBuyFees(uint256,uint256,uint256,uint256) (#427-433) should emit an event for:
- BuyliquidityFee = _liquidityFee (#428)
- BuyteamFee = _teamFee (#429)
- BuymarketingFee = _marketingFee (#430)
- BuydevFee = _devFee (#431)
- BuytotalFee = _liquidityFee + (_teamFee) + (_marketingFee) + (_devFee) (#432)
PEECOIN.setSellFees(uint256,uint256,uint256,uint256) (#435-441) should emit an event for:
- SellliquidityFee = _liquidityFee (#436)
- SellteamFee = _teamFee (#437)
- SellmarketingFee = _marketingFee (#438)
- SelldevFee = _devFee (#439)
- SelltotalFee = _liquidityFee + (_teamFee) + (_marketingFee) + (_devFee) (#440)
PEECOIN.setSwapBackSettings(bool,uint256,uint256) (#450-454) should emit an event for:
- swapThreshold = _totalSupply / (100) * (_percentage_min_base100) (#452)
- maxSwapSize = _totalSupply / (100) * (_percentage_max_base100) (#453)
PEECOIN.setMaxWalletPercent_base100(uint256) (#464-466) should emit an event for:
- _maxWalletToken = _totalSupply / (100) * (maxWallPercent_base100) (#465)
PEECOIN.setMaxBuyTxPercent_base100(uint256) (#468-470) should emit an event for:
- _maxBuyTxAmount = _totalSupply / (100) * (maxBuyTXPercentage_base100) (#469)
PEECOIN.setMaxSellTxPercent_base100(uint256) (#472-474) should emit an event for:
- _maxSellTxAmount = _totalSupply / (100) * (maxSellTXPercentage_base100) (#473)
Emit an event for critical parameter changes.
Additional information: link
PEECOIN.setFeeReceivers(address,address,address,address)._autoLiquidityReceiver (#443) lacks a zero-check on :
- autoLiquidityReceiver = _autoLiquidityReceiver (#444)
PEECOIN.setFeeReceivers(address,address,address,address)._marketingFeeReceiver (#443) lacks a zero-check on :
- marketingFeeReceiver = _marketingFeeReceiver (#445)
PEECOIN.setFeeReceivers(address,address,address,address)._teamFeeReceiver (#443) lacks a zero-check on :
- teamFeeReceiver = _teamFeeReceiver (#446)
PEECOIN.setFeeReceivers(address,address,address,address)._devFeeReceiver (#443) lacks a zero-check on :
- devFeeReceiver = _devFeeReceiver (#447)
Check that the address is not zero.
Additional information: link
Reentrancy in PEECOIN.constructor() (#220-231):
External calls:
- pair = IDEXFactory(router.factory()).createPair(WBNB,address(this)) (#223)
State variables written after the call(s):
- _allowances[address(this)][address(router)] = type()(uint256).max (#224)
- _balances[msg.sender] = _totalSupply (#229)
- isFeeExempt[msg.sender] = true (#226)
- isTxLimitExempt[msg.sender] = true (#227)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in PEECOIN._transferFrom(address,address,uint256) (#264-297):
External calls:
- swapBack() (#288)
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#361-367)
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
External calls sending eth:
- swapBack() (#288)
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
Event emitted after the call(s):
- Transfer(sender,address(this),feeAmount) (#331)
- amountReceived = takeFee(recipient,amount) (#292)
- Transfer(sender,recipient,amountReceived) (#295)
Reentrancy in PEECOIN.addLiquidity(uint256,uint256) (#391-403):
External calls:
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
Event emitted after the call(s):
- AutoLiquify(bnbAmount,tokenAmount) (#401)
Reentrancy in PEECOIN.constructor() (#220-231):
External calls:
- pair = IDEXFactory(router.factory()).createPair(WBNB,address(this)) (#223)
Event emitted after the call(s):
- Transfer(address(0),msg.sender,_totalSupply) (#230)
Reentrancy in PEECOIN.swapBack() (#343-389):
External calls:
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#361-367)
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
- addLiquidity(amountToLiquify,amountBNBLiquidity) (#388)
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
External calls sending eth:
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
- addLiquidity(amountToLiquify,amountBNBLiquidity) (#388)
- router.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,autoLiquidityReceiver,block.timestamp) (#393-400)
Event emitted after the call(s):
- AutoLiquify(bnbAmount,tokenAmount) (#401)
- addLiquidity(amountToLiquify,amountBNBLiquidity) (#388)
Apply the check-effects-interactions pattern.
Additional information: link
Ownable.Ownershipunlock() (#94-99) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(block.timestamp > _lockTime,Contract is locked) (#96)
Avoid relying on block.timestamp.
Additional information: link
PEECOIN.BuytotalFee (#189) is set pre-construction with a non-constant function or state variable:
- BuyliquidityFee + BuydevFee + BuymarketingFee + BuyteamFee
PEECOIN.SelltotalFee (#195) is set pre-construction with a non-constant function or state variable:
- SellliquidityFee + SelldevFee + SellmarketingFee + SellteamFee
PEECOIN._maxBuyTxAmount (#198) is set pre-construction with a non-constant function or state variable:
- _totalSupply / (100) * (2)
PEECOIN._maxSellTxAmount (#199) is set pre-construction with a non-constant function or state variable:
- _totalSupply / (100) * (2)
PEECOIN._maxWalletToken (#200) is set pre-construction with a non-constant function or state variable:
- _totalSupply / (100) * (6)
PEECOIN.swapThreshold (#213) is set pre-construction with a non-constant function or state variable:
- _totalSupply / 1000 * 1
PEECOIN.maxSwapSize (#214) is set pre-construction with a non-constant function or state variable:
- _totalSupply / 100 * 1
Remove any initialization of state variables via non-constant state variables or function calls. If variables must be set upon contract deployment, locate initialization in the constructor instead.
Additional information: link
Low level call in PEECOIN.swapBack() (#343-389):
- (MarketingSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#379)
- (teamSuccess) = address(teamFeeReceiver).call{gas: 30000,value: amountBNBteam}() (#381)
- (devSuccess) = address(devFeeReceiver).call{gas: 30000,value: amountBNBDev}() (#383)
- (gasSuccess) = address(routerGas).call{gas: 30000,value: amountBNBRoutergas}() (#385)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Function Ownable.Ownershiplock(uint256) (#87-92) is not in mixedCase
Function Ownable.Ownershipunlock() (#94-99) is not in mixedCase
Function IDEXRouter.WETH() (#112) is not in mixedCase
Parameter PEECOIN.setBuyFees(uint256,uint256,uint256,uint256)._liquidityFee (#427) is not in mixedCase
Parameter PEECOIN.setBuyFees(uint256,uint256,uint256,uint256)._teamFee (#427) is not in mixedCase
Parameter PEECOIN.setBuyFees(uint256,uint256,uint256,uint256)._marketingFee (#427) is not in mixedCase
Parameter PEECOIN.setBuyFees(uint256,uint256,uint256,uint256)._devFee (#427) is not in mixedCase
Parameter PEECOIN.setSellFees(uint256,uint256,uint256,uint256)._liquidityFee (#435) is not in mixedCase
Parameter PEECOIN.setSellFees(uint256,uint256,uint256,uint256)._teamFee (#435) is not in mixedCase
Parameter PEECOIN.setSellFees(uint256,uint256,uint256,uint256)._marketingFee (#435) is not in mixedCase
Parameter PEECOIN.setSellFees(uint256,uint256,uint256,uint256)._devFee (#435) is not in mixedCase
Parameter PEECOIN.setFeeReceivers(address,address,address,address)._autoLiquidityReceiver (#443) is not in mixedCase
Parameter PEECOIN.setFeeReceivers(address,address,address,address)._marketingFeeReceiver (#443) is not in mixedCase
Parameter PEECOIN.setFeeReceivers(address,address,address,address)._teamFeeReceiver (#443) is not in mixedCase
Parameter PEECOIN.setFeeReceivers(address,address,address,address)._devFeeReceiver (#443) is not in mixedCase
Parameter PEECOIN.setSwapBackSettings(bool,uint256,uint256)._enabled (#450) is not in mixedCase
Parameter PEECOIN.setSwapBackSettings(bool,uint256,uint256)._percentage_min_base100 (#450) is not in mixedCase
Parameter PEECOIN.setSwapBackSettings(bool,uint256,uint256)._percentage_max_base100 (#450) is not in mixedCase
Function PEECOIN.setMaxWalletPercent_base100(uint256) (#464-466) is not in mixedCase
Parameter PEECOIN.setMaxWalletPercent_base100(uint256).maxWallPercent_base100 (#464) is not in mixedCase
Function PEECOIN.setMaxBuyTxPercent_base100(uint256) (#468-470) is not in mixedCase
Parameter PEECOIN.setMaxBuyTxPercent_base100(uint256).maxBuyTXPercentage_base100 (#468) is not in mixedCase
Function PEECOIN.setMaxSellTxPercent_base100(uint256) (#472-474) is not in mixedCase
Parameter PEECOIN.setMaxSellTxPercent_base100(uint256).maxSellTXPercentage_base100 (#472) is not in mixedCase
Variable PEECOIN.WBNB (#164) is not in mixedCase
Variable PEECOIN.DEAD (#165) is not in mixedCase
Variable PEECOIN.ZERO (#166) is not in mixedCase
Constant PEECOIN._name (#168) is not in UPPER_CASE_WITH_UNDERSCORES
Constant PEECOIN._symbol (#169) is not in UPPER_CASE_WITH_UNDERSCORES
Constant PEECOIN._decimals (#170) is not in UPPER_CASE_WITH_UNDERSCORES
Variable PEECOIN._totalSupply (#171) is not in mixedCase
Variable PEECOIN._balances (#173) is not in mixedCase
Variable PEECOIN._allowances (#174) is not in mixedCase
Variable PEECOIN.BuyliquidityFee (#185) is not in mixedCase
Variable PEECOIN.BuydevFee (#186) is not in mixedCase
Variable PEECOIN.BuymarketingFee (#187) is not in mixedCase
Variable PEECOIN.BuyteamFee (#188) is not in mixedCase
Variable PEECOIN.BuytotalFee (#189) is not in mixedCase
Variable PEECOIN.SellliquidityFee (#191) is not in mixedCase
Variable PEECOIN.SelldevFee (#192) is not in mixedCase
Variable PEECOIN.SellmarketingFee (#193) is not in mixedCase
Variable PEECOIN.SellteamFee (#194) is not in mixedCase
Variable PEECOIN.SelltotalFee (#195) is not in mixedCase
Variable PEECOIN._maxBuyTxAmount (#198) is not in mixedCase
Variable PEECOIN._maxSellTxAmount (#199) is not in mixedCase
Variable PEECOIN._maxWalletToken (#200) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Variable IDEXRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountADesired (#117) is too similar to IDEXRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountBDesired (#118)
Variable PEECOIN.setSwapBackSettings(bool,uint256,uint256)._percentage_max_base100 (#450) is too similar to PEECOIN.setSwapBackSettings(bool,uint256,uint256)._percentage_min_base100 (#450)
Prevent variables from having similar names.
Additional information: link
PEECOIN.slitherConstructorVariables() (#162-494) uses literals with too many digits:
- DEAD = 0x000000000000000000000000000000000000dEaD (#165)
PEECOIN.slitherConstructorVariables() (#162-494) uses literals with too many digits:
- ZERO = 0x0000000000000000000000000000000000000000 (#166)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
PEECOIN.ZERO (#166) is never used in PEECOIN (#162-494)
Remove unused state variables.
Additional information: link
PEECOIN.DEAD (#165) should be constant
PEECOIN.WBNB (#164) should be constant
PEECOIN.ZERO (#166) should be constant
PEECOIN._totalSupply (#171) should be constant
Add the constant attributes to state variables that never change.
Additional information: link
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (#77-81)
getUnlockTime() should be declared external:
- Ownable.getUnlockTime() (#83-85)
Ownershiplock(uint256) should be declared external:
- Ownable.Ownershiplock(uint256) (#87-92)
Ownershipunlock() should be declared external:
- Ownable.Ownershipunlock() (#94-99)
rescueToken(address,uint256) should be declared external:
- PEECOIN.rescueToken(address,uint256) (#482-484)
Use the external attribute for functions never called from the contract.
Additional information: link
Unable to find website, listings and other project-related information
Young tokens have high risks of scam / price dump / death
Token has no active CoinGecko listing / rank
Token has no active CoinMarketCap listing / rank
Unable to find Telegram and Twitter accounts