Skip to content

Commit fba014f

Browse files
Y-Nakcburgdorf
authored andcommitted
Fix invalid nested array encoding
1 parent 5800a88 commit fba014f

5 files changed

Lines changed: 191 additions & 70 deletions

File tree

crates/abi/src/types.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ impl AbiType {
119119
Self::Bytes | Self::String => None,
120120
}
121121
}
122+
123+
fn serialize_component<S: SerializeMap>(&self, s: &mut S) -> Result<(), S::Error> {
124+
match self {
125+
Self::Tuple(entry) => s.serialize_entry("components", entry),
126+
Self::Array { elem_ty, .. } => elem_ty.serialize_component(s),
127+
_ => Ok(()),
128+
}
129+
}
122130
}
123131

124132
impl Serialize for AbiType {
@@ -128,16 +136,7 @@ impl Serialize for AbiType {
128136

129137
map.serialize_entry("type", &type_name)?;
130138

131-
match self {
132-
Self::Tuple(entry) => map.serialize_entry("components", entry)?,
133-
Self::Array { elem_ty, .. } => {
134-
if let Self::Tuple(entry) = elem_ty.as_ref() {
135-
map.serialize_entry("components", entry)?
136-
}
137-
}
138-
_ => {}
139-
}
140-
139+
self.serialize_component(&mut map)?;
141140
map.end()
142141
}
143142
}
Lines changed: 157 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
---
22
source: crates/analyzer/tests/analysis.rs
33
expression: "build_snapshot(&db, module)"
4-
54
---
65
note:
76
┌─ events.fe:3:5
@@ -39,75 +38,81 @@ note:
3938
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Array<address, 2>
4039

4140
note:
42-
┌─ events.fe:26:5
41+
┌─ events.fe:25:5
42+
43+
25pub inner: Array<Array<Nums, 2>, 2>
44+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Array<Array<Nums, 2>, 2>
45+
46+
note:
47+
┌─ events.fe:30:5
4348
44-
26 │ ╭ pub fn emit_nums(mut ctx: Context) {
45-
27 │ │ ctx.emit(Nums(num1: 26, num2: 42))
46-
28 │ │ }
49+
30 │ ╭ pub fn emit_nums(mut ctx: Context) {
50+
31 │ │ ctx.emit(Nums(num1: 26, num2: 42))
51+
32 │ │ }
4752
│ ╰─────^ params: [{ label: None, name: ctx, typ: mut Context }] -> ()
4853

4954
note:
50-
┌─ events.fe:27:9
55+
┌─ events.fe:31:9
5156
52-
27ctx.emit(Nums(num1: 26, num2: 42))
57+
31ctx.emit(Nums(num1: 26, num2: 42))
5358
^^^ ^^ ^^ u256
5459
│ │ │
5560
│ │ u256
5661
mut Context
5762

5863
note:
59-
┌─ events.fe:27:18
64+
┌─ events.fe:31:18
6065
61-
27ctx.emit(Nums(num1: 26, num2: 42))
66+
31ctx.emit(Nums(num1: 26, num2: 42))
6267
^^^^^^^^^^^^^^^^^^^^^^^^ Nums
6368

6469
note:
65-
┌─ events.fe:27:9
70+
┌─ events.fe:31:9
6671
67-
27ctx.emit(Nums(num1: 26, num2: 42))
72+
31ctx.emit(Nums(num1: 26, num2: 42))
6873
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ()
6974

7075
note:
71-
┌─ events.fe:30:5
76+
┌─ events.fe:34:5
7277
73-
30 │ ╭ pub fn emit_bases(mut ctx: Context, addr: address) {
74-
31 │ │ ctx.emit(Bases(num: 26, addr))
75-
32 │ │ }
78+
34 │ ╭ pub fn emit_bases(mut ctx: Context, addr: address) {
79+
35 │ │ ctx.emit(Bases(num: 26, addr))
80+
36 │ │ }
7681
│ ╰─────^ params: [{ label: None, name: ctx, typ: mut Context }, { label: None, name: addr, typ: address }] -> ()
7782

7883
note:
79-
┌─ events.fe:31:9
84+
┌─ events.fe:35:9
8085
81-
31ctx.emit(Bases(num: 26, addr))
86+
35ctx.emit(Bases(num: 26, addr))
8287
^^^ ^^ ^^^^ address
8388
│ │ │
8489
│ │ u256
8590
mut Context
8691

8792
note:
88-
┌─ events.fe:31:18
93+
┌─ events.fe:35:18
8994
90-
31ctx.emit(Bases(num: 26, addr))
95+
35ctx.emit(Bases(num: 26, addr))
9196
^^^^^^^^^^^^^^^^^^^^ Bases
9297

