TriportRPC

RPC error 3 / -32000: execution reverted

Last updated:

At a glance

Error details
PropertyValue
Applies toEthereum, Polygon, BNB Smart Chain, Base and Robinhood Chain
JSON-RPC code3, or -32000 with the same text
OriginThe contract, relayed unchanged
RetryableNo — deterministic for that block
Revert payload0x08c379a0 = Error(string); custom errors use their own selector
Ethereum, Polygon, BSC, BasePassed through as returned
Robinhood ChainPassed 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.