@aztec/archiver 0.0.1-commit.b655e406 → 0.0.1-commit.b8a057fa

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 (241) hide show
  1. package/README.md +164 -22
  2. package/dest/archiver.d.ts +194 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +949 -0
  5. package/dest/config.d.ts +34 -0
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/config.js +95 -0
  8. package/dest/errors.d.ts +87 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +129 -0
  11. package/dest/factory.d.ts +16 -10
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +120 -22
  14. package/dest/index.d.ts +19 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +17 -3
  17. package/dest/interfaces.d.ts +9 -0
  18. package/dest/interfaces.d.ts.map +1 -0
  19. package/dest/interfaces.js +3 -0
  20. package/dest/l1/bin/retrieve-calldata.d.ts +3 -0
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/l1/bin/retrieve-calldata.js +152 -0
  23. package/dest/l1/calldata_retriever.d.ts +143 -0
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/calldata_retriever.js +413 -0
  26. package/dest/l1/data_retrieval.d.ts +102 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/l1/data_retrieval.js +307 -0
  29. package/dest/l1/debug_tx.d.ts +19 -0
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/l1/debug_tx.js +73 -0
  32. package/dest/l1/spire_proposer.d.ts +70 -0
  33. package/dest/l1/spire_proposer.d.ts.map +1 -0
  34. package/dest/l1/spire_proposer.js +149 -0
  35. package/dest/l1/trace_tx.d.ts +43 -0
  36. package/dest/l1/trace_tx.d.ts.map +1 -0
  37. package/dest/l1/trace_tx.js +91 -0
  38. package/dest/l1/types.d.ts +12 -0
  39. package/dest/l1/types.d.ts.map +1 -0
  40. package/dest/l1/types.js +3 -0
  41. package/dest/l1/validate_historical_logs.d.ts +23 -0
  42. package/dest/l1/validate_historical_logs.d.ts.map +1 -0
  43. package/dest/l1/validate_historical_logs.js +108 -0
  44. package/dest/l1/validate_trace.d.ts +32 -0
  45. package/dest/l1/validate_trace.d.ts.map +1 -0
  46. package/dest/l1/validate_trace.js +154 -0
  47. package/dest/modules/contract_data_source_adapter.d.ts +25 -0
  48. package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
  49. package/dest/modules/contract_data_source_adapter.js +32 -0
  50. package/dest/modules/data_source_base.d.ts +112 -0
  51. package/dest/modules/data_source_base.d.ts.map +1 -0
  52. package/dest/modules/data_source_base.js +322 -0
  53. package/dest/modules/data_store_updater.d.ts +105 -0
  54. package/dest/modules/data_store_updater.d.ts.map +1 -0
  55. package/dest/modules/data_store_updater.js +393 -0
  56. package/dest/modules/instrumentation.d.ts +63 -0
  57. package/dest/modules/instrumentation.d.ts.map +1 -0
  58. package/dest/modules/instrumentation.js +166 -0
  59. package/dest/modules/l1_synchronizer.d.ts +77 -0
  60. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  61. package/dest/modules/l1_synchronizer.js +1381 -0
  62. package/dest/modules/outbox_trees_resolver.d.ts +62 -0
  63. package/dest/modules/outbox_trees_resolver.d.ts.map +1 -0
  64. package/dest/modules/outbox_trees_resolver.js +162 -0
  65. package/dest/modules/validation.d.ts +40 -0
  66. package/dest/modules/validation.d.ts.map +1 -0
  67. package/dest/modules/validation.js +122 -0
  68. package/dest/store/block_store.d.ts +303 -0
  69. package/dest/store/block_store.d.ts.map +1 -0
  70. package/dest/store/block_store.js +1206 -0
  71. package/dest/store/contract_class_store.d.ts +31 -0
  72. package/dest/store/contract_class_store.d.ts.map +1 -0
  73. package/dest/store/contract_class_store.js +98 -0
  74. package/dest/store/contract_instance_store.d.ts +51 -0
  75. package/dest/store/contract_instance_store.d.ts.map +1 -0
  76. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +55 -3
  77. package/dest/store/data_stores.d.ts +68 -0
  78. package/dest/store/data_stores.d.ts.map +1 -0
  79. package/dest/store/data_stores.js +54 -0
  80. package/dest/store/function_names_cache.d.ts +17 -0
  81. package/dest/store/function_names_cache.d.ts.map +1 -0
  82. package/dest/store/function_names_cache.js +30 -0
  83. package/dest/store/l2_tips_cache.d.ts +25 -0
  84. package/dest/store/l2_tips_cache.d.ts.map +1 -0
  85. package/dest/store/l2_tips_cache.js +26 -0
  86. package/dest/store/log_store.d.ts +59 -0
  87. package/dest/store/log_store.d.ts.map +1 -0
  88. package/dest/store/log_store.js +310 -0
  89. package/dest/store/log_store_codec.d.ts +78 -0
  90. package/dest/store/log_store_codec.d.ts.map +1 -0
  91. package/dest/store/log_store_codec.js +110 -0
  92. package/dest/store/message_store.d.ts +50 -0
  93. package/dest/store/message_store.d.ts.map +1 -0
  94. package/dest/{archiver/kv_archiver_store → store}/message_store.js +66 -23
  95. package/dest/structs/data_retrieval.d.ts +27 -0
  96. package/dest/structs/data_retrieval.d.ts.map +1 -0
  97. package/dest/structs/inbox_message.d.ts +15 -0
  98. package/dest/structs/inbox_message.d.ts.map +1 -0
  99. package/dest/{archiver/structs → structs}/inbox_message.js +6 -5
  100. package/dest/structs/published.d.ts +2 -0
  101. package/dest/structs/published.d.ts.map +1 -0
  102. package/dest/test/fake_l1_state.d.ts +214 -0
  103. package/dest/test/fake_l1_state.d.ts.map +1 -0
  104. package/dest/test/fake_l1_state.js +517 -0
  105. package/dest/test/index.d.ts +2 -1
  106. package/dest/test/index.d.ts.map +1 -1
  107. package/dest/test/index.js +4 -1
  108. package/dest/test/mock_archiver.d.ts +16 -8
  109. package/dest/test/mock_archiver.d.ts.map +1 -1
  110. package/dest/test/mock_archiver.js +19 -14
  111. package/dest/test/mock_l1_to_l2_message_source.d.ts +7 -6
  112. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  113. package/dest/test/mock_l1_to_l2_message_source.js +21 -11
  114. package/dest/test/mock_l2_block_source.d.ts +73 -40
  115. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  116. package/dest/test/mock_l2_block_source.js +348 -133
  117. package/dest/test/mock_structs.d.ts +83 -4
  118. package/dest/test/mock_structs.d.ts.map +1 -1
  119. package/dest/test/mock_structs.js +157 -11
  120. package/dest/test/noop_l1_archiver.d.ts +34 -0
  121. package/dest/test/noop_l1_archiver.d.ts.map +1 -0
  122. package/dest/test/noop_l1_archiver.js +88 -0
  123. package/package.json +20 -20
  124. package/src/archiver.ts +785 -0
  125. package/src/config.ts +125 -0
  126. package/src/errors.ts +203 -0
  127. package/src/factory.ts +186 -22
  128. package/src/index.ts +27 -3
  129. package/src/interfaces.ts +9 -0
  130. package/src/l1/README.md +55 -0
  131. package/src/l1/bin/retrieve-calldata.ts +194 -0
  132. package/src/l1/calldata_retriever.ts +529 -0
  133. package/src/l1/data_retrieval.ts +491 -0
  134. package/src/l1/debug_tx.ts +99 -0
  135. package/src/l1/spire_proposer.ts +152 -0
  136. package/src/l1/trace_tx.ts +128 -0
  137. package/src/l1/types.ts +13 -0
  138. package/src/l1/validate_historical_logs.ts +140 -0
  139. package/src/l1/validate_trace.ts +229 -0
  140. package/src/modules/contract_data_source_adapter.ts +46 -0
  141. package/src/modules/data_source_base.ts +466 -0
  142. package/src/modules/data_store_updater.ts +519 -0
  143. package/src/modules/instrumentation.ts +217 -0
  144. package/src/modules/l1_synchronizer.ts +1320 -0
  145. package/src/modules/outbox_trees_resolver.ts +199 -0
  146. package/src/modules/validation.ts +186 -0
  147. package/src/store/block_store.ts +1551 -0
  148. package/src/store/contract_class_store.ts +126 -0
  149. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +70 -7
  150. package/src/store/data_stores.ts +104 -0
  151. package/src/store/function_names_cache.ts +37 -0
  152. package/src/store/l2_tips_cache.ts +35 -0
  153. package/src/store/log_store.ts +380 -0
  154. package/src/store/log_store_codec.ts +143 -0
  155. package/src/{archiver/kv_archiver_store → store}/message_store.ts +81 -28
  156. package/src/{archiver/structs → structs}/inbox_message.ts +7 -7
  157. package/src/structs/published.ts +1 -0
  158. package/src/test/fake_l1_state.ts +770 -0
  159. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  160. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  161. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  162. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  163. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  164. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  165. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  166. package/src/test/index.ts +4 -0
  167. package/src/test/mock_archiver.ts +23 -16
  168. package/src/test/mock_l1_to_l2_message_source.ts +18 -11
  169. package/src/test/mock_l2_block_source.ts +419 -147
  170. package/src/test/mock_structs.ts +292 -13
  171. package/src/test/noop_l1_archiver.ts +158 -0
  172. package/dest/archiver/archiver.d.ts +0 -277
  173. package/dest/archiver/archiver.d.ts.map +0 -1
  174. package/dest/archiver/archiver.js +0 -1322
  175. package/dest/archiver/archiver_store.d.ts +0 -255
  176. package/dest/archiver/archiver_store.d.ts.map +0 -1
  177. package/dest/archiver/archiver_store.js +0 -4
  178. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  179. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  180. package/dest/archiver/archiver_store_test_suite.js +0 -1288
  181. package/dest/archiver/config.d.ts +0 -21
  182. package/dest/archiver/config.d.ts.map +0 -1
  183. package/dest/archiver/config.js +0 -50
  184. package/dest/archiver/data_retrieval.d.ts +0 -79
  185. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  186. package/dest/archiver/data_retrieval.js +0 -362
  187. package/dest/archiver/errors.d.ts +0 -12
  188. package/dest/archiver/errors.d.ts.map +0 -1
  189. package/dest/archiver/errors.js +0 -17
  190. package/dest/archiver/index.d.ts +0 -7
  191. package/dest/archiver/index.d.ts.map +0 -1
  192. package/dest/archiver/index.js +0 -4
  193. package/dest/archiver/instrumentation.d.ts +0 -35
  194. package/dest/archiver/instrumentation.d.ts.map +0 -1
  195. package/dest/archiver/instrumentation.js +0 -140
  196. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -124
  197. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  198. package/dest/archiver/kv_archiver_store/block_store.js +0 -370
  199. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  200. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  201. package/dest/archiver/kv_archiver_store/contract_class_store.js +0 -120
  202. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  203. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  204. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -168
  205. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  206. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -296
  207. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -49
  208. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  209. package/dest/archiver/kv_archiver_store/log_store.js +0 -336
  210. package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -39
  211. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  212. package/dest/archiver/structs/data_retrieval.d.ts +0 -27
  213. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  214. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  215. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  216. package/dest/archiver/structs/published.d.ts +0 -2
  217. package/dest/archiver/structs/published.d.ts.map +0 -1
  218. package/dest/archiver/validation.d.ts +0 -11
  219. package/dest/archiver/validation.d.ts.map +0 -1
  220. package/dest/archiver/validation.js +0 -90
  221. package/dest/rpc/index.d.ts +0 -9
  222. package/dest/rpc/index.d.ts.map +0 -1
  223. package/dest/rpc/index.js +0 -15
  224. package/src/archiver/archiver.ts +0 -1722
  225. package/src/archiver/archiver_store.ts +0 -305
  226. package/src/archiver/archiver_store_test_suite.ts +0 -1263
  227. package/src/archiver/config.ts +0 -74
  228. package/src/archiver/data_retrieval.ts +0 -545
  229. package/src/archiver/errors.ts +0 -26
  230. package/src/archiver/index.ts +0 -6
  231. package/src/archiver/instrumentation.ts +0 -187
  232. package/src/archiver/kv_archiver_store/block_store.ts +0 -481
  233. package/src/archiver/kv_archiver_store/contract_class_store.ts +0 -176
  234. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -422
  235. package/src/archiver/kv_archiver_store/log_store.ts +0 -406
  236. package/src/archiver/structs/published.ts +0 -1
  237. package/src/archiver/validation.ts +0 -99
  238. package/src/rpc/index.ts +0 -16
  239. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  240. /package/dest/{archiver/structs → structs}/published.js +0 -0
  241. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
@@ -0,0 +1,217 @@
1
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import type { L2Block } from '@aztec/stdlib/block';
4
+ import type { CheckpointData } from '@aztec/stdlib/checkpoint';
5
+ import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
6
+ import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
7
+ import {
8
+ Attributes,
9
+ type Gauge,
10
+ type Histogram,
11
+ LmdbMetrics,
12
+ type LmdbStatsCallback,
13
+ Metrics,
14
+ type TelemetryClient,
15
+ type Tracer,
16
+ type UpDownCounter,
17
+ createUpDownCounterWithDefault,
18
+ } from '@aztec/telemetry-client';
19
+
20
+ export class ArchiverInstrumentation {
21
+ public readonly tracer: Tracer;
22
+
23
+ private blockHeight: Gauge;
24
+ private checkpointHeight: Gauge;
25
+ private txCount: UpDownCounter;
26
+ private l1BlockHeight: Gauge;
27
+ private proofsSubmittedDelay: Histogram;
28
+ private proofsSubmittedCount: UpDownCounter;
29
+ private dbMetrics: LmdbMetrics;
30
+
31
+ private pruneDuration: Histogram;
32
+ private pruneCount: UpDownCounter;
33
+
34
+ private syncDurationPerBlock: Histogram;
35
+ private syncDurationPerCheckpoint: Histogram;
36
+ private syncBlockCount: UpDownCounter;
37
+ private manaPerBlock: Histogram;
38
+ private txsPerBlock: Histogram;
39
+
40
+ private syncDurationPerMessage: Histogram;
41
+ private syncMessageCount: UpDownCounter;
42
+
43
+ private blockProposalTxTargetCount: UpDownCounter;
44
+
45
+ private checkpointL1InclusionDelay: Histogram;
46
+ private checkpointPromotedCount: UpDownCounter;
47
+
48
+ private log = createLogger('archiver:instrumentation');
49
+
50
+ private constructor(
51
+ private telemetry: TelemetryClient,
52
+ lmdbStats?: LmdbStatsCallback,
53
+ ) {
54
+ this.tracer = telemetry.getTracer('Archiver');
55
+ const meter = telemetry.getMeter('Archiver');
56
+
57
+ this.blockHeight = meter.createGauge(Metrics.ARCHIVER_BLOCK_HEIGHT);
58
+
59
+ this.checkpointHeight = meter.createGauge(Metrics.ARCHIVER_CHECKPOINT_HEIGHT);
60
+
61
+ this.l1BlockHeight = meter.createGauge(Metrics.ARCHIVER_L1_BLOCK_HEIGHT);
62
+
63
+ this.txCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_TOTAL_TXS);
64
+
65
+ this.proofsSubmittedCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_ROLLUP_PROOF_COUNT, {
66
+ [Attributes.PROOF_TIMED_OUT]: [true, false],
67
+ });
68
+
69
+ this.proofsSubmittedDelay = meter.createHistogram(Metrics.ARCHIVER_ROLLUP_PROOF_DELAY);
70
+
71
+ this.syncDurationPerBlock = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_BLOCK);
72
+
73
+ this.syncDurationPerCheckpoint = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_CHECKPOINT);
74
+
75
+ this.syncBlockCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_BLOCK_COUNT);
76
+
77
+ this.manaPerBlock = meter.createHistogram(Metrics.ARCHIVER_MANA_PER_BLOCK);
78
+
79
+ this.txsPerBlock = meter.createHistogram(Metrics.ARCHIVER_TXS_PER_BLOCK);
80
+
81
+ this.syncDurationPerMessage = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_MESSAGE);
82
+
83
+ this.syncMessageCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_MESSAGE_COUNT);
84
+
85
+ this.pruneDuration = meter.createHistogram(Metrics.ARCHIVER_PRUNE_DURATION);
86
+
87
+ this.pruneCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_PRUNE_COUNT, {
88
+ [Attributes.PRUNE_TYPE]: ['unproven', 'uncheckpointed', 'l1_conflict', 'orphan', 'l1_mismatch'],
89
+ });
90
+
91
+ this.blockProposalTxTargetCount = createUpDownCounterWithDefault(
92
+ meter,
93
+ Metrics.ARCHIVER_BLOCK_PROPOSAL_TX_TARGET_COUNT,
94
+ {
95
+ [Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: [true, false],
96
+ },
97
+ );
98
+
99
+ this.checkpointL1InclusionDelay = meter.createHistogram(Metrics.ARCHIVER_CHECKPOINT_L1_INCLUSION_DELAY);
100
+
101
+ this.checkpointPromotedCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_CHECKPOINT_PROMOTED_COUNT);
102
+
103
+ this.dbMetrics = new LmdbMetrics(
104
+ meter,
105
+ {
106
+ [Attributes.DB_DATA_TYPE]: 'archiver',
107
+ },
108
+ lmdbStats,
109
+ );
110
+ }
111
+
112
+ public static async new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback) {
113
+ const instance = new ArchiverInstrumentation(telemetry, lmdbStats);
114
+
115
+ await instance.telemetry.flush();
116
+
117
+ return instance;
118
+ }
119
+
120
+ public isEnabled(): boolean {
121
+ return this.telemetry.isEnabled();
122
+ }
123
+
124
+ public processNewProposedBlock(syncTimePerBlock: number, block: L2Block) {
125
+ const attrs = { [Attributes.STATUS]: 'proposed' };
126
+ this.blockHeight.record(block.number, attrs);
127
+ this.syncDurationPerBlock.record(Math.ceil(syncTimePerBlock));
128
+
129
+ // Per block metrics
130
+ this.txCount.add(block.body.txEffects.length);
131
+ this.txsPerBlock.record(block.body.txEffects.length);
132
+ this.manaPerBlock.record(block.header.totalManaUsed.toNumber() / 1e6);
133
+ }
134
+
135
+ public processNewCheckpointedBlocks(syncTimePerCheckpoint: number, blocks: L2Block[]) {
136
+ if (blocks.length === 0) {
137
+ return;
138
+ }
139
+
140
+ this.syncDurationPerCheckpoint.record(Math.ceil(syncTimePerCheckpoint));
141
+ this.blockHeight.record(Math.max(...blocks.map(b => b.number)), { [Attributes.STATUS]: 'checkpointed' });
142
+ this.checkpointHeight.record(Math.max(...blocks.map(b => b.checkpointNumber)));
143
+ this.syncBlockCount.add(blocks.length);
144
+ }
145
+
146
+ public processNewMessages(count: number, syncPerMessageMs: number) {
147
+ if (count === 0) {
148
+ return;
149
+ }
150
+ this.syncMessageCount.add(count);
151
+ this.syncDurationPerMessage.record(Math.ceil(syncPerMessageMs));
152
+ }
153
+
154
+ public processPrune(duration: number) {
155
+ this.pruneCount.add(1, { [Attributes.PRUNE_TYPE]: 'unproven' });
156
+ this.pruneDuration.record(Math.ceil(duration));
157
+ }
158
+
159
+ /**
160
+ * Records a pending-chain reorg, where the archiver dropped proposed blocks (and world-state follows by pruning). The
161
+ * type distinguishes the cause: 'uncheckpointed' (slot ended without a checkpoint), 'l1_conflict' (proposed blocks
162
+ * conflicting with an L1 checkpoint), 'orphan' (no matching proposed checkpoint arrived before the deadline), or
163
+ * 'l1_mismatch' (the local checkpointed tip diverged from L1 — an L1 reorg or a pruned/missed-proof checkpoint — so
164
+ * already-checkpointed blocks were rewound).
165
+ */
166
+ public recordPrune(pruneType: 'uncheckpointed' | 'l1_conflict' | 'orphan' | 'l1_mismatch') {
167
+ this.pruneCount.add(1, { [Attributes.PRUNE_TYPE]: pruneType });
168
+ }
169
+
170
+ public updateLastProvenCheckpoint(checkpoint: CheckpointData) {
171
+ const lastBlockNumberInCheckpoint = checkpoint.startBlock + checkpoint.blockCount - 1;
172
+ this.blockHeight.record(lastBlockNumberInCheckpoint, { [Attributes.STATUS]: 'proven' });
173
+ this.checkpointHeight.record(checkpoint.checkpointNumber, { [Attributes.STATUS]: 'proven' });
174
+ }
175
+
176
+ public processProofsVerified(logs: { proverId: string; l2BlockNumber: bigint; delay: bigint }[]) {
177
+ for (const log of logs) {
178
+ this.log.debug('Recording proof verified event', log);
179
+ this.proofsSubmittedCount.add(1, {
180
+ [Attributes.ROLLUP_PROVER_ID]: log.proverId,
181
+ [Attributes.PROOF_TIMED_OUT]: log.delay > 20n * 60n * 1000n,
182
+ });
183
+ this.proofsSubmittedDelay.record(Math.ceil(Number(log.delay)), {
184
+ [Attributes.ROLLUP_PROVER_ID]: log.proverId,
185
+ });
186
+ }
187
+ }
188
+
189
+ public updateL1BlockHeight(blockNumber: bigint) {
190
+ this.l1BlockHeight.record(Number(blockNumber));
191
+ }
192
+
193
+ public recordBlockProposalTxTarget(target: string, usedTrace: boolean) {
194
+ this.blockProposalTxTargetCount.add(1, {
195
+ [Attributes.L1_BLOCK_PROPOSAL_TX_TARGET]: target.toLowerCase(),
196
+ [Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: usedTrace,
197
+ });
198
+ }
199
+
200
+ /** Records a checkpoint promoted from proposed (blob fetch skipped). */
201
+ public processCheckpointPromoted() {
202
+ this.checkpointPromotedCount.add(1);
203
+ }
204
+
205
+ /**
206
+ * Records L1 inclusion timing for a checkpoint observed on L1 (seconds into the L2 slot).
207
+ */
208
+ public processCheckpointL1Timing(data: {
209
+ slotNumber: SlotNumber;
210
+ l1Timestamp: bigint;
211
+ l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>;
212
+ }): void {
213
+ const slotStartTs = getTimestampForSlot(data.slotNumber, data.l1Constants);
214
+ const inclusionDelaySeconds = Number(data.l1Timestamp - slotStartTs);
215
+ this.checkpointL1InclusionDelay.record(inclusionDelaySeconds);
216
+ }
217
+ }