eth_simulateV1
curl --request POST \
--url https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/ \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "eth_simulateV1",
"params": [
{
"blockStateCalls": [
{
"stateOverrides": {
"0x5d20879655df3c1e04ab111af0009ad650e762f0": {
"balance": "0x56bc75e2d63100000"
}
},
"calls": [
{
"from": "0x5d20879655df3c1e04ab111af0009ad650e762f0",
"to": "0x000000000000000000000000000000000000dEaD",
"gas": "0x5208",
"value": "0xde0b6b3a7640000"
}
]
}
],
"traceTransfers": true
},
"latest"
]
}
'import requests
url = "https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "eth_simulateV1",
"params": [
{
"blockStateCalls": [
{
"stateOverrides": { "0x5d20879655df3c1e04ab111af0009ad650e762f0": { "balance": "0x56bc75e2d63100000" } },
"calls": [
{
"from": "0x5d20879655df3c1e04ab111af0009ad650e762f0",
"to": "0x000000000000000000000000000000000000dEaD",
"gas": "0x5208",
"value": "0xde0b6b3a7640000"
}
]
}
],
"traceTransfers": True
},
"latest"
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 1,
jsonrpc: '2.0',
method: 'eth_simulateV1',
params: [
{
blockStateCalls: [
{
stateOverrides: {'0x5d20879655df3c1e04ab111af0009ad650e762f0': {balance: '0x56bc75e2d63100000'}},
calls: [
{
from: '0x5d20879655df3c1e04ab111af0009ad650e762f0',
to: '0x000000000000000000000000000000000000dEaD',
gas: '0x5208',
value: '0xde0b6b3a7640000'
}
]
}
],
traceTransfers: true
},
'latest'
]
})
};
fetch('https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => 1,
'jsonrpc' => '2.0',
'method' => 'eth_simulateV1',
'params' => [
[
'blockStateCalls' => [
[
'stateOverrides' => [
'0x5d20879655df3c1e04ab111af0009ad650e762f0' => [
'balance' => '0x56bc75e2d63100000'
]
],
'calls' => [
[
'from' => '0x5d20879655df3c1e04ab111af0009ad650e762f0',
'to' => '0x000000000000000000000000000000000000dEaD',
'gas' => '0x5208',
'value' => '0xde0b6b3a7640000'
]
]
]
],
'traceTransfers' => true
],
'latest'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/"
payload := strings.NewReader("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_simulateV1\",\n \"params\": [\n {\n \"blockStateCalls\": [\n {\n \"stateOverrides\": {\n \"0x5d20879655df3c1e04ab111af0009ad650e762f0\": {\n \"balance\": \"0x56bc75e2d63100000\"\n }\n },\n \"calls\": [\n {\n \"from\": \"0x5d20879655df3c1e04ab111af0009ad650e762f0\",\n \"to\": \"0x000000000000000000000000000000000000dEaD\",\n \"gas\": \"0x5208\",\n \"value\": \"0xde0b6b3a7640000\"\n }\n ]\n }\n ],\n \"traceTransfers\": true\n },\n \"latest\"\n ]\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(string(body))
}HttpResponse<String> response = Unirest.post("https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/")
.header("Content-Type", "application/json")
.body("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_simulateV1\",\n \"params\": [\n {\n \"blockStateCalls\": [\n {\n \"stateOverrides\": {\n \"0x5d20879655df3c1e04ab111af0009ad650e762f0\": {\n \"balance\": \"0x56bc75e2d63100000\"\n }\n },\n \"calls\": [\n {\n \"from\": \"0x5d20879655df3c1e04ab111af0009ad650e762f0\",\n \"to\": \"0x000000000000000000000000000000000000dEaD\",\n \"gas\": \"0x5208\",\n \"value\": \"0xde0b6b3a7640000\"\n }\n ]\n }\n ],\n \"traceTransfers\": true\n },\n \"latest\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/")
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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_simulateV1\",\n \"params\": [\n {\n \"blockStateCalls\": [\n {\n \"stateOverrides\": {\n \"0x5d20879655df3c1e04ab111af0009ad650e762f0\": {\n \"balance\": \"0x56bc75e2d63100000\"\n }\n },\n \"calls\": [\n {\n \"from\": \"0x5d20879655df3c1e04ab111af0009ad650e762f0\",\n \"to\": \"0x000000000000000000000000000000000000dEaD\",\n \"gas\": \"0x5208\",\n \"value\": \"0xde0b6b3a7640000\"\n }\n ]\n }\n ],\n \"traceTransfers\": true\n },\n \"latest\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"hash": "0x08056c21a4289203c987a823e9f79648efd5014b47b4157a7e3b7a0c751725bd",
"size": "0x274",
"calls": [
{
"logs": [
{
"data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000005d20879655df3c1e04ab111af0009ad650e762f0",
"0x000000000000000000000000000000000000000000000000000000000000dead"
],
"address": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"removed": false,
"logIndex": "0x0",
"blockHash": "0x08056c21a4289203c987a823e9f79648efd5014b47b4157a7e3b7a0c751725bd",
"blockNumber": "0x3f04c1c",
"transactionHash": "0x5e525a3eaa89d73043aa8bc45d09b5b47ee210dc62457f6b0bd41058eb5e118b",
"transactionIndex": "0x0"
}
],
"status": "0x1",
"gasUsed": "0x5208",
"returnData": "0x"
}
],
"miner": "0xa63dd8fc7303bdd6cd66a66a49d4171146f89809",
"nonce": "0x0000000000000000",
"number": "0x3f04c1c",
"uncles": [],
"gasUsed": "0x5208",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x8f0d180",
"extraData": "0x",
"logsBloom": "0x00000000000050000000000004000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000402000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"stateRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"timestamp": "0x6ab8d06a",
"difficulty": "0x0",
"parentHash": "0xd0e7e290eab315e8cc182e7aa156d504fb8a1e003abe238be2106a81e1751bc8",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"withdrawals": [],
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"transactions": [
"0x5e525a3eaa89d73043aa8bc45d09b5b47ee210dc62457f6b0bd41058eb5e118b"
],
"baseFeePerGas": "0x0",
"withdrawalsRoot": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"
}
]
}Monad node API
eth_simulateV1 | Monad
Monad API method that simulates a sequence of calls across one or more blocks with state and block overrides. Reference for eth_simulateV1 on Monad via Chainstack.
POST
/
eth_simulateV1
curl --request POST \
--url https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/ \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "eth_simulateV1",
"params": [
{
"blockStateCalls": [
{
"stateOverrides": {
"0x5d20879655df3c1e04ab111af0009ad650e762f0": {
"balance": "0x56bc75e2d63100000"
}
},
"calls": [
{
"from": "0x5d20879655df3c1e04ab111af0009ad650e762f0",
"to": "0x000000000000000000000000000000000000dEaD",
"gas": "0x5208",
"value": "0xde0b6b3a7640000"
}
]
}
],
"traceTransfers": true
},
"latest"
]
}
'import requests
url = "https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "eth_simulateV1",
"params": [
{
"blockStateCalls": [
{
"stateOverrides": { "0x5d20879655df3c1e04ab111af0009ad650e762f0": { "balance": "0x56bc75e2d63100000" } },
"calls": [
{
"from": "0x5d20879655df3c1e04ab111af0009ad650e762f0",
"to": "0x000000000000000000000000000000000000dEaD",
"gas": "0x5208",
"value": "0xde0b6b3a7640000"
}
]
}
],
"traceTransfers": True
},
"latest"
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 1,
jsonrpc: '2.0',
method: 'eth_simulateV1',
params: [
{
blockStateCalls: [
{
stateOverrides: {'0x5d20879655df3c1e04ab111af0009ad650e762f0': {balance: '0x56bc75e2d63100000'}},
calls: [
{
from: '0x5d20879655df3c1e04ab111af0009ad650e762f0',
to: '0x000000000000000000000000000000000000dEaD',
gas: '0x5208',
value: '0xde0b6b3a7640000'
}
]
}
],
traceTransfers: true
},
'latest'
]
})
};
fetch('https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => 1,
'jsonrpc' => '2.0',
'method' => 'eth_simulateV1',
'params' => [
[
'blockStateCalls' => [
[
'stateOverrides' => [
'0x5d20879655df3c1e04ab111af0009ad650e762f0' => [
'balance' => '0x56bc75e2d63100000'
]
],
'calls' => [
[
'from' => '0x5d20879655df3c1e04ab111af0009ad650e762f0',
'to' => '0x000000000000000000000000000000000000dEaD',
'gas' => '0x5208',
'value' => '0xde0b6b3a7640000'
]
]
]
],
'traceTransfers' => true
],
'latest'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/"
payload := strings.NewReader("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_simulateV1\",\n \"params\": [\n {\n \"blockStateCalls\": [\n {\n \"stateOverrides\": {\n \"0x5d20879655df3c1e04ab111af0009ad650e762f0\": {\n \"balance\": \"0x56bc75e2d63100000\"\n }\n },\n \"calls\": [\n {\n \"from\": \"0x5d20879655df3c1e04ab111af0009ad650e762f0\",\n \"to\": \"0x000000000000000000000000000000000000dEaD\",\n \"gas\": \"0x5208\",\n \"value\": \"0xde0b6b3a7640000\"\n }\n ]\n }\n ],\n \"traceTransfers\": true\n },\n \"latest\"\n ]\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(string(body))
}HttpResponse<String> response = Unirest.post("https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/")
.header("Content-Type", "application/json")
.body("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_simulateV1\",\n \"params\": [\n {\n \"blockStateCalls\": [\n {\n \"stateOverrides\": {\n \"0x5d20879655df3c1e04ab111af0009ad650e762f0\": {\n \"balance\": \"0x56bc75e2d63100000\"\n }\n },\n \"calls\": [\n {\n \"from\": \"0x5d20879655df3c1e04ab111af0009ad650e762f0\",\n \"to\": \"0x000000000000000000000000000000000000dEaD\",\n \"gas\": \"0x5208\",\n \"value\": \"0xde0b6b3a7640000\"\n }\n ]\n }\n ],\n \"traceTransfers\": true\n },\n \"latest\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://monad-testnet.core.chainstack.com/9c5b265f20b3ea5df4f54f70eb74b800/")
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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_simulateV1\",\n \"params\": [\n {\n \"blockStateCalls\": [\n {\n \"stateOverrides\": {\n \"0x5d20879655df3c1e04ab111af0009ad650e762f0\": {\n \"balance\": \"0x56bc75e2d63100000\"\n }\n },\n \"calls\": [\n {\n \"from\": \"0x5d20879655df3c1e04ab111af0009ad650e762f0\",\n \"to\": \"0x000000000000000000000000000000000000dEaD\",\n \"gas\": \"0x5208\",\n \"value\": \"0xde0b6b3a7640000\"\n }\n ]\n }\n ],\n \"traceTransfers\": true\n },\n \"latest\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"hash": "0x08056c21a4289203c987a823e9f79648efd5014b47b4157a7e3b7a0c751725bd",
"size": "0x274",
"calls": [
{
"logs": [
{
"data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000005d20879655df3c1e04ab111af0009ad650e762f0",
"0x000000000000000000000000000000000000000000000000000000000000dead"
],
"address": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"removed": false,
"logIndex": "0x0",
"blockHash": "0x08056c21a4289203c987a823e9f79648efd5014b47b4157a7e3b7a0c751725bd",
"blockNumber": "0x3f04c1c",
"transactionHash": "0x5e525a3eaa89d73043aa8bc45d09b5b47ee210dc62457f6b0bd41058eb5e118b",
"transactionIndex": "0x0"
}
],
"status": "0x1",
"gasUsed": "0x5208",
"returnData": "0x"
}
],
"miner": "0xa63dd8fc7303bdd6cd66a66a49d4171146f89809",
"nonce": "0x0000000000000000",
"number": "0x3f04c1c",
"uncles": [],
"gasUsed": "0x5208",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x8f0d180",
"extraData": "0x",
"logsBloom": "0x00000000000050000000000004000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000402000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"stateRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"timestamp": "0x6ab8d06a",
"difficulty": "0x0",
"parentHash": "0xd0e7e290eab315e8cc182e7aa156d504fb8a1e003abe238be2106a81e1751bc8",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"withdrawals": [],
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"transactions": [
"0x5e525a3eaa89d73043aa8bc45d09b5b47ee210dc62457f6b0bd41058eb5e118b"
],
"baseFeePerGas": "0x0",
"withdrawalsRoot": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"
}
]
}Monad API method that simulates a sequence of calls across one or more blocks on top of the state of a chosen block, without creating transactions on the blockchain. Each simulated block can override account state and block fields, and with
traceTransfers the result reports every native MON transfer as a Transfer log.
When called against a block older than the latest ~128 blocks, this method is treated as an archive request (2 RUs instead of 1 RU). See request units.
Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.
Parameters
object— the simulation request object:blockStateCalls— an array of simulated blocks, executed in order on top of the base block. Each entry contains:blockOverrides(optional) — block fields to override for this simulated block, such asnumber,time,gasLimit, orfeeRecipient.stateOverrides(optional) — account state to override for the simulation, keyed by address. Each entry can setbalance,nonce,code,state, orstateDiff.calls— an array of call objects executed in sequence, each withfrom,to, and optionallygas,value,data,nonce,maxFeePerGas, andmaxPriorityFeePerGas.
traceTransfers(optional) — whentrue, every native MON transfer is returned as aTransferlog emitted by0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee. Defaults tofalse.validation(optional) — enables transaction checks, such as rejecting amaxFeePerGasbelow the block base fee. Defaults totrue, andfalseis not supported on Monad.
quantity or tag— the base block: a block number in hex, a block hash, orlatest,safe,finalized, orpending.
Response
result— an array with one object per simulated block. Each object contains the block header fields (number,hash,parentHash,timestamp,gasLimit,gasUsed,baseFeePerGas,miner,logsBloom, and the trie roots),transactionsas an array of transaction hashes, and:calls— an array with one result per call:status—0x1if the call succeeded,0x0if it failed.returnData— the data returned by the call.gasUsed— the gas charged for the call. On Monad, this value equals the gas limit of the call.logs— the logs emitted by the call, including aTransferlog for each native MON transfer whentraceTransfersistrue.error— present when the call failed, with amessagedescribing the failure.
Monad-specific behavior
On Monad,eth_simulateV1 behaves as follows:
gasUsedreports the gas limit of each call, not the gas consumed, because Monad charges the gas limit of a transaction. A call withoutgasruns with the node’s default call gas limit and reports that limit asgasUsed. Setgason each call to get a representative value.- Validation is always on. Omitting
validationbehaves astrue, and"validation": falsereturns a-32000error stating that this mode is not supported yet. Calls without fee fields are accepted. - The Monad reserve balance rule applies inside the simulation. A value transfer that leaves the sender below the 10 MON reserve balance reverts with
execution reverted, except for the sender’s first transaction in the reserve window (an emptying transaction). Set the sender’sbalanceinstateOverrideswell above 10 MON when one account makes several value transfers. returnFullTransactionsis not supported.transactionsalways contains transaction hashes.- The base block must be one whose state the node holds.
earliestreturns the-32602errorBlock requested not found.
Request limits
A singleeth_simulateV1 request on Chainstack Monad nodes accepts:
- Up to 256 simulated blocks in
blockStateCalls. - Up to 2,000 calls across all simulated blocks.
- Up to 1,600,000,000 gas in total, summed over the gas limits of all calls. A call without
gascounts at the node’s default call gas limit.
-32000 error that states the limit, for example Too many calls to simulate: 2001, maximum allowed is 2000.
Example: simulate a native MON transfer
The code examples on this page simulate a transfer of 1 MON from0x5d20879655df3c1e04ab111af0009ad650e762f0 to 0x000000000000000000000000000000000000dEaD on top of the latest block. The stateOverrides entry sets the sender’s balance to 100 MON (0x56bc75e2d63100000) for the simulation only, so the result does not depend on the account’s live balance. The call sets gas to 21,000 (0x5208), the intrinsic gas of a plain MON transfer.
The simulated call returns status 0x1, gasUsed 0x5208, and one Transfer log for the native MON movement:
address—0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee, the pseudo-address thattraceTransfersuses for native transfers.topics— theTransfer(address,address,uint256)event signature, then the sender and the recipient.data— the amount,1000000000000000000wei (1 MON).
eth_simulateV1 code examples
const { JsonRpcProvider } = require("ethers");
const provider = new JsonRpcProvider("CHAINSTACK_NODE_URL");
const sender = "0x5d20879655df3c1e04ab111af0009ad650e762f0";
const recipient = "0x000000000000000000000000000000000000dEaD";
async function simulateTransfer() {
const [block] = await provider.send("eth_simulateV1", [
{
blockStateCalls: [
{
stateOverrides: { [sender]: { balance: "0x56bc75e2d63100000" } }, // 100 MON
calls: [
{
from: sender,
to: recipient,
gas: "0x5208", // 21,000
value: "0xde0b6b3a7640000" // 1 MON
}
]
}
],
traceTransfers: true
},
"latest"
]);
const [result] = block.calls;
console.log(`Simulated block: ${parseInt(block.number, 16)}`);
console.log(`Status: ${result.status}, gas used: ${parseInt(result.gasUsed, 16)}`);
for (const log of result.logs) {
console.log(`Transfer log from ${log.address}: ${BigInt(log.data)} wei`);
}
}
simulateTransfer();
from web3 import Web3
node_url = "CHAINSTACK_NODE_URL"
web3 = Web3(Web3.HTTPProvider(node_url))
sender = "0x5d20879655df3c1e04ab111af0009ad650e762f0"
recipient = "0x000000000000000000000000000000000000dEaD"
response = web3.provider.make_request("eth_simulateV1", [
{
"blockStateCalls": [
{
"stateOverrides": {sender: {"balance": "0x56bc75e2d63100000"}}, # 100 MON
"calls": [
{
"from": sender,
"to": recipient,
"gas": "0x5208", # 21,000
"value": "0xde0b6b3a7640000" # 1 MON
}
]
}
],
"traceTransfers": True
},
"latest"
])
block = response["result"][0]
result = block["calls"][0]
print(f"Simulated block: {int(block['number'], 16)}")
print(f"Status: {result['status']}, gas used: {int(result['gasUsed'], 16)}")
for log in result["logs"]:
print(f"Transfer log from {log['address']}: {int(log['data'], 16)} wei")
Use case
A practical use case foreth_simulateV1 is previewing a multi-step flow before signing it, such as a token approval followed by a swap. The calls in one request run in sequence against shared state, so each call sees the effects of the calls before it, and stateOverrides funds the sender without touching a real account.Body
application/json
Last modified on September 27, 2026
Was this page helpful?