mirror of https://github.com/crytic/slither
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
1 year ago
|
from pathlib import Path
|
||
|
|
||
|
from slither import Slither
|
||
|
from slither.slithir.operations.internal_call import InternalCall
|
||
|
from slither.slithir.operations.new_structure import NewStructure
|
||
|
from slither.slithir.variables.constant import Constant
|
||
|
|
||
|
TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data"
|
||
|
ARG_REORDER_TEST_ROOT = Path(TEST_DATA_DIR, "argument_reorder")
|
||
|
|
||
|
|
||
|
def test_struct_constructor_reorder(solc_binary_path) -> None:
|
||
|
solc_path = solc_binary_path("0.8.15")
|
||
|
slither = Slither(
|
||
|
Path(ARG_REORDER_TEST_ROOT, "test_struct_constructor.sol").as_posix(), solc=solc_path
|
||
|
)
|
||
|
|
||
|
operations = slither.contracts[0].functions[0].slithir_operations
|
||
|
constructor_calls = [x for x in operations if isinstance(x, NewStructure)]
|
||
|
assert len(constructor_calls) == 2
|
||
|
|
||
|
# Arguments to first call are 2, 3
|
||
|
assert (
|
||
|
isinstance(constructor_calls[0].arguments[0], Constant)
|
||
|
and constructor_calls[0].arguments[0].value == 2
|
||
|
)
|
||
|
assert (
|
||
|
isinstance(constructor_calls[0].arguments[1], Constant)
|
||
|
and constructor_calls[0].arguments[1].value == 3
|
||
|
)
|
||
|
|
||
|
# Arguments to second call are 5, 4 (note the reversed order)
|
||
|
assert (
|
||
|
isinstance(constructor_calls[1].arguments[0], Constant)
|
||
|
and constructor_calls[1].arguments[0].value == 5
|
||
|
)
|
||
|
assert (
|
||
|
isinstance(constructor_calls[1].arguments[1], Constant)
|
||
|
and constructor_calls[1].arguments[1].value == 4
|
||
|
)
|
||
|
|
||
|
|
||
|
def test_internal_call_reorder(solc_binary_path) -> None:
|
||
|
solc_path = solc_binary_path("0.8.15")
|
||
|
slither = Slither(
|
||
|
Path(ARG_REORDER_TEST_ROOT, "test_internal_call_reorder.sol").as_posix(), solc=solc_path
|
||
|
)
|
||
|
|
||
|
operations = slither.contracts[0].functions[1].slithir_operations
|
||
|
internal_calls = [x for x in operations if isinstance(x, InternalCall)]
|
||
|
assert len(internal_calls) == 1
|
||
|
|
||
|
# Arguments to call are 3, true, 5
|
||
|
assert (
|
||
|
isinstance(internal_calls[0].arguments[0], Constant)
|
||
|
and internal_calls[0].arguments[0].value == 3
|
||
|
)
|
||
|
assert (
|
||
|
isinstance(internal_calls[0].arguments[1], Constant)
|
||
|
and internal_calls[0].arguments[1].value is True
|
||
|
)
|
||
|
assert (
|
||
|
isinstance(internal_calls[0].arguments[2], Constant)
|
||
|
and internal_calls[0].arguments[2].value == 5
|
||
|
)
|