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:
- You can simulate transactions at an intermediate block state (e.g., after a portion of real transactions has executed).
- You can simulate sequential, interdependent transactions, even across blocks.
- 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 successfulerror
— 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 aseth_call
(fields likefrom
,to
,gas
,data
, etc.)blockOverride
(optional): Customize block-level execution context:blockNumber
: Base block number (following bundles auto-increment)blockHash
: A dictionary mappingblockNumber
to a fake hash (for testingBLOCKHASH
)coinbase
: Override miner addresstimestamp
: Override block timestamp (defaults to base +1 per bundle)difficulty
: Override difficultygasLimit
: Override gas limitbaseFee
: 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