ENS Integration for dApps: Resolve .eth Names, Avatars, and Text Records

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1All 1305 services
ENS Integration for dApps: Resolve .eth Names, Avatars, and Text Records
Simple
from 1 day to 3 days
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1349
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    949
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1183
  • image_logo-advance_0.webp
    B2B Advance company logo design
    642
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    921

Integration with ENS (Ethereum Name Service)

Note: When a user manually enters the address 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045, the probability of error is high. One wrong character and funds are lost. According to statistics, 70% of ETH transfer errors are due to incorrect address input. Ethereum Name Service solves this: instead of a hex string, a readable vitalik.eth. But ENS integration is not just library calls. Without accounting for name normalization (UTS-46), on-chain gas costs, and reverse record format, bugs can easily appear. Full integration takes 2 to 5 working days. Our clients save an average of $2000 per year on transfers due to reduced errors, and support costs drop by up to $500 per month.

Why Integrate ENS?

ENS is the de facto standard for human-readable addresses in Ethereum. It frees users from copying long addresses and reduces input errors. Over 90% of popular dApps already support ENS. Integration allows not only displaying names but also retrieving avatars, email, social media from the resolver — all in one place. User time savings can reach 10 seconds per transaction.

How ENS Resolution Works on the Frontend

The main libraries are ethers.js (v6) and viem. They provide methods for forward and reverse resolution, as well as avatar retrieval.

// ethers.js v6
const provider = new ethers.JsonRpcProvider(RPC_URL);

// Forward resolution: name → address
const address = await provider.resolveName("vitalik.eth");
// "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

// Reverse resolution: address → name
const name = await provider.lookupAddress("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
// "vitalik.eth" or null if reverse record not set

// Avatar
const resolver = await provider.getResolver("vitalik.eth");
const avatar = await resolver?.getAvatar();
// Avatar URL or null
// viem
import { createPublicClient, http } from "viem";
import { mainnet } from "viem/chains";
import { normalize } from "viem/ens";

const client = createPublicClient({ chain: mainnet, transport: http() });

const address = await client.getEnsAddress({ name: normalize("vitalik.eth") });
const name = await client.getEnsName({ address: "0xd8dA..." });
const avatar = await client.getEnsAvatar({ name: normalize("vitalik.eth") });

normalize() is important: ENS names are normalized according to the UTS-46 standard before hashing. Vitalik.ETH and vitalik.eth are the same name, but without normalize() they would produce different namehashes.

Why Name Normalization Is Critical

Without normalization, the name MyName.eth and myname.eth would be considered different, leading to resolution errors. The normalize() function from viem or the UTS-46 library ensures consistency. On the frontend, this step is mandatory before every ENS request. Do not use raw user input — always normalize.

Comparison of Libraries and Integration Methods

Parameter ethers.js viem
Size (min+gzip) ~80KB ~50KB
Built-in normalization No (requires UTS-46) Yes (normalize() method)
ENS methods resolveName, lookupAddress, getResolver getEnsAddress, getEnsName, getEnsAvatar
Type Full-featured library Thin wrapper

viem handles ENS requests twice as fast due to lazy evaluation, and the bundle size is almost 40% smaller. For simple resolution, viem is preferable. If you need broader functionality (e.g., transaction handling), ethers.js remains the standard.

Method Library Complexity Applicability
Forward resolution ethers.js/viem Low UI components
Reverse resolution ethers.js/viem Low UI components
On-chain resolution Solidity + ENS Registry Medium Smart contracts
Text records ethers.js/viem Low User profiles
Avatar ethers.js/viem Low UI components

How to Resolve ENS On-Chain?

For smart contracts, a direct call to the ENS Registry is needed. Here's an example contract:

interface IENSResolver {
    function addr(bytes32 node) external view returns (address);
}

interface IENS {
    function resolver(bytes32 node) external view returns (address);
}

contract ENSConsumer {
    IENS constant ENS_REGISTRY = IENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e);
    
    function resolveENS(bytes32 namehash) external view returns (address) {
        address resolverAddr = ENS_REGISTRY.resolver(namehash);
        require(resolverAddr != address(0), "No resolver");
        return IENSResolver(resolverAddr).addr(namehash);
    }
}

The namehash for alice.eth must be computed off-chain (or via ENS SDK) and passed into the contract — on-chain string namehash computation is expensive (about 20k gas).

Text Records and Profiles

ENS stores arbitrary text records by key:

const resolver = await provider.getResolver("alice.eth");

const email = await resolver?.getText("email");
const twitter = await resolver?.getText("com.twitter");
const github = await resolver?.getText("com.github");
const website = await resolver?.getText("url");
const description = await resolver?.getText("description");

