Реалізація підтримки ENS/Unstoppable Domains у мобільних гаманцях
Адреси вроді 0x742d35Cc6634C0532925a3b8D4C9C3... ніхто не запам'ятовує й не вводить вручну без помилок. ENS та Unstoppable Domains вирішують цю проблему: vitalik.eth або myname.crypto розв'язуються на адресу. Реалізація у мобільному гаманці потребує розуміння обох систем — вони працюють по-різному.
ENS: Ethereum Name Service
ENS — децентралізована система імен на Ethereum. Домени .eth зберігаються у смарт-контракті за адресою 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e (mainnet). Розв'язання імені — це послідовність викликів контрактів.
Прямий шлях через ethers.js (для бекенду або React Native з Web3-бібліотеками):
const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_KEY');
const address = await provider.resolveName('vitalik.eth');
// returns '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
Для нативного iOS/Android використовуйте ENS REST API від публічних провайдерів або власного RPC-вузла. Алгоритм розв'язання: ENS Registry → ENS Resolver → addr() метод.
CCIP-Read (EIP-3668): сучасні ENS імена можуть використовувати offchain резолвери — контракт повертає URL для HTTP-запитів за даними. Це ускладнює пряму реалізацію. Використовуйте готові бібліотеки: ensjs для JS, Swift SDK від ENS Labs, або REST API https://api.ens.domains/.
Зворотне розв'язання (адреса → ім'я): reverseResolve(address) повертає Primary ENS Name якщо користувач його встановив. Корисно для відображення "vitalik.eth" замість адреси в UI.
Unstoppable Domains
Unstoppable Domains підтримує .crypto, .wallet, .nft, .blockchain та інші TLD. Зберігаються на Polygon (для більшості нових) або Ethereum. Протокол розв'язання — UNS (Unstoppable Name Service).
Офіційний підхід — Resolution Libraries. Для iOS: resolution-swift від Unstoppable Domains, для Android: resolution-java.
import UnstoppableDomainsResolution
let resolution = try Resolution()
resolution.addr(domain: "brad.crypto", ticker: "ETH") { result in
switch result {
case .success(let address):
print(address)
case .failure(let error):
print("Error: \(error)")
}
}
Або використовуйте їхній REST API: https://resolve.unstoppabledomains.com/domains/brad.crypto — простіша інтеграція, залежить від їхнього сервісу.
Що реалізуємо у гаманці
При відправці трансакції: поле адреси приймає як 0x... так і ENS/UD домени. При введенні домену показуємо лоадер → розв'язуємо → відображаємо отриманий адрес для підтвердження. Користувач повинен бачити реальну адресу перед відправкою.
vitalik.eth → [розв'язування...] → 0xd8dA...96045 ✓
Кешування: результати розв'язання кешуємо з TTL. ENS TTL зберігається у самому контракті (зазвичай 300–3600 секунд). Для Unstoppable Domains кешуємо на 5–10 хвилин. Застарілий кеш при відправці трансакції — ризик втрати коштів.
ENS аватари: text(node, 'avatar') повертає URI аватара. Може бути IPFS URI (ipfs://), HTTP URL або NFT посилання (eip155:1/erc721:0x...). Для відображення аватара в профілі користувача потрібна підтримка всіх форматів.
Обробка помилок
Розв'язання може впасти з різних причин: домен не зареєстрований, немає запису для потрібної монети, RPC-вузол недоступний. Показуємо конкретну помилку — «Адреса ETH для цього домену не знайдена» замість загального «Помилка».
Особливий випадок: ENS імена чутливі до нормалізації (ENSIP-15). VITALIK.ETH та vitalik.eth — одне ім'я, але якщо передати ненормалізоване ім'я в контракт, отримаємо неверний результат. Нормалізація через ens-normalize бібліотеку обов'язкова.
Період: підтримка ENS або Unstoppable Domains окремо — 5–7 днів. Обидва протоколи з кешуванням, аватарами й коректною обробкою помилок — 2–3 тижні.







