Transaction Simulation
Securely verify transactions in a real chain environment
Transaction Simulator can be self-hosted, if needed
Forget about network latency between node and app, add more security based on blockchain design and architecture, and get the same benefits as the SaaS version.
The transaction simulation mechanism allows you to execute the code in the EVM using the real state (you can specify either the latest block or any other). The transaction will not be recorded in the blockchain, but you will receive all the necessary data about its execution - such as detailed logs on diff state.
The simulation is implemented by calling the debug_traceCall
method using the simulatorTransaction
tracer.
Supported and Planned Chains
Query
curl --location --request POST 'https://bsc-mainnet.rpcfast.com?api_key=*****' \
--header 'Content-Type: application/json' \
--data-raw '{
"id":1,
"jsonrpc":"2.0",
"method":"debug_traceCall",
"params": [
{
"from": "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199",
"to": "0xC469e7aE4aD962c30c7111dc580B4adbc7E914DD",
"gas": "0x38ec9",
"data": "0xa9059cbb000000000000000000000000c469e7ae4ad962c30c7111dc580b4adbc7e914dd0000000000000000000000000000000000000000000000000000000000000001"
},
"latest",
{
"tracer": "simulatorTransaction"
}
]
}'
The method accepts 3 parameters:
Object with truncation details
from
- Address fromto
- Address tpgas
- Gas limit in hexdata
- Transaction Payload
Block hash or
latest
Tracer specify (required parameter)
Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"post": {
"0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199": {
"balance": 7191999784037716435034,
"nonce": 14
},
"0xc469e7ae4ad962c30c7111dc580b4adbc7e914dd": {
"storage": {
"0x673de83553dc3a2c0f59aa7193de392a4530feb73b9d6cd4fcef68802b8195c1": "0x0000000000000000000000000000000000000000000000000000000005f5e0fe",
"0xfb05fe32b3c70ddd1ab6d1436c8058b66823efba374c166903d3ad4780ae2cd4": "0x0000000000000000000000000000000000000000000000000000000000000002"
}
}
},
"pre": {
"0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199": {
"balance": 7191999784037716675176,
"nonce": 13
},
"0xc469e7ae4ad962c30c7111dc580b4adbc7e914dd": {
"balance": 0,
"code": "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",
"nonce": 1,
"storage": {
"0x673de83553dc3a2c0f59aa7193de392a4530feb73b9d6cd4fcef68802b8195c1": "0x0000000000000000000000000000000000000000000000000000000005f5e0ff",
"0xfb05fe32b3c70ddd1ab6d1436c8058b66823efba374c166903d3ad4780ae2cd4": "0x0000000000000000000000000000000000000000000000000000000000000001"
}
}
},
"call": {
"from": "0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199",
"gas": 211589,
"gasUsed": 34306,
"to": "0xc469e7ae4ad962c30c7111dc580b4adbc7e914dd",
"logs": [
{
"address": "0xc469e7ae4ad962c30c7111dc580b4adbc7e914dd",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000008626f6940e2eb28930efb4cef49b2d1f2c9c1199",
"0x000000000000000000000000c469e7ae4ad962c30c7111dc580b4adbc7e914dd"
],
"data": "0x0000000000000000000000000000000000000000000000000000000000000001"
}
],
"value": 0
}
}
}
Response result
object contain few objects:
call
- transaction execution resultsfrom
- Address fromto
- Address to (can be contract address for contract operaions)gas
- gas limit for transaction defined by usergasUsed
- real gas usage valuevalue
- eth valuelogs
- execution logsaddress
- contract addresstopics
- event opticsdata
- log payload
pre
/post
- State before/after transaction(s) execution<address>
- address, used in transactionbalance
- balance in Weinonce
- noncecode
- hex-encoded bytecodestorage
- storage slots of the contract
Multiple transactions simulation
Sometimes it is necessary to execute several transactions in a row, taking into account the changes made to the state by each transaction. For this, we have developed debug_traceCallMulti
method.
It works almost exactly like debug_traceCall
, only instead of a single object, it accepts an array of objects of the same format.
curl --location --request POST 'https://bsc-mainnet.rpcfast.com?api_key=***' \
--header 'Content-Type: application/json' \
--data-raw '{
"id":1,
"jsonrpc":"2.0",
"method":"debug_traceCallMulti",
"params": [
[
{"from": "0xdfcec744c8417d2a0ef72fe520438dd20f368369", "to": "0xf508fcd89b8bd15579dc79a6827cb4686a3592c8", "gas": "0x38ec9", "data": "0xa0712d680000000000000000000000000000000000000000000000001a4ca49dff654641"},
{"from": "0xdfcec744c8417d2a0ef72fe520438dd20f368369", "to": "0xf508fcd89b8bd15579dc79a6827cb4686a3592c8", "gas": "0x38ec9", "data": "0xa0712d680000000000000000000000000000000000000000000000001a4ca49dff654641"}
],
"latest",
{
"tracer": "simulatorTransaction"
}
]
}'
The response will also be an array of data, in the same order in which the objects were arranged in the request:
{
"jsonrpc": "2.0",
"id": 1,
"result": [...]
}
Example requests
Block timestamp override
curl --location 'https://bsc-mainnet.rpcfast.com?api_key=***' \
--header 'Content-Type: application/json' \
--data '{
"id":1,
"jsonrpc":"2.0",
"method":"debug_traceCall",
"params": [
{"from": "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199", "to": "0x62DB6c1678Ca81ea0d946EA3dd75b4F71421A2aE", "gas": "0x38ec9", "data": "0xa9059cbb00000000000000000000000062db6c1678ca81ea0d946ea3dd75b4f71421a2ae0000000000000000000000000000000000000000000000000000000000000001"},
"latest",
{
"tracer": "simulatorTransaction",
"blockOverrides": {
"time": 1692185198
}
}
]
}'
Block number override
curl --location 'https://bsc-mainnet.rpcfast.com?api_key=***' \
--header 'Content-Type: application/json' \
--data '{
"id":1,
"jsonrpc":"2.0",
"method":"debug_traceCall",
"params": [
{"from": "0x3f349bBaFEc1551819B8be1EfEA2fC46cA749aA1", "to": "0x0000000000000000000000000000000000001000", "gas": "0x38ec9", "data": "0xf340fa010000000000000000000000003f349bbafec1551819b8be1efea2fc46ca749aa1"},
"latest",
{
"tracer": "simulatorTransaction",
"blockOverrides": {
"number": "0x1d9a583"
}
}
]
}'
Coinbase address override
curl --location 'https://bsc-mainnet.rpcfast.com?api_key=***' \
--header 'Content-Type: application/json' \
--data '{
"id": 1,
"jsonrpc": "2.0",
"method": "debug_traceCall",
"params": [
{
"from": "0x26EeDf987b1d7e160EFC252878A2C0980BD91504",
"to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"gas": "0xec724",
"gasPrice": "0x63782218b",
"value": "0x5af3107a4000",
"data": "0xd0e30db0"
},
"latest",
{
"tracer": "simulatorTransaction",
"blockoverrides": {
"coinbase":"0xaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef"
}
}
]
}'
Last updated