Skip to content

Commit 274d686

Browse files
committed
Support const layout holes across type/effect analysis
1 parent 73a9ce0 commit 274d686

65 files changed

Lines changed: 3031 additions & 1488 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crates/codegen/tests/fixtures/erc20.fe

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@ use std::abi::sol
66
const MINTER: u256 = 1
77
const BURNER: u256 = 2
88

9-
// StorageMap salts (type-level discriminators)
10-
const BALANCES_SALT: u256 = 0
11-
const ALLOWANCES_SALT: u256 = 1
12-
const ROLES_SALT: u256 = 2
13-
149
pub contract CoolCoin uses (ctx: mut Ctx, log: mut Log) {
1510
// Storage fields. These act as effects within the contract.
1611
mut store: TokenStore,
@@ -167,12 +162,12 @@ fn spend_allowance(owner: Address, spender: Address, amount: u256)
167162

168163
struct TokenStore {
169164
total_supply: u256,
170-
balances: StorageMap<Address, u256, BALANCES_SALT>,
171-
allowances: StorageMap<(Address, Address), u256, ALLOWANCES_SALT>,
165+
balances: StorageMap<Address, u256>,
166+
allowances: StorageMap<(Address, Address), u256>,
172167
}
173168

174169
pub struct AccessControl {
175-
roles: StorageMap<(u256, Address), bool, ROLES_SALT>,
170+
roles: StorageMap<(u256, Address), bool>,
176171
}
177172

178173
impl AccessControl {

crates/codegen/tests/fixtures/erc20.snap

Lines changed: 54 additions & 54 deletions
Large diffs are not rendered by default.

crates/codegen/tests/fixtures/erc20_low_level.fe

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ fn abi_encode_string(word: u256, len: u256) -> ! uses (ops: mut RawOps) {
2121
// ERC20 storage ---------------------------------------------------------
2222

2323
struct Erc20 {
24-
balances: StorageMap<Address, u256, BALANCES_SALT>,
25-
allowances: StorageMap<(Address, Address), u256, ALLOWANCES_SALT>,
24+
balances: StorageMap<Address, u256>,
25+
allowances: StorageMap<(Address, Address), u256>,
2626
supply: u256,
2727
owner: Address,
2828
}
@@ -119,7 +119,7 @@ fn mint(to: Address, amount: u256) -> u256 uses (erc20: mut Erc20, ctx: Ctx, ops
119119

120120
#[contract_init(Erc20Contract)]
121121
fn init() uses (evm: mut Evm) {
122-
let mut erc20: StorPtr<Erc20> = evm.stor_ptr(0)
122+
let mut erc20: StorPtr<Erc20<BALANCES_SALT, ALLOWANCES_SALT>> = evm.stor_ptr(0)
123123
with (erc20, Ctx = evm, RawOps = evm) {
124124
do_init()
125125
}
@@ -131,7 +131,7 @@ fn init() uses (evm: mut Evm) {
131131

132132
#[contract_runtime(Erc20Contract)]
133133
fn runtime() uses (evm: mut Evm) {
134-
let mut erc20: StorPtr<Erc20> = evm.stor_ptr(0)
134+
let mut erc20: StorPtr<Erc20<BALANCES_SALT, ALLOWANCES_SALT>> = evm.stor_ptr(0)
135135
let selector = evm.calldataload(0) >> 224
136136
with (erc20, Ctx = evm, RawOps = evm) {
137137
match selector {

crates/codegen/tests/fixtures/erc20_low_level.snap

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ object "Erc20Contract" {
1313
ret := 0
1414
leave
1515
}
16-
function $do_init__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5($erc20, $ctx, $ops) {
16+
function $do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($erc20, $ctx, $ops) {
1717
let v0 := caller()
18-
$erc20_h7a8a7a2800ba6809_set_owner_once_stor_arg0_root_stor__Evm_hef0af3106e109414__3af54274b2985741($erc20, v0, $ops)
18+
$erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($erc20, v0, $ops)
1919
leave
2020
}
21-
function $erc20_h7a8a7a2800ba6809_set_owner_once_stor_arg0_root_stor__Evm_hef0af3106e109414__3af54274b2985741($self, $owner, $ops) {
21+
function $erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $owner, $ops) {
2222
let v0 := sload(add($self, 1))
2323
let v1 := $address_h257056268eac7027_zero()
2424
let v2 := $ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, v1)
@@ -30,9 +30,9 @@ object "Erc20Contract" {
3030
leave
3131
}
3232
function $init__StorPtr_Evm___207f35a85ac4062e() {
33-
let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_h7a8a7a2800ba6809__828ea75549970aee(0, 0)
33+
let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd(0, 0)
3434
let v1 := v0
35-
$do_init__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5(v1, 0, 0)
35+
$do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v1, 0, 0)
3636
let v2 := datasize("Erc20Contract_deployed")
3737
let v3 := dataoffset("Erc20Contract_deployed")
3838
codecopy(0, v3, v2)
@@ -43,12 +43,12 @@ object "Erc20Contract" {
4343
ret := iszero(v0)
4444
leave
4545
}
46-
function $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_h7a8a7a2800ba6809__828ea75549970aee($self, $slot) -> ret {
47-
let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_h7a8a7a2800ba6809__f6f4aaca4c5af1b3($slot)
46+
function $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd($self, $slot) -> ret {
47+
let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($slot)
4848
ret := v0
4949
leave
5050
}
51-
function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_h7a8a7a2800ba6809__f6f4aaca4c5af1b3($raw) -> ret {
51+
function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($raw) -> ret {
5252
ret := $raw
5353
leave
5454
}
@@ -84,7 +84,7 @@ object "Erc20Contract" {
8484
ret := v0
8585
leave
8686
}
87-
function $allowance__StorPtr_Erc20___2745299687a147d4($owner, $spender, $erc20) -> ret {
87+
function $allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1($owner, $spender, $erc20) -> ret {
8888
pop($erc20)
8989
let v0 := mload(0x40)
9090
if iszero(v0) {
@@ -97,19 +97,19 @@ object "Erc20Contract" {
9797
ret := v1
9898
leave
9999
}
100-
function $approve__StorPtr_Erc20__Evm_hef0af3106e109414__cb64805ecdbd6d6e($spender, $amount, $erc20, $ctx) -> ret {
100+
function $approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b($spender, $amount, $erc20, $ctx) -> ret {
101101
let v0 := caller()
102-
$erc20_h7a8a7a2800ba6809_approve_stor_arg0_root_stor($erc20, v0, $spender, $amount)
102+
$erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2($erc20, v0, $spender, $amount)
103103
ret := 1
104104
leave
105105
}
106-
function $balance_of__StorPtr_Erc20___2745299687a147d4($addr, $erc20) -> ret {
106+
function $balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1($addr, $erc20) -> ret {
107107
pop($erc20)
108108
let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $addr)
109109
ret := v0
110110
leave
111111
}
112-
function $erc20_h7a8a7a2800ba6809_allowance_stor_arg0_root_stor($self, $owner, $spender) -> ret {
112+
function $erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, $spender) -> ret {
113113
pop($self)
114114
let v0 := mload(0x40)
115115
if iszero(v0) {
@@ -122,7 +122,7 @@ object "Erc20Contract" {
122122
ret := v1
123123
leave
124124
}
125-
function $erc20_h7a8a7a2800ba6809_approve_stor_arg0_root_stor($self, $owner, $spender, $value) {
125+
function $erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, $spender, $value) {
126126
pop($self)
127127
let v0 := mload(0x40)
128128
if iszero(v0) {
@@ -134,35 +134,35 @@ object "Erc20Contract" {
134134
$storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v0, $value)
135135
leave
136136
}
137-
function $erc20_h7a8a7a2800ba6809_balance_of_stor_arg0_root_stor($self, $addr) -> ret {
137+
function $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $addr) -> ret {
138138
pop($self)
139139
let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $addr)
140140
ret := v0
141141
leave
142142
}
143-
function $erc20_h7a8a7a2800ba6809_mint_stor_arg0_root_stor__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59($self, $to, $amount, $ctx, $ops) {
143+
function $erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($self, $to, $amount, $ctx, $ops) {
144144
let v0 := caller()
145145
let v1 := sload(add($self, 1))
146146
let v2 := $ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, v1)
147147
let v3 := v2
148148
if v3 {
149149
revert(0, 0)
150150
}
151-
let v4 := $erc20_h7a8a7a2800ba6809_balance_of_stor_arg0_root_stor($self, $to)
151+
let v4 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to)
152152
pop($self)
153153
$storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v4, $amount))
154154
let v5 := sload($self)
155155
sstore($self, add(v5, $amount))
156156
leave
157157
}
158-
function $erc20_h7a8a7a2800ba6809_transfer_from_stor_arg0_root_stor__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59($self, $owner, $to, $amount, $ctx, $ops) {
158+
function $erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($self, $owner, $to, $amount, $ctx, $ops) {
159159
let v0 := caller()
160-
let v1 := $erc20_h7a8a7a2800ba6809_allowance_stor_arg0_root_stor($self, $owner, v0)
160+
let v1 := $erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, v0)
161161
let v2 := lt(v1, $amount)
162162
if v2 {
163163
revert(0, 0)
164164
}
165-
$erc20_h7a8a7a2800ba6809_transfer_stor_arg0_root_stor__Evm_hef0af3106e109414__3af54274b2985741($self, $owner, $to, $amount, $ops)
165+
$erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $owner, $to, $amount, $ops)
166166
pop($self)
167167
let v3 := mload(0x40)
168168
if iszero(v3) {
@@ -174,21 +174,21 @@ object "Erc20Contract" {
174174
$storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v3, sub(v1, $amount))
175175
leave
176176
}
177-
function $erc20_h7a8a7a2800ba6809_transfer_stor_arg0_root_stor__Evm_hef0af3106e109414__3af54274b2985741($self, $from, $to, $amount, $ops) {
178-
let v0 := $erc20_h7a8a7a2800ba6809_balance_of_stor_arg0_root_stor($self, $from)
177+
function $erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $from, $to, $amount, $ops) {
178+
let v0 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $from)
179179
let v1 := lt(v0, $amount)
180180
if v1 {
181181
revert(0, 0)
182182
}
183-
let v2 := $erc20_h7a8a7a2800ba6809_balance_of_stor_arg0_root_stor($self, $to)
183+
let v2 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to)
184184
pop($self)
185185
$storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v0, $amount))
186186
pop($self)
187187
$storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v2, $amount))
188188
leave
189189
}
190-
function $mint__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5($to, $amount, $erc20, $ctx, $ops) -> ret {
191-
$erc20_h7a8a7a2800ba6809_mint_stor_arg0_root_stor__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59($erc20, $to, $amount, $ctx, $ops)
190+
function $mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($to, $amount, $erc20, $ctx, $ops) -> ret {
191+
$erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($erc20, $to, $amount, $ctx, $ops)
192192
ret := 1
193193
leave
194194
}
@@ -198,23 +198,23 @@ object "Erc20Contract" {
198198
leave
199199
}
200200
function $runtime__StorPtr_Evm___207f35a85ac4062e() {
201-
let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_h7a8a7a2800ba6809__828ea75549970aee(0, 0)
201+
let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd(0, 0)
202202
let v1 := calldataload(0)
203203
let v2 := shr(224, v1)
204204
let v3 := v0
205205
switch v2
206206
case 1889567281 {
207207
let v4 := calldataload(4)
208208
let v5 := v4
209-
let v6 := $balance_of__StorPtr_Erc20___2745299687a147d4(v5, v3)
209+
let v6 := $balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v5, v3)
210210
$abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v6, 0)
211211
}
212212
case 3714247998 {
213213
let v7 := calldataload(4)
214214
let v8 := v7
215215
let v9 := calldataload(36)
216216
let v10 := v9
217-
let v11 := $allowance__StorPtr_Erc20___2745299687a147d4(v8, v10, v3)
217+
let v11 := $allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v8, v10, v3)
218218
$abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v11, 0)
219219
}
220220
case 117300739 {
@@ -230,14 +230,14 @@ object "Erc20Contract" {
230230
let v12 := calldataload(4)
231231
let v13 := v12
232232
let v14 := calldataload(36)
233-
let v15 := $transfer__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5(v13, v14, v3, 0, 0)
233+
let v15 := $transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v13, v14, v3, 0, 0)
234234
$abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v15, 0)
235235
}
236236
case 157198259 {
237237
let v16 := calldataload(4)
238238
let v17 := v16
239239
let v18 := calldataload(36)
240-
let v19 := $approve__StorPtr_Erc20__Evm_hef0af3106e109414__cb64805ecdbd6d6e(v17, v18, v3, 0)
240+
let v19 := $approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b(v17, v18, v3, 0)
241241
$abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v19, 0)
242242
}
243243
case 599290589 {
@@ -246,22 +246,22 @@ object "Erc20Contract" {
246246
let v22 := calldataload(36)
247247
let v23 := v22
248248
let v24 := calldataload(68)
249-
let v25 := $transfer_from__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5(v21, v23, v24, v3, 0, 0)
249+
let v25 := $transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v21, v23, v24, v3, 0, 0)
250250
$abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v25, 0)
251251
}
252252
case 1086394137 {
253253
let v26 := calldataload(4)
254254
let v27 := v26
255255
let v28 := calldataload(36)
256-
let v29 := $mint__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5(v27, v28, v3, 0, 0)
256+
let v29 := $mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v27, v28, v3, 0, 0)
257257
$abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v29, 0)
258258
}
259259
default {
260260
revert(0, 0)
261261
}
262262
}
263-
function $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_h7a8a7a2800ba6809__828ea75549970aee($self, $slot) -> ret {
264-
let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_h7a8a7a2800ba6809__f6f4aaca4c5af1b3($slot)
263+
function $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd($self, $slot) -> ret {
264+
let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($slot)
265265
ret := v0
266266
leave
267267
}
@@ -335,18 +335,18 @@ object "Erc20Contract" {
335335
ret := v3
336336
leave
337337
}
338-
function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_h7a8a7a2800ba6809__f6f4aaca4c5af1b3($raw) -> ret {
338+
function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($raw) -> ret {
339339
ret := $raw
340340
leave
341341
}
342-
function $transfer__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5($to, $amount, $erc20, $ctx, $ops) -> ret {
342+
function $transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($to, $amount, $erc20, $ctx, $ops) -> ret {
343343
let v0 := caller()
344-
$erc20_h7a8a7a2800ba6809_transfer_stor_arg0_root_stor__Evm_hef0af3106e109414__3af54274b2985741($erc20, v0, $to, $amount, $ops)
344+
$erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($erc20, v0, $to, $amount, $ops)
345345
ret := 1
346346
leave
347347
}
348-
function $transfer_from__StorPtr_Erc20__Evm_hef0af3106e109414_Evm_hef0af3106e109414__a43599a61c4c3ec5($from, $to, $amount, $erc20, $ctx, $ops) -> ret {
349-
$erc20_h7a8a7a2800ba6809_transfer_from_stor_arg0_root_stor__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59($erc20, $from, $to, $amount, $ctx, $ops)
348+
function $transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($from, $to, $amount, $erc20, $ctx, $ops) -> ret {
349+
$erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($erc20, $from, $to, $amount, $ctx, $ops)
350350
ret := 1
351351
leave
352352
}

0 commit comments

Comments
 (0)