mirror of https://github.com/crytic/slither
Merge pull request #1323 from crytic/dev-functions-sig
Improve generation of solidity signaturepull/1343/head
commit
3a934a997b
@ -0,0 +1,64 @@ |
||||
pragma experimental ABIEncoderV2; |
||||
|
||||
contract Contract{} |
||||
|
||||
contract C{ |
||||
|
||||
mapping(uint => address)[] public arrayOfMappings; |
||||
|
||||
mapping(uint => address[]) public normalMappingArrayField; |
||||
|
||||
enum State{a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100,a101,a102,a103,a104,a105,a106,a107,a108,a109,a110,a111,a112,a113,a114,a115,a116,a117,a118,a119,a120,a121,a122,a123,a124,a125,a126,a127,a128,a129,a130,a131,a132,a133,a134,a135,a136,a137,a138,a139,a140,a141,a142,a143,a144,a145,a146,a147,a148,a149,a150,a151,a152,a153,a154,a155,a156,a157,a158,a159,a160,a161,a162,a163,a164,a165,a166,a167,a168,a169,a170,a171,a172,a173,a174,a175,a176,a177,a178,a179,a180,a181,a182,a183,a184,a185,a186,a187,a188,a189,a190,a191,a192,a193,a194,a195,a196,a197,a198,a199,a200,a201,a202,a203,a204,a205,a206,a207,a208,a209,a210,a211,a212,a213,a214,a215,a216,a217,a218,a219,a220,a221,a222,a223,a224,a225,a226,a227,a228,a229,a230,a231,a232,a233,a234,a235,a236,a237,a238,a239,a240,a241,a242,a243,a244,a245,a246,a247,a248,a249,a250,a251,a252,a253,a254,a255,a256} |
||||
mapping(State => uint) public stateMap; |
||||
|
||||
mapping(Contract => uint) public contractMap; |
||||
|
||||
uint[][] public multiDimensionalArray; |
||||
|
||||
struct Simple { |
||||
uint a; |
||||
uint b; |
||||
mapping(uint => uint) c; |
||||
uint[] d; |
||||
function(uint) external returns (uint) e; |
||||
} |
||||
|
||||
Simple public simple; |
||||
|
||||
struct Inner { |
||||
uint a; |
||||
uint b; |
||||
} |
||||
|
||||
struct Outer { |
||||
Inner inner; |
||||
uint c; |
||||
} |
||||
|
||||
Outer public outer; |
||||
|
||||
|
||||
struct A { |
||||
Inner inner; |
||||
uint a; |
||||
} |
||||
struct B { |
||||
uint a; |
||||
Inner inner; |
||||
} |
||||
|
||||
A public a; |
||||
A[] public a_array; |
||||
mapping(address => B[]) public b_mapping_of_array; |
||||
|
||||
function function_with_struct(A memory a) public{} |
||||
|
||||
function function_with_array(A[] memory array, B memory b) public {} |
||||
|
||||
struct AnotherStruct{ |
||||
B b; |
||||
A[] a; |
||||
} |
||||
mapping(address => AnotherStruct[][]) public mapping_of_double_array_of_struct; |
||||
} |
||||
|
@ -0,0 +1,60 @@ |
||||
from solc_select import solc_select |
||||
from slither import Slither |
||||
|
||||
# % solc functions_ids.sol --hashes |
||||
# ======= functions_ids.sol:C ======= |
||||
# Function signatures: |
||||
# 0dbe671f: a() |
||||
# 4a1f689d: a_array(uint256) |
||||
# 98fc2aa5: arrayOfMappings(uint256,uint256) |
||||
# 4ea7a557: b_mapping_of_array(address,uint256) |
||||
# 3c0af344: contractMap(address) |
||||
# 20969954: function_with_array(((uint256,uint256),uint256)[],(uint256,(uint256,uint256))) |
||||
# 1c039831: function_with_struct(((uint256,uint256),uint256)) |
||||
# 37e66bae: mapping_of_double_array_of_struct(address,uint256,uint256) |
||||
# f29872a8: multiDimensionalArray(uint256,uint256) |
||||
# 9539e3c8: normalMappingArrayField(uint256,uint256) |
||||
# 87c3dbb6: outer() |
||||
# df201a46: simple() |
||||
# 5a20851f: stateMap(uint16) |
||||
|
||||
# {"contracts":{"functions_ids.sol:C":{"hashes":{"a()":"0dbe671f","a_array(uint256)":"4a1f689d","arrayOfMappings(uint256,uint256)":"98fc2aa5","b_mapping_of_array(address,uint256)":"4ea7a557","contractMap(address)":"3c0af344","function_with_array(((uint256,uint256),uint256)[],(uint256,(uint256,uint256)))":"20969954","function_with_struct(((uint256,uint256),uint256))":"1c039831","mapping_of_double_array_of_struct(address,uint256,uint256)":"37e66bae","multiDimensionalArray(uint256,uint256)":"f29872a8","normalMappingArrayField(uint256,uint256)":"9539e3c8","outer()":"87c3dbb6","simple()":"df201a46","stateMap(uint16)":"5a20851f"}},"functions_ids.sol:Contract":{"hashes":{}}},"version":"0.7.0+commit.9e61f92b.Darwin.appleclang"} |
||||
from slither.utils.function import get_function_id |
||||
|
||||
signatures = { |
||||
"a()": "0dbe671f", |
||||
"a_array(uint256)": "4a1f689d", |
||||
"arrayOfMappings(uint256,uint256)": "98fc2aa5", |
||||
"b_mapping_of_array(address,uint256)": "4ea7a557", |
||||
"contractMap(address)": "3c0af344", |
||||
"function_with_array(((uint256,uint256),uint256)[],(uint256,(uint256,uint256)))": "20969954", |
||||
"function_with_struct(((uint256,uint256),uint256))": "1c039831", |
||||
"mapping_of_double_array_of_struct(address,uint256,uint256)": "37e66bae", |
||||
"multiDimensionalArray(uint256,uint256)": "f29872a8", |
||||
"normalMappingArrayField(uint256,uint256)": "9539e3c8", |
||||
"outer()": "87c3dbb6", |
||||
"simple()": "df201a46", |
||||
"stateMap(uint16)": "5a20851f", |
||||
} |
||||
|
||||
|
||||
def test_functions_ids() -> None: |
||||
solc_select.switch_global_version("0.7.0", always_install=True) |
||||
sl = Slither("tests/printers/functions_ids.sol") |
||||
contracts_c = sl.get_contract_from_name("C") |
||||
assert len(contracts_c) == 1 |
||||
contract_c = contracts_c[0] |
||||
|
||||
for sig, hashes in signatures.items(): |
||||
func = contract_c.get_function_from_signature(sig) |
||||
if not func: |
||||
var_name = sig[: sig.find("(")] |
||||
var = contract_c.get_state_variable_from_name(var_name) |
||||
assert var |
||||
assert get_function_id(var.solidity_signature) == int(hashes, 16) |
||||
else: |
||||
assert get_function_id(func.solidity_signature) == int(hashes, 16) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
test_functions_ids() |
Loading…
Reference in new issue