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;
40 EXPECT_CALL(merkle_check, assert_membership(
note_hash, leaf_index, _, snapshot.root)).WillRepeatedly(Return());
42 EXPECT_TRUE(note_hash_tree_check.note_hash_exists(
note_hash,
note_hash, leaf_index, sibling_path, snapshot));
43 EXPECT_FALSE(note_hash_tree_check.note_hash_exists(27,
note_hash, leaf_index, sibling_path, snapshot));
46 NoteHashTreeReadWriteEvent{
49 .leaf_index = leaf_index,
50 .prev_snapshot = snapshot,
52 NoteHashTreeReadWriteEvent{
55 .leaf_index = leaf_index,
56 .prev_snapshot = snapshot,
60TEST(AvmSimulationNoteHashTree, WriteUnique)
68 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
69 AppendOnlyTreeSnapshot snapshot = {
71 .next_available_leaf_index = 128,
74 uint64_t note_hash_counter = 10;
75 FF next_root = 234567;
77 EXPECT_CALL(merkle_check,
write(
FF(0),
note_hash, snapshot.next_available_leaf_index, _, snapshot.root))
78 .WillOnce(Return(next_root));
80 AppendOnlyTreeSnapshot next_snapshot =
81 note_hash_tree_check.append_unique_note_hash(
note_hash, note_hash_counter, sibling_path, snapshot);
83 EXPECT_EQ(next_snapshot.next_available_leaf_index, snapshot.next_available_leaf_index + 1);
84 NoteHashTreeReadWriteEvent expect_event = { .note_hash =
note_hash,
85 .leaf_index = snapshot.next_available_leaf_index,
86 .prev_snapshot = snapshot,
87 .append_data = NoteHashAppendData{
88 .note_hash_counter = note_hash_counter,
89 .next_snapshot = next_snapshot,
91 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
94TEST(AvmSimulationNoteHashTree, WriteSiloed)
103 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
104 AppendOnlyTreeSnapshot snapshot = {
106 .next_available_leaf_index = 128,
108 FF siloed_note_hash = 42;
109 uint64_t note_hash_counter = 10;
111 FF unique_note_hash = 44;
113 FF next_root = 234567;
116 EXPECT_CALL(
poseidon2, hash(nonce_hash_inputs)).WillOnce(Return(nonce));
119 EXPECT_CALL(
poseidon2, hash(unique_note_hash_inputs)).WillOnce(Return(unique_note_hash));
121 EXPECT_CALL(merkle_check,
write(
FF(0), unique_note_hash, snapshot.next_available_leaf_index, _, snapshot.root))
122 .WillOnce(Return(next_root));
124 AppendOnlyTreeSnapshot next_snapshot =
125 note_hash_tree_check.append_siloed_note_hash(siloed_note_hash, note_hash_counter, sibling_path, snapshot);
127 EXPECT_EQ(next_snapshot.next_available_leaf_index, snapshot.next_available_leaf_index + 1);
128 NoteHashTreeReadWriteEvent expect_event = { .note_hash = siloed_note_hash,
129 .leaf_index = snapshot.next_available_leaf_index,
130 .prev_snapshot = snapshot,
131 .append_data = NoteHashAppendData{
133 NoteHashUniquenessData{
135 .unique_note_hash = unique_note_hash,
138 .note_hash_counter = note_hash_counter,
139 .next_snapshot = next_snapshot,
141 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
144TEST(AvmSimulationNoteHashTree, WriteRaw)
153 std::vector<FF> sibling_path = { 1, 2, 3, 4, 5 };
154 AppendOnlyTreeSnapshot snapshot = {
156 .next_available_leaf_index = 128,
159 FF raw_note_hash = 37;
162 FF siloed_note_hash = 42;
164 uint64_t note_hash_counter = 10;
166 FF unique_note_hash = 44;
168 FF next_root = 234567;
171 EXPECT_CALL(
poseidon2, hash(siloed_note_hash_inputs)).WillOnce(Return(siloed_note_hash));
174 EXPECT_CALL(
poseidon2, hash(nonce_hash_inputs)).WillOnce(Return(nonce));
177 EXPECT_CALL(
poseidon2, hash(unique_note_hash_inputs)).WillOnce(Return(unique_note_hash));
179 EXPECT_CALL(merkle_check,
write(
FF(0), unique_note_hash, snapshot.next_available_leaf_index, _, snapshot.root))
180 .WillOnce(Return(next_root));
182 AppendOnlyTreeSnapshot next_snapshot = note_hash_tree_check.append_note_hash(
183 raw_note_hash, contract_address, note_hash_counter, sibling_path, snapshot);
185 EXPECT_EQ(next_snapshot.next_available_leaf_index, snapshot.next_available_leaf_index + 1);
186 NoteHashTreeReadWriteEvent expect_event = { .note_hash = raw_note_hash,
187 .leaf_index = snapshot.next_available_leaf_index,
188 .prev_snapshot = snapshot,
189 .append_data = NoteHashAppendData{
192 .siloed_note_hash = siloed_note_hash,
193 .address = contract_address,
196 NoteHashUniquenessData{
198 .unique_note_hash = unique_note_hash,
201 .note_hash_counter = note_hash_counter,
202 .next_snapshot = next_snapshot,
204 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
207TEST(AvmSimulationNoteHashTree, CheckpointListener)
215 note_hash_tree_check.on_checkpoint_created();
216 note_hash_tree_check.on_checkpoint_committed();
217 note_hash_tree_check.on_checkpoint_reverted();
#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)