UNPKG

viem

Version:

TypeScript Interface for Ethereum

74 lines 2.94 kB
import { universalResolverReverseAbi } from '../../constants/abis.js'; import { getChainContractAddress, } from '../../utils/chain/getChainContractAddress.js'; import { toHex } from '../../utils/encoding/toHex.js'; import { isNullUniversalResolverError } from '../../utils/ens/errors.js'; import { packetToBytes, } from '../../utils/ens/packetToBytes.js'; import { getAction } from '../../utils/getAction.js'; import { readContract, } from '../public/readContract.js'; /** * Gets primary name for specified address. * * - Docs: https://viem.sh/docs/ens/actions/getEnsName * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens * * Calls `reverse(bytes)` on ENS Universal Resolver Contract to "reverse resolve" the address to the primary ENS name. * * @param client - Client to use * @param parameters - {@link GetEnsNameParameters} * @returns Name or `null` if not found. {@link GetEnsNameReturnType} * * @example * import { createPublicClient, http } from 'viem' * import { mainnet } from 'viem/chains' * import { getEnsName } from 'viem/ens' * * const client = createPublicClient({ * chain: mainnet, * transport: http(), * }) * const ensName = await getEnsName(client, { * address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', * }) * // 'wevm.eth' */ export async function getEnsName(client, { address, blockNumber, blockTag, gatewayUrls, strict, universalResolverAddress: universalResolverAddress_, }) { let universalResolverAddress = universalResolverAddress_; if (!universalResolverAddress) { if (!client.chain) throw new Error('client chain not configured. universalResolverAddress is required.'); universalResolverAddress = getChainContractAddress({ blockNumber, chain: client.chain, contract: 'ensUniversalResolver', }); } const reverseNode = `${address.toLowerCase().substring(2)}.addr.reverse`; try { const readContractParameters = { address: universalResolverAddress, abi: universalResolverReverseAbi, functionName: 'reverse', args: [toHex(packetToBytes(reverseNode))], blockNumber, blockTag, }; const readContractAction = getAction(client, readContract, 'readContract'); const [name, resolvedAddress] = gatewayUrls ? await readContractAction({ ...readContractParameters, args: [...readContractParameters.args, gatewayUrls], }) : await readContractAction(readContractParameters); if (address.toLowerCase() !== resolvedAddress.toLowerCase()) return null; return name; } catch (err) { if (strict) throw err; if (isNullUniversalResolverError(err, 'reverse')) return null; throw err; } } //# sourceMappingURL=getEnsName.js.map