@aztec/stdlib 4.0.0-nightly.20260111 → 4.0.0-nightly.20260113

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 (143) hide show
  1. package/dest/block/attestation_info.d.ts +5 -5
  2. package/dest/block/attestation_info.d.ts.map +1 -1
  3. package/dest/block/attestation_info.js +4 -4
  4. package/dest/block/l2_block.d.ts +6 -3
  5. package/dest/block/l2_block.d.ts.map +1 -1
  6. package/dest/block/l2_block.js +2 -2
  7. package/dest/block/l2_block_new.d.ts +1 -2
  8. package/dest/block/l2_block_new.d.ts.map +1 -1
  9. package/dest/block/l2_block_new.js +4 -1
  10. package/dest/block/l2_block_source.d.ts +245 -41
  11. package/dest/block/l2_block_source.d.ts.map +1 -1
  12. package/dest/block/l2_block_source.js +23 -5
  13. package/dest/block/l2_block_stream/index.d.ts +2 -1
  14. package/dest/block/l2_block_stream/index.d.ts.map +1 -1
  15. package/dest/block/l2_block_stream/index.js +1 -0
  16. package/dest/block/l2_block_stream/interfaces.d.ts +16 -5
  17. package/dest/block/l2_block_stream/interfaces.d.ts.map +1 -1
  18. package/dest/block/l2_block_stream/l2_block_stream.d.ts +4 -2
  19. package/dest/block/l2_block_stream/l2_block_stream.d.ts.map +1 -1
  20. package/dest/block/l2_block_stream/l2_block_stream.js +102 -30
  21. package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts +24 -16
  22. package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts.map +1 -1
  23. package/dest/block/l2_block_stream/l2_tips_memory_store.js +55 -61
  24. package/dest/block/l2_block_stream/l2_tips_store_base.d.ts +49 -0
  25. package/dest/block/l2_block_stream/l2_tips_store_base.d.ts.map +1 -0
  26. package/dest/block/l2_block_stream/l2_tips_store_base.js +179 -0
  27. package/dest/block/test/l2_tips_store_test_suite.d.ts +1 -1
  28. package/dest/block/test/l2_tips_store_test_suite.d.ts.map +1 -1
  29. package/dest/block/test/l2_tips_store_test_suite.js +483 -38
  30. package/dest/block/validate_block_result.d.ts +24 -24
  31. package/dest/block/validate_block_result.d.ts.map +1 -1
  32. package/dest/block/validate_block_result.js +13 -13
  33. package/dest/checkpoint/checkpoint.d.ts +1 -1
  34. package/dest/checkpoint/checkpoint.d.ts.map +1 -1
  35. package/dest/checkpoint/checkpoint.js +1 -0
  36. package/dest/checkpoint/checkpoint_info.d.ts +32 -3
  37. package/dest/checkpoint/checkpoint_info.d.ts.map +1 -1
  38. package/dest/checkpoint/checkpoint_info.js +34 -1
  39. package/dest/checkpoint/index.d.ts +2 -1
  40. package/dest/checkpoint/index.d.ts.map +1 -1
  41. package/dest/checkpoint/index.js +1 -0
  42. package/dest/interfaces/api_limit.d.ts +2 -1
  43. package/dest/interfaces/api_limit.d.ts.map +1 -1
  44. package/dest/interfaces/api_limit.js +1 -0
  45. package/dest/interfaces/archiver.d.ts +6 -6
  46. package/dest/interfaces/archiver.d.ts.map +1 -1
  47. package/dest/interfaces/archiver.js +6 -4
  48. package/dest/interfaces/aztec-node-admin.d.ts +12 -6
  49. package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
  50. package/dest/interfaces/aztec-node-admin.js +2 -2
  51. package/dest/interfaces/aztec-node.d.ts +2 -2
  52. package/dest/interfaces/aztec-node.d.ts.map +1 -1
  53. package/dest/interfaces/aztec-node.js +8 -3
  54. package/dest/interfaces/configs.d.ts +6 -1
  55. package/dest/interfaces/configs.d.ts.map +1 -1
  56. package/dest/interfaces/configs.js +2 -1
  57. package/dest/interfaces/p2p.d.ts +7 -9
  58. package/dest/interfaces/p2p.d.ts.map +1 -1
  59. package/dest/interfaces/p2p.js +3 -4
  60. package/dest/interfaces/proving-job.d.ts +166 -166
  61. package/dest/interfaces/validator.d.ts +41 -7
  62. package/dest/interfaces/validator.d.ts.map +1 -1
  63. package/dest/interfaces/validator.js +3 -1
  64. package/dest/kernel/hints/build_note_hash_read_request_hints.d.ts +6 -5
  65. package/dest/kernel/hints/build_note_hash_read_request_hints.d.ts.map +1 -1
  66. package/dest/kernel/hints/build_note_hash_read_request_hints.js +5 -6
  67. package/dest/p2p/attestation_utils.d.ts +3 -3
  68. package/dest/p2p/attestation_utils.d.ts.map +1 -1
  69. package/dest/p2p/attestation_utils.js +1 -1
  70. package/dest/p2p/block_proposal.d.ts +85 -21
  71. package/dest/p2p/block_proposal.d.ts.map +1 -1
  72. package/dest/p2p/block_proposal.js +120 -37
  73. package/dest/p2p/checkpoint_attestation.d.ts +77 -0
  74. package/dest/p2p/checkpoint_attestation.d.ts.map +1 -0
  75. package/dest/p2p/{block_attestation.js → checkpoint_attestation.js} +22 -19
  76. package/dest/p2p/checkpoint_proposal.d.ts +154 -0
  77. package/dest/p2p/checkpoint_proposal.d.ts.map +1 -0
  78. package/dest/p2p/checkpoint_proposal.js +217 -0
  79. package/dest/p2p/consensus_payload.d.ts +4 -2
  80. package/dest/p2p/consensus_payload.d.ts.map +1 -1
  81. package/dest/p2p/consensus_payload.js +3 -2
  82. package/dest/p2p/index.d.ts +4 -2
  83. package/dest/p2p/index.d.ts.map +1 -1
  84. package/dest/p2p/index.js +3 -1
  85. package/dest/p2p/signature_utils.d.ts +5 -3
  86. package/dest/p2p/signature_utils.d.ts.map +1 -1
  87. package/dest/p2p/signature_utils.js +3 -1
  88. package/dest/p2p/signed_txs.d.ts +40 -0
  89. package/dest/p2p/signed_txs.d.ts.map +1 -0
  90. package/dest/p2p/signed_txs.js +70 -0
  91. package/dest/p2p/topic_type.d.ts +3 -2
  92. package/dest/p2p/topic_type.d.ts.map +1 -1
  93. package/dest/p2p/topic_type.js +8 -2
  94. package/dest/rollup/checkpoint_header.d.ts +5 -1
  95. package/dest/rollup/checkpoint_header.d.ts.map +1 -1
  96. package/dest/rollup/checkpoint_header.js +4 -0
  97. package/dest/tests/factories.d.ts +13 -1
  98. package/dest/tests/factories.d.ts.map +1 -1
  99. package/dest/tests/factories.js +50 -1
  100. package/dest/tests/mocks.d.ts +55 -9
  101. package/dest/tests/mocks.d.ts.map +1 -1
  102. package/dest/tests/mocks.js +84 -35
  103. package/dest/tx/private_execution_result.d.ts +1 -5
  104. package/dest/tx/private_execution_result.d.ts.map +1 -1
  105. package/dest/tx/private_execution_result.js +3 -20
  106. package/package.json +8 -8
  107. package/src/block/attestation_info.ts +9 -6
  108. package/src/block/l2_block.ts +3 -3
  109. package/src/block/l2_block_new.ts +5 -1
  110. package/src/block/l2_block_source.ts +66 -16
  111. package/src/block/l2_block_stream/index.ts +1 -0
  112. package/src/block/l2_block_stream/interfaces.ts +16 -4
  113. package/src/block/l2_block_stream/l2_block_stream.ts +121 -38
  114. package/src/block/l2_block_stream/l2_tips_memory_store.ts +62 -56
  115. package/src/block/l2_block_stream/l2_tips_store_base.ts +226 -0
  116. package/src/block/test/l2_tips_store_test_suite.ts +485 -36
  117. package/src/block/validate_block_result.ts +35 -31
  118. package/src/checkpoint/checkpoint.ts +1 -0
  119. package/src/checkpoint/checkpoint_info.ts +45 -2
  120. package/src/checkpoint/index.ts +1 -0
  121. package/src/interfaces/api_limit.ts +1 -0
  122. package/src/interfaces/archiver.ts +14 -6
  123. package/src/interfaces/aztec-node-admin.ts +5 -2
  124. package/src/interfaces/aztec-node.ts +30 -3
  125. package/src/interfaces/configs.ts +5 -0
  126. package/src/interfaces/p2p.ts +8 -12
  127. package/src/interfaces/validator.ts +57 -7
  128. package/src/kernel/hints/build_note_hash_read_request_hints.ts +5 -8
  129. package/src/p2p/attestation_utils.ts +3 -3
  130. package/src/p2p/block_proposal.ts +185 -41
  131. package/src/p2p/{block_attestation.ts → checkpoint_attestation.ts} +31 -25
  132. package/src/p2p/checkpoint_proposal.ts +337 -0
  133. package/src/p2p/consensus_payload.ts +5 -2
  134. package/src/p2p/index.ts +3 -1
  135. package/src/p2p/signature_utils.ts +3 -1
  136. package/src/p2p/signed_txs.ts +83 -0
  137. package/src/p2p/topic_type.ts +3 -2
  138. package/src/rollup/checkpoint_header.ts +13 -0
  139. package/src/tests/factories.ts +42 -1
  140. package/src/tests/mocks.ts +146 -50
  141. package/src/tx/private_execution_result.ts +0 -15
  142. package/dest/p2p/block_attestation.d.ts +0 -77
  143. package/dest/p2p/block_attestation.d.ts.map +0 -1
