JSON-RPC Reference
Ethereum JSON-RPC and WebSocket methods on ZENANET, with parameters and request/response examples
ZENANET runs an Ethereum JSON-RPC server and a Cosmos SDK REST server side by side. Both expose the same chain state through different interfaces. This page catalogs the JSON-RPC and WebSocket side. Click any row to expand its parameters and examples. The Cosmos REST side is on the REST API Reference page.
| Family | Mainnet | Testnet | Node port |
|---|---|---|---|
| Ethereum JSON-RPC (HTTP) | https://evm.zena-ai.io | https://evm-testnet.zena-ai.io (Temporarily unavailable) | 8545 |
| Ethereum JSON-RPC (WebSocket) | wss://evm.zena-ai.io/ws | wss://evm-testnet.zena-ai.io/ws (Temporarily unavailable) | 8546 |
| Cosmos REST (gRPC-Gateway) | https://api.zena-ai.io | https://api-testnet.zena-ai.io | 1317 |
| CometBFT RPC | https://rpc.zena-ai.io | 26657 |
Temporarily unavailable: The testnet EVM endpoints (https://evm-testnet.zena-ai.io, wss://evm-testnet.zena-ai.io/ws) are currently suspended. The addresses are kept for reference and will work again when the service resumes.
| Item | Value |
|---|---|
| EVM Chain ID | 15150 (0x3b2e) |
| Base denom | aznnt (18 decimals), display unit ZNNT |
| bech32 prefix | zenanet1… |
| Native coin as ERC-20 (token pair) | 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE |
Transfer(address,address,uint256) topic | 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef |
Which endpoint should I use?
| What you want to do | Use | Notes |
|---|---|---|
Look up a tx / receipt / logs by 0x hash | evm | eth_getTransactionByHash, eth_getTransactionReceipt |
| Full transfer history of one token | evm | eth_getLogs with address = token, in 10,000-block chunks |
| ERC-20 balance, name, symbol, decimals | evm | eth_call |
| Blocks, native balance, gas, contract code | evm | Everything a standard EVM explorer needs |
| Connect MetaMask / ethers / viem / Foundry | evm | Chain ID 15150 |
| Real-time subscriptions | evm (ws) | eth_subscribe |
| All txs sent or received by one address | api | message.sender, ethereum_tx.recipient. The EVM API has no per-address tx list |
| Look up a Cosmos tx by 64-char HEX hash | api | MsgSend, staking, governance, IBC |
All denoms for a zenanet1… address, IBC tokens | api | /cosmos/bank/v1beta1/balances |
| Token pairs, base fee, module params | api | /cosmos/evm/… |
| Staking, validators, governance, consensus | api or rpc | Not exposed through the EVM interface |
Explorer-style routes such as /transactions, /token-transfers, or /search belong to the Blockscout API v2,
not to the node. They only exist once a Blockscout instance is indexing the node over JSON-RPC (including the debug
namespace). Everything below is served by the node itself.
Transactions
EVM transactions use a 0x hash. Every EVM transaction is also wrapped in a Cosmos transaction (MsgEthereumTx), so it has a second, 64-character HEX hash. Cosmos-hash lookups live on the REST API Reference.
POSTeth_getTransactionByHashTransaction by hashevm.zena-ai.io
A mined transaction has blockNumber and blockHash filled in. A transaction still in the mempool is returned with those set to null. Unknown hashes return result: null.
Parameters
| Name | In | Description |
|---|---|---|
hashrequired | params[0] | 0x-prefixed 32-byte transaction hash |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getTransactionByHash",
"params": ["0x<txhash>"]
}'Response (main fields)
{
"blockHash": "0x…", "blockNumber": "0x1a2b", "transactionIndex": "0x0",
"hash": "0x…", "from": "0x…", "to": "0x…", "value": "0xde0b6b3a7640000",
"gas": "0x5208", "gasPrice": "0x3b9aca00", "maxFeePerGas": "0x…", "maxPriorityFeePerGas": "0x…",
"nonce": "0x7", "input": "0x", "type": "0x2", "chainId": "0x3b2e", "v": "0x0", "r": "0x…", "s": "0x…"
}POSTeth_getTransactionReceiptReceipt: status, gas used, logsevm.zena-ai.io
status is 0x1 for success and 0x0 for a revert. Contract-creation transactions have contractAddress set. The logs array holds emitted events such as ERC-20 Transfer.
Parameters
| Name | In | Description |
|---|---|---|
hashrequired | params[0] | Transaction hash |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getTransactionReceipt",
"params": ["0x<txhash>"]
}'Response (main fields)
{
"status": "0x1", "transactionHash": "0x…", "blockNumber": "0x1a2b",
"from": "0x…", "to": "0x…", "contractAddress": null,
"gasUsed": "0xcf08", "cumulativeGasUsed": "0xcf08", "effectiveGasPrice": "0x3b9aca00",
"logs": [
{ "address": "0x<token>", "topics": ["0xddf252ad…", "0x000…from", "0x000…to"], "data": "0x…amount", "logIndex": "0x0" }
],
"logsBloom": "0x…", "type": "0x2"
}POSTeth_getTransactionLogsOnly the logs of one transaction (Cosmos EVM extension)evm.zena-ai.io
Returns just the logs array instead of the whole receipt. This method does not exist on standard Ethereum nodes.
Parameters
| Name | In | Description |
|---|---|---|
hashrequired | params[0] | Transaction hash |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getTransactionLogs",
"params": ["0x<txhash>"]
}'Response (main fields)
[
{ "address": "0x<token>", "topics": ["0xddf252ad…", "0x000…", "0x000…"], "data": "0x…",
"blockNumber": "0x1a2b", "transactionHash": "0x…", "logIndex": "0x0" }
]POSTeth_getTransactionByBlockNumberAndIndexTransaction by block number and indexevm.zena-ai.io
Returns the n-th transaction of a block. eth_getTransactionByBlockHashAndIndex is the block-hash variant.
Parameters
| Name | In | Description |
|---|---|---|
blockrequired | params[0] | Hex block number, or latest / earliest / pending / safe / finalized |
indexrequired | params[1] | Hex transaction index within the block |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getTransactionByBlockNumberAndIndex",
"params": ["0x1a2b", "0x0"]
}'Response (main fields)
Same object as eth_getTransactionByHash.
POSTeth_getTransactionCountAccount nonce (number of sent transactions)evm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
addressrequired | params[0] | 0x address |
blockrequired | params[1] | Block tag. Use pending to get the nonce for the next transaction |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getTransactionCount",
"params": ["0x<address>", "pending"]
}'Response (main fields)
"0x7"Token Transfers and Logs
ERC-20 transfers are found through the Transfer event. The full history of one token is eth_getLogs with address set to the token. The list of transactions for one address is not available over JSON-RPC. Use the REST tx search for that. Plain EVM value transfers and Cosmos MsgSend emit no logs and are only visible there.
POSTeth_getLogsTransfer logs of a token (the core query)evm.zena-ai.io
Put the token contract in address and the Transfer signature in topics[0]. topics[1] is from and topics[2] is to. With default node settings a single call is capped at 10,000 blocks and 10,000 logs, so scan long histories in chunks.
Parameters
| Name | In | Description |
|---|---|---|
address | filter | Token contract address. Accepts an array. The native coin is 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE |
fromBlock / toBlock | filter | Hex block numbers or tags. Range must be within 10,000 blocks |
topics | filter | [Transfer signature, from (optional), to (optional)]. Addresses are left-padded to 32 bytes. null matches anything |
blockHash | filter | Restrict to one block. Mutually exclusive with fromBlock / toBlock |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getLogs",
"params": [{
"address": "0x<token_contract>",
"fromBlock": "0x1000",
"toBlock": "0x3000",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
null,
"0x000000000000000000000000<wallet_without_0x>"
]
}]
}'Response (main fields)
[
{
"address": "0x<token_contract>",
"topics": ["0xddf252ad…", "0x000000000000000000000000<from>", "0x000000000000000000000000<to>"],
"data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
"blockNumber": "0x1a2b", "transactionHash": "0x…", "transactionIndex": "0x0", "logIndex": "0x0", "removed": false
}
]POSTeth_call · ERC-20 viewsbalanceOf, name, symbol, decimals, totalSupplyevm.zena-ai.io
Calls ERC-20 view functions. data is the 4-byte selector followed by ABI-encoded arguments. The result is ABI-encoded hex.
Parameters
| Name | In | Description |
|---|---|---|
torequired | params[0].to | Token contract |
datarequired | params[0].data | balanceOf 0x70a08231 + padded address · name 0x06fdde03 · symbol 0x95d89b41 · decimals 0x313ce567 · totalSupply 0x18160ddd |
block | params[1] | latest |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_call",
"params": [{
"to": "0x<token_contract>",
"data": "0x70a08231000000000000000000000000<wallet_without_0x>"
}, "latest"]
}'Response (main fields)
"0x0000000000000000000000000000000000000000000000056bc75e2d63100000"uint256, here 10^20 base units.
WSeth_subscribe · logsLive Transfer logs of one tokenevm.zena-ai.io/ws
Connect to wss://evm.zena-ai.io/ws. Browsers send an Origin header, and the node only accepts hosts listed in its ws-origins setting.
Parameters
| Name | In | Description |
|---|---|---|
typerequired | params[0] | "logs" |
filter | params[1] | address and topics, same shape as eth_getLogs without a block range |
Request
{
"jsonrpc": "2.0", "id": 1,
"method": "eth_subscribe",
"params": ["logs", {
"address": "0x<token_contract>",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}]
}Response (main fields)
// subscription id
{ "jsonrpc": "2.0", "id": 1, "result": "0xcd0c3e8af590364c09d0fa6a1210faf5" }
// then, for every matching log
{ "jsonrpc": "2.0", "method": "eth_subscription",
"params": { "subscription": "0xcd0c…", "result": { "address": "0x…", "topics": ["…"], "data": "0x…", "transactionHash": "0x…" } } }Blocks
POSTeth_blockNumberLatest block numberevm.zena-ai.io
No parameters.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": []
}'Response (main fields)
"0x1a2b"POSTeth_getBlockByNumberBlock by numberevm.zena-ai.io
Block tags latest, earliest, pending, safe, and finalized are all accepted. ZENANET has instant finality, so latest and finalized are the same block.
Parameters
| Name | In | Description |
|---|---|---|
blockrequired | params[0] | Hex block number, or latest / earliest / pending / safe / finalized |
fullTxrequired | params[1] | true returns full transaction objects, false returns hashes only |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getBlockByNumber",
"params": ["0x1a2b", true]
}'Response (main fields)
{
"number": "0x1a2b", "hash": "0x…", "parentHash": "0x…", "timestamp": "0x66f1a2b3",
"miner": "0x…", "gasLimit": "0x2625a00", "gasUsed": "0x5208", "baseFeePerGas": "0x3b9aca00",
"size": "0x2f3", "transactions": [ { "hash": "0x…", "from": "0x…", "to": "0x…" } ], "logsBloom": "0x…"
}POSTeth_getBlockByHashBlock by hashevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
hashrequired | params[0] | Block hash |
fullTxrequired | params[1] | true / false |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getBlockByHash",
"params": ["0x<blockhash>", false]
}'Response (main fields)
Same object as eth_getBlockByNumber.
POSTeth_getBlockReceiptsAll receipts of a block in one callevm.zena-ai.io
Indexers and explorers use this to read a whole block without calling eth_getTransactionReceipt per transaction.
Parameters
| Name | In | Description |
|---|---|---|
blockrequired | params[0] | Hex block number, a tag, or an object { "blockHash": "0x…" } |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getBlockReceipts",
"params": ["0x1a2b"]
}'Response (main fields)
An array of eth_getTransactionReceipt objects.
POSTeth_getBlockTransactionCountByNumberNumber of transactions in a blockevm.zena-ai.io
eth_getBlockTransactionCountByHash is the block-hash variant.
Parameters
| Name | In | Description |
|---|---|---|
blockrequired | params[0] | Hex block number or tag |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getBlockTransactionCountByNumber",
"params": ["latest"]
}'Response (main fields)
"0x3"Accounts and State
The same key is 0x… on the EVM side and zenanet1… on the Cosmos side. Convert with zenad debug addr <address>.
POSTeth_getBalanceNative coin balance (wei, 18 decimals)evm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
addressrequired | params[0] | 0x address |
blockrequired | params[1] | latest or another block tag |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getBalance",
"params": ["0x<address>", "latest"]
}'Response (main fields)
"0xde0b6b3a7640000"1 ZNNT. Divide by 10^18 for the display unit.
POSTeth_getCodeContract bytecodeevm.zena-ai.io
Returns 0x for an externally owned account. Use it to tell contracts from wallets.
Parameters
| Name | In | Description |
|---|---|---|
addressrequired | params[0] | 0x address |
blockrequired | params[1] | latest |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getCode",
"params": ["0x<address>", "latest"]
}'Response (main fields)
"0x6080604052…"POSTeth_getStorageAtStorage slot valueevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
addressrequired | params[0] | Contract address |
slotrequired | params[1] | Hex storage slot |
blockrequired | params[2] | latest |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getStorageAt",
"params": ["0x<contract>", "0x0", "latest"]
}'Response (main fields)
"0x0000000000000000000000000000000000000000000000000000000000000000"Chain and Fees
POSTeth_chainIdEVM chain IDevm.zena-ai.io
No parameters.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "eth_chainId", "params": []
}'Response (main fields)
"0x3b2e"Decimal 15150.
POSTeth_gasPriceSuggested gas price (base fee + tip)evm.zena-ai.io
No parameters.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "eth_gasPrice", "params": []
}'Response (main fields)
"0x3b9aca00"POSTeth_maxPriorityFeePerGasSuggested priority fee (tip)evm.zena-ai.io
No parameters.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "eth_maxPriorityFeePerGas", "params": []
}'Response (main fields)
"0x0"POSTeth_feeHistoryBase fee and tip history of recent blocksevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
blockCountrequired | params[0] | Hex number of blocks. At most 100 with default node settings |
newestBlockrequired | params[1] | latest or a block number |
rewardPercentiles | params[2] | Array such as [25, 50, 75] |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_feeHistory",
"params": ["0xa", "latest", [25, 75]]
}'Response (main fields)
{ "oldestBlock": "0x1a21", "baseFeePerGas": ["0x3b9aca00", "0x3b9aca00"], "gasUsedRatio": [0.01, 0.02], "reward": [["0x0", "0x0"]] }POSTeth_syncingSync statusevm.zena-ai.io
No parameters. false means the node is fully synced.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "eth_syncing", "params": []
}'Response (main fields)
falseExecution and Sending
POSTeth_callRead-only contract callevm.zena-ai.io
Does not change state. With default node settings the gas cap is 25,000,000 and the timeout is 5 seconds.
Parameters
| Name | In | Description |
|---|---|---|
txrequired | params[0] | { to, data, from (optional), value (optional) } |
block | params[1] | latest |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_call",
"params": [{ "to": "0x<contract>", "data": "0x<calldata>" }, "latest"]
}'Response (main fields)
"0x…"ABI-encoded return value.
POSTeth_estimateGasGas estimateevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
txrequired | params[0] | { from, to, data, value } |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_estimateGas",
"params": [{ "from": "0x<from>", "to": "0x<to>", "value": "0xde0b6b3a7640000" }]
}'Response (main fields)
"0x5208"POSTeth_sendRawTransactionBroadcast a signed transactionevm.zena-ai.io
Sends a transaction signed on the client. The result is the transaction hash. Check the outcome with eth_getTransactionReceipt.
Parameters
| Name | In | Description |
|---|---|---|
rawTxrequired | params[0] | 0x-prefixed signed RLP bytes |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_sendRawTransaction",
"params": ["0x02f8…"]
}'Response (main fields)
"0x<txhash>"POSTeth_createAccessListBuild an EIP-2930 access listevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
txrequired | params[0] | { from, to, data } |
block | params[1] | latest |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_createAccessList",
"params": [{ "to": "0x<contract>", "data": "0x…" }, "latest"]
}'Response (main fields)
{ "accessList": [ { "address": "0x…", "storageKeys": ["0x…"] } ], "gasUsed": "0x…" }Real-time and Filters
WebSocket subscriptions use wss://evm.zena-ai.io/ws. For HTTP polling, create a filter with eth_newFilter and poll eth_getFilterChanges. A node keeps at most 200 filters, and idle filters expire.
WSeth_subscribe · newHeadsNew block headersevm.zena-ai.io/ws
Parameters
| Name | In | Description |
|---|---|---|
typerequired | params[0] | "newHeads" |
Request
{ "jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"] }Response (main fields)
{ "jsonrpc": "2.0", "method": "eth_subscription",
"params": { "subscription": "0x…", "result": { "number": "0x1a2c", "hash": "0x…", "timestamp": "0x…" } } }WSeth_subscribe · newPendingTransactionsHashes of transactions entering the mempoolevm.zena-ai.io/ws
Parameters
| Name | In | Description |
|---|---|---|
typerequired | params[0] | "newPendingTransactions" |
Request
{ "jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"] }Response (main fields)
{ "method": "eth_subscription", "params": { "subscription": "0x…", "result": "0x<txhash>" } }WSeth_unsubscribeCancel a subscriptionevm.zena-ai.io/ws
Parameters
| Name | In | Description |
|---|---|---|
idrequired | params[0] | Subscription id |
Request
{ "jsonrpc": "2.0", "id": 2, "method": "eth_unsubscribe", "params": ["0xcd0c3e8af590364c09d0fa6a1210faf5"] }Response (main fields)
truePOSTeth_newFilterCreate a log filter for HTTP pollingevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
filterrequired | params[0] | { address, topics, fromBlock, toBlock }, same as eth_getLogs |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_newFilter",
"params": [{
"address": "0x<token_contract>",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}]
}'Response (main fields)
"0x1"POSTeth_getFilterChangesNew logs since the last pollevm.zena-ai.io
Returns only what changed since the previous call. A filter created with eth_newBlockFilter returns block hashes instead.
Parameters
| Name | In | Description |
|---|---|---|
idrequired | params[0] | Filter id |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_getFilterChanges",
"params": ["0x1"]
}'Response (main fields)
An array of log objects, same shape as eth_getLogs.
POSTeth_uninstallFilterRemove a filterevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
idrequired | params[0] | Filter id |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "eth_uninstallFilter",
"params": ["0x1"]
}'Response (main fields)
trueDebug and Mempool
These namespaces are only available when the node operator adds debug and txpool to json-rpc.api in app.toml. Public nodes usually keep them closed.
POSTdebug_traceTransactionExecution trace including internal callsevm.zena-ai.io
With callTracer the result is the tree of internal transactions. Explorer features like Blockscout's internal-transactions list are built from this output.
Parameters
| Name | In | Description |
|---|---|---|
hashrequired | params[0] | Transaction hash |
config | params[1] | { "tracer": "callTracer" } and other tracer options |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "debug_traceTransaction",
"params": ["0x<txhash>", { "tracer": "callTracer" }]
}'Response (main fields)
{ "type": "CALL", "from": "0x…", "to": "0x…", "value": "0x0", "gas": "0x…", "gasUsed": "0x…", "input": "0x…",
"calls": [ { "type": "CALL", "from": "0x…", "to": "0x…", "input": "0x…" } ] }POSTdebug_traceBlockByNumberTrace every transaction in a blockevm.zena-ai.io
Parameters
| Name | In | Description |
|---|---|---|
blockrequired | params[0] | Hex block number |
config | params[1] | Tracer options |
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1,
"method": "debug_traceBlockByNumber",
"params": ["0x1a2b", { "tracer": "callTracer" }]
}'Response (main fields)
[ { "txHash": "0x…", "result": { "type": "CALL", "from": "0x…", "to": "0x…" } } ]POSTtxpool_statusPending and queued counts in the mempoolevm.zena-ai.io
No parameters.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "txpool_status", "params": []
}'Response (main fields)
{ "pending": "0x2", "queued": "0x0" }POSTtxpool_contentEvery transaction in the mempoolevm.zena-ai.io
No parameters.
Request
curl -s https://evm.zena-ai.io -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "txpool_content", "params": []
}'Response (main fields)
{ "pending": { "0x<from>": { "7": { "hash": "0x…", "to": "0x…", "value": "0x…" } } }, "queued": {} }Query Limits (node defaults)
| Setting | Default | Meaning |
|---|---|---|
block-range-cap | 10,000 | Max block range for one eth_getLogs call |
logs-cap | 10,000 | Max logs returned per call |
filter-cap | 200 | Max concurrently installed filters |
fee-history-cap | 100 | Max blocks per eth_feeHistory call |
gas-cap | 25,000,000 | Gas limit for eth_call and eth_estimateGas |
evm-timeout | 5s | Timeout for eth_call |
Running Your Own Node
[json-rpc]
enable = true
api = "eth,net,web3,txpool,debug" # default is eth,net,web3
enable-indexer = true # recommended for fast lookups by tx hash
ws-origins = ["127.0.0.1", "localhost", "app.example.com"]
[api]
enable = true
enabled-unsafe-cors = true # only if browsers call REST :1317 directlyWith enable-indexer off, eth_getTransactionByHash falls back to a CometBFT tx_search on every call.
This gets slower as the chain grows, so always enable it on public RPC nodes.