@aztec/archiver 5.0.0-rc.1 → 5.0.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 (82) hide show
  1. package/dest/archiver.d.ts +1 -1
  2. package/dest/archiver.d.ts.map +1 -1
  3. package/dest/archiver.js +39 -10
  4. package/dest/config.d.ts +1 -1
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +5 -0
  7. package/dest/factory.d.ts +8 -1
  8. package/dest/factory.d.ts.map +1 -1
  9. package/dest/factory.js +31 -0
  10. package/dest/l1/calldata_retriever.d.ts +8 -1
  11. package/dest/l1/calldata_retriever.d.ts.map +1 -1
  12. package/dest/l1/calldata_retriever.js +7 -6
  13. package/dest/l1/data_retrieval.d.ts +7 -2
  14. package/dest/l1/data_retrieval.d.ts.map +1 -1
  15. package/dest/modules/contract_data_source_adapter.d.ts +2 -2
  16. package/dest/modules/contract_data_source_adapter.d.ts.map +1 -1
  17. package/dest/modules/contract_data_source_adapter.js +1 -9
  18. package/dest/modules/data_source_base.d.ts +2 -3
  19. package/dest/modules/data_source_base.d.ts.map +1 -1
  20. package/dest/modules/data_source_base.js +9 -35
  21. package/dest/modules/data_store_updater.d.ts +1 -1
  22. package/dest/modules/data_store_updater.d.ts.map +1 -1
  23. package/dest/modules/data_store_updater.js +4 -3
  24. package/dest/modules/instrumentation.d.ts +9 -1
  25. package/dest/modules/instrumentation.d.ts.map +1 -1
  26. package/dest/modules/instrumentation.js +23 -2
  27. package/dest/modules/l1_synchronizer.d.ts +3 -3
  28. package/dest/modules/l1_synchronizer.d.ts.map +1 -1
  29. package/dest/modules/l1_synchronizer.js +78 -41
  30. package/dest/modules/validation.d.ts +29 -7
  31. package/dest/modules/validation.d.ts.map +1 -1
  32. package/dest/modules/validation.js +31 -13
  33. package/dest/store/block_store.d.ts +20 -11
  34. package/dest/store/block_store.d.ts.map +1 -1
  35. package/dest/store/block_store.js +43 -25
  36. package/dest/store/contract_class_store.d.ts +1 -1
  37. package/dest/store/contract_class_store.d.ts.map +1 -1
  38. package/dest/store/contract_class_store.js +19 -1
  39. package/dest/store/contract_instance_store.d.ts +1 -1
  40. package/dest/store/contract_instance_store.d.ts.map +1 -1
  41. package/dest/store/contract_instance_store.js +18 -1
  42. package/dest/store/log_store.d.ts +1 -1
  43. package/dest/store/log_store.d.ts.map +1 -1
  44. package/dest/store/log_store.js +3 -3
  45. package/dest/store/log_store_codec.d.ts +9 -1
  46. package/dest/store/log_store_codec.d.ts.map +1 -1
  47. package/dest/store/log_store_codec.js +9 -0
  48. package/dest/test/fake_l1_state.js +3 -3
  49. package/dest/test/mock_l1_to_l2_message_source.d.ts +1 -1
  50. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  51. package/dest/test/mock_l1_to_l2_message_source.js +1 -2
  52. package/dest/test/mock_l2_block_source.d.ts +1 -4
  53. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  54. package/dest/test/mock_l2_block_source.js +8 -22
  55. package/dest/test/mock_structs.d.ts +1 -1
  56. package/dest/test/mock_structs.d.ts.map +1 -1
  57. package/dest/test/mock_structs.js +2 -2
  58. package/dest/test/noop_l1_archiver.d.ts +1 -1
  59. package/dest/test/noop_l1_archiver.d.ts.map +1 -1
  60. package/dest/test/noop_l1_archiver.js +1 -1
  61. package/package.json +14 -13
  62. package/src/archiver.ts +44 -14
  63. package/src/config.ts +8 -0
  64. package/src/factory.ts +34 -0
  65. package/src/l1/calldata_retriever.ts +13 -6
  66. package/src/l1/data_retrieval.ts +8 -1
  67. package/src/modules/contract_data_source_adapter.ts +1 -10
  68. package/src/modules/data_source_base.ts +9 -38
  69. package/src/modules/data_store_updater.ts +4 -3
  70. package/src/modules/instrumentation.ts +15 -2
  71. package/src/modules/l1_synchronizer.ts +120 -57
  72. package/src/modules/validation.ts +71 -15
  73. package/src/store/block_store.ts +42 -31
  74. package/src/store/contract_class_store.ts +19 -1
  75. package/src/store/contract_instance_store.ts +18 -1
  76. package/src/store/log_store.ts +3 -2
  77. package/src/store/log_store_codec.ts +11 -0
  78. package/src/test/fake_l1_state.ts +3 -3
  79. package/src/test/mock_l1_to_l2_message_source.ts +0 -1
  80. package/src/test/mock_l2_block_source.ts +8 -22
  81. package/src/test/mock_structs.ts +5 -2
  82. package/src/test/noop_l1_archiver.ts +3 -3
@@ -109,22 +109,6 @@ import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
109
109
  return this.stores.blocks.getFinalizedCheckpointNumber();
110
110
  }
111
111
  }