@@ -1,5 +1,7 @@
1
- import { BlockNumberSchema } from '@aztec/foundation/branded-types';
1
+ import { BlockNumberSchema, CheckpointNumberSchema } from '@aztec/foundation/branded-types';
2
2
  import { z } from 'zod';
3
+ import { CheckpointHeader } from '../rollup/checkpoint_header.js';
4
+ export const GENESIS_CHECKPOINT_HEADER_HASH = CheckpointHeader.empty().hash();
3
5
  /** Creates an L2 block id */ export function makeL2BlockId(number, hash) {
4
6
  if (number !== 0 && !hash) {
5
7
  throw new Error(`Hash is required for non-genesis blocks (got block number ${number})`);
@@ -9,18 +11,34 @@ import { z } from 'zod';
9
11
  hash: hash
10
12
  };
11
13
  }
14
+ /** Creates an L2 checkpoint id */ export function makeL2CheckpointId(number, hash) {
15
+ return {
16
+ number,
17
+ hash
18
+ };
19
+ }
12
20
  const L2BlockIdSchema = z.object({
13
21
  number: BlockNumberSchema,
14
22
  hash: z.string()
15
23
  });
24
+ const L2CheckpointIdSchema = z.object({
25
+ number: CheckpointNumberSchema,
26
+ hash: z.string()
27
+ });
28
+ const L2TipIdSchema = z.object({
29
+ block: L2BlockIdSchema,
30
+ checkpoint: L2CheckpointIdSchema
31
+ });
16
32
  export const L2TipsSchema = z.object({
17
- latest: L2BlockIdSchema,
18
- proven: L2BlockIdSchema,
19
- finalized: L2BlockIdSchema
33
+ proposed: L2BlockIdSchema,
34
+ checkpointed: L2TipIdSchema,
35
+ proven: L2TipIdSchema,
36
+ finalized: L2TipIdSchema
20
37
  });
21
38
  export var L2BlockSourceEvents = /*#__PURE__*/ function(L2BlockSourceEvents) {
22
39
  L2BlockSourceEvents["L2PruneDetected"] = "l2PruneDetected";
23
40
  L2BlockSourceEvents["L2BlockProven"] = "l2BlockProven";
24
- L2BlockSourceEvents["InvalidAttestationsBlockDetected"] = "invalidBlockDetected";
41
+ L2BlockSourceEvents["L2BlocksCheckpointed"] = "l2BlocksCheckpointed";
42
+ L2BlockSourceEvents["InvalidAttestationsCheckpointDetected"] = "invalidCheckpointDetected";
25
43
  return L2BlockSourceEvents;
26
44
  }({});
@@ -1,4 +1,5 @@
1
1
  export * from './interfaces.js';
2
2
  export * from './l2_block_stream.js';
3
3
  export * from './l2_tips_memory_store.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsMkJBQTJCLENBQUMifQ==
4
+ export * from './l2_tips_store_base.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx5QkFBeUIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from './interfaces.js';
2
2
  export * from './l2_block_stream.js';
3
3
  export * from './l2_tips_memory_store.js';
4
+ export * from './l2_tips_store_base.js';
@@ -1,5 +1,6 @@
1
- import type { PublishedL2Block } from '../checkpointed_l2_block.js';
2
- import type { L2BlockId, L2Tips } from '../l2_block_source.js';
1
+ import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
2
+ import type { L2BlockNew } from '../l2_block_new.js';
3
+ import type { CheckpointId, L2BlockId, L2BlockPruneReason, L2Tips } from '../l2_block_source.js';
3
4
  /** Interface to the local view of the chain. Implemented by world-state and l2-tips-store. */
