# Agent instructions

You are advising on UX and product design for **EIP-3668: CCIP Read (Offchain Data Retrieval)**.
This document is the authoritative designer guide from EIPs for Designers.

- Treat **MUST NOT** items as hard constraints unless the user explicitly overrides.
- Use the **Vocabulary** section for UI copy; do not use avoided terms.
- Cite the canonical source URL when giving recommendations.
- Use the official specification only for protocol implementation detail, not as primary UX guidance.

---

# EIP-3668: CCIP Read (Offchain Data Retrieval)

Source: https://www.eipsfordesigners.com/standards/EIP-3668
Agent brief: https://www.eipsfordesigners.com/standards/EIP-3668/agent.md
Machine-readable JSON: https://www.eipsfordesigners.com/api/standards/EIP-3668
Last reviewed: 2026-05-25
Last updated: 2026-05-25

| Field | Value |
| --- | --- |
| Status | Final |
| Chain | both |
| Category | Comprehension & Display |
| Journey stages | Asset Discovery & Display, Reading & Understanding |
| Detailed guide | Yes |
| Official specification | https://eips.ethereum.org/EIPS/eip-3668 |
| Discussion search | https://ethereum-magicians.org/search?q=EIP-3668 |

## UX Impact

Contracts fetch offchain data transparently — ENS names can resolve from L2s or external sources without users knowing. Design implications: show loading states during offchain lookups, indicate data source in advanced views (on-chain vs gateway), handle gateway failures gracefully with retries. Design decisions: which gateways to trust (security/privacy tradeoff), timeout handling for slow gateways, whether to show users that offchain lookup occurred, caching validated responses.

## Summary

Contracts fetch offchain data transparently — ENS names can resolve from L2s or external sources without users knowing.

## For Designers

- You can show loading states during offchain lookups without exposing CCIP jargon.
- Your advanced view can indicate data source when relevant.
- You can retry gracefully when gateways fail.

## Applicability

### When to Use

- ENS or contract data requires offchain resolution.
- Users expect fast name or metadata lookups.
- Your app uses CCIP-enabled contracts.

### When to Avoid

- All data is fully onchain with no gateway dependency.
- Gateway infrastructure is unreliable without fallback.
- Privacy requirements forbid offchain lookups.

## Problems It Solves

### Inconsistent behavior across apps

Impact: high

Old way: Each team reinvents copy and edge cases

New way: Shared standard gives predictable UX patterns

### Users surprised by on-chain rules

Impact: high

Old way: Generic transfer UI fails at submit time

New way: Standard-aware UI sets expectations upfront

### Support burden from opaque errors

Impact: medium

Old way: Raw revert reasons in toasts

New way: Mapped states explain what to do next

## MUST NOT (Anti-Patterns)

- **Hiding standard-imposed restrictions until submit** (critical)
  - Why: Users feel tricked when actions fail at the last step
  - Instead: Show eligibility and badges before the primary CTA

- **Protocol jargon in user-facing copy** (high)
  - Why: Non-technical users cannot consent informedly
  - Instead: Use outcome language with optional technical disclosure

- **No fallback when wallet lacks support** (high)
  - Why: Dead-end flows increase churn
  - Instead: Explain limitation and offer alternate path or network

## Design Decisions

### How much protocol detail do users see?

Recommendation: Lead with outcomes; tuck identifiers behind review.

Rationale: Users decide on consequences, not function selectors.

### What happens when support is missing?

Recommendation: Block with explanation and fallback path.

Rationale: Silent failure feels like a broken product.

### How do you label restricted assets?

Recommendation: Use persistent badges for non-transferable, locked, or expiring states.

Rationale: Hidden restrictions cause rage-quits at transfer time.

## States to Design

### Ready

Trigger: Prerequisites met.

User need: Understand what happens next.

Design response: Enable primary action with plain-language preview.

### Awaiting signature

Trigger: Wallet prompt open.

User need: Know what they are approving.

Design response: Mirror human-readable summary in app and wallet.

### Pending

Trigger: Transaction submitted.

User need: Confidence it is progressing.

Design response: Show status strip with explorer link.

### Succeeded

Trigger: On-chain confirmation.

User need: See updated ownership or balance.

Design response: Celebrate outcome and show new state clearly.

### Failed or reverted

Trigger: Validation or execution failed.

User need: Fix or retry without guessing.

Design response: Name the failed constraint and offer a concrete next step.

## Vocabulary

- Use "Your balance / Your item" instead of "Token ID / Token contract": Ownership language matches mental models.

- Use "Cannot transfer yet" instead of "Transfer reverted": Explain restriction without EVM vocabulary.

- Use "Confirm in wallet" instead of "Sign transaction": Matches wallet UX users already know.

## UX Patterns

### Resolving Indicator

Loading state during CCIP lookup.

Components: ResolveSpinner, RetryButton

User flow:

- User triggers lookup
- Spinner shows
- Data resolves or retries
- Result displayed

Mockup registry key: `concept/typed-data` (React UI on the live standard page).

### Gateway Fallback

Switch gateways on failure.

Components: FallbackGateway, ErrorBanner

User flow:

- Primary gateway fails
- App tries alternate
- User sees progress
- Success or clear error

Mockup registry key: `concept/typed-data` (React UI on the live standard page).

## What to Prototype First

### Primary happy path

Prove the core user promise before edge cases.

Covers: Success state, Clear outcome copy

- Primary CTA
- Confirmation feedback
- Next step

### Blocked or unsupported state

Users discover limits when wallets or chains lack support.

Covers: Unsupported wallet, Wrong network

- Plain-language reason
- Fallback action

### Failure recovery

Trust breaks when errors look like bugs.

Covers: User rejection, Transaction revert

- Retry path
- Support context

### Advanced disclosure

Power users need technical detail without cluttering the default path.

Covers: Contract address, Token ID, Raw status

- Expandable section
- Copy buttons
- Explorer link

## Mental Model

### Onchain request

A contract call triggers a revert with instructions to fetch data that is not stored onchain.

### Gateway fetch

The client calls an offchain gateway URL from the revert payload. This lookup is invisible to users if your loading state is clear.

### Verified response

The gateway returns data plus proof the contract can verify. Failed gateways need retry copy, not opaque errors.

### Transparent resolution

The call resumes with fetched data. Users see ENS names or metadata resolve without CCIP jargon in the default path.

### Source disclosure

Advanced views can note offchain source when trust or privacy matters. Default UX should feel like instant lookup.

## Seen in the Wild

- ENS App: CCIP Read enables L2 and offchain ENS resolution. (https://app.ens.domains/)

- Uniswap: Offchain data fetching patterns in DeFi interfaces. (https://app.uniswap.org/)

- Chainlink: Oracle and CCIP infrastructure for offchain data. (https://chain.link/)

## On Monad

### Confirmation speed

Ethereum: Multi-step flows can feel slow between signatures

Monad: Sub-second finality tightens feedback loops

Design implication: Prefer inline status over long pending modals on Monad.

### Transaction cost

Ethereum: Gas can discourage exploratory actions

Monad: Lower fees enable lighter-weight interactions

Design implication: Safe to offer preview retries and social actions more freely.

## Related Standards

- ERC-137: ENS resolution uses CCIP Read — https://www.eipsfordesigners.com/standards/ERC-137/agent.md

- EIP-5169: TokenScript may use offchain resources — https://www.eipsfordesigners.com/standards/EIP-5169/agent.md

## Technical Notes

EIP-3668 CCIP Read requires gateway trust decisions and timeout handling in UI.

## Official specification (reference only)

https://eips.ethereum.org/EIPS/eip-3668
