Ulti Arena is a GameFi/NFT project that aims to revolutionize NFT gaming space with their products:
- NFT Marketplace for game assets, where buyers and sellers can trade unique 2D/3D assets, music, sound, and UI/HUD elements,
- Proof-of-Gaming, a gaming client allowing players to earn ULTI tokens when playing games such as DOTA2, LOL, CSGO, PUBG, Mobile Legends, and more,
- Crypto Trading Card game, built in collaboration with Remote Control Productions and Frag Games: Ultimate Battle Arena where every card is an NFT
TokensLiquify._addLiquidity(uint256,uint256,address) (contracts/extensions/TokensLiquify.sol#77-92) sends eth to arbitrary user
Dangerous calls:
- (amountToken,amountBNB,liquidity) = swapRouter.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,lpReceiver,block.timestamp) (contracts/extensions/TokensLiquify.sol#82-90)
Ensure that an arbitrary user cannot withdraw unauthorized funds.
Additional information: link
UltiCoin._blacklistFrontRunners(address) (contracts/UltiCoin.sol#315-321) uses a dangerous strict equality:
- launchTime == 0 || block.timestamp < launchTime + 5 (contracts/UltiCoin.sol#316)
Don't use strict equality to determine if an account has enough Ether or tokens.
Additional information: link
UltiCoin.setRewardExclusion(address,bool) (contracts/UltiCoin.sol#216-231) ignores return value by _excludedFromReward.add(account) (contracts/UltiCoin.sol#227)
Ensure that all the return values of the function calls are used.
Additional information: link
UltiCoin._approve(address,address,uint256).owner (contracts/UltiCoin.sol#259) shadows:
- Ownable.owner() (@openzeppelin/contracts/access/Ownable.sol#35-37) (function)
Rename the local variables that shadow another component.
Additional information: link
UltiCoin.setSwapCooldownDuration(uint256) (contracts/UltiCoin.sol#207-209) should emit an event for:
- swapCooldownDuration = duration (contracts/UltiCoin.sol#208)
Emit an event for critical parameter changes.
Additional information: link
Reentrancy in UltiCoin.transferFrom(address,address,uint256) (contracts/UltiCoin.sol#137-145):
External calls:
- _transfer(sender,recipient,amount) (contracts/UltiCoin.sol#142)
- (amountToken,amountBNB,liquidity) = swapRouter.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,lpReceiver,block.timestamp) (contracts/extensions/TokensLiquify.sol#82-90)
- swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (contracts/extensions/TokensLiquify.sol#64-70)
External calls sending eth:
- _transfer(sender,recipient,amount) (contracts/UltiCoin.sol#142)
- (amountToken,amountBNB,liquidity) = swapRouter.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,lpReceiver,block.timestamp) (contracts/extensions/TokensLiquify.sol#82-90)
State variables written after the call(s):
- _approve(sender,msg.sender,_allowances[sender][msg.sender] - amount) (contracts/UltiCoin.sol#143)
- _allowances[owner][spender] = amount (contracts/UltiCoin.sol#266)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in UltiCoin.transferFrom(address,address,uint256) (contracts/UltiCoin.sol#137-145):
External calls:
- _transfer(sender,recipient,amount) (contracts/UltiCoin.sol#142)
- (amountToken,amountBNB,liquidity) = swapRouter.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,lpReceiver,block.timestamp) (contracts/extensions/TokensLiquify.sol#82-90)
- swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (contracts/extensions/TokensLiquify.sol#64-70)
External calls sending eth:
- _transfer(sender,recipient,amount) (contracts/UltiCoin.sol#142)
- (amountToken,amountBNB,liquidity) = swapRouter.addLiquidityETH{value: bnbAmount}(address(this),tokenAmount,0,0,lpReceiver,block.timestamp) (contracts/extensions/TokensLiquify.sol#82-90)
Event emitted after the call(s):
- Approval(owner,spender,amount) (contracts/UltiCoin.sol#267)
- _approve(sender,msg.sender,_allowances[sender][msg.sender] - amount) (contracts/UltiCoin.sol#143)
Apply the check-effects-interactions pattern.
Additional information: link
UltiCoin._checkSwapCooldown(address,address) (contracts/UltiCoin.sol#348-353) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(statuses[recipient].swapCooldown < block.timestamp,Swap is cooling down) (contracts/UltiCoin.sol#350)
Avoid relying on block.timestamp.
Additional information: link
Different versions of Solidity is used:
- Version used: ['^0.8.0', '^0.8.6']
- ^0.8.0 (@openzeppelin/contracts/access/Ownable.sol#3)
- ^0.8.0 (@openzeppelin/contracts/utils/Context.sol#3)
- ^0.8.0 (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#3)
- ^0.8.6 (contracts/UltiCoin.sol#3)
- ^0.8.6 (contracts/extensions/TokensLiquify.sol#3)
- ^0.8.6 (contracts/interfaces/IBEP20.sol#3)
- ^0.8.6 (contracts/interfaces/IPancakeFactory.sol#6)
- ^0.8.6 (contracts/interfaces/IPancakeRouter01.sol#6)
- ^0.8.6 (contracts/interfaces/IPancakeRouter02.sol#6)
Use one Solidity version.
Additional information: link
EnumerableSet.remove(EnumerableSet.UintSet,uint256) (@openzeppelin/contracts/utils/structs/EnumerableSet.sol#266-268) is never used and should be removed
Remove unused functions.
Additional information: link
UltiCoin._rTotal (contracts/UltiCoin.sol#40) is set pre-construction with a non-constant function or state variable:
- (type()(uint256).max - (type()(uint256).max % _tTotal))
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
solc-0.8.6 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
Function IPancakeRouter01.WETH() (contracts/interfaces/IPancakeRouter01.sol#11) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Redundant expression "this (@openzeppelin/contracts/utils/Context.sol#21)" inContext (@openzeppelin/contracts/utils/Context.sol#15-24)
Remove redundant statements if they congest code but offer no value.
Additional information: link
Variable IPancakeRouter01.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountADesired (contracts/interfaces/IPancakeRouter01.sol#16) is too similar to IPancakeRouter01.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountBDesired (contracts/interfaces/IPancakeRouter01.sol#17)
Prevent variables from having similar names.
Additional information: link
renounceOwnership() should be declared external:
- Ownable.renounceOwnership() (@openzeppelin/contracts/access/Ownable.sol#54-57)
Use the external attribute for functions never called from the contract.
Additional information: link
BscScan page for the token does not contain additional info: website, socials, description, etc.
Additional information: link
Young tokens have high risks of scam / price dump / death
Young tokens have high risks of scam / price dump / death
Young tokens have high risks of price dump / death
Token has relatively low CoinGecko rank
Twitter account link seems to be invalid