1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
26using simulation::ContractInstanceRetrievalEvent;
27using simulation::EventEmitter;
28using tracegen::ContractInstanceRetrievalTraceBuilder;
29using tracegen::PrecomputedTraceBuilder;
30using tracegen::TestTraceContainer;
36ContractInstance create_test_contract_instance(uint32_t salt_value = 123)
38 return ContractInstance{
39 .salt =
FF(salt_value),
40 .deployer_addr =
FF(0x123456789ULL),
41 .current_class_id =
FF(0xdeadbeefULL),
42 .original_class_id =
FF(0xcafebabeULL),
43 .initialisation_hash =
FF(0x11111111ULL),
46 .nullifier_key = {
FF(0x100),
FF(0x101) },
47 .incoming_viewing_key = {
FF(0x200),
FF(0x201) },
48 .outgoing_viewing_key = {
FF(0x300),
FF(0x301) },
49 .tagging_key = {
FF(0x400),
FF(0x401) },
54TEST(ContractInstanceRetrievalConstrainingTest, EmptyRow)
59TEST(ContractInstanceRetrievalConstrainingTest, CompleteValidTrace)
63 const auto nullifier_tree_root =
FF(0xaabbccdd);
64 const auto public_data_tree_root =
FF(0xeeff1122);
67 const auto salt =
FF(0x555);
68 const auto deployer_addr =
FF(0x123456789ULL);
71 const auto init_hash =
FF(0x11111111ULL);
72 const auto nullifier_key_x =
FF(0x100);
73 const auto nullifier_key_y =
FF(0x101);
74 const auto incoming_viewing_key_x =
FF(0x200);
75 const auto incoming_viewing_key_y =
FF(0x201);
76 const auto outgoing_viewing_key_x =
FF(0x300);
77 const auto outgoing_viewing_key_y =
FF(0x301);
78 const auto tagging_key_x =
FF(0x400);
79 const auto tagging_key_y =
FF(0x401);
82 TestTraceContainer
trace({
83 { { C::precomputed_first_row, 1 } },
84 { { C::contract_instance_retrieval_sel, 1 },
86 { C::contract_instance_retrieval_exists,
exists ? 1 : 0 },
87 { C::contract_instance_retrieval_salt, salt },
88 { C::contract_instance_retrieval_deployer_addr, deployer_addr },
91 { C::contract_instance_retrieval_init_hash, init_hash },
92 { C::contract_instance_retrieval_public_data_tree_root, public_data_tree_root },
93 { C::contract_instance_retrieval_nullifier_tree_root, nullifier_tree_root },
94 { C::contract_instance_retrieval_nullifier_key_x, nullifier_key_x },
95 { C::contract_instance_retrieval_nullifier_key_y, nullifier_key_y },
96 { C::contract_instance_retrieval_incoming_viewing_key_x, incoming_viewing_key_x },
97 { C::contract_instance_retrieval_incoming_viewing_key_y, incoming_viewing_key_y },
98 { C::contract_instance_retrieval_outgoing_viewing_key_x, outgoing_viewing_key_x },
99 { C::contract_instance_retrieval_outgoing_viewing_key_y, outgoing_viewing_key_y },
100 { C::contract_instance_retrieval_tagging_key_x, tagging_key_x },
101 { C::contract_instance_retrieval_tagging_key_y, tagging_key_y },
102 { C::contract_instance_retrieval_deployer_protocol_contract_address, deployer_contract_address } },
105 check_relation<contract_instance_retrieval>(
trace);
108TEST(ContractInstanceRetrievalConstrainingTest, MultipleInstancesTrace)
111 const auto num_instances = 3;
112 const auto base_address = 0x1000;
113 const auto base_nullifier_tree_root = 0x2000;
114 const auto base_public_data_tree_root = 0x3000;
115 const auto base_salt = 100;
122 trace_data.push_back({ { C::precomputed_first_row, 1 } });
125 for (uint32_t i = 0; i < num_instances; i++) {
126 auto contract_instance = create_test_contract_instance(base_salt + i);
128 trace_data.push_back({
129 { C::contract_instance_retrieval_sel, 1 },
130 { C::contract_instance_retrieval_address,
FF(base_address + i) },
131 { C::contract_instance_retrieval_exists, 1 },
132 { C::contract_instance_retrieval_salt, contract_instance.salt },
133 { C::contract_instance_retrieval_deployer_addr, contract_instance.deployer_addr },
134 { C::contract_instance_retrieval_current_class_id, contract_instance.current_class_id },
135 { C::contract_instance_retrieval_original_class_id, contract_instance.original_class_id },
136 { C::contract_instance_retrieval_init_hash, contract_instance.initialisation_hash },
137 { C::contract_instance_retrieval_public_data_tree_root,
FF(base_public_data_tree_root + i) },
138 { C::contract_instance_retrieval_nullifier_tree_root,
FF(base_nullifier_tree_root + i) },
139 { C::contract_instance_retrieval_nullifier_key_x, contract_instance.public_keys.nullifier_key.x },
140 { C::contract_instance_retrieval_nullifier_key_y, contract_instance.public_keys.nullifier_key.y },
141 { C::contract_instance_retrieval_incoming_viewing_key_x,
142 contract_instance.public_keys.incoming_viewing_key.x },
143 { C::contract_instance_retrieval_incoming_viewing_key_y,
144 contract_instance.public_keys.incoming_viewing_key.y },
145 { C::contract_instance_retrieval_outgoing_viewing_key_x,
146 contract_instance.public_keys.outgoing_viewing_key.x },
147 { C::contract_instance_retrieval_outgoing_viewing_key_y,
148 contract_instance.public_keys.outgoing_viewing_key.y },
149 { C::contract_instance_retrieval_tagging_key_x, contract_instance.public_keys.tagging_key.x },
150 { C::contract_instance_retrieval_tagging_key_y, contract_instance.public_keys.tagging_key.y },
151 { C::contract_instance_retrieval_deployer_protocol_contract_address, deployer_contract_address },
155 TestTraceContainer
trace(trace_data);
156 check_relation<contract_instance_retrieval>(
trace);
159TEST(ContractInstanceRetrievalConstrainingTest, NonExistentInstanceTrace)
163 const auto nullifier_tree_root =
FF(0xffffff);
164 const auto public_data_tree_root =
FF(0xeeeeee);
166 const auto exists =
false;
169 TestTraceContainer
trace({
170 { { C::precomputed_first_row, 1 } },
171 { { C::contract_instance_retrieval_sel, 1 },
173 { C::contract_instance_retrieval_exists,
exists ? 1 : 0 },
174 { C::contract_instance_retrieval_salt, 0 },
175 { C::contract_instance_retrieval_deployer_addr, 0 },
176 { C::contract_instance_retrieval_current_class_id, 0 },
177 { C::contract_instance_retrieval_original_class_id, 0 },
178 { C::contract_instance_retrieval_init_hash, 0 },
179 { C::contract_instance_retrieval_public_data_tree_root, public_data_tree_root },
180 { C::contract_instance_retrieval_nullifier_tree_root, nullifier_tree_root },
181 { C::contract_instance_retrieval_deployer_protocol_contract_address, deployer_contract_address } },
184 check_relation<contract_instance_retrieval>(
trace);
188 trace.
set(C::contract_instance_retrieval_deployer_addr, 1, 1);
190 "INSTANCE_MEMBER_DEPLOYER_IS_ZERO_IF_DNE");
192 trace.
set(C::contract_instance_retrieval_deployer_addr, 1, 0);
194 trace.
set(C::contract_instance_retrieval_current_class_id, 1, 1);
196 "INSTANCE_MEMBER_CLASS_ID_IS_ZERO_IF_DNE");
198 trace.
set(C::contract_instance_retrieval_current_class_id, 1, 0);
200 trace.
set(C::contract_instance_retrieval_original_class_id, 1, 1);
202 "INSTANCE_MEMBER_ORIGINAL_CLASS_ID_IS_ZERO_IF_DNE");
204 trace.
set(C::contract_instance_retrieval_original_class_id, 1, 0);
206 trace.
set(C::contract_instance_retrieval_init_hash, 1, 1);
208 "INSTANCE_MEMBER_INIT_HASH_IS_ZERO_IF_DNE");
210 trace.
set(C::contract_instance_retrieval_init_hash, 1, 0);
213TEST(ContractInstanceRetrievalConstrainingTest, MaximumFieldValuesTrace)
216 const auto max_field =
FF(-1);
220 TestTraceContainer
trace({
221 { { C::precomputed_first_row, 1 } },
222 { { C::contract_instance_retrieval_sel, 1 },
223 { C::contract_instance_retrieval_address, max_field },
224 { C::contract_instance_retrieval_exists, 1 },
225 { C::contract_instance_retrieval_salt, max_field },
226 { C::contract_instance_retrieval_deployer_addr, max_field },
227 { C::contract_instance_retrieval_current_class_id, max_field },
228 { C::contract_instance_retrieval_original_class_id, max_field },
229 { C::contract_instance_retrieval_init_hash, max_field },
230 { C::contract_instance_retrieval_public_data_tree_root, max_field },
231 { C::contract_instance_retrieval_nullifier_tree_root, max_field },
232 { C::contract_instance_retrieval_nullifier_key_x, max_field },
233 { C::contract_instance_retrieval_nullifier_key_y, max_field },
234 { C::contract_instance_retrieval_incoming_viewing_key_x, max_field },
235 { C::contract_instance_retrieval_incoming_viewing_key_y, max_field },
236 { C::contract_instance_retrieval_outgoing_viewing_key_x, max_field },
237 { C::contract_instance_retrieval_outgoing_viewing_key_y, max_field },
238 { C::contract_instance_retrieval_tagging_key_x, max_field },
239 { C::contract_instance_retrieval_tagging_key_y, max_field },
240 { C::contract_instance_retrieval_deployer_protocol_contract_address, deployer_contract_address } },
243 check_relation<contract_instance_retrieval>(
trace);
247TEST(ContractInstanceRetrievalConstrainingTest, IntegrationTracegenValidInstance)
251 const auto timestamp = 12345;
252 const auto nullifier_tree_root =
FF(0xaabbccdd);
253 const auto public_data_tree_root =
FF(0xeeff1122);
254 const auto deployment_nullifier =
FF(0x7777);
258 EventEmitter<ContractInstanceRetrievalEvent> emitter;
259 auto contract_instance = create_test_contract_instance();
262 .contract_instance = contract_instance,
263 .nullifier_tree_root = nullifier_tree_root,
264 .public_data_tree_root = public_data_tree_root,
265 .deployment_nullifier = deployment_nullifier,
266 .nullifier_exists =
true,
267 .deployer_protocol_contract_address = deployer_protocol_contract_address,
271 auto events = emitter.dump_events();
273 TestTraceContainer
trace;
274 ContractInstanceRetrievalTraceBuilder
builder;
284 auto contract_instance_data = create_test_contract_instance();
289 { C::nullifier_check_sel, 1 },
290 { C::nullifier_check_exists, 1 },
292 { C::nullifier_check_root, nullifier_tree_root },
293 { C::nullifier_check_address, deployer_protocol_contract_address },
294 { C::nullifier_check_should_silo, 1 },
296 { C::address_derivation_sel, 1 },
298 { C::address_derivation_salt, contract_instance_data.salt },
299 { C::address_derivation_deployer_addr, contract_instance_data.deployer_addr },
300 { C::address_derivation_class_id, contract_instance_data.original_class_id },
301 { C::address_derivation_init_hash, contract_instance_data.initialisation_hash },
302 { C::address_derivation_nullifier_key_x, contract_instance_data.public_keys.nullifier_key.x },
303 { C::address_derivation_nullifier_key_y, contract_instance_data.public_keys.nullifier_key.y },
304 { C::address_derivation_incoming_viewing_key_x, contract_instance_data.public_keys.incoming_viewing_key.x },
305 { C::address_derivation_incoming_viewing_key_y, contract_instance_data.public_keys.incoming_viewing_key.y },
306 { C::address_derivation_outgoing_viewing_key_x, contract_instance_data.public_keys.outgoing_viewing_key.x },
307 { C::address_derivation_outgoing_viewing_key_y, contract_instance_data.public_keys.outgoing_viewing_key.y },
308 { C::address_derivation_tagging_key_x, contract_instance_data.public_keys.tagging_key.x },
309 { C::address_derivation_tagging_key_y, contract_instance_data.public_keys.tagging_key.y },
311 { C::update_check_sel, 1 },
313 { C::update_check_current_class_id, contract_instance_data.current_class_id },
314 { C::update_check_original_class_id, contract_instance_data.original_class_id },
315 { C::update_check_public_data_tree_root, public_data_tree_root },
316 { C::update_check_timestamp, timestamp },
319 check_relation<contract_instance_retrieval>(
trace);
326 check_interaction<ContractInstanceRetrievalTraceBuilder, lookup_contract_instance_retrieval_update_check_settings>(
330TEST(ContractInstanceRetrievalConstrainingTest, IntegrationTracegenNonExistentInstance)
334 const auto timestamp = 99999;
335 const auto nullifier_tree_root =
FF(0xffffff);
336 const auto public_data_tree_root =
FF(0xeeeeee);
337 const auto deployment_nullifier =
FF(0x8888);
341 EventEmitter<ContractInstanceRetrievalEvent> emitter;
344 .contract_instance = {},
345 .nullifier_tree_root = nullifier_tree_root,
346 .public_data_tree_root = public_data_tree_root,
347 .deployment_nullifier = deployment_nullifier,
348 .nullifier_exists =
false,
349 .deployer_protocol_contract_address = deployer_protocol_contract_address,
353 auto events = emitter.dump_events();
355 TestTraceContainer
trace;
356 ContractInstanceRetrievalTraceBuilder
builder;
367 { C::nullifier_check_sel, 1 },
368 { C::nullifier_check_exists, 0 },
370 { C::nullifier_check_root, nullifier_tree_root },
371 { C::nullifier_check_address, deployer_protocol_contract_address },
372 { C::nullifier_check_should_silo, 1 },
374 { C::address_derivation_sel, 0 },
376 { C::address_derivation_salt, 0 },
377 { C::address_derivation_deployer_addr, 0 },
378 { C::address_derivation_class_id, 0 },
379 { C::address_derivation_init_hash, 0 },
380 { C::address_derivation_nullifier_key_x, 0 },
381 { C::address_derivation_nullifier_key_y, 0 },
382 { C::address_derivation_incoming_viewing_key_x, 0 },
383 { C::address_derivation_incoming_viewing_key_y, 0 },
384 { C::address_derivation_outgoing_viewing_key_x, 0 },
385 { C::address_derivation_outgoing_viewing_key_y, 0 },
386 { C::address_derivation_tagging_key_x, 0 },
387 { C::address_derivation_tagging_key_y, 0 },
389 { C::update_check_sel, 0 },
391 { C::update_check_current_class_id, 0 },
392 { C::update_check_original_class_id, 0 },
393 { C::update_check_public_data_tree_root, public_data_tree_root },
394 { C::update_check_timestamp, timestamp },
397 check_relation<contract_instance_retrieval>(
trace);
404 check_interaction<ContractInstanceRetrievalTraceBuilder, lookup_contract_instance_retrieval_update_check_settings>(
408TEST(ContractInstanceRetrievalConstrainingTest, IntegrationTracegenMultipleInstances)
411 const auto num_instances = 3;
412 const auto base_address = 0x1000;
413 const auto base_timestamp = 1000;
414 const auto base_nullifier_tree_root = 0x2000;
415 const auto base_public_data_tree_root = 0x3000;
416 const auto base_salt = 100;
420 EventEmitter<ContractInstanceRetrievalEvent> emitter;
422 for (uint32_t i = 0; i < num_instances; i++) {
423 auto contract_instance = create_test_contract_instance(base_salt + i);
425 ContractInstanceRetrievalEvent
event = { .address =
FF(base_address + i),
426 .contract_instance = contract_instance,
427 .nullifier_tree_root =
FF(base_nullifier_tree_root + i),
428 .public_data_tree_root =
FF(base_public_data_tree_root + i),
429 .deployment_nullifier =
FF(base_address + i),
430 .nullifier_exists =
true,
431 .deployer_protocol_contract_address =
432 deployer_protocol_contract_address,
438 auto events = emitter.dump_events();
440 TestTraceContainer
trace;
441 ContractInstanceRetrievalTraceBuilder
builder;
451 for (uint32_t i = 0; i < num_instances; i++) {
452 auto contract_instance_data = create_test_contract_instance(base_salt + i);
453 uint32_t row = i + 1;
457 { { { C::nullifier_check_sel, 1 },
458 { C::nullifier_check_exists,
true },
459 { C::nullifier_check_nullifier,
FF(base_address + i) },
460 { C::nullifier_check_root,
FF(base_nullifier_tree_root + i) },
461 { C::nullifier_check_address, deployer_protocol_contract_address },
462 { C::nullifier_check_should_silo, 1 },
464 { C::address_derivation_sel, 1 },
465 { C::address_derivation_address,
FF(base_address + i) },
466 { C::address_derivation_salt, contract_instance_data.salt },
467 { C::address_derivation_deployer_addr, contract_instance_data.deployer_addr },
468 { C::address_derivation_class_id, contract_instance_data.original_class_id },
469 { C::address_derivation_init_hash, contract_instance_data.initialisation_hash },
470 { C::address_derivation_nullifier_key_x, contract_instance_data.public_keys.nullifier_key.x },
471 { C::address_derivation_nullifier_key_y, contract_instance_data.public_keys.nullifier_key.y },
472 { C::address_derivation_incoming_viewing_key_x,
473 contract_instance_data.public_keys.incoming_viewing_key.x },
474 { C::address_derivation_incoming_viewing_key_y,
475 contract_instance_data.public_keys.incoming_viewing_key.y },
476 { C::address_derivation_outgoing_viewing_key_x,
477 contract_instance_data.public_keys.outgoing_viewing_key.x },
478 { C::address_derivation_outgoing_viewing_key_y,
479 contract_instance_data.public_keys.outgoing_viewing_key.y },
480 { C::address_derivation_tagging_key_x, contract_instance_data.public_keys.tagging_key.x },
481 { C::address_derivation_tagging_key_y, contract_instance_data.public_keys.tagging_key.y },
483 { C::update_check_sel, 1 },
484 { C::update_check_address,
FF(base_address + i) },
485 { C::update_check_current_class_id, contract_instance_data.current_class_id },
486 { C::update_check_original_class_id, contract_instance_data.original_class_id },
487 { C::update_check_public_data_tree_root,
FF(base_public_data_tree_root + i) },
488 { C::update_check_timestamp, base_timestamp + i },
492 check_relation<contract_instance_retrieval>(
trace);
499 check_interaction<ContractInstanceRetrievalTraceBuilder, lookup_contract_instance_retrieval_update_check_settings>(
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_TIMESTAMP_ROW_IDX
#define CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
AztecAddress contract_address
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()
lookup_settings< lookup_contract_instance_retrieval_address_derivation_settings_ > lookup_contract_instance_retrieval_address_derivation_settings
lookup_settings< lookup_contract_instance_retrieval_deployment_nullifier_read_settings_ > lookup_contract_instance_retrieval_deployment_nullifier_read_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
simulation::PublicDataTreeReadWriteEvent event