9398
note:
94-
┌─ events.fe:31:9
99+
┌─ events.fe:35:9
95100
96-
31ctx.emit(Bases(num: 26, addr))
101+
35ctx.emit(Bases(num: 26, addr))
97102
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ()
98103

99104
note:
100-
┌─ events.fe:34:5
105+
┌─ events.fe:38:5
101106
102-
34 │ ╭ pub fn emit_mix(mut ctx: Context, addr: address, my_bytes: Array<u8, 100>) {
103-
35 │ │ ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
104-
36 │ │ }
107+
38 │ ╭ pub fn emit_mix(mut ctx: Context, addr: address, my_bytes: Array<u8, 100>) {
108+
39 │ │ ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
109+
40 │ │ }
105110
│ ╰─────^ params: [{ label: None, name: ctx, typ: mut Context }, { label: None, name: addr, typ: address }, { label: None, name: my_bytes, typ: Array<u8, 100> }] -> ()
106111

107112
note:
108-
┌─ events.fe:35:9
113+
┌─ events.fe:39:9
109114
110-
35ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
115+
39ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
111116
^^^ ^^ ^^^^ ^^ ^^^^^^^^ Array<u8, 100> -Copy-> Array<u8, 100>
112117
│ │ │ │ │
113118
│ │ │ │ u256
@@ -116,92 +121,187 @@ note:
116121
mut Context
117122

118123
note:
119-
┌─ events.fe:35:18
124+
┌─ events.fe:39:18
120125
121-
35ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
126+
39ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
122127
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mix
123128

124129
note:
125-
┌─ events.fe:35:9
130+
┌─ events.fe:39:9
126131
127-
35ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
132+
39ctx.emit(Mix(num1: 26, addr, num2: 42, my_bytes))
128133
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ()
129134

130135
note:
131-
┌─ events.fe:38:5
136+
┌─ events.fe:42:5
132137
133-
38 │ ╭ pub fn emit_addresses(mut ctx: Context, addr1: address, addr2: address) {
134-
39 │ │ let mut addrs: Array<address, 2> = [address(0); 2]
135-
40 │ │ addrs[0] = addr1
136-
41 │ │ addrs[1] = addr2
137-
42 │ │ ctx.emit(Addresses(addrs))
138-
43 │ │ }
138+
42 │ ╭ pub fn emit_addresses(mut ctx: Context, addr1: address, addr2: address) {
139+
43 │ │ let mut addrs: Array<address, 2> = [address(0); 2]
140+
44 │ │ addrs[0] = addr1
141+
45 │ │ addrs[1] = addr2
142+
46 │ │ ctx.emit(Addresses(addrs))
143+
47 │ │ }
139144
│ ╰─────^ params: [{ label: None, name: ctx, typ: mut Context }, { label: None, name: addr1, typ: address }, { label: None, name: addr2, typ: address }] -> ()
140145

141146
note:
142-
┌─ events.fe:39:17
147+
┌─ events.fe:43:17
143148
144-
39let mut addrs: Array<address, 2> = [address(0); 2]
149+
43let mut addrs: Array<address, 2> = [address(0); 2]
145150
^^^^^ mut Array<address, 2>
146151

147152
note:
148-
┌─ events.fe:39:53
153+
┌─ events.fe:43:53
149154
150-
39let mut addrs: Array<address, 2> = [address(0); 2]
155+
43let mut addrs: Array<address, 2> = [address(0); 2]
151156
^ u256
152157

153158
note:
154-
┌─ events.fe:39:45
159+
┌─ events.fe:43:45
155160
156-
39let mut addrs: Array<address, 2> = [address(0); 2]
161+
43let mut addrs: Array<address, 2> = [address(0); 2]
157162
^^^^^^^^^^ ^ u256
158163
│ │
159164
address
160165

161166
note:
162-
┌─ events.fe:39:44
167+
┌─ events.fe:43:44
163168
164-
39let mut addrs: Array<address, 2> = [address(0); 2]
169+
43let mut addrs: Array<address, 2> = [address(0); 2]
165170
^^^^^^^^^^^^^^^ Array<address, 2>
166-
40addrs[0] = addr1
171+
44addrs[0] = addr1
167172
^^^^^ ^ u256
168173
│ │
169174
mut Array<address, 2>
170175

171176
note:
172-
┌─ events.fe:40:9
177+
┌─ events.fe:44:9
173178
174-
40addrs[0] = addr1
179+
44addrs[0] = addr1
175180
^^^^^^^^ ^^^^^ address
176181
│ │
177182
mut address
178-
41addrs[1] = addr2
183+
45addrs[1] = addr2
179184
^^^^^ ^ u256
180185
│ │
181186
mut Array<address, 2>
182187

