3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
15using ::testing::ElementsAre;
16using ::testing::Return;
17using ::testing::StrictMock;
23TEST(AvmSimulationNoteHashTree, Exists)
31 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
32 AppendOnlyTreeSnapshot snapshot = {
34 .next_available_leaf_index = 128,
38 uint64_t leaf_index = 30;
41 .WillRepeatedly(Return());
43 EXPECT_TRUE(note_hash_tree_check.note_hash_exists(
note_hash,
note_hash, leaf_index, sibling_path, snapshot));
44 EXPECT_FALSE(note_hash_tree_check.note_hash_exists(27,
note_hash, leaf_index, sibling_path, snapshot));
47 NoteHashTreeReadWriteEvent{
50 .leaf_index = leaf_index,
51 .prev_snapshot = snapshot,
53 NoteHashTreeReadWriteEvent{
56 .leaf_index = leaf_index,
57 .prev_snapshot = snapshot,
61TEST(AvmSimulationNoteHashTree, WriteUnique)
69 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
70 AppendOnlyTreeSnapshot snapshot = {
72 .next_available_leaf_index = 128,
75 uint64_t note_hash_counter = 10;
76 FF next_root = 234567;
78 EXPECT_CALL(merkle_check,
80 .WillOnce(Return(next_root));
82 AppendOnlyTreeSnapshot next_snapshot =
83 note_hash_tree_check.append_unique_note_hash(
note_hash, note_hash_counter, sibling_path, snapshot);
85 EXPECT_EQ(next_snapshot.next_available_leaf_index, snapshot.next_available_leaf_index + 1);
86 NoteHashTreeReadWriteEvent expect_event = { .note_hash =
note_hash,
87 .leaf_index = snapshot.next_available_leaf_index,
88 .prev_snapshot = snapshot,
89 .append_data = NoteHashAppendData{
90 .note_hash_counter = note_hash_counter,
91 .next_snapshot = next_snapshot,
93 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
96TEST(AvmSimulationNoteHashTree, WriteSiloed)
105 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
106 AppendOnlyTreeSnapshot snapshot = {
108 .next_available_leaf_index = 128,
110 FF siloed_note_hash = 42;
111 uint64_t note_hash_counter = 10;
113 FF unique_note_hash = 44;
115 FF next_root = 234567;
118 EXPECT_CALL(
poseidon2, hash(nonce_hash_inputs)).WillOnce(Return(nonce));
121 EXPECT_CALL(
poseidon2, hash(unique_note_hash_inputs)).WillOnce(Return(unique_note_hash));
126 .WillOnce(Return(next_root));
128 AppendOnlyTreeSnapshot next_snapshot =
129 note_hash_tree_check.append_siloed_note_hash(siloed_note_hash, note_hash_counter, sibling_path, snapshot);
131 EXPECT_EQ(next_snapshot.next_available_leaf_index, snapshot.next_available_leaf_index + 1);
132 NoteHashTreeReadWriteEvent expect_event = { .note_hash = siloed_note_hash,
133 .leaf_index = snapshot.next_available_leaf_index,
134 .prev_snapshot = snapshot,
135 .append_data = NoteHashAppendData{
137 NoteHashUniquenessData{
139 .unique_note_hash = unique_note_hash,
142 .note_hash_counter = note_hash_counter,
143 .next_snapshot = next_snapshot,
145 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
148TEST(AvmSimulationNoteHashTree, WriteRaw)
157 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
158 AppendOnlyTreeSnapshot snapshot = {
160 .next_available_leaf_index = 128,
163 FF raw_note_hash = 37;
166 FF siloed_note_hash = 42;
168 uint64_t note_hash_counter = 10;
170 FF unique_note_hash = 44;
172 FF next_root = 234567;
175 EXPECT_CALL(
poseidon2, hash(siloed_note_hash_inputs)).WillOnce(Return(siloed_note_hash));
178 EXPECT_CALL(
poseidon2, hash(nonce_hash_inputs)).WillOnce(Return(nonce));
181 EXPECT_CALL(
poseidon2, hash(unique_note_hash_inputs)).WillOnce(Return(unique_note_hash));
186 .WillOnce(Return(next_root));
188 AppendOnlyTreeSnapshot next_snapshot = note_hash_tree_check.append_note_hash(
189 raw_note_hash, contract_address, note_hash_counter, sibling_path, snapshot);
191 EXPECT_EQ(next_snapshot.next_available_leaf_index, snapshot.next_available_leaf_index + 1);
192 NoteHashTreeReadWriteEvent expect_event = { .note_hash = raw_note_hash,
193 .leaf_index = snapshot.next_available_leaf_index,
194 .prev_snapshot = snapshot,
195 .append_data = NoteHashAppendData{
198 .siloed_note_hash = siloed_note_hash,
199 .address = contract_address,
202 NoteHashUniquenessData{
204 .unique_note_hash = unique_note_hash,
207 .note_hash_counter = note_hash_counter,
208 .next_snapshot = next_snapshot,
210 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
213TEST(AvmSimulationNoteHashTree, CheckpointListener)
221 note_hash_tree_check.on_checkpoint_created();
222 note_hash_tree_check.on_checkpoint_committed();
223 note_hash_tree_check.on_checkpoint_reverted();
#define DOM_SEP__MERKLE_HASH
#define DOM_SEP__SILOED_NOTE_HASH
#define DOM_SEP__UNIQUE_NOTE_HASH
#define DOM_SEP__NOTE_HASH_NONCE
EventEmitter< DataCopyEvent > event_emitter
AVM range check gadget for witness generation.
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
void write(B &buf, field2< base_field, Params > const &value)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)