Shell-Chain JSON-RPC API Reference

Complete reference for the shell-chain JSON-RPC API. All methods follow the JSON-RPC 2.0 specification.

See also: Quickstart Guide · Testnet Operator Guide · Post-Quantum Cryptography Guide · Native Account Abstraction Guide · System Contracts · Prover Guide


Table of Contents


Connection

HTTP endpoint (default):

http://127.0.0.1:8545

WebSocket endpoint (when --ws is enabled):

ws://127.0.0.1:8546

All requests use POST with Content-Type: application/json.

Address format (v0.23.0+): all addresses use 0x + 64 lowercase hex (32-byte BLAKE3 output). The legacy 0x<64 hex> Bech32m format is no longer accepted.

CORS Configuration

Control cross-origin access with --rpc-cors:

# Allow all origins
shell-node run --rpc-cors "*"

# Allow specific origins (comma-separated)
shell-node run --rpc-cors "http://localhost:3000,https://app.example.com"

Or in TOML config:

[rpc]
cors_origins = ["http://localhost:3000", "https://app.example.com"]

API Namespace Whitelist

Control which API namespaces are exposed with --rpc-api:

# Validators (minimal surface)
shell-node run --rpc-api eth,net,web3,shell

# RPC nodes (full API)
shell-node run --rpc-api eth,net,web3,shell,debug,trace

Available namespaces: eth, net, web3, shell, debug, trace

If --rpc-api is not specified, all namespaces registered by the node are available.

Rate Limiting

Per-connection rate limiting is available via --rpc-rate-limit:

shell-node run --rpc-rate-limit 100  # 100 requests/sec per connection

Or in TOML config:

[rpc]
rate_limit = 100

When the limit is exceeded, the server returns an HTTP 429 response.

WebSocket Support

Enable the WebSocket server with --ws:

shell-node run --ws --ws-port 8546

The WebSocket endpoint supports all the same JSON-RPC methods as HTTP, plus real-time PubSub subscriptions and filter-based polling via eth_newFilter, eth_newBlockFilter, and eth_getFilterChanges.

eth_subscribe (WebSocket only)

Subscribe to live events. Returns a subscription ID.

Subscription types:

Type Description
newHeads Pushes new block headers when blocks are produced or imported
logs Pushes log events matching a filter (address, topics)
newPendingTransactions Pushes transaction hashes as they enter the mempool
syncing Pushes sync status changes (syncing/not syncing)

Example — newHeads:

wscat -c ws://127.0.0.1:8546

> {"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}
< {"jsonrpc":"2.0","id":1,"result":"0x1"}
< {"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x1","result":{"number":"0xa","hash":"0x...","parentHash":"0x...","timestamp":"0x..."}}}

Example — logs with filter:

> {"jsonrpc":"2.0","id":2,"method":"eth_subscribe","params":["logs",{"address":"0x<64 hex>","topics":["0xddf2..."]}]}
< {"jsonrpc":"2.0","id":2,"result":"0x2"}

Example — newPendingTransactions:

> {"jsonrpc":"2.0","id":3,"method":"eth_subscribe","params":["newPendingTransactions"]}
< {"jsonrpc":"2.0","id":3,"result":"0x3"}
< {"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x3","result":"0xabc123..."}}

eth_unsubscribe (WebSocket only)

Cancel an active subscription.

> {"jsonrpc":"2.0","id":4,"method":"eth_unsubscribe","params":["0x1"]}
< {"jsonrpc":"2.0","id":4,"result":true}

Limits: Maximum 1024 global subscriptions, 16 per connection. Connections are auto-disconnected after repeated lag events.


eth_ Namespace

Standard Ethereum-compatible JSON-RPC methods.

eth_blockNumber

Returns the current block height.

Parameters: None

Returns: String — Hex-encoded block number.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x1a"}

eth_chainId

Returns the chain ID.

Parameters: None

Returns: String — Hex-encoded chain ID.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x539"}

eth_syncing

Returns sync status. A node may temporarily report syncing while block range catch-up is in flight; otherwise it returns false.

Parameters: None

Returns: Boolean | Objectfalse when not syncing, or a sync progress object when the node is catching up.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":false}

eth_mining

Returns whether the node is producing blocks.

Parameters: None

Returns: Booleantrue if the node has a validator keystore loaded.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":true}

eth_hashrate

Returns mining hashrate. Always "0x0" (PoA consensus, no mining).

