3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
20using ::testing::ElementsAre;
21using ::testing::Return;
22using ::testing::StrictMock;
28TEST(AvmSimulationWrittenPublicDataSlotsTree, ContainsNotExists)
31 StrictMock<MockMerkleCheck> merkle_check;
32 StrictMock<MockFieldGreaterThan>
field_gt;
34 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
event_emitter;
43 ASSERT_EQ(initial_state.get_snapshot().nextAvailableLeafIndex, 1);
44 uint64_t low_leaf_index = 0;
49 auto sibling_path = initial_state.get_sibling_path(0);
50 auto snapshot = initial_state.get_snapshot();
56 .WillRepeatedly(Return(
FF(leaf_slot)));
58 EXPECT_CALL(merkle_check, assert_membership(low_leaf_hash, low_leaf_index, _, snapshot.root))
59 .WillRepeatedly(Return());
64 WrittenPublicDataSlotsTreeCheckEvent expect_event = {
67 .leaf_slot = leaf_slot,
68 .prev_snapshot = snapshot,
69 .next_snapshot = snapshot,
71 .low_leaf_hash = low_leaf_hash,
72 .low_leaf_index = low_leaf_index,
74 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
77TEST(AvmSimulationWrittenPublicDataSlotsTree, ContainsExists)
80 StrictMock<MockMerkleCheck> merkle_check;
81 StrictMock<MockFieldGreaterThan>
field_gt;
83 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
event_emitter;
90 uint64_t low_leaf_index = initial_state.get_snapshot().nextAvailableLeafIndex;
91 initial_state.insert_indexed_leaves({ { WrittenPublicDataSlotLeafValue(leaf_slot) } });
95 std::vector<FF> sibling_path = initial_state.get_sibling_path(low_leaf_index);
96 auto snapshot = initial_state.get_snapshot();
102 .WillRepeatedly(Return(
FF(leaf_slot)));
104 EXPECT_CALL(merkle_check, assert_membership(low_leaf_hash, low_leaf_index, _, snapshot.root))
105 .WillRepeatedly(Return());
109 WrittenPublicDataSlotsTreeCheckEvent expect_event = {
112 .leaf_slot = leaf_slot,
113 .prev_snapshot = snapshot,
114 .next_snapshot = snapshot,
116 .low_leaf_hash = low_leaf_hash,
117 .low_leaf_index = low_leaf_index,
119 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
122TEST(AvmSimulationWrittenPublicDataSlotsTree, ReadNotExistsLowPointsToAnotherLeaf)
125 StrictMock<MockMerkleCheck> merkle_check;
126 StrictMock<MockFieldGreaterThan>
field_gt;
128 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
event_emitter;
132 initial_state.insert_indexed_leaves({ { WrittenPublicDataSlotLeafValue(FF::neg_one()) } });
138 auto low_leaf = initial_state.get_leaf_preimage(0);
141 uint64_t low_leaf_index = 0;
142 std::vector<FF> sibling_path = initial_state.get_sibling_path(low_leaf_index);
143 AppendOnlyTreeSnapshot snapshot = initial_state.get_snapshot();
149 .WillRepeatedly(Return(
FF(leaf_slot)));
151 EXPECT_CALL(merkle_check, assert_membership(low_leaf_hash, low_leaf_index, _, snapshot.root))
152 .WillRepeatedly(Return());
158 WrittenPublicDataSlotsTreeCheckEvent expect_event = {
161 .leaf_slot = leaf_slot,
162 .prev_snapshot = snapshot,
163 .next_snapshot = snapshot,
165 .low_leaf_hash = low_leaf_hash,
166 .low_leaf_index = low_leaf_index,
168 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
171TEST(AvmSimulationWrittenPublicDataSlotsTree, InsertExists)
174 StrictMock<MockMerkleCheck> merkle_check;
175 StrictMock<MockFieldGreaterThan>
field_gt;
177 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
event_emitter;
184 uint64_t low_leaf_index = initial_state.get_snapshot().nextAvailableLeafIndex;
185 initial_state.insert_indexed_leaves({ { WrittenPublicDataSlotLeafValue(leaf_slot) } });
189 std::vector<FF> sibling_path = initial_state.get_sibling_path(low_leaf_index);
190 AppendOnlyTreeSnapshot snapshot = initial_state.get_snapshot();
196 .WillRepeatedly(Return(
FF(leaf_slot)));
198 EXPECT_CALL(merkle_check, assert_membership(low_leaf_hash, low_leaf_index, _, snapshot.root))
199 .WillRepeatedly(Return());
205 WrittenPublicDataSlotsTreeCheckEvent expect_event = {
208 .leaf_slot = leaf_slot,
209 .prev_snapshot = snapshot,
210 .next_snapshot = snapshot,
212 .low_leaf_hash = low_leaf_hash,
213 .low_leaf_index = low_leaf_index,
216 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
219TEST(AvmSimulationWrittenPublicDataSlotsTree, InsertAppend)
222 StrictMock<MockMerkleCheck> merkle_check;
223 StrictMock<MockFieldGreaterThan>
field_gt;
225 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
event_emitter;
233 ASSERT_EQ(initial_state.get_snapshot().nextAvailableLeafIndex, 1);
234 uint64_t low_leaf_index = 0;
235 uint64_t new_leaf_index = 1;
240 state_after_insert.insert_indexed_leaves({ { WrittenPublicDataSlotLeafValue(leaf_slot) } });
242 std::vector<FF> low_leaf_sibling_path = initial_state.get_sibling_path(low_leaf_index);
245 updated_low_leaf.
nextIndex = new_leaf_index;
246 updated_low_leaf.nextKey = leaf_slot;
250 std::vector<FF> insertion_sibling_path = state_after_insert.get_sibling_path(new_leaf_index);
259 EXPECT_CALL(
poseidon2,
hash(_)).WillRepeatedly([](
const std::vector<FF>& input) {
262 EXPECT_CALL(merkle_check,
263 write(low_leaf_hash, updated_low_leaf_hash, low_leaf_index, _, initial_state.get_snapshot().root))
264 .WillRepeatedly(Return(intermediate_root));
267 EXPECT_CALL(merkle_check,
write(
FF(0), new_leaf_hash, new_leaf_index, _, intermediate_root))
268 .WillRepeatedly(Return(state_after_insert.get_snapshot().root));
274 WrittenPublicDataSlotsTreeCheckEvent expect_event = { .contract_address =
contract_address,
276 .leaf_slot = leaf_slot,
277 .prev_snapshot = initial_state.get_snapshot(),
278 .next_snapshot = state_after_insert.get_snapshot(),
280 .low_leaf_hash = low_leaf_hash,
281 .low_leaf_index = low_leaf_index,
283 .append_data = SlotAppendData{
284 .updated_low_leaf_hash = updated_low_leaf_hash,
285 .new_leaf_hash = new_leaf_hash,
286 .intermediate_root = intermediate_root,
289 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
292TEST(AvmSimulationWrittenPublicDataSlotsTree, CheckpointBehavior)
295 StrictMock<MockMerkleCheck> merkle_check;
296 StrictMock<MockFieldGreaterThan>
field_gt;
298 EventEmitter<WrittenPublicDataSlotsTreeCheckEvent>
event_emitter;
300 EXPECT_CALL(
poseidon2,
hash(_)).WillRepeatedly([](
const std::vector<FF>& input) {
303 EXPECT_CALL(merkle_check,
write)
309 EXPECT_CALL(merkle_check, assert_membership(_, _, _, _))
313 EXPECT_CALL(
field_gt, ff_gt(_, _)).WillRepeatedly(Return(
true));
#define GENERATOR_INDEX__PUBLIC_LEAF_INDEX
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
EventEmitter< DataCopyEvent > event_emitter
NullifierTreeLeafPreimage low_leaf
AztecAddress contract_address
void hash(State &state) noexcept
crypto::Poseidon2< crypto::Poseidon2Bn254ScalarFieldParams > poseidon2
TEST(EmitUnencryptedLogTest, Basic)
IndexedLeaf< WrittenPublicDataSlotLeafValue > WrittenPublicDataSlotsTreeLeafPreimage
FF unconstrained_root_from_path(const FF &leaf_value, const uint64_t leaf_index, std::span< const FF > path)
WrittenPublicDataSlotsTree build_public_data_slots_tree()
IndexedMemoryTree< WrittenPublicDataSlotLeafValue, Poseidon2HashPolicy > WrittenPublicDataSlotsTree
void write(B &buf, field2< base_field, Params > const &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< fr > get_hash_inputs() const
NiceMock< MockFieldGreaterThan > field_gt
NiceMock< MockWrittenPublicDataSlotsTreeCheck > written_public_data_slots_tree_check