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 ​
readonlyblockHash:string
Defined in: packages/core/src/errors.ts:464
Its block hash, so the claim is checkable against the node.
blockNumber ​
readonlyblockNumber:number
Defined in: packages/core/src/errors.ts:462
The block the timestampless log sat in.
cause? ​
optionalcause?: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 ​
readonlyname:"TimestamplessLogError"='TimestamplessLogError'
Defined in: packages/core/src/errors.ts:456
Overrides ​
Error.name
retryable ​
readonlyretryable: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? ​
optionalstack?: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() ​
staticisError(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