Parameters: None

Returns: String — Always "0x0".


eth_accounts

Returns managed accounts. Always empty — the node does not hold user private keys.

Parameters: None

Returns: Array — Always [].


eth_protocolVersion

Returns the protocol version.

Parameters: None

Returns: String"0x45" (Cancun-compatible).


eth_gasPrice

Returns the current base fee.

Parameters: None

Returns: String — Hex-encoded base fee in wei for the latest chain state. The exact value changes over time as blocks are produced.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x5f7609"}

eth_maxPriorityFeePerGas

Returns the suggested priority fee. Always "0x0" on this PoA chain.

Parameters: None

Returns: String"0x0".


eth_feeHistory

Returns historical base fee and gas usage data.

Parameters:

# Type Required Description
1 String Yes Block count (hex) — max 1024
2 String Yes Newest block (block tag or hex number)
3 Array<Number> No Reward percentiles

Returns: Object with oldestBlock, baseFeePerGas, gasUsedRatio, reward.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_feeHistory","params":["0x5","latest",[]],"id":1}'
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "oldestBlock": "0x15",
    "baseFeePerGas": ["0x8e4f6f","0x7c4681","0x6c1761","0x5f7609","0x53a8d3","0x48c470"],
    "gasUsedRatio": [0.0, 0.0, 0.0, 0.0, 0.0],
    "reward": []
  }
}

eth_getBalance

Returns the balance of an address.

Parameters:

# Type Required Description
1 String Yes Address (0x<64 hex> canonical; legacy 0x... accepted on some input paths)
2 String No Block tag ("latest", "earliest", "pending", "safe", "finalized", or hex number)

Returns: String — Hex-encoded balance in wei.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x<64 hex>","latest"],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x3635c9adc5dea00000"}

eth_getTransactionCount

Returns the nonce (transaction count) for an address.

Parameters:

# Type Required Description
1 String Yes Address (0x<64 hex> canonical; legacy 0x... accepted on some input paths)
2 String No Block tag

Returns: String — Hex-encoded nonce.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x<64 hex>","latest"],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x0"}

eth_getBlockByNumber

Returns a block by number.

Parameters:

# Type Required Description
1 String Yes Block tag or hex number
2 Boolean Yes true for full transaction objects, false for hashes only

Supported block tags: "latest", "earliest", "pending", "safe", "finalized".

When "pending" is requested, a pseudo-block is constructed from the current mempool.

Returns: Object|null — Block object or null if not found.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}'
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "number": "0x1a",
    "hash": "0xabc...",
    "parentHash": "0xdef...",
    "timestamp": "0x65a5f200",
    "gasLimit": "0x1c9c380",
    "gasUsed": "0x0",
    "transactions": []
  }
}

eth_getBlockByHash

Returns a block by hash.

Parameters:

# Type Required Description
1 String Yes Block hash (0x-prefixed, 32 bytes)
2 Boolean Yes true for full tx objects, false for hashes

Returns: Object|null — Block object or null.


eth_getTransactionByHash

Returns a transaction by hash. Checks the mempool first, then on-chain storage. Shell reward records are first-class system transactions, so block gas rewards and STARK rewards are also discoverable by their deterministic transaction hash.

Parameters:

# Type Required Description
1 String Yes Transaction hash (0x-prefixed, 32 bytes)

Returns: Object|null — Transaction object or null.

Shell-specific transaction metadata:

Field Description
shellType Product-readable type: transfer, contractCreate, contractCall, aaBatch, blockGasReward, or starkReward
rewardKind Present for reward system transactions: blockGasReward or starkReward
rewardLayer STARK layer for prover rewards, hex encoded
rewardSourceHash Parent block, source range, or artifact hash used to derive the reward
originalSize / compressedSize STARK compression accounting, hex byte counts
decodedInput (v0.22+) Structured proof amendment payload for starkReward txs: { layer, blockNumber, startBlock, endBlock, nSigs, compressedSize, originalSize, settlementTxHash }. null for all other transaction types.
curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0xabc123..."],"id":1}'

eth_getTransactionReceipt

Returns the receipt of a mined transaction.

Parameters:

# Type Required Description
1 String Yes Transaction hash

Returns: Object|null — Receipt object (includes status, gasUsed, logs, blockNumber, shellType, rewardKind, etc.) or null if not yet mined.


eth_sendRawTransaction

