Skip to content

Documentation / @etherfold/core / TimestamplessLogError

Class: TimestamplessLogError ​

Defined in: packages/core/src/errors.ts:455

A NODE that answered a fetch with a log carrying no readable blockTimestamp.

blockTimestamp on the log is ethereum/execution-apis#639, and the engine reads it off the log rather than paying a request per event-bearing block for it (ADR-0073). A node that does not serve it is REFUSED here rather than silently compensated for, and the refusal names the NODE because every cause is node-level and each one has a DIFFERENT fix -- which is why the message is this long. "missing blockTimestamp" alone sends an operator to the wrong one.

Why this is permanent machinery and not a transitional guard ​

One cause survives any version bump, in two lifetimes, and neither improves with time. A node being FORKED may predate the spec change: EDR types the field Option<u64> precisely so an absent timestamp stays distinguishable from a real one, and passes the absence through rather than defaulting it. And EDR's on-disk RPC response cache REPLAYS such an absence once it has recorded one, until rpc_cache is dropped -- so the fork can be long gone and the answer still arrive without the field.

Note what this is NOT, because three of this repo's own documents said it and it reads backwards: it is not that pre-0.20 cache entries keep answering. @nomicfoundation/edr@0.20.0 moved the cache to rpc_cache/v2 and IGNORES everything else in rpc_cache, so entries written before the change are not served at all. The hazard is a CURRENT-format entry holding an absence read from a pre-spec remote.

Why it does not replace the fold-time refusal ​

blockPointer (@etherfold/processor-entities) refuses the same absence at the FOLD, naming the BLOCK, and that one cannot be dropped in favour of this: a stream can reach a fold without passing a fetcher at all -- a seed install writes through the keeper seam (ADR-0063), a fixture reader replays a captured stream (ADR-0059) -- and this check would never see either. Two entry points, two guards, deliberately.

Neither of them guesses. A zero or interpolated timestamp does not fail, it answers confidently about the wrong block for as long as the store lives, and an as-of read has no way to tell a caller it was lied to.

Extends ​

  • Error

Constructors ​

Constructor ​

new TimestamplessLogError(blockNumber, blockHash, source): TimestamplessLogError

Defined in: packages/core/src/errors.ts:460

Parameters ​

blockNumber ​

number

The block the timestampless log sat in.

blockHash ​

string

Its block hash, so the claim is checkable against the node.

source ​

string

What was fetched, e.g. the node's answer for [100, 200].

Returns ​

TimestamplessLogError

Overrides ​

Error.constructor

Properties ​

blockHash ​

readonly blockHash: string

Defined in: packages/core/src/errors.ts:464

Its block hash, so the claim is checkable against the node.


blockNumber ​

readonly blockNumber: number

Defined in: packages/core/src/errors.ts:462

The block the timestampless log sat in.


cause? ​

optional cause?: unknown

Defined in: node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts:24

Inherited from ​

Error.cause


message ​

message: string

Defined in: node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts:1075

Inherited from ​

Error.message


name ​

readonly name: "TimestamplessLogError" = 'TimestamplessLogError'

Defined in: packages/core/src/errors.ts:456

Overrides ​

Error.name


retryable ​

readonly retryable: false = false

Defined in: packages/core/src/errors.ts:458

A node does not grow a field while a scheduler waits. The fix is an operator's.


stack? ​

optional stack?: string

Defined in: node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts:1076

Inherited from ​

Error.stack

Methods ​

isError() ​

static isError(error): error is Error

Defined in: node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.esnext.error.d.ts:21

Indicates whether the argument provided is a built-in Error instance or not.

Parameters ​

error ​

unknown

Returns ​

error is Error

Inherited from ​

Error.isError