import type { Chain, EncodeFunctionDataErrorType } from 'viem' import { encodeFunctionData, getAction } from 'viem/utils' import type { RequireClientContracts } from '../../../clients/chain.js' import type { Prettify } from '../../../types/index.js' import { ASSERT_NO_TYPE_ERROR } from '../../../types/internal.js' import { type DecodeTextResultErrorType, type DecodeTextResultParameters, type DecodeTextResultReturnType, decodeTextResult, type GetTextParametersErrorType, type GetTextParametersParameters, getTextParameters, } from '../../../utils/resolver/getText.js' import { type ResolveNameDataErrorType, resolveNameData, } from './resolveNameData.js' export type GetTextRecordParameters = Prettify< GetTextParametersParameters & DecodeTextResultParameters & { /** Batch gateway URLs to use for resolving CCIP-read requests. */ gatewayUrls?: string[] /** Block number to read at. CCIP-read (offchain) responses are not pinned to this block. */ blockNumber?: bigint } > export type GetTextRecordReturnType = DecodeTextResultReturnType export type GetTextRecordErrorType = | ResolveNameDataErrorType | EncodeFunctionDataErrorType | GetTextParametersErrorType | DecodeTextResultErrorType /** * Gets a text record for a name. * @param client - {@link Client} * @param parameters - {@link GetTextRecordParameters} * @returns Text record string, or null if none is found. {@link GetTextRecordReturnType} * * @example * import { createPublicClient, http } from 'viem' * import { mainnet } from 'viem/chains' * import { addEnsContracts } from '@ensdomains/ensjs' * import { getTextRecord } from '@ensdomains/ensjs/public' * * const client = createPublicClient({ * chain: addEnsContracts(mainnet), * transport: http(), * }) * const result = await getTextRecord(client, { name: 'ens.eth', key: 'com.twitter' }) * // ensdomains */ export async function getTextRecord( client: RequireClientContracts, { gatewayUrls, strict, blockNumber, ...parameters }: GetTextRecordParameters, ): Promise { ASSERT_NO_TYPE_ERROR(client) const resolveNameDataAction = getAction( client, resolveNameData, 'resolveNameData', ) const result = await resolveNameDataAction({ name: parameters.name, data: encodeFunctionData(getTextParameters(parameters)), gatewayUrls, strict, blockNumber, }) if (!result) return null return decodeTextResult(result.resolvedData, { strict }) }