Submits a signed transaction. Accepts RLP-encoded or JSON-encoded transaction bytes.

Parameters:

# Type Required Description
1 String Yes Hex-encoded signed transaction data

Returns: String — Transaction hash.

Validation: The transaction's max_fee_per_gas must be ≥ the current base fee.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x...signed_tx_bytes..."],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0xabc123..."}

eth_call

Executes a read-only call against the EVM (no state changes).

Parameters:

# Type Required Description
1 Object Yes Call request: {from?, to, data?, value?, gas?}
2 String No Block tag

Returns: String — Hex-encoded return data.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x<64 hex>","data":"0x..."},"latest"],"id":1}'

eth_estimateGas

Estimates gas for a transaction. Returns gas_used × 1.2 with a minimum of 21,000.

Parameters:

# Type Required Description
1 Object Yes Call request: {from?, to?, data?, value?}

Returns: String — Hex-encoded gas estimate.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"to":"0x<64 hex>","value":"0xde0b6b3a7640000"}],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x5208"}

eth_createAccessList

Creates an EIP-2930 access list for a transaction.

Parameters:

# Type Required Description
1 Object Yes Call request
2 String No Block tag

Returns: Object with accessList and gasUsed.


eth_getCode

Returns the bytecode at an address.

Parameters:

# Type Required Description
1 String Yes Address
2 String No Block tag

Returns: String — Hex-encoded bytecode, or "0x" for accounts without runtime code.


eth_getStorageAt

Returns a storage slot value.

Parameters:

# Type Required Description
1 String Yes Address
2 String Yes Storage position (hex-encoded, 32-byte key)
3 String No Block tag

Returns: String — Zero-padded 32-byte hex value.


eth_getLogs

Returns logs matching a filter.

Parameters:

# Type Required Description
1 Object Yes Filter: {address?, topics?, fromBlock?, toBlock?}

Returns: Array — Log objects with address, topics, data, blockNumber, blockHash, transactionHash, transactionIndex, logIndex, removed.

Uses bloom filters for fast block-level filtering. The block range is capped at MAX_BLOCK_RANGE to prevent DoS.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"0x0","toBlock":"latest"}],"id":1}'

eth_newFilter

Creates a poll-based log filter.

Parameters:

# Type Required Description
1 Object Yes Filter: {address?, topics?, fromBlock?, toBlock?}

Returns: String — Filter ID.


eth_newBlockFilter

Creates a poll-based block filter.

Parameters: None

Returns: String — Filter ID.


eth_getFilterChanges

Returns changes since last poll for a filter.

Parameters:

# Type Required Description
1 String Yes Filter ID

Returns: Array — Logs (for log filters) or block hashes (for block filters).


eth_getFilterLogs

Re-queries all logs matching a filter's criteria.

Parameters:

# Type Required Description
1 String Yes Filter ID

Returns: Array — Log objects.


eth_uninstallFilter

Removes a filter.

Parameters:

# Type Required Description
1 String Yes Filter ID

Returns: Booleantrue if the filter was removed.


eth_blobBaseFee

Returns the current blob gas price (EIP-4844).

Parameters: None

Returns: String — Hex-encoded blob gas price, calculated from excess_blob_gas.


eth_sign (not supported)

Returns error code -32601. The node does not hold private keys — sign transactions client-side with the CLI or SDK.

eth_signTransaction (not supported)

Returns error code -32601. Same reason as eth_sign.

eth_getCompilers (deprecated)

Returns []. This method is deprecated.


net_ Namespace

net_version

Returns the network/chain ID as a decimal string.

Parameters: None

Returns: String — Chain ID (e.g., "1337").

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"net_version","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"1337"}

net_listening

Returns whether the node is accepting connections. Always true.

Parameters: None

Returns: Booleantrue.


net_peerCount

Returns the number of connected peers.

Parameters: None

Returns: String — Hex-encoded peer count (e.g., "0x3").

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}'

web3_ Namespace

web3_clientVersion

Returns the client identifier string.

Parameters: None

Returns: String"shell-chain/0.21.0".

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"shell-chain/0.21.0"}

web3_sha3

Returns the Keccak-256 hash of the given data.

Parameters:

# Type Required Description
1 String Yes Hex-encoded data (max 32 KB)

Returns: String — Hex-encoded Keccak-256 hash.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f"],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8"}

shell_ Namespace

