How to Look Up Aliases and DIDs
Compute alias hashes, resolve aliases and DIDs via the indexer, and check alias availability before registration.
How to Look Up Aliases and DIDs
This guide shows you how to resolve human-readable aliases to DIDs, look up on-chain DID and account data, check alias availability before registration, and fetch indexer statistics.
Compute an alias hash
The indexer stores aliases as Keccak-256 hashes. Before querying, compute the hash of the alias string:
import { computeAliasHash } from '@hyperauth/sdk';
const hash = await computeAliasHash('alice');
// '0x3d4f...'By default computeAliasHash uses hash-wasm (already a dependency). If you already have a Keccak-256 implementation from viem or ethers, pass it to avoid loading a second one:
import { keccak256 } from 'viem';
import { computeAliasHash } from '@hyperauth/sdk';
const hash = await computeAliasHash('alice', keccak256);Check alias availability before registration
Before registering a handle, verify that the alias is not already taken. The vault exposes an availability endpoint directly:
const res = await fetch(`/api/aliases/check?alias=${encodeURIComponent('alice')}`);
const { available, did } = await res.json();
if (!available) {
console.log('Alias taken by DID:', did);
}Use the indexer for a hash-based lookup instead if you need the full alias record:
const hash = await computeAliasHash('alice');
const alias = await lookupAlias(hash);
if (alias.found) {
console.log('Alias hash:', alias.alias_hash);
console.log('DID hash:', alias.did_hash);
console.log('Active:', alias.active);
console.log('Controller:', alias.controller);
} else {
// Alias is available
}Look up a DID
lookupDid resolves a DID hash to its on-chain record:
import { lookupDid } from '@hyperauth/sdk';
const result = await lookupDid('0xdidHash...');
if (result.found) {
console.log('Controller:', result.controller);
console.log('Metadata CID:', result.metadata_cid);
console.log('Active:', result.active);
console.log('Block number:', result.block_number);
console.log('Tx hash:', result.tx_hash);
}The DID hash is the Keccak-256 hash of the DID string. It is returned in RegistrationResult.did_hash after registration, and available in QueryOutput.did from client.query().
Look up a smart account
lookupAccount resolves a smart account address to its on-chain indexer record:
import { lookupAccount } from '@hyperauth/sdk';
const result = await lookupAccount('0xSmartAccountAddress');
if (result.found) {
console.log('Account address:', result.account_address);
console.log('Owner address:', result.owner_address);
console.log('Block number:', result.block_number);
console.log('Tx hash:', result.tx_hash);
}Fetch indexer statistics
fetchStats returns aggregate counts for the entire registry:
import { fetchStats } from '@hyperauth/sdk';
const stats = await fetchStats();
console.log('Total DIDs:', stats.total_dids);
console.log('Active DIDs:', stats.active_dids);
console.log('Total aliases:', stats.total_aliases);
console.log('Total accounts:', stats.total_accounts);
console.log('Last indexed block:', stats.last_block_number);Use a custom indexer URL
All indexer functions default to /api/indexer (the vault's indexer proxy). Pass a custom URL as the last argument to target a different deployment:
const hash = await computeAliasHash('alice');
const alias = await lookupAlias(hash, 'https://indexer.example.com/api');
const did = await lookupDid(didHash, 'https://indexer.example.com/api');
const account = await lookupAccount(address, 'https://indexer.example.com/api');
const stats = await fetchStats('https://indexer.example.com/api');Error handling
All indexer functions throw a NetworkError if the HTTP request fails. They do not throw on a not-found result — check the found field instead.
import { NetworkError } from '@hyperauth/sdk';
try {
const alias = await lookupAlias(hash);
if (!alias.found) {
// Not registered
}
} catch (err) {
if (err instanceof NetworkError) {
console.error('Indexer unreachable:', err.message);
}
}