AbsToken.claimBalance() (#435-437) sends eth to arbitrary user
Dangerous calls:
- address(fundAddress).transfer(address(this).balance) (#436)
Ensure that an arbitrary user cannot withdraw unauthorized funds.
Additional information: link
AbsToken.swapTokenForFund(uint256,uint256) (#335-367) ignores return value by FIST.transferFrom(address(_tokenDistributor),fundAddress,fundAmount) (#356)
AbsToken.swapTokenForFund(uint256,uint256) (#335-367) ignores return value by FIST.transferFrom(address(_tokenDistributor),address(this),fistBalance - fundAmount) (#357)
AbsToken.claimToken(address,uint256,address) (#439-441) ignores return value by IERC20(token).transfer(to,amount) (#440)
AbsToken.processReward(uint256) (#472-517) ignores return value by FIST.transfer(shareHolder,amount) (#506)
Use SafeERC20, or ensure that the transfer/transferFrom return value is checked.
Additional information: link
Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
Combination 2: Unchecked transfer + 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.
AbsToken._transfer(address,address,uint256) (#229-287) performs a multiplication on the result of a division:
-maxSellAmount = balance * 9999 / 10000 (#240)
-amount = maxSellAmount (#242)
-numTokensSellToFund = amount * swapFee / 5000 (#264)
Consider ordering multiplication before division.
Additional information: link
Reentrancy in AbsToken._transfer(address,address,uint256) (#229-287):
External calls:
- swapTokenForFund(numTokensSellToFund,swapFee) (#268)
- _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount - lpAmount,0,path,address(_tokenDistributor),block.timestamp) (#343-349)
- FIST.transferFrom(address(_tokenDistributor),fundAddress,fundAmount) (#356)
- FIST.transferFrom(address(_tokenDistributor),address(this),fistBalance - fundAmount) (#357)
- _swapRouter.addLiquidity(address(this),_fist,lpAmount,lpFist,0,0,fundAddress,block.timestamp) (#362-364)
State variables written after the call(s):
- _tokenTransfer(from,to,amount,takeFee,isSell) (#279)
- _balances[sender] = _balances[sender] - tAmount (#311)
- _balances[to] = _balances[to] + tAmount (#374)
Reentrancy in AbsToken.processReward(uint256) (#472-517):
External calls:
- FIST.transfer(shareHolder,amount) (#506)
State variables written after the call(s):
- currentIndex ++ (#512)
Apply the check-effects-interactions pattern.
Additional information: link
AbsToken._tokenTransfer(address,address,uint256,bool,bool).feeAmount (#312) is a local variable never initialized
AbsToken._transfer(address,address,uint256).isSell (#247) is a local variable never initialized
AbsToken._transfer(address,address,uint256).takeFee (#246) 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
TokenDistributor.constructor(address) (#94-96) ignores return value by IERC20(token).approve(msg.sender,uint256(~ uint256(0))) (#95)
AbsToken.constructor(address,address,string,string,uint8,uint256,address,address) (#139-180) ignores return value by IERC20(FISTAddress).approve(address(swapRouter),MAX) (#149)
AbsToken.swapTokenForFund(uint256,uint256) (#335-367) ignores return value by _swapRouter.addLiquidity(address(this),_fist,lpAmount,lpFist,0,0,fundAddress,block.timestamp) (#362-364)
Ensure that all the return values of the function calls are used.
Additional information: link
AbsToken.allowance(address,address).owner (#207) shadows:
- Ownable.owner() (#72-74) (function)
AbsToken._approve(address,address,uint256).owner (#224) shadows:
- Ownable.owner() (#72-74) (function)
Rename the local variables that shadow another component.
Additional information: link
AbsToken.setFundAddress(address) (#378-381) should emit an event for:
- fundAddress = addr (#379)
Emit an event for critical parameter changes.
Additional information: link
AbsToken.setFundAddress(address).addr (#378) lacks a zero-check on :
- fundAddress = addr (#379)
Check that the address is not zero.
Additional information: link
Reentrancy in AbsToken._transfer(address,address,uint256) (#229-287):
External calls:
- swapTokenForFund(numTokensSellToFund,swapFee) (#268)
- _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount - lpAmount,0,path,address(_tokenDistributor),block.timestamp) (#343-349)
- FIST.transferFrom(address(_tokenDistributor),fundAddress,fundAmount) (#356)
- FIST.transferFrom(address(_tokenDistributor),address(this),fistBalance - fundAmount) (#357)
- _swapRouter.addLiquidity(address(this),_fist,lpAmount,lpFist,0,0,fundAddress,block.timestamp) (#362-364)
State variables written after the call(s):
- addHolder(from) (#283)
- holderIndex[adr] = holders.length (#462)
- addHolder(from) (#283)
- holders.push(adr) (#463)
Reentrancy in AbsToken.constructor(address,address,string,string,uint8,uint256,address,address) (#139-180):
External calls:
- IERC20(FISTAddress).approve(address(swapRouter),MAX) (#149)
State variables written after the call(s):
- _allowances[address(this)][address(swapRouter)] = MAX (#153)
- _fist = FISTAddress (#151)
- _swapRouter = swapRouter (#152)
Reentrancy in AbsToken.constructor(address,address,string,string,uint8,uint256,address,address) (#139-180):
External calls:
- IERC20(FISTAddress).approve(address(swapRouter),MAX) (#149)
- swapPair = swapFactory.createPair(address(this),FISTAddress) (#156)
State variables written after the call(s):
- _balances[ReceiveAddress] = total (#163)
- _feeWhiteList[FundAddress] = true (#168)
- _feeWhiteList[ReceiveAddress] = true (#169)
- _feeWhiteList[address(this)] = true (#170)
- _feeWhiteList[address(swapRouter)] = true (#171)
- _feeWhiteList[msg.sender] = true (#172)
- _mainPair = swapPair (#157)
- _swapPairList[swapPair] = true (#158)
- _tTotal = total (#161)
- excludeHolder[address(0)] = true (#174)
- excludeHolder[address(0x000000000000000000000000000000000000dEaD)] = true (#175)
- fundAddress = FundAddress (#166)
- holderRewardCondition = 2 * 10 ** IERC20(FISTAddress).decimals() (#177)
Reentrancy in AbsToken.constructor(address,address,string,string,uint8,uint256,address,address) (#139-180):
External calls:
- IERC20(FISTAddress).approve(address(swapRouter),MAX) (#149)
- swapPair = swapFactory.createPair(address(this),FISTAddress) (#156)
- _tokenDistributor = new TokenDistributor(FISTAddress) (#179)
State variables written after the call(s):
- _tokenDistributor = new TokenDistributor(FISTAddress) (#179)
Reentrancy in AbsToken.transferFrom(address,address,uint256) (#216-222):
External calls:
- _transfer(sender,recipient,amount) (#217)
- _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount - lpAmount,0,path,address(_tokenDistributor),block.timestamp) (#343-349)
- FIST.transferFrom(address(_tokenDistributor),fundAddress,fundAmount) (#356)
- FIST.transferFrom(address(_tokenDistributor),address(this),fistBalance - fundAmount) (#357)
- _swapRouter.addLiquidity(address(this),_fist,lpAmount,lpFist,0,0,fundAddress,block.timestamp) (#362-364)
- FIST.transfer(shareHolder,amount) (#506)
State variables written after the call(s):
- _allowances[sender][msg.sender] = _allowances[sender][msg.sender] - amount (#219)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in AbsToken._transfer(address,address,uint256) (#229-287):
External calls:
- swapTokenForFund(numTokensSellToFund,swapFee) (#268)
- _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount - lpAmount,0,path,address(_tokenDistributor),block.timestamp) (#343-349)
- FIST.transferFrom(address(_tokenDistributor),fundAddress,fundAmount) (#356)
- FIST.transferFrom(address(_tokenDistributor),address(this),fistBalance - fundAmount) (#357)
- _swapRouter.addLiquidity(address(this),_fist,lpAmount,lpFist,0,0,fundAddress,block.timestamp) (#362-364)
Event emitted after the call(s):
- Transfer(sender,to,tAmount) (#375)
- _tokenTransfer(from,to,amount,takeFee,isSell) (#279)
Reentrancy in AbsToken.constructor(address,address,string,string,uint8,uint256,address,address) (#139-180):
External calls:
- IERC20(FISTAddress).approve(address(swapRouter),MAX) (#149)
- swapPair = swapFactory.createPair(address(this),FISTAddress) (#156)
Event emitted after the call(s):
- Transfer(address(0),ReceiveAddress,total) (#164)
Apply the check-effects-interactions pattern.
Additional information: link
AbsToken.addHolder(address) (#454-466) uses assembly
- INLINE ASM (#456)
Do not use evm assembly.
Additional information: link
Pragma version^0.8.14 (#7) necessitates a version too recent to be trusted. Consider deploying with 0.6.12/0.7.6/0.8.7
solc-0.8.14 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 ISwapRouter.WETH() (#35) is not in mixedCase
Variable Ownable._owner (#62) is not in mixedCase
Variable AbsToken._feeWhiteList (#109) is not in mixedCase
Variable AbsToken._blackList (#110) is not in mixedCase
Variable AbsToken._swapRouter (#114) is not in mixedCase
Variable AbsToken._fist (#115) is not in mixedCase
Variable AbsToken._swapPairList (#116) is not in mixedCase
Variable AbsToken._tokenDistributor (#121) is not in mixedCase
Variable AbsToken._buyFundFee (#123) is not in mixedCase
Variable AbsToken._buyLPDividendFee (#124) is not in mixedCase
Variable AbsToken._sellLPDividendFee (#125) is not in mixedCase
Variable AbsToken._sellFundFee (#126) is not in mixedCase
Variable AbsToken._sellLPFee (#127) is not in mixedCase
Variable AbsToken._mainPair (#131) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Variable ISwapRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountADesired (#48) is too similar to ISwapRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountBDesired (#49)
Prevent variables from having similar names.
Additional information: link
AbsToken.constructor(address,address,string,string,uint8,uint256,address,address) (#139-180) uses literals with too many digits:
- excludeHolder[address(0x000000000000000000000000000000000000dEaD)] = true (#175)
AbsToken._transfer(address,address,uint256) (#229-287) uses literals with too many digits:
- processReward(500000) (#285)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
owner() should be declared external:
- Ownable.owner() (#72-74)
renounceOwnership() should be declared external:
- Ownable.renounceOwnership() (#81-84)
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (#86-90)
totalSupply() should be declared external:
- AbsToken.totalSupply() (#194-196)
transfer(address,uint256) should be declared external:
- AbsToken.transfer(address,uint256) (#202-205)
allowance(address,address) should be declared external:
- AbsToken.allowance(address,address) (#207-209)
approve(address,uint256) should be declared external:
- AbsToken.approve(address,uint256) (#211-214)
transferFrom(address,address,uint256) should be declared external:
- AbsToken.transferFrom(address,address,uint256) (#216-222)
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