# Ignored external call or hook failure

External call, hook, or async result whose error or return value is never checked before continuing

_Area: Smart contract access control and control flow. Seen in 3 disclosed reports; latest 2025-04-10. Updated 2026-11-01._

## How it works
A caller invokes an external function, hook, or async API and then proceeds as if it succeeded, without inspecting the result. The broken assumption is that "no error returned" or "the error variable is nil" means success. In practice the failure signal lives somewhere the caller never looks: a discarded result object, an error packed into the first return value, or a revert that bubbles up in a form the caller cannot interpret. The caller's own state advances while the callee's effect is lost or misread.

## Where it shows up
- A call whose return value (struct, `sdk.Result`, response object) is assigned to `_` or dropped entirely.
- Error checked only in one position when the API returns errors in a response field with a nil error variable [E2](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AM-13.md).
- Direct handler invocation that bypasses framework plumbing (event managers, middleware) [E1](https://bugbountylibrary.com/r/c4%3A2025-01-initia-rollup-modules%3AM-03.md).
- External call to a possibly CCIP-aware callee with no try/catch around it [E3](https://bugbountylibrary.com/r/c4%3A2023-04-ens%3AM-07.md).

## How to review
For every external call, hook, and async result, confirm the caller inspects the exact field the callee uses to signal failure, and that any side effect the caller relies on (event emission, state write, retry) actually propagates to the parent context. The invariant: if the callee fails or emits, the caller must observe it before committing its own state change. Check the SDK's real return convention rather than assuming [E2](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AM-13.md); check whether framework-level plumbing (event manager, baseapp) is bypassed by a direct call, and whether the returned `sdk.Result`'s events are re-emitted to the parent context [E1](https://bugbountylibrary.com/r/c4%3A2025-01-initia-rollup-modules%3AM-03.md); check that nested protocol errors are caught and re-validated where the spec requires it [E3](https://bugbountylibrary.com/r/c4%3A2023-04-ens%3AM-07.md).

## Variants seen
- Discarded result object: hook's `sdk.Result` dropped, events never reach parent context, funds locked [E1](https://bugbountylibrary.com/r/c4%3A2025-01-initia-rollup-modules%3AM-03.md).
- Wrong error slot: retry logic checks the nil error variable while the real error sits in the response [E2](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AM-13.md).
- Uncaught nested revert: missing try/catch lets a nested protocol revert bubble with a mismatched sender field [E3](https://bugbountylibrary.com/r/c4%3A2023-04-ens%3AM-07.md).

## Impact and severity
Consequences ranged from permanently locked funds [E1](https://bugbountylibrary.com/r/c4%3A2025-01-initia-rollup-modules%3AM-03.md) to silently disabled retry safety nets [E2](https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AM-13.md) and broken client interoperability [E3](https://bugbountylibrary.com/r/c4%3A2023-04-ens%3AM-07.md). Severity rises when the unchecked path is the only route to recover or complete an operation, and when the failure is silent (no event, no log), leaving no on-chain trace to diagnose.

## Evidence
- E1: https://bugbountylibrary.com/r/c4%3A2025-01-initia-rollup-modules%3AM-03.md
- E2: https://bugbountylibrary.com/r/sherlock%3A2024-06-allora%3AM-13.md
- E3: https://bugbountylibrary.com/r/c4%3A2023-04-ens%3AM-07.md