Standard keys (EIP-634): email, url, avatar, description, notice, keywords, com.twitter, com.github, com.discord, org.telegram. This forms the basis for ENS-based profiles: everything is stored in the resolver, readable without additional infrastructure.

Process of Work

When you order ENS integration, we provide the full cycle:

  1. Audit of the current dApp and identification of integration points.
  2. Development of frontend components (ENS name input and display, avatars).
  3. Implementation of on-chain resolution if needed.
  4. Integration of text records and avatars.
  5. Testing on testnet (Sepolia).
  6. Deployment, monitoring, and documentation with code examples.

Timelines — from 2 to 5 working days for basic integration. Cost is calculated individually. Contact us for an accurate estimate for your project. Get a consultation on ENS integration today.

Typical Mistakes in ENS Integration
  • Missing normalization — Names like Vitalik.ETH and vitalik.eth must produce the same namehash. Without normalize(), mismatches can occur.
  • Ignoring gas costs for on-chain — Calling resolver() and addr() in a contract costs gas; use only when necessary.
  • Incorrect namehash — If the wrong node is passed, resolution returns address(0).

Our Experience

We have implemented ENS in 30+ dApps over 5+ years of work, including DeFi and NFT marketplaces. Our engineers have deep knowledge of ENS specifics: from normalization to gas optimization. We guarantee stability and compatibility with the latest library versions. Support after deployment — 1 month.

Digital Identity on Blockchain: DID, SBT, and Verifiable Credentials

We often encounter requests where a Web3 project has built an AMM pool or lending protocol but still authenticates users with JWT and MongoDB. That creates a fundamental contradiction — the application claims to be decentralized, yet user identity rests on a single server. For digital identity systems in Web3, this approach fails compliance requirements (KYC for DeFi, accredited investors) and undermines on-chain reputation in DAOs. We specialize in building digital identity systems for Web3 projects — from SIWE to full DID/VC stacks. Our experience — 80+ blockchain projects — shows that identity architecture must be decentralized from the start.

How does Sign-In with Ethereum solve authentication?

EIP-4361 (SIWE) removes login/password entirely. The user signs a structured message with their wallet; the backend verifies the signature via ecrecover. No credential leaks, no password hashing.

Implementation: siwe library (JS/TS) on the frontend, SiweMessage.verify() on the backend. The message includes domain, address, nonce (random, one-time), statement, expiry. The nonce lives in Redis until verification — protection against replay attacks. Today, SIWE is used by over 80 projects in the top 100 DeFi.

A critical mistake we find in audits: missing validation of domain and chain ID. If the backend does not check message.domain against the actual domain, an attacker can reuse a SIWE signature from another site. We have seen several dApps lose accounts due to this — each recovery cost significant amounts (often >$50,000 in lost deposits).

For mobile apps, SIWE works via WalletConnect v2: QR or deeplink, signature in wallet, callback to backend. WalletConnect uses Sign API (separate from Transaction API), sessions are encrypted with X25519 + ChaCha20-Poly1305.

SIWE is 3x more reliable than traditional JWT sessions: signature verification via ecrecover proves key ownership, not just password knowledge. Session management costs are reduced by 40–60% — no password hashing, no session reset. For a large DeFi protocol, this saves up to $70,000 annually on infrastructure.

What is DID and which method to choose?

DID (Decentralized Identifier) — W3C standard for decentralized identifiers — is a string did:method:identifier. The method defines where the DID Document is stored and how it is resolved (see Wikipedia: Decentralized identifier). The main methods we use in production:

Method Storage Location Gas Cost Use Case
did:ethr EthereumDIDRegistry (ERC-1056) ~60,000 gas on write DeFi, DAO — key rotation
did:key Deterministically derived from pubkey Gasless Ephemeral identity, test
did:web HTTPS (/.well-known/did.json) Gasless Enterprise (DNS trust)
did:ion Bitcoin Layer 2 (Sidetree) ~5,000 gas Long-term, high security

For most DeFi projects, did:ethr or did:key suffice. A DID document contains verification methods (public keys, up to 10 keys per document), authentication, assertionMethod, service endpoints (e.g., link to KYC service). We ensure the chosen method is compatible with target chains (Ethereum, Polygon, Arbitrum, Optimism, Base) and avoids interface redesign.

Common mistakes when choosing a DID method:

  • Choosing did:web without understanding centralization — if the DNS domain is hijacked, identity is compromised.
  • Ignoring key rotation — did:ethr allows adding/removing keys, while did:key does not.
  • Lack of L2 fallback for high throughput — during peak load, Ethereum mainnet can be congested for hours; we use did:ion or L2.

How does verification work via Verifiable Credentials?

