@@ -52,6 +52,20 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
52
52
} ) ;
53
53
} ) ;
54
54
55
+ describe ( 'unwindBlocks' , ( ) => {
56
+ it ( 'unwinding blocks will remove blocks from the chain' , async ( ) => {
57
+ await store . addBlocks ( blocks ) ;
58
+ const blockNumber = await store . getSynchedL2BlockNumber ( ) ;
59
+
60
+ expect ( await store . getBlocks ( blockNumber , 1 ) ) . toEqual ( [ blocks [ blocks . length - 1 ] ] ) ;
61
+
62
+ await store . unwindBlocks ( blockNumber , 1 ) ;
63
+
64
+ expect ( await store . getSynchedL2BlockNumber ( ) ) . toBe ( blockNumber - 1 ) ;
65
+ expect ( await store . getBlocks ( blockNumber , 1 ) ) . toEqual ( [ ] ) ;
66
+ } ) ;
67
+ } ) ;
68
+
55
69
describe ( 'getBlocks' , ( ) => {
56
70
beforeEach ( async ( ) => {
57
71
await store . addBlocks ( blocks ) ;
@@ -120,12 +134,32 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
120
134
} ) ;
121
135
} ) ;
122
136
137
+ describe ( 'deleteLogs' , ( ) => {
138
+ it ( 'deletes encrypted & unencrypted logs' , async ( ) => {
139
+ const block = blocks [ 0 ] . data ;
140
+ await store . addBlocks ( [ blocks [ 0 ] ] ) ;
141
+ await expect ( store . addLogs ( [ block ] ) ) . resolves . toEqual ( true ) ;
142
+
143
+ expect ( ( await store . getLogs ( 1 , 1 , LogType . NOTEENCRYPTED ) ) [ 0 ] ) . toEqual ( block . body . noteEncryptedLogs ) ;
144
+ expect ( ( await store . getLogs ( 1 , 1 , LogType . ENCRYPTED ) ) [ 0 ] ) . toEqual ( block . body . encryptedLogs ) ;
145
+ expect ( ( await store . getLogs ( 1 , 1 , LogType . UNENCRYPTED ) ) [ 0 ] ) . toEqual ( block . body . unencryptedLogs ) ;
146
+
147
+ // This one is a pain for memory as we would never want to just delete memory in the middle.
148
+ await store . deleteLogs ( [ block ] ) ;
149
+
150
+ expect ( ( await store . getLogs ( 1 , 1 , LogType . NOTEENCRYPTED ) ) [ 0 ] ) . toEqual ( undefined ) ;
151
+ expect ( ( await store . getLogs ( 1 , 1 , LogType . ENCRYPTED ) ) [ 0 ] ) . toEqual ( undefined ) ;
152
+ expect ( ( await store . getLogs ( 1 , 1 , LogType . UNENCRYPTED ) ) [ 0 ] ) . toEqual ( undefined ) ;
153
+ } ) ;
154
+ } ) ;
155
+
123
156
describe . each ( [
124
157
[ 'note_encrypted' , LogType . NOTEENCRYPTED ] ,
125
158
[ 'encrypted' , LogType . ENCRYPTED ] ,
126
159
[ 'unencrypted' , LogType . UNENCRYPTED ] ,
127
160
] ) ( 'getLogs (%s)' , ( _ , logType ) => {
128
161
beforeEach ( async ( ) => {
162
+ await store . addBlocks ( blocks ) ;
129
163
await store . addLogs ( blocks . map ( b => b . data ) ) ;
130
164
} ) ;
131
165
@@ -167,6 +201,24 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
167
201
it ( 'returns undefined if tx is not found' , async ( ) => {
168
202
await expect ( store . getTxEffect ( new TxHash ( Fr . random ( ) . toBuffer ( ) ) ) ) . resolves . toBeUndefined ( ) ;
169
203
} ) ;
204
+
205
+ it . each ( [
206
+ ( ) => blocks [ 0 ] . data . body . txEffects [ 0 ] ,
207
+ ( ) => blocks [ 9 ] . data . body . txEffects [ 3 ] ,
208
+ ( ) => blocks [ 3 ] . data . body . txEffects [ 1 ] ,
209
+ ( ) => blocks [ 5 ] . data . body . txEffects [ 2 ] ,
210
+ ( ) => blocks [ 1 ] . data . body . txEffects [ 0 ] ,
211
+ ] ) ( 'tries to retrieves a previously stored transaction after deleted' , async getExpectedTx => {
212
+ await store . unwindBlocks ( blocks . length , blocks . length ) ;
213
+
214
+ const expectedTx = getExpectedTx ( ) ;
215
+ const actualTx = await store . getTxEffect ( expectedTx . txHash ) ;
216
+ expect ( actualTx ) . toEqual ( undefined ) ;
217
+ } ) ;
218
+
219
+ it ( 'returns undefined if tx is not found' , async ( ) => {
220
+ await expect ( store . getTxEffect ( new TxHash ( Fr . random ( ) . toBuffer ( ) ) ) ) . resolves . toBeUndefined ( ) ;
221
+ } ) ;
170
222
} ) ;
171
223
172
224
describe ( 'L1 to L2 Messages' , ( ) => {
@@ -237,6 +289,11 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
237
289
it ( 'returns undefined if contract instance is not found' , async ( ) => {
238
290
await expect ( store . getContractInstance ( AztecAddress . random ( ) ) ) . resolves . toBeUndefined ( ) ;
239
291
} ) ;
292
+
293
+ it ( 'returns undefined if previously stored contract instances was deleted' , async ( ) => {
294
+ await store . deleteContractInstances ( [ contractInstance ] , blockNum ) ;
295
+ await expect ( store . getContractInstance ( contractInstance . address ) ) . resolves . toBeUndefined ( ) ;
296
+ } ) ;
240
297
} ) ;
241
298
242
299
describe ( 'contractClasses' , ( ) => {
@@ -252,6 +309,17 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
252
309
await expect ( store . getContractClass ( contractClass . id ) ) . resolves . toMatchObject ( contractClass ) ;
253
310
} ) ;
254
311
312
+ it ( 'returns undefined if the initial deployed contract class was deleted' , async ( ) => {
313
+ await store . deleteContractClasses ( [ contractClass ] , blockNum ) ;
314
+ await expect ( store . getContractClass ( contractClass . id ) ) . resolves . toBeUndefined ( ) ;
315
+ } ) ;
316
+
317
+ it ( 'returns contract class if later "deployment" class was deleted' , async ( ) => {
318
+ await store . addContractClasses ( [ contractClass ] , blockNum + 1 ) ;
319
+ await store . deleteContractClasses ( [ contractClass ] , blockNum + 1 ) ;
320
+ await expect ( store . getContractClass ( contractClass . id ) ) . resolves . toMatchObject ( contractClass ) ;
321
+ } ) ;
322
+
255
323
it ( 'returns undefined if contract class is not found' , async ( ) => {
256
324
await expect ( store . getContractClass ( Fr . random ( ) ) ) . resolves . toBeUndefined ( ) ;
257
325
} ) ;
@@ -304,6 +372,24 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
304
372
await store . addLogs ( blocks . map ( b => b . data ) ) ;
305
373
} ) ;
306
374
375
+ it ( 'no logs returned if deleted ("txHash" filter param is respected variant)' , async ( ) => {
376
+ // get random tx
377
+ const targetBlockIndex = randomInt ( numBlocks ) ;
378
+ const targetTxIndex = randomInt ( txsPerBlock ) ;
379
+ const targetTxHash = blocks [ targetBlockIndex ] . data . body . txEffects [ targetTxIndex ] . txHash ;
380
+
381
+ await Promise . all ( [
382
+ store . unwindBlocks ( blocks . length , blocks . length ) ,
383
+ store . deleteLogs ( blocks . map ( b => b . data ) ) ,
384
+ ] ) ;
385
+
386
+ const response = await store . getUnencryptedLogs ( { txHash : targetTxHash } ) ;
387
+ const logs = response . logs ;
388
+
389
+ expect ( response . maxLogsHit ) . toBeFalsy ( ) ;
390
+ expect ( logs . length ) . toEqual ( 0 ) ;
391
+ } ) ;
392
+
307
393
it ( '"txHash" filter param is respected' , async ( ) => {
308
394
// get random tx
309
395
const targetBlockIndex = randomInt ( numBlocks ) ;
0 commit comments