-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcontract.k
122 lines (99 loc) · 3.5 KB
/
contract.k
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
117
118
119
120
121
requires "solidity-syntax.k"
requires "configuration.k"
module CONTRACT
imports SOLIDITY-SYNTAX
imports CONFIGURATION
imports COLLECTIONS
rule
<k> Ps:PragmaDirectives Cs:ContractDefinitions => Cs ... </k>
rule [ContractDefinitions]:
<k> C:ContractDefinition Cs:ContractDefinitions => C ~> Cs ... </k>
rule
<k> .ContractDefinitions => . ... </k>
rule [ContractDefinition]:
<k> contract C:Id { Cs:ContractParts } => #pcsContractParts(C,Cs) ... </k>
(.Bag =>
<Contract>
<cname> C </cname>
<functions> .Bag </functions>
<stateVar> .List </stateVar>
...
</Contract>
)
syntax SolidityItem
::= #pcsContractParts(Id, ContractParts)
| #pcsContractPart(Id, ContractPart)
rule #pcsContractParts(Ct:Id, .ContractParts) => .
rule #pcsContractParts(Ct:Id, C:ContractPart Cs:ContractParts) =>
#pcsContractPart(Ct, C) ~> #pcsContractParts(Ct,Cs)
rule [StateVariableDeclaration]:
<k> #pcsContractPart(C:Id, T:TypeName F:FunQuantifiers V:Id;) =>
. ...</k>
<Contract>
<cname> C </cname>
<stateVar> ... .List => ListItem(#varInfo(V, #undef_Value, T, #storage, 1)) </stateVar>
...
</Contract>
rule
<k> #pcsContractPart(C:Id, T:TypeName F:FunQuantifiers V:Id = E;) =>
. ...</k>
<Contract>
<cname> C </cname>
<stateVar> ... .List => ListItem(#varInfo(V, E, T, #storage, 1)) </stateVar>
...
</Contract>
rule [VariableDeclaration]:
<k> T:TypeName S:StorageLocations X:Id => #allocate(C, CN, #varInfo(X:Id, #undef_Value,T:TypeName, #mem, 1)) ~> #end_Exp ...</k>
<currentAccount> #account(C:Int, CN:AccountId) </currentAccount>
rule
<k> T:TypeName S:StorageLocations X:Id = E:Value => #allocate(C, CN, #varInfo(X:Id, E,T:TypeName, #mem, 1)) ~> #end_Exp ...</k>
<currentAccount> #account(C:Int, CN:AccountId) </currentAccount>
syntax SolidityItem
::= #createStateVars(Int, Id, List)
| #exeConstructor(Id,Int,ExpressionList) [strict(3)]
rule [New-Contract-Instance]:
<k> new C:Id ( Es:ExpressionList ) => #createStateVars(size(AA), C, SV)
~> #exeConstructor(C, size(AA), Es) ~> size(AA) ...</k>
<Contract>
<cname> C </cname>
<stateVar> SV:List </stateVar>
...
</Contract>
<activeAccounts> AA:Set (.Set => SetItem(#account(size(AA), C))) </activeAccounts>
<accounts>
...
(.Bag =>
<account>
<acctID> size(AA) </acctID>
<contractName> C </contractName>
<balance> 0 </balance>
<acctEnv> .Map </acctEnv>
<code>
<associatedContract> .K </associatedContract>
<availableContracts> .K </availableContracts>
</code>
<acctStorage> .Map </acctStorage>
<nonce> 0 </nonce>
...
</account>
)
</accounts>
rule
<k> #createStateVars(N:Int, CN:Id, ListItem(VInfo) L:List) => #allocate(N, CN, VInfo) ~> #createStateVars(N, CN, L) ... </k>
rule
<k> #createStateVars(N:Int, CN:Id, .List) => . ... </k>
rule
<k> #exeConstructor(C:Id,N:Int,Es:Values) => functionCall(N;String2Id("constructor"); Es); ... </k>
<Contract>
<cname> C </cname>
<Constructor> true </Constructor>
...
</Contract>
rule
<k> #exeConstructor(C:Id,N:Int,Es:Values) => . ... </k>
<Contract>
<cname> C </cname>
<Constructor> false </Constructor>
...
</Contract>
endmodule