-
Notifications
You must be signed in to change notification settings - Fork 1
/
displayStats.py
116 lines (94 loc) · 3.79 KB
/
displayStats.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import os, sys
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
print(SCRIPT_DIR)
ACCESS_CONTROL = "Access Control"
TIME_LOCK = "Time Lock"
GAS_CONTROL = "Gas Control"
REENTRANCY = "Reentrancy"
ORACLE_SLIPPAGE = "Oracle Slippage"
SPECIAL_STORAGE = "Special Storage"
MONEY_FLOW = "Money Flow"
DATA_FLOW = "Data Flow"
IGNORE = "Ignore"
subCategory2Category = {
# Access Control
"onlyEOA": ACCESS_CONTROL,
"isSenderOwner": ACCESS_CONTROL,
"isSenderManager": ACCESS_CONTROL,
"isOriginOwner": ACCESS_CONTROL,
"isOriginManager": ACCESS_CONTROL,
# Time Lock
"isSameSenderBlock": TIME_LOCK,
"isSameOriginBlock": TIME_LOCK,
"lastUpdate": TIME_LOCK,
# Gas Control
"GasControl": GAS_CONTROL,
# Reentrancy
"nonReEntrant": REENTRANCY,
# Oracle Slippage
"OracleRange": ORACLE_SLIPPAGE,
"OracleDeviation": ORACLE_SLIPPAGE,
# Special Storage
"TotalSupplyUpperBound": SPECIAL_STORAGE,
"TotalBorrowUpperBound": SPECIAL_STORAGE,
# Money Flow
"TokenInUpperBound": MONEY_FLOW,
"TokenInRatioUpperBound": MONEY_FLOW,
"TokenOutUpperBound": MONEY_FLOW,
"TokenOutRatioUpperBound": MONEY_FLOW,
# Data Flow
"MappingUpperBound": DATA_FLOW,
"CallValueUpperBound": DATA_FLOW,
"DataFlow": DATA_FLOW,
# Ignore
"Ignore: byte operations": IGNORE,
"Ignore: protocol-specific": IGNORE,
"Ignore: array length": IGNORE,
"Ignore: safe math": IGNORE,
}
if __name__ == "__main__":
audits_folder = os.path.join(SCRIPT_DIR, "audits")
audits = os.listdir(audits_folder)
repos_folder = os.path.join(SCRIPT_DIR, "repos")
repos = os.listdir(repos_folder)
invariants_study_folder = os.path.join(SCRIPT_DIR, "invariants_study")
# list all files in the folder
files = os.listdir(invariants_study_folder)
CategoryCount = {}
for file in files:
if file.endswith(".md"):
# print("\"" + file[:-3] + "\": ,")
name = file[:-3]
category = subCategory2Category[name]
if category not in CategoryCount:
CategoryCount[category] = 0
with open(os.path.join(invariants_study_folder, file), "r") as f:
lines = f.readlines()
for line in lines:
if line.startswith("["):
CategoryCount[category] += 1
print(" =========== Study Overall Stats ===========")
print("Total number of aduits:", len(audits))
print("Total number of repos:", len(repos))
print("Total number of invariants:", sum(CategoryCount.values()))
categorized = 0
for category in [ACCESS_CONTROL, TIME_LOCK, GAS_CONTROL, REENTRANCY, ORACLE_SLIPPAGE, SPECIAL_STORAGE, MONEY_FLOW, DATA_FLOW]:
categorized += CategoryCount[category]
print("Total number of invariants categoried:", categorized)
uncategorized = 0
for category in [IGNORE]:
uncategorized += CategoryCount[category]
print("Total number of invariants uncategorized:", uncategorized)
print(" =========== Categorized Invariants Stats ===========")
for category in [ACCESS_CONTROL, TIME_LOCK, GAS_CONTROL, REENTRANCY, ORACLE_SLIPPAGE, SPECIAL_STORAGE, MONEY_FLOW, DATA_FLOW]:
print(category + ":", CategoryCount[category])
print(" =========== Uncategorized Invariants Stats ===========")
for reason in ["Ignore: protocol-specific", "Ignore: array length", "Ignore: byte operations", "Ignore: safe math"]:
file = reason + ".md"
with open(os.path.join(invariants_study_folder, file), "r") as f:
lines = f.readlines()
number = 0
for line in lines:
if line.startswith("["):
number += 1
print(reason + ":", number)