@edgeandnode/ens
TypeScript icon, indicating that this package has built-in type declarations

2.1.2 • Public • Published

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:

  1. Check if the wallet has set a default ENS name in the L1 GNS contract. Query the L1 Network Subgraph for the GraphAccount.defaultDisplayName to resolve.
  2. 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 the EnsPublicClient
      • 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 for
        • gatewayApiKey: [OPTIONAL] used to lookup the set default name from the L1 Network Subgraph
        • testnet: [OPTIONAL, default = false] if true, look up is performed on the L1 testnet
        • timeout: [OPTIONAL, default = 5000] time, in milliseconds, before the client lookup fails
    • 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 for
        • gatewayApiKey: [OPTIONAL] used to lookup the set default name from the L1 network Subgraph
        • testnet: [OPTIONAL, default = false] if true, look up is performed on the L1 testnet
    • 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 for
        • ens: [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 user address
        • chain: [OPTIONAL, default = 42161 (arbitrum-one)] the chain to lookup the GraphAccount.metadata.image from the Network Subgraph on
        • gatewayApiKey: [OPTIONAL] used to lookup the GraphAccount.metadata.image from the Network Subgraph
        • timeout: [OPTIONAL, default = 5000] time, in milliseconds, before the client lookup fails
    • resolveAvatarsBatch -> resolves the avatars for an array of addresses
      • args: ResolveAvatarsBatchArgs
        • addresses: [REQUIRED] array of 0x EVM wallet addresses to lookup the avatar for
        • chain: [OPTIONAL, default = 42161 (arbitrum-one)] the chain to lookup the GraphAccount.metadata.image from the Network Subgraph on
        • gatewayApiKey: [OPTIONAL] used to lookup the GraphAccount.metadata.image from the Network Subgraph

Examples

  • EnsResolverConfig.resolveEnsName
import { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
import type { Address } from 'viem'

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 { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
import type { Address } from 'viem'

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 { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
import type { Address } from 'viem'

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 { buildEnsResolver } from '@edgeandnode/graph-auth-kit/ens'
import type { Address } from 'viem'

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 }
})

Readme

Keywords

none

Package Sidebar

Install

npm i @edgeandnode/ens

Weekly Downloads

237

Version

2.1.2

License

UNLICENSED

Unpacked Size

1.23 MB

Total Files

20

Last publish

Collaborators

  • neysofu
  • a3k5
  • nasmr
  • theodus
  • dnfodjo
  • cmwhited
  • fordn
  • migueldeelias
  • benface
  • andras_en
  • hayderkg
  • pcarranzav_edgeandnode
  • mitchhs12
  • lnsd
  • leoyvens
  • edge-and-node
  • lutter
  • nomativ