…ry reason
into the approval error
A frame transaction that fails static validation, carries an invalid signature,
or exceeds a gas or blob bound was rejected with
TxValidationError::InvalidFrameTransaction, whose message describes only one of
those cases: "VERIFY frame did not call APPROVE or payer not approved". The
block was always correctly rejected, but the reason reported was wrong, which is
indistinguishable to a conformance harness from a client that rejected it by
accident.
Split the variant into InvalidFrameTransactionFormat, carrying the reason
validate_static_constraints already produced and the call site discarded, and
InvalidFrameSignature. The approval case keeps the original variant and message.
Enforce four rules that had no frame-transaction path at all, reusing the
existing error variants so no new strings are needed: EIP-7825's transaction gas
cap over max_gas (which covers both the frame-gas and calldata-floor anchors),
the EIP-4844 blob versioned-hash and blob-count rules, and a nonce at the u64
ceiling. Those transactions previously executed and were only caught downstream,
by block-access-list validation.
batched_verify_revert_invalidates_tx was passing vacuously: EIP-8141 forbids the
atomic batch flag on a VERIFY frame, so its transaction was rejected by static
validation and the reverting frame never ran. Carrying the reason exposed it.
Repointed to the rule it actually exercises.
Motivation
A frame transaction that failed static validation, carried an invalid signature, or broke a gas or blob bound was rejected with one error whose message describes only one of those cases: "VERIFY frame did not call APPROVE or payer not approved". The block was always correctly rejected, but the reason was wrong, which is why
consume-enginefails 62 tests in the hiveframessuite whileconsume-rlppasses 24,916/24,916 on the same client and fixtures.Four rules also had no frame-transaction path at all, so those transactions executed and were caught only by block-access-list validation.
Description
Splits the error into
InvalidFrameTransactionFormat, carrying the reasonvalidate_static_constraintsalready produced and the call site discarded, andInvalidFrameSignature. The approval case keeps the original variant and message.Adds the missing checks, reusing existing error variants so no new strings enter the exception-mapper contract: EIP-7825's transaction gas cap over
max_gas(), which covers both the frame-gas and calldata-floor anchors; the EIP-4844 versioned-hash and blob-count rules; and a nonce at theu64ceiling.On the pinned frames bundle this takes exception mismatches from 83 to 78, and to 2 together with the harness alignment already on
frames-devnet-0. Adds 6 regression tests, and repointsbatched_verify_revert_invalidates_tx, which was passing vacuously: EIP-8141 forbids the atomic batch flag on aVERIFYframe, so its transaction was rejected by static validation and the reverting frame never ran.Checklist
STORE_SCHEMA_VERSIONif the PR includes breaking changes to theStorerequiring a re-sync. — not applicable, noStorechanges.