Shell-chain custom extensions for post-quantum features, validator governance, and node information.

shell_getPqPubkey

Returns the post-quantum public key associated with an address.

Parameters:

# Type Required Description
1 String Yes Address (0x<64 hex> canonical; legacy 0x... accepted on some input paths)

Returns: String|null — Hex-encoded PQ public key, or null if not found.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getPqPubkey","params":["0x<64 hex>"],"id":1}'

shell_pendingCount

Returns the number of pending transactions in the mempool.

Parameters: None

Returns: String — Hex-encoded count.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_pendingCount","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"0x0"}

shell_sendTransaction

Submits a pre-signed shell-chain transaction.

Parameters:

# Type Required Description
1 Object Yes Signed transaction object

Returns: String — Transaction hash.


shell_getValidators

Returns the current validator set.

Parameters: None

Returns: Array<String> — List of validator addresses.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getValidators","params":[],"id":1}'
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    "0x0000000000000000000000000000000000000000000000000000000000000001",
    "0x0000000000000000000000000000000000000000000000000000000000000002"
  ]
}

shell_getValidatorStatus

Returns whether an address is a validator.

Parameters:

# Type Required Description
1 String Yes Address

Returns: Object:

{
  "address": "0x<64 hex>",
  "isValidator": true
}

shell_proposeAddValidator

Submits a governance transaction to add a validator (requires the node to have a proposer keystore).

Parameters:

# Type Required Description
1 String Yes Address to add

Returns: String — Transaction hash.


shell_proposeRemoveValidator

Submits a governance transaction to remove a validator.

Parameters:

# Type Required Description
1 String Yes Address to remove

Returns: String — Transaction hash.


shell_encodeAddValidator

Generates calldata for the validator management system contract (does not submit a transaction).

Parameters:

# Type Required Description
1 String Yes Address to add

Returns: String — Hex-encoded calldata.


shell_encodeRemoveValidator

Generates calldata for validator removal.

Parameters:

# Type Required Description
1 String Yes Address to remove

Returns: String — Hex-encoded calldata.


shell_estimateGovernanceGas

Estimates gas for a governance operation.

Parameters:

# Type Required Description
1 String Yes Operation: "addValidator", "removeValidator", "getValidators", or "isValidator"

Returns: String — Hex-encoded gas estimate.


shell_getGovernanceInfo

Returns governance configuration.

Parameters: None

Returns:

{
  "validatorCount": 3,
  "validators": ["0x<64 hex>", "0x<64 hex>", "0x<64 hex>"],
  "systemContractAddress": "0x0000000000000000000000000000000000000000000000000000000000000001",
  "proposalGasLimit": 100000
}

shell_getNodeInfo

Returns node status information.

Parameters: None

Returns:

{
  "version": "ShellChain/v0.23.0/rust",
  "chainId": 1337,
  "blockHeight": 42,
  "peerCount": 0,
  "txPoolSize": 5,
  "isMining": true,
  "uptime": 3600,
  "baseFee": "0x5f7609"
}
curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getNodeInfo","params":[],"id":1}'

shell_getNetworkStats

Returns P2P network statistics.

Parameters: None

Returns:

{
  "peerCount": 0,
  "protocolVersion": "shell/1.0.0",
  "listeningAddress": "/ip4/0.0.0.0/tcp/30303",
  "protocols": ["gossipsub", "kademlia", "mdns"]
}

shell_getChainStats

Returns aggregate chain statistics. totalTransactions and gasUsedTotal cover the canonical chain from block 0 through the current head; avgBlockTime is computed from the most recent block-time window.

Parameters: None

Returns:

{
  "blockHeight": 1500,
  "totalTransactions": 3200,
  "avgBlockTime": 2.01,
  "gasUsedTotal": "0x...",
  "latestBaseFee": "0x5f7609"
}

shell_getFinalityInfo

Returns finality status.

Parameters: None

Returns:

{
  "lastFinalizedBlock": "0x18",
  "currentHead": "0x1a",
  "pendingAttestations": 2
}

shell_getBlockSigners

Returns the post-quantum signature details for validators who signed a specific block.

Parameters:

# Type Required Description
1 String Yes Block number (hex) or block tag

Returns:

{
  "blockNumber": "0x1a",
  "signers": [
    {
      "address": "0x<64 hex>",
      "pqPubkey": "0x...",
      "signatureValid": true
    }
  ]
}

shell_verifyPqSignature

