Aiming to raise the standards for BSC P2E gaming, offering MMORPG features with rich storylines, PvP with other players, with dynamic NFT features and evolving NFTs.
ODYSSEY.swapBack() (#365-408) sends eth to arbitrary user
Dangerous calls:
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
Ensure that an arbitrary user cannot withdraw unauthorized funds.
Additional information: link
Reentrancy in ODYSSEY._transferFrom(address,address,uint256) (#279-310):
External calls:
- pinkAntiBot.onPreTransferCheck(sender,recipient,amount) (#282)
- swapBack() (#301)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#376-382)
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
- router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
External calls sending eth:
- swapBack() (#301)
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
- router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
State variables written after the call(s):
- _balances[sender] = _balances[sender].sub(amount,Insufficient Balance) (#303)
- _balances[recipient] = _balances[recipient].add(amountReceived) (#306)
- amountReceived = takeFee(sender,amount,recipient) (#305)
- _balances[address(this)] = _balances[address(this)].add(contractTokens) (#347)
- _balances[utilityFeeReceiver] = _balances[utilityFeeReceiver].add(utilityTokens) (#348)
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.
Unable to verify that contract auditor is trusted: Certik, Quantstamp, Hacken, Solidity, Paladinsec, Openzeppelin, Verichains
Contract ownership is not renounced (belongs to a wallet)
ODYSSEY.swapBack().tmpSuccess (#392) is written in both
(tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
(tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
ODYSSEY.swapBack().tmpSuccess (#392) is written in both
(tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
tmpSuccess = false (#395)
Fix or remove the writes.
Additional information: link
ODYSSEY.swapBack() (#365-408) ignores return value by router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
Ensure that all the return values of the function calls are used.
Additional information: link
Variable IDEXRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountADesired (#123) is too similar to IDEXRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountBDesired (#124)
Prevent variables from having similar names.
Additional information: link
ODYSSEY.slitherConstructorVariables() (#164-566) uses literals with too many digits:
- DEAD = 0x000000000000000000000000000000000000dEaD (#169)
ODYSSEY.slitherConstructorVariables() (#164-566) uses literals with too many digits:
- ZERO = 0x0000000000000000000000000000000000000000 (#170)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
ODYSSEY.DEAD (#169) should be constant
ODYSSEY.WBNB (#168) should be constant
ODYSSEY.ZERO (#170) should be constant
ODYSSEY._totalSupply (#176) should be constant
ODYSSEY.devFee (#193) should be constant
ODYSSEY.feeDenominator (#196) should be constant
ODYSSEY.targetLiquidityDenominator (#208) should be constant
Add the constant attributes to state variables that never change.
Additional information: link
authorize(address) should be declared external:
- Auth.authorize(address) (#87-89)
unauthorize(address) should be declared external:
- Auth.unauthorize(address) (#91-93)
transferOwnership(address) should be declared external:
- Auth.transferOwnership(address) (#103-107)
Use the external attribute for functions never called from the contract.
Additional information: link
Function IDEXRouter.WETH() (#118) is not in mixedCase
Function ODYSSEY.setMaxWalletPercent_base1000(uint256) (#411-413) is not in mixedCase
Parameter ODYSSEY.setMaxWalletPercent_base1000(uint256).maxWallPercent_base1000 (#411) is not in mixedCase
Function ODYSSEY.setMaxTxPercent_base1000(uint256) (#414-417) is not in mixedCase
Parameter ODYSSEY.setMaxTxPercent_base1000(uint256).maxTXPercentage_base1000 (#414) is not in mixedCase
Parameter ODYSSEY.setEnableAntiBot(bool)._enable (#419) is not in mixedCase
Parameter ODYSSEY.setMultipliers(uint256,uint256,uint256)._buy (#444) is not in mixedCase
Parameter ODYSSEY.setMultipliers(uint256,uint256,uint256)._sell (#444) is not in mixedCase
Parameter ODYSSEY.setMultipliers(uint256,uint256,uint256)._trans (#444) is not in mixedCase
Parameter ODYSSEY.tradingStatus(bool)._status (#456) is not in mixedCase
Function ODYSSEY.tradingStatus_launchdone() (#464-466) is not in mixedCase
Function ODYSSEY.manage_blacklist_status(bool) (#468-470) is not in mixedCase
Parameter ODYSSEY.manage_blacklist_status(bool)._status (#468) is not in mixedCase
Function ODYSSEY.manage_blacklist(address[],bool) (#472-477) is not in mixedCase
Function ODYSSEY.manage_FeeExempt(address[],bool) (#479-484) is not in mixedCase
Function ODYSSEY.manage_TxLimitExempt(address[],bool) (#486-491) is not in mixedCase
Parameter ODYSSEY.setFees(uint256,uint256,uint256)._liquidityFee (#501) is not in mixedCase
Parameter ODYSSEY.setFees(uint256,uint256,uint256)._marketingFee (#501) is not in mixedCase
Parameter ODYSSEY.setFees(uint256,uint256,uint256)._utilityFee (#501) is not in mixedCase
Parameter ODYSSEY.setFeeReceivers(address,address,address)._autoLiquidityReceiver (#513) is not in mixedCase
Parameter ODYSSEY.setFeeReceivers(address,address,address)._marketingFeeReceiver (#513) is not in mixedCase
Parameter ODYSSEY.setFeeReceivers(address,address,address)._utilityFeeReceiver (#513) is not in mixedCase
Parameter ODYSSEY.setSwapBackSettings(bool,uint256)._enabled (#519) is not in mixedCase
Parameter ODYSSEY.setSwapBackSettings(bool,uint256)._amount (#519) is not in mixedCase
Parameter ODYSSEY.setTargetLiquidity(uint256)._target (#524) is not in mixedCase
Variable ODYSSEY.WBNB (#168) is not in mixedCase
Variable ODYSSEY.DEAD (#169) is not in mixedCase
Variable ODYSSEY.ZERO (#170) is not in mixedCase
Constant ODYSSEY._name (#172) is not in UPPER_CASE_WITH_UNDERSCORES
Constant ODYSSEY._symbol (#173) is not in UPPER_CASE_WITH_UNDERSCORES
Constant ODYSSEY._decimals (#174) is not in UPPER_CASE_WITH_UNDERSCORES
Variable ODYSSEY._totalSupply (#176) is not in mixedCase
Variable ODYSSEY._maxTxAmount (#178) is not in mixedCase
Variable ODYSSEY._maxTxSellAmount (#179) is not in mixedCase
Variable ODYSSEY._maxWalletToken (#180) is not in mixedCase
Variable ODYSSEY._balances (#182) is not in mixedCase
Variable ODYSSEY._allowances (#183) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
ODYSSEY.takeFee(address,uint256,address) (#333-356) performs a multiplication on the result of a division:
-feeAmount = amount.mul(totalFee).mul(multiplier).div(feeDenominator * 100) (#342)
-utilityTokens = feeAmount.mul(utilityFee).div(totalFee) (#344)
Consider ordering multiplication before division.
Additional information: link
ODYSSEY.manage_blacklist(address[],bool).i (#474) is a local variable never initialized
ODYSSEY.manage_FeeExempt(address[],bool).i (#481) is a local variable never initialized
ODYSSEY.manage_TxLimitExempt(address[],bool).i (#488) is a local variable never initialized
Initialize all the variables. If a variable is meant to be initialized to zero, explicitly set it to zero to improve code readability.
Additional information: link
ODYSSEY.setMaxTxPercent_base1000(uint256) (#414-417) should emit an event for:
- _maxTxAmount = (_totalSupply * maxTXPercentage_base1000) / 1000 (#416)
ODYSSEY.setMaxTxAbsolute(uint256) (#423-426) should emit an event for:
- _maxTxAmount = amount (#425)
ODYSSEY.setMaxSellAbsolute(uint256) (#427-430) should emit an event for:
- _maxTxSellAmount = amount (#429)
ODYSSEY.setMultipliers(uint256,uint256,uint256) (#444-454) should emit an event for:
- sellMultiplier = _sell (#451)
- buyMultiplier = _buy (#452)
- transferMultiplier = _trans (#453)
ODYSSEY.setFees(uint256,uint256,uint256) (#501-511) should emit an event for:
- liquidityFee = _liquidityFee (#502)
- marketingFee = _marketingFee (#503)
- utilityFee = _utilityFee (#504)
- totalFee = liquidityFee + marketingFee + devFee + utilityFee (#505)
ODYSSEY.setSwapBackSettings(bool,uint256) (#519-522) should emit an event for:
- swapThreshold = _amount (#521)
ODYSSEY.setTargetLiquidity(uint256) (#524-527) should emit an event for:
- targetLiquidity = _target (#526)
Emit an event for critical parameter changes.
Additional information: link
Auth.transferOwnership(address).adr (#103) lacks a zero-check on :
- owner = adr (#104)
ODYSSEY.setFeeReceivers(address,address,address)._autoLiquidityReceiver (#513) lacks a zero-check on :
- autoLiquidityReceiver = _autoLiquidityReceiver (#514)
ODYSSEY.setFeeReceivers(address,address,address)._marketingFeeReceiver (#513) lacks a zero-check on :
- marketingFeeReceiver = _marketingFeeReceiver (#515)
ODYSSEY.setFeeReceivers(address,address,address)._utilityFeeReceiver (#513) lacks a zero-check on :
- utilityFeeReceiver = _utilityFeeReceiver (#516)
Check that the address is not zero.
Additional information: link
Reentrancy in ODYSSEY._transferFrom(address,address,uint256) (#279-310):
External calls:
- pinkAntiBot.onPreTransferCheck(sender,recipient,amount) (#282)
State variables written after the call(s):
- _basicTransfer(sender,recipient,amount) (#285)
- _balances[sender] = _balances[sender].sub(amount,Insufficient Balance) (#313)
- _balances[recipient] = _balances[recipient].add(amount) (#314)
Reentrancy in ODYSSEY.constructor() (#226-245):
External calls:
- pair = IDEXFactory(router.factory()).createPair(WBNB,address(this)) (#228)
State variables written after the call(s):
- _allowances[address(this)][address(router)] = type()(uint256).max (#230)
- autoLiquidityReceiver = DEAD (#235)
- devFeeReceiver = 0xed291e3a3a51839E39C90B219A82678DFca9Ce5b (#237)
- isFeeExempt[msg.sender] = true (#232)
- isTxLimitExempt[msg.sender] = true (#233)
- marketingFeeReceiver = 0x9dfd1E67E0c7F83c28CDb541bB6A51021e5B8a45 (#236)
- pinkAntiBot = IPinkAntiBot(0x8EFDb3b642eb2a20607ffe0A56CFefF6a95Df002) (#240)
- utilityFeeReceiver = 0xAC1f99F7257Ea0eD05587b09Dd35bdDE9e0Ddfc7 (#238)
Reentrancy in ODYSSEY.constructor() (#226-245):
External calls:
- pair = IDEXFactory(router.factory()).createPair(WBNB,address(this)) (#228)
- pinkAntiBot.setTokenOwner(msg.sender) (#241)
State variables written after the call(s):
- _balances[msg.sender] = _totalSupply (#243)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in ODYSSEY._transferFrom(address,address,uint256) (#279-310):
External calls:
- pinkAntiBot.onPreTransferCheck(sender,recipient,amount) (#282)
Event emitted after the call(s):
- Transfer(sender,recipient,amount) (#315)
- _basicTransfer(sender,recipient,amount) (#285)
Reentrancy in ODYSSEY._transferFrom(address,address,uint256) (#279-310):
External calls:
- pinkAntiBot.onPreTransferCheck(sender,recipient,amount) (#282)
- swapBack() (#301)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#376-382)
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
- router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
External calls sending eth:
- swapBack() (#301)
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
- router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
Event emitted after the call(s):
- AutoLiquify(amountBNBLiquidity,amountToLiquify) (#406)
- swapBack() (#301)
- Transfer(sender,address(this),contractTokens) (#349)
- amountReceived = takeFee(sender,amount,recipient) (#305)
- Transfer(sender,utilityFeeReceiver,utilityTokens) (#352)
- amountReceived = takeFee(sender,amount,recipient) (#305)
- Transfer(sender,recipient,amountReceived) (#308)
Reentrancy in ODYSSEY.constructor() (#226-245):
External calls:
- pair = IDEXFactory(router.factory()).createPair(WBNB,address(this)) (#228)
- pinkAntiBot.setTokenOwner(msg.sender) (#241)
Event emitted after the call(s):
- Transfer(address(0),msg.sender,_totalSupply) (#244)
Reentrancy in ODYSSEY.swapBack() (#365-408):
External calls:
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#376-382)
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
- router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
External calls sending eth:
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
- router.addLiquidityETH{value: amountBNBLiquidity}(address(this),amountToLiquify,0,0,autoLiquidityReceiver,block.timestamp) (#398-405)
Event emitted after the call(s):
- AutoLiquify(amountBNBLiquidity,amountToLiquify) (#406)
Apply the check-effects-interactions pattern.
Additional information: link
ODYSSEY._maxTxAmount (#178) is set pre-construction with a non-constant function or state variable:
- _totalSupply / 50
ODYSSEY._maxTxSellAmount (#179) is set pre-construction with a non-constant function or state variable:
- _totalSupply / 50
ODYSSEY._maxWalletToken (#180) is set pre-construction with a non-constant function or state variable:
- _totalSupply / 100
ODYSSEY.totalFee (#195) is set pre-construction with a non-constant function or state variable:
- marketingFee + liquidityFee + devFee + utilityFee
ODYSSEY.swapThreshold (#216) is set pre-construction with a non-constant function or state variable:
- _totalSupply * 10 / 10000
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.9 (#7) necessitates a version too recent to be trusted. Consider deploying with 0.6.12/0.7.6/0.8.7
solc-0.8.9 is not recommended for deployment
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 ODYSSEY.swapBack() (#365-408):
- (tmpSuccess) = address(marketingFeeReceiver).call{gas: 30000,value: amountBNBMarketing}() (#392)
- (tmpSuccess,None) = address(devFeeReceiver).call{gas: 30000,value: amountBNBdev}() (#393)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
BscScan page for the token does not contain additional info: website, socials, description, etc.
Additional information: link
Unable to verify that token and website are owned by the same team (no listings + unable to find contract on website)
Unable to find audit link on the website
Unable to find whitepaper link on the website
Unable to find token on CoinGecko
Additional information: link
Unable to find token on CoinMarketCap
Additional information: link
Unable to find token on CoinHunt
Additional information: link
Unable to find code repository for the project
Unable to verify token contract address on the website
Young tokens have high risks of scam / price dump / death
Alexa traffic rank is very low
Additional information: link
Token has no active CoinGecko listing / rank
Token has no active CoinMarketCap listing / rank
Young tokens have high risks of price dump / death
Young tokens have high risks of price dump / death
Unable to find Blog account (Reddit or Medium)
Unable to find Youtube account