> For a complete page index, fetch https://docs.conduit.xyz/llms.txt

# eth_simulateV1

POST https://rpc.plume.org/YOUR_API_KEY
Content-Type: application/json

Simulates one or more virtual blocks containing grouped calls, without creating transactions on-chain. Each block can include optional block-level overrides (timestamp, baseFee, etc.) and per-address state overrides (balance, nonce, code, storage). Returns the resulting simulated blocks with call results, logs, and state changes.

⚡ Compute Units: [10 CU](https://docs.conduit.xyz/rpc-nodes/information/compute-units)

Reference: https://docs.conduit.xyz/rpc-nodes/json-rpc-reference/eth-simulate-v-1

## Request

### Body (application/json)

This endpoint expects an object.

- `payload` (Simulate, required) — Simulation payload containing blockStateCalls (required) and optional flags
- `blockIdentifier` (BlockNumberOrTag, optional) — Block number, or one of "latest", "earliest", "pending", "finalized", "safe"

## Response

### 200

Array of simulated block objects, one per entry in blockStateCalls. Each block includes the full block header fields and the per-call results in the same order as the input calls array.

- `list of EthSimulateV1ResultItems`

## Types

### Simulate

Payload for `eth_simulateV1`. Each entry in `blockStateCalls` describes a virtual block: an optional set of block-header overrides, an optional set of per-address state overrides, and an ordered list of calls to execute against that state.

- `traceTransfers` (boolean, optional) — If true, ETH transfers are reported as synthetic logs in the response.
- `validation` (boolean, optional) — If true, apply the same full validation the node uses when accepting real transactions (signature checks, nonce checks, etc.). Defaults to false for permissive simulation.
- `returnFullTransactions` (boolean, optional) — If true, the response includes full transaction objects in addition to per-call results.
- `blockStateCalls` (list of SimulateBlockStateCallsItems, optional) — Ordered list of virtual blocks to simulate. Each block runs on top of the previous block's post-state.

### BlockNumberOrTag

### EthSimulateV1ResultItems

Simulated block. Includes the full block header plus a `calls` array.

- `number` (string, required)
- `hash` (string, required)
- `calls` (list of EthSimulateV1ResultItemsCallsItems, required)
- `parentHash` (string, optional)
- `timestamp` (string, optional)
- `gasLimit` (string, optional)
- `gasUsed` (string, optional)
- `baseFeePerGas` (string, optional)
- `prevRandao` (string, optional)
- `miner` (string, optional)

### SimulateBlockStateCallsItems

- `blockOverrides` (BlockOverride, optional) — Block-header field overrides applied to this simulated block. See the shared `BlockOverride` schema.
- `stateOverrides` (StateOverride, optional) — Per-address state overrides applied before this block's calls execute. See the shared `StateOverride` schema.
- `calls` (list of CallObject, optional) — Calls to execute within this simulated block, in order.

### EthSimulateV1ResultItemsCallsItems

Per-call simulation result, in the same order as the input calls.

- `returnData` (string, optional) — ABI-encoded return data (or revert data if status is 0x0).
- `gasUsed` (string, optional)
- `logs` (list of Log, optional)
- `status` (string, optional) — 0x1 for success, 0x0 for revert.
- `error` (EthSimulateV1ResultItemsCallsItemsError, optional) — Present when the call reverted. JSON-RPC-style error object.

### BlockOverride

Block-header field overrides applied during simulation. All fields optional. Forwarded to the backend as-is; the backend honors them during execution.

- `number` (string, optional) — Override block number.
- `difficulty` (string, optional) — Override block difficulty (pre-Merge concept; ignored on post-Merge chains).
- `time` (string, optional) — Override block timestamp (Unix seconds).
- `gasLimit` (string, optional) — Override block gas limit.
- `feeRecipient` (string, optional) — Override block fee recipient (formerly coinbase / miner).
- `prevRandao` (string, optional) — Override prevRandao (post-Merge replacement for difficulty).
- `baseFeePerGas` (string, optional) — Override block base fee per gas.
- `blobBaseFee` (string, optional) — Override block blob base fee (EIP-4844).
- `beaconRoot` (string, optional) — Override the EIP-4788 parent beacon block root.
- `withdrawals` (list of Withdrawal, optional) — Override the block's withdrawals (EIP-4895).

### StateOverride

- `balance` (string, optional) — Override the account's balance (wei, hex-encoded).
- `nonce` (string, optional) — Override the account's nonce.
- `code` (string, optional) — Override the account's contract code (raw bytes, hex-encoded).
- `state` (map from string to string, optional) — Replace the account's storage entirely. Map of 32-byte slot key to 32-byte value (both hex). Any slot not listed reads as zero.
- `stateDiff` (map from string to string, optional) — Overlay specific storage slots without clearing the rest. Map of 32-byte slot key to 32-byte value.

### CallObject

A transaction call object. All fields are optional. Both `data` and `input` are accepted for backwards compatibility — `input` is the canonical field per the Ethereum execution spec.

- `from` (string, optional) — 20-byte sender address (optional)
- `to` (string, optional) — 20-byte target address (optional for contract creation)
- `gas` (string, optional) — Gas limit as hex-encoded integer (optional)
- `gasPrice` (string, optional) — Legacy gas price in wei as hex-encoded integer (optional)
- `maxFeePerGas` (string, optional) — EIP-1559 max total fee per gas in wei as hex-encoded integer (optional)
- `maxPriorityFeePerGas` (string, optional) — EIP-1559 max miner tip per gas in wei as hex-encoded integer (optional)
- `maxFeePerBlobGas` (string, optional) — EIP-4844 max fee per blob gas in wei as hex-encoded integer (optional)
- `value` (string, optional) — Value in wei as hex-encoded integer (optional)
- `data` (string, optional) — ABI-encoded call data, hex-encoded (optional). Alias for `input`; prefer `input` for new clients.
- `input` (string, optional) — ABI-encoded call data, hex-encoded (optional). Canonical name per Ethereum execution spec; alias of `data`.
- `nonce` (string, optional) — Sender nonce as hex-encoded integer (optional, ignored by `eth_call` but accepted)
- `type` (string, optional) — Transaction type as hex-encoded byte (optional): 0x0 legacy, 0x1 EIP-2930 access list, 0x2 EIP-1559, 0x3 EIP-4844 blob, 0x4 EIP-7702 authorization
- `chainId` (string, optional) — Chain ID as hex-encoded integer (optional)
- `accessList` (list of CallObjectAccessListItems, optional) — EIP-2930 access list (optional). Pre-declaring storage slots the transaction will touch reduces gas cost.
- `blobs` (list of string, optional) — EIP-4844 blob data, raw 128KB blobs as hex-encoded bytes (optional). Typically only used by builder/sequencer code paths.
- `blobVersionedHashes` (list of string, optional) — EIP-4844 versioned hashes of blob commitments (optional). One hash per blob.
- `authorizationList` (list of CallObjectAuthorizationListItems, optional) — EIP-7702 authorization list (optional). Each entry is a signed authorization tuple.

### Log

- `transactionHash` (string, required)
- `removed` (boolean, optional)
- `logIndex` (string, optional)
- `transactionIndex` (string, optional)
- `blockHash` (string, optional)
- `blockNumber` (string, optional)
- `blockTimestamp` (string, optional)
- `address` (string, optional)
- `data` (string, optional)
- `topics` (list of string, optional)

### EthSimulateV1ResultItemsCallsItemsError

Present when the call reverted. JSON-RPC-style error object.

- `code` (integer, required) — JSON-RPC error code
- `message` (string, required) — Human-readable error message
- `data` (string, optional) — Raw revert data, if any

### Withdrawal

A validator withdrawal object, as introduced by EIP-4895 (Shanghai)

- `index` (string, required) — Monotonically increasing withdrawal index, hex-encoded
- `validatorIndex` (string, required) — Index of the validator that generated the withdrawal, hex-encoded
- `address` (string, required) — 20-byte recipient address for the withdrawn ether
- `amount` (string, required) — Withdrawal amount in gwei, hex-encoded

### CallObjectAccessListItems

- `address` (string, required)
- `storageKeys` (list of string, required)

### CallObjectAuthorizationListItems

- `chainId` (string, required)
- `address` (string, required)
- `nonce` (string, required)
- `yParity` (string, required)
- `r` (string, required)
- `s` (string, required)

## Examples

**Request**

```json
[
  {
    "blockStateCalls": [
      {
        "calls": [
          {
            "data": "0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763",
            "from": "0xee03f376ad26948d24c2e3ae76c8d95c77930763",
            "to": "0xdddd73f5df1f0dc31373357beac77545dc5a6f3f",
            "value": "0x0"
          }
        ]
      }
    ]
  },
  "latest"
]
```

**Response**

```json
{
  "id": "1",
  "jsonrpc": "2.0",
  "result": [
    {
      "baseFeePerGas": "0x0",
      "blobGasUsed": "0x0",
      "calls": [
        {
          "gasUsed": "0x5e0f",
          "logs": [],
          "returnData": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "status": "0x1"
        }
      ],
      "difficulty": "0x1",
      "excessBlobGas": "0x0",
      "extraData": "0x2e7312f2ca373866f5266f0efb1d37f681088cad1ca26cf74fcfa0fb46f6dae5",
      "gasLimit": "0x4000000000000",
      "gasUsed": "0x5e0f",
      "hash": "0x0ee3f1d14045df252bf3c41e8e7cc0fcd5dde51729b7254e7ad0428a2357ddea",
      "l1BlockNumber": "0x16e1bd9",
      "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
      "miner": "0xa4b000000000000000000073657175656e636572",
      "mixHash": "0x000000000000878900000000016e1bd900000000000000200000000000000000",
      "nonce": "0x0000000000000000",
      "number": "0x28401d3",
      "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x7b99b97aa538547a6e4e38f011f250da6d05675461e92d25819f08c756872f83",
      "receiptsRoot": "0xabd826bd9ea03f224d31628176feac949aab47df7ac37ed52d00dfb879957333",
      "sendCount": "0x8789",
      "sendRoot": "0x2e7312f2ca373866f5266f0efb1d37f681088cad1ca26cf74fcfa0fb46f6dae5",
      "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
      "size": "0x2aa",
      "stateRoot": "0xa3090524e6afca82f55410510164f9f1192cb2fa4d75af6f9e1ad5a170820db1",
      "timestamp": "0x693b700c",
      "transactions": [
        "0x5af4c4c1c03fea4fa2b2815af5a15f2c38a1b866d37f66b0d1a4c42b0844eea6"
      ],
      "transactionsRoot": "0xd55e6876e8da7f48a86cb535f6d6ed8baa64699a29c11d69a1442d0b4c54745c",
      "uncles": []
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://rpc.plume.org/YOUR_API_KEY"

payload = [{ "blockStateCalls": [{ "calls": [
                    {
                        "data": "0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763",
                        "from": "0xee03f376ad26948d24c2e3ae76c8d95c77930763",
                        "to": "0xdddd73f5df1f0dc31373357beac77545dc5a6f3f",
                        "value": "0x0"
                    }
                ] }] }, "latest"]
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://rpc.plume.org/YOUR_API_KEY';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '[{"blockStateCalls":[{"calls":[{"data":"0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763","from":"0xee03f376ad26948d24c2e3ae76c8d95c77930763","to":"0xdddd73f5df1f0dc31373357beac77545dc5a6f3f","value":"0x0"}]}]},"latest"]'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://rpc.plume.org/YOUR_API_KEY"

	payload := strings.NewReader("[\n  {\n    \"blockStateCalls\": [\n      {\n        \"calls\": [\n          {\n            \"data\": \"0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"from\": \"0xee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"to\": \"0xdddd73f5df1f0dc31373357beac77545dc5a6f3f\",\n            \"value\": \"0x0\"\n          }\n        ]\n      }\n    ]\n  },\n  \"latest\"\n]")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://rpc.plume.org/YOUR_API_KEY")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "[\n  {\n    \"blockStateCalls\": [\n      {\n        \"calls\": [\n          {\n            \"data\": \"0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"from\": \"0xee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"to\": \"0xdddd73f5df1f0dc31373357beac77545dc5a6f3f\",\n            \"value\": \"0x0\"\n          }\n        ]\n      }\n    ]\n  },\n  \"latest\"\n]"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://rpc.plume.org/YOUR_API_KEY")
  .header("Content-Type", "application/json")
  .body("[\n  {\n    \"blockStateCalls\": [\n      {\n        \"calls\": [\n          {\n            \"data\": \"0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"from\": \"0xee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"to\": \"0xdddd73f5df1f0dc31373357beac77545dc5a6f3f\",\n            \"value\": \"0x0\"\n          }\n        ]\n      }\n    ]\n  },\n  \"latest\"\n]")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://rpc.plume.org/YOUR_API_KEY', [
  'body' => '[
  {
    "blockStateCalls": [
      {
        "calls": [
          {
            "data": "0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763",
            "from": "0xee03f376ad26948d24c2e3ae76c8d95c77930763",
            "to": "0xdddd73f5df1f0dc31373357beac77545dc5a6f3f",
            "value": "0x0"
          }
        ]
      }
    ]
  },
  "latest"
]',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://rpc.plume.org/YOUR_API_KEY");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "[\n  {\n    \"blockStateCalls\": [\n      {\n        \"calls\": [\n          {\n            \"data\": \"0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"from\": \"0xee03f376ad26948d24c2e3ae76c8d95c77930763\",\n            \"to\": \"0xdddd73f5df1f0dc31373357beac77545dc5a6f3f\",\n            \"value\": \"0x0\"\n          }\n        ]\n      }\n    ]\n  },\n  \"latest\"\n]", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [["blockStateCalls": [["calls": [
          [
            "data": "0x70a08231000000000000000000000000000000000000000000000000ee03f376ad26948d24c2e3ae76c8d95c77930763",
            "from": "0xee03f376ad26948d24c2e3ae76c8d95c77930763",
            "to": "0xdddd73f5df1f0dc31373357beac77545dc5a6f3f",
            "value": "0x0"
          ]
        ]]]], "latest"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://rpc.plume.org/YOUR_API_KEY")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```