@aztec/kv-store 0.0.0-test.0

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.
Files changed (166) hide show
  1. package/README.md +10 -0
  2. package/dest/config.d.ts +17 -0
  3. package/dest/config.d.ts.map +1 -0
  4. package/dest/config.js +24 -0
  5. package/dest/indexeddb/array.d.ts +21 -0
  6. package/dest/indexeddb/array.d.ts.map +1 -0
  7. package/dest/indexeddb/array.js +104 -0
  8. package/dest/indexeddb/index.d.ts +7 -0
  9. package/dest/indexeddb/index.d.ts.map +1 -0
  10. package/dest/indexeddb/index.js +19 -0
  11. package/dest/indexeddb/map.d.ts +26 -0
  12. package/dest/indexeddb/map.d.ts.map +1 -0
  13. package/dest/indexeddb/map.js +133 -0
  14. package/dest/indexeddb/set.d.ts +17 -0
  15. package/dest/indexeddb/set.d.ts.map +1 -0
  16. package/dest/indexeddb/set.js +24 -0
  17. package/dest/indexeddb/singleton.d.ts +16 -0
  18. package/dest/indexeddb/singleton.d.ts.map +1 -0
  19. package/dest/indexeddb/singleton.js +37 -0
  20. package/dest/indexeddb/store.d.ts +97 -0
  21. package/dest/indexeddb/store.d.ts.map +1 -0
  22. package/dest/indexeddb/store.js +164 -0
  23. package/dest/interfaces/array.d.ts +80 -0
  24. package/dest/interfaces/array.d.ts.map +1 -0
  25. package/dest/interfaces/array.js +3 -0
  26. package/dest/interfaces/array_test_suite.d.ts +3 -0
  27. package/dest/interfaces/array_test_suite.d.ts.map +1 -0
  28. package/dest/interfaces/array_test_suite.js +104 -0
  29. package/dest/interfaces/common.d.ts +23 -0
  30. package/dest/interfaces/common.d.ts.map +1 -0
  31. package/dest/interfaces/common.js +3 -0
  32. package/dest/interfaces/counter.d.ts +59 -0
  33. package/dest/interfaces/counter.d.ts.map +1 -0
  34. package/dest/interfaces/counter.js +1 -0
  35. package/dest/interfaces/index.d.ts +8 -0
  36. package/dest/interfaces/index.d.ts.map +1 -0
  37. package/dest/interfaces/index.js +6 -0
  38. package/dest/interfaces/map.d.ts +134 -0
  39. package/dest/interfaces/map.d.ts.map +1 -0
  40. package/dest/interfaces/map.js +3 -0
  41. package/dest/interfaces/map_test_suite.d.ts +3 -0
  42. package/dest/interfaces/map_test_suite.d.ts.map +1 -0
  43. package/dest/interfaces/map_test_suite.js +151 -0
  44. package/dest/interfaces/set.d.ts +44 -0
  45. package/dest/interfaces/set.d.ts.map +1 -0
  46. package/dest/interfaces/set.js +1 -0
  47. package/dest/interfaces/set_test_suite.d.ts +3 -0
  48. package/dest/interfaces/set_test_suite.d.ts.map +1 -0
  49. package/dest/interfaces/set_test_suite.js +96 -0
  50. package/dest/interfaces/singleton.d.ts +29 -0
  51. package/dest/interfaces/singleton.d.ts.map +1 -0
  52. package/dest/interfaces/singleton.js +4 -0
  53. package/dest/interfaces/singleton_test_suite.d.ts +3 -0
  54. package/dest/interfaces/singleton_test_suite.d.ts.map +1 -0
  55. package/dest/interfaces/singleton_test_suite.js +30 -0
  56. package/dest/interfaces/store.d.ts +145 -0
  57. package/dest/interfaces/store.d.ts.map +1 -0
  58. package/dest/interfaces/store.js +1 -0
  59. package/dest/interfaces/store_test_suite.d.ts +3 -0
  60. package/dest/interfaces/store_test_suite.d.ts.map +1 -0
  61. package/dest/interfaces/store_test_suite.js +37 -0
  62. package/dest/interfaces/utils.d.ts +16 -0
  63. package/dest/interfaces/utils.d.ts.map +1 -0
  64. package/dest/interfaces/utils.js +16 -0
  65. package/dest/lmdb/array.d.ts +23 -0
  66. package/dest/lmdb/array.d.ts.map +1 -0
  67. package/dest/lmdb/array.js +117 -0
  68. package/dest/lmdb/counter.d.ts +19 -0
  69. package/dest/lmdb/counter.d.ts.map +1 -0
  70. package/dest/lmdb/counter.js +50 -0
  71. package/dest/lmdb/index.d.ts +12 -0
  72. package/dest/lmdb/index.d.ts.map +1 -0
  73. package/dest/lmdb/index.js +25 -0
  74. package/dest/lmdb/map.d.ts +52 -0
  75. package/dest/lmdb/map.d.ts.map +1 -0
  76. package/dest/lmdb/map.js +222 -0
  77. package/dest/lmdb/set.d.ts +18 -0
  78. package/dest/lmdb/set.d.ts.map +1 -0
  79. package/dest/lmdb/set.js +32 -0
  80. package/dest/lmdb/singleton.d.ts +14 -0
  81. package/dest/lmdb/singleton.d.ts.map +1 -0
  82. package/dest/lmdb/singleton.js +26 -0
  83. package/dest/lmdb/store.d.ts +110 -0
  84. package/dest/lmdb/store.d.ts.map +1 -0
  85. package/dest/lmdb/store.js +216 -0
  86. package/dest/lmdb-v2/array.d.ts +18 -0
  87. package/dest/lmdb-v2/array.d.ts.map +1 -0
  88. package/dest/lmdb-v2/array.js +101 -0
  89. package/dest/lmdb-v2/factory.d.ts +12 -0
  90. package/dest/lmdb-v2/factory.d.ts.map +1 -0
  91. package/dest/lmdb-v2/factory.js +60 -0
  92. package/dest/lmdb-v2/index.d.ts +3 -0
  93. package/dest/lmdb-v2/index.d.ts.map +1 -0
  94. package/dest/lmdb-v2/index.js +2 -0
  95. package/dest/lmdb-v2/map.d.ts +86 -0
  96. package/dest/lmdb-v2/map.d.ts.map +1 -0
  97. package/dest/lmdb-v2/map.js +193 -0
  98. package/dest/lmdb-v2/message.d.ts +112 -0
  99. package/dest/lmdb-v2/message.d.ts.map +1 -0
  100. package/dest/lmdb-v2/message.js +18 -0
  101. package/dest/lmdb-v2/read_transaction.d.ts +14 -0
  102. package/dest/lmdb-v2/read_transaction.d.ts.map +1 -0
  103. package/dest/lmdb-v2/read_transaction.js +101 -0
  104. package/dest/lmdb-v2/singleton.d.ts +12 -0
  105. package/dest/lmdb-v2/singleton.d.ts.map +1 -0
  106. package/dest/lmdb-v2/singleton.js +31 -0
  107. package/dest/lmdb-v2/store.d.ts +43 -0
  108. package/dest/lmdb-v2/store.d.ts.map +1 -0
  109. package/dest/lmdb-v2/store.js +181 -0
  110. package/dest/lmdb-v2/utils.d.ts +19 -0
  111. package/dest/lmdb-v2/utils.d.ts.map +1 -0
  112. package/dest/lmdb-v2/utils.js +126 -0
  113. package/dest/lmdb-v2/write_transaction.d.ts +19 -0
  114. package/dest/lmdb-v2/write_transaction.d.ts.map +1 -0
  115. package/dest/lmdb-v2/write_transaction.js +254 -0
  116. package/dest/stores/index.d.ts +2 -0
  117. package/dest/stores/index.d.ts.map +1 -0
  118. package/dest/stores/index.js +1 -0
  119. package/dest/stores/l2_tips_store.d.ts +13 -0
  120. package/dest/stores/l2_tips_store.d.ts.map +1 -0
  121. package/dest/stores/l2_tips_store.js +65 -0
  122. package/dest/utils.d.ts +12 -0
  123. package/dest/utils.d.ts.map +1 -0
  124. package/dest/utils.js +24 -0
  125. package/package.json +99 -0
  126. package/src/config.ts +34 -0
  127. package/src/indexeddb/array.ts +118 -0
  128. package/src/indexeddb/index.ts +29 -0
  129. package/src/indexeddb/map.ts +142 -0
  130. package/src/indexeddb/set.ts +37 -0
  131. package/src/indexeddb/singleton.ts +49 -0
  132. package/src/indexeddb/store.ts +197 -0
  133. package/src/interfaces/array.ts +90 -0
  134. package/src/interfaces/array_test_suite.ts +130 -0
  135. package/src/interfaces/common.ts +20 -0
  136. package/src/interfaces/counter.ts +65 -0
  137. package/src/interfaces/index.ts +7 -0
  138. package/src/interfaces/map.ts +151 -0
  139. package/src/interfaces/map_test_suite.ts +143 -0
  140. package/src/interfaces/set.ts +48 -0
  141. package/src/interfaces/set_test_suite.ts +81 -0
  142. package/src/interfaces/singleton.ts +29 -0
  143. package/src/interfaces/singleton_test_suite.ts +46 -0
  144. package/src/interfaces/store.ts +177 -0
  145. package/src/interfaces/store_test_suite.ts +56 -0
  146. package/src/interfaces/utils.ts +21 -0
  147. package/src/lmdb/array.ts +139 -0
  148. package/src/lmdb/counter.ts +67 -0
  149. package/src/lmdb/index.ts +37 -0
  150. package/src/lmdb/map.ts +248 -0
  151. package/src/lmdb/set.ts +45 -0
  152. package/src/lmdb/singleton.ts +35 -0
  153. package/src/lmdb/store.ts +263 -0
  154. package/src/lmdb-v2/array.ts +115 -0
  155. package/src/lmdb-v2/factory.ts +98 -0
  156. package/src/lmdb-v2/index.ts +2 -0
  157. package/src/lmdb-v2/map.ts +233 -0
  158. package/src/lmdb-v2/message.ts +146 -0
  159. package/src/lmdb-v2/read_transaction.ts +116 -0
  160. package/src/lmdb-v2/singleton.ts +34 -0
  161. package/src/lmdb-v2/store.ts +237 -0
  162. package/src/lmdb-v2/utils.ts +150 -0
  163. package/src/lmdb-v2/write_transaction.ts +314 -0
  164. package/src/stores/index.ts +1 -0
  165. package/src/stores/l2_tips_store.ts +70 -0
  166. package/src/utils.ts +40 -0
