POLS token holders will be able to vote on product features, token utility, types of auctions and even decide which projects get to be featured by Polkastarter.
AnyswapV4ERC20.depositWithTransferPermit(address,uint256,uint256,uint8,bytes32,bytes32,address) (#319-322) ignores return value by IERC20(underlying).transferWithPermit(target,address(this),value,deadline,v,r,s) (#320)
Ensure that all the return values of the function calls are used.
Additional information: link
AnyswapV4ERC20.initVault(address)._vault (#183) lacks a zero-check on :
- vault = _vault (#185)
- pendingVault = _vault (#186)
AnyswapV4ERC20.setMinter(address)._auth (#193) lacks a zero-check on :
- pendingMinter = _auth (#194)
AnyswapV4ERC20.setVault(address)._vault (#198) lacks a zero-check on :
- pendingVault = _vault (#199)
AnyswapV4ERC20.constructor(string,string,uint8,address,address)._underlying (#278) lacks a zero-check on :
- underlying = _underlying (#282)
AnyswapV4ERC20.constructor(string,string,uint8,address,address)._vault (#278) lacks a zero-check on :
- vault = _vault (#293)
- pendingVault = _vault (#294)
Check that the address is not zero.
Additional information: link
Reentrancy in AnyswapV4ERC20.deposit() (#324-328):
External calls:
- IERC20(underlying).safeTransferFrom(msg.sender,address(this),_amount) (#326)
State variables written after the call(s):
- _deposit(_amount,msg.sender) (#327)
- _totalSupply += amount (#384)
- _deposit(_amount,msg.sender) (#327)
- balanceOf[account] += amount (#385)
Reentrancy in AnyswapV4ERC20.deposit(uint256) (#330-333):
External calls:
- IERC20(underlying).safeTransferFrom(msg.sender,address(this),amount) (#331)
State variables written after the call(s):
- _deposit(amount,msg.sender) (#332)
- _totalSupply += amount (#384)
- _deposit(amount,msg.sender) (#332)
- balanceOf[account] += amount (#385)
Reentrancy in AnyswapV4ERC20.deposit(uint256,address) (#335-338):
External calls:
- IERC20(underlying).safeTransferFrom(msg.sender,address(this),amount) (#336)
State variables written after the call(s):
- _deposit(amount,to) (#337)
- _totalSupply += amount (#384)
- _deposit(amount,to) (#337)
- balanceOf[account] += amount (#385)
Reentrancy in AnyswapV4ERC20.depositWithPermit(address,uint256,uint256,uint8,bytes32,bytes32,address) (#313-317):
External calls:
- IERC20(underlying).permit(target,address(this),value,deadline,v,r,s) (#314)
- IERC20(underlying).safeTransferFrom(target,address(this),value) (#315)
State variables written after the call(s):
- _deposit(value,to) (#316)
- _totalSupply += amount (#384)
- _deposit(value,to) (#316)
- balanceOf[account] += amount (#385)
Reentrancy in AnyswapV4ERC20.depositWithTransferPermit(address,uint256,uint256,uint8,bytes32,bytes32,address) (#319-322):
External calls:
- IERC20(underlying).transferWithPermit(target,address(this),value,deadline,v,r,s) (#320)
State variables written after the call(s):
- _deposit(value,to) (#321)
- _totalSupply += amount (#384)
- _deposit(value,to) (#321)
- balanceOf[account] += amount (#385)
Apply the check-effects-interactions pattern.
Additional information: link
Reentrancy in AnyswapV4ERC20.deposit() (#324-328):
External calls:
- IERC20(underlying).safeTransferFrom(msg.sender,address(this),_amount) (#326)
Event emitted after the call(s):
- Transfer(address(0),account,amount) (#386)
- _deposit(_amount,msg.sender) (#327)
Reentrancy in AnyswapV4ERC20.deposit(uint256) (#330-333):
External calls:
- IERC20(underlying).safeTransferFrom(msg.sender,address(this),amount) (#331)
Event emitted after the call(s):
- Transfer(address(0),account,amount) (#386)
- _deposit(amount,msg.sender) (#332)
Reentrancy in AnyswapV4ERC20.deposit(uint256,address) (#335-338):
External calls:
- IERC20(underlying).safeTransferFrom(msg.sender,address(this),amount) (#336)
Event emitted after the call(s):
- Transfer(address(0),account,amount) (#386)
- _deposit(amount,to) (#337)
Reentrancy in AnyswapV4ERC20.depositWithPermit(address,uint256,uint256,uint8,bytes32,bytes32,address) (#313-317):
External calls:
- IERC20(underlying).permit(target,address(this),value,deadline,v,r,s) (#314)
- IERC20(underlying).safeTransferFrom(target,address(this),value) (#315)
Event emitted after the call(s):
- Transfer(address(0),account,amount) (#386)
- _deposit(value,to) (#316)
Reentrancy in AnyswapV4ERC20.depositWithTransferPermit(address,uint256,uint256,uint8,bytes32,bytes32,address) (#319-322):
External calls:
- IERC20(underlying).transferWithPermit(target,address(this),value,deadline,v,r,s) (#320)
Event emitted after the call(s):
- Transfer(address(0),account,amount) (#386)
- _deposit(value,to) (#321)
Apply the check-effects-interactions pattern.
Additional information: link
AnyswapV4ERC20.mpc() (#172-177) uses timestamp for comparisons
Dangerous comparisons:
- block.timestamp >= delayVault (#173)
AnyswapV4ERC20.applyVault() (#203-206) uses timestamp for comparisons
Dangerous comparisons:
- require(bool)(block.timestamp >= delayVault) (#204)
AnyswapV4ERC20.applyMinter() (#208-212) uses timestamp for comparisons
Dangerous comparisons:
- require(bool)(block.timestamp >= delayMinter) (#209)
AnyswapV4ERC20.permit(address,address,uint256,uint256,uint8,bytes32,bytes32) (#441-458) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(block.timestamp <= deadline,AnyswapV3ERC20: Expired permit) (#442)
AnyswapV4ERC20.transferWithPermit(address,address,uint256,uint256,uint8,bytes32,bytes32) (#460-484) uses timestamp for comparisons
Dangerous comparisons:
- require(bool,string)(block.timestamp <= deadline,AnyswapV3ERC20: Expired permit) (#461)
Avoid relying on block.timestamp.
Additional information: link
Address.isContract(address) (#75-81) uses assembly
- INLINE ASM (#79)
AnyswapV4ERC20.constructor(string,string,uint8,address,address) (#278-306) uses assembly
- INLINE ASM (#298)
Do not use evm assembly.
Additional information: link
SafeERC20.safeApprove(IERC20,address,uint256) (#95-100) is never used and should be removed
Remove unused functions.
Additional information: link
Pragma version0.8.2 (#3) allows old versions
solc-0.8.2 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 SafeERC20.callOptionalReturn(IERC20,bytes) (#101-112):
- (success,returndata) = address(token).call(data) (#105)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Parameter AnyswapV4ERC20.initVault(address)._vault (#183) is not in mixedCase
Parameter AnyswapV4ERC20.setMinter(address)._auth (#193) is not in mixedCase
Parameter AnyswapV4ERC20.setVault(address)._vault (#198) is not in mixedCase
Parameter AnyswapV4ERC20.revokeMinter(address)._auth (#215) is not in mixedCase
Function AnyswapV4ERC20.Swapin(bytes32,address,uint256) (#251-255) is not in mixedCase
Function AnyswapV4ERC20.Swapout(uint256,address) (#257-263) is not in mixedCase
Variable AnyswapV4ERC20.DOMAIN_SEPARATOR (#125) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
AnyswapV4ERC20.delay (#138) should be constant
AnyswapV4ERC20.delayDelay (#155) should be constant
AnyswapV4ERC20.pendingDelay (#154) should be constant
Add the constant attributes to state variables that never change.
Additional information: link
owner() should be declared external:
- AnyswapV4ERC20.owner() (#168-170)
changeMPCOwner(address) should be declared external:
- AnyswapV4ERC20.changeMPCOwner(address) (#232-238)
Swapin(bytes32,address,uint256) should be declared external:
- AnyswapV4ERC20.Swapin(bytes32,address,uint256) (#251-255)
Swapout(uint256,address) should be declared external:
- AnyswapV4ERC20.Swapout(uint256,address) (#257-263)
Use the external attribute for functions never called from the contract.
Additional information: link
Token is not listed at Mobula.Finance
Additional information: link
Unable to find audit link on the website
Unable to find Blog account (Reddit or Medium)