{"id":"ERC-181","name":"ENS Reverse Resolution","status":"Final","chain":"ethereum","category":{"id":"comprehension","name":"Comprehension & Display","description":"Making blockchain data readable to humans"},"journeyStages":[{"id":"authentication","name":"Authentication & Identity","description":"Proving who you are and logging in"},{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"}],"uxImpact":"ERC-181 provides reverse ENS records that suggest a name for an address. Before showing that name as identity, forward-resolve it and require it to match the original address on the intended network. If the lookup is missing, fails or mismatches, display the address instead.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-181","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-181","specConstraints":[{"id":"erc-181-claim-resolver-owner","constraint":"Claiming a reverse record with a resolver sets that resolver and transfers the record to the provided owner.","appliesTo":"application","normativity":"normative","specQuote":"When called by account `x`, instructs the ENS registry to set the resolver of the name `hex(x) + '.addr.reverse'` to the specified resolver, then transfer ownership of the name to the provided address, and return the namehash of the ENS record thus transferred.","specSection":"Specification — Registrar — function claimWithResolver(address owner, address resolver)","specUrl":"https://ercs.ethereum.org/ERCS/erc-181#function-claimwithresolveraddress-owner-address-resolver-returns-bytes32-node","designImplication":"In setup and recovery UI, show the calling account, resolver, and destination owner as separate values. Do not imply that setting a reverse name only changes a display label."},{"id":"erc-181-empty-name-fallback","constraint":"A reverse resolver must return a valid ENS name or an empty string when none is defined.","appliesTo":"application","normativity":"normative","specQuote":"Resolvers that implement this interface must return a valid ENS name for the requested node, or the empty string if no name is defined for the requested node.","specSection":"Specification — Resolver interface","specUrl":"https://ercs.ethereum.org/ERCS/erc-181#resolver-interface","designImplication":"Keep the original address as the fallback identifier. Treat an empty result as name-unavailable, and separately forward-resolve any returned name before promoting it as a verified label."}],"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-181","type":"official-spec"}],"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","summary":"ERC-181 provides reverse ENS records that suggest a name for an address. Before showing that name as identity, forward-resolve it and require it to match the original address on the intended network. If the lookup is missing, fails or mismatches, display the address instead.","designerTakeaways":["Fetch a reverse record when the displayed address benefits from a readable label.","Show a verified ENS name with the original address available, and fall back to the address when verification is unavailable.","Display the address, not the proposed name, when forward and reverse resolution mismatch."],"applicability":{"whenToUse":["Addresses appear in feeds, send flows, or leaderboards.","Users benefit from human-readable identity.","ENS reverse records exist on your target chain."],"whenToAvoid":["Internal-only addresses never shown to users.","Performance constraints forbid reverse lookups.","Chain lacks ENS or compatible naming."]},"prototypeFirst":[{"screen":"Verified reverse-name display","why":"Show a reverse name only after forward resolution matches the original address.","covers":["Reverse record","Forward-match result"],"include":["Address fallback","Refresh policy","Identity disclosure"]},{"screen":"Missing or mismatched reverse record","why":"Reverse resolution can be absent, stale, or fail the forward check.","covers":["No reverse record","Forward mismatch"],"include":["Plain-language reason","Fallback action"]},{"screen":"Lookup recovery","why":"A name lookup should fail back to the address without losing context.","covers":["Resolver timeout","Stale or changed record"],"include":["Retry path","Support context"]},{"screen":"Address and resolver disclosure","why":"Users may need to inspect the original address, resolver, and refresh state.","covers":["Original address","Resolver and network","Last verified state"],"include":["Expandable section","Copy buttons","Explorer link"]}],"statesToDesign":[{"state":"Reverse lookup pending","trigger":"The client requests the reverse record for an address.","userNeed":"See an address while the name is checked.","designResponse":"Keep the address primary until the reverse/forward check completes."},{"state":"Name verified","trigger":"The candidate reverse name resolves forward to the original address on the intended network.","userNeed":"Use a readable name without losing destination confidence.","designResponse":"Show the name with the address available and a verification/source detail."},{"state":"Name unavailable","trigger":"No reverse record, resolver response, or supported network result is available.","userNeed":"Continue with an unambiguous identifier.","designResponse":"Show the original address and explain that no verified name is available."},{"state":"Name mismatch","trigger":"The reverse candidate does not resolve to the original address.","userNeed":"Avoid a misleading identity label.","designResponse":"Keep the address primary and exclude the candidate from identity labels."},{"state":"Verified result stale","trigger":"A cached verified result reaches its refresh boundary or the address/network changes.","userNeed":"Know whether the displayed name is current.","designResponse":"Refresh in the background and fall back to the address if verification no longer holds."}],"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":"When can a reverse name be primary?","recommendation":"Require forward resolution to match the original address on the intended network and retain an address fallback.","rationale":"Reverse records suggest a name but do not independently prove its address binding or identity."}],"problemsSolved":[{"problem":"Addresses are difficult to label consistently","oldWay":"Every client invents reverse lookup and fallback behavior","newWay":"A compatible client can query the reverse record and apply a forward-match check","impact":"high"},{"problem":"Unverified names can mislead users","oldWay":"A client displays a reverse record without checking its forward address","newWay":"The UI keeps the address primary until the name/address match is verified","impact":"high"},{"problem":"Resolver failures and stale records are hard to recover from","oldWay":"A missing or changed name produces a blank or misleading label","newWay":"Mapped pending, mismatch, stale, and address-fallback states explain what to do next","impact":"medium"}],"uxPatterns":[{"name":"Name-First Address Chip","description":"Show ENS name with truncated address on hover.","components":["AddressChip","ENSResolver","AvatarFallback"],"userFlow":["Address displayed","Reverse lookup runs","Forward-resolve the candidate and show the name only when the result matches the original address","Keep the address accessible; use it as the primary label if validation fails"]},{"name":"Mismatch Warning","description":"Flag when forward and reverse disagree.","components":["MismatchBanner","VerifyLink"],"userFlow":["Reverse lookup returns a candidate name","Forward resolution does not match the original address","Display the original address and explain that its reverse name failed verification","Keep the unverified name out of primary identity labels"]}],"antiPatterns":[{"pattern":"Displaying a reverse name without forward verification","why":"A reverse record can be missing, stale, or mismatched to the address","instead":"Show the address first and promote the name only after a matching forward lookup","severity":"critical"},{"pattern":"Hiding the original address behind a name","why":"Users need the destination identifier even when a readable name is available","instead":"Use readable name copy with a visible address and resolver/network detail","severity":"high"},{"pattern":"No address fallback when reverse lookup fails","why":"A resolver timeout or mismatch should not block an otherwise valid address display","instead":"Explain the limitation and retain the original address","severity":"high"}],"vocabulary":[{"use":"Verified name","avoid":"Official identity","why":"A forward-checked reverse record is a label, not universal identity proof."},{"use":"Name unavailable","avoid":"Address invalid","why":"A missing reverse record does not make the original address invalid."},{"use":"Show address","avoid":"Trust this name","why":"Keep the destination visible and make the forward-match check explicit."}],"technicalNotes":"ERC-181 reverse records are controlled by the address owner. Forward-resolve the returned name and require equality with the original address before displaying it as the primary name. Use an ENS-aware library or Universal Resolver with forward-match checks. Cache verified results with a refresh policy; missing, stale or mismatched results fall back to the address.","relatedStandards":[{"id":"ERC-137","relationship":"Forward ENS resolution complement"},{"id":"ERC-162","relationship":"ENS name acquisition via registrar"}]},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-181","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-181","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-181","markdown":"https://www.eipsfordesigners.com/standards/ERC-181/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-181/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-181","official":"https://ercs.ethereum.org/ERCS/erc-181","discussion":"https://ethereum-magicians.org/search?q=ERC-181"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}