2.0.1 • Published 8 months ago

@edgeandnode/ens v2.0.1

Weekly downloads
-
License
-
Repository
-
Last release
8 months ago

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