Our Mission is to Create wealth, for all Grovers, by harnessing the opportunities of a secure, decentralized digital currency in an environmentally conscious way. By compensating nature for years of abuse, Grove will create a healthier, wealthier future for all.
Grove._name (#634) shadows:
- ERC20._name (#423)
Grove._symbol (#635) shadows:
- ERC20._symbol (#424)
Remove the state variable shadowing.
Additional information: link
Grove._addLiquidity(uint256,uint256) (#1392-1402) sends eth to arbitrary user
Dangerous calls:
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
Grove._swapBNBForBUSD(uint256) (#1366-1378) sends eth to arbitrary user
Dangerous calls:
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
Ensure that an arbitrary user cannot withdraw unauthorized funds.
Additional information: link
Reentrancy in Grove._transfer(address,address,uint256) (#1052-1151):
External calls:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- success = IERC20(address(this)).transfer(address(dividendTracker),amountForHolders) (#1360)
- dividendTracker.distributeDividendsUsingAmount(amountForHolders) (#1362)
External calls sending eth:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
State variables written after the call(s):
- super._transfer(from,address(this),fee) (#1122)
- _balances[sender] = _balances[sender].sub(amount,ERC20: transfer amount exceeds balance) (#493)
- _balances[recipient] = _balances[recipient].add(amount) (#494)
- super._burn(address(this),burnAmount) (#1125)
- _balances[account] = _balances[account].sub(amount,ERC20: burn amount exceeds balance) (#509)
- super._transfer(from,to,amount) (#1129)
- _balances[sender] = _balances[sender].sub(amount,ERC20: transfer amount exceeds balance) (#493)
- _balances[recipient] = _balances[recipient].add(amount) (#494)
- _buyTimesInLaunch[to] = currentTimestamp (#1133)
- _lastSells[from] = currentTimestamp (#1138)
- _swapping = false (#1110)
Apply the check-effects-interactions pattern.
Additional information: link
Contract ownership is not renounced (belongs to a wallet)
Contract locking ether found:
Contract GroveDividendTracker (#1405-1517) has payable functions:
- DividendPayingToken.receive() (#547-549)
- DividendPayingToken.distributeDividends() (#558-565)
- DividendPayingTokenInterface.distributeDividends() (#227)
But does not have a function to withdraw the ether
Remove the payable attribute or add a withdraw function.
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.
Redundant expression "this (#10)" inContext (#5-13)
Remove redundant statements if they congest code but offer no value.
Additional information: link
Variable IUniswapV2Router01.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountADesired (#33) is too similar to IUniswapV2Router01.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountBDesired (#34)
Prevent variables from having similar names.
Additional information: link
Grove.gasForProcessing (#668) should be constant
Add the constant attributes to state variables that never change.
Additional information: link
DividendPayingToken.constructor(string,string)._name (#545) shadows:
- ERC20._name (#423) (state variable)
DividendPayingToken.accumulativeDividendOf(address)._owner (#592) shadows:
- Ownable._owner (#391) (state variable)
DividendPayingToken.withdrawableDividendOf(address)._owner (#586) shadows:
- Ownable._owner (#391) (state variable)
DividendPayingToken.constructor(string,string)._symbol (#545) shadows:
- ERC20._symbol (#424) (state variable)
DividendPayingToken.dividendOf(address)._owner (#583) shadows:
- Ownable._owner (#391) (state variable)
DividendPayingToken.withdrawnDividendOf(address)._owner (#589) shadows:
- Ownable._owner (#391) (state variable)
Rename the local variables that shadow another component.
Additional information: link
Variable 'Grove._transfer(address,address,uint256).iterations (#1146)' in Grove._transfer(address,address,uint256) (#1052-1151) potentially used before declaration: ProcessedDividendTracker(iterations,claims,lastProcessedIndex,true,gas,tx.origin) (#1147)
Variable 'Grove._transfer(address,address,uint256).claims (#1146)' in Grove._transfer(address,address,uint256) (#1052-1151) potentially used before declaration: ProcessedDividendTracker(iterations,claims,lastProcessedIndex,true,gas,tx.origin) (#1147)
Variable 'Grove._transfer(address,address,uint256).lastProcessedIndex (#1146)' in Grove._transfer(address,address,uint256) (#1052-1151) potentially used before declaration: ProcessedDividendTracker(iterations,claims,lastProcessedIndex,true,gas,tx.origin) (#1147)
Move all variable declarations prior to any usage of the variable, and ensure that reaching a variable declaration does not depend on some conditional if it is used unconditionally.
Additional information: link
Grove._transfer(address,address,uint256).lastProcessedIndex (#1146) is a local variable never initialized
Grove._transfer(address,address,uint256).claims (#1146) is a local variable never initialized
Grove._transfer(address,address,uint256).iterations (#1146) 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
Reentrancy in DividendPayingToken._withdrawDividendOfUser(address) (#569-582):
External calls:
- success = IERC20(rewardToken).transfer(user,_withdrawableDividend) (#574)
State variables written after the call(s):
- withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend) (#576)
Apply the check-effects-interactions pattern.
Additional information: link
DividendPayingToken._withdrawDividendOfUser(address) (#569-582) has external calls inside a loop: success = IERC20(rewardToken).transfer(user,_withdrawableDividend) (#574)
Favor pull over push strategy for external calls.
Additional information: link
SafeMathInt.div(int256,int256) (#303-309) is never used and should be removed
SafeMathInt.abs(int256) (#320-323) is never used and should be removed
SafeMathInt.mul(int256,int256) (#295-302) is never used and should be removed
SafeMath.mod(uint256,uint256,string) (#285-288) is never used and should be removed
SafeMath.div(uint256,uint256,string) (#275-281) is never used and should be removed
Context._msgData() (#9-12) is never used and should be removed
SafeMath.mod(uint256,uint256) (#282-284) is never used and should be removed
SafeMath.div(uint256,uint256) (#272-274) is never used and should be removed
DividendPayingToken._transfer(address,address,uint256) (#596-601) is never used and should be removed
Remove unused functions.
Additional information: link
Grove.slitherConstructorVariables() (#630-1403) uses literals with too many digits:
- minimumTokensBeforeSwap = initialSupply * 50 / 100000 (#667)
Grove.slitherConstructorVariables() (#630-1403) uses literals with too many digits:
- maxSellTxAmount = 50000000000000 * (10 ** 18) (#663)
Grove.slitherConstructorConstantVariables() (#630-1403) uses literals with too many digits:
- initialSupply = 100000000000000000 * (10 ** 18) (#656)
Grove.constructor() (#751-807) uses literals with too many digits:
- dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD)) (#776)
Grove.slitherConstructorVariables() (#630-1403) uses literals with too many digits:
- maxBuyTxAmount = 500000000000000 * (10 ** 18) (#664)
Grove.slitherConstructorVariables() (#630-1403) uses literals with too many digits:
- gasForProcessing = 300000 (#668)
Use: Ether suffix, Time suffix, or The scientific notation
Additional information: link
get(IterableMapping.Map,address) should be declared external:
- IterableMapping.get(IterableMapping.Map,address) (#345-347)
dividendTokenBalanceOf(address) should be declared external:
- Grove.dividendTokenBalanceOf(address) (#1026-1028)
transferFrom(address,address,uint256) should be declared external:
- ERC20.transferFrom(address,address,uint256) (#465-473)
getKeyAtIndex(IterableMapping.Map,uint256) should be declared external:
- IterableMapping.getKeyAtIndex(IterableMapping.Map,uint256) (#354-356)
renounceOwnership() should be declared external:
- Ownable.renounceOwnership() (#405-408)
decimals() should be declared external:
- ERC20.decimals() (#439-441)
dividendOf(address) should be declared external:
- DividendPayingToken.dividendOf(address) (#583-585)
getIndexOfKey(IterableMapping.Map,address) should be declared external:
- IterableMapping.getIndexOfKey(IterableMapping.Map,address) (#348-353)
decreaseAllowance(address,uint256) should be declared external:
- ERC20.decreaseAllowance(address,uint256) (#480-483)
symbol() should be declared external:
- ERC20.symbol() (#435-437)
transfer(address,uint256) should be declared external:
- ERC20.transfer(address,uint256) (#451-454)
increaseAllowance(address,uint256) should be declared external:
- ERC20.increaseAllowance(address,uint256) (#475-478)
distributeDividendsUsingAmount(uint256) should be declared external:
- DividendPayingToken.distributeDividendsUsingAmount(uint256) (#550-557)
process(uint256) should be declared external:
- GroveDividendTracker.process(uint256) (#1472-1505)
size(IterableMapping.Map) should be declared external:
- IterableMapping.size(IterableMapping.Map) (#357-359)
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (#409-413)
name() should be declared external:
- ERC20.name() (#431-433)
withdrawableDividendOf(address) should be declared external:
- Grove.withdrawableDividendOf(address) (#1023-1025)
approve(address,uint256) should be declared external:
- ERC20.approve(address,uint256) (#460-463)
withdrawDividend() should be declared external:
- DividendPayingToken.withdrawDividend() (#566-568)
withdrawnDividendOf(address) should be declared external:
- DividendPayingToken.withdrawnDividendOf(address) (#589-591)
allowance(address,address) should be declared external:
- ERC20.allowance(address,address) (#456-458)
Use the external attribute for functions never called from the contract.
Additional information: link
Grove._adjustTaxes(bool,bool,bool,address) (#1152-1270) uses timestamp for comparisons
Dangerous comparisons:
- _isLaunched && timeSinceLaunch <= _launch2.timeInPeriod && blocksSinceLaunch > _launch1.blocksInPeriod (#1178)
- timeSinceSprout <= _sprout1.timeInPeriod (#1193)
- timeSinceSprout > _sprout1.timeInPeriod && timeSinceSprout <= _sprout1.timeInPeriod + _sprout2.timeInPeriod (#1200)
- _isLaunched && timeSinceLaunch <= _launch2.timeInPeriod && blocksSinceLaunch > _launch1.blocksInPeriod (#1223)
- timeSinceSprout <= _sprout1.timeInPeriod (#1238)
- timeSinceSprout > _sprout1.timeInPeriod && timeSinceSprout <= _sprout1.timeInPeriod + _sprout2.timeInPeriod (#1245)
- ! isTradingEnabled && _tradingPausedTimestamp > _launchStartTimestamp (#1154)
GroveDividendTracker.canAutoClaim(uint256) (#1452-1457) uses timestamp for comparisons
Dangerous comparisons:
- lastClaimTime > block.timestamp (#1453)
- block.timestamp.sub(lastClaimTime) >= claimWait (#1456)
Grove.blockAccount(address) (#886-894) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(currentTimestamp - _launchStartTimestamp < _blockedTimeLimit,Grove: Time to block accounts has expired) (#890)
Grove._transfer(address,address,uint256) (#1052-1151) uses timestamp for comparisons
Dangerous comparisons:
- _isInLaunch && currentTimestamp - _launchStartTimestamp <= 300 && isBuyFromLp (#1075)
- require(bool,string)((currentTimestamp - _buyTimesInLaunch[to]) > 60,Grove: Cannot buy more than once per min in launch) (#1076)
- require(bool,string)((currentTimestamp - _lastSells[from]) >= sellCoolDownPeriod,Grove: Must wait sellCoolDownPeriod to sell again) (#1079)
- _isInLaunch && (currentTimestamp - _launchStartTimestamp) <= 300 (#1131)
- to != owner() && isBuyFromLp && (currentTimestamp - _buyTimesInLaunch[to]) > 60 (#1132)
- ! isTradingEnabled && _tradingPausedTimestamp > _launchStartTimestamp (#1069)
Grove.isInLaunch() (#1011-1019) uses timestamp for comparisons
Dangerous comparisons:
- _isLaunched && (currentTimestamp - _launchStartTimestamp < totalLaunchTime || block.number - _launchBlockNumber < _launch1.blocksInPeriod) (#1014)
- ! isTradingEnabled && _tradingPausedTimestamp > _launchStartTimestamp (#1012)
Grove.isInSproutHour() (#1002-1010) uses timestamp for comparisons
Dangerous comparisons:
- currentTimestamp - _sproutHourStartTimestamp < totalsproutTime (#1005)
- ! isTradingEnabled && _tradingPausedTimestamp > _sproutHourStartTimestamp (#1003)
Avoid relying on block.timestamp.
Additional information: link
Pragma version0.8.12 (#3) necessitates a version too recent to be trusted. Consider deploying with 0.6.12/0.7.6/0.8.7
solc-0.8.12 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
SafeMathInt.MAX_INT256 (#293) is never used in SafeMathInt (#291-328)
Grove._decimals (#636) is never used in Grove (#630-1403)
Remove unused state variables.
Additional information: link
Parameter Grove.setSproutHour1BuyFees(uint256,uint256,uint256,uint256,uint256)._buyBackFeeOnBuy (#948) is not in mixedCase
Parameter Grove.setSproutHour2SellFees(uint256,uint256,uint256,uint256,uint256)._buyBackFeeOnSell (#961) is not in mixedCase
Parameter Grove.setBaseFeesOnBuy(uint256,uint256,uint256,uint256,uint256)._marketingFeeOnBuy (#939) is not in mixedCase
Parameter Grove.setSproutHour2SellFees(uint256,uint256,uint256,uint256,uint256)._burnFeeOnSell (#961) is not in mixedCase
Parameter Grove.setBaseFeesOnSell(uint256,uint256,uint256,uint256,uint256)._burnFeeOnSell (#943) is not in mixedCase
Parameter Grove.setBaseFeesOnSell(uint256,uint256,uint256,uint256,uint256)._liquidityFeeOnSell (#943) is not in mixedCase
Constant Grove.initialSupply (#656) is not in UPPER_CASE_WITH_UNDERSCORES
Constant Grove._blockedTimeLimit (#672) is not in UPPER_CASE_WITH_UNDERSCORES
Parameter Grove.setSproutHour1SellFees(uint256,uint256,uint256,uint256,uint256)._holdersFeeOnSell (#952) is not in mixedCase
Function IUniswapV2Pair.PERMIT_TYPEHASH() (#172) is not in mixedCase
Parameter Grove.setBaseFeesOnSell(uint256,uint256,uint256,uint256,uint256)._buyBackFeeOnSell (#943) is not in mixedCase
Function IUniswapV2Pair.MINIMUM_LIQUIDITY() (#186) is not in mixedCase
Parameter Grove.setBaseFeesOnBuy(uint256,uint256,uint256,uint256,uint256)._liquidityFeeOnBuy (#939) is not in mixedCase
Constant DividendPayingToken.magnitude (#536) is not in UPPER_CASE_WITH_UNDERSCORES
Parameter Grove.setSproutHour1BuyFees(uint256,uint256,uint256,uint256,uint256)._burnFeeOnBuy (#948) is not in mixedCase
Parameter Grove.setSproutHour1BuyFees(uint256,uint256,uint256,uint256,uint256)._holdersFeeOnBuy (#948) is not in mixedCase
Parameter Grove.setSproutHour1BuyFees(uint256,uint256,uint256,uint256,uint256)._liquidityFeeOnBuy (#948) is not in mixedCase
Function IUniswapV2Pair.DOMAIN_SEPARATOR() (#171) is not in mixedCase
Parameter Grove.setSproutHour1SellFees(uint256,uint256,uint256,uint256,uint256)._liquidityFeeOnSell (#952) is not in mixedCase
Parameter Grove.setSproutHour2BuyFees(uint256,uint256,uint256,uint256,uint256)._burnFeeOnBuy (#957) is not in mixedCase
Parameter Grove.setBaseFeesOnBuy(uint256,uint256,uint256,uint256,uint256)._burnFeeOnBuy (#939) is not in mixedCase
Parameter Grove.setSproutHour2BuyFees(uint256,uint256,uint256,uint256,uint256)._buyBackFeeOnBuy (#957) is not in mixedCase
Parameter DividendPayingToken.dividendOf(address)._owner (#583) is not in mixedCase
Parameter Grove.setSproutHour1BuyFees(uint256,uint256,uint256,uint256,uint256)._marketingFeeOnBuy (#948) is not in mixedCase
Parameter DividendPayingToken.withdrawnDividendOf(address)._owner (#589) is not in mixedCase
Parameter Grove.setSproutHour2SellFees(uint256,uint256,uint256,uint256,uint256)._holdersFeeOnSell (#961) is not in mixedCase
Parameter Grove.setSproutHour2SellFees(uint256,uint256,uint256,uint256,uint256)._liquidityFeeOnSell (#961) is not in mixedCase
Parameter Grove.setBaseFeesOnBuy(uint256,uint256,uint256,uint256,uint256)._holdersFeeOnBuy (#939) is not in mixedCase
Constant Grove._decimals (#636) is not in UPPER_CASE_WITH_UNDERSCORES
Parameter DividendPayingToken.withdrawableDividendOf(address)._owner (#586) is not in mixedCase
Parameter Grove.setSproutHour2SellFees(uint256,uint256,uint256,uint256,uint256)._marketingFeeOnSell (#961) is not in mixedCase
Parameter Grove.setSproutHour2BuyFees(uint256,uint256,uint256,uint256,uint256)._marketingFeeOnBuy (#957) is not in mixedCase
Parameter Grove.setSproutHour2BuyFees(uint256,uint256,uint256,uint256,uint256)._holdersFeeOnBuy (#957) is not in mixedCase
Constant Grove._symbol (#635) is not in UPPER_CASE_WITH_UNDERSCORES
Parameter Grove.setSproutHour2BuyFees(uint256,uint256,uint256,uint256,uint256)._liquidityFeeOnBuy (#957) is not in mixedCase
Variable Grove.BUSD (#639) is not in mixedCase
Parameter Grove.setBaseFeesOnBuy(uint256,uint256,uint256,uint256,uint256)._buyBackFeeOnBuy (#939) is not in mixedCase
Function IUniswapV2Router01.WETH() (#29) is not in mixedCase
Parameter Grove.setSproutHour1SellFees(uint256,uint256,uint256,uint256,uint256)._marketingFeeOnSell (#952) is not in mixedCase
Parameter Grove.setSproutHour1SellFees(uint256,uint256,uint256,uint256,uint256)._buyBackFeeOnSell (#952) is not in mixedCase
Parameter DividendPayingToken.accumulativeDividendOf(address)._owner (#592) is not in mixedCase
Parameter Grove.setBaseFeesOnSell(uint256,uint256,uint256,uint256,uint256)._marketingFeeOnSell (#943) is not in mixedCase
Parameter Grove.setBaseFeesOnSell(uint256,uint256,uint256,uint256,uint256)._holdersFeeOnSell (#943) is not in mixedCase
Parameter Grove.setSproutHour1SellFees(uint256,uint256,uint256,uint256,uint256)._burnFeeOnSell (#952) is not in mixedCase
Constant Grove._name (#634) is not in UPPER_CASE_WITH_UNDERSCORES
Follow the Solidity naming convention.
Additional information: link
Grove.claim() (#990-992) ignores return value by dividendTracker.processAccount(address(msg.sender),false) (#991)
Grove._addLiquidity(uint256,uint256) (#1392-1402) ignores return value by uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
Grove._transfer(address,address,uint256) (#1052-1151) ignores return value by dividendTracker.process(gas) (#1146-1149)
Ensure that all the return values of the function calls are used.
Additional information: link
Reentrancy in GroveDividendTracker.processAccount(address,bool) (#1507-1515):
External calls:
- amount = _withdrawDividendOfUser(account) (#1508)
- success = IERC20(rewardToken).transfer(user,_withdrawableDividend) (#574)
State variables written after the call(s):
- lastClaimTimes[account] = block.timestamp (#1510)
Reentrancy in Grove._transfer(address,address,uint256) (#1052-1151):
External calls:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- success = IERC20(address(this)).transfer(address(dividendTracker),amountForHolders) (#1360)
- dividendTracker.distributeDividendsUsingAmount(amountForHolders) (#1362)
External calls sending eth:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
State variables written after the call(s):
- super._burn(address(this),burnAmount) (#1125)
- _totalSupply = _totalSupply.sub(amount) (#510)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- _swapTokensForBNB(amountToSwap) (#1335)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
State variables written after the call(s):
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- _allowances[owner][spender] = amount (#520)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- _swapTokensForBNB(amountToSwap) (#1335)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
State variables written after the call(s):
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- _allowances[owner][spender] = amount (#520)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in Grove._setAutomatedMarketMakerPair(address,bool) (#851-858):
External calls:
- dividendTracker.excludeFromDividends(pair) (#855)
Event emitted after the call(s):
- AutomatedMarketMakerPairChange(pair,value) (#857)
Reentrancy in Grove._transfer(address,address,uint256) (#1052-1151):
External calls:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- success = IERC20(address(this)).transfer(address(dividendTracker),amountForHolders) (#1360)
- dividendTracker.distributeDividendsUsingAmount(amountForHolders) (#1362)
- dividendTracker.setBalance(address(from),balanceOf(from)) (#1141)
- dividendTracker.setBalance(address(to),balanceOf(to)) (#1142)
- dividendTracker.process(gas) (#1146-1149)
External calls sending eth:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
Event emitted after the call(s):
- ProcessedDividendTracker(iterations,claims,lastProcessedIndex,true,gas,tx.origin) (#1147)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- _swapTokensForBNB(amountToSwap) (#1335)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
Event emitted after the call(s):
- MarketingSent(amountBNBMarketing,BUSDBalanceAfterSwap) (#1351)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- _swapTokensForBNB(amountToSwap) (#1335)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- success = IERC20(address(this)).transfer(address(dividendTracker),amountForHolders) (#1360)
- dividendTracker.distributeDividendsUsingAmount(amountForHolders) (#1362)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
Event emitted after the call(s):
- DividendsSent(amountForHolders) (#1363)
Reentrancy in Grove._transfer(address,address,uint256) (#1052-1151):
External calls:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- success = IERC20(address(this)).transfer(address(dividendTracker),amountForHolders) (#1360)
- dividendTracker.distributeDividendsUsingAmount(amountForHolders) (#1362)
External calls sending eth:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
Event emitted after the call(s):
- Transfer(account,address(0),amount) (#511)
- super._burn(address(this),burnAmount) (#1125)
- Transfer(sender,recipient,amount) (#495)
- super._transfer(from,to,amount) (#1129)
- Transfer(sender,recipient,amount) (#495)
- super._transfer(from,address(this),fee) (#1122)
Reentrancy in Grove.claimBNBOverflow(uint256) (#993-999):
External calls:
- (success) = address(owner()).call{value: amount}() (#995)
Event emitted after the call(s):
- ClaimBNBOverflow(amount) (#997)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- _swapTokensForBNB(amountToSwap) (#1335)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- marketingSuccess = BUSD.transfer(marketingWallet,BUSDBalanceAfterSwap) (#1349)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
Event emitted after the call(s):
- Approval(owner,spender,amount) (#521)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- SwapAndLiquify(amountToSwap,amountBNBLiquidity,amountToLiquify) (#1357)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- _swapTokensForBNB(amountToSwap) (#1335)
- uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount,0,path,address(this),block.timestamp) (#1384-1390)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
Event emitted after the call(s):
- Approval(owner,spender,amount) (#521)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
Reentrancy in GroveDividendTracker.processAccount(address,bool) (#1507-1515):
External calls:
- amount = _withdrawDividendOfUser(account) (#1508)
- success = IERC20(rewardToken).transfer(user,_withdrawableDividend) (#574)
Event emitted after the call(s):
- Claim(account,amount,automatic) (#1511)
Apply the check-effects-interactions pattern.
Additional information: link
Low level call in Grove.claimBNBOverflow(uint256) (#993-999):
- (success) = address(owner()).call{value: amount}() (#995)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Reentrancy in Grove._transfer(address,address,uint256) (#1052-1151):
External calls:
- _swapAndLiquify() (#1109)
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
External calls sending eth:
- _swapAndLiquify() (#1109)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
State variables written after the call(s):
- super._transfer(from,address(this),fee) (#1122)
- _balances[sender] = _balances[sender].sub(amount,ERC20: transfer amount exceeds balance) (#493)
- _balances[recipient] = _balances[recipient].add(amount) (#494)
- super._burn(address(this),burnAmount) (#1125)
- _balances[account] = _balances[account].sub(amount,ERC20: burn amount exceeds balance) (#509)
- super._transfer(from,to,amount) (#1129)
- _balances[sender] = _balances[sender].sub(amount,ERC20: transfer amount exceeds balance) (#493)
- _balances[recipient] = _balances[recipient].add(amount) (#494)
- _buyTimesInLaunch[to] = currentTimestamp (#1133)
- _lastSells[from] = currentTimestamp (#1138)
- _swapping = false (#1110)
- super._burn(address(this),burnAmount) (#1125)
- _totalSupply = _totalSupply.sub(amount) (#510)
Event emitted after the call(s):
- ProcessedDividendTracker(iterations,claims,lastProcessedIndex,true,gas,tx.origin) (#1147)
- Transfer(account,address(0),amount) (#511)
- super._burn(address(this),burnAmount) (#1125)
- Transfer(sender,recipient,amount) (#495)
- super._transfer(from,address(this),fee) (#1122)
- Transfer(sender,recipient,amount) (#495)
- super._transfer(from,to,amount) (#1129)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,liquidityWallet,block.timestamp) (#1394-1401)
State variables written after the call(s):
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- _allowances[owner][spender] = amount (#520)
Event emitted after the call(s):
- Approval(owner,spender,amount) (#521)
- _addLiquidity(amountToLiquify,amountBNBLiquidity) (#1356)
- DividendsSent(amountForHolders) (#1363)
- SwapAndLiquify(amountToSwap,amountBNBLiquidity,amountToLiquify) (#1357)
Reentrancy in Grove._swapAndLiquify() (#1327-1365):
External calls:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
External calls sending eth:
- address(buyBackWallet).transfer(amountBNBBuyBack) (#1343)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmount}(0,path,address(this),block.timestamp) (#1372-1377)
State variables written after the call(s):
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- _allowances[owner][spender] = amount (#520)
Event emitted after the call(s):
- Approval(owner,spender,amount) (#521)
- _swapBNBForBUSD(amountBNBMarketing) (#1347)
- MarketingSent(amountBNBMarketing,BUSDBalanceAfterSwap) (#1351)
Apply the check-effects-interactions pattern.
Additional information: link
Young tokens have high risks of price dump / death
Token has relatively low CoinGecko rank