Skip to main content
eth_simulateV1 is the standard multi-block simulation method from the Ethereum execution APIs specification. It simulates a sequence of blocks, each containing a batch of calls, on top of a base block, without sending anything on chain. Calls within a block execute sequentially and share state, and each simulated block builds on the previous one. The method runs on Node RPC and Virtual Environments; see the full JSON-RPC reference for every method and network. A small set of networks does not support it; see Network availability. Use eth_simulateV1 when you need a portable, spec-standard simulation that returns block-shaped results. For decoded logs, call traces, and asset and balance changes, use tenderly_simulateTransaction for a single transaction or tenderly_simulateBundle for a sequence of transactions.

eth_simulateV1

Simulates a sequence of blocks on top of the given base block. Each block contains a batch of calls: call N sees the state changes of call N-1, and every block after the first builds on the block before it. Params
  1. Simulation payload OBJECT
    • blockStateCalls ARRAY of Block state call OBJECT: the sequence of blocks to simulate, in order
      • blockOverrides (optional) OBJECT: the set of header fields to override in this block
        • number (optional) STRING: hex, overrides the block number
        • difficulty (optional) STRING: hex, overrides the block difficulty
        • time (optional) STRING: hex, overrides the block timestamp
        • gasLimit (optional) STRING: hex, overrides the gas limit
        • coinbase (optional) STRING: hex, overrides the block miner
        • random (optional) STRING: hex, overrides the value that feeds into the PREVRANDAO opcode
        • baseFee (optional) STRING: hex, overrides the block base fee
        • excessBlobGas (optional) STRING: hex, overrides the excess blob gas
        • blobGasUsed (optional) STRING: hex, overrides the blob gas used
      • stateOverrides (optional) MAP: mapping from an account (address) to override specification. Set state overrides on the first block entry; see Tenderly-specific behavior
        • key STRING: the account this override applies to
        • value OBJECT: the override specification
          • balance (optional) STRING: hex encoded balance override for the account in wei
          • nonce (optional) STRING: hex encoded nonce override for the account
          • code (optional) STRING: data of the code override for the account
          • stateDiff (optional) MAP: mapping of storage key to storage value override
            • key STRING: the storage key
            • value STRING: the value override for the given storage key
      • calls ARRAY of Transaction call OBJECT: executed in order; each call observes the state changes of the calls before it
        • from (optional) STRING: hex encoded address; defaults to the zero address
        • to (optional) STRING: hex encoded address
        • gas (optional) STRING: hex encoded gas limit for the call
        • gasPrice (optional) STRING: hex, the gas price willing to be paid by the sender in wei
        • maxFeePerGas (optional) STRING: hex, the maximum total fee per gas the sender is willing to pay (includes the network / base fee and miner / priority fee) in wei
        • maxPriorityFeePerGas (optional) STRING: hex, the maximum fee per gas the sender is willing to pay to miners in wei
        • value (optional) STRING: hex encoded value in wei; defaults to 0x0
        • input (optional) STRING: hex encoded call data; data is accepted as a deprecated alias, and input takes precedence when both are set
        • nonce (optional) STRING: hex encoded nonce
        • type (optional) STRING: hex encoded transaction type
        • accessList (optional) ARRAY of Access list entry OBJECT
          • address STRING: hex encoded address
          • storageKeys ARRAY of STRING: representation of 32 byte hex encoded storage keys
        • maxFeePerBlobGas (optional) STRING: hex, the maximum fee per blob gas in wei
        • blobVersionedHashes (optional) ARRAY of STRING: 32 byte hex encoded blob versioned hashes
        • authorizationList (optional) ARRAY: EIP-7702 authorization tuples
    • returnFullTransactions (optional) BOOLEAN: when true, result blocks contain full transaction objects instead of transaction hashes
  2. Base block number (optional) The block on top of which the simulation runs. Defaults to latest. Either:
    • STRING Block number
    • ENUM of Block tag earliest|finalized|safe|latest|pending