Verifies a Dilithium3 post-quantum signature against a message and public key.

Parameters:

# Type Required Description
1 String Yes Hex-encoded message
2 String Yes Hex-encoded Dilithium3 signature
3 String Yes Hex-encoded Dilithium3 public key

Returns: Booleantrue if the signature is valid.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_verifyPqSignature","params":["0xmessage...","0xsignature...","0xpubkey..."],"id":1}'

shell_getEpochInfo

Returns information about the current consensus epoch.

Parameters: None

Returns:

{
  "currentEpoch": 5,
  "epochLength": 0,
  "blocksInEpoch": 1500,
  "currentBlockTime": 2.01,
  "activeValidators": 3
}

shell_getValidatorVotes

Returns voting activity statistics for validators in recent blocks.

Parameters: None

Returns:

{
  "validators": [
    {
      "address": "0x<64 hex>",
      "blocksProduced": 500,
      "lastBlockProduced": "0x1a",
      "uptime": 99.8
    }
  ]
}

shell_getPendingGovernanceProposals

Returns pending governance proposals that have not yet been finalized.

Parameters: None

Returns:

{
  "proposals": [
    {
      "type": "addValidator",
      "target": "0x<64 hex>",
      "proposer": "0x<64 hex>",
      "proposedAt": "0x18",
      "status": "pending"
    }
  ]
}

shell_addValidator / shell_removeValidator (disabled)

These methods return error -32601. Direct validator set mutation is disabled to prevent split-brain issues. Use shell_proposeAddValidator and shell_proposeRemoveValidator instead, which go through the governance transaction flow.

shell_transactionCount

Returns the total number of transactions stored across all blocks (chain-wide counter, not per-address nonce).

Parameters: none

Response: "0x<hex>" — total transaction count as a hex string.

curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_transactionCount","params":[],"id":1}'
# → {"result":"0x1a4f"}

shell_getTransactionsByAddress

Returns transactions sent from or received by an address. Supports pagination and inclusive block-range filters. There is no artificial deep-offset cap; under live load, clients should pin toBlock from the first page and reuse it for older pages to avoid gaps or duplicates while new blocks arrive.

Parameters:

Name Type Description
address string 0x<64 hex> address
fromBlock number | null Start block (inclusive, default 0)
toBlock number | null End block (inclusive, default latest)
page number | null Page index, 0-based (default 0)
limit number | null Results per page (default 20)

Response: paginated object:

Field Type Description
address string Queried 0x<64 hex> address
fromBlock string Effective inclusive lower block bound, hex encoded
toBlock string Effective inclusive upper block snapshot, hex encoded
page number Page index, 0-based
limit number Page size
total number Total matches in the requested range
transactions array Transaction summaries, including shellType/reward metadata when present
curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getTransactionsByAddress","params":["0x<64 hex>",0,null,0,20],"id":1}'

shell_getBlockWitnesses

Returns the PQ witness bundle for a block — the individual Dilithium3 signatures stored separately from TX bodies. Returns null when witnesses have been pruned (STARK proof received) or the block predates B3 storage.

Parameters:

Name Type Description
block string Block hash (0x...) or block number ("0x<hex>" / "latest")

Response fields:

Field Type Description
blockHash string Block hash
witnessRoot string witness_root from block header
witnessCount number Number of witnesses in bundle
witnesses array [{ txIndex, sigType, signature, pubkey? }, ...]

Returns null when no witness bundle is stored (pruned or not applicable).

curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getBlockWitnesses","params":["latest"],"id":1}'

shell_verifyWitnessRoot

Light-client verifier — recomputes the Merkle root over stored witnesses and compares it against the block header's witness_root field.

Parameters:

Name Type Description
block string Block hash (0x...), hex block number, "latest", or "earliest"

Response fields:

Field Type Description
blockHash string Block hash
expectedRoot string witness_root from block header
computedRoot string Merkle root recomputed over stored witnesses
verified boolean | null true if roots match, null when information is unavailable
reason string? Populated when verified is null

Possible reason values:

curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_verifyWitnessRoot","params":["latest"],"id":1}'

shell_ — Account Abstraction (v0.18.0)

shell_estimateBatch

Estimates gas for an AA batch transaction (tx type 0x7E).

Parameters:

{
  "from": "0x...",
  "inner_calls": [
    { "to": "0x...", "value": "0x0", "data": "0x", "gas_limit": "0x5208" }
  ]
}

