import { type Client, type ClientConfig, type PublicRpcSchema, type Transport, createClient, } from 'viem' import { addEnsContracts } from '../contracts/addEnsContracts.js' import type { ChainWithBaseContracts, ChainWithEns, } from '../contracts/consts.js' import type { Prettify } from '../types.js' import { type EnsPublicActions, ensPublicActions } from './decorators/public.js' import { type EnsSubgraphActions, ensSubgraphActions, } from './decorators/subgraph.js' export type EnsPublicClientConfig< TTransport extends Transport = Transport, TChain extends ChainWithBaseContracts = ChainWithBaseContracts, > = Pick< ClientConfig, 'batch' | 'key' | 'name' | 'pollingInterval' | 'transport' > & { chain: TChain } export type EnsPublicClient< TTransport extends Transport = Transport, TChain extends ChainWithEns = ChainWithEns, > = Prettify< Client< TTransport, TChain, undefined, PublicRpcSchema, EnsPublicActions & EnsSubgraphActions > > /** * Creates a ENS Public Client with a given [Transport](https://viem.sh/docs/clients/intro.html) configured for a [Chain](https://viem.sh/docs/clients/chains.html). * * @param config - {@link EnsPublicClientConfig} * @returns An ENS Public Client. {@link EnsPublicClient} * * @example * import { http } from 'viem' * import { mainnet } from 'viem/chains' * import { createEnsPublicClient } from '@etn-sc/ensjs' * * const client = createEnsPublicClient({ * chain: mainnet, * transport: http(), * }) */ export const createEnsPublicClient = < TTransport extends Transport, TChain extends ChainWithBaseContracts, >({ batch, chain, key = 'ensPublic', name = 'ENS Public Client', transport, pollingInterval, }: EnsPublicClientConfig): EnsPublicClient< TTransport, ChainWithEns > => { return createClient({ batch, chain: addEnsContracts(chain), key, name, pollingInterval, transport, type: 'ensPublicClient', }) .extend(ensPublicActions) .extend(ensSubgraphActions) }