4
5
  export interface L2BlockStreamLocalDataProvider {
5
6
  getL2BlockHash(number: number): Promise<string | undefined>;
@@ -11,10 +12,20 @@ export interface L2BlockStreamEventHandler {
11
12
  }
12
13
  export type L2BlockStreamEvent = /** Emits blocks added to the chain. */ {
13
14
  type: 'blocks-added';
14
- blocks: PublishedL2Block[];
15
- } | /** Reports last correct block (new tip of the unproven chain). */ {
15
+ blocks: L2BlockNew[];
16
+ } | /** Emits checkpoints published to L1. */ {
17
+ type: 'chain-checkpointed';
18
+ checkpoint: PublishedCheckpoint;
19
+ block: L2BlockId;
20
+ } | /**
21
+ * Reports last correct block (new tip of the proposed chain). Note that this is not necessarily the anchor block
22
+ * that will be used in the transaction - if the chain has already moved past the reorg, we'll also see blocks-added
23
+ * events that will push the anchor block forward.
24
+ */ {
16
25
  type: 'chain-pruned';
26
+ reason: L2BlockPruneReason;
17
27
  block: L2BlockId;
28
+ checkpoint: CheckpointId;
18
29
  } | /** Reports new proven block. */ {
19
30
  type: 'chain-proven';
20
31
  block: L2BlockId;
@@ -23,4 +34,4 @@ export type L2BlockStreamEvent = /** Emits blocks added to the chain. */ {
23
34
  block: L2BlockId;
24
35
  };
25
36
  export type L2TipsStore = L2BlockStreamEventHandler & L2BlockStreamLocalDataProvider;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jsb2NrL2wyX2Jsb2NrX3N0cmVhbS9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9ELDhGQUE4RjtBQUM5RixNQUFNLFdBQVcsOEJBQThCO0lBQzdDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDNUQsU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztDQUM5QjtBQUVELGdEQUFnRDtBQUNoRCxNQUFNLFdBQVcseUJBQXlCO0lBQ3hDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDbEU7QUFFRCxNQUFNLE1BQU0sa0JBQWtCLEdBQzFCLHVDQUF1QyxDQUFDO0lBQ3RDLElBQUksRUFBRSxjQUFjLENBQUM7SUFDckIsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUM7Q0FDNUIsR0FDRCxrRUFBa0UsQ0FBQztJQUNqRSxJQUFJLEVBQUUsY0FBYyxDQUFDO0lBQ3JCLEtBQUssRUFBRSxTQUFTLENBQUM7Q0FDbEIsR0FDRCxnQ0FBZ0MsQ0FBQztJQUMvQixJQUFJLEVBQUUsY0FBYyxDQUFDO0lBQ3JCLEtBQUssRUFBRSxTQUFTLENBQUM7Q0FDbEIsR0FDRCxnRUFBZ0UsQ0FBQztJQUMvRCxJQUFJLEVBQUUsaUJBQWlCLENBQUM7SUFDeEIsS0FBSyxFQUFFLFNBQVMsQ0FBQztDQUNsQixDQUFDO0FBRU4sTUFBTSxNQUFNLFdBQVcsR0FBRyx5QkFBeUIsR0FBRyw4QkFBOEIsQ0FBQyJ9
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jsb2NrL2wyX2Jsb2NrX3N0cmVhbS9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRyw4RkFBOEY7QUFDOUYsTUFBTSxXQUFXLDhCQUE4QjtJQUM3QyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVELFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDOUI7QUFFRCxnREFBZ0Q7QUFDaEQsTUFBTSxXQUFXLHlCQUF5QjtJQUN4QyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2xFO0FBRUQsTUFBTSxNQUFNLGtCQUFrQixHQUMxQix1Q0FBdUMsQ0FBQztJQUN0QyxJQUFJLEVBQUUsY0FBYyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUN0QixHQUNELHlDQUF5QyxDQUFDO0lBQ3hDLElBQUksRUFBRSxvQkFBb0IsQ0FBQztJQUMzQixVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsS0FBSyxFQUFFLFNBQVMsQ0FBQztDQUNsQixHQUNEOzs7O0dBSUMsQ0FBQztJQUNBLElBQUksRUFBRSxjQUFjLENBQUM7SUFDckIsTUFBTSxFQUFFLGtCQUFrQixDQUFDO0lBQzNCLEtBQUssRUFBRSxTQUFTLENBQUM7SUFDakIsVUFBVSxFQUFFLFlBQVksQ0FBQztDQUMxQixHQUNELGdDQUFnQyxDQUFDO0lBQy9CLElBQUksRUFBRSxjQUFjLENBQUM7SUFDckIsS0FBSyxFQUFFLFNBQVMsQ0FBQztDQUNsQixHQUNELGdFQUFnRSxDQUFDO0lBQy9ELElBQUksRUFBRSxpQkFBaUIsQ0FBQztJQUN4QixLQUFLLEVBQUUsU0FBUyxDQUFDO0NBQ2xCLENBQUM7QUFFTixNQUFNLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixHQUFHLDhCQUE4QixDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/D,8FAA8F;AAC9F,MAAM,WAAW,8BAA8B;IAC7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5D,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,yBAAyB;IACxC,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,MAAM,kBAAkB,GAC1B,uCAAuC,CAAC;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B,GACD,kEAAkE,CAAC;IACjE,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;CAClB,GACD,gCAAgC,CAAC;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;CAClB,GACD,gEAAgE,CAAC;IAC/D,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,WAAW,GAAG,yBAAyB,GAAG,8BAA8B,CAAC"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEjG,8FAA8F;AAC9F,MAAM,WAAW,8BAA8B;IAC7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5D,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,yBAAyB;IACxC,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,MAAM,kBAAkB,GAC1B,uCAAuC,CAAC;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB,GACD,yCAAyC,CAAC;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,UAAU,EAAE,mBAAmB,CAAC;IAChC,KAAK,EAAE,SAAS,CAAC;CAClB,GACD;;;;GAIC,CAAC;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,YAAY,CAAC;CAC1B,GACD,gCAAgC,CAAC;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;CAClB,GACD,gEAAgE,CAAC;IAC/D,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,WAAW,GAAG,yBAAyB,GAAG,8BAA8B,CAAC"}
@@ -10,13 +10,15 @@ export declare class L2BlockStream {
10
10
  private readonly runningPromise;
11
11
  private isSyncing;
12
12
  private hasStarted;
13
- constructor(l2BlockSource: Pick<L2BlockSource, 'getPublishedBlocks' | 'getBlockHeader' | 'getL2Tips'>, localData: L2BlockStreamLocalDataProvider, handler: L2BlockStreamEventHandler, log?: import("@aztec/foundation/log").Logger, opts?: {
13
+ constructor(l2BlockSource: Pick<L2BlockSource, 'getL2BlocksNew' | 'getBlockHeader' | 'getL2Tips' | 'getPublishedCheckpoints' | 'getCheckpointedBlocks'>, localData: L2BlockStreamLocalDataProvider, handler: L2BlockStreamEventHandler, log?: import("@aztec/foundation/log").Logger, opts?: {
14
14
  proven?: boolean;
15
15
  pollIntervalMS?: number;
16
16
  batchSize?: number;
17
17
  startingBlock?: number;
18
18
  /** Instead of downloading all blocks, only fetch the smallest subset that results in reliable reorg detection. */
19
19
  skipFinalized?: boolean;
20
+ /** When true, checkpoint events will not be emitted. Blocks are still fetched via checkpoints but only blocks-added events are emitted. */
21
+ ignoreCheckpoints?: boolean;
20
22
  });
21
23
  start(): void;
22
24
  stop(): Promise<void>;
@@ -32,4 +34,4 @@ export declare class L2BlockStream {
32
34
  private getBlockHashFromSource;
33
35
  private emitEvent;
34
36
  }
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfYmxvY2tfc3RyZWFtLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svbDJfYmxvY2tfc3RyZWFtL2wyX2Jsb2NrX3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWtCLEtBQUssYUFBYSxFQUFpQixNQUFNLHVCQUF1QixDQUFDO0FBQzFGLE9BQU8sS0FBSyxFQUFzQix5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJILHVIQUF1SDtBQUN2SCxxQkFBYSxhQUFhO0lBTXRCLE9BQU8sQ0FBQyxhQUFhO0lBQ3JCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBQ3BCLE9BQU8sQ0FBQyxJQUFJO0lBVGQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQVM7SUFDMUIsT0FBTyxDQUFDLFVBQVUsQ0FBUztJQUUzQixZQUNVLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLG9CQUFvQixHQUFHLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxFQUN6RixTQUFTLEVBQUUsOEJBQThCLEVBQ3pDLE9BQU8sRUFBRSx5QkFBeUIsRUFDekIsR0FBRyx5Q0FBcUMsRUFDakQsSUFBSSxHQUFFO1FBQ1osTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQ2pCLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUN4QixTQUFTLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDbkIsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLGtIQUFrSDtRQUNsSCxhQUFhLENBQUMsRUFBRSxPQUFPLENBQUM7S0FDcEIsRUFPUDtJQUVNLEtBQUssU0FHWDtJQUVZLElBQUksa0JBRWhCO0lBRU0sU0FBUyxZQUVmO0lBRUQ7Ozs7T0FJRztJQUNVLElBQUksa0JBSWhCO0lBRUQsVUFBZ0IsSUFBSSxrQkF5Rm5CO1lBT2EscUJBQXFCO0lBd0JuQyxPQUFPLENBQUMsc0JBQXNCO1lBT2hCLFNBQVM7Q0FTeEIifQ==
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfYmxvY2tfc3RyZWFtLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svbDJfYmxvY2tfc3RyZWFtL2wyX2Jsb2NrX3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQTJDLEtBQUssYUFBYSxFQUFpQixNQUFNLHVCQUF1QixDQUFDO0FBQ25ILE9BQU8sS0FBSyxFQUFzQix5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJILHVIQUF1SDtBQUN2SCxxQkFBYSxhQUFhO0lBTXRCLE9BQU8sQ0FBQyxhQUFhO0lBSXJCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBQ3BCLE9BQU8sQ0FBQyxJQUFJO0lBWmQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQVM7SUFDMUIsT0FBTyxDQUFDLFVBQVUsQ0FBUztJQUUzQixZQUNVLGFBQWEsRUFBRSxJQUFJLENBQ3pCLGFBQWEsRUFDYixnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxXQUFXLEdBQUcseUJBQXlCLEdBQUcsdUJBQXVCLENBQ3hHLEVBQ08sU0FBUyxFQUFFLDhCQUE4QixFQUN6QyxPQUFPLEVBQUUseUJBQXlCLEVBQ3pCLEdBQUcseUNBQXFDLEVBQ2pELElBQUksR0FBRTtRQUNaLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUNqQixjQUFjLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDeEIsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ25CLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUN2QixrSEFBa0g7UUFDbEgsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQ3hCLDJJQUEySTtRQUMzSSxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztLQUN4QixFQU9QO0lBRU0sS0FBSyxTQUdYO0lBRVksSUFBSSxrQkFFaEI7SUFFTSxTQUFTLFlBRWY7SUFFRDs7OztPQUlHO0lBQ1UsSUFBSSxrQkFJaEI7SUFFRCxVQUFnQixJQUFJLGtCQXNLbkI7WUFPYSxxQkFBcUI7SUF3Qm5DLE9BQU8sQ0FBQyxzQkFBc0I7WUFPaEIsU0FBUztDQVN4QiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"l2_block_stream.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_block_stream.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,KAAK,aAAa,EAAiB,MAAM,uBAAuB,CAAC;AAC1F,OAAO,KAAK,EAAsB,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAErH,uHAAuH;AACvH,qBAAa,aAAa;IAMtB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,IAAI;IATd,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAE3B,YACU,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,oBAAoB,GAAG,gBAAgB,GAAG,WAAW,CAAC,EACzF,SAAS,EAAE,8BAA8B,EACzC,OAAO,EAAE,yBAAyB,EACzB,GAAG,yCAAqC,EACjD,IAAI,GAAE;QACZ,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kHAAkH;QAClH,aAAa,CAAC,EAAE,OAAO,CAAC;KACpB,EAOP;IAEM,KAAK,SAGX;IAEY,IAAI,kBAEhB;IAEM,SAAS,YAEf;IAED;;;;OAIG;IACU,IAAI,kBAIhB;IAED,UAAgB,IAAI,kBAyFnB;YAOa,qBAAqB;IAwBnC,OAAO,CAAC,sBAAsB;YAOhB,SAAS;CASxB"}
1
+ {"version":3,"file":"l2_block_stream.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_block_stream.ts"],"names":[],"mappings":"AAMA,OAAO,EAA2C,KAAK,aAAa,EAAiB,MAAM,uBAAuB,CAAC;AACnH,OAAO,KAAK,EAAsB,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAErH,uHAAuH;AACvH,qBAAa,aAAa;IAMtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,IAAI;IAZd,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAE3B,YACU,aAAa,EAAE,IAAI,CACzB,aAAa,EACb,gBAAgB,GAAG,gBAAgB,GAAG,WAAW,GAAG,yBAAyB,GAAG,uBAAuB,CACxG,EACO,SAAS,EAAE,8BAA8B,EACzC,OAAO,EAAE,yBAAyB,EACzB,GAAG,yCAAqC,EACjD,IAAI,GAAE;QACZ,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kHAAkH;QAClH,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,2IAA2I;QAC3I,iBAAiB,CAAC,EAAE,OAAO,CAAC;KACxB,EAOP;IAEM,KAAK,SAGX;IAEY,IAAI,kBAEhB;IAEM,SAAS,YAEf;IAED;;;;OAIG;IACU,IAAI,kBAIhB;IAED,UAAgB,IAAI,kBAsKnB;YAOa,qBAAqB;IAwBnC,OAAO,CAAC,sBAAsB;YAOhB,SAAS;CASxB"}
@@ -1,4 +1,4 @@
1
- import { BlockNumber } from '@aztec/foundation/branded-types';
1
+ import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
2
2
  import { AbortError } from '@aztec/foundation/error';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { RunningPromise } from '@aztec/foundation/running-promise';
@@ -50,39 +50,39 @@ import { makeL2BlockId } from '../l2_block_source.js';
50
50
  const sourceTips = await this.l2BlockSource.getL2Tips();
51
51
  const localTips = await this.localData.getL2Tips();
52
52
  this.log.trace(`Running L2 block stream`, {
53
- sourceLatest: sourceTips.latest.number,
54
- localLatest: localTips.latest.number,
55
- sourceFinalized: sourceTips.finalized.number,
56
- localFinalized: localTips.finalized.number,
57
- sourceProven: sourceTips.proven.number,
58
- localProven: localTips.proven.number,
59
- sourceLatestHash: sourceTips.latest.hash,
60
- localLatestHash: localTips.latest.hash,
61
- sourceProvenHash: sourceTips.proven.hash,
62
- localProvenHash: localTips.proven.hash,
63
- sourceFinalizedHash: sourceTips.finalized.hash,
64
- localFinalizedHash: localTips.finalized.hash
53
+ sourceTips,
54
+ localTips
65
55
  });
66
56
  // Check if there was a reorg and emit a chain-pruned event if so.
67
- let latestBlockNumber = localTips.latest.number;
57
+ let latestBlockNumber = localTips.proposed.number;
68
58
  const sourceCache = new BlockHashCache([
69
- sourceTips.latest
59
+ sourceTips.proposed
70
60
  ]);
71
61
  while(!await this.areBlockHashesEqualAt(latestBlockNumber, {
72
62
  sourceCache
73
63
  })){
74
64
  latestBlockNumber--;
75
65
  }
76
- if (latestBlockNumber < localTips.latest.number) {
77
- latestBlockNumber = BlockNumber(Math.min(latestBlockNumber, sourceTips.latest.number)); // see #13471
66
+ if (latestBlockNumber < localTips.proposed.number) {
67
+ latestBlockNumber = BlockNumber(Math.min(latestBlockNumber, sourceTips.proposed.number)); // see #13471
78
68
  const hash = sourceCache.get(latestBlockNumber) ?? await this.getBlockHashFromSource(latestBlockNumber);
79
69
  if (latestBlockNumber !== 0 && !hash) {
80
70
  throw new Error(`Block hash not found in block source for block number ${latestBlockNumber}`);
81
71
  }
82
- this.log.verbose(`Reorg detected. Pruning blocks from ${latestBlockNumber + 1} to ${localTips.latest.number}.`);
72
+ this.log.verbose(`Reorg detected. Pruning blocks from ${latestBlockNumber + 1} to ${localTips.proposed.number}.`);
73
+ // This check is not 100% accurate
74
+ // If the local tips are sufficiently behind the source tips, such that we are missing at least one checkpoint
75
+ // that has now been re-orged due to a proof failure then this will indicate a failure to checkpoint rather than a failure to prove
76
+ // TODO: (mbps/PhilWindle): Improve re-org detection accuracy when we come to do re-orgs
77
+ let reason = 'unproven';
78
+ if (latestBlockNumber === localTips.checkpointed.block.number && !this.opts.ignoreCheckpoints) {
79
+ reason = 'uncheckpointed';
80
+ }
83
81
  await this.emitEvent({
84
82
  type: 'chain-pruned',
85
- block: makeL2BlockId(latestBlockNumber, hash)
83
+ block: makeL2BlockId(latestBlockNumber, hash),
84
+ reason,
85
+ checkpoint: sourceTips.checkpointed.checkpoint
86
86
  });
87
87
  }
88
88
  // If we are just starting, use the starting block number from the options.
@@ -95,19 +95,91 @@ import { makeL2BlockId } from '../l2_block_source.js';
95
95
  this.hasStarted = true;
96
96
  }
97
97
  let nextBlockNumber = latestBlockNumber + 1;
98
+ let nextCheckpointToEmit = CheckpointNumber(localTips.checkpointed.checkpoint.number + 1);
98
99
  if (this.opts.skipFinalized) {
99
100
  // When skipping finalized blocks we need to provide reliable reorg detection while fetching as few blocks as
100
101
  // possible. Finalized blocks cannot be reorged by definition, so we can skip most of them. We do need the very
101
102
  // last finalized block however in order to guarantee that we will eventually find a block in which our local
102
103
  // store matches the source.
103
104
  // If the last finalized block is behind our local tip, there is nothing to skip.
104
- nextBlockNumber = Math.max(sourceTips.finalized.number, nextBlockNumber);
105
+ nextBlockNumber = Math.max(sourceTips.finalized.block.number, nextBlockNumber);
106
+ // If the next checkpoint to emit is behind the finalized tip then skip forward
107
+ nextCheckpointToEmit = CheckpointNumber(Math.max(nextCheckpointToEmit, sourceTips.finalized.checkpoint.number));
108
+ }
109
+ // Loop 1: Emit checkpoint events for checkpoints whose blocks are already in local storage.
110
+ // This handles the case where blocks were synced as uncheckpointed and later became checkpointed.
111
+ // The guard `lastBlockInCheckpoint.number > localTips.proposed.number` ensures we don't emit
112
+ // checkpoints for blocks we don't have (e.g., when startingBlock skips earlier blocks).
113
+ // Since only one checkpoint can ever be uncheckpointed, this loop should iterate at most once.
114
+ if (!this.opts.ignoreCheckpoints) {
115
+ let loop1Iterations = 0;
116
+ while(nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number){
117
+ const checkpoints = await this.l2BlockSource.getPublishedCheckpoints(nextCheckpointToEmit, 1);
118
+ if (checkpoints.length === 0) {
119
+ break;
120
+ }
121
+ const lastBlockInCheckpoint = checkpoints[0].checkpoint.blocks.at(-1);
122
+ // If this checkpoint has blocks we haven't seen yet, stop - they need to be fetched first
123
+ if (lastBlockInCheckpoint.number > localTips.proposed.number) {
124
+ break;
125
+ }
126
+ loop1Iterations++;
127
+ if (loop1Iterations > 1) {
128
+ this.log.warn(`Emitting multiple checkpoints (${loop1Iterations}) for already-local blocks. ` + `Next checkpoint: ${nextCheckpointToEmit}, source checkpointed: ${sourceTips.checkpointed.checkpoint.number}`);
129
+ }
130
+ const lastBlockHash = await lastBlockInCheckpoint.hash();
131
+ await this.emitEvent({
132
+ type: 'chain-checkpointed',
133
+ checkpoint: checkpoints[0],
134
+ block: makeL2BlockId(lastBlockInCheckpoint.number, lastBlockHash.toString())
135
+ });
136
+ nextCheckpointToEmit = CheckpointNumber(nextCheckpointToEmit + 1);
137
+ }
138
+ }
139
+ // Loop 2: Fetch new checkpointed blocks. For each block, get its checkpoint, emit all blocks
140
+ // from that checkpoint that we need, then emit the checkpoint event.
141
+ // We cache the current checkpoint to avoid redundant fetches when batchSize < checkpoint size.
142
+ let checkpoint;
143
+ while(nextBlockNumber <= sourceTips.checkpointed.block.number){
144
+ const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.checkpointed.block.number - nextBlockNumber + 1);
145
+ // Check if we need to fetch a new checkpoint (nextBlockNumber is beyond the cached one)
146
+ if (!checkpoint || nextBlockNumber > checkpoint.checkpoint.blocks.at(-1).number) {
147
+ const blocks = await this.l2BlockSource.getCheckpointedBlocks(BlockNumber(nextBlockNumber), 1);
148
+ if (blocks.length === 0) {
149
+ break;
150
+ }
151
+ const checkpoints = await this.l2BlockSource.getPublishedCheckpoints(blocks[0].checkpointNumber, 1);
152
+ if (checkpoints.length === 0) {
153
+ break;
154
+ }
155
+ checkpoint = checkpoints[0];
156
+ }
157
+ // Get all blocks from this checkpoint that we need, respecting batchSize
158
+ const blocksForCheckpoint = checkpoint.checkpoint.blocks.filter((b)=>b.number >= nextBlockNumber).slice(0, limit);
159
+ if (blocksForCheckpoint.length === 0) {
160
+ break;
161
+ }
162
+ await this.emitEvent({
163
+ type: 'blocks-added',
164
+ blocks: blocksForCheckpoint
165
+ });
166
+ nextBlockNumber = blocksForCheckpoint.at(-1).number + 1;
167
+ // If we've reached the end of this checkpoint, emit the checkpoint event
168
+ const lastBlockInCheckpoint = checkpoint.checkpoint.blocks.at(-1);
169
+ if (!this.opts.ignoreCheckpoints && nextBlockNumber > lastBlockInCheckpoint.number) {
170
+ const lastBlockHash = await lastBlockInCheckpoint.hash();
171
+ await this.emitEvent({
172
+ type: 'chain-checkpointed',
173
+ checkpoint,
174
+ block: makeL2BlockId(lastBlockInCheckpoint.number, lastBlockHash.toString())
175
+ });
176
+ }
105
177
  }
106
- // Request new blocks from the source.
107
- while(nextBlockNumber <= sourceTips.latest.number){
108
- const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.latest.number - nextBlockNumber + 1);
178
+ // Loop 3: Fetch any remaining uncheckpointed (proposed) blocks.
179
+ while(nextBlockNumber <= sourceTips.proposed.number){
180
+ const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.proposed.number - nextBlockNumber + 1);
109
181
  this.log.trace(`Requesting blocks from ${nextBlockNumber} limit ${limit} proven=${this.opts.proven}`);
110
- const blocks = await this.l2BlockSource.getPublishedBlocks(BlockNumber(nextBlockNumber), limit, this.opts.proven);
182
+ const blocks = await this.l2BlockSource.getL2BlocksNew(BlockNumber(nextBlockNumber), limit, this.opts.proven);
111
183
  if (blocks.length === 0) {
112
184
  break;
113
185
  }
@@ -115,19 +187,19 @@ import { makeL2BlockId } from '../l2_block_source.js';
115
187
  type: 'blocks-added',
116
188
  blocks
117
189
  });