183188
note:
184-
┌─ events.fe:41:9
189+
┌─ events.fe:45:9
185190
186-
41addrs[1] = addr2
191+
45addrs[1] = addr2
187192
^^^^^^^^ ^^^^^ address
188193
│ │
189194
mut address
190-
42ctx.emit(Addresses(addrs))
195+
46ctx.emit(Addresses(addrs))
191196
^^^ ^^^^^ mut Array<address, 2> -Copy-> Array<address, 2>
192197
│ │
193198
mut Context
194199

195200
note:
196-
┌─ events.fe:42:18
201+
┌─ events.fe:46:18
197202
198-
42ctx.emit(Addresses(addrs))
203+
46ctx.emit(Addresses(addrs))
199204
^^^^^^^^^^^^^^^^ Addresses
200205

201206
note:
202-
┌─ events.fe:42:9
207+
┌─ events.fe:46:9
203208
204-
42ctx.emit(Addresses(addrs))
209+
46ctx.emit(Addresses(addrs))
205210
^^^^^^^^^^^^^^^^^^^^^^^^^^ ()
206211

212+
note:
213+
┌─ events.fe:49:5
214+
215+
49 │ ╭ pub fn emit_nested_array(mut ctx: Context) {
216+
50 │ │ let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
217+
51 │ │ let nested_array: NestedArray = NestedArray(inner)
218+
52 │ │ ctx.emit(nested_array)
219+
53 │ │ }
220+
│ ╰─────^ params: [{ label: None, name: ctx, typ: mut Context }] -> ()
221+
222+
note:
223+
┌─ events.fe:50:13
224+
225+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
226+
^^^^^ Array<Array<Nums, 2>, 2>
227+
51let nested_array: NestedArray = NestedArray(inner)
228+
^^^^^^^^^^^^ NestedArray
229+
230+
note:
231+
┌─ events.fe:50:60
232+
233+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
234+
^ ^ u256
235+
│ │
236+
u256
237+
238+
note:
239+
┌─ events.fe:50:49
240+
241+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
242+
^^^^^^^^^^^^^^^^^^^^^^ ^ ^ u256
243+
│ │ │
244+
│ │ u256
245+
Nums
246+
247+
note:
248+
┌─ events.fe:50:73
249+
250+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
251+
^^^^^^^^^^^^^^^^^^^^^^ Nums
252+
253+
note:
254+
┌─ events.fe:50:48
255+
256+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
257+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ ^ u256
258+
│ │ │
259+
│ │ u256
260+
Array<Nums, 2>
261+
262+
note:
263+
┌─ events.fe:50:99
264+
265+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
266+
^^^^^^^^^^^^^^^^^^^^^^ ^ ^ u256
267+
│ │ │
268+
│ │ u256
269+
Nums
270+
271+
note:
272+
┌─ events.fe:50:123
273+
274+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
275+
^^^^^^^^^^^^^^^^^^^^^^ Nums
276+
277+
note:
278+
┌─ events.fe:50:98
279+
280+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
281+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Array<Nums, 2>
282+
283+
note:
284+
┌─ events.fe:50:47
285+
286+
50let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
287+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Array<Array<Nums, 2>, 2>
288+
51let nested_array: NestedArray = NestedArray(inner)
289+
^^^^^ Array<Array<Nums, 2>, 2> -Copy-> Array<Array<Nums, 2>, 2>
290+
291+
note:
292+
┌─ events.fe:51:41
293+
294+
51let nested_array: NestedArray = NestedArray(inner)
295+
^^^^^^^^^^^^^^^^^^ NestedArray
296+
52ctx.emit(nested_array)
297+
^^^ ^^^^^^^^^^^^ NestedArray
298+
│ │
299+
mut Context
300+
301+
note:
302+
┌─ events.fe:52:9
303+
304+
52ctx.emit(nested_array)
305+
^^^^^^^^^^^^^^^^^^^^^^ ()
306+
207307

crates/test-files/fixtures/features/events.fe

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ pub struct Addresses {
2121
pub addrs: Array<address, 2>
2222
}
2323

24+
pub struct NestedArray {
25+
pub inner: Array<Array<Nums, 2>, 2>
26+
}
27+
2428
contract Foo {
2529

2630
pub fn emit_nums(mut ctx: Context) {
@@ -41,4 +45,10 @@ contract Foo {
4145
addrs[1] = addr2
4246
ctx.emit(Addresses(addrs))
4347
}
48+
49+
pub fn emit_nested_array(mut ctx: Context) {
50+
let inner: Array<Array<Nums, 2>, 2> = [[Nums(num1: 0, num2: 1), Nums(num1: 2, num2: 3)], [Nums(num1: 4, num2: 5), Nums(num1: 6, num2: 7)]]
51+
let nested_array: NestedArray = NestedArray(inner)
52+
ctx.emit(nested_array)
53+
}
4454
}

0 commit comments

Comments
 (0)