112
- /**
113
- * Resolves a {@link CheckpointsQuery} to a concrete `{from, limit}` pair used by BlockStore,
114
- * or undefined when the epoch has no checkpoints.
115
- */ async resolveCheckpointsQuery(query) {
116
- if ('from' in query) {
117
- return query;
118
- }
119
- const numbers = await this.getCheckpointNumbersForEpoch(query.epoch);
120
- if (numbers.length === 0) {
121
- return undefined;
122
- }
123
- return {
124
- from: numbers[0],
125
- limit: numbers.length
126
- };
127
- }
128
112
  async getCheckpoint(query) {
129
113
  const number = await this.resolveCheckpointQuery(query);
130
114
  if (number === undefined || number === 0) {
@@ -137,11 +121,7 @@ import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
137
121
  return this.getPublishedCheckpointFromCheckpointData(data);
138
122
  }
139
123
  async getCheckpoints(query) {
140
- const resolved = await this.resolveCheckpointsQuery(query);
141
- if (!resolved) {
142
- return [];
143
- }
144
- const checkpoints = await this.stores.blocks.getRangeOfCheckpoints(resolved.from, resolved.limit);
124
+ const checkpoints = await this.getCheckpointsData(query);
145
125
  return Promise.all(checkpoints.map((ch)=>this.getPublishedCheckpointFromCheckpointData(ch)));
146
126
  }
147
127
  async getCheckpointData(query) {
@@ -152,11 +132,14 @@ import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
152
132
  return this.stores.blocks.getCheckpointData(number);
153
133
  }
154
134
  async getCheckpointsData(query) {
155
- const resolved = await this.resolveCheckpointsQuery(query);
156
- if (!resolved) {
157
- return [];
135
+ if ('fromSlot' in query) {
136
+ return this.stores.blocks.getCheckpointsBySlot(query.fromSlot, query.limit, query.reverse ?? false);
158
137
  }
159
- return this.stores.blocks.getRangeOfCheckpoints(resolved.from, resolved.limit);
138
+ if ('from' in query) {
139
+ return this.stores.blocks.getRangeOfCheckpoints(query.from, query.limit);
140
+ }
141
+ const numbers = await this.getCheckpointNumbersForEpoch(query.epoch);
142
+ return numbers.length > 0 ? this.stores.blocks.getRangeOfCheckpoints(numbers[0], numbers.length) : [];
160
143
  }
161
144
  getProposedCheckpointData(query) {
162
145
  if (!query || 'tag' in query) {
@@ -190,16 +173,7 @@ import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
190
173
  getBytecodeCommitment(id) {
191
174
  return this.stores.contractClasses.getBytecodeCommitment(id);
192
175
  }
193
- async getContract(address, maybeTimestamp) {
194
- let timestamp;
195
- if (maybeTimestamp === undefined) {
196
- const latestBlockData = await this.getBlockData({
197
- tag: 'proposed'
198
- });
199
- timestamp = latestBlockData ? latestBlockData.header.globalVariables.timestamp : 0n;
200
- } else {
201
- timestamp = maybeTimestamp;
202
- }
176
+ getContract(address, timestamp) {
203
177
  return this.stores.contractInstances.getContractInstance(address, timestamp);
204
178
  }
205
179
  getContractClassIds() {
@@ -102,4 +102,4 @@ export declare class ArchiverDataStoreUpdater {
102
102
  private updateUpdatedContractInstances;
103
103
  }
104
104
  export {};
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zdG9yZV91cGRhdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9kYXRhX3N0b3JlX3VwZGF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBUWhGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25HLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxtQkFBbUIsRUFFekIsTUFBTSwwQkFBMEIsQ0FBQztBQVVsQyxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUTdELDZFQUE2RTtBQUM3RSxLQUFLLDBCQUEwQixHQUFHO0lBQ2hDLG1FQUFtRTtJQUNuRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLGlGQUFpRjtJQUNqRiw4QkFBOEIsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0NBQ3pELENBQUM7QUFFRixrRUFBa0U7QUFDbEUscUJBQWEsd0JBQXdCO0lBSWpDLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNwQixPQUFPLENBQUMsSUFBSTtJQUxkLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUEwQztJQUU5RCxZQUNVLE1BQU0sRUFBRSxrQkFBa0IsRUFDMUIsV0FBVyxDQUFDLHlCQUFhLEVBQ3pCLElBQUksR0FBRTtRQUFFLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFPLEVBQzdDO0lBRUo7Ozs7Ozs7O09BUUc7SUFDVSxnQkFBZ0IsQ0FDM0IsS0FBSyxFQUFFLE9BQU8sRUFDZCw0QkFBNEIsQ0FBQyxFQUFFLHdCQUF3QixHQUN0RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBa0JsQjtJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNVLGNBQWMsQ0FDekIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEVBQ2xDLDRCQUE0QixDQUFDLEVBQUUsd0JBQXdCLEVBQ3ZELGVBQWUsQ0FBQyxFQUFFO1FBQ2hCLEVBQUUsRUFBRSxlQUFlLENBQUM7UUFDcEIsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFDckMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0tBQ2pDLEVBQ0QsaUJBQWlCLENBQUMsRUFBRSxnQkFBZ0IsR0FDbkMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBc0RyQztJQUVZLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLHVCQUF1QixpQkFNN0U7WUFnQmEsMkJBQTJCO0lBdUV6Qzs7Ozs7Ozs7T0FRRztJQUNVLCtCQUErQixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBaUJ6RjtJQUVEOzs7Ozs7Ozs7T0FTRztJQUNVLDBDQUEwQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBY3BHO1lBT2EsdUNBQXVDO1lBWXZDLGlCQUFpQjtJQWEvQjs7Ozs7Ozs7T0FRRztJQUNVLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FnQnhGO0lBRUQ7OztPQUdHO0lBQ1UseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUt4RjtJQUVEOzs7T0FHRztJQUNVLDRCQUE0QixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FLM0Y7SUFFRCw2REFBNkQ7SUFDN0QsT0FBTyxDQUFDLG1CQUFtQjtJQUkzQixxREFBcUQ7SUFDckQsT0FBTyxDQUFDLHdCQUF3QjtZQUtsQixzQkFBc0I7WUFpQnRCLDhCQUE4QjtZQStDOUIsK0JBQStCO1lBMEMvQiw4QkFBOEI7Q0FzQjdDIn0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zdG9yZV91cGRhdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9kYXRhX3N0b3JlX3VwZGF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBUWhGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25HLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxtQkFBbUIsRUFFekIsTUFBTSwwQkFBMEIsQ0FBQztBQVVsQyxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUTdELDZFQUE2RTtBQUM3RSxLQUFLLDBCQUEwQixHQUFHO0lBQ2hDLG1FQUFtRTtJQUNuRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLGlGQUFpRjtJQUNqRiw4QkFBOEIsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0NBQ3pELENBQUM7QUFFRixrRUFBa0U7QUFDbEUscUJBQWEsd0JBQXdCO0lBSWpDLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNwQixPQUFPLENBQUMsSUFBSTtJQUxkLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUEwQztJQUU5RCxZQUNVLE1BQU0sRUFBRSxrQkFBa0IsRUFDMUIsV0FBVyxDQUFDLHlCQUFhLEVBQ3pCLElBQUksR0FBRTtRQUFFLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFPLEVBQzdDO0lBRUo7Ozs7Ozs7O09BUUc7SUFDVSxnQkFBZ0IsQ0FDM0IsS0FBSyxFQUFFLE9BQU8sRUFDZCw0QkFBNEIsQ0FBQyxFQUFFLHdCQUF3QixHQUN0RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBa0JsQjtJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNVLGNBQWMsQ0FDekIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEVBQ2xDLDRCQUE0QixDQUFDLEVBQUUsd0JBQXdCLEVBQ3ZELGVBQWUsQ0FBQyxFQUFFO1FBQ2hCLEVBQUUsRUFBRSxlQUFlLENBQUM7UUFDcEIsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFDckMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0tBQ2pDLEVBQ0QsaUJBQWlCLENBQUMsRUFBRSxnQkFBZ0IsR0FDbkMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBdURyQztJQUVZLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLHVCQUF1QixpQkFNN0U7WUFnQmEsMkJBQTJCO0lBdUV6Qzs7Ozs7Ozs7T0FRRztJQUNVLCtCQUErQixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBaUJ6RjtJQUVEOzs7Ozs7Ozs7T0FTRztJQUNVLDBDQUEwQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBY3BHO1lBT2EsdUNBQXVDO1lBWXZDLGlCQUFpQjtJQWEvQjs7Ozs7Ozs7T0FRRztJQUNVLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FnQnhGO0lBRUQ7OztPQUdHO0lBQ1UseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUt4RjtJQUVEOzs7T0FHRztJQUNVLDRCQUE0QixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FLM0Y7SUFFRCw2REFBNkQ7SUFDN0QsT0FBTyxDQUFDLG1CQUFtQjtJQUkzQixxREFBcUQ7SUFDckQsT0FBTyxDQUFDLHdCQUF3QjtZQUtsQixzQkFBc0I7WUFpQnRCLDhCQUE4QjtZQStDOUIsK0JBQStCO1lBMEMvQiw4QkFBOEI7Q0FzQjdDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"data_store_updater.d.ts","sourceRoot":"","sources":["../../src/modules/data_store_updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAEzB,MAAM,0BAA0B,CAAC;AAUlC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAQ7D,6EAA6E;AAC7E,KAAK,0BAA0B,GAAG;IAChC,mEAAmE;IACnE,YAAY,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACpC,iFAAiF;IACjF,8BAA8B,EAAE,WAAW,GAAG,SAAS,CAAC;CACzD,CAAC;AAEF,kEAAkE;AAClE,qBAAa,wBAAwB;IAIjC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,IAAI;IALd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0C;IAE9D,YACU,MAAM,EAAE,kBAAkB,EAC1B,WAAW,CAAC,yBAAa,EACzB,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,EAC7C;IAEJ;;;;;;;;OAQG;IACU,gBAAgB,CAC3B,KAAK,EAAE,OAAO,EACd,4BAA4B,CAAC,EAAE,wBAAwB,GACtD,OAAO,CAAC,OAAO,CAAC,CAkBlB;IAED;;;;;;;;;;;;OAYG;IACU,cAAc,CACzB,WAAW,EAAE,mBAAmB,EAAE,EAClC,4BAA4B,CAAC,EAAE,wBAAwB,EACvD,eAAe,CAAC,EAAE;QAChB,EAAE,EAAE,eAAe,CAAC;QACpB,YAAY,EAAE,oBAAoB,EAAE,CAAC;QACrC,UAAU,EAAE,mBAAmB,CAAC;KACjC,EACD,iBAAiB,CAAC,EAAE,gBAAgB,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAsDrC;IAEY,qBAAqB,CAAC,kBAAkB,EAAE,uBAAuB,iBAM7E;YAgBa,2BAA2B;IAuEzC;;;;;;;;OAQG;IACU,+BAA+B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAiBzF;IAED;;;;;;;;;OASG;IACU,0CAA0C,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAcpG;YAOa,uCAAuC;YAYvC,iBAAiB;IAa/B;;;;;;;;OAQG;IACU,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBxF;IAED;;;OAGG;IACU,yBAAyB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF;IAED;;;OAGG;IACU,4BAA4B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3F;IAED,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB;IAI3B,qDAAqD;IACrD,OAAO,CAAC,wBAAwB;YAKlB,sBAAsB;YAiBtB,8BAA8B;YA+C9B,+BAA+B;YA0C/B,8BAA8B;CAsB7C"}
1
+ {"version":3,"file":"data_store_updater.d.ts","sourceRoot":"","sources":["../../src/modules/data_store_updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAEzB,MAAM,0BAA0B,CAAC;AAUlC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAQ7D,6EAA6E;AAC7E,KAAK,0BAA0B,GAAG;IAChC,mEAAmE;IACnE,YAAY,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACpC,iFAAiF;IACjF,8BAA8B,EAAE,WAAW,GAAG,SAAS,CAAC;CACzD,CAAC;AAEF,kEAAkE;AAClE,qBAAa,wBAAwB;IAIjC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,IAAI;IALd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0C;IAE9D,YACU,MAAM,EAAE,kBAAkB,EAC1B,WAAW,CAAC,yBAAa,EACzB,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,EAC7C;IAEJ;;;;;;;;OAQG;IACU,gBAAgB,CAC3B,KAAK,EAAE,OAAO,EACd,4BAA4B,CAAC,EAAE,wBAAwB,GACtD,OAAO,CAAC,OAAO,CAAC,CAkBlB;IAED;;;;;;;;;;;;OAYG;IACU,cAAc,CACzB,WAAW,EAAE,mBAAmB,EAAE,EAClC,4BAA4B,CAAC,EAAE,wBAAwB,EACvD,eAAe,CAAC,EAAE;QAChB,EAAE,EAAE,eAAe,CAAC;QACpB,YAAY,EAAE,oBAAoB,EAAE,CAAC;QACrC,UAAU,EAAE,mBAAmB,CAAC;KACjC,EACD,iBAAiB,CAAC,EAAE,gBAAgB,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAuDrC;IAEY,qBAAqB,CAAC,kBAAkB,EAAE,uBAAuB,iBAM7E;YAgBa,2BAA2B;IAuEzC;;;;;;;;OAQG;IACU,+BAA+B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAiBzF;IAED;;;;;;;;;OASG;IACU,0CAA0C,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAcpG;YAOa,uCAAuC;YAYvC,iBAAiB;IAa/B;;;;;;;;OAQG;IACU,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBxF;IAED;;;OAGG;IACU,yBAAyB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF;IAED;;;OAGG;IACU,4BAA4B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3F;IAED,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB;IAI3B,qDAAqD;IACrD,OAAO,CAAC,wBAAwB;YAKlB,sBAAsB;YAiBtB,8BAA8B;YA+C9B,+BAA+B;YA0C/B,8BAA8B;CAsB7C"}
@@ -78,9 +78,10 @@ import { MAX_CAPACITY_BLOCKS_PER_CHECKPOINT } from '@aztec/stdlib/deserializatio
78
78
  const result = await this.stores.db.transactionAsync(async ()=>{
79
79
  // Before adding checkpoints, check for conflicts with local blocks if any
80
80
  const { prunedBlocks, lastAlreadyInsertedBlockNumber } = await this.pruneMismatchingLocalBlocks(checkpoints);
81
- await this.stores.blocks.addCheckpoints(checkpoints);
82
- // Filter out blocks that were already inserted via addProposedBlock() to avoid duplicating logs/contract data
83
- const newBlocks = checkpoints.flatMap((ch)=>ch.checkpoint.blocks).filter((b)=>lastAlreadyInsertedBlockNumber === undefined || b.number > lastAlreadyInsertedBlockNumber);
81
+ const insertedCheckpoints = await this.stores.blocks.addCheckpoints(checkpoints);
82
+ // Skip blocks already inserted via addProposedBlock() and blocks of already-stored checkpoints
83
+ // re-included by an L1 reorg: their logs/contract data were extracted when first inserted.
84
+ const newBlocks = insertedCheckpoints.flatMap((ch)=>ch.checkpoint.blocks).filter((b)=>lastAlreadyInsertedBlockNumber === undefined || b.number > lastAlreadyInsertedBlockNumber);
84
85
  await Promise.all([
85
86
  // Update the pending chain validation status if provided
86
87
  pendingChainValidationStatus && this.stores.blocks.setPendingChainValidationStatus(pendingChainValidationStatus),
@@ -33,6 +33,14 @@ export declare class ArchiverInstrumentation {
33
33
  processNewCheckpointedBlocks(syncTimePerCheckpoint: number, blocks: L2Block[]): void;
34
34
  processNewMessages(count: number, syncPerMessageMs: number): void;
35
35
  processPrune(duration: number): void;
36
+ /**
37
+ * Records a pending-chain reorg, where the archiver dropped proposed blocks (and world-state follows by pruning). The
38
+ * type distinguishes the cause: 'uncheckpointed' (slot ended without a checkpoint), 'l1_conflict' (proposed blocks
39
+ * conflicting with an L1 checkpoint), 'orphan' (no matching proposed checkpoint arrived before the deadline), or
40
+ * 'l1_mismatch' (the local checkpointed tip diverged from L1 — an L1 reorg or a pruned/missed-proof checkpoint — so
41
+ * already-checkpointed blocks were rewound).
42
+ */
43
+ recordPrune(pruneType: 'uncheckpointed' | 'l1_conflict' | 'orphan' | 'l1_mismatch'): void;
36
44
  updateLastProvenCheckpoint(checkpoint: CheckpointData): void;
37
45
  processProofsVerified(logs: {
38
46
  proverId: string;
@@ -52,4 +60,4 @@ export declare class ArchiverInstrumentation {
52
60
  l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>;
53
61
  }): void;
54
62
  }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyxlQUFlLEVBQ3BCLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFFakMscUJBQWEsdUJBQXVCO0lBK0JoQyxPQUFPLENBQUMsU0FBUztJQTlCbkIsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsV0FBVyxDQUFRO0lBQzNCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBUTtJQUNoQyxPQUFPLENBQUMsT0FBTyxDQUFnQjtJQUMvQixPQUFPLENBQUMsYUFBYSxDQUFRO0lBQzdCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBWTtJQUN4QyxPQUFPLENBQUMsb0JBQW9CLENBQWdCO0lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGFBQWEsQ0FBWTtJQUNqQyxPQUFPLENBQUMsVUFBVSxDQUFnQjtJQUVsQyxPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLHlCQUF5QixDQUFZO0lBQzdDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBWTtJQUUvQixPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsMEJBQTBCLENBQWdCO0lBRWxELE9BQU8sQ0FBQywwQkFBMEIsQ0FBWTtJQUM5QyxPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLE9BQU8sQ0FBQyxHQUFHLENBQTRDO0lBRXZELE9BQU8sZUEwRE47SUFFRCxPQUFvQixHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxpQkFBaUIsb0NBTWhGO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FFMUI7SUFFTSx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sUUFTdEU7SUFFTSw0QkFBNEIsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQVNuRjtJQUVNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQU1oRTtJQUVNLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUduQztJQUVNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxjQUFjLFFBSTNEO0lBRU0scUJBQXFCLENBQUMsSUFBSSxFQUFFO1FBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxRQVc5RjtJQUVNLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRTdDO0lBRU0sMkJBQTJCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxRQUtwRTtJQUVELHdFQUF3RTtJQUNqRSx5QkFBeUIsU0FFL0I7SUFFRDs7T0FFRztJQUNJLHlCQUF5QixDQUFDLElBQUksRUFBRTtRQUNyQyxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLEdBQUcsY0FBYyxDQUFDLENBQUM7S0FDeEUsR0FBRyxJQUFJLENBSVA7Q0FDRiJ9
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyxlQUFlLEVBQ3BCLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFFakMscUJBQWEsdUJBQXVCO0lBK0JoQyxPQUFPLENBQUMsU0FBUztJQTlCbkIsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsV0FBVyxDQUFRO0lBQzNCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBUTtJQUNoQyxPQUFPLENBQUMsT0FBTyxDQUFnQjtJQUMvQixPQUFPLENBQUMsYUFBYSxDQUFRO0lBQzdCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBWTtJQUN4QyxPQUFPLENBQUMsb0JBQW9CLENBQWdCO0lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGFBQWEsQ0FBWTtJQUNqQyxPQUFPLENBQUMsVUFBVSxDQUFnQjtJQUVsQyxPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLHlCQUF5QixDQUFZO0lBQzdDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBWTtJQUUvQixPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsMEJBQTBCLENBQWdCO0lBRWxELE9BQU8sQ0FBQywwQkFBMEIsQ0FBWTtJQUM5QyxPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLE9BQU8sQ0FBQyxHQUFHLENBQTRDO0lBRXZELE9BQU8sZUE0RE47SUFFRCxPQUFvQixHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxpQkFBaUIsb0NBTWhGO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FFMUI7SUFFTSx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sUUFTdEU7SUFFTSw0QkFBNEIsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQVNuRjtJQUVNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQU1oRTtJQUVNLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUduQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEdBQUcsYUFBYSxHQUFHLFFBQVEsR0FBRyxhQUFhLFFBRXhGO0lBRU0sMEJBQTBCLENBQUMsVUFBVSxFQUFFLGNBQWMsUUFJM0Q7SUFFTSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUU7UUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQztRQUFDLEtBQUssRUFBRSxNQUFNLENBQUE7S0FBRSxFQUFFLFFBVzlGO0lBRU0sbUJBQW1CLENBQUMsV0FBVyxFQUFFLE1BQU0sUUFFN0M7SUFFTSwyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLFFBS3BFO0lBRUQsd0VBQXdFO0lBQ2pFLHlCQUF5QixTQUUvQjtJQUVEOztPQUVHO0lBQ0kseUJBQXlCLENBQUMsSUFBSSxFQUFFO1FBQ3JDLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQztLQUN4RSxHQUFHLElBQUksQ0FJUDtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/modules/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IA+BhC,OAAO,CAAC,SAAS;IA9BnB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,0BAA0B,CAAgB;IAElD,OAAO,CAAC,0BAA0B,CAAY;IAC9C,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO,eA0DN;IAED,OAAoB,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB,oCAMhF;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,QAStE;IAEM,4BAA4B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QASnF;IAEM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,QAMhE;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,QAGnC;IAEM,0BAA0B,CAAC,UAAU,EAAE,cAAc,QAI3D;IAEM,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,QAW9F;IAEM,mBAAmB,CAAC,WAAW,EAAE,MAAM,QAE7C;IAEM,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,QAKpE;IAED,wEAAwE;IACjE,yBAAyB,SAE/B;IAED;;OAEG;IACI,yBAAyB,CAAC,IAAI,EAAE;QACrC,UAAU,EAAE,UAAU,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;KACxE,GAAG,IAAI,CAIP;CACF"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/modules/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IA+BhC,OAAO,CAAC,SAAS;IA9BnB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,0BAA0B,CAAgB;IAElD,OAAO,CAAC,0BAA0B,CAAY;IAC9C,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO,eA4DN;IAED,OAAoB,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB,oCAMhF;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,QAStE;IAEM,4BAA4B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QASnF;IAEM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,QAMhE;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,QAGnC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,SAAS,EAAE,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,QAExF;IAEM,0BAA0B,CAAC,UAAU,EAAE,cAAc,QAI3D;IAEM,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,QAW9F;IAEM,mBAAmB,CAAC,WAAW,EAAE,MAAM,QAE7C;IAEM,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,QAKpE;IAED,wEAAwE;IACjE,yBAAyB,SAE/B;IAED;;OAEG;IACI,yBAAyB,CAAC,IAAI,EAAE;QACrC,UAAU,EAAE,UAAU,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;KACxE,GAAG,IAAI,CAIP;CACF"}
@@ -48,7 +48,15 @@ export class ArchiverInstrumentation {
48
48
  this.syncDurationPerMessage = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_MESSAGE);
49
49
  this.syncMessageCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_MESSAGE_COUNT);
50
50
  this.pruneDuration = meter.createHistogram(Metrics.ARCHIVER_PRUNE_DURATION);
51
- this.pruneCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_PRUNE_COUNT);
51
+ this.pruneCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_PRUNE_COUNT, {
52
+ [Attributes.PRUNE_TYPE]: [
53
+ 'unproven',
54
+ 'uncheckpointed',
55
+ 'l1_conflict',
56
+ 'orphan',
57
+ 'l1_mismatch'
58
+ ]
59
+ });
52
60
  this.blockProposalTxTargetCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_BLOCK_PROPOSAL_TX_TARGET_COUNT, {
53
61
  [Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: [
54
62
  true,
@@ -99,9 +107,22 @@ export class ArchiverInstrumentation {
99
107
  this.syncDurationPerMessage.record(Math.ceil(syncPerMessageMs));
100
108
  }
101
109
  processPrune(duration) {
102
- this.pruneCount.add(1);
110
+ this.pruneCount.add(1, {
111
+ [Attributes.PRUNE_TYPE]: 'unproven'
112
+ });
103
113
  this.pruneDuration.record(Math.ceil(duration));
104
114
  }
115
+ /**
116
+ * Records a pending-chain reorg, where the archiver dropped proposed blocks (and world-state follows by pruning). The
117
+ * type distinguishes the cause: 'uncheckpointed' (slot ended without a checkpoint), 'l1_conflict' (proposed blocks
118
+ * conflicting with an L1 checkpoint), 'orphan' (no matching proposed checkpoint arrived before the deadline), or
119
+ * 'l1_mismatch' (the local checkpointed tip diverged from L1 — an L1 reorg or a pruned/missed-proof checkpoint — so
120
+ * already-checkpointed blocks were rewound).
121
+ */ recordPrune(pruneType) {
122
+ this.pruneCount.add(1, {
123
+ [Attributes.PRUNE_TYPE]: pruneType
124
+ });
125
+ }
105
126
  updateLastProvenCheckpoint(checkpoint) {
106
127
  const lastBlockNumberInCheckpoint = checkpoint.startBlock + checkpoint.blockCount - 1;
107
128
  this.blockHeight.record(lastBlockNumberInCheckpoint, {
@@ -6,7 +6,7 @@ import { Buffer32 } from '@aztec/foundation/buffer';
6
6
  import { Fr } from '@aztec/foundation/curves/bn254';
7
7
  import { type Logger } from '@aztec/foundation/log';
8
8
  import { DateProvider } from '@aztec/foundation/timer';
9
- import { type ArchiverEmitter } from '@aztec/stdlib/block';
9
+ import { type ArchiverEmitter, type L2Block } from '@aztec/stdlib/block';
10
10
  import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
11
11
  import { type Traceable, type Tracer } from '@aztec/telemetry-client';
12
12
  import { type ArchiverDataStores } from '../store/data_stores.js';
@@ -58,7 +58,7 @@ export declare class ArchiverL1Synchronizer implements Traceable {
58
58
  private getSignatureContext;
59
59
  /** Checks that the ethereum node we are connected to has a latest timestamp no more than the allowed drift. Throw if not. */
60
60
  testEthereumNodeSynced(): Promise<void>;
61
- syncFromL1(initialSyncComplete: boolean): Promise<void>;
61
+ syncFromL1(initialSyncComplete: boolean): Promise<L2Block[]>;
62
62
  private updateFinalizedCheckpoint;
63
63
  private pruneUncheckpointedBlocks;
64
64
  private canPrune;
@@ -74,4 +74,4 @@ export declare class ArchiverL1Synchronizer implements Traceable {
74
74
  private checkForNewCheckpointsBeforeL1SyncPoint;
75
75
  private getCheckpointHeader;
76
76
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9sMV9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBMkIsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHbkcsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUlyRixPQUFPLEVBQVksUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0QsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRyxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBd0MsTUFBTSw2QkFBNkIsQ0FBQztBQUczRyxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFZN0YsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDekYsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJN0QsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWVwRTs7O0dBR0c7QUFDSCxxQkFBYSxzQkFBdUIsWUFBVyxTQUFTO0lBU3BELE9BQU8sQ0FBQyxRQUFRLENBQUMs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
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9sMV9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBMkIsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHbkcsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUlyRixPQUFPLEVBQVksUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxPQUFPLEVBR2IsTUFBTSxxQkFBcUIsQ0FBQztBQVE3QixPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBd0MsTUFBTSw2QkFBNkIsQ0FBQztBQUczRyxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFZN0YsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDekYsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJN0QsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWlCcEU7OztHQUdHO0FBQ0gscUJBQWEsc0JBQXVCLFlBQVcsU0FBUztJQVNwRCxPQUFP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
@@ -1 +1 @@
1
- {"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"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"}
@@ -393,7 +393,7 @@ import { getCheckpointBlobDataFromBlobs, retrieveCheckpointCalldataFromRollup, r
393
393
  import { getArchiverSynchPoint } from '../store/data_stores.js';
394
394
  import { MessageStoreError } from '../store/message_store.js';
395
395
  import { ArchiverDataStoreUpdater } from './data_store_updater.js';
396
- import { validateCheckpointAttestations } from './validation.js';
396
+ import { validateCheckpointAttestationsFromCalldata } from './validation.js';
397
397
  _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpochPrune'), _dec2 = trackSpan('Archiver.handleL1ToL2Messages'), _dec3 = trackSpan('Archiver.handleCheckpoints');
398
398
  /**
399
399
  * Handles L1 synchronization for the archiver.
@@ -490,6 +490,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
490
490
  }
491
491
  }
492
492
  async syncFromL1(initialSyncComplete) {
493
+ const blocksAdded = [];
493
494
  // In between the various calls to L1, the block number can move meaning some of the following
494
495
  // calls will return data for blocks that were not present during earlier calls. To combat this
495
496
  // we ensure that all data retrieval methods only retrieve data up to the currentBlockNumber
@@ -506,7 +507,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
506
507
  };
507
508
  if (this.l1BlockHash && currentL1BlockHash.equals(this.l1BlockHash)) {
508
509
  this.log.trace(`No new L1 blocks since last sync at L1 block ${this.l1BlockNumber}`);
509
- return;
510
+ return blocksAdded;
510
511
  }
511
512
  // Log at error if the latest L1 block timestamp is too old
512
513
  const maxAllowedDelay = this.config.maxAllowedEthClientDriftSeconds;
@@ -540,6 +541,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
540
541
  // First we retrieve new checkpoints and L2 blocks and store them in the DB. This will also update the
541
542
  // pending chain validation status, proven checkpoint number, and synched L1 block number.
542
543
  const rollupStatus = await this.handleCheckpoints(blocksSynchedTo, currentL1BlockNumber, initialSyncComplete);
544
+ blocksAdded.push(...rollupStatus.blocksAdded);
543
545
  // Then we try pruning uncheckpointed blocks if a new slot was mined without checkpoints
544
546
  await this.pruneUncheckpointedBlocks(currentL1Timestamp);
545
547
  // Then we prune the current epoch if it'd reorg on next submission.
@@ -570,6 +572,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
570
572
  l1TimestampAtStart: currentL1Timestamp,
571
573
  l1BlockNumberAtEnd
572
574
  });
575
+ return blocksAdded;
573
576
  }
574
577
  /** Updates the finalized checkpoint using the pre-fetched finalized L1 block from the current sync iteration. */ async updateFinalizedCheckpoint(finalizedL1Block) {
575
578
  try {
@@ -625,6 +628,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
625
628
  });
626
629
  const prunedBlocks = await this.updater.removeUncheckpointedBlocksAfter(lastCheckpointedBlockNumber);
627
630
  if (prunedBlocks.length > 0) {
631
+ this.instrumentation.recordPrune('uncheckpointed');
628
632
  this.events.emit(L2BlockSourceEvents.L2PruneUncheckpointed, {
629
633
  type: L2BlockSourceEvents.L2PruneUncheckpointed,
630
634
  slotNumber: firstUncheckpointedBlockSlot,
@@ -885,6 +889,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
885
889
  return Buffer32.fromString(block.hash);
886
890
  }
887
891
  async handleCheckpoints(blocksSynchedTo, currentL1BlockNumber, initialSyncComplete) {
892
+ const blocksAdded = [];
888
893
  const localPendingCheckpointNumber = await this.stores.blocks.getLatestCheckpointNumber();
889
894
  const initialValidationResult = await this.stores.blocks.getPendingChainValidationStatus();
890
895
  const { provenCheckpointNumber, provenArchive, pendingCheckpointNumber, pendingArchive, archiveOfMyCheckpoint: archiveForLocalPendingCheckpointNumber } = await execInSpan(this.tracer, 'Archiver.getRollupStatus', ()=>this.rollup.status(localPendingCheckpointNumber, {
@@ -895,7 +900,8 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
895
900
  provenArchive: provenArchive.toString(),
896
901
  pendingCheckpointNumber,
897
902
  pendingArchive: pendingArchive.toString(),
898
- validationResult: initialValidationResult
903
+ validationResult: initialValidationResult,
904
+ blocksAdded
899
905
  };
900
906
  this.log.trace(`Retrieved rollup status at current L1 block ${currentL1BlockNumber}.`, {
901
907
  localPendingCheckpointNumber,
@@ -1006,6 +1012,9 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1006
1012
  }
1007
1013
  const checkpointsToRemove = localPendingCheckpointNumber - tipAfterUnwind;
1008
1014
  await this.updater.removeCheckpointsAfter(CheckpointNumber(tipAfterUnwind));
1015
+ if (checkpointsToRemove > 0) {
1016
+ this.instrumentation.recordPrune('l1_mismatch');
1017
+ }
1009
1018
  this.log.warn(`Removed ${count(checkpointsToRemove, 'checkpoint')} after checkpoint ${tipAfterUnwind} ` + `due to mismatched checkpoint hashes at L1 block ${currentL1BlockNumber}. ` + `Updated L2 latest checkpoint is ${await this.stores.blocks.getLatestCheckpointNumber()}.`);
1010
1019
  }
1011
1020
  }
@@ -1038,31 +1047,24 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1038
1047
  const promoteResult = await this.tryBuildPublishedCheckpointFromProposed(lastCalldataCheckpoint);
1039
1048
  const checkpointToPromote = promoteResult && !('diverged' in promoteResult) ? promoteResult : undefined;
1040
1049
  const evictProposedFrom = promoteResult && 'diverged' in promoteResult ? promoteResult.fromCheckpointNumber : undefined;
1041
- // Then fetch blobs in parallel and build the full published checkpoints
1042
- const toFetchBlobs = checkpointToPromote ? calldataCheckpoints.slice(0, -1) : calldataCheckpoints;
1043
- const blobFetched = await asyncPool(10, toFetchBlobs, async (checkpoint)=>retrievedToPublishedCheckpoint({
1044
- ...checkpoint,
1045
- checkpointBlobData: await getCheckpointBlobDataFromBlobs(this.blobClient, checkpoint.l1.blockHash, checkpoint.blobHashes, checkpoint.checkpointNumber, this.log, !initialSyncComplete, checkpoint.parentBeaconBlockRoot, checkpoint.l1.timestamp)
1046
- }));
1047
- // And add the promoted checkpoint to the list of all checkpoints
1048
- const publishedCheckpoints = checkpointToPromote ? [
1049
- ...blobFetched,
1050
- checkpointToPromote
1051
- ] : blobFetched;
1052
- const validCheckpoints = [];
1053
- // Now loop through all checkpoints and validate their attestations
1054
- for (const published of publishedCheckpoints){
1055
- // Check the attestations uploaded by the publisher to L1 are correct
1050
+ // Validate attestations from CALLDATA before fetching any blobs. A checkpoint with invalid
1051
+ // attestations (or one descending from a rejected ancestor) is rejected here without fetching its
1052
+ // blobs, so a malformed blob does not throw during decode before the rejection path runs and
1053
+ // stall sync. The signed consensus payload (header, archive root, fee asset price
1054
+ // modifier) is fully available from calldata.
1055
+ const checkpointsToIngest = [];
1056
+ for (const calldataCheckpoint of calldataCheckpoints){
1057
+ // Check the attestations uploaded by the publisher to L1 are correct.
1056
1058
  // Rollup contract does not validate attestations to save on gas, so this
1057
1059
  // falls on the nodes to verify offchain and skip those checkpoints.
1058
1060
  const validationResult = this.config.skipValidateCheckpointAttestations ? {
1059
1061
  valid: true
1060
- } : await validateCheckpointAttestations(published, this.epochCache, this.l1Constants, this.getSignatureContext(), this.log);
1062
+ } : await validateCheckpointAttestationsFromCalldata(calldataCheckpoint, this.epochCache, this.l1Constants, this.getSignatureContext(), this.log);
1061
1063
  // Also skip the checkpoint if it builds on a previously-rejected ancestor. Without
1062
1064
  // this, addCheckpoints would throw InitialCheckpointNumberNotSequentialError when the
1063
1065
  // ancestor was skipped earlier (e.g. due to invalid attestations), the catch handler
1064
1066
  // would roll back the L1 sync point, and the next iteration would re-fetch and re-throw.
1065
- const rejectedAncestor = await this.stores.blocks.getRejectedCheckpointByArchiveRoot(published.checkpoint.header.lastArchiveRoot);
1067
+ const rejectedAncestor = await this.stores.blocks.getRejectedCheckpointByArchiveRoot(calldataCheckpoint.header.lastArchiveRoot);
1066
1068
  // Update the validation result if it has changed, so we can keep track of the first invalid checkpoint
1067
1069
  // in case there is a sequence of more than one invalid checkpoint, as we need to invalidate the first one.
1068
1070
  // There is an exception though: if a checkpoint is invalidated and replaced with another invalid checkpoint,
@@ -1076,9 +1078,9 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1076
1078
  rollupStatus.validationResult = validationResult;
1077
1079
  }
1078
1080
  if (!validationResult.valid) {
1079
- this.log.warn(`Skipping checkpoint ${published.checkpoint.number} due to invalid attestations`, {
1080
- checkpointHash: published.checkpoint.hash(),
1081
- l1BlockNumber: published.l1.blockNumber,
1081
+ this.log.warn(`Skipping checkpoint ${calldataCheckpoint.checkpointNumber} due to invalid attestations`, {
1082
+ checkpointNumber: calldataCheckpoint.checkpointNumber,
1083
+ l1BlockNumber: calldataCheckpoint.l1.blockNumber,
1082
1084
  ...pick(validationResult, 'reason')
1083
1085
  });
1084
1086
  // Emit event for invalid checkpoint detection
@@ -1090,22 +1092,27 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1090
1092
  // is detected and skipped (rather than tripping the addCheckpoints consecutive-number
1091
1093
  // check and causing the sync point to roll back in a loop).
1092
1094
  await this.stores.blocks.addRejectedCheckpoint({
1093
- checkpointNumber: published.checkpoint.number,
1094
- archiveRoot: published.checkpoint.archive.root,
1095
- parentArchiveRoot: published.checkpoint.header.lastArchiveRoot,
1096
- slotNumber: published.checkpoint.header.slotNumber,
1097
- l1: published.l1,
1095
+ checkpointNumber: calldataCheckpoint.checkpointNumber,
1096
+ archiveRoot: calldataCheckpoint.archiveRoot,
1097
+ parentArchiveRoot: calldataCheckpoint.header.lastArchiveRoot,
1098
+ slotNumber: calldataCheckpoint.header.slotNumber,
1099
+ l1: calldataCheckpoint.l1,
1098
1100
  reason: 'invalid-attestations'
1099
1101
  });
1100
1102
  continue;
1101
1103
  }
1102
1104
  if (rejectedAncestor) {
1103
- const descendantInfo = published.checkpoint.toCheckpointInfo();
1104
- this.log.warn(`Skipping checkpoint ${published.checkpoint.number} as it is a descendant of ` + `rejected checkpoint ${rejectedAncestor.checkpointNumber} (${rejectedAncestor.reason})`, {
1105
- checkpointNumber: published.checkpoint.number,
1106
- checkpointHash: published.checkpoint.hash(),
1107
- l1BlockNumber: published.l1.blockNumber,
1108
- l1BlockHash: published.l1.blockHash,
1105
+ const descendantInfo = {
1106
+ archive: calldataCheckpoint.archiveRoot,
1107
+ lastArchive: calldataCheckpoint.header.lastArchiveRoot,
1108
+ slotNumber: calldataCheckpoint.header.slotNumber,
1109
+ checkpointNumber: calldataCheckpoint.checkpointNumber,
1110
+ timestamp: calldataCheckpoint.header.timestamp
1111
+ };
1112
+ this.log.warn(`Skipping checkpoint ${calldataCheckpoint.checkpointNumber} as it is a descendant of ` + `rejected checkpoint ${rejectedAncestor.checkpointNumber} (${rejectedAncestor.reason})`, {
1113
+ checkpointNumber: calldataCheckpoint.checkpointNumber,
1114
+ l1BlockNumber: calldataCheckpoint.l1.blockNumber,
1115
+ l1BlockHash: calldataCheckpoint.l1.blockHash,
1109
1116
  ancestorCheckpointNumber: rejectedAncestor.checkpointNumber,
1110
1117
  ancestorArchiveRoot: rejectedAncestor.archiveRoot.toString(),
1111
1118
  ancestorReason: rejectedAncestor.reason
@@ -1119,15 +1126,38 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1119
1126
  // Persist this chainpoint as rejected as well, so we can construct a chain of
1120
1127
  // skipped checkpoints starting from the first one with invalid attestations.
1121
1128
  await this.stores.blocks.addRejectedCheckpoint({
1122
- checkpointNumber: published.checkpoint.number,
1123
- archiveRoot: published.checkpoint.archive.root,
1124
- parentArchiveRoot: published.checkpoint.header.lastArchiveRoot,
1125
- slotNumber: published.checkpoint.header.slotNumber,
1126
- l1: published.l1,
1129
+ checkpointNumber: calldataCheckpoint.checkpointNumber,
1130
+ archiveRoot: calldataCheckpoint.archiveRoot,
1131
+ parentArchiveRoot: calldataCheckpoint.header.lastArchiveRoot,
1132
+ slotNumber: calldataCheckpoint.header.slotNumber,
1133
+ l1: calldataCheckpoint.l1,
1127
1134
  reason: 'descends-from-invalid-attestations'
1128
1135
  });
1129
1136
  continue;
1130
1137
  }
1138
+ checkpointsToIngest.push(calldataCheckpoint);
1139
+ }
1140
+ // Fetch blobs in parallel only for the surviving (attestation-valid, non-descendant) checkpoints,
1141
+ // then build the full published checkpoints. The last calldata checkpoint may be promotable from a
1142
+ // local proposed block (checkpointToPromote), in which case it carries no blob to fetch. A missing or
1143
+ // undecodable blob throws and propagates, rolling back the L1 sync point so the fetch is retried.
1144
+ const toFetchBlobs = checkpointToPromote ? checkpointsToIngest.filter((c)=>c.checkpointNumber !== checkpointToPromote.checkpoint.number) : checkpointsToIngest;
1145
+ const blobFetched = await asyncPool(10, toFetchBlobs, async (checkpoint)=>retrievedToPublishedCheckpoint({
1146
+ ...checkpoint,
1147
+ checkpointBlobData: await getCheckpointBlobDataFromBlobs(this.blobClient, checkpoint.l1.blockHash, checkpoint.blobHashes, checkpoint.checkpointNumber, this.log, !initialSyncComplete, checkpoint.parentBeaconBlockRoot, checkpoint.l1.timestamp)
1148
+ }));
1149
+ // Index the built checkpoints by number so we can ingest them in calldata order, slotting in the
1150
+ // promoted checkpoint (built from a local proposed block rather than blobs).
1151
+ const publishedByNumber = new Map(blobFetched.map((published)=>[
1152
+ published.checkpoint.number,
1153
+ published
1154
+ ]));
1155
+ if (checkpointToPromote) {
1156
+ publishedByNumber.set(checkpointToPromote.checkpoint.number, checkpointToPromote);
1157
+ }
1158
+ const validCheckpoints = [];
1159
+ for (const calldataCheckpoint of checkpointsToIngest){
1160
+ const published = publishedByNumber.get(calldataCheckpoint.checkpointNumber);
1131
1161
  // Check the inHash of the checkpoint against the l1->l2 messages.
1132
1162
  // The messages should've been synced up to the currentL1BlockNumber and must be available for the published
1133
1163
  // checkpoints we just retrieved.
@@ -1172,6 +1202,10 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1172
1202
  if (validCheckpoints.length > 0) {
1173
1203
  this.instrumentation.processNewCheckpointedBlocks(processDuration / validCheckpoints.length, validCheckpoints.flatMap((c)=>c.checkpoint.blocks));
1174
1204
  }
1205
+ // Record blocks newly fetched from L1 checkpoint payloads as added. The promoted checkpoint (if any) is
1206
+ // excluded: its blocks were already in local archiver storage (added via the proposed-block path) so the
1207
+ // block stream does not need them re-downloaded.
1208
+ blocksAdded.push(...checkpointsToAdd.flatMap((c)=>c.checkpoint.blocks));
1175
1209
  // If blocks were pruned due to conflict with L1 checkpoints, emit event
1176
1210
  if (result.prunedBlocks && result.prunedBlocks.length > 0) {
1177
1211
  const prunedCheckpointNumber = result.prunedBlocks[0].checkpointNumber;
@@ -1181,6 +1215,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1181
1215
  prunedSlotNumber,
1182
1216
  prunedCheckpointNumber
1183
1217
  });
1218
+ this.instrumentation.recordPrune('l1_conflict');
1184
1219
  // Emit event for listening services to react to the prune.
1185
1220
  // Note: slotNumber comes from the first pruned block. If pruned blocks theoretically spanned multiple slots,
1186
1221
  // only one slot number would be reported (though in practice all blocks in a checkpoint span a single slot).
@@ -1220,7 +1255,9 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1220
1255
  });
1221
1256
  }
1222
1257
  lastRetrievedCheckpoint = validCheckpoints.at(-1) ?? lastRetrievedCheckpoint;
1223
- lastSeenCheckpoint = publishedCheckpoints.at(-1) ?? lastSeenCheckpoint;
1258
+ // The last checkpoint seen on L1 this batch (valid or rejected), tracked from calldata since
1259
+ // rejected checkpoints are no longer built into PublishedCheckpoints.
1260
+ lastSeenCheckpoint = lastCalldataCheckpoint;
1224
1261
  }while (searchEndBlock < currentL1BlockNumber)
1225
1262
  // Important that we update AFTER inserting the blocks.
1226
1263
  await updateProvenCheckpoint();
@@ -1310,7 +1347,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
1310
1347
  const { lastSeenCheckpoint, pendingCheckpointNumber } = status;
1311
1348
  // Compare the last checkpoint (valid or not) we have (either retrieved in this round or loaded from store)
1312
1349
  // with what the rollup contract told us was the latest one (pinned at the currentL1BlockNumber).
1313
- const latestLocalCheckpointNumber = lastSeenCheckpoint?.checkpoint.number ?? CheckpointNumber.max(await this.stores.blocks.getLatestCheckpointNumber(), await this.stores.blocks.getLatestRejectedCheckpointNumber()) ?? CheckpointNumber.ZERO;
1350
+ const latestLocalCheckpointNumber = lastSeenCheckpoint?.checkpointNumber ?? CheckpointNumber.max(await this.stores.blocks.getLatestCheckpointNumber(), await this.stores.blocks.getLatestRejectedCheckpointNumber()) ?? CheckpointNumber.ZERO;
1314
1351
  if (latestLocalCheckpointNumber < pendingCheckpointNumber) {
1315
1352
  // Here we have consumed all logs until the `currentL1Block` we pinned at the beginning of the archiver loop,
1316
1353
  // but still haven't reached the pending checkpoint according to the call to the rollup contract.
@@ -1,18 +1,40 @@
1
1
  import type { EpochCache } from '@aztec/epoch-cache';
2
+ import type { ViemCommitteeAttestations } from '@aztec/ethereum/contracts';
3
+ import { type CheckpointNumber } from '@aztec/foundation/branded-types';
4
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
5
  import type { Logger } from '@aztec/foundation/log';
3
- import { type AttestationInfo, type ValidateCheckpointResult } from '@aztec/stdlib/block';
4
- import type { PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
6
+ import { type AttestationInfo, type CommitteeAttestation, type ValidateCheckpointResult } from '@aztec/stdlib/block';
7
+ import type { CheckpointInfo, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
5
8
  import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
6
- import { type CoordinationSignatureContext } from '@aztec/stdlib/p2p';
9
+ import { ConsensusPayload, type CoordinationSignatureContext } from '@aztec/stdlib/p2p';
10
+ import type { CheckpointHeader } from '@aztec/stdlib/rollup';
7
11
  export type { ValidateCheckpointResult };
8
12
  /**
9
13
  * Extracts attestation information from a published checkpoint.
10
14
  * Returns info for each attestation, preserving array indices.
11
15
  */
12
16
  export declare function getAttestationInfoFromPublishedCheckpoint({ checkpoint, attestations }: PublishedCheckpoint, signatureContext: CoordinationSignatureContext): AttestationInfo[];
17
+ /** The subset of a calldata-only checkpoint needed to validate its committee attestations. */
18
+ export type CalldataCheckpointForAttestations = {
19
+ checkpointNumber: CheckpointNumber;
20
+ archiveRoot: Fr;
21
+ feeAssetPriceModifier: bigint;
22
+ header: CheckpointHeader;
23
+ attestations: CommitteeAttestation[];
24
+ /** The exact packed attestations tuple from L1 calldata, carried verbatim for byte-faithful invalidation. */
25
+ verbatimAttestations: ViemCommitteeAttestations;
26
+ };
13
27
  /**
14
- * Validates the attestations submitted for the given checkpoint.
15
- * Returns true if the attestations are valid and sufficient, false otherwise.
28
+ * Validates the attestations of a checkpoint from L1 calldata only, without fetching or decoding its blobs.
29
+ * The signed consensus payload (header, archive root, fee asset price modifier) is fully available from
30
+ * calldata, so an invalid-attestation checkpoint can be rejected before any (possibly malformed) blob is
31
+ * fetched and decoded.
16
32
  */
17
- export declare function validateCheckpointAttestations(publishedCheckpoint: PublishedCheckpoint, epochCache: EpochCache, constants: Pick<L1RollupConstants, 'epochDuration'>, signatureContext: CoordinationSignatureContext, logger?: Logger): Promise<ValidateCheckpointResult>;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZXMvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdyRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxlQUFlLEVBRXBCLEtBQUssd0JBQXdCLEVBRTlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBaUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRyxPQUFPLEVBQW9CLEtBQUssNEJBQTRCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4RixZQUFZLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztBQUV6Qzs7O0dBR0c7QUFDSCx3QkFBZ0IseUNBQXlDLENBQ3ZELEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxFQUFFLG1CQUFtQixFQUNqRCxnQkFBZ0IsRUFBRSw0QkFBNEIsR0FDN0MsZUFBZSxFQUFFLENBR25CO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQXNCLDhCQUE4QixDQUNsRCxtQkFBbUIsRUFBRSxtQkFBbUIsRUFDeEMsVUFBVSxFQUFFLFVBQVUsRUFDdEIsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsRUFDbkQsZ0JBQWdCLEVBQUUsNEJBQTRCLEVBQzlDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0EyRm5DIn0=
33
+ export declare function validateCheckpointAttestationsFromCalldata(checkpoint: CalldataCheckpointForAttestations, epochCache: EpochCache, constants: Pick<L1RollupConstants, 'epochDuration'>, signatureContext: CoordinationSignatureContext, logger?: Logger): Promise<ValidateCheckpointResult>;
34
+ /**
35
+ * Core attestation validation over a consensus payload, its attestations, and checkpoint metadata --
36
+ * independent of whether the checkpoint's blocks have been decoded from blobs. Returns true if the
37
+ * attestations are valid and sufficient, false otherwise.
38
+ */
39
+ export declare function validateAttestations(payload: ConsensusPayload, attestations: CommitteeAttestation[], verbatimAttestations: ViemCommitteeAttestations, checkpointInfo: CheckpointInfo, epochCache: EpochCache, constants: Pick<L1RollupConstants, 'epochDuration'>, logger?: Logger): Promise<ValidateCheckpointResult>;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZXMvdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFckYsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUNMLEtBQUssZUFBZSxFQUNwQixLQUFLLG9CQUFvQixFQUV6QixLQUFLLHdCQUF3QixFQUU5QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFpQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLDRCQUE0QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEYsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztBQUV6Qzs7O0dBR0c7QUFDSCx3QkFBZ0IseUNBQXlDLENBQ3ZELEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxFQUFFLG1CQUFtQixFQUNqRCxnQkFBZ0IsRUFBRSw0QkFBNEIsR0FDN0MsZUFBZSxFQUFFLENBR25CO0FBRUQsOEZBQThGO0FBQzlGLE1BQU0sTUFBTSxpQ0FBaUMsR0FBRztJQUM5QyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztJQUNuQyxXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ2hCLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixNQUFNLEVBQUUsZ0JBQWdCLENBQUM7SUFDekIsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUM7SUFDckMsNkdBQTZHO0lBQzdHLG9CQUFvQixFQUFFLHlCQUF5QixDQUFDO0NBQ2pELENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILHdCQUFnQiwwQ0FBMEMsQ0FDeEQsVUFBVSxFQUFFLGlDQUFpQyxFQUM3QyxVQUFVLEVBQUUsVUFBVSxFQUN0QixTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxFQUNuRCxnQkFBZ0IsRUFBRSw0QkFBNEIsRUFDOUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUNkLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQXVCbkM7QUFFRDs7OztHQUlHO0FBQ0gsd0JBQXNCLG9CQUFvQixDQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQ3pCLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxFQUNwQyxvQkFBb0IsRUFBRSx5QkFBeUIsRUFDL0MsY0FBYyxFQUFFLGNBQWMsRUFDOUIsVUFBVSxFQUFFLFVBQVUsRUFDdEIsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsRUFDbkQsTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUNkLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQTRGbkMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/modules/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,wBAAwB,EAE9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,KAAK,iBAAiB,EAAiC,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAoB,KAAK,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAExF,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,mBAAmB,EACjD,gBAAgB,EAAE,4BAA4B,GAC7C,eAAe,EAAE,CAGnB;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EACnD,gBAAgB,EAAE,4BAA4B,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CA2FnC"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/modules/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,iCAAiC,CAAC;AAErF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAEzB,KAAK,wBAAwB,EAE9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,KAAK,iBAAiB,EAAiC,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,gBAAgB,EAAE,KAAK,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,mBAAmB,EACjD,gBAAgB,EAAE,4BAA4B,GAC7C,eAAe,EAAE,CAGnB;AAED,8FAA8F;AAC9F,MAAM,MAAM,iCAAiC,GAAG;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,EAAE,CAAC;IAChB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,6GAA6G;IAC7G,oBAAoB,EAAE,yBAAyB,CAAC;CACjD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,0CAA0C,CACxD,UAAU,EAAE,iCAAiC,EAC7C,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EACnD,gBAAgB,EAAE,4BAA4B,EAC9C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CAuBnC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,oBAAoB,EAAE,EACpC,oBAAoB,EAAE,yBAAyB,EAC/C,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EACnD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CA4FnC"}