A comprehensive technical guide to Unstoppable Domains, exploring Polygon ERC-721 domain contracts, multi-chain address resolution SDKs, IPFS decentralized website hosting, and single sign-on authentication models.

As the decentralized web expands, the traditional Domain Name System (DNS) - managed by centralized registries like ICANN and dependent on centralized Certificate Authorities - presents significant censorship, security, and single-point-of-failure risks. Unstoppable Domains provides a decentralized, blockchain-native naming system engineered to replace alphanumeric public key wallet addresses with human-readable domain identifiers (such as alice.crypto, bob.x, or dao.polygon).
Unlike legacy web domains leased annually from registrars like GoDaddy, Unstoppable Domains operate as non-fungible tokens (NFTs) minted primarily on the Polygon Layer 2 network. Once minted, the user maintains absolute, perpetual self-custody of the domain asset inside their Web3 wallet, eliminating recurring renewal fees, arbitrary domain seizures, and third-party registrar lock-ins.
Traditional DNS converts human-readable domain names (e.g., google.com) into IP addresses (e.g., 142.250.190.46). Unstoppable Domains extends this resolution concept into multi-chain asset routing, decentralized storage routing, and cryptographic identity attestation.
.crypto, .x, .wallet, .nft, .dao, .polygon, .eth (secondary markets), and custom enterprise extensions.Unstoppable Domains operates via a set of EVM smart contracts deployed on Polygon (and Ethereum mainnet for legacy .crypto domains). The architecture separates domain token ownership from record data storage.
Domain names are stored on-chain as 256-bit cryptographic hashes generated via the Namehash Algorithm. This standard recursively hashes domain labels to compute a unique 32-byte integer (uint256 tokenId):
$$\text{Namehash}("") = 0x0000000000000000000000000000000000000000000000000000000000000000$$
$$\text{Namehash}(\text{label} . \text{context}) = \text{keccak256}(\text{Namehash}(\text{context}) \mathbin{\Vert} \text{keccak256}(\text{label}))$$
For example, computing the token ID for alice.crypto:
h1 = keccak256(Namehash("") + keccak256("crypto"))tokenId = keccak256(h1 + keccak256("alice"))This tokenId serves as the standard ERC-721 token identifier within the Proxy Registry contract.
Record data (such as BTC, ETH, and SOL wallet addresses, or IPFS hashes) is stored within the RecordStorage contract as string key-value pairs:
// Simplified Solidity representation of Unstoppable Domains Record Storage
contract RecordStorage {
/ Maps Token ID => (Record Key => Record Value)
mapping(uint256 => mapping(string => string)) private _records;
event RecordSet(uint256 indexed tokenId, string key, string value);
function setRecord(uint256 tokenId, string calldata key, string calldata value) external {
require(_isApprovedOrOwner(msg.sender, tokenId), "Caller is not owner or approved");
_records[tokenId][key] = value;
emit RecordSet(tokenId, key, value);
}
function getRecord(uint256 tokenId, string calldata key) external view returns (string memory) {
return _records[tokenId][key];
}
}
Standardized record keys include:
crypto.ETH.address: Ethereum mainnet and L2 wallet recipient address.crypto.BTC.address: Bitcoin SegWit/Taproot wallet address.crypto.SOL.address: Solana wallet address.dweb.ipfs.hash: IPFS CID for decentralized website resolution.For software engineers building mobile wallets, crypto exchanges, or web applications, integrating domain resolution requires only a few lines of code using official Resolution SDKs (@unstoppabledomains/resolution).
// JavaScript Node.js Integration Example
import { Resolution } from '@unstoppabledomains/resolution';
const resolution = new Resolution({
sourceConfig: {
uns: {
locations: {
Layer2: {
network: 'polygon-mainnet',
url: 'https://polygon-rpc.com',
},
},
},
},
});
async function resolveDomain(domainName, ticker) {
try {
/ Resolve cryptocurrency payment address
const address = await resolution.addr(domainName, ticker);
console.log(`Resolved ${ticker} address for ${domainName}:`, address);
return address;
} catch (error) {
console.error(`Failed to resolve ${domainName}:`, error.code);
}
}
// Example Execution
resolveDomain('brad.crypto', 'ETH');
resolveDomain('brad.crypto', 'BTC');
from unstoppable_resolution import Resolution
resolution = Resolution()
try:
eth_address = resolution.addr("alice.crypto", "ETH")
ipfs_hash = resolution.ipfs_hash("alice.crypto")
print(f"Ethereum Address: {eth_address}")
print(f"IPFS Hash: {ipfs_hash}")
except Exception as e:
print(f"Domain resolution failed: {e}")
Understanding the technical trade-offs between Unstoppable Domains (UD) and the Ethereum Name Service (ENS) is essential for Web3 architects and protocol developers.
| Evaluation Metric | Unstoppable Domains (UD) | Ethereum Name Service (ENS) |
|---|---|---|
| Primary Blockchain | Polygon Layer 2 (ERC-721) | Ethereum Layer 1 (Expanding to L2s) |
| Fee Structure | One-time registration fee ($5 - $40+), 0 renewals | Annual lease model ($5 - $640+/yr) based on length |
| Top-Level Domains (TLDs) | Multi-TLD (.crypto, .x, .polygon, .wallet) |
Primarily .eth + ICANN DNSSEC imports |
| Governance Structure | Corporate entity (Unstoppable Domains Inc.) + DAO | ENS DAO ($ENS governance token) |
| Browser Resolution | Native in Brave/Opera, Chrome extension / Unstoppable API | Native in Brave/Opera, .limo / .link HTTPS gateways |
| DNSSEC Integration | Developing ICANN TLD partnerships | Full native DNSSEC cryptographic import for .com/.org |
To allow non-technical users to update domain records (such as linking a new Solana or Bitcoin wallet address) without requiring them to pay Polygon MATIC/POL gas fees directly, Unstoppable Domains utilizes EIP-712 Typed Structured Data Signatures and meta-transaction relayers.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
contract MetaTransactionResolver is EIP712 {
using ECDSA for bytes32;
bytes32 private constant SET_RECORD_TYPEHASH =
keccak256("SetRecord(uint256 tokenId,string key,string value,uint256 nonce)");
mapping(uint256 => uint256) public nonces;
mapping(uint256 => mapping(string => string)) private _records;
event RecordSet(uint256 indexed tokenId, string key, string value);
constructor() EIP712("UnstoppableResolver", "1") {}
function setRecordBySignature(
uint256 tokenId,
string calldata key,
string calldata value,
address owner,
uint256 signatureNonce,
bytes calldata signature
) external {
require(signatureNonce == nonces[tokenId]++, "Resolver: Invalid nonce");
bytes32 structHash = keccak256(
abi.encode(
SET_RECORD_TYPEHASH,
tokenId,
keccak256(bytes(key)),
keccak256(bytes(value)),
signatureNonce
)
);
bytes32 digest = _hashTypedDataV4(structHash);
address recoveredAddress = digest.recover(signature);
require(recoveredAddress == owner, "Resolver: Invalid signature signer");
_records[tokenId][key] = value;
emit RecordSet(tokenId, key, value);
}
}
This meta-transaction pattern enables a frictionless user experience:
EIP-712) off-chain in their mobile wallet for free.A primary challenge facing Web3 domain systems is bridging resolution between traditional Web2 HTTP/HTTPS infrastructure and decentralized blockchain networks.
While early Unstoppable Domains utilized non-ICANN TLDs (such as .crypto or .x), recent developments bridge ICANN-accredited TLDs (like .polygon or traditional .com/.net extensions) onto Web3 ledgers using DNSSEC (Domain Name System Security Extensions) verification:
TXT record on their registrar pointing to their Polygon or Ethereum wallet address.Beyond simple wallet address replacement, Unstoppable Domains provides infrastructure for decentralized web publishing and self-custodial user authentication.
"Login with Unstoppable" offers an alternative to "Sign in with Google" or traditional email/password forms. Leveraging OpenID Connect (OIDC) principles backed by wallet signatures:
As digital identity and cross-chain domain resolution become standard features across mobile wallets, decentralized social platforms (Lens, Farcaster), and Web3 applications, engineering demand for domain specialists continues to grow.
Storing website files (HTML, CSS, JavaScript, media assets) directly on the Polygon blockchain is cost-prohibitive due to state storage fees. Unstoppable Domains solves this by separating identity routing from file storage.
Qm... or bafy...). Requires active pinning services (such as Pinata or Infura) or persistent node seeding to prevent garbage collection.ar://...). Requires a one-time fee to permanently archive website files for 200+ years, providing true perpetual hosting matching the domain's one-time purchase model.Modern Web3 identity extends beyond payment addresses to decentralized social graphs. Unstoppable Domains integrates with Lens Protocol and Farcaster to serve as unified cross-application identity cards.
When applying for identity and domain infrastructure positions:
ipfs.io, cloudflare-ipfs.com) when local daemon connections time out.To support organizations, DAOs, and Web3 platforms managing thousands of community members, Unstoppable Domains supports programmatic Subdomain Issuance.
user.exchange.crypto) automatically upon account registration using server-side API keys that interact with the Unstoppable Domains Partner API.While forward resolution translates a human-readable domain (e.g., alice.crypto) into a wallet address (0x123...), Reverse Resolution performs the inverse lookup: mapping a wallet address back to its primary display domain.
Querying the Polygon blockchain on every web page render introduces unacceptable latency. Production Web3 platforms deploy dedicated indexing nodes (utilizing The Graph, Goldsky, or custom PostgreSQL indexers) to maintain real-time local replicas of domain mappings:
-- SQL Schema for Indexing Unstoppable Domains Mappings
CREATE TABLE domain_records (
token_id NUMERIC PRIMARY KEY,
domain_name VARCHAR(255) NOT NULL,
owner_address VARCHAR(42) NOT NULL,
eth_address VARCHAR(42),
btc_address VARCHAR(100),
sol_address VARCHAR(50),
ipfs_cid VARCHAR(255),
updated_at_block BIGINT NOT NULL
);
CREATE INDEX idx_eth_address ON domain_records(eth_address);
CREATE INDEX idx_domain_name ON domain_records(domain_name);
As Web3 privacy frameworks evolve, domain services are integrating zero-knowledge identity proofs (zk-Passports, Semaphore zero-knowledge groups, and zk-SNARK attestations). This architecture enables users to resolve domain identity records and verify accredited investor status or country of residence without revealing their underlying raw transaction history, IP addresses, or full multi-chain wallet balances to third-party web applications. Furthermore, ongoing research into cross-chain name resolution bridges ensures that identity verification remains consistent across all Layer 1 and Layer 2 ecosystems directly.
Unstoppable Domains represents a critical component of Web3 user experience infrastructure. By replacing cryptographic public key strings with human-readable, self-custodial domain NFTs, it accelerates user onboarding across the global decentralized internet.
Explore more guides and career playbooks