{"id":"EIP-3668","name":"CCIP Read (Offchain Data Retrieval)","status":"Final","chain":"both","category":{"id":"comprehension","name":"Comprehension & Display","description":"Making blockchain data readable to humans"},"journeyStages":[{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"},{"id":"reading","name":"Reading & Understanding","description":"Interpreting what you're being asked to do"}],"uxImpact":"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.","hasDetailedContent":true,"content":{"id":"EIP-3668","sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-3668","type":"official-spec"}],"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25","summary":"Contracts fetch offchain data transparently — ENS names can resolve from L2s or external sources without users knowing.","designerTakeaways":["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":{"whenToUse":["ENS or contract data requires offchain resolution.","Users expect fast name or metadata lookups.","Your app uses CCIP-enabled contracts."],"whenToAvoid":["All data is fully onchain with no gateway dependency.","Gateway infrastructure is unreliable without fallback.","Privacy requirements forbid offchain lookups."]},"prototypeFirst":[{"screen":"Primary happy path","why":"Prove the core user promise before edge cases.","covers":["Success state","Clear outcome copy"],"include":["Primary CTA","Confirmation feedback","Next step"]},{"screen":"Blocked or unsupported state","why":"Users discover limits when wallets or chains lack support.","covers":["Unsupported wallet","Wrong network"],"include":["Plain-language reason","Fallback action"]},{"screen":"Failure recovery","why":"Trust breaks when errors look like bugs.","covers":["User rejection","Transaction revert"],"include":["Retry path","Support context"]},{"screen":"Advanced disclosure","why":"Power users need technical detail without cluttering the default path.","covers":["Contract address","Token ID","Raw status"],"include":["Expandable section","Copy buttons","Explorer link"]}],"mentalModel":[{"label":"Onchain request","description":"A contract call triggers a revert with instructions to fetch data that is not stored onchain."},{"label":"Gateway fetch","description":"The client calls an offchain gateway URL from the revert payload. This lookup is invisible to users if your loading state is clear."},{"label":"Verified response","description":"The gateway returns data plus proof the contract can verify. Failed gateways need retry copy, not opaque errors."},{"label":"Transparent resolution","description":"The call resumes with fetched data. Users see ENS names or metadata resolve without CCIP jargon in the default path."},{"label":"Source disclosure","description":"Advanced views can note offchain source when trust or privacy matters. Default UX should feel like instant lookup."}],"statesToDesign":[{"state":"Ready","trigger":"Prerequisites met.","userNeed":"Understand what happens next.","designResponse":"Enable primary action with plain-language preview."},{"state":"Awaiting signature","trigger":"Wallet prompt open.","userNeed":"Know what they are approving.","designResponse":"Mirror human-readable summary in app and wallet."},{"state":"Pending","trigger":"Transaction submitted.","userNeed":"Confidence it is progressing.","designResponse":"Show status strip with explorer link."},{"state":"Succeeded","trigger":"On-chain confirmation.","userNeed":"See updated ownership or balance.","designResponse":"Celebrate outcome and show new state clearly."},{"state":"Failed or reverted","trigger":"Validation or execution failed.","userNeed":"Fix or retry without guessing.","designResponse":"Name the failed constraint and offer a concrete next step."}],"designDecisions":[{"question":"How much protocol detail do users see?","recommendation":"Lead with outcomes; tuck identifiers behind review.","rationale":"Users decide on consequences, not function selectors."},{"question":"What happens when support is missing?","recommendation":"Block with explanation and fallback path.","rationale":"Silent failure feels like a broken product."},{"question":"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."}],"problemsSolved":[{"problem":"Inconsistent behavior across apps","oldWay":"Each team reinvents copy and edge cases","newWay":"Shared standard gives predictable UX patterns","impact":"high"},{"problem":"Users surprised by on-chain rules","oldWay":"Generic transfer UI fails at submit time","newWay":"Standard-aware UI sets expectations upfront","impact":"high"},{"problem":"Support burden from opaque errors","oldWay":"Raw revert reasons in toasts","newWay":"Mapped states explain what to do next","impact":"medium"}],"uxPatterns":[{"name":"Resolving Indicator","description":"Loading state during CCIP lookup.","mockup":"concept/typed-data","components":["ResolveSpinner","RetryButton"],"userFlow":["User triggers lookup","Spinner shows","Data resolves or retries","Result displayed"]},{"name":"Gateway Fallback","description":"Switch gateways on failure.","mockup":"concept/typed-data","components":["FallbackGateway","ErrorBanner"],"userFlow":["Primary gateway fails","App tries alternate","User sees progress","Success or clear error"]}],"seenInTheWild":[{"app":"ENS App","url":"https://app.ens.domains/","note":"CCIP Read enables L2 and offchain ENS resolution."},{"app":"Uniswap","url":"https://app.uniswap.org/","note":"Offchain data fetching patterns in DeFi interfaces."},{"app":"Chainlink","url":"https://chain.link/","note":"Oracle and CCIP infrastructure for offchain data."}],"antiPatterns":[{"pattern":"Hiding standard-imposed restrictions until submit","why":"Users feel tricked when actions fail at the last step","instead":"Show eligibility and badges before the primary CTA","severity":"critical"},{"pattern":"Protocol jargon in user-facing copy","why":"Non-technical users cannot consent informedly","instead":"Use outcome language with optional technical disclosure","severity":"high"},{"pattern":"No fallback when wallet lacks support","why":"Dead-end flows increase churn","instead":"Explain limitation and offer alternate path or network","severity":"high"}],"vocabulary":[{"use":"Your balance / Your item","avoid":"Token ID / Token contract","why":"Ownership language matches mental models."},{"use":"Cannot transfer yet","avoid":"Transfer reverted","why":"Explain restriction without EVM vocabulary."},{"use":"Confirm in wallet","avoid":"Sign transaction","why":"Matches wallet UX users already know."}],"onMonad":[{"aspect":"Confirmation speed","ethereum":"Multi-step flows can feel slow between signatures","monad":"Sub-second finality tightens feedback loops","designImplication":"Prefer inline status over long pending modals on Monad."},{"aspect":"Transaction cost","ethereum":"Gas can discourage exploratory actions","monad":"Lower fees enable lighter-weight interactions","designImplication":"Safe to offer preview retries and social actions more freely."}],"technicalNotes":"EIP-3668 CCIP Read requires gateway trust decisions and timeout handling in UI.","relatedStandards":[{"id":"ERC-137","relationship":"ENS resolution uses CCIP Read"},{"id":"EIP-5169","relationship":"TokenScript may use offchain resources"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-3668","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-3668","type":"discussion"},{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-3668","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-3668","markdown":"https://www.eipsfordesigners.com/standards/EIP-3668/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-3668/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-3668","official":"https://eips.ethereum.org/EIPS/eip-3668","discussion":"https://ethereum-magicians.org/search?q=EIP-3668"},"freshness":{"lastReviewed":"2026-05-25","lastUpdated":"2026-05-25"}}