# Missing recursive calls handling in OffchainDNSResolver CCIP-aware contract

OffchainDNSResolver.resolveCallback lacks try/catch for nested OffchainLookup errors, so a CCIP-aware dnsresolver's revert bubbles up with a mismatched sender field, breaking EIP-3668 clients.

- Payout: Audit contest
- Severity: medium
- Program: ENS
- Found by: MalfurionWhitehat
- Disclosed: 2023-08-31
- Write-up quality: 6/10
- Original: https://code4rena.com/reports/2023-04-ens#m-07
- Library page: https://bugbountylibrary.com/r/c4%3A2023-04-ens%3AM-07
- Tags: area:web3 domain:web3 impact:integrity kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:source-review vuln:misconfiguration

**Target:** OffchainDNSResolver.resolveCallback (EIP-3668 CCIP-aware contract)
**Root cause:** resolveCallback calls IExtendedDNSResolver(dnsresolver).resolve without catching OffchainLookup reverts, violating EIP-3668's requirement that CCIP-aware callers catch and re-validate the sender field of nested OffchainLookup errors.
**Steps:**
1. Client calls `OffchainDNSResolver.resolve`, which reverts with OffchainLookup and prompts the client to call `resolveCallback` after fetching gateway data.
2. The RRset returned by the gateway contains a `dnsresolver` that is CCIP-aware and supports `IExtendedDNSResolver.resolve.selector`.
3. `resolveCallback` calls `IExtendedDNSResolver(dnsresolver).resolve(name,query,context)`, which can revert with another OffchainLookup whose sender does not match the dnsresolver.
4. Solidity default revert bubbling returns that OffchainLookup to the client unmodified, so the sender field is incorrect per the EIP.
**How found:** Read the EIP-3668 spec requirement that CCIP-aware callers MUST catch nested OffchainLookup errors and compare sender, then checked resolveCallback and found no try/catch around the external resolve call.
**Insight:** When auditing CCIP/EIP-3668-aware contracts, check every external call to a potentially CCIP-aware callee for a try/catch that re-validates the OffchainLookup sender; default Solidity revert bubbling silently violates the spec.