@@ -0,0 +1,70 @@
1
+ import type {
2
+ L2BlockId,
3
+ L2BlockStreamEvent,
4
+ L2BlockStreamEventHandler,
5
+ L2BlockStreamLocalDataProvider,
6
+ L2BlockTag,
7
+ L2Tips,
8
+ } from '@aztec/stdlib/block';
9
+
10
+ import type { AztecAsyncMap } from '../interfaces/map.js';
11
+ import type { AztecAsyncKVStore } from '../interfaces/store.js';
12
+
13
+ /** Stores currently synced L2 tips and unfinalized block hashes. */
14
+ export class L2TipsStore implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider {
15
+ private readonly l2TipsStore: AztecAsyncMap<L2BlockTag, number>;
16
+ private readonly l2BlockHashesStore: AztecAsyncMap<number, string>;
17
+
18
+ constructor(store: AztecAsyncKVStore, namespace: string) {
19
+ this.l2TipsStore = store.openMap([namespace, 'l2_tips'].join('_'));
20
+ this.l2BlockHashesStore = store.openMap([namespace, 'l2_block_hashes'].join('_'));
21
+ }
22
+
23
+ public getL2BlockHash(number: number): Promise<string | undefined> {
24
+ return this.l2BlockHashesStore.getAsync(number);
25
+ }
26
+
27
+ public async getL2Tips(): Promise<L2Tips> {
28
+ return {
29
+ latest: await this.getL2Tip('latest'),
30
+ finalized: await this.getL2Tip('finalized'),
31
+ proven: await this.getL2Tip('proven'),
32
+ };
33
+ }
34
+
35
+ private async getL2Tip(tag: L2BlockTag): Promise<L2BlockId> {
36
+ const blockNumber = await this.l2TipsStore.getAsync(tag);
37
+ if (blockNumber === undefined || blockNumber === 0) {
38
+ return { number: 0, hash: undefined };
39
+ }
40
+ const blockHash = await this.l2BlockHashesStore.getAsync(blockNumber);
41
+ if (!blockHash) {
42
+ throw new Error(`Block hash not found for block number ${blockNumber}`);
43
+ }
44
+
45
+ return { number: blockNumber, hash: blockHash };
46
+ }
47
+
48
+ public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
49
+ switch (event.type) {
50
+ case 'blocks-added':
51
+ for (const block of event.blocks) {
52
+ await this.l2BlockHashesStore.set(block.number, (await block.header.hash()).toString());
53
+ }
54
+ await this.l2TipsStore.set('latest', event.blocks.at(-1)!.number);
55
+ break;
56
+ case 'chain-pruned':
57
+ await this.l2TipsStore.set('latest', event.blockNumber);
58
+ break;
59
+ case 'chain-proven':
60
+ await this.l2TipsStore.set('proven', event.blockNumber);
61
+ break;
62
+ case 'chain-finalized':
63
+ await this.l2TipsStore.set('finalized', event.blockNumber);
64
+ for await (const key of this.l2BlockHashesStore.keysAsync({ end: event.blockNumber })) {
65
+ await this.l2BlockHashesStore.delete(key);
66
+ }
67
+ break;
68
+ }
69
+ }
70
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { EthAddress } from '@aztec/foundation/eth-address';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+
4
+ import type { AztecAsyncSingleton, AztecSingleton } from './interfaces/singleton.js';
5
+ import type { AztecAsyncKVStore, AztecKVStore } from './interfaces/store.js';
6
+ import { isSyncStore } from './interfaces/utils.js';
7
+
8
+ /**
9
+ * Clears the store if the rollup address does not match the one stored in the database.
10
+ * This is to prevent data from being accidentally shared between different rollup instances.
11
+ * @param store - The store to check
12
+ * @param rollupAddress - The ETH address of the rollup contract
13
+ * @returns A promise that resolves when the store is cleared, or rejects if the rollup address does not match
14
+ */
15
+ export async function initStoreForRollup<T extends AztecKVStore | AztecAsyncKVStore>(
16
+ store: T,
17
+ rollupAddress: EthAddress,
18
+ log?: Logger,
19
+ ): Promise<T> {
20
+ if (!rollupAddress) {
21
+ throw new Error('Rollup address is required');
22
+ }
23
+ const rollupAddressValue = store.openSingleton<ReturnType<EthAddress['toString']>>('rollupAddress');
24
+ const rollupAddressString = rollupAddress.toString();
25
+ const storedRollupAddressString = isSyncStore(store)
26
+ ? (rollupAddressValue as AztecSingleton<ReturnType<EthAddress['toString']>>).get()
27
+ : await (rollupAddressValue as AztecAsyncSingleton<ReturnType<EthAddress['toString']>>).getAsync();
28
+
29
+ if (typeof storedRollupAddressString !== 'undefined' && storedRollupAddressString !== rollupAddressString) {
30
+ log?.warn(`Rollup address mismatch. Clearing entire database...`, {
31
+ expected: rollupAddressString,
32
+ found: storedRollupAddressString,
33
+ });
34
+
35
+ await store.clear();
36
+ }
37
+
38
+ await rollupAddressValue.set(rollupAddressString);
39
+ return store;
40
+ }