import type { Account, Address, Chain, Client, Transport } from 'viem' import type { Assign, Prettify } from '../types.js' type ChainContract = { address: Address blockCreated?: number } export const supportedChains = [369] as const export const supportedContracts = [ 'pnsBaseRegistrarImplementation', 'pnsBulkRenewal', 'pnsDnsRegistrar', 'pnsDnssecImpl', 'pnsPlsRegistrarController', 'pnsNameWrapper', 'pnsPublicResolver', 'ensRegistry', 'pnsReverseRegistrar', 'ensUniversalResolver', 'pnsTips' ] as const export type SupportedChain = (typeof supportedChains)[number] export type SupportedContract = (typeof supportedContracts)[number] export const addresses = { 369: { pnsBaseRegistrarImplementation: { address: '0x65Cf7f7aa5A4a2c20120B445cA4F05F63E2628C4', }, pnsBulkRenewal: { address: '0x23760AE53aa450F6AC5A03f26D0f4584fA2aC30C', }, pnsDnsRegistrar: { address: '0xdD91caB95681CD5494afC41FeF5C3760c0932F1E', }, pnsDnssecImpl: { address: '0x078a7802F2B95efD86ECA961386e25920b02b239', }, pnsPlsRegistrarController: { address: '0xEDE92828a143cFC966a47d60604825655f7c79e8', }, pnsNameWrapper: { address: '0x4feFb26934705C1661aC04aF8303548b850d562F', }, pnsPublicResolver: { address: '0x2FDBb906b4FE68e31D928C1ED0b6a3bD1f204374', }, ensRegistry: { address: '0xbd5133993FCDED5945c5539D9f032261F0d13170', }, pnsReverseRegistrar: { address: '0x9E0406b8a7831B6056A52938B103e48D7E5A9F69', }, ensUniversalResolver: { address: '0x6644e794F5aFfb8abcfea0e71d5624D013BA2dBA', }, pnsTips: { address: '0x37CB5030d73aACAC0A67D17DD5ce844C5da593B1' } } } as const satisfies Record< SupportedChain, Record > type Subgraphs = { pns: { url: string } } export const subgraphs = { 369: { pns: { url: 'https://graph.pulse.domains/subgraphs/name/graphprotocol/pns', }, } } as const satisfies Record type PnsChainContracts = { pnsBaseRegistrarImplementation: ChainContract pnsDnsRegistrar: ChainContract pnsPlsRegistrarController: ChainContract pnsNameWrapper: ChainContract pnsPublicResolver: ChainContract pnsReverseRegistrar: ChainContract pnsBulkRenewal: ChainContract pnsDnssecImpl: ChainContract pnsTips: ChainContract } type BaseChainContracts = { multicall3: ChainContract ensUniversalResolver: ChainContract ensRegistry: ChainContract } export type ChainWithPns = Omit< TChain, 'contracts' > & { contracts: BaseChainContracts & PnsChainContracts subgraphs: Subgraphs } export type ChainWithBaseContracts = Assign< Omit, { contracts: BaseChainContracts } > export type CheckedChainWithPns = TChain['id'] extends SupportedChain ? TChain['contracts'] extends BaseChainContracts ? TChain & { contracts: Prettify<(typeof addresses)[TChain['id']]> subgraphs: (typeof subgraphs)[TChain['id']] } : never : never export type ClientWithPns< TTransport extends Transport = Transport, TChain extends ChainWithPns = ChainWithPns, > = Client export type ClientWithAccount< TTransport extends Transport = Transport, TChain extends ChainWithPns = ChainWithPns, TAccount extends Account | undefined = Account | undefined, > = Client