Skip to content

JSON-RPC

Frost speaks standard Ethereum JSON-RPC. The public endpoint at https://rpc.frostfi.net is a Frost ingress: it handles submissions itself and proxies reads to an execution layer behind it.

The full eth_, net_, and web3_ read surface is proxied and behaves exactly as you expect — eth_getBalance, eth_call, eth_estimateGas, eth_getLogs, eth_getBlockByNumber, eth_getTransactionReceipt, eth_getCode, eth_getStorageAt, eth_chainId, and the rest.

Any Ethereum library, explorer, or indexer works against it unmodified.

Handled by the ingress rather than proxied. It accepts every standard transaction type plus type 0x06 frame transactions.

The returned hash is the keccak-256 of the raw bytes, as usual. But its meaning differs:

Before forwarding, the ingress validates the submission — see Submission validation below.

Method Why
eth_sendTransaction The endpoint holds no keys.
eth_sign
eth_signTransaction
eth_signTypedData

Anything else outside the allowlist returns -32601 (method not found).

Send one JSON-RPC request per HTTP call. Batch arrays are refused.

Frost is fee-blind, which shows up here:

Method Returns
eth_maxPriorityFeePerGas 0x0, always
eth_gasPrice The base fee

Tooling that reads these does the right thing automatically. Tooling with a hardcoded tip wastes gas for no benefit.

What history this node retains. Post-quantum signatures make storage expensive enough that nodes deliberately retain different amounts, so ask rather than assume.

Terminal window
curl -s https://rpc.frostfi.net -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"frost_historyStatus","params":[]}'
{
"tier": "tx-history",
"headBlock": "0xdb703",
"earliestFullBody": "0xd8ff3",
"historyCutoff": "0x0",
"persistedState": "0xd8b18"
}
Field Meaning
tier The node’s retention tier.
headBlock Current head.
earliestFullBody Oldest block for which a full body is available.
historyCutoff Below this, history has been expired entirely.
persistedState Oldest block whose state is still available for eth_call against a historical block.

The permanently retained, signature-stripped record of one transaction, with an inclusion proof against the block header’s strippedTransactionsRoot. This is how historical transactions stay verifiable after their multi-kilobyte witnesses have been pruned.

A block’s elided witness bytes, or null once pruned. Together with the stripped record this reconstructs the original transaction exactly.

Ask whether a raw transaction would be admitted, without submitting it.

Terminal window
curl -s https://rpc.frostfi.net -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"frost_validateTransaction",
"params":["0x06…"]}'
{ "valid": true, "reason": "", "sender": "0x…", "nonce": 5, "stateNonce": 5 }

This runs your account’s real VERIFY frame under the submission-gate rules — bounded gas, banned-opcode tracer — and returns a reason if it would be refused. It is the fastest way to debug a signature problem.

Advisory only. It is never consensus-relevant, and a node that answers differently from another is not a fork.

Before forwarding a frame transaction to consensus, the ingress simulates its VERIFY-frame prefix under the ERC-7562 validation rules: a bounded gas budget and a tracer that rejects reads of mutable global state. It also applies verdict caching, duplicate refusal, a nonce-gap bound, per-sender in-flight caps, and rate and size limits.

A transaction with a bad post-quantum signature is therefore refused at submission with a reason, rather than being ordered and then silently skipped.

This is a courtesy, not a safety property. The actual guarantee is underneath: consensus orders bytes without validating them, and every execution layer skips invalid transactions identically and deterministically. The gate saves block space; the determinism prevents forks.

Validation is stateful in one way worth knowing: the account need not exist yet (that is the whole point of counterfactual onboarding), but its address must already be funded, because admission reads the payer’s balance from head state. Make sure a funding transaction is mined, not merely accepted, before submitting a first send.

Submissions must reach a validator. The public endpoint routes correctly; a follower node’s ingress will not accept submissions.

For deep historical queries, check frost_historyStatus and use a node whose tier covers what you need. See Node types.