Why a call failed
Telling apart a call that hit its own error from one that was undone because something above it failed.
#Plain languageIn plain terms
Calls inside a transaction are nested like boxes. If an outer box fails, everything inside it is undone, even steps that worked perfectly on their own.
So "failed" can mean two different things. The call may have broken. Or the call may have been fine and was rolled back because something that contained it broke. Forensia records which, because they point an investigator in different directions.
#How it worksHow it works
While walking the call trace, each call is checked for its own error. Each call also inherits whether anything above it failed. Combining the two gives the origin of the failure.
#Technical detailThe exact rules
| Own error | Something above failed | Origin | Shown as |
|---|---|---|---|
| Yes | No | frame | Call reports an error |
| No | Yes | ancestor | Rolled back with enclosing execution |
| Yes | Yes | frame-and-ancestor | Call error and enclosing rollback |
| No | No | none | Not failed |
A call has its own error when the trace frame carries an error or a revertReason. For the top-level call, "something above failed" is seeded from the receipt, so when the whole transaction failed every nested call is at least ancestor.
The label is checked for consistency before it is trusted. Walking up the tree from each failed call, frame requires that no call above it failed, and the other two require that at least one did. A mismatch is reported as a conflict.
The three labels are shown only when the step's call trace record was captured and its request matches this transaction. Otherwise the step reads "Failed execution". The amount beside a failed call is labelled "Attempted value", or "Call-context value" for DELEGATECALL, CALLCODE and STATICCALL.
#LimitsWhat it does not tell you
- A call reporting its own error does not mean the whole transaction failed. The caller may have handled it and carried on.
- In every failed case the displayed value is an attempt, not a completed movement.
- This describes execution as the provider reported it. It says nothing about transaction fees, which are paid either way.
- Older saved results have no origin recorded. It is not reconstructed for them.