Integration with Unstoppable Domains
Unstoppable Domains — alternative to ENS with one key difference: names are purchased once without annual payments. .crypto, .wallet, .nft, .x, .blockchain and other TLDs. Domains are stored as ERC-721 NFTs on Polygon and Ethereum.
Resolution via Official SDK
import Resolution from "@unstoppabledomains/resolution";
const resolution = new Resolution({
sourceConfig: {
uns: {
locations: {
Layer1: {
url: `https://mainnet.infura.io/v3/${INFURA_KEY}`,
network: "mainnet",
},
Layer2: {
url: `https://polygon-mainnet.infura.io/v3/${INFURA_KEY}`,
network: "polygon-mainnet",
},
},
},
},
});
// Resolve ETH address
const ethAddress = await resolution.addr("brad.crypto", "ETH");
// Other cryptocurrencies
const btcAddress = await resolution.addr("brad.crypto", "BTC");
// Email from profile
const email = await resolution.email("brad.crypto");
// All records
const allRecords = await resolution.allRecords("brad.crypto");
Key Differences from ENS
| Parameter | Unstoppable Domains | ENS |
|---|---|---|
| Payment model | One-time purchase | Annual rent |
| Network (primary) | Polygon L2 | Ethereum mainnet |
| TLD | .crypto, .wallet, .nft... | .eth |
| Standard | UNS (custom) | ERC-137 |
| Reverse resolution | Limited | Full |
UI Integration
Pattern of use: support both standards (ENS + Unstoppable) in address input fields.
async function resolveAddress(input: string): Promise<string | null> {
// ENS
if (input.endsWith(".eth")) {
return await provider.resolveName(input);
}
// Unstoppable Domains TLDs
const udTLDs = [".crypto", ".wallet", ".nft", ".x", ".blockchain", ".dao"];
if (udTLDs.some(tld => input.endsWith(tld))) {
try {
return await resolution.addr(input, "ETH");
} catch {
return null;
}
}
// Raw address
if (ethers.isAddress(input)) return input;
return null;
}
Unstoppable Domains integration into existing dApp — 1-2 working days. Support for all record types and profiles — up to 3 days.







