1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
28using ::testing::Return;
29using ::testing::StrictMock;
31using tracegen::AddressDerivationTraceBuilder;
32using tracegen::EccTraceBuilder;
33using tracegen::Poseidon2TraceBuilder;
34using tracegen::TestTraceContainer;
36using simulation::AddressDerivation;
37using simulation::AddressDerivationEvent;
40using simulation::EccAddEvent;
41using simulation::EccAddMemoryEvent;
42using simulation::EventEmitter;
43using simulation::FakeToRadix;
45using simulation::MockExecutionIdManager;
46using simulation::MockGreaterThan;
47using simulation::NoopEventEmitter;
48using simulation::Poseidon2;
49using simulation::Poseidon2HashEvent;
50using simulation::Poseidon2PermutationEvent;
51using simulation::Poseidon2PermutationMemoryEvent;
52using simulation::ScalarMulEvent;
62TEST(AddressDerivationConstrainingTest, EmptyRow)
67TEST(AddressDerivationConstrainingTest, Basic)
69 TestTraceContainer
trace;
70 AddressDerivationTraceBuilder
builder;
85 EmbeddedCurvePoint address_point = preaddress_public_key + instance.public_keys.incoming_viewing_key;
87 builder.process({ { .address = address_point.x(),
89 .salted_initialization_hash = salted_initialization_hash,
90 .partial_address = partial_address,
91 .public_keys_hash = public_keys_hash,
92 .preaddress = preaddress,
93 .preaddress_public_key = preaddress_public_key,
94 .address_point = address_point } },
98 check_relation<address_derivation_relation>(
trace);
101TEST(AddressDerivationConstrainingTest, WithInteractions)
103 EventEmitter<EccAddEvent> ecadd_event_emitter;
104 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
105 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
109 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
111 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
112 EXPECT_CALL(mock_exec_id_manager, get_execution_id)
113 .WillRepeatedly(Return(0));
114 StrictMock<MockGreaterThan>
mock_gt;
118 FakeToRadix to_radix_simulator;
119 Ecc ecc_simulator(mock_exec_id_manager,
123 scalar_mul_event_emitter,
124 ecc_add_memory_event_emitter);
126 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
129 { .precomputed_first_row = 1 },
132 AddressDerivationTraceBuilder
builder;
133 Poseidon2TraceBuilder poseidon2_builder;
134 EccTraceBuilder ecc_builder;
138 address_derivation.assert_derivation(address, instance);
140 builder.process(address_derivation_event_emitter.dump_events(),
trace);
142 ecc_builder.process_add(ecadd_event_emitter.dump_events(),
trace);
143 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(),
trace);
157 check_relation<address_derivation_relation>(
trace);
#define GENERATOR_INDEX__PARTIAL_ADDRESS
#define GENERATOR_INDEX__CONTRACT_ADDRESS_V1
static const StandardAffinePoint & one()
static TestTraceContainer from_rows(const std::vector< AvmFullRow > &rows)
uint32_t get_num_rows() const
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
NoopEventEmitter< Poseidon2PermutationEvent > perm_event_emitter
NoopEventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
NiceMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2HashEvent > hash_event_emitter
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
FF hash_public_keys(const PublicKeys &public_keys)
FF compute_contract_address(const ContractInstance &contract_instance)
ContractInstance random_contract_instance()
TestTraceContainer empty_trace()
lookup_settings< lookup_address_derivation_preaddress_scalar_mul_settings_ > lookup_address_derivation_preaddress_scalar_mul_settings
lookup_settings< lookup_address_derivation_address_ecadd_settings_ > lookup_address_derivation_address_ecadd_settings
lookup_settings< lookup_address_derivation_partial_address_poseidon2_settings_ > lookup_address_derivation_partial_address_poseidon2_settings
lookup_settings< lookup_address_derivation_salted_initialization_hash_poseidon2_1_settings_ > lookup_address_derivation_salted_initialization_hash_poseidon2_1_settings
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_4_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_4_settings
lookup_settings< lookup_address_derivation_preaddress_poseidon2_settings_ > lookup_address_derivation_preaddress_poseidon2_settings
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_3_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_3_settings
lookup_settings< lookup_address_derivation_salted_initialization_hash_poseidon2_0_settings_ > lookup_address_derivation_salted_initialization_hash_poseidon2_0_settings
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_2_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_2_settings
AvmFlavorSettings::G1::Fq Fq
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_0_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_0_settings
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_1_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_1_settings