4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
8#include "barretenberg/aztec/aztec_constants.hpp"
20using ::testing::IsEmpty;
21using ::testing::Return;
22using ::testing::SizeIs;
23using ::testing::StrictMock;
31using simulation::PurePoseidon2;
33TEST(AvmSimulationAddressDerivationTest, Positive)
35 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
36 PurePoseidon2
poseidon2 = PurePoseidon2();
37 StrictMock<MockEcc> ecc;
39 AddressDerivation address_derivation(
poseidon2, ecc, address_derivation_event_emitter);
42 AztecAddress derived_address = compute_contract_address(instance);
43 std::vector<FF> salted_init_hash_inputs = { DOM_SEP__SALTED_INITIALIZATION_HASH,
45 instance.initialization_hash,
47 instance.immutables_hash };
50 std::vector<FF> partial_address_inputs = { DOM_SEP__PARTIAL_ADDRESS,
51 instance.original_contract_class_id,
55 FF public_keys_hash = hash_public_keys(instance.public_keys);
57 std::vector<FF> preaddress_inputs = { DOM_SEP__CONTRACT_ADDRESS_V2, public_keys_hash, partial_address };
62 EXPECT_CALL(ecc, scalar_mul(
g1, preaddress)).WillOnce(Return(preaddress_public_key));
64 EmbeddedCurvePoint address_point = preaddress_public_key + instance.public_keys.incoming_viewing_key;
65 EXPECT_CALL(ecc, add(preaddress_public_key,
EmbeddedCurvePoint(instance.public_keys.incoming_viewing_key)))
66 .WillOnce(Return(address_point));
68 address_derivation.assert_derivation(derived_address, instance);
70 auto events = address_derivation_event_emitter.dump_events();
71 EXPECT_THAT(events, SizeIs(1));
72 EXPECT_EQ(events[0].instance, instance);
73 EXPECT_EQ(events[0].salted_initialization_hash, salted_init_hash);
74 EXPECT_EQ(events[0].partial_address, partial_address);
75 EXPECT_EQ(events[0].public_keys_hash, public_keys_hash);
76 EXPECT_EQ(events[0].preaddress, preaddress);
77 EXPECT_EQ(events[0].preaddress_public_key, preaddress_public_key);
78 EXPECT_EQ(events[0].
address, derived_address);
79 EXPECT_EQ(events[0].address_point.x(), derived_address);
82 address_derivation.assert_derivation(derived_address, instance);
83 events = address_derivation_event_emitter.dump_events();
84 EXPECT_THAT(events, IsEmpty());
87TEST(AvmSimulationAddressDerivationTest, Negative)
89 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
90 PurePoseidon2
poseidon2 = PurePoseidon2();
91 StrictMock<MockEcc> ecc;
93 AddressDerivation address_derivation(
poseidon2, ecc, address_derivation_event_emitter);
96 AztecAddress derived_address = compute_contract_address(instance);
98 std::vector<FF> salted_init_hash_inputs = { DOM_SEP__SALTED_INITIALIZATION_HASH,
100 instance.initialization_hash,
102 instance.immutables_hash };
105 std::vector<FF> partial_address_inputs = { DOM_SEP__PARTIAL_ADDRESS,
106 instance.original_contract_class_id,
110 FF public_keys_hash = hash_public_keys(instance.public_keys);
112 std::vector<FF> preaddress_inputs = { DOM_SEP__CONTRACT_ADDRESS_V2, public_keys_hash, partial_address };
117 EXPECT_CALL(ecc, scalar_mul(
g1, preaddress)).WillOnce(Return(preaddress_public_key));
119 EmbeddedCurvePoint address_point = preaddress_public_key + instance.public_keys.incoming_viewing_key;
120 EXPECT_CALL(ecc, add(preaddress_public_key,
EmbeddedCurvePoint(instance.public_keys.incoming_viewing_key)))
121 .WillOnce(Return(address_point));
124 EXPECT_THROW(address_derivation.assert_derivation(derived_address + 1, instance), std::runtime_error);
127 instance.public_keys.nullifier_key_hash =
FF(0xdeadbeef);
129 public_keys_hash = hash_public_keys(instance.public_keys);
130 preaddress_inputs = { DOM_SEP__CONTRACT_ADDRESS_V2, public_keys_hash, partial_address };
132 preaddress_public_key =
g1 *
Fq(preaddress);
133 address_point = preaddress_public_key + instance.public_keys.incoming_viewing_key;
135 EXPECT_CALL(ecc, scalar_mul(
g1, preaddress)).WillOnce(Return(preaddress_public_key));
136 EXPECT_CALL(ecc, add(preaddress_public_key,
EmbeddedCurvePoint(instance.public_keys.incoming_viewing_key)))
137 .WillOnce(Return(address_point));
140 EXPECT_THROW(address_derivation.assert_derivation(derived_address, instance), std::runtime_error);
141 EXPECT_THAT(address_derivation_event_emitter.dump_events(), IsEmpty());
144 EXPECT_CALL(ecc, scalar_mul(
g1, preaddress)).WillOnce(Return(preaddress_public_key));
145 EXPECT_CALL(ecc, add(preaddress_public_key,
EmbeddedCurvePoint(instance.public_keys.incoming_viewing_key)))
146 .WillOnce(Return(address_point));
148 address_derivation.assert_derivation(address_point.x(), instance);
149 EXPECT_THAT(address_derivation_event_emitter.dump_events(), SizeIs(1));
152 ContractInstance new_instance = instance;
153 new_instance.deployer += 1;
155 EXPECT_THROW(address_derivation.assert_derivation(address_point.x(), new_instance), std::runtime_error);
156 EXPECT_THAT(address_derivation_event_emitter.dump_events(), IsEmpty());
159 address_derivation.assert_derivation(address_point.x(), instance);
160 EXPECT_THAT(address_derivation_event_emitter.dump_events(), IsEmpty());
static const StandardAffinePoint & one()
Native Poseidon2 hash function implementation.
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
AVM range check gadget for witness generation.
ContractInstance random_contract_instance()
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)