1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
24using simulation::EventEmitter;
25using simulation::GetContractInstanceEvent;
26using tracegen::GetContractInstanceTraceBuilder;
27using tracegen::PrecomputedTraceBuilder;
28using tracegen::TestTraceContainer;
33TEST(GetContractInstanceConstrainingTest, EmptyRow)
38TEST(GetContractInstanceConstrainingTest, WriteInBoundsCheck)
41 const FF dst_offset =
FF(100);
43 const FF dst_offset_diff_max_inv = dst_offset_diff_max.invert();
44 const FF wrong_inv_value =
FF(42);
46 TestTraceContainer
trace({
47 { { C::precomputed_first_row, 1 } },
48 { { C::get_contract_instance_sel, 1 },
49 { C::get_contract_instance_dst_offset, dst_offset },
50 { C::get_contract_instance_is_valid_writes_in_bounds, 1 },
51 { C::get_contract_instance_dst_offset_diff_max_inv, dst_offset_diff_max_inv } },
57 trace.
set(C::get_contract_instance_dst_offset_diff_max_inv, 1, wrong_inv_value);
60 "WRITE_OUT_OF_BOUNDS_CHECK");
62 trace.
set(C::get_contract_instance_dst_offset_diff_max_inv, 1, dst_offset_diff_max_inv);
65 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 0);
68 "WRITE_OUT_OF_BOUNDS_CHECK");
70 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 1);
73TEST(GetContractInstanceConstrainingTest, WriteOutOfBoundsCheck)
77 const FF dst_offset_diff_max_inv =
FF(0);
79 TestTraceContainer
trace({
80 { { C::precomputed_first_row, 1 } },
81 { { C::get_contract_instance_sel, 1 },
82 { C::get_contract_instance_dst_offset, dst_offset },
83 { C::get_contract_instance_is_valid_writes_in_bounds, 0 },
84 { C::get_contract_instance_dst_offset_diff_max_inv, dst_offset_diff_max_inv } },
90 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 1);
93 "WRITE_OUT_OF_BOUNDS_CHECK");
95 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 0);
98TEST(GetContractInstanceConstrainingTest, ErrorAggregationConstraint)
101 TestTraceContainer
trace({
102 { { C::precomputed_first_row, 1 } },
104 { { C::get_contract_instance_sel, 1 },
105 { C::get_contract_instance_sel_error, 0 },
106 { C::get_contract_instance_is_valid_writes_in_bounds, 1 },
107 { C::get_contract_instance_is_valid_member_enum, 1 } },
113 trace.
set(C::get_contract_instance_sel_error, 1, 1);
114 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 0);
118 trace.
set(C::get_contract_instance_sel_error, 1, 1);
119 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 1);
120 trace.
set(C::get_contract_instance_is_valid_member_enum, 1, 0);
124 trace.
set(C::get_contract_instance_sel_error, 1, 1);
125 trace.
set(C::get_contract_instance_is_valid_writes_in_bounds, 1, 0);
126 trace.
set(C::get_contract_instance_is_valid_member_enum, 1, 0);
130 trace.
set(C::get_contract_instance_sel_error, 1, 0);
132 "ERROR_AGGREGATION");
135TEST(GetContractInstanceConstrainingTest, SelectedMemberConstraint)
138 const FF deployer_addr = 0x1234;
139 const FF class_id = 0x5678;
140 const FF init_hash = 0x9ABC;
141 const FF wrong_value = 0x1111;
144 TestTraceContainer
trace({
145 { { C::precomputed_first_row, 1 } },
147 { { C::get_contract_instance_sel, 1 },
148 { C::get_contract_instance_selected_member, deployer_addr },
149 { C::get_contract_instance_is_deployer, 1 },
150 { C::get_contract_instance_is_class_id, 0 },
151 { C::get_contract_instance_is_init_hash, 0 },
152 { C::get_contract_instance_retrieved_deployer_addr, deployer_addr },
153 { C::get_contract_instance_retrieved_class_id, class_id },
154 { C::get_contract_instance_retrieved_init_hash, init_hash } },
160 trace.
set(C::get_contract_instance_selected_member, 1, class_id);
161 trace.
set(C::get_contract_instance_is_deployer, 1, 0);
162 trace.
set(C::get_contract_instance_is_class_id, 1, 1);
166 trace.
set(C::get_contract_instance_selected_member, 1, init_hash);
167 trace.
set(C::get_contract_instance_is_class_id, 1, 0);
168 trace.
set(C::get_contract_instance_is_init_hash, 1, 1);
172 trace.
set(C::get_contract_instance_selected_member, 1, wrong_value);
177TEST(GetContractInstanceConstrainingTest, ComplexMultiRowSequence)
180 const uint32_t dst_offset_1 = 100;
181 const uint32_t dst_offset_2 = 200;
182 const uint32_t dst_offset_3 = 300;
183 const uint8_t deployer_enum = 0;
184 const uint8_t class_id_enum = 1;
185 const uint8_t invalid_enum = 5;
186 const FF deployer_addr_1 = 0x1234;
187 const FF class_id_1 = 0x5678;
188 const FF init_hash_1 = 0x9ABC;
189 const FF deployer_addr_2 = 0x1111;
190 const FF class_id_2 = 0x2222;
191 const FF init_hash_2 = 0x3333;
192 const FF deployer_addr_3 = 0x4444;
193 const FF class_id_3 = 0x5555;
194 const FF init_hash_3 = 0x6666;
195 const uint32_t member_write_offset_1 = 101;
196 const uint32_t member_write_offset_2 = 201;
197 const uint32_t member_write_offset_3 = 301;
198 const uint8_t u1_tag =
static_cast<uint8_t
>(
ValueTag::U1);
199 const uint8_t ff_tag =
static_cast<uint8_t
>(
ValueTag::FF);
202 TestTraceContainer
trace({
203 { { C::precomputed_first_row, 1 } },
205 { { C::get_contract_instance_sel, 0 } },
207 { { C::get_contract_instance_sel, 1 },
208 { C::get_contract_instance_dst_offset, dst_offset_1 },
209 { C::get_contract_instance_member_enum, deployer_enum },
210 { C::get_contract_instance_is_valid_writes_in_bounds, 1 },
212 { C::get_contract_instance_sel_error, 0 },
213 { C::get_contract_instance_is_valid_member_enum, 1 },
214 { C::get_contract_instance_is_deployer, 1 },
215 { C::get_contract_instance_is_class_id, 0 },
216 { C::get_contract_instance_is_init_hash, 0 },
217 { C::get_contract_instance_retrieved_deployer_addr, deployer_addr_1 },
218 { C::get_contract_instance_retrieved_class_id, class_id_1 },
219 { C::get_contract_instance_retrieved_init_hash, init_hash_1 },
220 { C::get_contract_instance_selected_member, deployer_addr_1 },
221 { C::get_contract_instance_member_write_offset, member_write_offset_1 },
222 { C::get_contract_instance_exists_tag, u1_tag },
223 { C::get_contract_instance_member_tag, ff_tag } },
225 { { C::get_contract_instance_sel, 1 },
226 { C::get_contract_instance_dst_offset, dst_offset_2 },
227 { C::get_contract_instance_member_enum, class_id_enum },
228 { C::get_contract_instance_is_valid_writes_in_bounds, 1 },
230 { C::get_contract_instance_sel_error, 0 },
231 { C::get_contract_instance_is_valid_member_enum, 1 },
232 { C::get_contract_instance_is_deployer, 0 },
233 { C::get_contract_instance_is_class_id, 1 },
234 { C::get_contract_instance_is_init_hash, 0 },
235 { C::get_contract_instance_retrieved_deployer_addr, deployer_addr_2 },
236 { C::get_contract_instance_retrieved_class_id, class_id_2 },
237 { C::get_contract_instance_retrieved_init_hash, init_hash_2 },
238 { C::get_contract_instance_selected_member, class_id_2 },
239 { C::get_contract_instance_member_write_offset, member_write_offset_2 },
240 { C::get_contract_instance_exists_tag, u1_tag },
241 { C::get_contract_instance_member_tag, ff_tag } },
243 { { C::get_contract_instance_sel, 1 },
244 { C::get_contract_instance_dst_offset, dst_offset_3 },
245 { C::get_contract_instance_member_enum, invalid_enum },
246 { C::get_contract_instance_is_valid_writes_in_bounds, 1 },
248 { C::get_contract_instance_sel_error, 1 },
249 { C::get_contract_instance_is_valid_member_enum, 0 },
250 { C::get_contract_instance_is_deployer, 0 },
251 { C::get_contract_instance_is_class_id, 0 },
252 { C::get_contract_instance_is_init_hash, 0 },
253 { C::get_contract_instance_retrieved_deployer_addr, deployer_addr_3 },
254 { C::get_contract_instance_retrieved_class_id, class_id_3 },
255 { C::get_contract_instance_retrieved_init_hash, init_hash_3 },
256 { C::get_contract_instance_selected_member, 0 },
257 { C::get_contract_instance_member_write_offset, member_write_offset_3 },
258 { C::get_contract_instance_exists_tag, u1_tag },
259 { C::get_contract_instance_member_tag, ff_tag } },
262 check_relation<get_contract_instance>(
trace);
266TEST(GetContractInstanceConstrainingTest, IntegrationTracegenValid)
269 const uint32_t execution_clk = 42;
271 const uint32_t dst_offset = 100;
273 const uint32_t space_id = 1;
274 const FF nullifier_tree_root = 0x1234;
275 const FF public_data_tree_root = 0x5678;
276 const FF deployer_addr = 0x5678;
277 const FF class_id = 0x9ABC;
278 const FF init_hash = 0xDEF0;
281 EventEmitter<GetContractInstanceEvent> emitter;
283 GetContractInstanceEvent
event{
284 .execution_clk = execution_clk,
286 .dst_offset = dst_offset,
287 .member_enum = deployer_enum,
288 .space_id = space_id,
289 .nullifier_tree_root = nullifier_tree_root,
290 .public_data_tree_root = public_data_tree_root,
291 .instance_exists =
true,
292 .retrieved_deployer_addr = deployer_addr,
293 .retrieved_class_id = class_id,
294 .retrieved_init_hash = init_hash,
298 auto events = emitter.dump_events();
300 TestTraceContainer
trace;
301 GetContractInstanceTraceBuilder
builder;
308 check_relation<get_contract_instance>(
trace);
311TEST(GetContractInstanceConstrainingTest, IntegrationTracegenInvalidEnum)
314 const uint32_t execution_clk = 42;
316 const uint32_t dst_offset = 100;
317 const uint8_t invalid_enum = 200;
318 const uint32_t space_id = 1;
319 const FF nullifier_tree_root = 0x1234;
320 const FF public_data_tree_root = 0x5678;
321 const FF deployer_addr = 0x5678;
322 const FF class_id = 0x9ABC;
323 const FF init_hash = 0xDEF0;
326 EventEmitter<GetContractInstanceEvent> emitter;
328 GetContractInstanceEvent
event{
329 .execution_clk = execution_clk,
331 .dst_offset = dst_offset,
332 .member_enum = invalid_enum,
333 .space_id = space_id,
334 .nullifier_tree_root = nullifier_tree_root,
335 .public_data_tree_root = public_data_tree_root,
336 .instance_exists =
true,
337 .retrieved_deployer_addr = deployer_addr,
338 .retrieved_class_id = class_id,
339 .retrieved_init_hash = init_hash,
343 auto events = emitter.dump_events();
345 TestTraceContainer
trace;
346 GetContractInstanceTraceBuilder
builder;
353 check_relation<get_contract_instance>(
trace);
356TEST(GetContractInstanceConstrainingTest, IntegrationTracegenOutOfBounds)
359 const uint32_t execution_clk = 42;
363 const uint32_t space_id = 1;
364 const FF nullifier_tree_root = 0x1234;
365 const FF public_data_tree_root = 0x5678;
366 const FF deployer_addr = 0x5678;
367 const FF class_id = 0x9ABC;
368 const FF init_hash = 0xDEF0;
371 EventEmitter<GetContractInstanceEvent> emitter;
373 GetContractInstanceEvent
event{
374 .execution_clk = execution_clk,
376 .dst_offset = dst_offset,
377 .member_enum = class_id_enum,
378 .space_id = space_id,
379 .nullifier_tree_root = nullifier_tree_root,
380 .public_data_tree_root = public_data_tree_root,
381 .instance_exists =
true,
382 .retrieved_deployer_addr = deployer_addr,
383 .retrieved_class_id = class_id,
384 .retrieved_init_hash = init_hash,
388 auto events = emitter.dump_events();
390 TestTraceContainer
trace;
391 GetContractInstanceTraceBuilder
builder;
398 check_relation<get_contract_instance>(
trace);
#define AVM_HIGHEST_MEM_ADDRESS
static constexpr size_t SR_ERROR_AGGREGATION
static constexpr size_t SR_SELECTED_MEMBER
static constexpr size_t SR_WRITE_OUT_OF_BOUNDS_CHECK
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
AztecAddress contract_address
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
simulation::PublicDataTreeReadWriteEvent event