# Methods & subscriptions

> Which JSON-RPC methods and WebSocket subscriptions work on the Supanode Robinhood Chain node, how far back history and state go, and the Arbitrum L2 details that change client code.

Everything on this page was called against the node on 24 September 2026. If a method is not listed as working, assume it is not available.

## JSON-RPC methods

| Group | Methods |
|---|---|
| Chain and network | `eth_chainId`, `eth_blockNumber`, `net_version`, `web3_clientVersion`, `eth_syncing`, `eth_accounts` (always `[]`) |
| Gas and fees | `eth_gasPrice`, `eth_maxPriorityFeePerGas`, `eth_feeHistory`, `eth_blobBaseFee`, `eth_estimateGas`, `eth_createAccessList` |
| Blocks | `eth_getBlockByNumber` (`latest`, `pending`, `safe`, `finalized` or a number), `eth_getBlockByHash`, `eth_getBlockReceipts`, `eth_getBlockTransactionCountByNumber`, `eth_getBlockTransactionCountByHash`, `eth_getUncleCountByBlockNumber` |
| Transactions | `eth_getTransactionByHash`, `eth_getTransactionReceipt`, `eth_getTransactionByBlockNumberAndIndex`, `eth_getTransactionByBlockHashAndIndex`, `eth_getTransactionCount` (`latest` and `pending`) |
| State | `eth_getBalance`, `eth_getCode`, `eth_getStorageAt`, `eth_getProof`, `eth_call`, `eth_simulateV1` |
| Logs and filters | `eth_getLogs` (block range or `blockHash`), `eth_newFilter`, `eth_newBlockFilter`, `eth_getFilterChanges`, `eth_getFilterLogs`, `eth_uninstallFilter` |
| Sending | `eth_sendRawTransaction` |
| Tracing | `debug_traceTransaction`, `debug_traceBlockByNumber`, `debug_traceBlockByHash`, `debug_traceCall` (`callTracer` and `prestateTracer` tested), `debug_getRawTransaction`, `debug_getRawReceipts`, `debug_getRawBlock` |

Batch requests (a JSON array of calls) work up to 1,000 calls per batch. See [Limits](https://supanode.xyz/docs/robinhood/rpc/limits).

## Not available

| Methods | Response |
|---|---|
| `trace_*`, `arbtrace_*`, `txpool_*`, `admin_*`, `personal_*`, `miner_*`, `net_listening`, `net_peerCount`, `eth_protocolVersion`, `eth_coinbase`, `eth_mining`, `eth_hashrate` | `-32601` method does not exist / is not available |
| `eth_sendTransaction`, `eth_sign` | `-32000 unknown account`: the node holds no keys. Sign on your side and send with `eth_sendRawTransaction`. |
| `eth_subscribe` over HTTPS | `-32601 notifications not supported`: subscriptions need the WebSocket endpoint. |

For call-level traces use `debug_traceTransaction` with `callTracer`. On Arbitrum its output carries two extra fields, `beforeEVMTransfers` and `afterEVMTransfers`.

## WebSocket subscriptions

| `eth_subscribe` | Status |
|---|---|
| `newHeads` | Works. About 10 notifications per second, one per L2 block. |
| `logs` | Works, with or without an `address` / `topics` filter. Unfiltered it is around 300 events per second. |
| `newPendingTransactions` | Returns a subscription id and then stays silent. Arbitrum has no public mempool: the sequencer orders transactions directly. Don't build on it. |
| `syncing` | Not available. |

Regular JSON-RPC calls (`eth_call`, `eth_getLogs`, `eth_getBlockByNumber`) work on the same WebSocket connection. `eth_unsubscribe` closes a subscription.

A `newHeads` notification looks like this (trimmed):

```json
{"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x8b9e63df4cf5b0919e691cbf5e3e1ddf","result":{"parentHash":"0xa4b0...ab8d","miner":"0xa4b000000000000000000073657175656e636572","number":"0x43f5f3f","timestamp":"0x6ab4ecf2","baseFeePerGas":"0x2a84c40","gasUsed":"0x2ac5f8","difficulty":"0x1","hash":"0x..."}}}
```

## History depth

| Data | How far back |
|---|---|
| Blocks, transactions, receipts, logs | Since the first block, 30 April 2026 |
| State at a past block: `eth_call`, `eth_getBalance`, `eth_getStorageAt`, `eth_getCode` with a block number, and `debug_trace*` of past transactions | About the last 5 days (around 4.6 million blocks) |

This is a full node, not an archive node. Asking for state older than the window returns `-32000 missing trie node ...`, and tracing an older transaction returns `-32000 required historical state unavailable`. That is the pruning window, not a fault.

<Tip>
**Need decoded history rather than raw state?** The [Robinhood Indexer](https://supanode.xyz/docs/robinhood/indexer) holds every Uniswap v3/v4 swap, pool and launchpad event in SQL. For state at arbitrary old blocks, an archive [dedicated node](https://supanode.xyz/docs/robinhood/dedicated) is the way.
</Tip>

## Arbitrum specifics

| Topic | What to expect |
|---|---|
| Block time | About 0.1 s, roughly 10 blocks per second. The `latest` block is 0-1 s old. |
| `safe` tag | About 4,200-4,900 blocks (7-8 minutes) behind `latest`. |
| `finalized` tag | About 15-20 minutes behind `latest`. |
| How the tags move | Both advance in steps as batches settle on the parent chain, not block by block. |
| Extra block fields | `l1BlockNumber`, `sendCount`, `sendRoot`. `miner` is `0xa4b0...73657175656e636572`, "sequencer" in hex. `difficulty` is `1`. |
| `l1BlockNumber` | Present in `eth_getBlockByNumber` results, absent from `newHeads` notifications. Fetch the block if you need it. |
| `block.number` in Solidity | Returns a parent-chain block number on Arbitrum. For the L2 block number call `ArbSys(0x64).arbBlockNumber()` through `eth_call`. |
| Gas | Paid in ETH. `eth_maxPriorityFeePerGas` is `0`: tips are not needed. A plain transfer estimates at 21,000 gas. |
| Pending transactions | Not exposed: no `txpool_*`, and pending filters and subscriptions stay empty. |
| Sending | `eth_sendRawTransaction` validates the transaction and returns clear errors, for example `insufficient funds for gas * price + value`. |

## External references

- [Robinhood Chain documentation](https://docs.robinhood.com/chain/)
- [Arbitrum: differences from Ethereum](https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/comparison-overview)
- [Ethereum JSON-RPC specification](https://ethereum.org/en/developers/docs/apis/json-rpc/)
