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

Errors can be bubbled up

A caller can pass a child’s failure bytes onward.

LET’S PICTURE IT

A help desk can forward the original report rather than writing a new one.

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.

Follow the nested call

If A calls B and B fails, A receives a failure outcome under low-level call handling. Higher-level calls may propagate the failure unless it is caught.

Distinguish forwarding from replacement

A can propagate the same revert bytes, wrap them in another error or handle the failure and continue. The outer result depends on the caller’s actual code.

Do not assume the outer contract authored the message

When bytes are forwarded unchanged, the message visible at the top can originate deeper in the call chain. The final payload does not carry an authenticated call history.

Inspect every relevant boundary

A useful trace identifies which frame first failed and how each caller responded. Decoding the final bytes alone cannot show all those propagation decisions.

Inspect the example

0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000f4e6f207469636b657473206c6566740000000000000000000000000000000000

The same byte sequence can be returned by a child and forwarded by a parent.

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

Does the final message necessarily originate in the direct target?

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.