mirror of https://github.com/crytic/slither
Merge pull request #215 from crytic/dev-fp-erc20-interface
Fix FP in erc20-interface as a result of ERC721 similaritiespull/231/head
commit
f0cb66dd2b
@ -0,0 +1,96 @@ |
|||||||
|
""" |
||||||
|
Detect incorrect erc721 interface. |
||||||
|
""" |
||||||
|
from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification |
||||||
|
|
||||||
|
|
||||||
|
class IncorrectERC721InterfaceDetection(AbstractDetector): |
||||||
|
""" |
||||||
|
Incorrect ERC721 Interface |
||||||
|
""" |
||||||
|
|
||||||
|
ARGUMENT = 'erc721-interface' |
||||||
|
HELP = 'Incorrect ERC721 interfaces' |
||||||
|
IMPACT = DetectorClassification.MEDIUM |
||||||
|
CONFIDENCE = DetectorClassification.HIGH |
||||||
|
|
||||||
|
WIKI = 'https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc721-interface' |
||||||
|
|
||||||
|
WIKI_TITLE = 'Incorrect erc721 interface' |
||||||
|
WIKI_DESCRIPTION = 'Incorrect return values for ERC721 functions. A contract compiled with solidity > 0.4.22 interacting with these functions will fail to execute them, as the return value is missing.' |
||||||
|
WIKI_EXPLOIT_SCENARIO = ''' |
||||||
|
```solidity |
||||||
|
contract Token{ |
||||||
|
function ownerOf(uint256 _tokenId) external view returns (bool); |
||||||
|
//... |
||||||
|
} |
||||||
|
``` |
||||||
|
`Token.ownerOf` does not return an address as ERC721 expects. Bob deploys the token. Alice creates a contract that interacts with it but assumes a correct ERC721 interface implementation. Alice's contract is unable to interact with Bob's contract.''' |
||||||
|
|
||||||
|
WIKI_RECOMMENDATION = 'Set the appropriate return values and value-types for the defined ERC721 functions.' |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def incorrect_erc721_interface(signature): |
||||||
|
(name, parameters, returnVars) = signature |
||||||
|
|
||||||
|
# ERC721 |
||||||
|
if name == 'balanceOf' and parameters == ['address'] and returnVars != ['uint256']: |
||||||
|
return True |
||||||
|
if name == 'ownerOf' and parameters == ['uint256'] and returnVars != ['address']: |
||||||
|
return True |
||||||
|
if name == 'safeTransferFrom' and parameters == ['address', 'address', 'uint256', 'bytes'] and returnVars != []: |
||||||
|
return True |
||||||
|
if name == 'safeTransferFrom' and parameters == ['address', 'address', 'uint256'] and returnVars != []: |
||||||
|
return True |
||||||
|
if name == 'transferFrom' and parameters == ['address', 'address', 'uint256'] and returnVars != []: |
||||||
|
return True |
||||||
|
if name == 'approve' and parameters == ['address', 'uint256'] and returnVars != []: |
||||||
|
return True |
||||||
|
if name == 'setApprovalForAll' and parameters == ['address', 'bool'] and returnVars != []: |
||||||
|
return True |
||||||
|
if name == 'getApproved' and parameters == ['uint256'] and returnVars != ['address']: |
||||||
|
return True |
||||||
|
if name == 'isApprovedForAll' and parameters == ['address', 'address'] and returnVars != ['bool']: |
||||||
|
return True |
||||||
|
|
||||||
|
# ERC165 (dependency) |
||||||
|
if name == 'supportsInterface' and parameters == ['bytes4'] and returnVars != ['bool']: |
||||||
|
return True |
||||||
|
|
||||||
|
return False |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def detect_incorrect_erc721_interface(contract): |
||||||
|
""" Detect incorrect ERC721 interface |
||||||
|
|
||||||
|
Returns: |
||||||
|
list(str) : list of incorrect function signatures |
||||||
|
""" |
||||||
|
|
||||||
|
# Verify this is an ERC721 contract. |
||||||
|
if not contract.has_an_erc721_function() or not contract.has_an_erc20_function(): |
||||||
|
return [] |
||||||
|
|
||||||
|
functions = [f for f in contract.functions if IncorrectERC721InterfaceDetection.incorrect_erc721_interface(f.signature)] |
||||||
|
return functions |
||||||
|
|
||||||
|
def _detect(self): |
||||||
|
""" Detect incorrect erc721 interface |
||||||
|
|
||||||
|
Returns: |
||||||
|
dict: [contract name] = set(str) events |
||||||
|
""" |
||||||
|
results = [] |
||||||
|
for c in self.contracts: |
||||||
|
functions = IncorrectERC721InterfaceDetection.detect_incorrect_erc721_interface(c) |
||||||
|
if functions: |
||||||
|
info = "{} ({}) has incorrect ERC721 function interface(s):\n" |
||||||
|
info = info.format(c.name, |
||||||
|
c.source_mapping_str) |
||||||
|
for function in functions: |
||||||
|
info += "\t-{} ({})\n".format(function.name, function.source_mapping_str) |
||||||
|
json = self.generate_json_result(info) |
||||||
|
self.add_functions_to_json(functions, json) |
||||||
|
results.append(json) |
||||||
|
|
||||||
|
return results |
@ -0,0 +1,80 @@ |
|||||||
|
""" |
||||||
|
Module detecting numbers with too many digits. |
||||||
|
""" |
||||||
|
|
||||||
|
from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification |
||||||
|
from slither.slithir.variables import Constant |
||||||
|
|
||||||
|
class TooManyDigits(AbstractDetector): |
||||||
|
""" |
||||||
|
Detect numbers with too many digits |
||||||
|
""" |
||||||
|
|
||||||
|
ARGUMENT = 'too-many-digits' |
||||||
|
HELP = 'Conformance to numeric notation best practices' |
||||||
|
IMPACT = DetectorClassification.INFORMATIONAL |
||||||
|
CONFIDENCE = DetectorClassification.MEDIUM |
||||||
|
|
||||||
|
WIKI = 'https://github.com/crytic/slither/wiki/Detector-Documentation#too-many-digits' |
||||||
|
WIKI_TITLE = 'Too many digits' |
||||||
|
WIKI_DESCRIPTION = ''' |
||||||
|
Literals with many digits are difficult to read and review. |
||||||
|
''' |
||||||
|
WIKI_EXPLOIT_SCENARIO = ''' |
||||||
|
```solidity |
||||||
|
contract MyContract{ |
||||||
|
uint 1_ether = 10000000000000000000; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
While `1_ether` looks like `1 ether`, it is `10 ether`. As a result, its usage is likely to be incorrect. |
||||||
|
''' |
||||||
|
WIKI_RECOMMENDATION = ''' |
||||||
|
Use: |
||||||
|
- [Ether suffix](https://solidity.readthedocs.io/en/latest/units-and-global-variables.html#ether-units) |
||||||
|
- [Time suffix](https://solidity.readthedocs.io/en/latest/units-and-global-variables.html#time-units), or |
||||||
|
- [The scientific notation](https://solidity.readthedocs.io/en/latest/types.html#rational-and-integer-literals) |
||||||
|
''' |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
def _detect_too_many_digits(f): |
||||||
|
ret = [] |
||||||
|
for node in f.nodes: |
||||||
|
# each node contains a list of IR instruction |
||||||
|
for ir in node.irs: |
||||||
|
# iterate over all the variables read by the IR |
||||||
|
for read in ir.read: |
||||||
|
# if the variable is a constant |
||||||
|
if isinstance(read, Constant): |
||||||
|
# read.value can return an int or a str. Convert it to str |
||||||
|
value_as_str = read.original_value |
||||||
|
line_of_code = str(node.expression) |
||||||
|
if '00000' in value_as_str: |
||||||
|
# Info to be printed |
||||||
|
ret.append(node) |
||||||
|
return ret |
||||||
|
|
||||||
|
def _detect(self): |
||||||
|
results = [] |
||||||
|
|
||||||
|
# iterate over all contracts |
||||||
|
for contract in self.slither.contracts_derived: |
||||||
|
# iterate over all functions |
||||||
|
for f in contract.functions: |
||||||
|
# iterate over all the nodes |
||||||
|
ret = self._detect_too_many_digits(f) |
||||||
|
if ret: |
||||||
|
info = '{}.{} ({}) uses literals with too many digits:'.format(f.contract.name, |
||||||
|
f.name, |
||||||
|
f.source_mapping_str) |
||||||
|
for node in ret: |
||||||
|
info += '\n\t- {}'.format(node.expression) |
||||||
|
info += '\n\tUse the proper denomination (ether-unit, time-unit,' |
||||||
|
info += 'or the scientific notation\n' |
||||||
|
|
||||||
|
# Add the result in result |
||||||
|
json = self.generate_json_result(info) |
||||||
|
self.add_nodes_to_json(ret, json) |
||||||
|
results.append(json) |
||||||
|
|
||||||
|
return results |
@ -0,0 +1,31 @@ |
|||||||
|
from slither.core.solidity_types import (ArrayType, MappingType, ElementaryType) |
||||||
|
|
||||||
|
def _add_mapping_parameter(t, l): |
||||||
|
while isinstance(t, MappingType): |
||||||
|
l.append(t.type_from) |
||||||
|
t = t.type_to |
||||||
|
_add_array_parameter(t, l) |
||||||
|
|
||||||
|
def _add_array_parameter(t, l): |
||||||
|
while isinstance(t, ArrayType): |
||||||
|
l.append(ElementaryType('uint256')) |
||||||
|
t = t.type |
||||||
|
|
||||||
|
def export_nested_types_from_variable(variable): |
||||||
|
""" |
||||||
|
Export the list of nested types (mapping/array) |
||||||
|
:param variable: |
||||||
|
:return: list(Type) |
||||||
|
""" |
||||||
|
l = [] |
||||||
|
if isinstance(variable.type, MappingType): |
||||||
|
t = variable.type |
||||||
|
_add_mapping_parameter(t, l) |
||||||
|
|
||||||
|
if isinstance(variable.type, ArrayType): |
||||||
|
v = variable |
||||||
|
_add_array_parameter(v.type, l) |
||||||
|
|
||||||
|
return l |
||||||
|
|
||||||
|
|
@ -0,0 +1,442 @@ |
|||||||
|
[ |
||||||
|
{ |
||||||
|
"check": "erc721-interface", |
||||||
|
"impact": "Medium", |
||||||
|
"confidence": "High", |
||||||
|
"description": "Token (tests/incorrect_erc721_interface.sol#6-16) has incorrect ERC721 function interface(s):\n\t-supportsInterface (tests/incorrect_erc721_interface.sol#4)\n\t-balanceOf (tests/incorrect_erc721_interface.sol#7)\n\t-ownerOf (tests/incorrect_erc721_interface.sol#8)\n\t-safeTransferFrom (tests/incorrect_erc721_interface.sol#9)\n\t-safeTransferFrom (tests/incorrect_erc721_interface.sol#10)\n\t-transferFrom (tests/incorrect_erc721_interface.sol#11)\n\t-approve (tests/incorrect_erc721_interface.sol#12)\n\t-setApprovalForAll (tests/incorrect_erc721_interface.sol#13)\n\t-getApproved (tests/incorrect_erc721_interface.sol#14)\n\t-isApprovedForAll (tests/incorrect_erc721_interface.sol#15)\n", |
||||||
|
"elements": [ |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "approve", |
||||||
|
"source_mapping": { |
||||||
|
"start": 549, |
||||||
|
"length": 78, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
12 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 83 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "balanceOf", |
||||||
|
"source_mapping": { |
||||||
|
"start": 140, |
||||||
|
"length": 44, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
7 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 49 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "getApproved", |
||||||
|
"source_mapping": { |
||||||
|
"start": 723, |
||||||
|
"length": 48, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
14 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 53 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "isApprovedForAll", |
||||||
|
"source_mapping": { |
||||||
|
"start": 776, |
||||||
|
"length": 70, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
15 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 75 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "ownerOf", |
||||||
|
"source_mapping": { |
||||||
|
"start": 189, |
||||||
|
"length": 44, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
8 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 49 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "safeTransferFrom", |
||||||
|
"source_mapping": { |
||||||
|
"start": 238, |
||||||
|
"length": 108, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
9 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 113 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "safeTransferFrom", |
||||||
|
"source_mapping": { |
||||||
|
"start": 351, |
||||||
|
"length": 96, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
10 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 101 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "setApprovalForAll", |
||||||
|
"source_mapping": { |
||||||
|
"start": 632, |
||||||
|
"length": 86, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
13 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 91 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "supportsInterface", |
||||||
|
"source_mapping": { |
||||||
|
"start": 50, |
||||||
|
"length": 56, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
4 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 61 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "IERC165", |
||||||
|
"source_mapping": { |
||||||
|
"start": 26, |
||||||
|
"length": 82, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
3, |
||||||
|
4, |
||||||
|
5 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "function", |
||||||
|
"name": "transferFrom", |
||||||
|
"source_mapping": { |
||||||
|
"start": 452, |
||||||
|
"length": 92, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
11 |
||||||
|
], |
||||||
|
"starting_column": 5, |
||||||
|
"ending_column": 97 |
||||||
|
}, |
||||||
|
"contract": { |
||||||
|
"type": "contract", |
||||||
|
"name": "Token", |
||||||
|
"source_mapping": { |
||||||
|
"start": 109, |
||||||
|
"length": 739, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_relative": "tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/incorrect_erc721_interface.sol", |
||||||
|
"filename_short": "tests/incorrect_erc721_interface.sol", |
||||||
|
"lines": [ |
||||||
|
6, |
||||||
|
7, |
||||||
|
8, |
||||||
|
9, |
||||||
|
10, |
||||||
|
11, |
||||||
|
12, |
||||||
|
13, |
||||||
|
14, |
||||||
|
15, |
||||||
|
16 |
||||||
|
], |
||||||
|
"starting_column": 1, |
||||||
|
"ending_column": 2 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
] |
@ -0,0 +1,196 @@ |
|||||||
|
[ |
||||||
|
{ |
||||||
|
"check": "too-many-digits", |
||||||
|
"impact": "Informational", |
||||||
|
"confidence": "Medium", |
||||||
|
"description": "C.f (tests/too_many_digits.sol#9-15) uses literals with too many digits:\n\t- x1 = 0x000001\n\t- x2 = 0x0000000000001\n\t- x3 = 1000000000000000000\n\t- x4 = 100000\n\tUse the proper denomination (ether-unit, time-unit,or the scientific notation\n", |
||||||
|
"elements": [ |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x1 = 0x000001", |
||||||
|
"source_mapping": { |
||||||
|
"start": 206, |
||||||
|
"length": 18, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
10 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 27 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 0x0000000000001", |
||||||
|
"source_mapping": { |
||||||
|
"start": 234, |
||||||
|
"length": 25, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
11 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 34 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x3 = 1000000000000000000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 269, |
||||||
|
"length": 29, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
12 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 38 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x4 = 100000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 308, |
||||||
|
"length": 16, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
13 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 25 |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
{ |
||||||
|
"check": "too-many-digits", |
||||||
|
"impact": "Informational", |
||||||
|
"confidence": "Medium", |
||||||
|
"description": "C.h (tests/too_many_digits.sol#20-24) uses literals with too many digits:\n\t- x2 = 100000\n\tUse the proper denomination (ether-unit, time-unit,or the scientific notation\n", |
||||||
|
"elements": [ |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 100000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 509, |
||||||
|
"length": 16, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
22 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 25 |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
{ |
||||||
|
"check": "too-many-digits", |
||||||
|
"impact": "Informational", |
||||||
|
"confidence": "Medium", |
||||||
|
"description": "C.i (tests/too_many_digits.sol#29-33) uses literals with too many digits:\n\t- x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000\n\t- x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000\n\t- x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000\n\t- x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000\n\t- x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000\n\tUse the proper denomination (ether-unit, time-unit,or the scientific notation\n", |
||||||
|
"elements": [ |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 749, |
||||||
|
"length": 67, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
31 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 76 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 749, |
||||||
|
"length": 67, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
31 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 76 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 749, |
||||||
|
"length": 67, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
31 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 76 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 749, |
||||||
|
"length": 67, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
31 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 76 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "expression", |
||||||
|
"expression": "x2 = 1000000000000 + 10000000000000 + 100000000000000 + 1000000000000000 + 10000000000000000", |
||||||
|
"source_mapping": { |
||||||
|
"start": 749, |
||||||
|
"length": 67, |
||||||
|
"filename_used": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_relative": "tests/too_many_digits.sol", |
||||||
|
"filename_absolute": "/home/travis/build/crytic/slither/tests/too_many_digits.sol", |
||||||
|
"filename_short": "tests/too_many_digits.sol", |
||||||
|
"lines": [ |
||||||
|
31 |
||||||
|
], |
||||||
|
"starting_column": 9, |
||||||
|
"ending_column": 76 |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
] |
@ -1,7 +1,10 @@ |
|||||||
pragma solidity ^0.4.24; |
pragma solidity ^0.4.24; |
||||||
|
|
||||||
contract Token{ |
contract Token{ |
||||||
|
|
||||||
function transfer(address to, uint value) external; |
function transfer(address to, uint value) external; |
||||||
|
function approve(address spender, uint value) external; |
||||||
|
function transferFrom(address from, address to, uint value) external; |
||||||
|
function totalSupply() external; |
||||||
|
function balanceOf(address who) external; |
||||||
|
function allowance(address owner, address spender) external; |
||||||
} |
} |
||||||
|
@ -0,0 +1,16 @@ |
|||||||
|
pragma solidity ^0.4.24; |
||||||
|
|
||||||
|
interface IERC165 { |
||||||
|
function supportsInterface(bytes4 interfaceID) external; |
||||||
|
} |
||||||
|
contract Token is IERC165{ |
||||||
|
function balanceOf(address _owner) external; |
||||||
|
function ownerOf(uint256 _tokenId) external; |
||||||
|
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external returns (bool); |
||||||
|
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external returns (bool); |
||||||
|
function transferFrom(address _from, address _to, uint256 _tokenId) external returns (bool); |
||||||
|
function approve(address _approved, uint256 _tokenId) external returns (bool); |
||||||
|
function setApprovalForAll(address _operator, bool _approved) external returns (bool); |
||||||
|
function getApproved(uint256 _tokenId) external; |
||||||
|
function isApprovedForAll(address _owner, address _operator) external; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
pragma solidity ^0.5.1; |
||||||
|
|
||||||
|
contract C { |
||||||
|
uint balance; |
||||||
|
|
||||||
|
/** |
||||||
|
* @dev Variables are not Ok - using too many digits in place of the Ether denomination. |
||||||
|
*/ |
||||||
|
function f() external { |
||||||
|
uint x1 = 0x000001; |
||||||
|
uint x2 = 0x0000000000001; |
||||||
|
uint x3 = 1000000000000000000; |
||||||
|
uint x4 = 100000; |
||||||
|
balance += x1 + x2 + x3 + x4; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @dev Variables are Ok - not using too many digits. |
||||||
|
*/ |
||||||
|
function h() external { |
||||||
|
uint x1 = 1000; |
||||||
|
uint x2 = 100000; |
||||||
|
balance += x1 + x2 + 100; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @dev Variables are Ok - Using Ether denominations. |
||||||
|
*/ |
||||||
|
function i() external { |
||||||
|
uint x1 = 1 wei + 10 wei + 100 wei + 1000 wei + 10000 wei; |
||||||
|
uint x2 = 1 szabo + 10 szabo + 100 szabo + 1000 szabo + 10000 szabo; |
||||||
|
balance += x1 + x2; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue