@aztec-labs/validator-client 6.0.0-rc.1 → 6.0.0-rc.2

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.
@@ -19,7 +19,7 @@ import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
19
19
  import { type InboxEndpointReader } from './checkpoint_endpoint_check.js';
20
20
  import type { ValidatorMetrics } from './metrics.js';
21
21
  import { type StreamingBlockCheckReason } from './streaming_inbox_checks.js';
22
- export type BlockProposalValidationFailureReason = 'invalid_signature' | 'invalid_proposal' | 'parent_block_not_found' | 'parent_block_wrong_slot' | StreamingBlockCheckReason | 'global_variables_mismatch' | 'block_number_already_exists' | 'txs_not_available' | 'duplicate_txs' | 'invalid_embedded_txs' | 'state_mismatch' | 'failed_txs' | 'initial_state_mismatch' | 'timeout' | 'block_proposal_beyond_checkpoint' | 'checkpoint_proposal_equivocation' | 'unknown_error';
22
+ export type BlockProposalValidationFailureReason = 'invalid_signature' | 'invalid_proposal' | 'parent_block_not_found' | 'parent_block_pruned_during_validation' | 'parent_block_wrong_slot' | StreamingBlockCheckReason | 'global_variables_mismatch' | 'block_number_already_exists' | 'txs_not_available' | 'duplicate_txs' | 'invalid_embedded_txs' | 'state_mismatch' | 'failed_txs' | 'initial_state_mismatch' | 'timeout' | 'block_proposal_beyond_checkpoint' | 'checkpoint_proposal_equivocation' | 'unknown_error';
23
23
  type ReexecuteTransactionsResult = {
24
24
  block: L2Block;
25
25
  failedTxs: FailedTx[];
@@ -38,7 +38,7 @@ export type BlockProposalValidationFailureResult = {
38
38
  reexecutionResult?: ReexecuteTransactionsResult;
39
39
  };
40
40
  export type BlockProposalValidationResult = BlockProposalValidationSuccessResult | BlockProposalValidationFailureResult;
41
- export type CheckpointProposalValidationFailureReason = 'invalid_signature' | 'invalid_fee_asset_price_modifier' | 'last_block_not_found' | 'block_fetch_error' | 'world_state_not_synced' | 'checkpoint_already_published' | 'last_block_archive_mismatch' | 'too_many_blocks_in_checkpoint' | 'initial_archive_mismatch' | 'checkpoint_header_mismatch' | 'archive_mismatch' | 'out_hash_mismatch' | 'inbox_prefix_unavailable' | 'inbox_prefix_mismatch' | 'inbox_endpoint_unavailable' | 'inbox_endpoint_mismatch' | 'checkpoint_validation_failed';
41
+ export type CheckpointProposalValidationFailureReason = 'invalid_signature' | 'invalid_fee_asset_price_modifier' | 'last_block_not_found' | 'last_block_pruned_during_validation' | 'block_fetch_error' | 'world_state_not_synced' | 'checkpoint_already_published' | 'last_block_archive_mismatch' | 'too_many_blocks_in_checkpoint' | 'initial_archive_mismatch' | 'last_archive_root_mismatch' | 'checkpoint_header_mismatch' | 'archive_mismatch' | 'out_hash_mismatch' | 'inbox_prefix_unavailable' | 'inbox_prefix_mismatch' | 'inbox_endpoint_unavailable' | 'inbox_endpoint_mismatch' | 'checkpoint_validation_failed';
42
42
  export type CheckpointProposalValidationSuccessResult = {
43
43
  isValid: true;
44
44
  checkpointNumber: CheckpointNumber;
@@ -91,8 +91,13 @@ export type BlockProposalObservers = {
91
91
  escapeHatchOpen: boolean;
92
92
  }) => void;
93
93
  };
94
- /** Block-proposal validation failures that constitute a slashable invalid-block offense. */
95
- export declare const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT: BlockProposalValidationFailureReason[];
94
+ /**
95
+ * Block-proposal validation failures classified by whether they constitute a slashable invalid-block offense.
96
+ * A `Record` over the whole reason union, not a plain array, so a newly added reason - in particular one that reaches
97
+ * `BlockProposalValidationFailureReason` through `StreamingBlockCheckReason` - fails to compile until it is classified
98
+ * here, the way {@link SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT} already does for checkpoints.
99
+ */
100
+ export declare const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT: Record<BlockProposalValidationFailureReason, boolean>;
96
101
  /** Checkpoint-proposal validation failures that constitute a slashable invalid-checkpoint offense. */
97
102
  export declare const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT: Record<CheckpointProposalValidationFailureReason, boolean>;
98
103
  /**
@@ -210,6 +215,8 @@ export declare class ProposalHandler {
210
215
  * are validated before processing.
211
216
  */
212
217
  handleBlockProposal(proposal: ValidatedBlockProposal, proposalSender: PeerId, shouldReexecute: boolean): Promise<BlockProposalValidationResult>;
218
+ private checkParentStillLocal;
219
+ private validateBlockProposalOnParent;
213
220
  private collectProposalTxs;
214
221
  private validateNewBlockInSlot;
215
222
  private awaitLocalSync;
@@ -260,8 +267,19 @@ export declare class ProposalHandler {
260
267
  */
261
268
  handleCheckpointProposal(proposal: ValidatedCheckpointProposalCore, proposalInfo: LogData): Promise<CheckpointProposalValidationResult>;
262
269
  private confirmInboxEndpoint;
263
- /** The endpoint gate's own ceiling, narrowed by a slot whose attestation window is nearly spent. */
270
+ private checkLastBlockStillLocal;
271
+ /**
272
+ * The endpoint gate's own ceiling, narrowed by a slot whose attestation window is nearly spent.
273
+ *
274
+ * The floor survives past the attestation deadline on purpose, and is bounded at
275
+ * {@link INBOX_ENDPOINT_CHECK_MIN_WINDOW_MS} for it: a late node still wants the content verdict for telemetry,
276
+ * and reaching one costs one bounded local L1 read. What the floor must not buy is a signature, which is why
277
+ * {@link getAttestationDeadline} is re-read at the signing boundary rather than here — a window is not a
278
+ * permission to attest.
279
+ */
264
280
  private getInboxEndpointWindowMs;
281
+ /** The consensus attestation deadline for a slot: the last moment an attestation for it may be signed. */
282
+ getAttestationDeadline(slot: SlotNumber): Date;
265
283
  /**
266
284
  * Validates a checkpoint proposal by building the full checkpoint and comparing it with the proposal.
267
285
  * @returns Validation result with isValid flag and reason if invalid.
@@ -276,4 +294,4 @@ export declare class ProposalHandler {
276
294
  private setProposedCheckpoint;
277
295
  }
278
296
  export {};
279
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVExRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixLQUFLLHNCQUFzQixFQUMzQixVQUFVLEVBQ1gsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzFELE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFFbkYsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFhLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFHLE9BQU8sS0FBSyxFQUFFLDRCQUE0QixFQUFzQixNQUFNLCtCQUErQixDQUFDO0FBUXRHLE9BQU8sS0FBSyxFQUNWLFdBQVcsRUFFWCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQWlDLE1BQU0sOEJBQThCLENBQUM7QUFDdkcsT0FBTyxLQUFLLEVBQ1YsYUFBYSxFQUViLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIs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
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVExRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixLQUFLLHNCQUFzQixFQUMzQixVQUFVLEVBQ1gsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzFELE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFFbkYsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFhLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFHLE9BQU8sS0FBSyxFQUFFLDRCQUE0QixFQUFzQixNQUFNLCtCQUErQixDQUFDO0FBUXRHLE9BQU8sS0FBSyxFQUNWLFdBQVcsRUFFWCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQWlDLE1BQU0sOEJBQThCLENBQUM7QUFDdkcsT0FBTyxLQUFLLEVBQ1YsYUFBYSxFQUViLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIs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
@@ -1 +1 @@
1
- {"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,UAAU,EACX,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAyB,MAAM,8BAA8B,CAAC;AAEnF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAa,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,KAAK,EAAE,4BAA4B,EAAsB,MAAM,+BAA+B,CAAC;AAQtG,OAAO,KAAK,EACV,WAAW,EAEX,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAiC,MAAM,8BAA8B,CAAC;AACvG,OAAO,KAAK,EACV,aAAa,EAEb,sBAAsB,EACtB,sBAAsB,EACtB,+BAA+B,EAChC,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAA0C,QAAQ,EAAE,EAAE,EAAU,MAAM,uBAAuB,CAAC;AAS1G,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAsB,MAAM,8BAA8B,CAAC;AAErG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,KAAK,yBAAyB,EAM/B,MAAM,6BAA6B,CAAC;AAErC,MAAM,MAAM,oCAAoC,GAC5C,mBAAmB,GACnB,kBAAkB,GAClB,wBAAwB,GAGxB,uCAAuC,GACvC,yBAAyB,GAEzB,yBAAyB,GACzB,2BAA2B,GAC3B,6BAA6B,GAC7B,mBAAmB,GACnB,eAAe,GACf,sBAAsB,GACtB,gBAAgB,GAChB,YAAY,GACZ,wBAAwB,GACxB,SAAS,GACT,kCAAkC,GAClC,kCAAkC,GAClC,eAAe,CAAC;AAEpB,KAAK,2BAA2B,GAAG;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,EAAE,IAAI,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,oCAAoC,CAAC;IAC7C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,oCAAoC,GAAG,oCAAoC,CAAC;AAExH,MAAM,MAAM,yCAAyC,GACjD,mBAAmB,GACnB,kCAAkC,GAClC,sBAAsB,GAGtB,qCAAqC,GACrC,mBAAmB,GACnB,wBAAwB,GACxB,8BAA8B,GAC9B,6BAA6B,GAC7B,+BAA+B,GAC/B,0BAA0B,GAE1B,4BAA4B,GAC5B,4BAA4B,GAC5B,kBAAkB,GAClB,mBAAmB,GAGnB,0BAA0B,GAC1B,uBAAuB,GAGvB,4BAA4B,GAC5B,yBAAyB,GACzB,8BAA8B,CAAC;AA6EnC,MAAM,MAAM,yCAAyC,GAAG;IACtD,OAAO,EAAE,IAAI,CAAC;IACd,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yCAAyC,GAAG;IACtD,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,yCAAyC,CAAC;IAClD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAC1C,yCAAyC,GACzC,yCAAyC,CAAC;AAE9C,MAAM,MAAM,2CAA2C,GAAG,CACxD,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,yCAAyC,EACjD,YAAY,EAAE,OAAO,KAClB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AA2D1B;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,CAC1B,KAAK,EAAE,qBAAqB,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,yBAAyB,CAAA;KAAE,KACrF,IAAI,CAAC;IACV;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,CACxB,KAAK,EAAE,qBAAqB,GAAG;QAC7B,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,oCAAoC,CAAC;QAC9C,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,OAAO,CAAC;KAC1B,KACE,IAAI,CAAC;CACX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,0CAA0C,EAAE,MAAM,CAAC,oCAAoC,EAAE,OAAO,CAgC5G,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,+CAA+C,EAAE,MAAM,CAClE,yCAAyC,EACzC,OAAO,CAoCR,CAAC;AAgBF;;;;;;GAMG;AACH,qBAAa,eAAe;IA+CxB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,OAAO,CAAC;IAChB,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;IA7DnB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B;;qGAEiG;IACjG,OAAO,CAAC,8BAA8B,CAAC,CAGrC;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB,CAAC,CAAsE;IAErG,4FAA4F;IAC5F,OAAO,CAAC,QAAQ,CAAC,CAAwE;IAEzF,0FAA0F;IAC1F,OAAO,CAAC,wBAAwB,CAAC,CAAiB;IAElD,sGAAsG;IACtG,OAAO,CAAC,SAAS,CAAC,CAAmC;IAErD,OAAO,CAAC,2CAA2C,CAAC,CAA8C;IAElG,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqE;IAE/G,6GAA6G;IAC7G,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAqE;IAEnH;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,qCAAqC,CAAsD;IAE5G,YACU,kBAAkB,EAAE,0BAA0B,EAC9C,UAAU,EAAE,sBAAsB,EAClC,WAAW,EAAE,aAAa,GAAG,WAAW,EACxC,mBAAmB,EAAE,mBAAmB,EACxC,KAAK,EAAE,mBAAmB,EAC1B,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,yBAAyB,EACjC,UAAU,EAAE,mBAAmB,EAC/B,kBAAkB,EAAE,4BAA4B,EAChD,OAAO,CAAC,8BAAkB,EAC1B,YAAY,GAAE,YAAiC,EACvD,SAAS,GAAE,eAAsC,EACzC,GAAG,8CAA6C,EAChD,SAAS,GAAE,sBAA2B,EAM/C;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAEpE;IAEM,8CAA8C,CAAC,QAAQ,CAAC,EAAE,2CAA2C,GAAG,IAAI,CAElH;IAED;;;;;;;;;;;;;;OAcG;IACI,kCAAkC,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAEjH;IAED;;;;OAIG;IACU,2BAA2B,CACtC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,6BAA6B,EACrC,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC,IAAI,CAAC,CAaf;YAGa,gBAAgB;IAQ9B,2HAA2H;IACpH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAE1D;IAED,kGAAkG;IAC3F,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAE9D;IAED,gHAAgH;IACzG,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAE3D;IAED,gHAAgH;IACzG,wBAAwB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAM5D;IAED;;;OAGG;IACI,6BAA6B,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,GAAG,IAAI,CActG;IAED,8GAA8G;IACvG,kCAAkC,CAAC,UAAU,EAAE,UAAU,GAAG,sBAAsB,EAAE,CAE1F;IAED;;;;;;;OAOG;IACH,QAAQ,CACN,SAAS,EAAE,GAAG,EACd,eAAe,EAAE,OAAO,EACxB,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,uBAAuB,GAAG,2BAA2B,CAAC,EAChF,wBAAwB,CAAC,EAAE,MAAM,MAAM,EAAE,GACxC,eAAe,CAsIjB;IAED;;;;;;OAMG;IACG,mBAAmB,CACvB,QAAQ,EAAE,sBAAsB,EAChC,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,OAAO,GACvB,OAAO,CAAC,6BAA6B,CAAC,CA0ExC;YAUa,qBAAqB;YAmBrB,6BAA6B;YA8K7B,kBAAkB;YAuBlB,sBAAsB;YA2BtB,cAAc;YA+Bd,cAAc;YAyCd,4BAA4B;IAqC1C,OAAO,CAAC,uBAAuB;IA0C/B;;;;OAIG;IACH,OAAO,CAAC,iCAAiC;IA4EzC;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,yBAAyB;YAwBnB,0BAA0B;YA6C1B,yBAAyB;YAmEzB,2BAA2B;YAiD3B,2BAA2B;IA4BzC,0GAA0G;IAC1G,OAAO,CAAC,cAAc;IAItB,mGAAmG;IACnG,OAAO,CAAC,eAAe;IAIvB,gHAAgH;IAChH,OAAO,CAAC,mBAAmB;IAI3B;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;YAcrB,wBAAwB;YAsBxB,8BAA8B;YAoC9B,4BAA4B;YAyB5B,+BAA+B;IAoCvC,qBAAqB,CACzB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,GAAG,EAAE,EAAE,EAAE,EACT,cAAc,EAAE,EAAE,EAAE,EACpB,2BAA2B,EAAE,EAAE,EAAE,EACjC,wBAAwB,EAAE,EAAE,GAC3B,OAAO,CAAC,2BAA2B,CAAC,CAsHtC;IAED;;;;;;OAMG;IACG,wBAAwB,CAC5B,QAAQ,EAAE,+BAA+B,EACzC,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,kCAAkC,CAAC,CA+G7C;YAmBa,oBAAoB;YA8EpB,wBAAwB;IAetC;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAKhC,0GAA0G;IACnG,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAEpD;IAED;;;OAGG;IACG,0BAA0B,CAC9B,QAAQ,EAAE,sBAAsB,EAChC,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,kCAAkC,CAAC,CA+Q7C;IAED,yDAAyD;IACzD,OAAO,CAAC,0BAA0B;IAalC,6FAA6F;IAC7F,SAAS,CAAC,2BAA2B,CAAC,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CAInG;IAED,uDAAuD;IACvD,UAAgB,wBAAwB,CAAC,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB/G;YAOa,qBAAqB;CAsBpC"}
@@ -91,8 +91,8 @@ import { checkStreamingBlockProposalMetadata, isRetryableStreamingBlockCheckReas
91
91
  *
92
92
  * Matched on the error name rather than with `instanceof`, because the archiver package is only a dev dependency
93
93
  * here: the validator talks to its archiver through the `L2BlockSink` interface and must not take a runtime
94
- * dependency on the implementation to classify its errors. Both prefix outcomes are local-view disagreements, so
95
- * neither is in {@link SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT}.
94
+ * dependency on the implementation to classify its errors. Every reason returned here is a local-view disagreement,
95
+ * so none is in {@link SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT}.
96
96
  */ function getInboxPrefixInsertFailureReason(err) {
97
97
  if (!(err instanceof Error)) {
98
98
  return undefined;
@@ -103,8 +103,11 @@ import { checkStreamingBlockProposalMetadata, isRetryableStreamingBlockCheckReas
103
103
  case 'InboxPrefixNotSyncedError':
104
104
  case 'ProposedBlockParentNotFoundError':
105
105
  return 'inbox_prefix_unavailable';
106
+ // An insert-time consumption rewind means an L1 reorg landed between the deterministic metadata check (which
107
+ // already passed) and the insert, so it is a local-view disagreement, not proposer misconduct. Report it as the
108
+ // non-slashable prefix mismatch; the deterministic metadata check remains the only slashing evidence for a rewind.
106
109
  case 'InboxConsumptionRewindsError':
107
- return 'consumption_moves_backwards';
110
+ return 'inbox_prefix_mismatch';
108
111
  default:
109
112
  return undefined;
110
113
  }
@@ -118,9 +121,11 @@ import { checkStreamingBlockProposalMetadata, isRetryableStreamingBlockCheckReas
118
121
  invalid_fee_asset_price_modifier: 'invalid',
119
122
  checkpoint_already_published: undefined,
120
123
  last_block_not_found: 'unvalidated',
124
+ last_block_pruned_during_validation: 'unvalidated',
121
125
  block_fetch_error: 'unvalidated',
122
126
  world_state_not_synced: 'unvalidated',
123
127
  initial_archive_mismatch: 'unvalidated',
128
+ last_archive_root_mismatch: 'invalid',
124
129
  last_block_archive_mismatch: 'invalid',
125
130
  too_many_blocks_in_checkpoint: 'invalid',
126
131
  checkpoint_header_mismatch: 'invalid',
@@ -177,19 +182,49 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
177
182
  }
178
183
  };
179
184
  }
180
- /** Block-proposal validation failures that constitute a slashable invalid-block offense. */ export const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
181
- 'state_mismatch',
182
- 'failed_txs',
183
- 'global_variables_mismatch',
184
- 'invalid_proposal',
185
- 'parent_block_wrong_slot',
186
- 'duplicate_txs',
187
- 'invalid_embedded_txs'
188
- ];
185
+ /**
186
+ * Block-proposal validation failures classified by whether they constitute a slashable invalid-block offense.
187
+ * A `Record` over the whole reason union, not a plain array, so a newly added reason - in particular one that reaches
188
+ * `BlockProposalValidationFailureReason` through `StreamingBlockCheckReason` - fails to compile until it is classified
189
+ * here, the way {@link SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT} already does for checkpoints.
190
+ */ export const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = {
191
+ // enabled: deterministic offenses computed from the block's own content, so every honest node rejects them.
192
+ ['invalid_proposal']: true,
193
+ ['state_mismatch']: true,
194
+ ['failed_txs']: true,
195
+ ['global_variables_mismatch']: true,
196
+ ['parent_block_wrong_slot']: true,
197
+ ['duplicate_txs']: true,
198
+ ['invalid_embedded_txs']: true,
199
+ // Deterministic streaming-Inbox violations: computed from the block's own content by the metadata check, so a
200
+ // reject is the proposer's fault.
201
+ ['consumption_moves_backwards']: true,
202
+ ['bundle_over_block_cap']: true,
203
+ ['checkpoint_over_msg_cap']: true,
204
+ // disabled: local-view disagreements, timeouts, and this node's own inability to check - never proposer misconduct.
205
+ ['invalid_signature']: false,
206
+ ['parent_block_not_found']: false,
207
+ // A parent found once but pruned mid-validation; the verdict may describe another chain, not proposer misconduct.
208
+ ['parent_block_pruned_during_validation']: false,
209
+ // The local-view streaming reasons: a trailing archiver or an unfollowed reorg, including an insert-time
210
+ // consumption rewind reported as inbox_prefix_mismatch.
211
+ ['inbox_prefix_unavailable']: false,
212
+ ['inbox_prefix_mismatch']: false,
213
+ ['block_number_already_exists']: false,
214
+ ['txs_not_available']: false,
215
+ ['initial_state_mismatch']: false,
216
+ ['timeout']: false,
217
+ ['block_proposal_beyond_checkpoint']: false,
218
+ // Equivocation has its own offense path (markProposalEquivocation), so it is not a slashable invalid-block reason.
219
+ ['checkpoint_proposal_equivocation']: false,
220
+ ['unknown_error']: false
221
+ };
189
222
  /** Checkpoint-proposal validation failures that constitute a slashable invalid-checkpoint offense. */ export const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT = {
190
223
  // enabled
191
224
  ['invalid_fee_asset_price_modifier']: true,
192
225
  ['checkpoint_header_mismatch']: true,
226
+ // An unprovable header: the checkpoint circuit derives lastArchiveRoot from the first block's lastArchive.
227
+ ['last_archive_root_mismatch']: true,
193
228
  // These late mismatches should normally be caught by earlier checks, but if reached after validating the local
194
229
  // checkpoint inputs, the proposer-signed payload disagrees with deterministic recomputation.
195
230
  ['archive_mismatch']: true,
@@ -210,12 +245,21 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
210
245
  ['inbox_endpoint_mismatch']: false,
211
246
  ['invalid_signature']: false,
212
247
  ['last_block_not_found']: false,
248
+ // The local chain was pruned under the validation, so a slashable verdict may describe blocks of another chain.
249
+ ['last_block_pruned_during_validation']: false,
213
250
  ['block_fetch_error']: false,
214
251
  ['world_state_not_synced']: false,
215
- // A reorg / divergent local chain, not a proposer offense (mirrors the block path's initial_state_mismatch).
252
+ // World state forked off the chain of the local archiver blocks being rebuilt (e.g. a reorg racing the fork), not
253
+ // a proposer offense (mirrors the block path's initial_state_mismatch).
216
254
  ['initial_archive_mismatch']: false,
217
255
  ['checkpoint_already_published']: false
218
256
  };
257
+ /** Whether a block-proposal validation result is a rejection for a slashable reason. */ function isSlashableBlockProposalResult(result) {
258
+ return !result.isValid && SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT[result.reason];
259
+ }
260
+ /** Whether a checkpoint-proposal validation result is a rejection for a slashable reason. */ function isSlashableCheckpointProposalResult(result) {
261
+ return !result.isValid && SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT[result.reason];
262
+ }
219
263
  /**
220
264
  * Handles block and checkpoint proposals for both validator and non-validator nodes. Also tracks which slots
221
265
  * had a slashable invalid proposal or a proposal equivocation, exposing them via the
@@ -326,7 +370,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
326
370
  ...await this.observedProposal(proposal),
327
371
  accepted: result.isValid && !escapeHatchOpen,
328
372
  reason: result.isValid ? undefined : result.reason,
329
- slashable: !result.isValid && SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(result.reason),
373
+ slashable: isSlashableBlockProposalResult(result),
330
374
  escapeHatchOpen
331
375
  });
332
376
  }
@@ -411,7 +455,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
411
455
  // which intentionally disables invalid-block slashing then.
412
456
  if (result.reason === 'checkpoint_proposal_equivocation') {
413
457
  this.markProposalEquivocation(slotNumber);
414
- } else if (SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(result.reason) && !await this.epochCache.isEscapeHatchOpenAtSlot(slotNumber)) {
458
+ } else if (isSlashableBlockProposalResult(result) && !await this.epochCache.isEscapeHatchOpenAtSlot(slotNumber)) {
415
459
  this.markInvalidProposalSlot(slotNumber);
416
460
  }
417
461
  this.log.warn(`Non-validator block proposal ${blockNumber} at slot ${slotNumber} failed processing with ${result.reason}`, {
@@ -482,7 +526,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
482
526
  // Track invalid checkpoint proposals so offense observers (the attested-invalid-proposal watcher)
483
527
  // work on non-validator nodes too. This handler runs for all nodes; validators also mark via the
484
528
  // failure callback below (idempotent).
485
- if (SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT[result.reason]) {
529
+ if (isSlashableCheckpointProposalResult(result)) {
486
530
  this.markInvalidProposalSlot(proposal.slotNumber);
487
531
  this.markInvalidCheckpointProposal(proposal.slotNumber, proposal.getPayloadHash());
488
532
  }
@@ -576,6 +620,34 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
576
620
  reason: 'parent_block_not_found'
577
621
  };
578
622
  }
623
+ const result = await this.validateBlockProposalOnParent(proposal, parentBlock, proposalSender, shouldReexecute, proposalInfo);
624
+ // A genesis parent cannot be pruned.
625
+ return parentBlock !== 'genesis' && isSlashableBlockProposalResult(result) ? await this.checkParentStillLocal(proposal, result, proposalInfo) : result;
626
+ }
627
+ /**
628
+ * Demotes a block-proposal rejection when the proposal's parent is no longer found by archive. The parent is
629
+ * fetched once, but later checks read the local chain by number, and the archiver can prune the parent and insert
630
+ * other blocks at the same numbers while they run: under pipelining, when a checkpoint lands on L1 differing from the
631
+ * version this node gossiped. A prune removes the pruned blocks' archive entries, and an archive root commits to the
632
+ * block's whole history, so a parent still found by archive means the chain below it is still its own ancestry. A
633
+ * parent that is gone means the verdict may rest on another chain, which says nothing about the proposer.
634
+ */ async checkParentStillLocal(proposal, result, proposalInfo) {
635
+ if (await this.getParentBlock(proposal, {
636
+ awaitSync: false
637
+ }) !== undefined) {
638
+ return result;
639
+ }
640
+ this.log.warn(`Parent block was pruned while validating the proposal, not attributing the rejection to its proposer`, {
641
+ ...proposalInfo,
642
+ originalReason: result.reason
643
+ });
644
+ return {
645
+ ...result,
646
+ reason: 'parent_block_pruned_during_validation'
647
+ };
648
+ }
649
+ /** Validates a block proposal against the parent block it builds on, as fetched by the parent archive. */ async validateBlockProposalOnParent(proposal, parentBlock, proposalSender, shouldReexecute, proposalInfo) {
650
+ const slotNumber = proposal.slotNumber;
579
651
  // Check that the parent block's slot is not greater than the proposal's slot.
580
652
  if (parentBlock !== 'genesis' && parentBlock.header.getSlot() > slotNumber) {
581
653
  this.log.warn(`Parent block slot is greater than proposal slot, skipping processing`, {
@@ -837,7 +909,10 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
837
909
  throw err;
838
910
  }
839
911
  }
840
- async getParentBlock(proposal) {
912
+ /**
913
+ * Looks up the block a proposal builds on by its parent archive. Unless `awaitSync` is false, a parent that is not
914
+ * local yet is waited for through forced archiver syncs until the slot's attestation deadline.
915
+ */ async getParentBlock(proposal, { awaitSync = true } = {}) {
841
916
  const parentArchive = proposal.blockHeader.lastArchive.root;
842
917
  const { genesisArchiveRoot } = await this.blockSource.getGenesisValues();
843
918
  if (parentArchive.equals(genesisArchiveRoot)) {
@@ -850,7 +925,7 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
850
925
  if (parentBlock !== undefined) {
851
926
  return parentBlock;
852
927
  }
853
- if (this.getReexecutionDeadline(proposal.slotNumber).getTime() - this.dateProvider.now() <= 0) {
928
+ if (!awaitSync || this.getReexecutionDeadline(proposal.slotNumber).getTime() - this.dateProvider.now() <= 0) {
854
929
  return undefined;
855
930
  }
856
931
  const synced = await this.awaitLocalSync(proposal.slotNumber, 'force archiver sync', ()=>this.blockSource.getBlockData({
@@ -1106,10 +1181,19 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1106
1181
  * never saw. The retry re-runs the whole read (metadata plus range) on each attempt rather than reusing a range
1107
1182
  * from an earlier view, because the parent and checkpoint-start counts it derives can move while a reorg is being
1108
1183
  * followed.
1184
+ *
1185
+ * Every attempt's unexpected error is kept, not only the first one's. A read that starts as ordinary sync lag and
1186
+ * later hits a store fault or a broken provider is the case worth reporting, and reporting only the first attempt
1187
+ * discards exactly that: the diagnosis a node whose retries ran out has to offer is its latest failure.
1109
1188
  */ async awaitStreamingBlockBundle(proposal, blockNumber, parentBlock, proposalInfo) {
1189
+ let latestUnexpectedError;
1110
1190
  const readBundle = async ()=>{
1111
1191
  const metadata = await this.checkStreamingBlockMetadata(proposal, blockNumber, parentBlock);
1112
- return metadata.accepted ? readStreamingBlockBundle(this.l1ToL2MessageSource, metadata) : metadata;
1192
+ const result = metadata.accepted ? await readStreamingBlockBundle(this.l1ToL2MessageSource, metadata) : metadata;
1193
+ if (!result.accepted && result.error !== undefined) {
1194
+ latestUnexpectedError = result.error;
1195
+ }
1196
+ return result;
1113
1197
  };
1114
1198
  const first = await readBundle();
1115
1199
  if (first.accepted || !isRetryableStreamingBlockCheckReason(first.reason)) {
@@ -1130,12 +1214,17 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1130
1214
  reason: 'inbox_prefix_sync_timeout',
1131
1215
  firstReason: first.reason,
1132
1216
  // Set only when the message source failed for a reason the checks did not anticipate, rather than sync lag.
1133
- error: first.error,
1217
+ // The latest such failure, since a later store fault says more about why this node gave up than the first
1218
+ // attempt's lag does.
1219
+ error: latestUnexpectedError,
1134
1220
  slot: slotNumber,
1135
1221
  waitedMs: timer.ms(),
1136
1222
  ...proposalInfo
1137
1223
  });
1138
- return first;
1224
+ return {
1225
+ ...first,
1226
+ error: latestUnexpectedError
1227
+ };
1139
1228
  }
1140
1229
  return resolved;
1141
1230
  }
@@ -1293,15 +1382,18 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1293
1382
  }
1294
1383
  /**
1295
1384
  * Reads the blocks of a slot as one snapshot for checkpoint validation, locating the checkpoint's last block by the
1296
- * signed archive. Undefined when the archive is not among the slot's blocks or the blocks do not chain onto each
1297
- * other, both of which are the archiver replacing or pruning blocks while they were read.
1385
+ * signed archive. Undefined when the archive is not among the slot's blocks, the blocks do not chain onto each
1386
+ * other, or they are not one checkpoint's blocks from its first one on. All of these are local state in motion:
1387
+ * the archiver replacing or pruning blocks while they were read, or skipping a block whose body it cannot load.
1388
+ * Checkpoint validation relies on `blocks[0]` being the checkpoint's first block to attribute a wrong
1389
+ * lastArchiveRoot to the proposer.
1298
1390
  */ async readCheckpointBlocksSnapshot(slot, archive) {
1299
1391
  const blocks = await this.blockSource.getBlocksForSlot(slot);
1300
1392
  const lastBlockIndex = blocks.findIndex((block)=>block.archive.root.equals(archive));
1301
1393
  if (lastBlockIndex === -1) {
1302
1394
  return undefined;
1303
1395
  }
1304
- const contiguous = blocks.every((block, i)=>i === 0 || block.number === blocks[i - 1].number + 1 && block.header.lastArchive.root.equals(blocks[i - 1].archive.root));
1396
+ const contiguous = blocks.every((block, i)=>block.checkpointNumber === blocks[0].checkpointNumber && block.indexWithinCheckpoint === i && (i === 0 || block.number === blocks[i - 1].number + 1 && block.header.lastArchive.root.equals(blocks[i - 1].archive.root)));
1305
1397
  return contiguous ? {
1306
1398
  blocks,
1307
1399
  lastBlockIndex
@@ -1492,7 +1584,8 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1492
1584
  reason: 'invalid_fee_asset_price_modifier'
1493
1585
  };
1494
1586
  } else {
1495
- result = await this.validateCheckpointProposal(proposal, proposalInfo);
1587
+ const validation = await this.validateCheckpointProposal(proposal, proposalInfo);
1588
+ result = isSlashableCheckpointProposalResult(validation) ? await this.checkLastBlockStillLocal(proposal, validation, proposalInfo) : validation;
1496
1589
  }
1497
1590
  this.lastCheckpointValidationResult = {
1498
1591
  payloadHash,
@@ -1531,8 +1624,13 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1531
1624
  // slot is a different question, and still records. A recorded `invalid` is protected for the slot outright:
1532
1625
  // the tracker keys its slot entry by slot alone, so an equivocating proposer whose second proposal this node
1533
1626
  // could not check would otherwise erase the first one's determination.
1627
+ //
1628
+ // The protected `valid` is matched by slot and archive as well as by checkpoint number, because the second look
1629
+ // can fail before the blocks are loaded and then carries no checkpoint number at all: pruning the block the
1630
+ // cached verdict rested on makes revalidation report `last_block_not_found`, which by checkpoint number alone
1631
+ // is indistinguishable from a first evaluation and would overwrite the verdict this node reached.
1534
1632
  const outcome = result.isValid ? 'valid' : CHECKPOINT_VALIDATION_REASON_TO_OUTCOME[result.reason];
1535
- const wouldForgetVerdict = outcome === 'unvalidated' && (this.reexecutionTracker.getOutcomeForSlot(slot) === 'invalid' || result.checkpointNumber !== undefined && this.reexecutionTracker.hasReexecuted(result.checkpointNumber, proposal.archive));
1633
+ const wouldForgetVerdict = outcome === 'unvalidated' && (this.reexecutionTracker.getOutcomeForSlot(slot) === 'invalid' || this.reexecutionTracker.hasValidOutcomeForSlot(slot, proposal.archive) || result.checkpointNumber !== undefined && this.reexecutionTracker.hasReexecuted(result.checkpointNumber, proposal.archive));
1536
1634
  if (outcome !== undefined && !wouldForgetVerdict) {
1537
1635
  this.reexecutionTracker.recordOutcome(slot, proposal.archive, outcome, result.checkpointNumber);
1538
1636
  }
@@ -1630,10 +1728,42 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1630
1728
  };
1631
1729
  }
1632
1730
  }
1633
- /** The endpoint gate's own ceiling, narrowed by a slot whose attestation window is nearly spent. */ getInboxEndpointWindowMs(slot) {
1731
+ /**
1732
+ * Demotes a checkpoint rejection when the checkpoint's last block is no longer found by the signed archive.
1733
+ * Validation reads the slot's blocks once, but reads the block before the checkpoint and the parent checkpoint by
1734
+ * number afterwards, and the archiver can prune those and insert other blocks at the same numbers while the
1735
+ * checkpoint is rebuilt. A prune removes the pruned blocks' archive entries, and the last block's archive commits to
1736
+ * its whole history, so a last block still found by archive means the chain below it is still its own ancestry.
1737
+ */ async checkLastBlockStillLocal(proposal, result, proposalInfo) {
1738
+ if (await this.blockSource.getBlockData({
1739
+ archive: proposal.archive
1740
+ }) !== undefined) {
1741
+ return result;
1742
+ }
1743
+ this.log.warn(`Checkpoint's last block was pruned while validating the proposal, not attributing the rejection`, {
1744
+ ...proposalInfo,
1745
+ originalReason: result.reason
1746
+ });
1747
+ return {
1748
+ ...result,
1749
+ reason: 'last_block_pruned_during_validation'
1750
+ };
1751
+ }
1752
+ /**
1753
+ * The endpoint gate's own ceiling, narrowed by a slot whose attestation window is nearly spent.
1754
+ *
1755
+ * The floor survives past the attestation deadline on purpose, and is bounded at
1756
+ * {@link INBOX_ENDPOINT_CHECK_MIN_WINDOW_MS} for it: a late node still wants the content verdict for telemetry,
1757
+ * and reaching one costs one bounded local L1 read. What the floor must not buy is a signature, which is why
1758
+ * {@link getAttestationDeadline} is re-read at the signing boundary rather than here — a window is not a
1759
+ * permission to attest.
1760
+ */ getInboxEndpointWindowMs(slot) {
1634
1761
  const remainingMs = this.getReexecutionDeadline(slot).getTime() - this.dateProvider.now();
1635
1762
  return Math.min(INBOX_ENDPOINT_CHECK_WINDOW_MS, Math.max(INBOX_ENDPOINT_CHECK_MIN_WINDOW_MS, remainingMs));
1636
1763
  }
1764
+ /** The consensus attestation deadline for a slot: the last moment an attestation for it may be signed. */ getAttestationDeadline(slot) {
1765
+ return this.getReexecutionDeadline(slot);
1766
+ }
1637
1767
  /**
1638
1768
  * Validates a checkpoint proposal by building the full checkpoint and comparing it with the proposal.
1639
1769
  * @returns Validation result with isValid flag and reason if invalid.
@@ -1654,9 +1784,10 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1654
1784
  // runs on: the block carrying the signed archive is the checkpoint's last block, and the slot's blocks before it
1655
1785
  // are the checkpoint's. Reading the last block by archive and the slot's blocks separately would let a local prune
1656
1786
  // between the two reads look like a proposer offense; a slot read without the signed archive, or one that is not
1657
- // a contiguous chain, is local state in motion and is retried. The deadline is passed to retryUntil as an
1658
- // absolute date so the remaining budget is derived from the date provider; a deadline already in the past times
1659
- // out after a single attempt instead of looping (the immediate-timeout semantics of the deadline overload).
1787
+ // a contiguous chain of one checkpoint's blocks starting at its first, is local state in motion and is retried.
1788
+ // The deadline is passed to retryUntil as an absolute date so the remaining budget is derived from the date
1789
+ // provider; a deadline already in the past times out after a single attempt instead of looping (the
1790
+ // immediate-timeout semantics of the deadline overload).
1660
1791
  let snapshot;
1661
1792
  try {
1662
1793
  snapshot = await retryUntil(async ()=>{
@@ -1743,6 +1874,21 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1743
1874
  const firstBlock = blocks[0];
1744
1875
  const constants = this.extractCheckpointConstants(firstBlock);
1745
1876
  const checkpointNumber = firstBlock.checkpointNumber;
1877
+ // The rebuild derives the header's lastArchiveRoot from the first block's lastArchive (as does the checkpoint
1878
+ // circuit), so any other claimed value is an unprovable header; reject it before paying for the rebuild.
1879
+ const expectedLastArchiveRoot = firstBlock.header.lastArchive.root;
1880
+ if (!proposal.checkpointHeader.lastArchiveRoot.equals(expectedLastArchiveRoot)) {
1881
+ this.log.warn(`Checkpoint proposal's last archive root does not match its first block`, {
1882
+ ...proposalInfo,
1883
+ expectedLastArchiveRoot: expectedLastArchiveRoot.toString(),
1884
+ proposalLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString()
1885
+ });
1886
+ return {
1887
+ isValid: false,
1888
+ reason: 'last_archive_root_mismatch',
1889
+ checkpointNumber
1890
+ };
1891
+ }
1746
1892
  // The checkpoint's Inbox consumption starts at the leaf count of the block before its first block. Without that
1747
1893
  // block the consumed bundle cannot be derived; an empty bundle would make a valid proposal fail its rolling-hash
1748
1894
  // recomputation and be classified as a proposer offense, so a missing parent is a local fetch failure instead.
@@ -1819,17 +1965,15 @@ const INBOX_ENDPOINT_CHECK_INTERVAL_S = 0.5;
1819
1965
  };
1820
1966
  }
1821
1967
  const fork = _ts_add_disposable_resource(env, forkResult, true);
1822
- // Verify the fork's archive root matches the checkpoint's expected starting archive (the archive after
1823
- // the parent block). A mismatch means world state forked from a different chain than the proposal was
1824
- // built on (e.g. a reorg), so recomputing the checkpoint against it would be meaningless. This mirrors
1825
- // the block-proposal re-execution check and fails fast with a clean, non-slashable result instead of a
1826
- // confusing downstream mismatch.
1968
+ // World state must be on the same chain as the archiver blocks being rebuilt; otherwise the rebuild would disagree
1969
+ // with an honest proposal. This is a local race (e.g. a reorg between the hash-pinned sync and the fork), never a
1970
+ // proposer offense. It mirrors the block-proposal re-execution check.
1827
1971
  const forkArchiveRoot = new Fr((await fork.getTreeInfo(MerkleTreeId.ARCHIVE)).root);
1828
- if (!forkArchiveRoot.equals(proposal.checkpointHeader.lastArchiveRoot)) {
1829
- this.log.warn(`Fork archive root does not match checkpoint proposal's last archive`, {
1972
+ if (!forkArchiveRoot.equals(expectedLastArchiveRoot)) {
1973
+ this.log.warn(`Fork archive root does not match the checkpoint's first block last archive`, {
1830
1974
  ...proposalInfo,
1831
1975
  forkArchiveRoot: forkArchiveRoot.toString(),
1832
- expectedLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString()
1976
+ expectedLastArchiveRoot: expectedLastArchiveRoot.toString()
1833
1977
  });
1834
1978
  return {
1835
1979
  isValid: false,
@@ -128,4 +128,4 @@ export declare function readStreamingBlockBundle(messageSource: Pick<StreamingIn
128
128
  * {@link readStreamingBlockBundle} for callers that have no use for running the two phases separately.
129
129
  */
130
130
  export declare function checkStreamingBlockProposal(input: StreamingBlockCheckInput): Promise<StreamingBlockCheckResult>;
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nX2luYm94X2NoZWNrcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbWluZ19pbmJveF9jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxNQUFNLHlCQUF5QixHQUNqQywwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDZCQUE2QixHQUM3Qix1QkFBdUIsR0FDdkIseUJBQXlCLENBQUM7QUFFOUIsOEdBQThHO0FBQzlHLGVBQU8sTUFBTSx1Q0FBdUMsRUFBRSxTQUFTLHlCQUF5QixFQUd2RixDQUFDO0FBRUYseUdBQXlHO0FBQ3pHLHdCQUFnQixvQ0FBb0MsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLEdBQUcsT0FBTyxDQUUvRjtBQUVELHNGQUFzRjtBQUN0RixNQUFNLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDLENBQUM7QUFFcEgsK0RBQStEO0FBQy9ELE1BQU0sTUFBTSxnQ0FBZ0MsR0FBRztJQUM3QyxpRkFBaUY7SUFDakYsYUFBYSxFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZFOzs7T0FHRztJQUNILGNBQWMsRUFBRSxxQkFBcUIsQ0FBQztJQUN0QyxnSEFBZ0g7SUFDaEgsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLHFIQUFxSDtJQUNySCxtQkFBbUIsRUFBRSxNQUFNLENBQUM7SUFDNUIsMEdBQTBHO0lBQzFHLDRCQUE0QixFQUFFLE1BQU0sQ0FBQztJQUNyQyx5RkFBeUY7SUFDekYsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQiwyR0FBMkc7SUFDM0csZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0NBQzFCLENBQUM7QUFFRix1R0FBdUc7QUFDdkcsTUFBTSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxlQUFlLENBQUMsR0FBRztJQUMvRixhQUFhLEVBQUUsMkJBQTJCLENBQUM7Q0FDNUMsQ0FBQztBQUVGLGlHQUFpRztBQUNqRyxNQUFNLE1BQU0sd0JBQXdCLEdBQUc7SUFDckMsOEVBQThFO0lBQzlFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQztJQUM1QixvSEFBb0g7SUFDcEgsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLDZIQUE2SDtJQUM3SCxjQUFjLEVBQUUscUJBQXFCLENBQUM7Q0FDdkMsQ0FBQztBQUVGLCtEQUErRDtBQUMvRCxNQUFNLE1BQU0saUNBQWlDLEdBQ3pDLENBQUM7SUFDQyxvR0FBb0c7SUFDcEcsUUFBUSxFQUFFLElBQUksQ0FBQztDQUNoQixHQUFHLHdCQUF3QixDQUFDLEdBQzdCO0lBQ0UsNEZBQTRGO0lBQzVGLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDaEIsTUFBTSxFQUFFLHlCQUF5QixDQUFDO0NBQ25DLENBQUM7QUFFTixpRUFBaUU7QUFDakUsTUFBTSxNQUFNLHlCQUF5QixHQUNqQztJQUNFLG9HQUFvRztJQUNwRyxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ2YsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2QsR0FDRDtJQUNFLDRGQUE0RjtJQUM1RixRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQ2hCLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQztJQUNsQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEIsQ0FBQztBQUVOOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsd0JBQXNCLG1DQUFtQyxDQUN2RCxLQUFLLEVBQUUsZ0NBQWdDLEdBQ3RDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQXNDNUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsd0JBQXNCLHdCQUF3QixDQUM1QyxhQUFhLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDLEVBQ3pFLEtBQUssRUFBRSx3QkFBd0IsR0FDOUIsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBbUJwQztBQXFCRDs7OztHQUlHO0FBQ0gsd0JBQXNCLDJCQUEyQixDQUFDLEtBQUssRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FNckgifQ==
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nX2luYm94X2NoZWNrcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbWluZ19pbmJveF9jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxNQUFNLHlCQUF5QixHQUNqQywwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDZCQUE2QixHQUM3Qix1QkFBdUIsR0FDdkIseUJBQXlCLENBQUM7QUFFOUIsOEdBQThHO0FBQzlHLGVBQU8sTUFBTSx1Q0FBdUMsRUFBRSxTQUFTLHlCQUF5QixFQUd2RixDQUFDO0FBRUYseUdBQXlHO0FBQ3pHLHdCQUFnQixvQ0FBb0MsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLEdBQUcsT0FBTyxDQUUvRjtBQUVELHNGQUFzRjtBQUN0RixNQUFNLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDLENBQUM7QUFFcEgsK0RBQStEO0FBQy9ELE1BQU0sTUFBTSxnQ0FBZ0MsR0FBRztJQUM3QyxpRkFBaUY7SUFDakYsYUFBYSxFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZFOzs7T0FHRztJQUNILGNBQWMsRUFBRSxxQkFBcUIsQ0FBQztJQUN0QyxnSEFBZ0g7SUFDaEgsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLHFIQUFxSDtJQUNySCxtQkFBbUIsRUFBRSxNQUFNLENBQUM7SUFDNUIsMEdBQTBHO0lBQzFHLDRCQUE0QixFQUFFLE1BQU0sQ0FBQztJQUNyQyx5RkFBeUY7SUFDekYsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQiwyR0FBMkc7SUFDM0csZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0NBQzFCLENBQUM7QUFFRix1R0FBdUc7QUFDdkcsTUFBTSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxlQUFlLENBQUMsR0FBRztJQUMvRixhQUFhLEVBQUUsMkJBQTJCLENBQUM7Q0FDNUMsQ0FBQztBQUVGLGlHQUFpRztBQUNqRyxNQUFNLE1BQU0sd0JBQXdCLEdBQUc7SUFDckMsOEVBQThFO0lBQzlFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQztJQUM1QixvSEFBb0g7SUFDcEgsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLDZIQUE2SDtJQUM3SCxjQUFjLEVBQUUscUJBQXFCLENBQUM7Q0FDdkMsQ0FBQztBQUVGLCtEQUErRDtBQUMvRCxNQUFNLE1BQU0saUNBQWlDLEdBQ3pDLENBQUM7SUFDQyxvR0FBb0c7SUFDcEcsUUFBUSxFQUFFLElBQUksQ0FBQztDQUNoQixHQUFHLHdCQUF3QixDQUFDLEdBQzdCO0lBQ0UsNEZBQTRGO0lBQzVGLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDaEIsTUFBTSxFQUFFLHlCQUF5QixDQUFDO0NBQ25DLENBQUM7QUFFTixpRUFBaUU7QUFDakUsTUFBTSxNQUFNLHlCQUF5QixHQUNqQztJQUNFLG9HQUFvRztJQUNwRyxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ2YsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2QsR0FDRDtJQUNFLDRGQUE0RjtJQUM1RixRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQ2hCLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQztJQUNsQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEIsQ0FBQztBQUVOOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsd0JBQXNCLG1DQUFtQyxDQUN2RCxLQUFLLEVBQUUsZ0NBQWdDLEdBQ3RDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQXNDNUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsd0JBQXNCLHdCQUF3QixDQUM1QyxhQUFhLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDLEVBQ3pFLEtBQUssRUFBRSx3QkFBd0IsR0FDOUIsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBbUJwQztBQThCRDs7OztHQUlHO0FBQ0gsd0JBQXNCLDJCQUEyQixDQUFDLEtBQUssRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FNckgifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"streaming_inbox_checks.d.ts","sourceRoot":"","sources":["../src/streaming_inbox_checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,uBAAuB,GACvB,6BAA6B,GAC7B,uBAAuB,GACvB,yBAAyB,CAAC;AAE9B,8GAA8G;AAC9G,eAAO,MAAM,uCAAuC,EAAE,SAAS,yBAAyB,EAGvF,CAAC;AAEF,yGAAyG;AACzG,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAE/F;AAED,sFAAsF;AACtF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;AAEpH,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,iFAAiF;IACjF,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IACvE;;;OAGG;IACH,cAAc,EAAE,qBAAqB,CAAC;IACtC,gHAAgH;IAChH,gBAAgB,EAAE,MAAM,CAAC;IACzB,qHAAqH;IACrH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0GAA0G;IAC1G,4BAA4B,EAAE,MAAM,CAAC;IACrC,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,2GAA2G;IAC3G,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,GAAG;IAC/F,aAAa,EAAE,2BAA2B,CAAC;CAC5C,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,wBAAwB,GAAG;IACrC,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oHAAoH;IACpH,gBAAgB,EAAE,MAAM,CAAC;IACzB,6HAA6H;IAC7H,cAAc,EAAE,qBAAqB,CAAC;CACvC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,iCAAiC,GACzC,CAAC;IACC,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,wBAAwB,CAAC,GAC7B;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;CACnC,CAAC;AAEN,iEAAiE;AACjE,MAAM,MAAM,yBAAyB,GACjC;IACE,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,EAAE,EAAE,CAAC;CACd,GACD;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAsC5C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,EACzE,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAmBpC;AAqBD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAMrH"}
1
+ {"version":3,"file":"streaming_inbox_checks.d.ts","sourceRoot":"","sources":["../src/streaming_inbox_checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAE/F;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,uBAAuB,GACvB,6BAA6B,GAC7B,uBAAuB,GACvB,yBAAyB,CAAC;AAE9B,8GAA8G;AAC9G,eAAO,MAAM,uCAAuC,EAAE,SAAS,yBAAyB,EAGvF,CAAC;AAEF,yGAAyG;AACzG,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAE/F;AAED,sFAAsF;AACtF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;AAEpH,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,iFAAiF;IACjF,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;IACvE;;;OAGG;IACH,cAAc,EAAE,qBAAqB,CAAC;IACtC,gHAAgH;IAChH,gBAAgB,EAAE,MAAM,CAAC;IACzB,qHAAqH;IACrH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0GAA0G;IAC1G,4BAA4B,EAAE,MAAM,CAAC;IACrC,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,2GAA2G;IAC3G,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,GAAG;IAC/F,aAAa,EAAE,2BAA2B,CAAC;CAC5C,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,wBAAwB,GAAG;IACrC,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oHAAoH;IACpH,gBAAgB,EAAE,MAAM,CAAC;IACzB,6HAA6H;IAC7H,cAAc,EAAE,qBAAqB,CAAC;CACvC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,iCAAiC,GACzC,CAAC;IACC,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,wBAAwB,CAAC,GAC7B;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;CACnC,CAAC;AAEN,iEAAiE;AACjE,MAAM,MAAM,yBAAyB,GACjC;IACE,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,EAAE,EAAE,CAAC;CACd,GACD;IACE,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAsC5C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,IAAI,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,EACzE,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAmBpC;AA8BD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAMrH"}
@@ -122,18 +122,24 @@
122
122
  };
123
123
  }
124
124
  /**
125
- * Message fragments that identify an ordinary local-view shortfall from the archiver's range read: the range reaches
126
- * past what this node has synced, or its bounds are not a valid range at all. Matched on the message text rather than
127
- * on the error's class, since a JSON-RPC hop between the validator and its message source leaves the class behind
128
- * while preserving the message.
125
+ * The complete message forms of an ordinary local-view shortfall from the archiver's range read: the range reaches
126
+ * past what this node has synced, or its bounds are not a valid range at all. Matched on the message text rather
127
+ * than on the error's class, since a JSON-RPC hop between the validator and its message source leaves the class
128
+ * behind while preserving the message.
129
+ *
130
+ * Anchored to the whole message on purpose. A substring test also swallows anything that quotes one of these — a
131
+ * store or provider fault reported as `database unavailable: Inbox message range [3, 7) is not fully synced` is a
132
+ * failure the checks did not anticipate, and reporting it as ordinary sync lag loses the only diagnosis a validator
133
+ * that runs out of retries can offer. Matching is about which failures are *reported*, not which are accepted:
134
+ * every range-read failure stays non-punitive either way.
129
135
  */ const EXPECTED_RANGE_READ_FAILURES = [
130
- 'is not fully synced',
131
- 'Invalid Inbox leaf count range'
136
+ /^Inbox message range \[-?\d+, -?\d+\) is not fully synced(: [\s\S]*)?$/,
137
+ /^Invalid Inbox leaf count range \[-?\d+, -?\d+\)$/
132
138
  ];
133
139
  /** Upper bound on the error text carried onto a result, so a verbose provider error cannot blow up a log record. */ const MAX_REPORTED_ERROR_LENGTH = 200;
134
140
  /** Bounded text of a range-read failure the checks did not anticipate, or undefined for ordinary sync lag. */ function unexpectedRangeReadError(err) {
135
141
  const message = err instanceof Error ? err.message : String(err);
136
- return EXPECTED_RANGE_READ_FAILURES.some((fragment)=>message.includes(fragment)) ? undefined : message.slice(0, MAX_REPORTED_ERROR_LENGTH);
142
+ return EXPECTED_RANGE_READ_FAILURES.some((form)=>form.test(message)) ? undefined : message.slice(0, MAX_REPORTED_ERROR_LENGTH);
137
143
  }
138
144
  /**
139
145
  * Runs the per-block acceptance checks a validator applies to a streaming block proposal, and derives the