DeFi Security AllianceRequest an audit
Menu

Tooling

Transaction Simulation Security: State, Signatures and Unknown Results

A preview is an execution result under selected assumptions, not a promise about a future transaction. Transaction simulation security depends on the exact request, state reference, validation mode and authority being granted, including effects that do not move assets immediately.

Glass wallet screen projecting a transaction preview beside a diverging path, illustrating the limits of transaction simulation security.

Key facts

Original census
92 eth_simulateV1 fixture files in the recorded repository tree
Overlapping signals
12 validation, 14 override and 7 nonce filename signals
Execution boundary
Fixture inventory only; no wallet or provider pass rate measured
Authorization boundary
A simulated caller and successful execution do not prove a valid signature

What simulation executes

Transaction simulation security concerns what a preview establishes about a proposed action and which assumptions remain outside that preview. A simulator executes a call or sequence against selected state and configuration. It can expose a revert, a transfer or another effect under those conditions. It does not guarantee that the eventual transaction will encounter identical conditions or that the requested authority is appropriate.

The retrieved Geth documentation contains a useful qualification: its simulation validation mode excludes contract-sender and signature checks. A preview labeled validated therefore needs a narrower interpretation than a claim that every condition of a real signed transaction has been established. The document trail begins with that exception and continues through the request, state reference and wallet explanation.

The Ethereum JSON-RPC documentation describes eth_call as executing a message call without creating a transaction on the blockchain. Geth's documentation also describes eth_simulateV1, which can simulate sequences across block-state call groups. These are execution mechanisms. A wallet's human-readable summary is another layer that interprets their output.

Separate execution evidence from interface interpretation
LayerWhat it can reportQuestion still open
Call executionReturn data or an execution failure under selected stateDid the selected state match the intended review?
Sequence simulationEffects of ordered calls within the supported modelWill the real transaction order and dependencies match?
Transfer interpretationRecognized asset movements or logsAre all meaningful permissions and effects represented?
Wallet explanationA human-readable summary of the proposed actionDoes the summary accurately describe the target and authority?
Committed transactionThe actual included execution resultWas the resulting behavior acceptable to the user?

A simulation can allow a caller to specify an address without possessing its signing key. That is useful for analysis, but it means the simulated caller is not proof of authorization. Geth's documented validation mode still excludes contract-sender and signature checks. A successful validated simulation should therefore not be described as proving that a real signed transaction is authorized and includable in every respect.

Read the output at the level the method actually supplies. A raw return value, a recognized token transfer and a wallet warning are different observations. If the interface reports no recognized asset change, ask whether the action changes an allowance, installs authority or updates state that enables a later transfer. Immediate balance movement is only one kind of consequence.

The security tools hub can help distinguish supporting analysis methods. For a specific wallet or provider, verify the implemented method and its configuration rather than transferring every capability of the underlying node documentation to the product interface.

State and block assumptions

The state reference is part of the result. A call evaluated at a selected block answers a question about that state. A request using a moving label such as latest can produce different results at different times. Preserve the resolved block identity where the provider exposes it, along with the chain, target address, calldata and caller context.

Pending state introduces another uncertainty. A node's view of pending transactions is not a universal promise about the order that will be included. A simulation based on that view can be informative, but its assumptions should remain visible. Reordering, replacement or a different block context can change the eventual execution.

Geth documents state overrides and block-context overrides for supported calls. These features deliberately modify the environment being simulated. They are useful for controlled analysis, such as evaluating a path with a specified balance or storage value. An override-assisted success is not evidence that those conditions exist on the live chain.

Inputs that make a preview conditional
InputWhat to recordHow a mismatch can matter
Chain and blockNetwork identity and resolved state referenceThe same address can represent a different target or state
Caller and valueSimulated sender and native-asset amountPermissions and balance-dependent behavior can change
CalldataExact function selector and encoded argumentsA summary can conceal a different operation or recipient
State overridesEvery modified account or storage fieldThe preview can rely on conditions absent from production
Block overridesChanged time, number or fee contextTime and environment checks can take another branch

A contract upgrade can create a particularly important mismatch. A proxy address may stay constant while its implementation changes between review and execution. A saved preview should identify the implementation or relevant code state where possible. The upgrade review guide explains why address identity alone does not establish behavior identity.

For a sequence, order is an input too. Simulating an approval followed by a transfer is different from simulating either call alone. The first action can change the state used by the second. Document whether the product simulates the whole intended sequence and whether it includes only the user's calls or additional assumed setup operations.

A preview and a committed transaction can diverge at several boundariesThe preview supports a conditional conclusion; changes between the selected state and inclusion can produce a different committed result.Selected stateProposed callsIntervening changesCommitted result
A preview and a committed transaction can diverge at several boundaries. The preview supports a conditional conclusion; changes between the selected state and inclusion can produce a different committed result.
  1. The simulator starts from an identified chain state and any declared overrides.
  2. The exact caller, arguments and sequence define the simulated action.
  3. Other transactions, upgrades or timing can alter the execution context.
  4. The included transaction produces the actual state transition and receipt.

