Custom name resolution
You can implement custom domain resolution and reverse resolution using the following steps.
Steps
1. Request permission to provide name resolution
Request the endowment:name-lookup
permission.
For example, to resolve Ethereum Mainnet domains, add the following to your Snap's manifest file:
"initialPermissions": {
"endowment:name-lookup": {
"chains": ["eip155:1"]
}
}
If you're only targeting specific TLDs or schemes, you can use the matchers
property to reduce
overhead by specifying the TLDs and schemes you support. To target specific TLDs (for example, my-domain.crypto
),
use the tlds
property. To target specific schemes (for example, farcaster:my-user
), use the schemes
property.
At least one of these properties must be specified if matchers
is specified.
"initialPermissions": {
"endowment:name-lookup": {
"chains": ["eip155:1"],
"matchers": { "tlds": ["crypto"], "schemes": ["farcaster"] }
}
}
2. Implement custom name resolution
Expose an onNameLookup
entry point, which receives a
chainId
and either a domain
or an address
.
The following example implements a very basic resolution from Unstoppable Domains domain names to
Ethereum addresses in onNameLookup
:
import type { OnNameLookupHandler } from "@metamask/snaps-sdk"
const UNSTOPPABLE_API_KEY = "xxx"
export const onNameLookup: OnNameLookupHandler = async (request) => {
const { chainId, domain } = request
if (domain && chainId === "eip155:1") {
const response = await fetch(
`https://api.unstoppabledomains.com/resolve/domains/${domain}`,
{
headers: {
accept: "application/json",
authorization: `Bearer ${UNSTOPPABLE_API_KEY}`,
},
}
)
const data = await response.json()
const resolvedAddress = data.records["crypto.ETH.address"]
if (resolvedAddress) {
return {
resolvedAddresses: [
{ resolvedAddress, protocol: "Unstoppable Domains", domainName: domain },
],
}
}
}
return null
}
The onNameLookup
handler response includes a domainName
property.
You can use this property to perform fuzzy matching on domain names, by having the handler return the resolved domain rather than the one provided in the request.
Example
See the @metamask/name-lookup-example-snap
package for a full example of implementing custom name resolution.