@@ -53,7 +53,7 @@ describe('Account Compression', () => {
53
53
54
54
await provider . connection . confirmTransaction (
55
55
await provider . connection . requestAirdrop ( payer , 1e10 ) ,
56
- 'confirmed'
56
+ 'confirmed' ,
57
57
) ;
58
58
} ) ;
59
59
@@ -89,41 +89,58 @@ describe('Account Compression', () => {
89
89
another = anotherKeyPair . publicKey ;
90
90
await provider . connection . confirmTransaction (
91
91
await provider . connection . requestAirdrop ( another , 1e10 ) ,
92
- 'confirmed'
92
+ 'confirmed' ,
93
93
) ;
94
94
} ) ;
95
95
it ( 'Should be able to finalize the tree' , async ( ) => {
96
96
const merkleTreeRaw = new MerkleTree ( leaves ) ;
97
97
const root = merkleTreeRaw . root ;
98
98
const leaf = leaves [ leaves . length - 1 ] ;
99
99
100
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
100
+ const finalize = createFinalizeMerkleTreeWithRootIx (
101
+ cmt ,
102
+ payer ,
103
+ root ,
104
+ leaf ,
105
+ leaves . length - 1 ,
106
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
107
+ ) ;
101
108
102
109
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
103
110
104
111
const splCMT = await ConcurrentMerkleTreeAccount . fromAccountAddress ( connection , cmt ) ;
105
112
assert ( splCMT . getMaxBufferSize ( ) === size , 'Buffer size does not match' ) ;
106
- assert ( splCMT . getCanopyDepth ( ) === canopyDepth , 'Canopy depth does not match: expected ' + canopyDepth + ' but got ' + splCMT . getCanopyDepth ( ) ) ;
113
+ assert (
114
+ splCMT . getCanopyDepth ( ) === canopyDepth ,
115
+ 'Canopy depth does not match: expected ' + canopyDepth + ' but got ' + splCMT . getCanopyDepth ( ) ,
116
+ ) ;
107
117
assert ( splCMT . getBufferSize ( ) == 1 , 'Buffer size does not match' ) ;
108
118
} ) ;
109
119
it ( 'Should fail to append canopy node for a tree without canopy' , async ( ) => {
110
120
const appendIx = createAppendCanopyNodesIx ( cmt , payer , [ crypto . randomBytes ( 32 ) ] , 0 ) ;
111
121
try {
112
122
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
113
123
assert ( false , 'Canopy appending should have failed to execute for a tree without canopy' ) ;
114
- } catch { }
124
+ } catch { }
115
125
} ) ;
116
126
it ( 'Should fail to finalize the tree with another payer authority' , async ( ) => {
117
127
const merkleTreeRaw = new MerkleTree ( leaves ) ;
118
128
const root = merkleTreeRaw . root ;
119
129
const leaf = leaves [ leaves . length - 1 ] ;
120
130
121
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , another , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
131
+ const finalize = createFinalizeMerkleTreeWithRootIx (
132
+ cmt ,
133
+ another ,
134
+ root ,
135
+ leaf ,
136
+ leaves . length - 1 ,
137
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
138
+ ) ;
122
139
123
140
try {
124
141
await execute ( provider , [ finalize ] , [ anotherKeyPair ] ) ;
125
142
assert ( false , 'Finalizing with another payer should have failed' ) ;
126
- } catch { }
143
+ } catch { }
127
144
} ) ;
128
145
it ( 'Should fail to finalize the tree with a wrong proof' , async ( ) => {
129
146
const merkleTreeRaw = new MerkleTree ( leaves ) ;
@@ -140,25 +157,30 @@ describe('Account Compression', () => {
140
157
try {
141
158
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
142
159
assert ( false , 'Finalizing with a wrong proof should have failed' ) ;
143
- } catch { }
160
+ } catch { }
144
161
} ) ;
145
162
it ( 'Should fail to double finalize the tree' , async ( ) => {
146
163
const merkleTreeRaw = new MerkleTree ( leaves ) ;
147
164
const root = merkleTreeRaw . root ;
148
165
const leaf = leaves [ leaves . length - 1 ] ;
149
166
150
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
167
+ const finalize = createFinalizeMerkleTreeWithRootIx (
168
+ cmt ,
169
+ payer ,
170
+ root ,
171
+ leaf ,
172
+ leaves . length - 1 ,
173
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
174
+ ) ;
151
175
152
176
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
153
177
154
178
try {
155
179
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
156
180
assert ( false , 'Double finalizing should have failed' ) ;
157
- } catch { }
181
+ } catch { }
158
182
} ) ;
159
- }
160
-
161
- ) ;
183
+ } ) ;
162
184
describe ( 'Having prepared a tree with canopy' , ( ) => {
163
185
const depth = 3 ;
164
186
const size = 8 ;
@@ -190,7 +212,7 @@ describe('Account Compression', () => {
190
212
another = anotherKeyPair . publicKey ;
191
213
await provider . connection . confirmTransaction (
192
214
await provider . connection . requestAirdrop ( another , 1e10 ) ,
193
- 'confirmed'
215
+ 'confirmed' ,
194
216
) ;
195
217
} ) ;
196
218
it ( 'Should be able to append a single canopy node' , async ( ) => {
@@ -210,40 +232,57 @@ describe('Account Compression', () => {
210
232
try {
211
233
await execute ( provider , [ appendIx ] , [ anotherKeyPair ] ) ;
212
234
assert ( false , 'Appending with another payer should have failed' ) ;
213
- } catch { }
235
+ } catch { }
214
236
} ) ;
215
237
it ( 'Should fail to append canopy nodes over the limit' , async ( ) => {
216
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , Array . from ( { length : 3 } , ( ) => crypto . randomBytes ( 32 ) ) , 0 ) ;
238
+ const appendIx = createAppendCanopyNodesIx (
239
+ cmt ,
240
+ payer ,
241
+ Array . from ( { length : 3 } , ( ) => crypto . randomBytes ( 32 ) ) ,
242
+ 0 ,
243
+ ) ;
217
244
try {
218
245
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
219
246
assert ( false , 'Appending over the limit should have failed' ) ;
220
- } catch { }
247
+ } catch { }
221
248
} ) ;
222
249
it ( 'Should fail to append canopy nodes over the limit starting from the last index' , async ( ) => {
223
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , Array . from ( { length : 2 } , ( ) => crypto . randomBytes ( 32 ) ) , 1 ) ;
250
+ const appendIx = createAppendCanopyNodesIx (
251
+ cmt ,
252
+ payer ,
253
+ Array . from ( { length : 2 } , ( ) => crypto . randomBytes ( 32 ) ) ,
254
+ 1 ,
255
+ ) ;
224
256
try {
225
257
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
226
258
assert ( false , 'Appending over the limit should have failed' ) ;
227
- } catch { }
259
+ } catch { }
228
260
} ) ;
229
261
it ( 'Should fail to append 0 canopy nodes' , async ( ) => {
230
262
const appendIx = createAppendCanopyNodesIx ( cmt , payer , [ ] , 0 ) ;
231
263
try {
232
264
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
233
265
assert ( false , 'Appending 0 nodes should have failed' ) ;
234
- } catch { }
266
+ } catch { }
235
267
} ) ;
236
268
it ( 'Should fail to finalize the tree without canopy' , async ( ) => {
237
269
const merkleTreeRaw = new MerkleTree ( leaves ) ;
238
270
const root = merkleTreeRaw . root ;
239
271
const leaf = leaves [ leaves . length - 1 ] ;
240
272
241
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
273
+ const finalize = createFinalizeMerkleTreeWithRootIx (
274
+ cmt ,
275
+ payer ,
276
+ root ,
277
+ leaf ,
278
+ leaves . length - 1 ,
279
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
280
+ ) ;
242
281
243
282
try {
244
283
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
245
284
assert ( false , 'Finalizing without canopy should have failed' ) ;
246
- } catch { }
285
+ } catch { }
247
286
} ) ;
248
287
it ( 'Should fail to finalize the tree with an incomplete canopy' , async ( ) => {
249
288
const merkleTreeRaw = new MerkleTree ( leaves ) ;
@@ -252,87 +291,189 @@ describe('Account Compression', () => {
252
291
253
292
const appendIx = createAppendCanopyNodesIx ( cmt , payer , [ merkleTreeRaw . leaves [ 0 ] . parent ! . node ! ] , 0 ) ;
254
293
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
255
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
294
+ const finalize = createFinalizeMerkleTreeWithRootIx (
295
+ cmt ,
296
+ payer ,
297
+ root ,
298
+ leaf ,
299
+ leaves . length - 1 ,
300
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
301
+ ) ;
256
302
257
303
try {
258
304
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
259
305
assert ( false , 'Finalization for an incomplete canopy should have failed' ) ;
260
- } catch { }
306
+ } catch { }
261
307
} ) ;
262
308
it ( 'Should finalize the tree with a complete canopy' , async ( ) => {
263
309
const merkleTreeRaw = new MerkleTree ( leaves ) ;
264
310
const root = merkleTreeRaw . root ;
265
311
const leaf = leaves [ leaves . length - 1 ] ;
266
312
267
313
// take every second leaf and append it's parent node to the canopy
268
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 0 ) ;
314
+ const appendIx = createAppendCanopyNodesIx (
315
+ cmt ,
316
+ payer ,
317
+ merkleTreeRaw . leaves . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) ,
318
+ 0 ,
319
+ ) ;
269
320
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
270
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
321
+ const finalize = createFinalizeMerkleTreeWithRootIx (
322
+ cmt ,
323
+ payer ,
324
+ root ,
325
+ leaf ,
326
+ leaves . length - 1 ,
327
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
328
+ ) ;
271
329
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
272
330
} ) ;
273
331
it ( 'Should be able to setup canopy with several transactions' , async ( ) => {
274
332
const merkleTreeRaw = new MerkleTree ( leaves ) ;
275
333
const root = merkleTreeRaw . root ;
276
334
const leaf = leaves [ leaves . length - 1 ] ;
277
335
// take every second leaf of the first half of a tree and append it's parent node to the canopy
278
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . slice ( 0 , leaves . length / 2 ) . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 0 ) ;
336
+ const appendIx = createAppendCanopyNodesIx (
337
+ cmt ,
338
+ payer ,
339
+ merkleTreeRaw . leaves
340
+ . slice ( 0 , leaves . length / 2 )
341
+ . filter ( ( _ , i ) => i % 2 === 0 )
342
+ . map ( leaf => leaf . parent ! . node ! ) ,
343
+ 0 ,
344
+ ) ;
279
345
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
280
346
// take every second leaf of the second half of a tree and append it's parent node to the canopy
281
- const appendIx2 = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . slice ( leaves . length / 2 ) . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 2 ) ;
347
+ const appendIx2 = createAppendCanopyNodesIx (
348
+ cmt ,
349
+ payer ,
350
+ merkleTreeRaw . leaves
351
+ . slice ( leaves . length / 2 )
352
+ . filter ( ( _ , i ) => i % 2 === 0 )
353
+ . map ( leaf => leaf . parent ! . node ! ) ,
354
+ 2 ,
355
+ ) ;
282
356
await execute ( provider , [ appendIx2 ] , [ payerKeypair ] ) ;
283
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
357
+ const finalize = createFinalizeMerkleTreeWithRootIx (
358
+ cmt ,
359
+ payer ,
360
+ root ,
361
+ leaf ,
362
+ leaves . length - 1 ,
363
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
364
+ ) ;
284
365
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
285
366
} ) ;
286
367
it ( 'Should be able to setup canopy with several transactions in reverse order' , async ( ) => {
287
368
const merkleTreeRaw = new MerkleTree ( leaves ) ;
288
369
const root = merkleTreeRaw . root ;
289
370
const leaf = leaves [ leaves . length - 1 ] ;
290
371
291
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . slice ( leaves . length / 2 ) . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 2 ) ;
372
+ const appendIx = createAppendCanopyNodesIx (
373
+ cmt ,
374
+ payer ,
375
+ merkleTreeRaw . leaves
376
+ . slice ( leaves . length / 2 )
377
+ . filter ( ( _ , i ) => i % 2 === 0 )
378
+ . map ( leaf => leaf . parent ! . node ! ) ,
379
+ 2 ,
380
+ ) ;
292
381
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
293
- const appendIx2 = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . slice ( 0 , leaves . length / 2 ) . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 0 ) ;
382
+ const appendIx2 = createAppendCanopyNodesIx (
383
+ cmt ,
384
+ payer ,
385
+ merkleTreeRaw . leaves
386
+ . slice ( 0 , leaves . length / 2 )
387
+ . filter ( ( _ , i ) => i % 2 === 0 )
388
+ . map ( leaf => leaf . parent ! . node ! ) ,
389
+ 0 ,
390
+ ) ;
294
391
await execute ( provider , [ appendIx2 ] , [ payerKeypair ] ) ;
295
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
392
+ const finalize = createFinalizeMerkleTreeWithRootIx (
393
+ cmt ,
394
+ payer ,
395
+ root ,
396
+ leaf ,
397
+ leaves . length - 1 ,
398
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
399
+ ) ;
296
400
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
297
401
} ) ;
298
402
it ( 'Should be able to replace a canopy node' , async ( ) => {
299
403
const merkleTreeRaw = new MerkleTree ( leaves ) ;
300
404
const root = merkleTreeRaw . root ;
301
405
const leaf = leaves [ leaves . length - 1 ] ;
302
406
303
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . slice ( 0 , leaves . length / 2 ) . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 0 ) ;
407
+ const appendIx = createAppendCanopyNodesIx (
408
+ cmt ,
409
+ payer ,
410
+ merkleTreeRaw . leaves
411
+ . slice ( 0 , leaves . length / 2 )
412
+ . filter ( ( _ , i ) => i % 2 === 0 )
413
+ . map ( leaf => leaf . parent ! . node ! ) ,
414
+ 0 ,
415
+ ) ;
304
416
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
305
417
const appendIx2 = createAppendCanopyNodesIx ( cmt , payer , [ crypto . randomBytes ( 32 ) ] , 2 ) ;
306
418
await execute ( provider , [ appendIx2 ] , [ payerKeypair ] ) ;
307
- const replaceIx = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . slice ( leaves . length / 2 ) . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 2 ) ;
419
+ const replaceIx = createAppendCanopyNodesIx (
420
+ cmt ,
421
+ payer ,
422
+ merkleTreeRaw . leaves
423
+ . slice ( leaves . length / 2 )
424
+ . filter ( ( _ , i ) => i % 2 === 0 )
425
+ . map ( leaf => leaf . parent ! . node ! ) ,
426
+ 2 ,
427
+ ) ;
308
428
await execute ( provider , [ replaceIx ] , [ payerKeypair ] ) ;
309
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
429
+ const finalize = createFinalizeMerkleTreeWithRootIx (
430
+ cmt ,
431
+ payer ,
432
+ root ,
433
+ leaf ,
434
+ leaves . length - 1 ,
435
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
436
+ ) ;
310
437
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
311
438
} ) ;
312
439
it ( 'Should fail to replace a canopy node for a finalised tree' , async ( ) => {
313
440
const merkleTreeRaw = new MerkleTree ( leaves ) ;
314
441
const root = merkleTreeRaw . root ;
315
442
const leaf = leaves [ leaves . length - 1 ] ;
316
443
317
- const appendIx = createAppendCanopyNodesIx ( cmt , payer , merkleTreeRaw . leaves . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) , 0 ) ;
444
+ const appendIx = createAppendCanopyNodesIx (
445
+ cmt ,
446
+ payer ,
447
+ merkleTreeRaw . leaves . filter ( ( _ , i ) => i % 2 === 0 ) . map ( leaf => leaf . parent ! . node ! ) ,
448
+ 0 ,
449
+ ) ;
318
450
await execute ( provider , [ appendIx ] , [ payerKeypair ] ) ;
319
- const finalize = createFinalizeMerkleTreeWithRootIx ( cmt , payer , root , leaf , leaves . length - 1 , merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ) ;
451
+ const finalize = createFinalizeMerkleTreeWithRootIx (
452
+ cmt ,
453
+ payer ,
454
+ root ,
455
+ leaf ,
456
+ leaves . length - 1 ,
457
+ merkleTreeRaw . getProof ( leaves . length - 1 ) . proof ,
458
+ ) ;
320
459
await execute ( provider , [ finalize ] , [ payerKeypair ] ) ;
321
460
const replaceIx = createAppendCanopyNodesIx ( cmt , payer , [ crypto . randomBytes ( 32 ) ] , 0 ) ;
322
461
try {
323
462
await execute ( provider , [ replaceIx ] , [ payerKeypair ] ) ;
324
463
assert ( false , 'Replacing a canopy node for a finalised tree should have failed' ) ;
325
- } catch { }
464
+ } catch { }
326
465
} ) ;
327
466
it ( 'Should fail to initialize an empty tree after preparing a tree' , async ( ) => {
328
- const ixs = [ createInitEmptyMerkleTreeIx ( cmt , payer , {
329
- maxBufferSize : size ,
330
- maxDepth : depth ,
331
- } ) ] ;
467
+ const ixs = [
468
+ createInitEmptyMerkleTreeIx ( cmt , payer , {
469
+ maxBufferSize : size ,
470
+ maxDepth : depth ,
471
+ } ) ,
472
+ ] ;
332
473
try {
333
474
await execute ( provider , ixs , [ payerKeypair ] ) ;
334
475
assert ( false , 'Initializing an empty tree after preparing a tree should have failed' ) ;
335
- } catch { }
476
+ } catch { }
336
477
} ) ;
337
478
} ) ;
338
479
0 commit comments