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.
Standard methods
Section titled “Standard methods”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.
eth_sendRawTransaction
Section titled “eth_sendRawTransaction”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.
Refused by policy
Section titled “Refused by policy”| 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).
Batched requests are rejected
Section titled “Batched requests are rejected”Send one JSON-RPC request per HTTP call. Batch arrays are refused.
Fee methods
Section titled “Fee methods”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.
The frost_ namespace
Section titled “The frost_ namespace”frost_historyStatus
Section titled “frost_historyStatus”What history this node retains. Post-quantum signatures make storage expensive enough that nodes deliberately retain different amounts, so ask rather than assume.
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. |
frost_getStrippedTransaction
Section titled “frost_getStrippedTransaction”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.
frost_getSignatureSidecar
Section titled “frost_getSignatureSidecar”A block’s elided witness bytes, or null once pruned. Together with the
stripped record this reconstructs the original transaction exactly.
frost_validateTransaction
Section titled “frost_validateTransaction”Ask whether a raw transaction would be admitted, without submitting it.
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.
Submission validation
Section titled “Submission validation”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.
Which node to talk to
Section titled “Which node to talk to”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.