✈️ RemeDAO is a combination of 3 awesome things in Crypto World: ✅ Rebase system ✅ Meme token ✅ DAO ✅ Play to Earn 🚀 Simply BUY-HOLD-EARN, APY up to 368,296.57% 🚀 Owning top Meme token without paying fee through DAO voting function 🚀 Full of green candles in $RMD chart by ultimate anti - whale system applying 🚀Getting back to your childhood by indulging in blockchain Gold Miner and earning pricey rewards. 💥 Could Remedao be your final destination? Find out more at: https://medium.com/@RemeDAO 💥
Remedao.swapBack() (#895-919) sends eth to arbitrary user
Dangerous calls:
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
Ensure that an arbitrary user cannot withdraw unauthorized funds.
Additional information: link
Reentrancy in Remedao._transferFrom(address,address,uint256) (#828-878):
External calls:
- rebase() (#842)
- pairContract.sync() (#737)
- swapBack() (#844)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#778-784)
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
External calls sending eth:
- swapBack() (#844)
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
State variables written after the call(s):
- _gonBalances[sender] = _gonBalances[sender].sub(gonAmount) (#861)
- _gonBalances[recipient] = _gonBalances[recipient].add(gonAmountReceived) (#865-867)
- gonAmountReceived = takeFee(sender,gonAmount) (#862-864)
- _gonBalances[address(this)] = _gonBalances[address(this)].add(gonAmount.mul(treasuryFee.add(insuranceFundFee).add(memeFee)).div(feeDenominator)) (#886-890)
Apply the check-effects-interactions pattern.
Additional information: link
Unable to verify that contract auditor is trusted: Certik, Quantstamp, Hacken, Solidity, Paladinsec, Openzeppelin, Verichains
Remedao.swapBack().success (#905) is written in both
(success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
(success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
Fix or remove the writes.
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.
Remedao.isContract(address) (#1126-1132) uses assembly
- INLINE ASM (#1128-1130)
Do not use evm assembly.
Additional information: link
Remedao.lockMaxBalance (#652) should be constant
Add the constant attributes to state variables that never change.
Additional information: link
Remedao.rebase() (#714-753) performs a multiplication on the result of a division:
-gonsPerFragment = TOTAL_GONS.div(_totalSupply) (#736)
-_gonBalances[lockAddress] = lockMaxBalance.mul(gonsPerFragment) (#741)
Remedao.rebase() (#714-753) performs a multiplication on the result of a division:
-gonsPerFragment = TOTAL_GONS.div(_totalSupply) (#736)
-_gonBalances[offChainGameReceiver] = _gonBalances[offChainGameReceiver].add(_gonBalances[lockAddress] - lockMaxBalance.mul(gonsPerFragment)) (#742-747)
Remedao.takeFee(address,uint256) (#880-893) performs a multiplication on the result of a division:
-feeAmount = gonAmount.div(feeDenominator).mul(totalFee) (#884)
Consider ordering multiplication before division.
Additional information: link
Reentrancy in Remedao.rebase() (#714-753):
External calls:
- pairContract.sync() (#737)
State variables written after the call(s):
- _rebaseEpoch = epoch (#738)
Apply the check-effects-interactions pattern.
Additional information: link
Remedao.rebase().rebaseRate (#717) 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
Remedao.setFee(uint256,uint256,uint256) (#1022-1032) should emit an event for:
- treasuryFee = _treasuryFee (#1028)
- insuranceFundFee = _insuranceFundFee (#1029)
- memeFee = _memeFee (#1030)
- totalFee = treasuryFee.add(insuranceFundFee).add(memeFee) (#1031)
Emit an event for critical parameter changes.
Additional information: link
Remedao.setLockAddress(address)._address (#940) lacks a zero-check on :
- lockAddress = _address (#942)
Remedao.setFeeReceivers(address,address,address)._treasuryReceiver (#1008) lacks a zero-check on :
- treasuryReceiver = _treasuryReceiver (#1012)
Remedao.setFeeReceivers(address,address,address)._insuranceFundReceiver (#1009) lacks a zero-check on :
- insuranceFundReceiver = _insuranceFundReceiver (#1013)
Remedao.setFeeReceivers(address,address,address)._offChainGameReceiver (#1010) lacks a zero-check on :
- offChainGameReceiver = _offChainGameReceiver (#1014)
Remedao.setPairAddress(address)._pairAddress (#1049) lacks a zero-check on :
- pairAddress = _pairAddress (#1050)
Check that the address is not zero.
Additional information: link
Reentrancy in Remedao._transferFrom(address,address,uint256) (#828-878):
External calls:
- rebase() (#842)
- pairContract.sync() (#737)
- swapBack() (#844)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#778-784)
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
External calls sending eth:
- swapBack() (#844)
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
State variables written after the call(s):
- maxSellInEpoch[sender][epoch] = currentMaxSell (#850-853)
- maxSellInEpoch[sender][epoch] = maxSellInEpoch[sender][epoch] (#850-853)
- sell[sender][epoch] = sell[sender][epoch].add(gonAmount) (#858)
Reentrancy in Remedao.constructor() (#677-695):
External calls:
- pair = IPancakeSwapFactory(router.factory()).createPair(router.WETH(),address(this)) (#679-682)
State variables written after the call(s):
- _allowedFragments[address(this)][address(router)] = MAX_UINT256 (#691)
- _gonBalances[treasuryReceiver] = TOTAL_GONS (#690)
- _isFeeExempt[address(this)] = true (#688)
- _isFeeExempt[treasuryReceiver] = true (#689)
- _memeStartTime = block.timestamp (#687)
- pairAddress = pair (#684)
- pairContract = IPancakeSwapPair(pair) (#685)
Reentrancy in Remedao.rebase() (#714-753):
External calls:
- pairContract.sync() (#737)
State variables written after the call(s):
- _gonBalances[lockAddress] = lockMaxBalance.mul(gonsPerFragment) (#741)
- _gonBalances[offChainGameReceiver] = _gonBalances[offChainGameReceiver].add(_gonBalances[lockAddress] - lockMaxBalance.mul(gonsPerFragment)) (#742-747)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in Remedao._transferFrom(address,address,uint256) (#828-878):
External calls:
- rebase() (#842)
- pairContract.sync() (#737)
- swapBack() (#844)
- router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap,0,path,address(this),block.timestamp) (#778-784)
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
External calls sending eth:
- swapBack() (#844)
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
Event emitted after the call(s):
- Transfer(sender,address(this),feeAmount.div(gonsPerFragment)) (#891)
- gonAmountReceived = takeFee(sender,gonAmount) (#862-864)
- Transfer(sender,recipient,gonAmountReceived.div(gonsPerFragment)) (#872-876)
Reentrancy in Remedao.constructor() (#677-695):
External calls:
- pair = IPancakeSwapFactory(router.factory()).createPair(router.WETH(),address(this)) (#679-682)
Event emitted after the call(s):
- Transfer(address(0),treasuryReceiver,_totalSupply) (#693)
Reentrancy in Remedao.rebase() (#714-753):
External calls:
- pairContract.sync() (#737)
Event emitted after the call(s):
- Rebase(epoch,_totalSupply) (#752)
Apply the check-effects-interactions pattern.
Additional information: link
Remedao.rebase() (#714-753) uses timestamp for comparisons
Dangerous comparisons:
- deltaTimeFromInit < (31536000) (#722)
- deltaTimeFromInit >= (5 * 31536000) (#724)
- deltaTimeFromInit >= ((15 * 31536000) / 10) (#726)
- deltaTimeFromInit >= (31536000) (#728)
- balanceOf(lockAddress) > lockMaxBalance (#740)
Remedao.shouldRebase() (#763-771) uses timestamp for comparisons
Dangerous comparisons:
- isStartRebase && _autoRebase && msg.sender != pair && ! inSwap && epoch > _rebaseEpoch (#765-770)
Remedao._transferFrom(address,address,uint256) (#828-878) uses timestamp for comparisons
Dangerous comparisons:
- require(bool)(! voteContract.lockVote(epoch,sender)) (#837)
- require(bool)(sell[sender][epoch].add(gonAmount) <= maxSellInEpoch[sender][epoch]) (#854-857)
Remedao._valueAt(uint256,Remedao.Snapshots) (#1080-1096) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(snapshotId <= currentMemeEpoch(),ERC20Snapshot: nonexistent id) (#1086-1089)
Remedao._updateSnapshot(Remedao.Snapshots,uint256) (#1102-1112) uses timestamp for comparisons
Dangerous comparisons:
- _lastSnapshotId(snapshots.ids) < currentId (#1106)
Avoid relying on block.timestamp.
Additional information: link
Math.average(uint256,uint256) (#97-99) is never used and should be removed
Math.max(uint256,uint256) (#89-91) is never used and should be removed
Math.min(uint256,uint256) (#93-95) is never used and should be removed
SafeMath.mod(uint256,uint256) (#82-85) is never used and should be removed
SafeMathInt.abs(int256) (#32-35) is never used and should be removed
SafeMathInt.add(int256,int256) (#26-30) is never used and should be removed
SafeMathInt.div(int256,int256) (#15-18) is never used and should be removed
SafeMathInt.mul(int256,int256) (#8-13) is never used and should be removed
SafeMathInt.sub(int256,int256) (#20-24) is never used and should be removed
Remove unused functions.
Additional information: link
Remedao.totalFee (#641) is set pre-construction with a non-constant function or state variable:
- treasuryFee.add(insuranceFundFee).add(memeFee)
Remedao.gonsPerFragment (#670) is set pre-construction with a non-constant function or state variable:
- TOTAL_GONS.div(_totalSupply)
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
solc-0.8.0 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 Remedao.setVoteContract(address) (#697-712):
- (success) = address(address(voteContract)).call{gas: 30000,value: address(this).balance}() (#705-708)
Low level call in Remedao.swapBack() (#895-919):
- (success) = address(treasuryReceiver).call{gas: 30000,value: amountETH.mul(treasuryFee).div(_memeDenominator)}() (#905-908)
- (success,None) = address(insuranceFundReceiver).call{gas: 30000,value: amountETH.mul(insuranceFundFee).div(_memeDenominator)}() (#909-912)
- (success,None) = address(address(voteContract)).call{gas: 30000,value: amountETH.mul(memeFee).div(_memeDenominator)}() (#914-917)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Function IPancakeSwapPair.DOMAIN_SEPARATOR() (#164) is not in mixedCase
Function IPancakeSwapPair.PERMIT_TYPEHASH() (#166) is not in mixedCase
Function IPancakeSwapPair.MINIMUM_LIQUIDITY() (#197) is not in mixedCase
Function IPancakeSwapRouter.WETH() (#243) is not in mixedCase
Function IRemedao.TOTAL_GONS() (#573) is not in mixedCase
Parameter Remedao.setVoteContract(address)._address (#697) is not in mixedCase
Parameter Remedao.setLockAddress(address)._address (#940) is not in mixedCase
Parameter Remedao.checkFeeExempt(address)._addr (#999) is not in mixedCase
Parameter Remedao.setFeeReceivers(address,address,address)._treasuryReceiver (#1008) is not in mixedCase
Parameter Remedao.setFeeReceivers(address,address,address)._insuranceFundReceiver (#1009) is not in mixedCase
Parameter Remedao.setFeeReceivers(address,address,address)._offChainGameReceiver (#1010) is not in mixedCase
Parameter Remedao.setMaxSell(uint256)._maxSell (#1017) is not in mixedCase
Parameter Remedao.setFee(uint256,uint256,uint256)._treasuryFee (#1023) is not in mixedCase
Parameter Remedao.setFee(uint256,uint256,uint256)._insuranceFundFee (#1024) is not in mixedCase
Parameter Remedao.setFee(uint256,uint256,uint256)._memeFee (#1025) is not in mixedCase
Parameter Remedao.setWhitelist(address,bool)._addr (#1034) is not in mixedCase
Parameter Remedao.setWhitelist(address,bool)._flag (#1034) is not in mixedCase
Parameter Remedao.setBotBlacklist(address,bool)._botAddress (#1038) is not in mixedCase
Parameter Remedao.setBotBlacklist(address,bool)._flag (#1038) is not in mixedCase
Parameter Remedao.setPairAddress(address)._pairAddress (#1049) is not in mixedCase
Parameter Remedao.setLP(address)._address (#1055) is not in mixedCase
Variable Remedao._isFeeExempt (#620) is not in mixedCase
Constant Remedao.feeDenominator (#642) is not in UPPER_CASE_WITH_UNDERSCORES
Constant Remedao.maxSellDenominator (#645) is not in UPPER_CASE_WITH_UNDERSCORES
Variable Remedao._autoRebase (#664) is not in mixedCase
Variable Remedao._rebaseStartTime (#665) is not in mixedCase
Variable Remedao._memeStartTime (#666) is not in mixedCase
Variable Remedao._totalSupply (#668) is not in mixedCase
Variable Remedao._rebaseEpoch (#671) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Variable IPancakeSwapRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountADesired (#248) is too similar to IPancakeSwapRouter.addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256).amountBDesired (#249)
Prevent variables from having similar names.
Additional information: link
SafeMathInt.MAX_INT256 (#6) is never used in SafeMathInt (#4-36)
Remove unused state variables.
Additional information: link
owner() should be declared external:
- Ownable.owner() (#486-488)
renounceOwnership() should be declared external:
- Ownable.renounceOwnership() (#499-502)
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (#504-506)
name() should be declared external:
- IERC20Metadata.name() (#559-561)
symbol() should be declared external:
- IERC20Metadata.symbol() (#563-565)
decimals() should be declared external:
- IERC20Metadata.decimals() (#567-569)
setPairAddress(address) should be declared external:
- Remedao.setPairAddress(address) (#1049-1053)
gonOfAt(address,uint256) should be declared external:
- Remedao.gonOfAt(address,uint256) (#1071-1078)
Use the external attribute for functions never called from the contract.
Additional information: link
Contract ownership is semi-renounced (passed to a contract)
BscScan page for the token does not contain additional info: website, socials, description, etc.
Additional information: link
Unable to find token on CoinGecko
Additional information: link
Unable to find token on CoinMarketCap
Additional information: link
Token is not listed at Mobula.Finance
Additional information: link
Unable to find code repository for the project
Young tokens have high risks of scam / price dump / death
Token is marked as scam (rug pull, honeypot, phishing, etc.)
Additional information: link
Young tokens have high risks of scam / price dump / death
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 Youtube account
Unable to find Discord account