A useful comparison after an unexpected outcome preserves both records. Compare the simulated and committed inputs, block context, implementation and relevant state changes. This can distinguish a stale preview from a decoding error, a changed target or a behavior the interface never displayed. Without the saved inputs, several different explanations can look like the same "simulation failed" complaint.

Approvals and signatures

An approval can create authority without transferring an asset immediately. A preview that focuses on current balance changes may therefore understate the significance of the action. Identify the spender, asset, amount and any expiry or revocation mechanism. The relevant question is what the authorized party can do later, not only what happens in the approval transaction.

A signature request can be even further removed from immediate execution. The user may sign an authorization that another party submits later. The contract consuming the signature, its domain checks and its replay state determine the effect. A wallet that shows no current transfer has not established that the signature carries no financial or administrative authority.

EIP-712 defines typed structured data and domain separation, while leaving replay protection to the application. Read the actual signed fields and the verifying contract. A recognizable domain name is not enough: the chain, contract, nonce, expiry and operation-specific fields need to match the intended authorization scheme.

Authority changes that a balance-only preview can miss
ActionAuthority to inspectFollow-up question
Token approvalNamed spender and permitted amountCan that spender exercise the allowance later through another call?
Permit signatureTyped payload, domain and consumption ruleWhere and when can the signature be used?
Operator approvalScope of assets or operations grantedDoes the authority extend beyond the single item shown?
Administrative actionRole or configuration changedWhich future behavior becomes possible after the change?
Account extension or moduleAdditional execution authority under the account designCan another path act without the same visible approval flow?

Do not treat a simulation of a signature's consuming transaction as a complete analysis of the signature's lifetime. The authorization may remain valid under another state until it expires or is consumed. A replay rule that appears harmless in one preview can matter later. The signature replay guide explains the separate questions of domain binding and one-time consumption.

When the wallet cannot decode the payload, preserve that uncertainty. An unknown method or typed-data structure should not be presented as an ordinary transfer merely because the destination is a token-related address. The reader needs a verified interpretation of the operation before the preview can support a meaningful decision.

An exact amount can reduce one form of exposure while leaving others. A spender with a narrow allowance may still be the wrong recipient, and an administrative signature may not have a meaningful token amount at all. Review the authority in the contract's own terms rather than applying a single warning rule to every signature type.

The authority and backdoor analysis is useful when an operation grants a less obvious execution path. It separates the existence of a power from claims about malicious intent, which a simulation alone cannot establish.

Failure and unknown results

A simulator can fail before it evaluates the intended action. The provider may not support the method, the requested state may be unavailable or the request may exceed a resource limit. These are different from a contract revert under a valid request. The interface should preserve the distinction because the next investigation step differs.

A contract revert is also conditional. It can reflect an invalid operation, insufficient balance, an expired authorization, a paused dependency or state that changed since a quote was prepared. The revert reason may help identify the path, but it is not always complete or trustworthy as a human explanation. Read the target and the inputs alongside it.

Classify the result before deciding what it means
Result classWhat is knownWhat remains unknown
Successful simulated executionThe call completed under the selected environmentFuture inclusion and the suitability of the granted authority
Contract revertThe call rejected under the selected environmentWhether another state or corrected input changes the result
Provider or method errorThe intended evaluation did not completeThe contract's behavior for that request
Missing historical stateThe requested context could not be reconstructedThe result under the intended historical conditions
Partial interpretationSome output was obtained but not fully decodedUndisplayed permissions or application-specific effects

Geth's validation setting changes the question being asked. With validation disabled, the documented behavior is closer to eth_call. With it enabled, additional normal execution checks apply, with the documented exceptions for contract-sender and signature checks. Record the setting rather than describing all successful simulations as equivalent.

Our fixture census found 92 published eth_simulateV1 fixture files in the Ethereum execution API repository. Their filenames include validation, override and nonce scenarios. This shows that the reference test inventory distinguishes those concerns. It does not establish that a wallet or remote provider implements the method completely or has passed those fixtures.

A product should avoid turning an unavailable result into a positive badge. If the provider times out or the method is unsupported, the correct state is unknown for that attempted evaluation. The honeypot detection guide discusses a related problem: failed or incomplete simulation is not the same observation as a tested clean result.

When two providers disagree, compare the exact method, block state, overrides and validation settings. If those match, preserve both responses and investigate the implementation or interpretation difference. Do not average the results into a new confidence score without a defined model and evidence for it.

A preflight review workflow

Begin by confirming the action independently of the preview. Identify the intended chain, application, contract and operation from a trusted source. Then compare that intent with the exact transaction or signature request. A simulator can faithfully execute a maliciously substituted request; correctness of execution is not correctness of the user's intent.

Save the request and the relevant context before signing. A useful record includes target, caller, calldata, value, chain and the state reference used for the preview. For typed data, preserve the structured payload and domain. Do not publish sensitive account data unnecessarily, but retain enough local evidence to compare the eventual transaction with what was reviewed.

