Настройка ENS-резольвера для dApp
ENS (Ethereum Name Service) — система DNS-подобных имён для Ethereum. Резолвинг vitalik.eth → 0xd8dA6BF... работает через on-chain lookup в контракте ENS Registry. В большинстве dApp это нужно в двух местах: в поле ввода адреса (пользователь вводит .eth имя вместо hex-адреса) и при отображении адресов — reverse lookup превращает 0xd8dA... в читаемое имя.
Резолвинг через viem / wagmi
Современный стек с wagmi v2 и viem предоставляет готовые хуки:
import { useEnsAddress, useEnsName, useEnsAvatar } from 'wagmi';
// Forward: имя → адрес
const { data: address } = useEnsAddress({
name: 'vitalik.eth',
chainId: 1, // только mainnet
});
// Reverse: адрес → имя
const { data: ensName } = useEnsName({
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
chainId: 1,
});
// Аватар
const { data: avatar } = useEnsAvatar({
name: 'vitalik.eth',
chainId: 1,
});
ENS работает только на Ethereum mainnet (и Sepolia для тестирования). Chainid 137 (Polygon) или другие EVM-цепи — не поддерживаются нативно, хотя существуют cross-chain ENS resolver'ы в разработке (EIP-3668, CCIP-Read).
Валидация ввода в реальном времени
Стандартный UX-паттерн для поля адреса:
const resolveInput = async (input: string) => {
if (input.endsWith('.eth')) {
const address = await publicClient.getEnsAddress({ name: normalize(input) });
if (!address) throw new Error('ENS name not found');
return address;
}
if (isAddress(input)) return input;
throw new Error('Invalid address or ENS name');
};
normalize() из пакета viem/ens обрабатывает Unicode-нормализацию по стандарту UTS-46 — без неё имена с нестандартными символами могут резолвиться некорректно или вообще бросать исключение.
Кэширование
ENS-запросы идут к Ethereum mainnet RPC и стоят времени. Кэшируйте результаты в памяти с TTL ~1 час — ENS-записи меняются редко. wagmi делает это автоматически через свой внутренний query cache (React Query под капотом). При самостоятельной реализации достаточно Map с timestamp'ами или SWR с соответствующим dedupingInterval.







