@aztec/merkle-tree 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +15 -0
- package/package.json +4 -4
- package/.tsbuildinfo +0 -1
- package/dest/index.d.ts +0 -12
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -12
- package/dest/interfaces/append_only_tree.d.ts +0 -13
- package/dest/interfaces/append_only_tree.d.ts.map +0 -1
- package/dest/interfaces/append_only_tree.js +0 -2
- package/dest/interfaces/indexed_tree.d.ts +0 -57
- package/dest/interfaces/indexed_tree.d.ts.map +0 -1
- package/dest/interfaces/indexed_tree.js +0 -2
- package/dest/interfaces/merkle_tree.d.ts +0 -47
- package/dest/interfaces/merkle_tree.d.ts.map +0 -1
- package/dest/interfaces/merkle_tree.js +0 -2
- package/dest/interfaces/update_only_tree.d.ts +0 -15
- package/dest/interfaces/update_only_tree.d.ts.map +0 -1
- package/dest/interfaces/update_only_tree.js +0 -2
- package/dest/load_tree.d.ts +0 -13
- package/dest/load_tree.d.ts.map +0 -1
- package/dest/load_tree.js +0 -17
- package/dest/new_tree.d.ts +0 -15
- package/dest/new_tree.d.ts.map +0 -1
- package/dest/new_tree.js +0 -16
- package/dest/pedersen.d.ts +0 -15
- package/dest/pedersen.d.ts.map +0 -1
- package/dest/pedersen.js +0 -22
- package/dest/sparse_tree/sparse_tree.d.ts +0 -15
- package/dest/sparse_tree/sparse_tree.d.ts.map +0 -1
- package/dest/sparse_tree/sparse_tree.js +0 -31
- package/dest/sparse_tree/sparse_tree.test.d.ts +0 -2
- package/dest/sparse_tree/sparse_tree.test.d.ts.map +0 -1
- package/dest/sparse_tree/sparse_tree.test.js +0 -133
- package/dest/standard_indexed_tree/standard_indexed_tree.d.ts +0 -245
- package/dest/standard_indexed_tree/standard_indexed_tree.d.ts.map +0 -1
- package/dest/standard_indexed_tree/standard_indexed_tree.js +0 -488
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.d.ts +0 -2
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.d.ts.map +0 -1
- package/dest/standard_indexed_tree/test/standard_indexed_tree.test.js +0 -336
- package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts +0 -23
- package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.d.ts.map +0 -1
- package/dest/standard_indexed_tree/test/standard_indexed_tree_with_append.js +0 -59
- package/dest/standard_tree/standard_tree.d.ts +0 -15
- package/dest/standard_tree/standard_tree.d.ts.map +0 -1
- package/dest/standard_tree/standard_tree.js +0 -15
- package/dest/standard_tree/standard_tree.test.d.ts +0 -2
- package/dest/standard_tree/standard_tree.test.d.ts.map +0 -1
- package/dest/standard_tree/standard_tree.test.js +0 -58
- package/dest/test/standard_based_test_suite.d.ts +0 -6
- package/dest/test/standard_based_test_suite.d.ts.map +0 -1
- package/dest/test/standard_based_test_suite.js +0 -87
- package/dest/test/test_suite.d.ts +0 -6
- package/dest/test/test_suite.d.ts.map +0 -1
- package/dest/test/test_suite.js +0 -119
- package/dest/test/utils/append_leaves.d.ts +0 -5
- package/dest/test/utils/append_leaves.d.ts.map +0 -1
- package/dest/test/utils/append_leaves.js +0 -14
- package/dest/test/utils/create_mem_down.d.ts +0 -3
- package/dest/test/utils/create_mem_down.d.ts.map +0 -1
- package/dest/test/utils/create_mem_down.js +0 -3
- package/dest/test/utils/pedersen_with_counter.d.ts +0 -24
- package/dest/test/utils/pedersen_with_counter.d.ts.map +0 -1
- package/dest/test/utils/pedersen_with_counter.js +0 -31
- package/dest/tree_base.d.ts +0 -130
- package/dest/tree_base.d.ts.map +0 -1
- package/dest/tree_base.js +0 -257
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
import { CircuitsWasm } from '@aztec/circuits.js';
|
|
2
|
-
import { toBufferBE } from '@aztec/foundation/bigint-buffer';
|
|
3
|
-
import { SiblingPath } from '@aztec/types';
|
|
4
|
-
import { default as levelup } from 'levelup';
|
|
5
|
-
import { INITIAL_LEAF, Pedersen, loadTree, newTree } from '../../index.js';
|
|
6
|
-
import { treeTestSuite } from '../../test/test_suite.js';
|
|
7
|
-
import { createMemDown } from '../../test/utils/create_mem_down.js';
|
|
8
|
-
import { StandardIndexedTreeWithAppend } from './standard_indexed_tree_with_append.js';
|
|
9
|
-
const createDb = async (levelUp, hasher, name, depth, prefilledSize = 1) => {
|
|
10
|
-
return await newTree(StandardIndexedTreeWithAppend, levelUp, hasher, name, depth, prefilledSize);
|
|
11
|
-
};
|
|
12
|
-
const createFromName = async (levelUp, hasher, name) => {
|
|
13
|
-
return await loadTree(StandardIndexedTreeWithAppend, levelUp, hasher, name);
|
|
14
|
-
};
|
|
15
|
-
const createIndexedTreeLeaf = (value, nextIndex, nextValue) => {
|
|
16
|
-
return [toBufferBE(BigInt(value), 32), toBufferBE(BigInt(nextIndex), 32), toBufferBE(BigInt(nextValue), 32)];
|
|
17
|
-
};
|
|
18
|
-
const verifyCommittedState = async (tree, root, siblingPathIndex, emptySiblingPath) => {
|
|
19
|
-
expect(tree.getRoot(false)).toEqual(root);
|
|
20
|
-
expect(tree.getNumLeaves(false)).toEqual(1n);
|
|
21
|
-
expect(await tree.getSiblingPath(siblingPathIndex, false)).toEqual(emptySiblingPath);
|
|
22
|
-
};
|
|
23
|
-
const TEST_TREE_DEPTH = 3;
|
|
24
|
-
treeTestSuite('StandardIndexedTree', createDb, createFromName);
|
|
25
|
-
describe('StandardIndexedTreeSpecific', () => {
|
|
26
|
-
let wasm;
|
|
27
|
-
let pedersen;
|
|
28
|
-
beforeEach(async () => {
|
|
29
|
-
wasm = await CircuitsWasm.get();
|
|
30
|
-
pedersen = new Pedersen(wasm);
|
|
31
|
-
});
|
|
32
|
-
it('produces the correct roots and sibling paths', async () => {
|
|
33
|
-
// Create a depth-3 indexed merkle tree
|
|
34
|
-
const db = levelup(createMemDown());
|
|
35
|
-
const tree = await createDb(db, pedersen, 'test', 3);
|
|
36
|
-
/**
|
|
37
|
-
* Initial state:
|
|
38
|
-
*
|
|
39
|
-
* index 0 1 2 3 4 5 6 7
|
|
40
|
-
* ---------------------------------------------------------------------
|
|
41
|
-
* val 0 0 0 0 0 0 0 0
|
|
42
|
-
* nextIdx 0 0 0 0 0 0 0 0
|
|
43
|
-
* nextVal 0 0 0 0 0 0 0 0.
|
|
44
|
-
*/
|
|
45
|
-
const initialLeafHash = pedersen.compressInputs(createIndexedTreeLeaf(0, 0, 0));
|
|
46
|
-
const level1ZeroHash = pedersen.compress(INITIAL_LEAF, INITIAL_LEAF);
|
|
47
|
-
const level2ZeroHash = pedersen.compress(level1ZeroHash, level1ZeroHash);
|
|
48
|
-
let index0Hash = initialLeafHash;
|
|
49
|
-
// Each element is named by the level followed by the index on that level. E.g. e10 -> level 1, index 0, e21 -> level 2, index 1
|
|
50
|
-
let e10 = pedersen.compress(index0Hash, INITIAL_LEAF);
|
|
51
|
-
let e20 = pedersen.compress(e10, level1ZeroHash);
|
|
52
|
-
const initialE20 = e20; // Kept for calculating committed state later
|
|
53
|
-
const initialE10 = e10;
|
|
54
|
-
let root = pedersen.compress(e20, level2ZeroHash);
|
|
55
|
-
const initialRoot = root;
|
|
56
|
-
const emptySiblingPath = new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, level2ZeroHash]);
|
|
57
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
58
|
-
expect(tree.getNumLeaves(true)).toEqual(1n);
|
|
59
|
-
expect(await tree.getSiblingPath(0n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, level2ZeroHash]));
|
|
60
|
-
await verifyCommittedState(tree, initialRoot, 0n, emptySiblingPath);
|
|
61
|
-
/**
|
|
62
|
-
* Add new value 30:
|
|
63
|
-
*
|
|
64
|
-
* index 0 1 2 3 4 5 6 7
|
|
65
|
-
* ---------------------------------------------------------------------
|
|
66
|
-
* val 0 30 0 0 0 0 0 0
|
|
67
|
-
* nextIdx 1 0 0 0 0 0 0 0
|
|
68
|
-
* nextVal 30 0 0 0 0 0 0 0.
|
|
69
|
-
*/
|
|
70
|
-
index0Hash = pedersen.compressInputs(createIndexedTreeLeaf(0, 1, 30));
|
|
71
|
-
let index1Hash = pedersen.compressInputs(createIndexedTreeLeaf(30, 0, 0));
|
|
72
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
73
|
-
e20 = pedersen.compress(e10, level1ZeroHash);
|
|
74
|
-
root = pedersen.compress(e20, level2ZeroHash);
|
|
75
|
-
await tree.appendLeaves([toBufferBE(30n, 32)]);
|
|
76
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
77
|
-
expect(tree.getNumLeaves(true)).toEqual(2n);
|
|
78
|
-
expect(await tree.getSiblingPath(1n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index0Hash, level1ZeroHash, level2ZeroHash]));
|
|
79
|
-
// ensure the committed state is correct
|
|
80
|
-
const initialSiblingPath = new SiblingPath(TEST_TREE_DEPTH, [initialLeafHash, level1ZeroHash, level2ZeroHash]);
|
|
81
|
-
await verifyCommittedState(tree, initialRoot, 1n, initialSiblingPath);
|
|
82
|
-
/**
|
|
83
|
-
* Add new value 10:
|
|
84
|
-
*
|
|
85
|
-
* index 0 1 2 3 4 5 6 7
|
|
86
|
-
* ---------------------------------------------------------------------
|
|
87
|
-
* val 0 30 10 0 0 0 0 0
|
|
88
|
-
* nextIdx 2 0 1 0 0 0 0 0
|
|
89
|
-
* nextVal 10 0 30 0 0 0 0 0.
|
|
90
|
-
*/
|
|
91
|
-
index0Hash = pedersen.compressInputs(createIndexedTreeLeaf(0, 2, 10));
|
|
92
|
-
let index2Hash = pedersen.compressInputs(createIndexedTreeLeaf(10, 1, 30));
|
|
93
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
94
|
-
let e11 = pedersen.compress(index2Hash, INITIAL_LEAF);
|
|
95
|
-
e20 = pedersen.compress(e10, e11);
|
|
96
|
-
root = pedersen.compress(e20, level2ZeroHash);
|
|
97
|
-
await tree.appendLeaves([toBufferBE(10n, 32)]);
|
|
98
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
99
|
-
expect(tree.getNumLeaves(true)).toEqual(3n);
|
|
100
|
-
expect(await tree.getSiblingPath(2n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, e10, level2ZeroHash]));
|
|
101
|
-
// ensure the committed state is correct
|
|
102
|
-
await verifyCommittedState(tree, initialRoot, 2n, new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, initialE10, level2ZeroHash]));
|
|
103
|
-
/**
|
|
104
|
-
* Add new value 20:
|
|
105
|
-
*
|
|
106
|
-
* index 0 1 2 3 4 5 6 7
|
|
107
|
-
* ---------------------------------------------------------------------
|
|
108
|
-
* val 0 30 10 20 0 0 0 0
|
|
109
|
-
* nextIdx 2 0 3 1 0 0 0 0
|
|
110
|
-
* nextVal 10 0 20 30 0 0 0 0.
|
|
111
|
-
*/
|
|
112
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
113
|
-
index2Hash = pedersen.compressInputs(createIndexedTreeLeaf(10, 3, 20));
|
|
114
|
-
const index3Hash = pedersen.compressInputs(createIndexedTreeLeaf(20, 1, 30));
|
|
115
|
-
e11 = pedersen.compress(index2Hash, index3Hash);
|
|
116
|
-
e20 = pedersen.compress(e10, e11);
|
|
117
|
-
root = pedersen.compress(e20, level2ZeroHash);
|
|
118
|
-
await tree.appendLeaves([toBufferBE(20n, 32)]);
|
|
119
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
120
|
-
expect(tree.getNumLeaves(true)).toEqual(4n);
|
|
121
|
-
expect(await tree.getSiblingPath(3n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index2Hash, e10, level2ZeroHash]));
|
|
122
|
-
// ensure the committed state is correct
|
|
123
|
-
await verifyCommittedState(tree, initialRoot, 3n, new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, initialE10, level2ZeroHash]));
|
|
124
|
-
/**
|
|
125
|
-
* Add new value 50:
|
|
126
|
-
*
|
|
127
|
-
* index 0 1 2 3 4 5 6 7
|
|
128
|
-
* ---------------------------------------------------------------------
|
|
129
|
-
* val 0 30 10 20 50 0 0 0
|
|
130
|
-
* nextIdx 2 4 3 1 0 0 0 0
|
|
131
|
-
* nextVal 10 50 20 30 0 0 0 0.
|
|
132
|
-
*/
|
|
133
|
-
index1Hash = pedersen.compressInputs(createIndexedTreeLeaf(30, 4, 50));
|
|
134
|
-
const index4Hash = pedersen.compressInputs(createIndexedTreeLeaf(50, 0, 0));
|
|
135
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
136
|
-
e20 = pedersen.compress(e10, e11);
|
|
137
|
-
const e12 = pedersen.compress(index4Hash, INITIAL_LEAF);
|
|
138
|
-
const e21 = pedersen.compress(e12, level1ZeroHash);
|
|
139
|
-
root = pedersen.compress(e20, e21);
|
|
140
|
-
await tree.appendLeaves([toBufferBE(50n, 32)]);
|
|
141
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
142
|
-
expect(tree.getNumLeaves(true)).toEqual(5n);
|
|
143
|
-
// ensure the committed state is correct
|
|
144
|
-
await verifyCommittedState(tree, initialRoot, 4n, new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, initialE20]));
|
|
145
|
-
// check all uncommitted hash paths
|
|
146
|
-
expect(await tree.getSiblingPath(0n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index1Hash, e11, e21]));
|
|
147
|
-
expect(await tree.getSiblingPath(1n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index0Hash, e11, e21]));
|
|
148
|
-
expect(await tree.getSiblingPath(2n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index3Hash, e10, e21]));
|
|
149
|
-
expect(await tree.getSiblingPath(3n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index2Hash, e10, e21]));
|
|
150
|
-
expect(await tree.getSiblingPath(4n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, e20]));
|
|
151
|
-
expect(await tree.getSiblingPath(5n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index4Hash, level1ZeroHash, e20]));
|
|
152
|
-
expect(await tree.getSiblingPath(6n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, e12, e20]));
|
|
153
|
-
expect(await tree.getSiblingPath(7n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, e12, e20]));
|
|
154
|
-
// check all committed hash paths
|
|
155
|
-
expect(await tree.getSiblingPath(0n, false)).toEqual(emptySiblingPath);
|
|
156
|
-
expect(await tree.getSiblingPath(1n, false)).toEqual(initialSiblingPath);
|
|
157
|
-
expect(await tree.getSiblingPath(2n, false)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, initialE10, level2ZeroHash]));
|
|
158
|
-
expect(await tree.getSiblingPath(3n, false)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, initialE10, level2ZeroHash]));
|
|
159
|
-
const e2SiblingPath = new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, initialE20]);
|
|
160
|
-
expect(await tree.getSiblingPath(4n, false)).toEqual(e2SiblingPath);
|
|
161
|
-
expect(await tree.getSiblingPath(5n, false)).toEqual(e2SiblingPath);
|
|
162
|
-
expect(await tree.getSiblingPath(6n, false)).toEqual(e2SiblingPath);
|
|
163
|
-
expect(await tree.getSiblingPath(7n, false)).toEqual(e2SiblingPath);
|
|
164
|
-
await tree.commit();
|
|
165
|
-
// check all committed hash paths equal uncommitted hash paths
|
|
166
|
-
for (let i = 0; i < 8; i++) {
|
|
167
|
-
expect(await tree.getSiblingPath(BigInt(i), false)).toEqual(await tree.getSiblingPath(BigInt(i), true));
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
it('Can append empty leaves and handle insertions', async () => {
|
|
171
|
-
// Create a depth-3 indexed merkle tree
|
|
172
|
-
const db = levelup(createMemDown());
|
|
173
|
-
const tree = await createDb(db, pedersen, 'test', 3);
|
|
174
|
-
/**
|
|
175
|
-
* Initial state:
|
|
176
|
-
*
|
|
177
|
-
* index 0 1 2 3 4 5 6 7
|
|
178
|
-
* ---------------------------------------------------------------------
|
|
179
|
-
* val 0 0 0 0 0 0 0 0
|
|
180
|
-
* nextIdx 0 0 0 0 0 0 0 0
|
|
181
|
-
* nextVal 0 0 0 0 0 0 0 0.
|
|
182
|
-
*/
|
|
183
|
-
const INITIAL_LEAF = toBufferBE(0n, 32);
|
|
184
|
-
const initialLeafHash = pedersen.compressInputs(createIndexedTreeLeaf(0, 0, 0));
|
|
185
|
-
const level1ZeroHash = pedersen.compress(INITIAL_LEAF, INITIAL_LEAF);
|
|
186
|
-
const level2ZeroHash = pedersen.compress(level1ZeroHash, level1ZeroHash);
|
|
187
|
-
let index0Hash = initialLeafHash;
|
|
188
|
-
let e10 = pedersen.compress(index0Hash, INITIAL_LEAF);
|
|
189
|
-
let e20 = pedersen.compress(e10, level1ZeroHash);
|
|
190
|
-
const inite10 = e10;
|
|
191
|
-
const inite20 = e20;
|
|
192
|
-
let root = pedersen.compress(e20, level2ZeroHash);
|
|
193
|
-
const initialRoot = root;
|
|
194
|
-
const emptySiblingPath = new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, level2ZeroHash]);
|
|
195
|
-
const initialSiblingPath = new SiblingPath(TEST_TREE_DEPTH, [initialLeafHash, level1ZeroHash, level2ZeroHash]);
|
|
196
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
197
|
-
expect(tree.getNumLeaves(true)).toEqual(1n);
|
|
198
|
-
expect(await tree.getSiblingPath(0n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, level2ZeroHash]));
|
|
199
|
-
await verifyCommittedState(tree, initialRoot, 0n, emptySiblingPath);
|
|
200
|
-
/**
|
|
201
|
-
* Add new value 30:
|
|
202
|
-
*
|
|
203
|
-
* index 0 1 2 3 4 5 6 7
|
|
204
|
-
* ---------------------------------------------------------------------
|
|
205
|
-
* val 0 30 0 0 0 0 0 0
|
|
206
|
-
* nextIdx 1 0 0 0 0 0 0 0
|
|
207
|
-
* nextVal 30 0 0 0 0 0 0 0.
|
|
208
|
-
*/
|
|
209
|
-
index0Hash = pedersen.compressInputs(createIndexedTreeLeaf(0, 1, 30));
|
|
210
|
-
let index1Hash = pedersen.compressInputs(createIndexedTreeLeaf(30, 0, 0));
|
|
211
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
212
|
-
e20 = pedersen.compress(e10, level1ZeroHash);
|
|
213
|
-
root = pedersen.compress(e20, level2ZeroHash);
|
|
214
|
-
await tree.appendLeaves([toBufferBE(30n, 32)]);
|
|
215
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
216
|
-
expect(tree.getNumLeaves(true)).toEqual(2n);
|
|
217
|
-
expect(await tree.getSiblingPath(1n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index0Hash, level1ZeroHash, level2ZeroHash]));
|
|
218
|
-
// ensure the committed state is correct
|
|
219
|
-
await verifyCommittedState(tree, initialRoot, 1n, initialSiblingPath);
|
|
220
|
-
/**
|
|
221
|
-
* Add new value 10:
|
|
222
|
-
*
|
|
223
|
-
* index 0 1 2 3 4 5 6 7
|
|
224
|
-
* ---------------------------------------------------------------------
|
|
225
|
-
* val 0 30 10 0 0 0 0 0
|
|
226
|
-
* nextIdx 2 0 1 0 0 0 0 0
|
|
227
|
-
* nextVal 10 0 30 0 0 0 0 0.
|
|
228
|
-
*/
|
|
229
|
-
index0Hash = pedersen.compressInputs(createIndexedTreeLeaf(0, 2, 10));
|
|
230
|
-
let index2Hash = pedersen.compressInputs(createIndexedTreeLeaf(10, 1, 30));
|
|
231
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
232
|
-
let e11 = pedersen.compress(index2Hash, INITIAL_LEAF);
|
|
233
|
-
e20 = pedersen.compress(e10, e11);
|
|
234
|
-
root = pedersen.compress(e20, level2ZeroHash);
|
|
235
|
-
await tree.appendLeaves([toBufferBE(10n, 32)]);
|
|
236
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
237
|
-
expect(tree.getNumLeaves(true)).toEqual(3n);
|
|
238
|
-
expect(await tree.getSiblingPath(2n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, e10, level2ZeroHash]));
|
|
239
|
-
// ensure the committed state is correct
|
|
240
|
-
await verifyCommittedState(tree, initialRoot, 2n, new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, inite10, level2ZeroHash]));
|
|
241
|
-
/**
|
|
242
|
-
* Add new value 20:
|
|
243
|
-
*
|
|
244
|
-
* index 0 1 2 3 4 5 6 7
|
|
245
|
-
* ---------------------------------------------------------------------
|
|
246
|
-
* val 0 30 10 20 0 0 0 0
|
|
247
|
-
* nextIdx 2 0 3 1 0 0 0 0
|
|
248
|
-
* nextVal 10 0 20 30 0 0 0 0.
|
|
249
|
-
*/
|
|
250
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
251
|
-
index2Hash = pedersen.compressInputs(createIndexedTreeLeaf(10, 3, 20));
|
|
252
|
-
const index3Hash = pedersen.compressInputs(createIndexedTreeLeaf(20, 1, 30));
|
|
253
|
-
e11 = pedersen.compress(index2Hash, index3Hash);
|
|
254
|
-
e20 = pedersen.compress(e10, e11);
|
|
255
|
-
root = pedersen.compress(e20, level2ZeroHash);
|
|
256
|
-
await tree.appendLeaves([toBufferBE(20n, 32)]);
|
|
257
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
258
|
-
expect(tree.getNumLeaves(true)).toEqual(4n);
|
|
259
|
-
expect(await tree.getSiblingPath(3n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index2Hash, e10, level2ZeroHash]));
|
|
260
|
-
// ensure the committed state is correct
|
|
261
|
-
await verifyCommittedState(tree, initialRoot, 3n, new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, inite10, level2ZeroHash]));
|
|
262
|
-
// Add 2 empty values
|
|
263
|
-
const emptyLeaves = [toBufferBE(0n, 32), toBufferBE(0n, 32)];
|
|
264
|
-
await tree.appendLeaves(emptyLeaves);
|
|
265
|
-
// The root should be the same but the size should have increased
|
|
266
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
267
|
-
expect(tree.getNumLeaves(true)).toEqual(6n);
|
|
268
|
-
/**
|
|
269
|
-
* Add new value 50:
|
|
270
|
-
*
|
|
271
|
-
* index 0 1 2 3 4 5 6 7
|
|
272
|
-
* --------------------------------------------------------------------
|
|
273
|
-
* val 0 30 10 20 0 0 50 0
|
|
274
|
-
* nextIdx 2 6 3 1 0 0 0 0
|
|
275
|
-
* nextVal 10 50 20 30 0 0 0 0.
|
|
276
|
-
*/
|
|
277
|
-
index1Hash = pedersen.compressInputs(createIndexedTreeLeaf(30, 6, 50));
|
|
278
|
-
const index6Hash = pedersen.compressInputs(createIndexedTreeLeaf(50, 0, 0));
|
|
279
|
-
e10 = pedersen.compress(index0Hash, index1Hash);
|
|
280
|
-
e20 = pedersen.compress(e10, e11);
|
|
281
|
-
const e13 = pedersen.compress(index6Hash, INITIAL_LEAF);
|
|
282
|
-
const e21 = pedersen.compress(level1ZeroHash, e13);
|
|
283
|
-
root = pedersen.compress(e20, e21);
|
|
284
|
-
await tree.appendLeaves([toBufferBE(50n, 32)]);
|
|
285
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
286
|
-
expect(tree.getNumLeaves(true)).toEqual(7n);
|
|
287
|
-
// ensure the committed state is correct
|
|
288
|
-
await verifyCommittedState(tree, initialRoot, 6n, new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, inite20]));
|
|
289
|
-
// // check all uncommitted hash paths
|
|
290
|
-
expect(await tree.getSiblingPath(0n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index1Hash, e11, e21]));
|
|
291
|
-
expect(await tree.getSiblingPath(1n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index0Hash, e11, e21]));
|
|
292
|
-
expect(await tree.getSiblingPath(2n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index3Hash, e10, e21]));
|
|
293
|
-
expect(await tree.getSiblingPath(3n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index2Hash, e10, e21]));
|
|
294
|
-
expect(await tree.getSiblingPath(4n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, e13, e20]));
|
|
295
|
-
expect(await tree.getSiblingPath(5n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, e13, e20]));
|
|
296
|
-
expect(await tree.getSiblingPath(6n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, e20]));
|
|
297
|
-
expect(await tree.getSiblingPath(7n, true)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [index6Hash, level1ZeroHash, e20]));
|
|
298
|
-
// check all committed hash paths
|
|
299
|
-
expect(await tree.getSiblingPath(0n, false)).toEqual(emptySiblingPath);
|
|
300
|
-
expect(await tree.getSiblingPath(1n, false)).toEqual(initialSiblingPath);
|
|
301
|
-
expect(await tree.getSiblingPath(2n, false)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, inite10, level2ZeroHash]));
|
|
302
|
-
expect(await tree.getSiblingPath(3n, false)).toEqual(new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, inite10, level2ZeroHash]));
|
|
303
|
-
const e2SiblingPath = new SiblingPath(TEST_TREE_DEPTH, [INITIAL_LEAF, level1ZeroHash, inite20]);
|
|
304
|
-
expect(await tree.getSiblingPath(4n, false)).toEqual(e2SiblingPath);
|
|
305
|
-
expect(await tree.getSiblingPath(5n, false)).toEqual(e2SiblingPath);
|
|
306
|
-
expect(await tree.getSiblingPath(6n, false)).toEqual(e2SiblingPath);
|
|
307
|
-
expect(await tree.getSiblingPath(7n, false)).toEqual(e2SiblingPath);
|
|
308
|
-
await tree.commit();
|
|
309
|
-
// check all committed hash paths equal uncommitted hash paths
|
|
310
|
-
for (let i = 0; i < 8; i++) {
|
|
311
|
-
expect(await tree.getSiblingPath(BigInt(i), false)).toEqual(await tree.getSiblingPath(BigInt(i), true));
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
// For varying orders of insertions assert the local batch insertion generator creates the correct proofs
|
|
315
|
-
it.each([
|
|
316
|
-
// These are arbitrary but it needs to be higher than the constant `INITIAL_NULLIFIER_TREE_SIZE` and `KERNEL_NEW_NULLIFIERS_LENGTH * 2`
|
|
317
|
-
[[1003, 1002, 1001, 1000, 0, 0, 0, 0]],
|
|
318
|
-
[[1003, 1004, 1005, 1006, 0, 0, 0, 0]],
|
|
319
|
-
[[1234, 1098, 0, 0, 99999, 1096, 1054, 0]],
|
|
320
|
-
[[1970, 1980, 1040, 0, 99999, 1880, 100001, 9000000]],
|
|
321
|
-
])('performs nullifier tree batch insertion correctly', async (nullifiers) => {
|
|
322
|
-
const leaves = nullifiers.map(i => toBufferBE(BigInt(i), 32));
|
|
323
|
-
const TREE_HEIGHT = 16; // originally from NULLIFIER_TREE_HEIGHT
|
|
324
|
-
const INITIAL_TREE_SIZE = 8; // originally from INITIAL_NULLIFIER_TREE_SIZE
|
|
325
|
-
const SUBTREE_HEIGHT = 5; // originally from BaseRollupInputs.NULLIFIER_SUBTREE_HEIGHT
|
|
326
|
-
// Create a depth-3 indexed merkle tree
|
|
327
|
-
const appendTree = await createDb(levelup(createMemDown()), pedersen, 'test', TREE_HEIGHT, INITIAL_TREE_SIZE);
|
|
328
|
-
const insertTree = await createDb(levelup(createMemDown()), pedersen, 'test', TREE_HEIGHT, INITIAL_TREE_SIZE);
|
|
329
|
-
await appendTree.appendLeaves(leaves);
|
|
330
|
-
await insertTree.batchInsert(leaves, SUBTREE_HEIGHT);
|
|
331
|
-
const expectedRoot = appendTree.getRoot(true);
|
|
332
|
-
const actualRoot = insertTree.getRoot(true);
|
|
333
|
-
expect(actualRoot).toEqual(expectedRoot);
|
|
334
|
-
});
|
|
335
|
-
});
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRfaW5kZXhlZF90cmVlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RhbmRhcmRfaW5kZXhlZF90cmVlL3Rlc3Qvc3RhbmRhcmRfaW5kZXhlZF90cmVlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCxPQUFPLEVBQVUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRW5ELE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQWMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXZGLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxPQUF3QixFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsRUFBRTtJQUNsSCxPQUFPLE1BQU0sT0FBTyxDQUFDLDZCQUE2QixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNuRyxDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQUUsT0FBd0IsRUFBRSxNQUFjLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDdEYsT0FBTyxNQUFNLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlFLENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLEVBQUU7SUFDcEYsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0csQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQ2hDLElBQWdCLEVBQ2hCLElBQVksRUFDWixnQkFBd0IsRUFDeEIsZ0JBQWdDLEVBQ2hDLEVBQUU7SUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDdkYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRTFCLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFL0QsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxJQUFJLElBQWlCLENBQUM7SUFDdEIsSUFBSSxRQUFrQixDQUFDO0lBRXZCLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNwQixJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVELHVDQUF1QztRQUN2QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVyRDs7Ozs7Ozs7V0FRRztRQUVILE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXpFLElBQUksVUFBVSxHQUFHLGVBQWUsQ0FBQztRQUNqQyxnSUFBZ0k7UUFDaEksSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEQsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFakQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsNkNBQTZDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUV2QixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFekIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFMUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDakYsQ0FBQztRQUVGLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwRTs7Ozs7Ozs7V0FRRztRQUNILFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzdDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU5QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDakQsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUMvRSxDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQy9HLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUV0RTs7Ozs7Ozs7V0FRRztRQUNILFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEQsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU5QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDakQsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUN0RSxDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLE1BQU0sb0JBQW9CLENBQ3hCLElBQUksRUFDSixXQUFXLEVBQ1gsRUFBRSxFQUNGLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDN0UsQ0FBQztRQUVGOzs7Ozs7OztXQVFHO1FBQ0gsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU5QyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDakQsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUNwRSxDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLE1BQU0sb0JBQW9CLENBQ3hCLElBQUksRUFDSixXQUFXLEVBQ1gsRUFBRSxFQUNGLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDN0UsQ0FBQztRQUVGOzs7Ozs7OztXQVFHO1FBQ0gsVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbkQsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixDQUN4QixJQUFJLEVBQ0osV0FBVyxFQUNYLEVBQUUsRUFDRixJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQzdFLENBQUM7UUFFRixtQ0FBbUM7UUFDbkMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDdEUsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNqRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3BFLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoSCxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoSCxpQ0FBaUM7UUFDakMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNsRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQzdFLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDbEQsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUM3RSxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25HLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLDhEQUE4RDtRQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6RztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzdELHVDQUF1QztRQUN2QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVyRDs7Ozs7Ozs7V0FRRztRQUVILE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDekUsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDO1FBRWpDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFFcEIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXpCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRS9HLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNqRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQ2pGLENBQUM7UUFFRixNQUFNLG9CQUFvQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFcEU7Ozs7Ozs7O1dBUUc7UUFDSCxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM3QyxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDL0UsQ0FBQztRQUVGLHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFdEU7Ozs7Ozs7O1dBUUc7UUFDSCxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0UsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RELEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDdEUsQ0FBQztRQUVGLHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixDQUN4QixJQUFJLEVBQ0osV0FBVyxFQUNYLEVBQUUsRUFDRixJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQzFFLENBQUM7UUFFRjs7Ozs7Ozs7V0FRRztRQUNILEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0UsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDcEUsQ0FBQztRQUVGLHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixDQUN4QixJQUFJLEVBQ0osV0FBVyxFQUNYLEVBQUUsRUFDRixJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQzFFLENBQUM7UUFFRixxQkFBcUI7UUFDckIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckMsaUVBQWlFO1FBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVDOzs7Ozs7OztXQVFHO1FBQ0gsVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixDQUN4QixJQUFJLEVBQ0osV0FBVyxFQUNYLEVBQUUsRUFDRixJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQzFFLENBQUM7UUFFRixzQ0FBc0M7UUFDdEMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pELElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDdEUsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNqRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3BFLENBQUM7UUFFRixpQ0FBaUM7UUFDakMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNsRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQzFFLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDbEQsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUMxRSxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLDhEQUE4RDtRQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6RztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgseUdBQXlHO0lBQ3pHLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDTix1SUFBdUk7UUFDdkksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUM3QyxDQUFDLENBQUMsbURBQW1ELEVBQUUsS0FBSyxFQUFDLFVBQVUsRUFBQyxFQUFFO1FBQ2xGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsd0NBQXdDO1FBQ2hFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsOENBQThDO1FBQzNFLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLDREQUE0RDtRQUV0Rix1Q0FBdUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM5RyxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlHLE1BQU0sVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXJELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMifQ==
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { StandardIndexedTree } from '../../index.js';
|
|
3
|
-
/**
|
|
4
|
-
* A testing utility which is here to store the original implementation of StandardIndexedTree.appendLeaves method
|
|
5
|
-
* that was replaced by the more efficient batchInsert method. We keep the original implementation around as it useful
|
|
6
|
-
* for testing that the more complex batchInsert method works correctly.
|
|
7
|
-
*/
|
|
8
|
-
export declare class StandardIndexedTreeWithAppend extends StandardIndexedTree {
|
|
9
|
-
/**
|
|
10
|
-
* Appends the given leaves to the tree.
|
|
11
|
-
* @param leaves - The leaves to append.
|
|
12
|
-
* @returns Empty promise.
|
|
13
|
-
* @remarks This method is inefficient and is here mostly for testing. Use batchInsert instead.
|
|
14
|
-
*/
|
|
15
|
-
appendLeaves(leaves: Buffer[]): Promise<void>;
|
|
16
|
-
/**
|
|
17
|
-
* Appends the given leaf to the tree.
|
|
18
|
-
* @param leaf - The leaf to append.
|
|
19
|
-
* @returns Empty promise.
|
|
20
|
-
*/
|
|
21
|
-
private appendLeaf;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=standard_indexed_tree_with_append.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standard_indexed_tree_with_append.d.ts","sourceRoot":"","sources":["../../../src/standard_indexed_tree/test/standard_indexed_tree_with_append.ts"],"names":[],"mappings":";AAEA,OAAO,EAAY,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE/D;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,mBAAmB;IACpE;;;;;OAKG;IACU,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D;;;;OAIG;YACW,UAAU;CAoCzB"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
|
|
2
|
-
import { StandardIndexedTree } from '../../index.js';
|
|
3
|
-
/**
|
|
4
|
-
* A testing utility which is here to store the original implementation of StandardIndexedTree.appendLeaves method
|
|
5
|
-
* that was replaced by the more efficient batchInsert method. We keep the original implementation around as it useful
|
|
6
|
-
* for testing that the more complex batchInsert method works correctly.
|
|
7
|
-
*/
|
|
8
|
-
export class StandardIndexedTreeWithAppend extends StandardIndexedTree {
|
|
9
|
-
/**
|
|
10
|
-
* Appends the given leaves to the tree.
|
|
11
|
-
* @param leaves - The leaves to append.
|
|
12
|
-
* @returns Empty promise.
|
|
13
|
-
* @remarks This method is inefficient and is here mostly for testing. Use batchInsert instead.
|
|
14
|
-
*/
|
|
15
|
-
async appendLeaves(leaves) {
|
|
16
|
-
for (const leaf of leaves) {
|
|
17
|
-
await this.appendLeaf(leaf);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Appends the given leaf to the tree.
|
|
22
|
-
* @param leaf - The leaf to append.
|
|
23
|
-
* @returns Empty promise.
|
|
24
|
-
*/
|
|
25
|
-
async appendLeaf(leaf) {
|
|
26
|
-
const newValue = toBigIntBE(leaf);
|
|
27
|
-
// Special case when appending zero
|
|
28
|
-
if (newValue === 0n) {
|
|
29
|
-
const newSize = (this.cachedSize ?? this.size) + 1n;
|
|
30
|
-
if (newSize - 1n > this.maxIndex) {
|
|
31
|
-
throw Error(`Can't append beyond max index. Max index: ${this.maxIndex}`);
|
|
32
|
-
}
|
|
33
|
-
this.cachedSize = newSize;
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const indexOfPrevious = this.findIndexOfPreviousValue(newValue, true);
|
|
37
|
-
const previousLeafCopy = this.getLatestLeafDataCopy(indexOfPrevious.index, true);
|
|
38
|
-
if (previousLeafCopy === undefined) {
|
|
39
|
-
throw new Error(`Previous leaf not found!`);
|
|
40
|
-
}
|
|
41
|
-
const newLeaf = {
|
|
42
|
-
value: newValue,
|
|
43
|
-
nextIndex: previousLeafCopy.nextIndex,
|
|
44
|
-
nextValue: previousLeafCopy.nextValue,
|
|
45
|
-
};
|
|
46
|
-
if (indexOfPrevious.alreadyPresent) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
// insert a new leaf at the highest index and update the values of our previous leaf copy
|
|
50
|
-
const currentSize = this.getNumLeaves(true);
|
|
51
|
-
previousLeafCopy.nextIndex = BigInt(currentSize);
|
|
52
|
-
previousLeafCopy.nextValue = newLeaf.value;
|
|
53
|
-
this.cachedLeaves[Number(currentSize)] = newLeaf;
|
|
54
|
-
this.cachedLeaves[Number(indexOfPrevious.index)] = previousLeafCopy;
|
|
55
|
-
await this.updateLeaf(previousLeafCopy, BigInt(indexOfPrevious.index));
|
|
56
|
-
await this.updateLeaf(newLeaf, this.getNumLeaves(true));
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRfaW5kZXhlZF90cmVlX3dpdGhfYXBwZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0YW5kYXJkX2luZGV4ZWRfdHJlZS90ZXN0L3N0YW5kYXJkX2luZGV4ZWRfdHJlZV93aXRoX2FwcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFZLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyw2QkFBOEIsU0FBUSxtQkFBbUI7SUFDcEU7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWdCO1FBQ3hDLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFZO1FBQ25DLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQyxtQ0FBbUM7UUFDbkMsSUFBSSxRQUFRLEtBQUssRUFBRSxFQUFFO1lBQ25CLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BELElBQUksT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxNQUFNLEtBQUssQ0FBQyw2Q0FBNkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDM0U7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztZQUMxQixPQUFPO1NBQ1I7UUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFakYsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsTUFBTSxPQUFPLEdBQUc7WUFDZCxLQUFLLEVBQUUsUUFBUTtZQUNmLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO1lBQ3JDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTO1NBQzFCLENBQUM7UUFDZCxJQUFJLGVBQWUsQ0FBQyxjQUFjLEVBQUU7WUFDbEMsT0FBTztTQUNSO1FBQ0QseUZBQXlGO1FBQ3pGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUNwRSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRiJ9
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { AppendOnlyTree } from '../interfaces/append_only_tree.js';
|
|
3
|
-
import { TreeBase } from '../tree_base.js';
|
|
4
|
-
/**
|
|
5
|
-
* A Merkle tree implementation that uses a LevelDB database to store the tree.
|
|
6
|
-
*/
|
|
7
|
-
export declare class StandardTree extends TreeBase implements AppendOnlyTree {
|
|
8
|
-
/**
|
|
9
|
-
* Appends the given leaves to the tree.
|
|
10
|
-
* @param leaves - The leaves to append.
|
|
11
|
-
* @returns Empty promise.
|
|
12
|
-
*/
|
|
13
|
-
appendLeaves(leaves: Buffer[]): Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=standard_tree.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standard_tree.d.ts","sourceRoot":"","sources":["../../src/standard_tree/standard_tree.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAS,YAAW,cAAc;IAClE;;;;OAIG;IACU,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3D"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { TreeBase } from '../tree_base.js';
|
|
2
|
-
/**
|
|
3
|
-
* A Merkle tree implementation that uses a LevelDB database to store the tree.
|
|
4
|
-
*/
|
|
5
|
-
export class StandardTree extends TreeBase {
|
|
6
|
-
/**
|
|
7
|
-
* Appends the given leaves to the tree.
|
|
8
|
-
* @param leaves - The leaves to append.
|
|
9
|
-
* @returns Empty promise.
|
|
10
|
-
*/
|
|
11
|
-
async appendLeaves(leaves) {
|
|
12
|
-
await super.appendLeaves(leaves);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRfdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGFuZGFyZF90cmVlL3N0YW5kYXJkX3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxRQUFRO0lBQ3hDOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWdCO1FBQ3hDLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0YifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standard_tree.test.d.ts","sourceRoot":"","sources":["../../src/standard_tree/standard_tree.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { CircuitsWasm } from '@aztec/circuits.js';
|
|
2
|
-
import { randomBytes } from '@aztec/foundation/crypto';
|
|
3
|
-
import { default as levelup } from 'levelup';
|
|
4
|
-
import { loadTree } from '../load_tree.js';
|
|
5
|
-
import { newTree } from '../new_tree.js';
|
|
6
|
-
import { standardBasedTreeTestSuite } from '../test/standard_based_test_suite.js';
|
|
7
|
-
import { treeTestSuite } from '../test/test_suite.js';
|
|
8
|
-
import { createMemDown } from '../test/utils/create_mem_down.js';
|
|
9
|
-
import { PedersenWithCounter } from '../test/utils/pedersen_with_counter.js';
|
|
10
|
-
import { INITIAL_LEAF } from '../tree_base.js';
|
|
11
|
-
import { StandardTree } from './standard_tree.js';
|
|
12
|
-
const createDb = async (levelUp, hasher, name, depth) => {
|
|
13
|
-
return await newTree(StandardTree, levelUp, hasher, name, depth);
|
|
14
|
-
};
|
|
15
|
-
const createFromName = async (levelUp, hasher, name) => {
|
|
16
|
-
return await loadTree(StandardTree, levelUp, hasher, name);
|
|
17
|
-
};
|
|
18
|
-
treeTestSuite('StandardTree', createDb, createFromName);
|
|
19
|
-
standardBasedTreeTestSuite('StandardTree', createDb);
|
|
20
|
-
describe('StandardTree_batchAppend', () => {
|
|
21
|
-
let wasm;
|
|
22
|
-
let pedersen;
|
|
23
|
-
beforeAll(async () => {
|
|
24
|
-
wasm = await CircuitsWasm.get();
|
|
25
|
-
pedersen = new PedersenWithCounter(wasm);
|
|
26
|
-
});
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
pedersen.resetCounter();
|
|
29
|
-
});
|
|
30
|
-
it('correctly computes root when batch appending and calls compress function expected num times', async () => {
|
|
31
|
-
const db = levelup(createMemDown());
|
|
32
|
-
const tree = await createDb(db, pedersen, 'test', 3);
|
|
33
|
-
const leaves = Array.from({ length: 5 }, _ => randomBytes(32));
|
|
34
|
-
pedersen.resetCounter();
|
|
35
|
-
await tree.appendLeaves(leaves);
|
|
36
|
-
// We append 5 leaves so to update values we do the following hashing on each level:
|
|
37
|
-
// level2Node0 level2Node1 level2Node2
|
|
38
|
-
// LEVEL2: [newLeaf0, newLeaf1], [newLeaf2, newLeaf3], [newLeaf4, INITIAL_LEAF].
|
|
39
|
-
// level1Node0 level1Node1
|
|
40
|
-
// LEVEL1: [level2Node0, level2Node1], [level2Node2, level2ZeroHash].
|
|
41
|
-
// ROOT
|
|
42
|
-
// LEVEL0: [level1Node0, level1Node1].
|
|
43
|
-
const level2NumHashing = 3;
|
|
44
|
-
const level1NumHashing = 2;
|
|
45
|
-
const level0NumHashing = 1;
|
|
46
|
-
const expectedNumHashing = level2NumHashing + level1NumHashing + level0NumHashing;
|
|
47
|
-
expect(pedersen.compressCounter).toEqual(expectedNumHashing);
|
|
48
|
-
const level2Node0 = pedersen.compress(leaves[0], leaves[1]);
|
|
49
|
-
const level2Node1 = pedersen.compress(leaves[2], leaves[3]);
|
|
50
|
-
const level2Node2 = pedersen.compress(leaves[4], INITIAL_LEAF);
|
|
51
|
-
const level2ZeroHash = pedersen.compress(INITIAL_LEAF, INITIAL_LEAF);
|
|
52
|
-
const level1Node0 = pedersen.compress(level2Node0, level2Node1);
|
|
53
|
-
const level1Node1 = pedersen.compress(level2Node2, level2ZeroHash);
|
|
54
|
-
const root = pedersen.compress(level1Node0, level1Node1);
|
|
55
|
-
expect(tree.getRoot(true)).toEqual(root);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRfdHJlZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YW5kYXJkX3RyZWUvc3RhbmRhcmRfdHJlZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJdkQsT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxFQUFFLE9BQXdCLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUMvRixPQUFPLE1BQU0sT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuRSxDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxLQUFLLEVBQUUsT0FBd0IsRUFBRSxNQUFjLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDdEYsT0FBTyxNQUFNLFFBQVEsQ0FBQyxZQUFZLEVB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
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { Hasher } from '@aztec/types';
|
|
2
|
-
import { default as levelup } from 'levelup';
|
|
3
|
-
import { AppendOnlyTree } from '../interfaces/append_only_tree.js';
|
|
4
|
-
import { UpdateOnlyTree } from '../interfaces/update_only_tree.js';
|
|
5
|
-
export declare const standardBasedTreeTestSuite: (testName: string, createDb: (levelup: levelup.LevelUp<import("abstract-leveldown").AbstractLevelDOWN<any, any>, import("abstract-leveldown").AbstractIterator<any, any>>, hasher: Hasher, name: string, depth: number) => Promise<AppendOnlyTree | UpdateOnlyTree>) => void;
|
|
6
|
-
//# sourceMappingURL=standard_based_test_suite.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standard_based_test_suite.d.ts","sourceRoot":"","sources":["../../src/test/standard_based_test_suite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAe,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAMnE,eAAO,MAAM,0BAA0B,aAC3B,MAAM,kKAGN,MAAM,QACR,MAAM,SACL,MAAM,KACV,QAAQ,cAAc,GAAG,cAAc,CAAC,SAuH9C,CAAC"}
|