Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
Contract ownership is not renounced (belongs to a wallet)
BHC._relaseFounding() (#658-676) uses timestamp for comparisons
Dangerous comparisons:
- currentTime > relaseEndTime || _balances[address(this)] < dayReleaseAmount (#660)
Avoid relying on block.timestamp.
Additional information: link
Address.isContract(address) (#109-117) uses assembly
- INLINE ASM (#113-115)
Address._functionCallWithValue(address,bytes,uint256,string) (#175-198) uses assembly
- INLINE ASM (#190-193)
Do not use evm assembly.
Additional information: link
Address._functionCallWithValue(address,bytes,uint256,string) (#175-198) is never used and should be removed
Address.functionCall(address,bytes) (#133-138) is never used and should be removed
Address.functionCall(address,bytes,string) (#140-146) is never used and should be removed
Address.functionCallWithValue(address,bytes,uint256) (#148-160) is never used and should be removed
Address.functionCallWithValue(address,bytes,uint256,string) (#162-173) is never used and should be removed
Address.isContract(address) (#109-117) is never used and should be removed
Address.sendValue(address,uint256) (#119-131) is never used and should be removed
BHC.transferToAddressETH(address,uint256) (#588-592) is never used and should be removed
Context._msgData() (#9-12) is never used and should be removed
SafeMath.mod(uint256,uint256) (#94-96) is never used and should be removed
SafeMath.mod(uint256,uint256,string) (#98-105) is never used and should be removed
Remove unused functions.
Additional information: link
BHC._totalSupply (#316) is set pre-construction with a non-constant function or state variable:
- 10000000000 * 10 ** _decimals
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
Pragma version^0.8.0 (#2) 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 Address.sendValue(address,uint256) (#119-131):
- (success) = recipient.call{value: amount}() (#126)
Low level call in Address._functionCallWithValue(address,bytes,uint256,string) (#175-198):
- (success,returndata) = target.call{value: weiValue}(data) (#183-185)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Parameter BHC.getRefers(address,uint256)._high (#775) is not in mixedCase
Variable BHC._balances (#295) is not in mixedCase
Variable BHC._destroyFee (#304) is not in mixedCase
Variable BHC._fistBounsFee (#306) is not in mixedCase
Variable BHC._marketingShares (#308) is not in mixedCase
Variable BHC._totalTaxIfPancakeTrading (#310) is not in mixedCase
Variable BHC._totalTaxIfTrading (#312) is not in mixedCase
Variable BHC._totalMarketingShareFee (#314) is not in mixedCase
Constant BHC.baseTime (#329) is not in UPPER_CASE_WITH_UNDERSCORES
Follow the Solidity naming convention.
Additional information: link
Redundant expression "this (#10)" inContext (#4-13)
Remove redundant statements if they congest code but offer no value.
Additional information: link
BHC.slitherConstructorVariables() (#267-851) uses literals with too many digits:
- deadAddress = 0x000000000000000000000000000000000000dEaD (#285)
BHC.slitherConstructorVariables() (#267-851) uses literals with too many digits:
- _totalSupply = 10000000000 * 10 ** _decimals (#316)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
Ownable._previousOwner (#203) is never used in BHC (#267-851)
Remove unused state variables.
Additional information: link
BHC._decimals (#273) should be constant
BHC._name (#271) should be constant
BHC._symbol (#272) should be constant
BHC.bscPriceAddress (#277) should be constant
BHC.deadAddress (#285) should be constant
BHC.fistBonusAddress (#293) should be constant
BHC.fistToken (#275) should be constant
Ownable._previousOwner (#203) should be constant
Add the constant attributes to state variables that never change.
Additional information: link
owner() should be declared external:
- Ownable.owner() (#216-218)
waiveOwnership() should be declared external:
- Ownable.waiveOwnership() (#225-228)
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (#230-237)
setLiquifyEnable(bool) should be declared external:
- BHC.setLiquifyEnable(bool) (#409-411)
setRelationSwitch(bool) should be declared external:
- BHC.setRelationSwitch(bool) (#413-415)
setFundingWalletAddress(address) should be declared external:
- BHC.setFundingWalletAddress(address) (#417-419)
setCrossChainWalletAddress(address) should be declared external:
- BHC.setCrossChainWalletAddress(address) (#421-423)
setPrizePoolWalletAddress(address) should be declared external:
- BHC.setPrizePoolWalletAddress(address) (#425-427)
setDaoWalletAddress(address) should be declared external:
- BHC.setDaoWalletAddress(address) (#429-431)
setRelationUsdtLimit(uint256) should be declared external:
- BHC.setRelationUsdtLimit(uint256) (#433-435)
setPancakeTradeFee(uint256,uint256) should be declared external:
- BHC.setPancakeTradeFee(uint256,uint256) (#437-444)
setMarketingShares(uint256[],uint256[]) should be declared external:
- BHC.setMarketingShares(uint256[],uint256[]) (#446-455)
setTranferDestroyFee(uint256) should be declared external:
- BHC.setTranferDestroyFee(uint256) (#471-473)
name() should be declared external:
- BHC.name() (#482-484)
symbol() should be declared external:
- BHC.symbol() (#486-488)
decimals() should be declared external:
- BHC.decimals() (#490-492)
totalSupply() should be declared external:
- BHC.totalSupply() (#494-496)
setOperator(address,bool) should be declared external:
- BHC.setOperator(address,bool) (#502-504)
allowance(address,address) should be declared external:
- BHC.allowance(address,address) (#511-518)
increaseAllowance(address,uint256) should be declared external:
- BHC.increaseAllowance(address,uint256) (#520-531)
decreaseAllowance(address,uint256) should be declared external:
- BHC.decreaseAllowance(address,uint256) (#533-547)
approve(address,uint256) should be declared external:
- BHC.approve(address,uint256) (#549-556)
setMarketPairStatus(address,bool) should be declared external:
- BHC.setMarketPairStatus(address,bool) (#570-575)
getCirculatingSupply() should be declared external:
- BHC.getCirculatingSupply() (#584-586)
transfer(address,uint256) should be declared external:
- BHC.transfer(address,uint256) (#594-601)
transferFrom(address,address,uint256) should be declared external:
- BHC.transferFrom(address,address,uint256) (#603-618)
devoteDestroy(address,uint256) should be declared external:
- BHC.devoteDestroy(address,uint256) (#839-849)
Use the external attribute for functions never called from the contract.
Additional information: link
BHC.constructor() (#336-396) performs a multiplication on the result of a division:
-foundingRelase = _totalSupply.mul(8).div(100).mul(70).div(100) (#351)
BHC.constructor() (#336-396) performs a multiplication on the result of a division:
-_balances[fundingWalletAddress] = _totalSupply.mul(8).div(100).mul(30).div(100) (#355-359)
BHC.getCurrentTime() (#506-509) performs a multiplication on the result of a division:
-base = block.timestamp.sub(baseTime).div(86400) (#507)
-base.mul(86400).add(baseTime) (#508)
Consider ordering multiplication before division.
Additional information: link
Reentrancy in BHC._transfer(address,address,uint256) (#620-642):
External calls:
- finalAmount = takeFee(sender,recipient,amount) (#638)
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
State variables written after the call(s):
- _balances[recipient] = _balances[recipient].add(finalAmount) (#639)
Reentrancy in BHC.takeFee(address,address,uint256) (#678-722):
External calls:
- _swapFistBounus(amount) (#701)
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
State variables written after the call(s):
- _distributionShares(recipient,amount) (#714)
- _balances[address(this)] = _balances[address(this)].sub(feeAmount) (#796)
- _balances[deadAddress] = _balances[deadAddress].add(shareFee) (#812)
- _balances[leader] = _balances[leader].add(shareFee) (#815)
Apply the check-effects-interactions pattern.
Additional information: link
BHC.allowance(address,address).owner (#511) shadows:
- Ownable.owner() (#216-218) (function)
BHC._approve(address,address,uint256).owner (#559) shadows:
- Ownable.owner() (#216-218) (function)
Rename the local variables that shadow another component.
Additional information: link
BHC.setRelationUsdtLimit(uint256) (#433-435) should emit an event for:
- relationUsdtLimit = newValue.mul(1e18) (#434)
BHC.setPancakeTradeFee(uint256,uint256) (#437-444) should emit an event for:
- _destroyFee = destroyFee (#441)
- _fistBounsFee = fistBounsFee (#442)
BHC.setTranferDestroyFee(uint256) (#471-473) should emit an event for:
- _totalTaxIfTrading = newValue (#472)
Emit an event for critical parameter changes.
Additional information: link
BHC.setFundingWalletAddress(address).newValue (#417) lacks a zero-check on :
- fundingWalletAddress = address(newValue) (#418)
BHC.setCrossChainWalletAddress(address).newValue (#421) lacks a zero-check on :
- crossChainWalletAddress = address(newValue) (#422)
BHC.setPrizePoolWalletAddress(address).newValue (#425) lacks a zero-check on :
- prizePoolWalletAddress = address(newValue) (#426)
BHC.setDaoWalletAddress(address).newValue (#429) lacks a zero-check on :
- daoWalletAddress = address(newValue) (#430)
Check that the address is not zero.
Additional information: link
Reentrancy in BHC.constructor() (#336-396):
External calls:
- uniswapPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this),0x55d398326f99059fF775485246999027B3197955) (#340-343)
State variables written after the call(s):
- _allowances[address(this)][address(uniswapV2Router)] = _totalSupply (#344)
- _balances[address(this)] = foundingRelase (#354)
- _balances[fundingWalletAddress] = _totalSupply.mul(8).div(100).mul(30).div(100) (#355-359)
- _balances[prizePoolWalletAddress] = _totalSupply.mul(70).div(100) (#361)
- _balances[crossChainWalletAddress] = _totalSupply.mul(20).div(100) (#362)
- _balances[daoWalletAddress] = _totalSupply.mul(2).div(100) (#363)
- _marketingShares = (20,10,5,5,5,5) (#346)
- _refreshPancakeTradeFee() (#347)
- _totalMarketingShareFee = 0 (#459)
- i < _marketingShares.length (#461)
- _totalMarketingShareFee = _totalMarketingShareFee.add(_marketingShares[i]) (#465-467)
- _refreshPancakeTradeFee() (#347)
- _totalTaxIfPancakeTrading = 0 (#458)
- _totalTaxIfPancakeTrading = _destroyFee.add(_fistBounsFee) (#460)
- i < _marketingShares.length (#461)
- _totalTaxIfPancakeTrading = _totalTaxIfPancakeTrading.add(_marketingShares[i]) (#462-464)
- dayReleaseAmount = foundingRelase.div(360) (#352)
- isMarketPair[address(uniswapPair)] = true (#365)
- isTxLimitExempt[msg.sender] = true (#366)
- isTxLimitExempt[address(this)] = true (#367)
- isTxLimitExempt[fundingWalletAddress] = true (#369)
- isTxLimitExempt[crossChainWalletAddress] = true (#370)
- isTxLimitExempt[prizePoolWalletAddress] = true (#371)
- isTxLimitExempt[daoWalletAddress] = true (#372)
- isTxLimitExempt[fistBonusAddress] = true (#373)
- relaseEndTime = currentTime.add(86400 * 360) (#350)
- releaseStatus[currentTime] = true (#353)
Reentrancy in BHC.transferFrom(address,address,uint256) (#603-618):
External calls:
- _transfer(sender,recipient,amount) (#608)
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
State variables written after the call(s):
- _approve(sender,_msgSender(),_allowances[sender][_msgSender()].sub(amount,ERC20: transfer amount exceeds allowance)) (#609-616)
- _allowances[owner][spender] = amount (#566)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in BHC._transfer(address,address,uint256) (#620-642):
External calls:
- finalAmount = takeFee(sender,recipient,amount) (#638)
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
Event emitted after the call(s):
- Transfer(sender,recipient,finalAmount) (#640)
Reentrancy in BHC.constructor() (#336-396):
External calls:
- uniswapPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this),0x55d398326f99059fF775485246999027B3197955) (#340-343)
Event emitted after the call(s):
- Transfer(address(0),fundingWalletAddress,_balances[fundingWalletAddress]) (#375-379)
- Transfer(address(0),crossChainWalletAddress,_balances[crossChainWalletAddress]) (#381-385)
- Transfer(address(0),prizePoolWalletAddress,_balances[prizePoolWalletAddress]) (#386-390)
- Transfer(address(0),daoWalletAddress,_balances[daoWalletAddress]) (#391-395)
Reentrancy in BHC.swapTokensForToken(uint256,address) (#821-837):
External calls:
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
Event emitted after the call(s):
- SwapTokensForToken(tokenAmount,path) (#836)
Reentrancy in BHC.takeFee(address,address,uint256) (#678-722):
External calls:
- _swapFistBounus(amount) (#701)
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
Event emitted after the call(s):
- Transfer(address(this),deadAddress,shareFee) (#813)
- _distributionShares(recipient,amount) (#714)
- Transfer(address(this),leader,shareFee) (#816)
- _distributionShares(recipient,amount) (#714)
Reentrancy in BHC.transferFrom(address,address,uint256) (#603-618):
External calls:
- _transfer(sender,recipient,amount) (#608)
- uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount,0,path,to,block.timestamp) (#829-835)
Event emitted after the call(s):
- Approval(owner,spender,amount) (#567)
- _approve(sender,_msgSender(),_allowances[sender][_msgSender()].sub(amount,ERC20: transfer amount exceeds allowance)) (#609-616)
Apply the check-effects-interactions pattern.
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