from is optional. inner_calls must have 1–16 entries, each with a non-zero gas_limit.

Response:

{
  "total_gas": "0x...",
  "outer_intrinsic": "0x...",
  "inner_sum": "0x...",
  "intrinsic_surcharge": "0x...",
  "per_inner": [
    { "gas_limit": "0x5208", "simulated": true },
    { "gas_limit": "0x7530", "simulated": false }
  ]
}

Errors:

Code Condition
-32602 inner_calls is empty or exceeds 16; any gas_limit is 0
-32000 EVM simulation fails
curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_estimateBatch","params":[{"inner_calls":[{"to":"0xabc...","value":"0x0","data":"0x","gas_limit":"0x5208"}]}],"id":1}'

shell_getPaymasterPolicy

Returns the paymaster policy for an address. Always returns a policy object — unregistered addresses receive the default "eoa-open" policy (never null).

Parameters:

Name Type Description
address string Account address (0x<64 hex> or 0x...)

Response:

{
  "address": "0x...",
  "has_pq_pubkey": false,
  "pubkey_bytes": null,
  "balance": "0x...",
  "policy": "eoa-open",
  "max_gas_sponsorship": null
}
curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getPaymasterPolicy","params":["0xabc..."],"id":1}'

shell_isSponsored

Returns whether a transaction was sponsored by a paymaster.

Parameters:

Name Type Description
txHash string Transaction hash

Response (found):

{
  "found": true,
  "location": "chain",
  "is_aa_bundle": true,
  "sponsored": true,
  "paymaster": "0x...",
  "sender": "0x...",
  "inner_call_count": 2
}

Response (not found):

{
  "found": false,
  "sponsored": false,
  "is_aa_bundle": false,
  "paymaster": null,
  "sender": null,
  "inner_call_count": 0,
  "location": null
}

No error is returned for unknown hashes.

curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_isSponsored","params":["0xtxhash..."],"id":1}'

shell_ — Ops (v0.18.0)

shell_getStorageProfile

Returns the node's current storage profile configuration.

Response:

{
  "profile": "full",
  "body_retention": 0,
  "witness_retention": 128,
  "keep_recent": 0,
  "proof_replacement_grace": 0,
  "state_pruning_experimental": false
}

Errors: -32003 if no storage profile is configured.

See also: Storage Profiles guide

curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_getStorageProfile","params":[],"id":1}'

shell_setBalance (dev/testnet only)

Directly sets the balance of an address. Only available when api_modules includes dev. Returns -32601 on production nodes.

Parameters:

Name Type Description
address string Target 0x<64 hex> address
balance string New balance in wei as decimal string

Response: true on success.

curl -s http://localhost:8545 -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"shell_setBalance","params":["0x<64 hex>","1000000000000000000"],"id":1}'

debug_ Namespace

Note: The debug namespace must be explicitly enabled via --rpc-api eth,net,web3,shell,debug. It is not enabled by default on validator nodes.

debug_traceTransaction

Replays a transaction and returns an execution trace.

Parameters:

# Type Required Description
1 String Yes Transaction hash
2 Object No Trace options

Returns:

{
  "frame": {
    "type": "CALL",
    "from": "0x<64 hex>",
    "to": "0x<64 hex>",
    "gas": 21000,
    "gasUsed": 21000,
    "input": "0x",
    "output": "0x",
    "value": "0xde0b6b3a7640000",
    "error": null
  },
  "failed": false
}
curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["0xabc123..."],"id":1}'

debug_traceBlockByNumber

Traces all transactions in a block.

Parameters:

# Type Required Description
1 String Yes Block number (hex) or block tag
2 Object No Trace options

Returns: Array — Array of trace result objects (one per transaction).

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["0x1a"],"id":1}'

trace_ Namespace

OpenEthereum-compatible trace format.

Note: Like debug, the trace namespace must be explicitly enabled via --rpc-api.

trace_block

Returns traces for all transactions in a block.

Parameters:

# Type Required Description
1 String Yes Block number (hex) or block tag

Returns: Array — OpenEthereum-format trace objects.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"trace_block","params":["latest"],"id":1}'

trace_oeTransaction

Returns the trace for a specific transaction in OpenEthereum format.

Parameters:

# Type Required Description
1 String Yes Transaction hash

