import { createClient, type Client, type ClientConfig, type PublicRpcSchema, type Transport, } from 'viem' import { addPnsContracts } from '../contracts/addPnsContracts.js' import type { ChainWithBaseContracts, ChainWithPns, } from '../contracts/consts.js' import type { Prettify } from '../types.js' import { pnsPublicActions, type PnsPublicActions } from './decorators/public.js' import { pnsSubgraphActions, type PnsSubgraphActions, } from './decorators/subgraph.js' export type PnsPublicClientConfig< TTransport extends Transport = Transport, TChain extends ChainWithBaseContracts = ChainWithBaseContracts, > = Pick< ClientConfig, 'batch' | 'key' | 'name' | 'pollingInterval' | 'transport' > & { chain: TChain } export type PnsPublicClient< TTransport extends Transport = Transport, TChain extends ChainWithPns = ChainWithPns, > = Prettify< Client< TTransport, TChain, undefined, PublicRpcSchema, PnsPublicActions & PnsSubgraphActions > > /** * Creates a PNS 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 PnsPublicClientConfig} * @returns An PNS Public Client. {@link PnsPublicClient} * * @example * import { http } from 'viem' * import { mainnet } from 'viem/chains' * import { createPnsPublicClient } from '@pnsdomains/pnsjs' * * const client = createPnsPublicClient({ * chain: mainnet, * transport: http(), * }) */ export const createPnsPublicClient = < TTransport extends Transport, TChain extends ChainWithBaseContracts, >({ batch, chain, key = 'pnsPublic', name = 'PNS Public Client', transport, pollingInterval, }: PnsPublicClientConfig): PnsPublicClient< TTransport, ChainWithPns > => { return createClient({ batch, chain: addPnsContracts(chain), key, name, pollingInterval, transport, type: 'pnsPublicClient', }) .extend(pnsPublicActions) .extend(pnsSubgraphActions) }