@@ -149,3 +149,163 @@ TEST_P(evm, eof_data_only_contract)
149149 execute (code + bytes (256 , 0x01 ));
150150 EXPECT_STATUS (EVMC_INVALID_INSTRUCTION);
151151}
152+
153+ TEST_P (evm, eof1_dataload)
154+ {
155+ // Data instructions are not implemented in Advanced.
156+ if (is_advanced ())
157+ return ;
158+
159+ rev = EVMC_CANCUN;
160+ const auto data = bytes (8 , 0x0 ) + bytes (8 , 0x11 ) + bytes (8 , 0x22 ) + bytes (8 , 0x33 ) +
161+ bytes (8 , 0xaa ) + bytes (8 , 0xbb ) + bytes (8 , 0xcc ) + bytes (8 , 0xdd );
162+ const auto code = eof1_bytecode (calldataload (0 ) + OP_DATALOAD + ret_top (), 2 , data);
163+
164+ execute (code, " 00" _hex);
165+ EXPECT_STATUS (EVMC_SUCCESS);
166+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
167+ " 0000000000000000111111111111111122222222222222223333333333333333" _hex);
168+
169+ execute (code, " 0000000000000000000000000000000000000000000000000000000000000001" _hex);
170+ EXPECT_STATUS (EVMC_SUCCESS);
171+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
172+ " 00000000000000111111111111111122222222222222223333333333333333aa" _hex);
173+
174+ execute (code, " 0000000000000000000000000000000000000000000000000000000000000020" _hex);
175+ EXPECT_STATUS (EVMC_SUCCESS);
176+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
177+ " aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd" _hex);
178+
179+ execute (code, " 0000000000000000000000000000000000000000000000000000000000000021" _hex);
180+ EXPECT_STATUS (EVMC_INVALID_MEMORY_ACCESS);
181+
182+ execute (code, " 0000000000000000000000000000000000000000000000000000000000000040" _hex);
183+ EXPECT_STATUS (EVMC_INVALID_MEMORY_ACCESS);
184+
185+ execute (code, " ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" _hex);
186+ EXPECT_STATUS (EVMC_INVALID_MEMORY_ACCESS);
187+ }
188+
189+ TEST_P (evm, eof1_dataloadn)
190+ {
191+ // Data instructions are not implemented in Advanced.
192+ if (is_advanced ())
193+ return ;
194+
195+ rev = EVMC_CANCUN;
196+ const auto data = bytes (8 , 0x0 ) + bytes (8 , 0x11 ) + bytes (8 , 0x22 ) + bytes (8 , 0x33 ) +
197+ bytes (8 , 0xaa ) + bytes (8 , 0xbb ) + bytes (8 , 0xcc ) + bytes (8 , 0xdd ) +
198+ bytes (8 , 0xee );
199+
200+ auto code = eof1_bytecode (bytecode (OP_DATALOADN) + Opcode (0 ) + Opcode (0 ) + ret_top (), 2 , data);
201+ execute (code);
202+ EXPECT_STATUS (EVMC_SUCCESS);
203+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
204+ " 0000000000000000111111111111111122222222222222223333333333333333" _hex);
205+
206+ code = eof1_bytecode (bytecode (OP_DATALOADN) + Opcode (0 ) + Opcode (1 ) + ret_top (), 2 , data);
207+ execute (code);
208+ EXPECT_STATUS (EVMC_SUCCESS);
209+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
210+ " aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd" _hex);
211+ }
212+
213+ TEST_P (evm, eof1_datasize)
214+ {
215+ // Data instructions are not implemented in Advanced.
216+ if (is_advanced ())
217+ return ;
218+
219+ rev = EVMC_CANCUN;
220+
221+ // no data section
222+ auto code = eof1_bytecode (bytecode (OP_DATASIZE) + ret_top (), 2 );
223+ execute (code);
224+ EXPECT_STATUS (EVMC_SUCCESS);
225+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
226+ " 0000000000000000000000000000000000000000000000000000000000000000" _hex);
227+
228+ bytes data = {0x0 };
229+ code = eof1_bytecode (bytecode (OP_DATASIZE) + ret_top (), 2 , data);
230+ execute (code);
231+ EXPECT_STATUS (EVMC_SUCCESS);
232+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
233+ " 0000000000000000000000000000000000000000000000000000000000000001" _hex);
234+
235+ data = bytes (32 , 0x0 );
236+ code = eof1_bytecode (bytecode (OP_DATASIZE) + ret_top (), 2 , data);
237+ execute (code);
238+ EXPECT_STATUS (EVMC_SUCCESS);
239+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
240+ " 0000000000000000000000000000000000000000000000000000000000000020" _hex);
241+
242+ data = bytes (64 , 0x0 );
243+ code = eof1_bytecode (bytecode (OP_DATASIZE) + ret_top (), 2 , data);
244+ execute (code);
245+ EXPECT_STATUS (EVMC_SUCCESS);
246+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
247+ " 0000000000000000000000000000000000000000000000000000000000000040" _hex);
248+
249+ data = bytes (80 , 0x0 );
250+ code = eof1_bytecode (bytecode (OP_DATASIZE) + ret_top (), 2 , data);
251+ execute (code);
252+ EXPECT_STATUS (EVMC_SUCCESS);
253+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
254+ " 0000000000000000000000000000000000000000000000000000000000000050" _hex);
255+ }
256+
257+ TEST_P (evm, eof1_datacopy)
258+ {
259+ // Data instructions are not implemented in Advanced.
260+ if (is_advanced ())
261+ return ;
262+
263+ rev = EVMC_CANCUN;
264+ const auto data = bytes (8 , 0x0 ) + bytes (8 , 0x11 ) + bytes (8 , 0x22 ) + bytes (8 , 0x33 ) +
265+ bytes (8 , 0xaa ) + bytes (8 , 0xbb ) + bytes (8 , 0xcc ) + bytes (8 , 0xdd );
266+
267+ auto code =
268+ eof1_bytecode (bytecode (1 ) + 0 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
269+ execute (code);
270+ EXPECT_STATUS (EVMC_SUCCESS);
271+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
272+ " 0000000000000000000000000000000000000000000000000000000000000000" _hex);
273+
274+ code = eof1_bytecode (bytecode (1 ) + 8 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
275+ execute (code);
276+ EXPECT_STATUS (EVMC_SUCCESS);
277+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
278+ " 1100000000000000000000000000000000000000000000000000000000000000" _hex);
279+
280+ code = eof1_bytecode (bytecode (1 ) + 63 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
281+ execute (code);
282+ EXPECT_STATUS (EVMC_SUCCESS);
283+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
284+ " dd00000000000000000000000000000000000000000000000000000000000000" _hex);
285+
286+ code = eof1_bytecode (bytecode (0 ) + 64 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
287+ execute (code);
288+ EXPECT_STATUS (EVMC_SUCCESS);
289+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
290+ " 0000000000000000000000000000000000000000000000000000000000000000" _hex);
291+
292+ code = eof1_bytecode (bytecode (16 ) + 8 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
293+ execute (code);
294+ EXPECT_STATUS (EVMC_SUCCESS);
295+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
296+ " 1111111111111111222222222222222200000000000000000000000000000000" _hex);
297+
298+ code = eof1_bytecode (bytecode (32 ) + 8 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
299+ execute (code);
300+ EXPECT_STATUS (EVMC_SUCCESS);
301+ EXPECT_EQ (bytes_view (result.output_data , result.output_size ),
302+ " 111111111111111122222222222222223333333333333333aaaaaaaaaaaaaaaa" _hex);
303+
304+ code = eof1_bytecode (bytecode (8 ) + 63 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
305+ execute (code);
306+ EXPECT_STATUS (EVMC_INVALID_MEMORY_ACCESS);
307+
308+ code = eof1_bytecode (bytecode (0 ) + 65 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top (), 3 , data);
309+ execute (code);
310+ EXPECT_STATUS (EVMC_INVALID_MEMORY_ACCESS);
311+ }
0 commit comments