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