Returns: Array — Single-element array with the transaction trace.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"trace_oeTransaction","params":["0xabc123..."],"id":1}'

trace_transaction

Returns the trace for a specific transaction in standard format.

Parameters:

# Type Required Description
1 String Yes Transaction hash

Returns: Array — Trace objects for the transaction.

curl -s http://localhost:8545 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"trace_transaction","params":["0xabc123..."],"id":1}'

Method Summary

Namespace Method Params Description
eth_ eth_blockNumber Current block height
eth_ eth_chainId Chain ID
eth_ eth_syncing Sync status
eth_ eth_mining Is validator active
eth_ eth_hashrate Always 0x0
eth_ eth_accounts Always []
eth_ eth_protocolVersion Protocol version
eth_ eth_gasPrice Current base fee
eth_ eth_maxPriorityFeePerGas Always 0x0
eth_ eth_feeHistory count, block, percentiles Fee history
eth_ eth_getBalance addr, block? Account balance
eth_ eth_getTransactionCount addr, block? Account nonce
eth_ eth_getBlockByNumber num, full? Block by number
eth_ eth_getBlockByHash hash, full? Block by hash
eth_ eth_getTransactionByHash hash Transaction details
eth_ eth_getTransactionReceipt hash Transaction receipt
eth_ eth_sendRawTransaction data Submit signed tx
eth_ eth_call tx, block? Read-only EVM call
eth_ eth_estimateGas tx Gas estimation
eth_ eth_createAccessList tx, block? Access list
eth_ eth_getCode addr, block? Contract bytecode
eth_ eth_getStorageAt addr, pos, block? Storage slot
eth_ eth_getLogs filter Event logs
eth_ eth_newFilter filter Create log filter
eth_ eth_newBlockFilter Create block filter
eth_ eth_getFilterChanges id Poll filter
eth_ eth_getFilterLogs id Re-query filter
eth_ eth_uninstallFilter id Remove filter
eth_ eth_blobBaseFee Blob gas price
eth_ eth_subscribe type, filter? WebSocket subscription
eth_ eth_unsubscribe id Cancel subscription
net_ net_version Chain ID (string)
net_ net_listening Always true
net_ net_peerCount Peer count
web3_ web3_clientVersion Client version
web3_ web3_sha3 data Keccak-256 hash
shell_ shell_getPqPubkey addr PQ public key
shell_ shell_pendingCount Mempool size
shell_ shell_sendTransaction tx Submit PQ tx
shell_ shell_getValidators Validator list
shell_ shell_getValidatorStatus addr Validator check
shell_ shell_proposeAddValidator addr Governance: add
shell_ shell_proposeRemoveValidator addr Governance: remove
shell_ shell_encodeAddValidator addr Encode calldata
shell_ shell_encodeRemoveValidator addr Encode calldata
shell_ shell_estimateGovernanceGas op Gov gas estimate
shell_ shell_getGovernanceInfo Gov config
shell_ shell_getNodeInfo Node status
shell_ shell_getNetworkStats Network stats
shell_ shell_getChainStats Chain statistics
shell_ shell_getFinalityInfo Finality status
shell_ shell_getBlockSigners num Block PQ signers
shell_ shell_verifyPqSignature msg, sig, pubkey Verify PQ signature
shell_ shell_getEpochInfo Epoch info
shell_ shell_getValidatorVotes Validator activity
shell_ shell_getPendingGovernanceProposals Pending proposals
shell_ shell_transactionCount Total tx count
shell_ shell_getTransactionsByAddress addr, page Tx history by address
shell_ shell_getBlockWitnesses block PQ witness bundle
shell_ shell_verifyWitnessRoot block Verify witness Merkle root
shell_ shell_estimateBatch request AA batch gas estimate
shell_ shell_getPaymasterPolicy addr Paymaster policy
shell_ shell_isSponsored txHash Sponsored tx lookup
shell_ shell_getStorageProfile Node storage profile
shell_ shell_setBalance (dev) addr, balance Force-set balance
debug_ debug_traceTransaction hash, opts? Tx trace
debug_ debug_traceBlockByNumber num, opts? Block trace
trace_ trace_block num OE block traces
trace_ trace_oeTransaction hash OE tx trace
trace_ trace_transaction hash Standard tx trace

Total: 70 methods (31 eth, 3 net, 2 web3, 29 shell, 2 debug, 3 trace)


Last updated: v0.18.0 (2026-04)