In this track: Read logs and failures
advanced · 4 MIN READ

Link an error to a call frame

Find the first failing frame and the callers that handled it.

LET’S PICTURE IT

A chain of forwarded reports needs a timeline showing who encountered the original problem.

SEE IT FOR YOURSELF
Follow a revert and decode its error dataStep 1 / 4
Follow a revert and decode its error dataRequested actionTransfer 100 raw unitsExample inputsAvailable balance40 raw unitsCheck the ruleA deliberately failing local scenario, not a live transactionCondition fails100 > 40Request rejectedRollbackNo successful transferConsumed gas still mattersTop-level failure and a caught nested failure have different contextsError selector0x08c379a04 bytesMessage tailNot enough tokensDynamic string encodingCustom errors and Panic use different selectors and schemasDecoded messageNot enough tokensA diagnostic clueFurther evidenceCaller and code pathRelevant stateError bytes can be constructed by code; decoding is not authentication

This fictional call requests a transfer of one hundred raw units while the relevant balance is forty.

Animated local teaching model. No wallet, RPC or live blockchain data. Some labels and hashes are abbreviated for readability.

List the call tree

Record A calling B and B calling C, including the relevant inputs and execution context. A flat transaction destination does not describe the whole nested interaction.

Locate the first failure

Find the frame where execution first reverts or halts exceptionally. Its immediate return bytes can differ from the payload eventually exposed by the outermost frame.

Track each response

A parent can catch, transform, ignore or propagate the child failure. Read both the success flag and returned bytes at each boundary before assigning a root cause.

Separate trace results from chain inclusion

A simulation trace explains a run with particular state and settings. It is not automatically proof of a finalized transaction or a guarantee that a later run follows the same path.

Inspect the example

A → B → C
C: reverts with Error("No tickets left")
B: catches C and reverts with its own custom error
A: forwards B’s bytes

Final bytes describe B’s error; C still explains an earlier failure.

A simplified trace showing why the final payload is not the complete failure history.

TURN UNDERSTANDING INTO PRACTICEOpen the Revert decoder →
QUICK CHECK · NO PRESSURE

Can a parent replace a child’s error with a new one?

Your progress stays in this browser.
Keep exploring the original referenceSolidity documentation ↗

Original explanations by EtherTools. Examples are educational and source-linked; this site is independent of the Ethereum Foundation. Our approach.