mirror of https://github.com/crytic/slither
commit
0dbcae7692
@ -0,0 +1,48 @@ |
|||||||
|
--- |
||||||
|
name: Lint Code Base |
||||||
|
|
||||||
|
defaults: |
||||||
|
run: |
||||||
|
# To load bashrc |
||||||
|
shell: bash -ieo pipefail {0} |
||||||
|
|
||||||
|
on: |
||||||
|
pull_request: |
||||||
|
branches: [master, dev] |
||||||
|
schedule: |
||||||
|
# run CI every day even if no PRs/merges occur |
||||||
|
- cron: '0 12 * * *' |
||||||
|
|
||||||
|
jobs: |
||||||
|
build: |
||||||
|
name: Lint Code Base |
||||||
|
runs-on: ubuntu-latest |
||||||
|
|
||||||
|
steps: |
||||||
|
- name: Checkout Code |
||||||
|
uses: actions/checkout@v2 |
||||||
|
|
||||||
|
- name: Set up Python 3.6 |
||||||
|
uses: actions/setup-python@v2 |
||||||
|
with: |
||||||
|
python-version: 3.6 |
||||||
|
|
||||||
|
- name: Install dependencies |
||||||
|
run: | |
||||||
|
pip install . |
||||||
|
pip install deepdiff numpy |
||||||
|
|
||||||
|
mkdir -p .github/linters |
||||||
|
cp pyproject.toml .github/linters |
||||||
|
|
||||||
|
- name: Black |
||||||
|
uses: docker://github/super-linter:v3 |
||||||
|
if: always() |
||||||
|
env: |
||||||
|
# run linter on everything to catch preexisting problems |
||||||
|
VALIDATE_ALL_CODEBASE: true |
||||||
|
DEFAULT_BRANCH: master |
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
||||||
|
# Run only black |
||||||
|
VALIDATE_PYTHON_BLACK: true |
||||||
|
PYTHON_BLACK_CONFIG_FILE: pyproject.toml |
@ -0,0 +1,49 @@ |
|||||||
|
--- |
||||||
|
name: Lint Code Base |
||||||
|
|
||||||
|
defaults: |
||||||
|
run: |
||||||
|
# To load bashrc |
||||||
|
shell: bash -ieo pipefail {0} |
||||||
|
|
||||||
|
on: |
||||||
|
pull_request: |
||||||
|
branches: [master, dev] |
||||||
|
schedule: |
||||||
|
# run CI every day even if no PRs/merges occur |
||||||
|
- cron: '0 12 * * *' |
||||||
|
|
||||||
|
jobs: |
||||||
|
build: |
||||||
|
name: Lint Code Base |
||||||
|
runs-on: ubuntu-latest |
||||||
|
|
||||||
|
steps: |
||||||
|
- name: Checkout Code |
||||||
|
uses: actions/checkout@v2 |
||||||
|
|
||||||
|
- name: Set up Python 3.6 |
||||||
|
uses: actions/setup-python@v2 |
||||||
|
with: |
||||||
|
python-version: 3.6 |
||||||
|
|
||||||
|
- name: Install dependencies |
||||||
|
run: | |
||||||
|
pip install . |
||||||
|
pip install deepdiff numpy |
||||||
|
|
||||||
|
mkdir -p .github/linters |
||||||
|
cp pyproject.toml .github/linters |
||||||
|
|
||||||
|
- name: Pylint |
||||||
|
uses: docker://github/super-linter:v3 |
||||||
|
if: always() |
||||||
|
env: |
||||||
|
# run linter on everything to catch preexisting problems |
||||||
|
VALIDATE_ALL_CODEBASE: true |
||||||
|
DEFAULT_BRANCH: master |
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
||||||
|
# Run only pylint |
||||||
|
VALIDATE_PYTHON: true |
||||||
|
VALIDATE_PYTHON_PYLINT: true |
||||||
|
PYTHON_PYLINT_CONFIG_FILE: pyproject.toml |
@ -0,0 +1,61 @@ |
|||||||
|
pragma solidity ^0.4.0; |
||||||
|
|
||||||
|
contract ReentrancyBenign { |
||||||
|
uint8 anotherVariableToChange; |
||||||
|
uint8 counter = 0; |
||||||
|
|
||||||
|
function bad0() public { |
||||||
|
if (!(msg.sender.call())) { |
||||||
|
revert(); |
||||||
|
} |
||||||
|
counter += 1; |
||||||
|
} |
||||||
|
|
||||||
|
function bad1(address target) public { |
||||||
|
(bool success) = target.call(); |
||||||
|
require(success); |
||||||
|
counter += 1; |
||||||
|
} |
||||||
|
|
||||||
|
function bad2(address target) public { |
||||||
|
(bool success) = target.call(); |
||||||
|
if (success) { |
||||||
|
address(target).call.value(1000)(); |
||||||
|
counter += 1; |
||||||
|
} |
||||||
|
else { |
||||||
|
revert(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function bad3(address target) public { |
||||||
|
externalCaller(target); |
||||||
|
varChanger(); |
||||||
|
ethSender(target); |
||||||
|
} |
||||||
|
|
||||||
|
function bad4(address target) public { |
||||||
|
externalCaller(target); |
||||||
|
ethSender(address(0)); |
||||||
|
varChanger(); |
||||||
|
address(target).call.value(2)(); |
||||||
|
} |
||||||
|
|
||||||
|
function bad5(address target) public { |
||||||
|
ethSender(address(0)); |
||||||
|
varChanger(); |
||||||
|
ethSender(address(0)); |
||||||
|
} |
||||||
|
|
||||||
|
function externalCaller(address target) private { |
||||||
|
address(target).call(); |
||||||
|
} |
||||||
|
|
||||||
|
function ethSender(address target) private { |
||||||
|
address(target).call.value(1)(); |
||||||
|
} |
||||||
|
|
||||||
|
function varChanger() private { |
||||||
|
anotherVariableToChange++; |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,261 @@ |
|||||||
|
""" |
||||||
|
tests for `slither.core.declarations.Function`. |
||||||
|
tests that `tests/test_function.sol` gets translated into correct |
||||||
|
`slither.core.declarations.Function` objects or its subclasses |
||||||
|
and that these objects behave correctly. |
||||||
|
""" |
||||||
|
|
||||||
|
from slither import Slither |
||||||
|
from slither.core.declarations.function import FunctionType |
||||||
|
from slither.core.solidity_types.elementary_type import ElementaryType |
||||||
|
|
||||||
|
|
||||||
|
def test_functions(): |
||||||
|
# pylint: disable=too-many-statements |
||||||
|
slither = Slither("tests/test_function.sol") |
||||||
|
functions = slither.contracts_as_dict["TestFunction"].available_functions_as_dict() |
||||||
|
|
||||||
|
f = functions["external_payable(uint256)"] |
||||||
|
assert f.name == "external_payable" |
||||||
|
assert f.full_name == "external_payable(uint256)" |
||||||
|
assert f.canonical_name == "TestFunction.external_payable(uint256)" |
||||||
|
assert f.solidity_signature == "external_payable(uint256)" |
||||||
|
assert f.signature_str == "external_payable(uint256) returns(uint256)" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is True |
||||||
|
assert f.visibility == "external" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters[0].name == "_a" |
||||||
|
assert f.parameters[0].type == ElementaryType("uint256") |
||||||
|
assert f.return_type[0] == ElementaryType("uint256") |
||||||
|
|
||||||
|
f = functions["public_reenter()"] |
||||||
|
assert f.name == "public_reenter" |
||||||
|
assert f.full_name == "public_reenter()" |
||||||
|
assert f.canonical_name == "TestFunction.public_reenter()" |
||||||
|
assert f.solidity_signature == "public_reenter()" |
||||||
|
assert f.signature_str == "public_reenter() returns()" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is True |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is False |
||||||
|
assert f.visibility == "public" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters == [] |
||||||
|
assert f.return_type is None |
||||||
|
|
||||||
|
f = functions["public_payable_reenter_send(bool)"] |
||||||
|
assert f.name == "public_payable_reenter_send" |
||||||
|
assert f.full_name == "public_payable_reenter_send(bool)" |
||||||
|
assert f.canonical_name == "TestFunction.public_payable_reenter_send(bool)" |
||||||
|
assert f.solidity_signature == "public_payable_reenter_send(bool)" |
||||||
|
assert f.signature_str == "public_payable_reenter_send(bool) returns()" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is True |
||||||
|
assert f.can_send_eth() is True |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is True |
||||||
|
assert f.visibility == "public" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters[0].name == "_b" |
||||||
|
assert f.parameters[0].type == ElementaryType("bool") |
||||||
|
assert f.return_type is None |
||||||
|
|
||||||
|
f = functions["external_send(uint8)"] |
||||||
|
assert f.name == "external_send" |
||||||
|
assert f.full_name == "external_send(uint8)" |
||||||
|
assert f.canonical_name == "TestFunction.external_send(uint8)" |
||||||
|
assert f.solidity_signature == "external_send(uint8)" |
||||||
|
assert f.signature_str == "external_send(uint8) returns()" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is True |
||||||
|
assert f.can_send_eth() is True |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is False |
||||||
|
assert f.visibility == "external" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters[0].name == "_c" |
||||||
|
assert f.parameters[0].type == ElementaryType("uint8") |
||||||
|
assert f.return_type is None |
||||||
|
|
||||||
|
f = functions["internal_assembly(bytes)"] |
||||||
|
assert f.name == "internal_assembly" |
||||||
|
assert f.full_name == "internal_assembly(bytes)" |
||||||
|
assert f.canonical_name == "TestFunction.internal_assembly(bytes)" |
||||||
|
assert f.solidity_signature == "internal_assembly(bytes)" |
||||||
|
assert f.signature_str == "internal_assembly(bytes) returns(uint256)" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is True |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is False |
||||||
|
assert f.visibility == "internal" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters[0].name == "_d" |
||||||
|
assert f.parameters[0].type == ElementaryType("bytes") |
||||||
|
assert f.return_type[0] == ElementaryType("uint256") |
||||||
|
|
||||||
|
f = functions["fallback()"] |
||||||
|
assert f.name == "fallback" |
||||||
|
assert f.full_name == "fallback()" |
||||||
|
assert f.canonical_name == "TestFunction.fallback()" |
||||||
|
assert f.solidity_signature == "fallback()" |
||||||
|
assert f.signature_str == "fallback() returns()" |
||||||
|
assert f.function_type == FunctionType.FALLBACK |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is True |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is False |
||||||
|
assert f.visibility == "external" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is True |
||||||
|
assert f.parameters == [] |
||||||
|
assert f.return_type is None |
||||||
|
|
||||||
|
f = functions["receive()"] |
||||||
|
assert f.name == "receive" |
||||||
|
assert f.full_name == "receive()" |
||||||
|
assert f.canonical_name == "TestFunction.receive()" |
||||||
|
assert f.solidity_signature == "receive()" |
||||||
|
assert f.signature_str == "receive() returns()" |
||||||
|
assert f.function_type == FunctionType.RECEIVE |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is True |
||||||
|
assert f.payable is True |
||||||
|
assert f.visibility == "external" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is True |
||||||
|
assert f.parameters == [] |
||||||
|
assert f.return_type is None |
||||||
|
|
||||||
|
f = functions["constructor(address)"] |
||||||
|
assert f.name == "constructor" |
||||||
|
assert f.full_name == "constructor(address)" |
||||||
|
assert f.canonical_name == "TestFunction.constructor(address)" |
||||||
|
assert f.solidity_signature == "constructor(address)" |
||||||
|
assert f.signature_str == "constructor(address) returns()" |
||||||
|
assert f.function_type == FunctionType.CONSTRUCTOR |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is True |
||||||
|
assert f.visibility == "public" |
||||||
|
assert f.view is False |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is True |
||||||
|
assert f.parameters[0].name == "_e" |
||||||
|
assert f.parameters[0].type == ElementaryType("address") |
||||||
|
assert f.return_type is None |
||||||
|
|
||||||
|
f = functions["private_view()"] |
||||||
|
assert f.name == "private_view" |
||||||
|
assert f.full_name == "private_view()" |
||||||
|
assert f.canonical_name == "TestFunction.private_view()" |
||||||
|
assert f.solidity_signature == "private_view()" |
||||||
|
assert f.signature_str == "private_view() returns(bool)" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is False |
||||||
|
assert f.visibility == "private" |
||||||
|
assert f.view is True |
||||||
|
assert f.pure is False |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters == [] |
||||||
|
assert f.return_type[0] == ElementaryType("bool") |
||||||
|
|
||||||
|
f = functions["public_pure()"] |
||||||
|
assert f.name == "public_pure" |
||||||
|
assert f.full_name == "public_pure()" |
||||||
|
assert f.canonical_name == "TestFunction.public_pure()" |
||||||
|
assert f.solidity_signature == "public_pure()" |
||||||
|
assert f.signature_str == "public_pure() returns(bool)" |
||||||
|
assert f.function_type == FunctionType.NORMAL |
||||||
|
assert f.contains_assembly is False |
||||||
|
assert f.can_reenter() is False |
||||||
|
assert f.can_send_eth() is False |
||||||
|
assert f.is_constructor is False |
||||||
|
assert f.is_fallback is False |
||||||
|
assert f.is_receive is False |
||||||
|
assert f.payable is False |
||||||
|
assert f.visibility == "public" |
||||||
|
assert f.view is True |
||||||
|
assert f.pure is True |
||||||
|
assert f.is_implemented is True |
||||||
|
assert f.is_empty is False |
||||||
|
assert f.parameters == [] |
||||||
|
assert f.return_type[0] == ElementaryType("bool") |
||||||
|
|
||||||
|
|
||||||
|
def test_function_can_send_eth(): |
||||||
|
slither = Slither("tests/test_function.sol") |
||||||
|
functions = slither.contracts_as_dict["TestFunctionCanSendEth"].available_functions_as_dict() |
||||||
|
|
||||||
|
assert functions["send_direct()"].can_send_eth() is True |
||||||
|
assert functions["transfer_direct()"].can_send_eth() is True |
||||||
|
assert functions["call_direct()"].can_send_eth() is True |
||||||
|
assert functions["highlevel_call_direct()"].can_send_eth() is True |
||||||
|
|
||||||
|
assert functions["send_via_internal()"].can_send_eth() is True |
||||||
|
assert functions["transfer_via_internal()"].can_send_eth() is True |
||||||
|
assert functions["call_via_internal()"].can_send_eth() is True |
||||||
|
assert functions["highlevel_call_via_internal()"].can_send_eth() is True |
||||||
|
|
||||||
|
assert functions["send_via_external()"].can_send_eth() is False |
||||||
|
assert functions["transfer_via_external()"].can_send_eth() is False |
||||||
|
assert functions["call_via_external()"].can_send_eth() is False |
||||||
|
assert functions["highlevel_call_via_external()"].can_send_eth() is False |
@ -0,0 +1,129 @@ |
|||||||
|
pragma solidity ^0.6.12; |
||||||
|
|
||||||
|
// solidity source used by tests/test_function.py. |
||||||
|
// tests/test_function.py tests that the functions below get translated into correct |
||||||
|
// `slither.core.declarations.Function` objects or its subclasses |
||||||
|
// and that these objects behave correctly. |
||||||
|
|
||||||
|
contract TestFunction { |
||||||
|
bool entered = false; |
||||||
|
|
||||||
|
function external_payable(uint _a) external payable returns (uint) { |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
function public_reenter() public { |
||||||
|
msg.sender.call(""); |
||||||
|
} |
||||||
|
|
||||||
|
function public_payable_reenter_send(bool _b) public payable { |
||||||
|
msg.sender.call{value: 1}(""); |
||||||
|
} |
||||||
|
|
||||||
|
function external_send(uint8 _c) external { |
||||||
|
require(!entered); |
||||||
|
entered = true; |
||||||
|
msg.sender.call{value: 1}(""); |
||||||
|
} |
||||||
|
|
||||||
|
function internal_assembly(bytes calldata _d) internal returns (uint) { |
||||||
|
uint256 chain; |
||||||
|
assembly { |
||||||
|
chain := chainid() |
||||||
|
} |
||||||
|
return chain; |
||||||
|
} |
||||||
|
|
||||||
|
fallback() external { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
receive() external payable { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
constructor(address payable _e) public payable { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function private_view() private view returns (bool) { |
||||||
|
return entered; |
||||||
|
} |
||||||
|
|
||||||
|
function public_pure() public pure returns (bool) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
contract TestFunctionCanSendEth { |
||||||
|
|
||||||
|
function send_direct() internal { |
||||||
|
address(1).send(1); |
||||||
|
} |
||||||
|
|
||||||
|
function transfer_direct() internal { |
||||||
|
address(1).transfer(1); |
||||||
|
} |
||||||
|
|
||||||
|
function call_direct() internal { |
||||||
|
address(1).call{value: 1}(""); |
||||||
|
} |
||||||
|
|
||||||
|
function highlevel_call_direct() internal { |
||||||
|
TestFunctionCanSendEthOther(address(5)).i_am_payable{value: 1}(); |
||||||
|
} |
||||||
|
|
||||||
|
function send_via_internal() public { |
||||||
|
send_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function transfer_via_internal() public { |
||||||
|
transfer_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function call_via_internal() public { |
||||||
|
call_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function highlevel_call_via_internal() public { |
||||||
|
highlevel_call_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function send_via_external() public { |
||||||
|
TestFunctionCanSendEthOther(address(5)).send_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function transfer_via_external() public { |
||||||
|
TestFunctionCanSendEthOther(address(5)).transfer_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function call_via_external() public { |
||||||
|
TestFunctionCanSendEthOther(address(5)).call_direct(); |
||||||
|
} |
||||||
|
|
||||||
|
function highlevel_call_via_external() public { |
||||||
|
TestFunctionCanSendEthOther(address(5)).highlevel_call_direct(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
contract TestFunctionCanSendEthOther { |
||||||
|
function i_am_payable() external payable { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function send_direct() external { |
||||||
|
address(1).send(1); |
||||||
|
} |
||||||
|
|
||||||
|
function transfer_direct() external { |
||||||
|
address(1).transfer(1); |
||||||
|
} |
||||||
|
|
||||||
|
function call_direct() external { |
||||||
|
address(1).call{value: 1}(""); |
||||||
|
} |
||||||
|
|
||||||
|
function highlevel_call_direct() external { |
||||||
|
TestFunctionCanSendEthOther(address(5)).i_am_payable{value: 1}(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
# Slither Trophies |
||||||
|
|
||||||
|
The following lists security vulnerabilities that were found by Slither. |
||||||
|
If you found a security vulnerability using Slither, |
||||||
|
please submit a PR with the relevant information. |
||||||
|
|
||||||
|
| Project | Vulnerability | Date | |
||||||
|
|--|--|--| |
||||||
|
[Parity](https://github.com/trailofbits/publications/blob/master/reviews/parity.pdf) | Incorrect constructor name | July 2018 |
||||||
|
[Parity](https://github.com/trailofbits/publications/blob/master/reviews/parity.pdf) | Deletion of a mapping with structure | July 2018 |
||||||
|
[Parity](https://github.com/trailofbits/publications/blob/master/reviews/parity.pdf) | Uninitialized state variables | July 2018 |
||||||
|
[Basis](https://github.com/trailofbits/publications/blob/master/reviews/basis.pdf) | Missing return value check | Oct 2018 |
||||||
|
[Origin protocol](https://github.com/trailofbits/publications/blob/master/reviews/origin.pdf) | Reentrancy | Nov 2018 |
||||||
|
[Numerai](https://github.com/trailofbits/publications/blob/master/reviews/numerai.pdf) | Deletion of a mapping with structure | Jul 2019 |
||||||
|
[Numerai](https://github.com/trailofbits/publications/blob/master/reviews/numerai.pdf) | Missing return value | Jul 2019 |
||||||
|
[Flexa](https://github.com/trailofbits/publications/blob/master/reviews/Flexa.pdf) | Reentrancy (events out of order) | Sep 2019 |
||||||
|
[0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) | Missing return value | Oct 2019 |
||||||
|
[Token mint](https://certificate.quantstamp.com/full/token-mint) | Reentrancies | Dec 2019 |
||||||
|
[Airswap](https://certificate.quantstamp.com/full/airswap) | Missing return value check | Feb 2020 |
||||||
|
[Stake Technologies Lockdrop](https://certificate.quantstamp.com/full/stake-technologies-lockdrop) | Dangerous strict equality | Mar 2020 |
||||||
|
[E&Y’s Nightfall](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | Missing return value | May 2020 |
||||||
|
[E&Y’s Nightfall](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | Empty return value | May 2020 |
||||||
|
[DefiStrategies](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | Modifier can return the default value | May 2020 |
||||||
|
[DefiStrategies](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | Dangerous strict equality allows the contract to be trapped | May 2020 |
||||||
|
[DOSnetwork](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | Abi `encodedPacked` collision | May 2020 |
||||||
|
[EthKids](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | `msg.value` is used two times to compute a price | May 2020 |
||||||
|
[HQ20](https://blog.trailofbits.com/2020/05/15/bug-hunting-with-crytic/) | Reentrancy | May 2020 |
||||||
|
[Dloop](https://certificate.quantstamp.com/full/dloop-art-registry-smart-contract) | Dangerous `block.timestamp` usage | Jun 2020 |
||||||
|
[Atomic Loans](https://certificate.quantstamp.com/full/atomic-loans) | Uninitialized state variable | Jul 2020 |
||||||
|
[Atomic Loans](https://certificate.quantstamp.com/full/atomic-loans) | State variable shadowing | Jul 2020 |
||||||
|
[Atomic Loans](https://certificate.quantstamp.com/full/atomic-loans) | Reentrancy | Jul 2020 |
||||||
|
[Amp](https://github.com/trailofbits/publications/blob/master/reviews/amp.pdf) | Duplicate contract name | Aug 2020 |
||||||
|
[PerlinXRewards](https://certificate.quantstamp.com/full/perlin-x-rewards-sol) | Multiple reentrancies | Aug 2020 |
||||||
|
[Linkswap](https://certificate.quantstamp.com/full/linkswap) | Lack of return value check | Nov 2020 |
||||||
|
[Linkswap](https://certificate.quantstamp.com/full/linkswap) | Uninitialized state variable | Nov 2020 |
||||||
|
[Cryptex](https://certificate.quantstamp.com/full/cryptex) | Lack of return value check | Nov 2020 |
||||||
|
[Hermez](https://github.com/trailofbits/publications/blob/master/reviews/hermez.pdf) | Reentrancy | Nov 2020 |
||||||
|
[Unoswap](https://www.unos.finance/wp-content/uploads/2020/11/block-audit.pdf) | Contract locking ethers | Nov 2020 |
||||||
|
[Idle](https://certificate.quantstamp.com/full/idle-finance) | Dangerous divide before multiply operations | Dec 2020 |
||||||
|
[RariCapital](https://certificate.quantstamp.com/full/rari-capital) | Lack of return value check | Dec 2020 |
||||||
|
[RariCapital](https://certificate.quantstamp.com/full/rari-capital) | Uninitialized state variable | Dec 2020 |
||||||
|
[wfil-factory](https://github.com/wfil/wfil-factory/commit/a43c1ddf52cf1191ccf1e71a637df02d78b98cc0) | Reentrancy | Dec 2020 |
||||||
|
[Origin Dollar](https://github.com/trailofbits/publications/blob/master/reviews/OriginDollar.pdf) | Reentrancy | Jan 2021 |
||||||
|
[Origin Dollar](https://github.com/trailofbits/publications/blob/master/reviews/OriginDollar.pdf) | Variable shadowing | Jan 2021 |
||||||
|
[OriginTrait](https://github.com/OriginTrail/starfleet-boarding-contract/commit/6481b12abc3cfd0d782abd0e32eabd103d8f6953) | Reentrancy | Jan 2021 |
Loading…
Reference in new issue