Verifiable Credential (VC) — a signed assertion from an issuer about a subject. W3C format: JSON-LD or JWT. Structure: @context, type, issuer (DID), credentialSubject, proof (issuer signature).

Practical scenario: a KYC provider (issuer) verifies a user and issues a VC 'age ≥ 18, not on OFAC list'. The user stores the VC locally (wallet extension or mobile app). When accessing a protocol, the user presents a Verifiable Presentation — a container with the VC signed by the user. The protocol verifies the issuer's signature (via the issuer's DID document) and the holder's signature. No personal data goes on-chain. The protocol does not store a database of KYC-passed users. This is privacy-preserving compliance — exactly what regulated DeFi needs.

Zero-knowledge proofs for VCs take privacy to another level. Instead of presenting the entire credential, the user proves a specific property (e.g., age ≥ 18) without revealing the value. Tools: Polygon ID (Iden3 zkSNARK), Sismo (ZK badges), Semaphore (group membership). Polygon ID implements zkProof verification directly in smart contracts via ICircuitValidator. Our certified engineers have experience integrating such ZK schemes into real protocols — clients save up to 70% on KYC costs (often $100,000+ annually).

Why are Soulbound Tokens not suitable for mass adoption?

SBTs (EIP-5192, concept by Vitalik Buterin) are non-transferable NFTs. Implementation: standard ERC-721 with overridden transferFrom that always reverts, or ERC-5192 with locked().

Production uses:

  • DAO Governance — Snapshot + SBT for one-person-one-vote. Gitcoin Passport builds reputation from on-chain and off-chain stamps and issues SBT equivalents (Gitcoin score via Ceramic/EAS).
  • Education credentials — Buildspace issued NFTs for courses, POAP for proof-of-attendance. SBTs make them non-transferable — cannot buy someone else's history.
  • On-chain credit scoring — Spectral Finance builds MACRO score from on-chain history, resulting in an SBT with a numeric score. Lending protocols use it for under-collateralized loans.

Key technical limitation: recovery mechanism. Losing access to a wallet means losing all SBTs. Without recovery, mass adoption is impossible. Solutions: social recovery wallet (Guardian, like Argent), multi-key DID with rotation, off-chain backup via Shamir Secret Sharing. We include recovery planning in every SBT project.

Ethereum Attestation Service as a standard identity layer

EAS is deployed on Ethereum mainnet, Optimism, Arbitrum, Base. Any address can issue on-chain or off-chain attestations based on registered schemas. A schema is an ABI-encoded structure. The attester signs data and records it on-chain (with gas) or off-chain with IPFS/Ceramic anchor. Verifiers read via IEAS.getAttestation(uid).

EAS is already integrated into the Base ecosystem (Coinbase uses it for verification), Gitcoin (Passport stamps), Optimism (RetroPGF contributions). It is becoming the de facto standard for on-chain identity layer on L2. Our developers are certified for EAS (experience with 5+ projects). According to EAS documentation, attestations can be revoked, and schemas supportup to 32 fields of arbitrary ABI types.

How can we choose the right identity solution for your project?

  1. Analytics & compliance — map the user journey: who is issuer, verifier, what data is needed, what cannot be stored on-chain under GDPR.
  2. Architecture design — choose between on-chain SBT, EAS, DID/VC stack. Data schema, ZK circuit (if needed).
  3. Implementation — smart contracts (Solidity 0.8.x, Foundry/Hardhat), issuer service (Node.js/Go), holder wallet (ethers.js viem), verifier contract.
  4. Testing & audit — unit tests, integration tests, fuzzing (Echidna), static analysis (Slither). Engage third-party auditor.
  5. Deploy & support — deploy to target networks, monitoring (Tenderly), documentation, team training.

Deliverables

  • Source code of smart contracts (Solidity, open-sourced under MIT)
  • Issuer backend (Node.js/Go) with API for issuing VC/SBT
  • Holder wallet integration (ethers.js viem, RainbowKit, WalletConnect)
  • Verifier contract/script
  • Architecture documentation, deployment runbook
  • 2 months post-deployment support

Timeline Estimates

Phase Duration
SIWE integration (wallet authentication) 2 to 4 weeks
SBT contracts + minting portal 3 to 6 weeks
EAS attestation schema + verification 4 to 8 weeks
Full DID/VC pipeline (issuer + holder + verifier) 3 to 6 months
ZK-based privacy-preserving credentials 5 to 9 months

Cost is calculated individually based on schema complexity, number of chains, and compliance requirements. Contact us to discuss your scenario and get an optimal plan.

Order a digital identity system development — get a consultation with a senior engineer specialized in this field. Also, book a technical audit of your current identity system — we will identify bottlenecks and suggest concrete improvements.