eth_call, eth_createAccessList and debug_traceCall build their environment
via env_from_generic, which defaults the tx nonce to 0 when the call object
carries none — and the pre-execution hook enforced it unconditionally, so a
from-only call for any sender with a nonzero account nonce failed with a
nonce mismatch. These endpoints execute relaxed messages (geth skips nonce
checks for all of them), so env_from_generic now sets disable_nonce_check.
eth_estimateGas was unaffected: it auto-fills the nonce from storage before
simulating.
The regression test drives eth_call through the HTTP dispatch with a nonce
state override on the sender and no nonce in the call object; it fails with
the old behavior.
Motivation
eth_callwith onlyfromset fails with a nonce mismatch for any sender whose account nonce is nonzero, where geth succeeds:env_from_genericdefaults the tx nonce to 0 when the call object carries none, and the pre-execution hook enforced it unconditionally. Found while implementingeth_simulateV1(#6951); stacked on that PR because it uses thedisable_nonce_checkenvironment flag introduced there.Description
env_from_generic— used exclusively by the simulation RPCs (eth_call,eth_createAccessList,debug_traceCall) — now setsdisable_nonce_check, matching geth's relaxed messages for these endpoints.eth_estimateGaswas unaffected: it auto-fills the nonce from storage before simulating. Consensus execution paths don't go throughenv_from_genericand are unchanged.How to Test
The regression test drives
eth_callthrough the HTTP dispatch with anonce: 0x5state override on the sender and no nonce in the call object; it fails with the old behavior.Checklist
STORE_SCHEMA_VERSION(crates/storage/lib.rs) if the PR includes breaking changes to theStorerequiring a re-sync. — N/A, no Store schema changes.