RPC error 3 / -32000: execution reverted
Last updated:
At a glance
| Property | Value |
|---|---|
| Applies to | Ethereum, Polygon, BNB Smart Chain, Base and Robinhood Chain |
| JSON-RPC code | 3, or -32000 with the same text |
| Origin | The contract, relayed unchanged |
| Retryable | No — deterministic for that block |
| Revert payload | 0x08c379a0 = Error(string); custom errors use their own selector |
| Ethereum, Polygon, BSC, Base | Passed through as returned |
| Robinhood Chain | Passed through; revert reason readable via debug_traceCall (best-effort) |
Cause
A contract stopped execution with REVERT during eth_call, eth_estimateGas or a trace. Nodes report it either as JSON-RPC code 3 or as -32000 with the text 'execution reverted'; both forms reach you unchanged, because a revert is a result about your transaction rather than an upstream fault. When the contract used a require with a message, the error carries a data payload beginning 0x08c379a0 — the ABI selector of Error(string) — and the reason is decodable from it.
Solution
- Decode error.data: a payload starting 0x08c379a0 is Error(string) and holds the human-readable reason; custom errors carry their own four-byte selector, which you can match against your ABI.
- Re-run the same call through debug_traceCall on a network that publishes it to see where execution stopped, rather than guessing from the message alone.
- Check the block you pinned: a call that succeeds at latest and reverts at an older block usually means state, not logic — see header not found for the archive boundary.
- Do not retry unchanged. The result is deterministic for that block and state; a retry returns the same revert.
Example
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": 3,
"message": "execution reverted",
"data": "0x08c379a0…"
}
}FAQ
- Is execution reverted a Triport error?
- No. It is the chain's answer to your call, and we hand it back unchanged — including the data payload, which is where the reason lives.
- Why is there no reason text?
- The contract reverted without a message, or used a custom error. Only a require with a string produces the 0x08c379a0 Error(string) payload; custom errors identify themselves by a four-byte selector you match against your ABI.