A preflight record for an accountable review
StepEvidence to inspectCondition that needs clarification
Confirm identityApplication source, chain and deployed targetAn address or implementation cannot be verified
Decode intentFunction or typed-data fields and recipientThe request cannot be interpreted confidently
Inspect authorityAllowance, role or signature scopeThe effect extends beyond the intended action
Read simulation contextState reference, validation and overridesThe result depends on unexplained assumptions
Check outputTransfers, state effects, errors and unknownsThe interface omits a material permission or failure
Verify executionIncluded transaction and resulting stateThe committed action differs from the reviewed request

For a time-sensitive operation, rerun the preview after a material input change. A different amount, route, recipient or target is a different request. If the application rebuilds the transaction after the preview, compare the final payload rather than assuming the earlier result still applies. An updated quote does not automatically imply an updated authority review.

Use slippage and deadline controls where they are part of the application's supported design, but understand their scope. They can constrain particular execution outcomes without proving that the target, spender or token is appropriate. The token behavior guide explains why transfer restrictions and privileged changes need separate evidence.

A team integrating simulation into a product should commission review of the full data path: request construction, provider call, output decoding and final signing payload. The Pharos Production member profile provides one technical service reference. Ask for evidence that the displayed preview corresponds to the exact request the user ultimately authorizes.

After execution, verify the receipt and the resulting state appropriate to the action. For an approval, that may mean checking the allowance rather than looking for an immediate balance change. For a cross-chain operation, a source receipt may leave a destination effect pending. Preserve these distinctions in the user-facing status.

The strongest conclusion a preview can support is conditional and specific: this request produced these effects under this recorded environment. That is useful evidence. Keeping the conditions visible makes the preview more reliable as a decision aid without promising control over future state or transaction ordering.

Original fixture census: the reference scenarios are distinct

Method

Source and selection
Select every .io fixture under tests/eth_simulateV1/ in the complete Ethereum execution-apis tree at the recorded commit. Classify case-insensitive filename signals for validation, override and nonce. Categories overlap.
Retrieved
Observation
Complete repository tree at the recorded commit; all files outside tests/eth_simulateV1/*.io excluded.

Results

Recorded observations on
Fixture-name signalFilesInterpretation
All eth_simulateV1 fixtures92Complete .io file inventory under the method directory
Validation signal12Filename contains a validation-related string
Override signal14Filename contains override
Nonce signal7Filename contains nonce
Fixtures executed hereNot runInventory inspection only

The categories overlap: a single fixture name can mention both nonce and validation. Their counts must not be added to infer unique scenario coverage. We retained every selected path and its repository blob identifier so another reviewer can reproduce the inventory.

The result is an index for further testing, not a compatibility certification. A product team can use the named scenarios to decide which provider behaviors to verify, then run appropriate tests in its own controlled environment. Our research did not send transactions or claim that any wallet passed the suite.

Limits

  • Filename classification only; it does not establish every assertion inside a fixture.
  • No client, wallet or remote RPC service was tested against the fixture set.
  • The selected repository commit fixes the inventory; later revisions can add or rename scenarios.

The reproducible record is kept in the repository: seo/research/articles-42-51-2026-09-06/surveys.py and seo/research/articles-42-51-2026-09-06/survey-51.json. These file paths are not public downloads.

Frequently asked questions

Can a hardware wallet replace transaction simulation?

It protects signing keys under its design, while simulation analyzes a proposed execution. Review the device's displayed request and the simulation assumptions separately; the two controls answer different questions.

What if a multisignature proposal executes much later than its preview?

Reassess the final payload and relevant state near execution, especially after upgrades or parameter changes. Preserve the earlier review as history rather than treating it as a current execution guarantee.

Can a read-only simulation leak information to its provider?

The provider receives the request and context sent to it. A team should account for that data flow when handling private strategy or account information, even though the call does not itself commit a blockchain transaction.

Comments

8
  1. Tomas R.

    A preview with no immediate asset movement can still authorize a future spend. The spender and allowance belong beside the balance changes in the review.

  2. Jules C.

    The resolved block identity is an important part of the evidence. Saving only a request that used latest would make the result harder to reproduce later.

  3. Nora B.

    Could the interface show provider failure separately from a contract revert? The user needs to know whether the intended call was actually evaluated. An unavailable provider should leave the preview visibly incomplete. A contract revert should retain the evaluated call context. I would test both states so neither is mistaken for a successful safety check.

  4. Clara H.

    I would want the simulation result to distinguish its assumed caller from evidence that a real signature authorizes the request.

  5. Noah G.

    Overrides need to be retained with the preview. A successful run against altered balances or storage can answer a useful test question while describing a state that is not currently deployed.

  6. Theo Z.

    For a batch, I would inspect how earlier approvals and state changes affect the calls that follow them.

  7. Lena Y.

    The fixture count describes the repository's scenarios, not a provider success rate. Keeping that boundary explicit makes the measurement easier to interpret. I would link a few representative fixtures so readers can inspect what the scenarios actually exercise.

  8. Sara L.

    Even a faithful simulation can execute the wrong request. Comparing the chain and calldata with the intended action has to happen before treating the preview as confirmation. I would include a request aimed at the wrong recipient in the interface tests. The review flow should make that mismatch visible even if the simulated execution succeeds.

Leave a comment

Share a question or observation about this article.

10 to 3,000 characters.