@edgeandnode/ens
v2.0.1
Published
Resolver for ENS names and avatars using the Graph Network Subgraph and ensdomains resolution
Downloads
839
Maintainers
Keywords
Readme
ENS
Resolver for ENS names and avatars using the Graph Network Subgraph and ensdomains resolution.
This lets us resolve the ENS name for a given address/addresses in a consistent way across all apps, following this business logic:
- Check if the wallet has set a default ENS name in the L1
GNS
contract. Query the L1 Network Subgraph for theGraphAccount.defaultDisplayName
to resolve. - Do a lookup with the
EnsPublicClient
exposed by the@ensdomains/ensjs
library to resolve the primary ENS for the given address. Also exposes batch functionality to resolve multiple ENS names if given multiple addresses.
The issue with the ENS subgraph is it does not have a way to determine which domain is the primary domain for a user, resulting in it resolving to any domain the user owns, causing issues (primarily in explorer).
API
buildEnsResolver(): EnsResolverConfig
-> has two methods:- args:
BuildEnsResolverArgs
infuraKey
: [REQUIRED] infura key used to lookup the ENS from theEnsPublicClient
gatewayApiKey
: [OPTIONAL] used to lookup the set default name from the L1 Network Subgraph
resolveEnsName
-> resolves the ENS name (using the logic above) for a single address- args:
ResolveEnsNameArgs
address
: [REQUIRED] 0x EVM wallet address to lookup the ENS name forgatewayApiKey
: [OPTIONAL] used to lookup the set default name from the L1 Network Subgraphtestnet
: [OPTIONAL, default = false] if true, look up is performed on the L1 testnettimeout
: [OPTIONAL, default = 5000] time, in milliseconds, before the client lookup fails
- args:
resolveEnsNamesBatch
-> resolves the ENS names (using the logic above) for an array of addresses- args:
ResolveEnsNamesBulkArgs
addresses
: [REQUIRED] array of 0x EVM wallet addresses to lookup the ENS names forgatewayApiKey
: [OPTIONAL] used to lookup the set default name from the L1 network Subgraphtestnet
: [OPTIONAL, default = false] if true, look up is performed on the L1 testnet
- args:
resolveAvatar
-> resolves the Avatar for a single address from the network subgraph and then ENS- args:
ResolveAvatarArgs
address
: [REQUIRED] 0x EVM wallet address to lookup the avatar forens
: [OPTIONAL] an already resolved ENS name. Finding the avatar from ENS is found through the ENS name, so passing this removes needing to resolve the ENS name using the useraddress
chain
: [OPTIONAL, default = 42161 (arbitrum-one)] the chain to lookup theGraphAccount.metadata.image
from the Network Subgraph ongatewayApiKey
: [OPTIONAL] used to lookup theGraphAccount.metadata.image
from the Network Subgraphtimeout
: [OPTIONAL, default = 5000] time, in milliseconds, before the client lookup fails
- args:
resolveAvatarsBatch
-> resolves the avatars for an array of addresses- args:
ResolveAvatarsBatchArgs
addresses
: [REQUIRED] array of 0x EVM wallet addresses to lookup the avatar forchain
: [OPTIONAL, default = 42161 (arbitrum-one)] the chain to lookup theGraphAccount.metadata.image
from the Network Subgraph ongatewayApiKey
: [OPTIONAL] used to lookup theGraphAccount.metadata.image
from the Network Subgraph
- args:
- args:
Examples
EnsResolverConfig.resolveEnsName
import { type Address } from 'viem'
import { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
const resolver = buildEnsResolver({
infuraKey: 'key',
gatewayApiKey: 'some32digitapikey',
})
async function lookupEnsName(address: Address) {
return await resolver.resolveEnsName({ address })
}
lookupEnsName('0x123').then((ens) => {
// testuser.eth
})
EnsResolverConfig.resolveEnsNamesBatch
import { type Address } from 'viem'
import { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
const resolver = buildEnsResolver({
infuraKey: 'key',
gatewayApiKey: 'some32digitapikey',
})
async function lookupEnsNames(addresses: Address[]) {
return await resolver.resolveEnsNamesBatch({ addresses })
}
lookupEnsNames(['0x123', '0x456']).then((ensMap) => {
// { '0x123': 'testuser.eth', '0x456': null }
})
EnsResolverConfig.resolveAvatar
import { type Address } from 'viem'
import { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
const resolver = buildEnsResolver({
infuraKey: 'key',
gatewayApiKey: 'some32digitapikey',
})
async function lookupAvatar(address: Address) {
return await resolver.resolveAvatar({
address,
timeout: 2500, // only wait 2.5sec before timing out
})
}
lookupAvatar('0x123').then((avatar) => {
// https://api.thegraph.com/ipfs/api/v0/cat?arg=QmdFKawEFPYzDVwZrXyJcyaYyCZd6PP9N5NCuTi2XmLJMD
})
async function lookupAvatarFromENS(address: Address, ens: string) {
return await resolver.resolveAvatar({
address,
ens,
timeout: 2500, // only wait 2.5sec before timing out
})
}
lookupAvatarFromENS('0x123').then((avatar) => {
// https://ipfs.io/ipfs/QmP9ayW28pbW2V9nYAjEbxv45MTezQpz8S913VbV56nkCg/1398.png
})
EnsResolverConfig.resolveAvatarsBatch
import { type Address } from 'viem'
import { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
const resolver = buildEnsResolver({
infuraKey: 'key',
gatewayApiKey: 'some32digitapikey',
})
async function lookupAvatars(addresses: Address[]) {
return await resolver.resolveAvatarsBatch({
addresses,
})
}
lookupAvatars(['0x123', '0x456']).then((avatar) => {
// { '0x123': 'https://api.thegraph.com/ipfs/api/v0/cat?arg=QmdFKawEFPYzDVwZrXyJcyaYyCZd6PP9N5NCuTi2XmLJMD', '0x456': null }
})