🔵 Base
eth_callMany

eth_callMany RPC Method

The eth_callMany method lets you simulate a list of transaction bundles without actually broadcasting them to the blockchain.
It extends eth_call (opens in a new tab) by enabling more advanced use cases:

  1. You can simulate transactions at an intermediate block state (e.g., after a portion of real transactions has executed).
  2. You can simulate sequential, interdependent transactions, even across blocks.
  3. You can override block header fields like coinbase, blockHash, difficulty, timestamp, and more.

Need RPC API keys?

Get 12.5M archival requests for free today.


🔁 Returns

The response contains a nested array of results. Each simulated transaction returns either:

  • value — The hex return value of the call, if successful
  • error — The revert reason, if the transaction failed
[
  [
    {
      "value": "..."
    }
  ]
]

🔧 Parameters

1. bundles (required)

An array of bundles. Each bundle includes:

  • transactions: A list of call objects using the same structure as eth_call (fields like from, to, gas, data, etc.)
  • blockOverride (optional): Customize block-level execution context:
    • blockNumber: Base block number (following bundles auto-increment)
    • blockHash: A dictionary mapping blockNumber to a fake hash (for testing BLOCKHASH)
    • coinbase: Override miner address
    • timestamp: Override block timestamp (defaults to base +1 per bundle)
    • difficulty: Override difficulty
    • gasLimit: Override gas limit
    • baseFee: Override base fee

2. simulation context (required)

Defines the simulation environment:

  • blockNumber or Tag: Use a hex number or one of the tags: "latest", "earliest", "pending", "safe", or "finalized"
    (Note: "safe" and "finalized" are only supported on Ethereum and Arbitrum One.)
  • transactionIndex: Defines where your simulated transactions appear. -1 = after the entire real block.

3. state overrides (optional)

An object mapping Ethereum addresses to state override configurations. This lets you test against altered balances, storage, etc.

Example:

{
  "0xAddress": {
    "balance": "0x...",
    "nonce": "0x...",
    "code": "0x...",
    "storage": {
      "0xKEY": "0xVALUE"
    }
  }
}

4. timeout (optional)

Maximum runtime for the simulation, in milliseconds.
Defaults to 5000 (5 seconds).


📤 Request

POST https://base-mainnet.chainnodes.org/YOUR-API-KEY

📥 Example

💡 Confusing?

Ask our experienced blockchain developers in Telegram

Replace YOUR-API-KEY with your key from the CHAINNODES Dashboard (opens in a new tab).
You can replace base-mainnet with another supported network.

curl https://base-mainnet.chainnodes.org/YOUR-API-KEY \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc":"2.0",
    "method":"eth_callMany",
    "params":[
      [
        {
          "transactions":[
            {
              "from":"0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5",
              "to":"0xdAC17F958D2ee523a2206206994597C13D831ec7",
              "gas":"0x92c0",
              "gasPrice":"0x7896e72a000",
              "value":"0x0",
              "data":"0x70a0823100000000000000000000000047ac0fb4f2d84898e4d9e7b4dab3c24507a6d503"
            }
          ],
          "blockOverride": {
            "blockNumber": "0xe39dd0"
          }
        }
      ],
      {
        "blockNumber": "0x103434E",
        "transactionIndex": 234
      }
    ],
    "id":1
  }'

📦 Response Body

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    [
      {
        "value": "000000000000000000000000000000000000000000000000000470de54da7138"
      }
    ]
  ]
}

JSON-RPC Base API Documentation by CHAINNODES is based on Erigon node client. Contact us if you are interested in specific methods that are only available on geth, besu, Nethermind or reth