Example The request simulates two blocks. The first block funds a sender with a state override, then sends ETH and wraps 1 ETH into WETH; the second block sets a custom timestamp and transfers the WETH minted in the first block.
example.json
{
  "id": 0,
  "jsonrpc": "2.0",
  "method": "eth_simulateV1",
  "params": [
    {
      "blockStateCalls": [
        {
          "stateOverrides": {
            "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2": {
              "balance": "0x3635c9adc5dea00000"
            }
          },
          "calls": [
            {
              "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
              "to": "0x1111111111111111111111111111111111111111",
              "value": "0x1bc16d674ec80000"
            },
            {
              "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
              "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
              "value": "0xde0b6b3a7640000",
              "input": "0xd0e30db0"
            }
          ]
        },
        {
          "blockOverrides": { "time": "0x6ae00000" },
          "calls": [
            {
              "from": "0xe2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2",
              "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
              "input": "0xa9059cbb00000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000de0b6b3a7640000"
            }
          ]
        }
      ]
    },
    "latest"
  ]
}
Result ARRAY of Block result OBJECT, one per blockStateCalls entry, in order. Each block result carries the standard block header fields returned by eth_getBlockByNumber (number, hash, parentHash, timestamp, gasLimit, gasUsed, baseFeePerGas, logsBloom, miner, and so on) plus:
  • transactions ARRAY: transaction hashes of the simulated calls, or full transaction objects when returnFullTransactions is true
  • calls ARRAY of Call result OBJECT, one per call, in order:
    • returnData STRING: hex encoded return data of the call
    • logs ARRAY of Log OBJECT: events emitted by the call (address, topics, data, blockNumber, transactionHash, transactionIndex, blockHash, logIndex, removed); empty for reverted calls
    • gasUsed STRING: hex encoded amount of gas consumed by the call
    • status STRING: 0x1 for success, 0x0 for failure
    • error OBJECT: present only when the call fails
      • code NUMBER: error code
      • message STRING: error message, including the revert reason when available

Tenderly-specific behavior

The Tenderly implementation deviates from the reference execution-apis specification in the following ways:
  • validation is not supported. Setting validation: true returns the error validation flag is not supported. Simulation always runs in non-validating mode: nonce, balance, and fee requirements are not enforced on the calls.
  • traceTransfers is not supported. Setting traceTransfers: true returns the error traceTransfers flag is not supported. No synthetic ETH transfer logs are produced.
  • state overrides are not supported. The state field (full storage replacement) in a state override returns a not supported error. Use stateDiff to override individual storage slots.
  • State overrides apply from the first block. Set stateOverrides on the first blockStateCalls entry; stateOverrides on subsequent entries are not applied.
  • Per-call gas is clamped. A gas value above the block gas limit plus 600,000,000 is clamped to that ceiling instead of being rejected.
  • No block or call count limits. There is no enforced maximum on the number of blockStateCalls entries or on the number of calls per block.
  • Transaction hashes are synthetic. The hashes in result blocks identify the simulated calls but are not hashes of signed transactions.
  • Block progression. Each simulated block after the first gets number = previous + 1 and a parentHash chained to the previous result, with the base fee and gas limit recomputed. The auto-generated timestamp is the node’s wall-clock time, so set blockOverrides.time explicitly when timestamps matter. Overridden block numbers and timestamps are applied verbatim; monotonicity is not validated. When the first block entry supplies blockOverrides without number, the block number defaults to the base block plus 1.

Network availability

eth_simulateV1 is available on Node RPC networks and Virtual Environments, except on the following networks, where the underlying network nodes do not support the method:
  • ApeChain
  • Avalanche C-Chain
  • Avalanche C-Chain Fuji
  • Blast
  • Curtis
  • Flare
  • Immutable
  • Immutable Testnet
  • Lens
  • Lens Testnet
  • Metis Andromeda
  • Metis Sepolia
  • Monad
  • Monad Testnet
  • Moonbase Alpha
  • Moonbeam
  • Moonriver
  • Scroll Mainnet
  • Scroll Sepolia
  • Sonic
  • Sonic Testnet
  • Stable
  • Stable Testnet
  • ZKsync
  • ZKsync Sepolia