118
- nextBlockNumber = blocks.at(-1).block.number + 1;
190
+ nextBlockNumber = blocks.at(-1).number + 1;
119
191
  }
120
192
  // Update the proven and finalized tips.
121
- if (localTips.proven !== undefined && sourceTips.proven.number !== localTips.proven.number) {
193
+ if (localTips.proven !== undefined && sourceTips.proven.block.number !== localTips.proven.block.number) {
122
194
  await this.emitEvent({
123
195
  type: 'chain-proven',
124
- block: sourceTips.proven
196
+ block: sourceTips.proven.block
125
197
  });
126
198
  }
127
- if (localTips.finalized !== undefined && sourceTips.finalized.number !== localTips.finalized.number) {
199
+ if (localTips.finalized !== undefined && sourceTips.finalized.block.number !== localTips.finalized.block.number) {
128
200
  await this.emitEvent({
129
201
  type: 'chain-finalized',
130
- block: sourceTips.finalized
202
+ block: sourceTips.finalized.block
131
203
  });
132
204
  }
133
205
  } catch (err) {
@@ -172,7 +244,7 @@ import { makeL2BlockId } from '../l2_block_source.js';
172
244
  return this.l2BlockSource.getBlockHeader(blockNumber).then((h)=>h?.hash()).then((hash)=>hash?.toString());
173
245
  }
174
246
  async emitEvent(event) {
175
- this.log.debug(`Emitting ${event.type} (${event.type === 'blocks-added' ? event.blocks.length : event.block.number})`);
247
+ this.log.debug(`Emitting ${event.type} (${event.type === 'blocks-added' ? event.blocks.length : event.type === 'chain-checkpointed' ? event.checkpoint.checkpoint.number : event.block.number})`);
176
248
  await this.handler.handleBlockStreamEvent(event);
177
249
  if (!this.isRunning() && !this.isSyncing) {
178
250
  throw new AbortError();
@@ -1,19 +1,27 @@
1
- import { BlockNumber } from '@aztec/foundation/branded-types';
2
- import type { L2Block } from '../l2_block.js';
3
- import type { L2BlockId, L2BlockTag, L2Tips } from '../l2_block_source.js';
4
- import type { L2BlockStreamEvent, L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider } from './interfaces.js';
1
+ import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
2
+ import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
3
+ import type { L2BlockTag } from '../l2_block_source.js';
4
+ import { L2TipsStoreBase } from './l2_tips_store_base.js';
5
5
  /**
6
- * Stores currently synced L2 tips and unfinalized block hashes.
7
- * @dev tests in kv-store/src/stores/l2_tips_memory_store.test.ts
6
+ * In-memory implementation of L2 tips store. Useful for testing and lightweight clients.
7
+ * @dev Tests in kv-store/src/stores/l2_tips_memory_store.test.ts
8
8
  */
9
- export declare class L2TipsMemoryStore implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider {
10
- protected readonly l2TipsStore: Map<L2BlockTag, BlockNumber>;
11
- protected readonly l2BlockHashesStore: Map<number, string>;
12
- getL2BlockHash(number: number): Promise<string | undefined>;
13
- getL2Tips(): Promise<L2Tips>;
14
- private getL2Tip;
15
- handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
16
- protected saveTag(name: L2BlockTag, block: L2BlockId): void;
17
- protected computeBlockHash(block: L2Block): Promise<`0x${string}`>;
9
+ export declare class L2TipsMemoryStore extends L2TipsStoreBase {
10
+ private readonly tips;
11
+ private readonly blockHashes;
12
+ private readonly blockToCheckpoint;
13
+ private readonly checkpoints;
14
+ protected getTip(tag: L2BlockTag): Promise<BlockNumber | undefined>;
15
+ protected setTip(tag: L2BlockTag, blockNumber: BlockNumber): Promise<void>;
16
+ protected getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined>;
17
+ protected setBlockHash(blockNumber: BlockNumber, hash: string): Promise<void>;
18
+ protected deleteBlockHashesBefore(blockNumber: BlockNumber): Promise<void>;
19
+ protected getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined>;
20
+ protected setCheckpointNumberForBlock(blockNumber: BlockNumber, checkpointNumber: CheckpointNumber): Promise<void>;
21
+ protected deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void>;
22
+ protected getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined>;
23
+ protected saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void>;
24
+ protected deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void>;
25
+ protected runInTransaction<T>(fn: () => Promise<T>): Promise<T>;
18
26
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19tZW1vcnlfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vbDJfdGlwc19tZW1vcnlfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVySDs7O0dBR0c7QUFDSCxxQkFBYSxpQkFBa0IsWUFBVyx5QkFBeUIsRUFBRSw4QkFBOEI7SUFDakcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBYTtJQUN6RSxTQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQWE7SUFFaEUsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FFakU7SUFFTSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQU1sQztJQUVELE9BQU8sQ0FBQyxRQUFRO0lBYUgsc0JBQXNCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0F5QjVFO0lBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLFFBS25EO0lBRUQsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLDBCQUV4QztDQUNGIn0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19tZW1vcnlfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vbDJfdGlwc19tZW1vcnlfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFEOzs7R0FHRztBQUNILHFCQUFhLGlCQUFrQixTQUFRLGVBQWU7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQXNDO0lBQzNELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUE2QjtJQUN6RCxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUF1QztJQUN6RSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBMEM7SUFFdEUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBRWxFO0lBRUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUd6RTtJQUVELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRWxGO0lBRUQsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUc1RTtJQUVELFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPekU7SUFFRCxTQUFTLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBRXJHO0lBRUQsU0FBUyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdqSDtJQUVELFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPL0U7SUFFRCxTQUFTLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsQ0FFcEc7SUFFRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHM0U7SUFFRCxTQUFTLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU9uRjtJQUVELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FHOUQ7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"l2_tips_memory_store.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_memory_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAErH;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,yBAAyB,EAAE,8BAA8B;IACjG,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAa;IACzE,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAEhE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEjE;IAEM,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAMlC;IAED,OAAO,CAAC,QAAQ;IAaH,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5E;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,QAKnD;IAED,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,0BAExC;CACF"}
1
+ {"version":3,"file":"l2_tips_memory_store.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_memory_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAEtE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAElE;IAED,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;IAED,SAAS,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAElF;IAED,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;IAED,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;IAED,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAErG;IAED,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjH;IAED,SAAS,CAAC,6BAA6B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/E;IAED,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAEpG;IAED,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;IAED,SAAS,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnF;IAED,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9D;CACF"}
@@ -1,72 +1,66 @@
1
- import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
2
- import { BlockNumber } from '@aztec/foundation/branded-types';
1
+ import { L2TipsStoreBase } from './l2_tips_store_base.js';
3
2
  /**
4
- * Stores currently synced L2 tips and unfinalized block hashes.
5
- * @dev tests in kv-store/src/stores/l2_tips_memory_store.test.ts
6
- */ export class L2TipsMemoryStore {
7
- l2TipsStore = new Map();
8
- l2BlockHashesStore = new Map();
9
- getL2BlockHash(number) {
10
- return Promise.resolve(this.l2BlockHashesStore.get(number));
3
+ * In-memory implementation of L2 tips store. Useful for testing and lightweight clients.
4
+ * @dev Tests in kv-store/src/stores/l2_tips_memory_store.test.ts
5
+ */ export class L2TipsMemoryStore extends L2TipsStoreBase {
6
+ tips = new Map();
7
+ blockHashes = new Map();
8
+ blockToCheckpoint = new Map();
9
+ checkpoints = new Map();
10
+ getTip(tag) {
11
+ return Promise.resolve(this.tips.get(tag));
11
12
  }
12
- getL2Tips() {
13
- return Promise.resolve({
14
- latest: this.getL2Tip('latest'),
15
- finalized: this.getL2Tip('finalized'),
16
- proven: this.getL2Tip('proven')
17
- });
13
+ setTip(tag, blockNumber) {
14
+ this.tips.set(tag, blockNumber);
15
+ return Promise.resolve();
18
16
  }
19
- getL2Tip(tag) {
20
- const blockNumber = this.l2TipsStore.get(tag);
21
- if (blockNumber === undefined || blockNumber === 0) {
22
- return {
23
- number: BlockNumber.ZERO,
24
- hash: GENESIS_BLOCK_HEADER_HASH.toString()
25
- };
26
- }
27
- const blockHash = this.l2BlockHashesStore.get(blockNumber);
28
- if (!blockHash) {
29
- throw new Error(`Block hash not found for block number ${blockNumber}`);
17
+ getStoredBlockHash(blockNumber) {
18
+ return Promise.resolve(this.blockHashes.get(blockNumber));
19
+ }
20
+ setBlockHash(blockNumber, hash) {
21
+ this.blockHashes.set(blockNumber, hash);
22
+ return Promise.resolve();
23
+ }
24
+ deleteBlockHashesBefore(blockNumber) {
25
+ for (const key of this.blockHashes.keys()){
26
+ if (key < blockNumber) {
27
+ this.blockHashes.delete(key);
28
+ }
30
29
  }
31
- return {
32
- number: blockNumber,
33
- hash: blockHash
34
- };
30
+ return Promise.resolve();
31
+ }
32
+ getCheckpointNumberForBlock(blockNumber) {
33
+ return Promise.resolve(this.blockToCheckpoint.get(blockNumber));
35
34
  }
36
- async handleBlockStreamEvent(event) {
37
- switch(event.type){
38
- case 'blocks-added':
39
- {
40
- const blocks = event.blocks.map((b)=>b.block);
41
- for (const block of blocks){
42
- this.l2BlockHashesStore.set(block.number, await this.computeBlockHash(block));
43
- }
44
- this.l2TipsStore.set('latest', blocks.at(-1).number);
45
- break;
46
- }
47
- case 'chain-pruned':
48
- this.saveTag('latest', event.block);
49
- break;
50
- case 'chain-proven':
51
- this.saveTag('proven', event.block);
52
- break;
53
- case 'chain-finalized':
54
- this.saveTag('finalized', event.block);
55
- for (const key of this.l2BlockHashesStore.keys()){
56
- if (key < event.block.number) {
57
- this.l2BlockHashesStore.delete(key);
58
- }
59
- }
60
- break;
35
+ setCheckpointNumberForBlock(blockNumber, checkpointNumber) {
36
+ this.blockToCheckpoint.set(blockNumber, checkpointNumber);
37
+ return Promise.resolve();
38
+ }
39
+ deleteBlockToCheckpointBefore(blockNumber) {
40
+ for (const key of this.blockToCheckpoint.keys()){
41
+ if (key < blockNumber) {
42
+ this.blockToCheckpoint.delete(key);
43
+ }
61
44
  }
45
+ return Promise.resolve();
46
+ }
47
+ getCheckpoint(checkpointNumber) {
48
+ return Promise.resolve(this.checkpoints.get(checkpointNumber));
49
+ }
50
+ saveCheckpointData(checkpoint) {
51
+ this.checkpoints.set(checkpoint.checkpoint.number, checkpoint);
52
+ return Promise.resolve();
62
53
  }
63
- saveTag(name, block) {
64
- this.l2TipsStore.set(name, block.number);
65
- if (block.hash) {
66
- this.l2BlockHashesStore.set(block.number, block.hash);
54
+ deleteCheckpointsBefore(checkpointNumber) {
55
+ for (const key of this.checkpoints.keys()){
56
+ if (key < checkpointNumber) {
57
+ this.checkpoints.delete(key);
58
+ }
67
59
  }
60
+ return Promise.resolve();
68
61
  }
69
- computeBlockHash(block) {
70
- return block.hash().then((hash)=>hash.toString());
62
+ runInTransaction(fn) {
63
+ // Memory store doesn't need transactions - just execute immediately
64
+ return fn();
71
65
  }
72
66
  }
@@ -0,0 +1,49 @@
1
+ import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
2
+ import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
3
+ import type { L2BlockNew } from '../l2_block_new.js';
4
+ import { type L2BlockTag, type L2Tips } from '../l2_block_source.js';
5
+ import type { L2BlockStreamEvent, L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider } from './interfaces.js';
6
+ /**
7
+ * Abstract base class for L2 tips stores. Provides common event handling logic
8
+ * while delegating storage operations to subclasses.
9
+ */
10
+ export declare abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider {
11
+ /** Gets the block number for a given tag. */
12
+ protected abstract getTip(tag: L2BlockTag): Promise<BlockNumber | undefined>;
13
+ /** Sets the block number for a given tag. */
14
+ protected abstract setTip(tag: L2BlockTag, blockNumber: BlockNumber): Promise<void>;
15
+ /** Gets the block hash for a given block number. */
16
+ protected abstract getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined>;
17
+ /** Sets the block hash for a given block number. */
18
+ protected abstract setBlockHash(blockNumber: BlockNumber, hash: string): Promise<void>;
19
+ /** Deletes all block hashes for blocks before the given block number. */
20
+ protected abstract deleteBlockHashesBefore(blockNumber: BlockNumber): Promise<void>;
21
+ /** Gets the checkpoint number for a given block number. */
22
+ protected abstract getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined>;
23
+ /** Sets the checkpoint number for a given block number. */
24
+ protected abstract setCheckpointNumberForBlock(blockNumber: BlockNumber, checkpointNumber: CheckpointNumber): Promise<void>;
25
+ /** Deletes all block-to-checkpoint mappings for blocks before the given block number. */
26
+ protected abstract deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void>;
27
+ /** Gets a checkpoint by its number. */
28
+ protected abstract getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined>;
29
+ /** Saves a checkpoint. */
30
+ protected abstract saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void>;
31
+ /** Deletes all checkpoints before the given checkpoint number. */
32
+ protected abstract deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void>;
33
+ /** Runs the given function in a transaction. Memory stores can just execute immediately. */
34
+ protected abstract runInTransaction<T>(fn: () => Promise<T>): Promise<T>;
35
+ getL2BlockHash(number: BlockNumber): Promise<string | undefined>;
36
+ getL2Tips(): Promise<L2Tips>;
37
+ handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
38
+ protected computeBlockHash(block: L2BlockNew): Promise<string>;
39
+ private getBlockId;
40
+ private getCheckpointId;
41
+ private handleBlocksAdded;
42
+ private handleChainCheckpointed;
43
+ private handleChainPruned;
44
+ private handleChainProven;
45
+ private handleChainFinalized;
46
+ private saveTag;
47
+ private saveCheckpoint;
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19zdG9yZV9iYXNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svbDJfYmxvY2tfc3RyZWFtL2wyX3RpcHNfc3RvcmVfYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFaEYsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBSUwsS0FBSyxVQUFVLEVBQ2YsS0FBSyxNQUFNLEVBQ1osTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJIOzs7R0FHRztBQUNILDhCQUFzQixlQUFnQixZQUFXLHlCQUF5QixFQUFFLDhCQUE4QjtJQUd4Ryw2Q0FBNkM7SUFDN0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRTdFLDZDQUE2QztJQUM3QyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBGLG9EQUFvRDtJQUNwRCxTQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUU3RixvREFBb0Q7SUFDcEQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV2Rix5RUFBeUU7SUFDekUsU0FBUyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRiwyREFBMkQ7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVoSCwyREFBMkQ7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FDNUMsV0FBVyxFQUFFLFdBQVcsRUFDeEIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqQix5RkFBeUY7SUFDekYsU0FBUyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUxRix1Q0FBdUM7SUFDdkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRS9HLDBCQUEwQjtJQUMxQixTQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEYsa0VBQWtFO0lBQ2xFLFNBQVMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlGLDRGQUE0RjtJQUM1RixTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBSWxFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRXRFO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FzQmxDO0lBRVksc0JBQXNCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FrQjVFO0lBR0QsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUU3RDtZQUlhLFVBQVU7WUFZVixlQUFlO1lBaUJmLGlCQUFpQjtZQWFqQix1QkFBdUI7WUFVdkIsaUJBQWlCO1lBY2pCLGlCQUFpQjtZQVNqQixvQkFBb0I7WUFpQnBCLE9BQU87WUFPUCxjQUFjO0NBUzdCIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l2_tips_store_base.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_store_base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,MAAM,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAErH;;;GAGG;AACH,8BAAsB,eAAgB,YAAW,yBAAyB,EAAE,8BAA8B;IAGxG,6CAA6C;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAE7E,6CAA6C;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF,oDAAoD;IACpD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE7F,oDAAoD;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvF,yEAAyE;IACzE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAEhH,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,CAAC,2BAA2B,CAC5C,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,yFAAyF;IACzF,SAAS,CAAC,QAAQ,CAAC,6BAA6B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1F,uCAAuC;IACvC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAE/G,0BAA0B;IAC1B,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtF,kEAAkE;IAClE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9F,4FAA4F;IAC5F,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAIlE,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEtE;IAEM,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAsBlC;IAEY,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB5E;IAGD,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;YAIa,UAAU;YAYV,eAAe;YAiBf,iBAAiB;YAajB,uBAAuB;YAUvB,iBAAiB;YAcjB,iBAAiB;YASjB,oBAAoB;YAiBpB,OAAO;YAOP,cAAc;CAS7B"}