import type { Account, Address, Chain, Client, Transport } from 'viem' import { electroneum, electroneumTestnet } from 'viem/chains' import type { Assign, Prettify } from '../types.js' type ChainContract = { address: Address blockCreated?: number } export const supportedChains = [electroneum.id, electroneumTestnet.id] as const export const supportedContracts = [ 'ensBaseRegistrarImplementation', 'ensBulkRenewal', 'ensDnsRegistrar', 'ensDnssecImpl', 'ensEthRegistrarController', 'ensNameWrapper', 'ensPublicResolver', 'ensRegistry', 'ensReverseRegistrar', 'ensDefaultReverseRegistrar', 'ensUniversalResolver', ] as const export type SupportedChain = (typeof supportedChains)[number] export type SupportedContract = (typeof supportedContracts)[number] // Addresses from electroneum/ens-contracts deployments/electroneum and // deployments/electroneumTestnet. multicall3 is included here because viem's // Electroneum chain definitions don't carry a multicall3 entry (it is // deployed at the canonical address on both chains). export const addresses = { [electroneum.id]: { ensBaseRegistrarImplementation: { address: '0x5207496C1248BbD2AeeDd57Bde44dd9d4E9F1b59', }, ensBulkRenewal: { address: '0x8ACdF3703fF6182F265F5c910f6ecc2d96Cec77D', }, ensDnsRegistrar: { address: '0x359d9095d34157892258521c3D4c76F99Fc93ac1', }, ensDnssecImpl: { address: '0x3E2fE726d1F6DaDfFa80411209FfF9eeBc28b383', }, ensEthRegistrarController: { address: '0x3CFa6D6E7e1216393C2cb9393Bc0f411492E33e9', }, ensNameWrapper: { address: '0xd8F4B1A91469B05d9E0b15Cac4917Ee47b2A6f64', }, ensPublicResolver: { address: '0xDb4A3Abb6703232e20a118a104e7f4EbB3e2738D', }, ensRegistry: { address: '0x6F311F2212593165988Dff84977e24C1005dBb85', }, ensReverseRegistrar: { address: '0xFBB14eDBD8D3f6E7BB240bFA388f6582df0d8E7A', }, ensDefaultReverseRegistrar: { address: '0x3bED61fE4d7d3Bc79E46912Ee7ACce2c231aA0a6', }, ensUniversalResolver: { address: '0x75509153af7db00BeeCc30EC042299fD30e2cb6e', }, multicall3: { address: '0xcA11bde05977b3631167028862bE2a173976CA11', }, }, [electroneumTestnet.id]: { ensBaseRegistrarImplementation: { address: '0x7b787b31Ad58D563D7B3938b4bbfAB2c588624C5', }, ensBulkRenewal: { address: '0xF0cdD96029276584C04e812A23AD5975bC4fdBB2', }, ensDnsRegistrar: { address: '0x7AB311D3059b26F5045d794284e34EcAd920cfAC', }, ensDnssecImpl: { address: '0x14EA3265cde1A78d9A84500401956aD0BaF6D360', }, ensEthRegistrarController: { address: '0x5BFb2958062Ac12d2019Ac1E69243DDbafCCc2c5', }, ensNameWrapper: { address: '0x388f495A886644883F41a5958C11382e7c0D23F5', }, ensPublicResolver: { address: '0x1B148DF21F18cFaEC68b71FBF11692F569658b3D', }, ensRegistry: { address: '0x2466B8Ef6Bedd1b48FA7e0CdBeBc2300d913C701', }, ensReverseRegistrar: { address: '0x470680Df59dB243409F67ec7EaC78D8e6f834047', }, ensDefaultReverseRegistrar: { address: '0xF5319d92519F73cbCF7D5Ed38495eb4c61BD09AC', }, ensUniversalResolver: { address: '0xEe1f847de4d2DA11E46328B83d7551771D8f778c', }, multicall3: { address: '0xcA11bde05977b3631167028862bE2a173976CA11', }, }, } as const satisfies Record< SupportedChain, Record > type Subgraphs = { ens: { url: string } } // Mainnet is served by the graph-node at subgraph.electroneum.com. No subgraph // is deployed for testnet yet — its URL is a placeholder pointing at a local // graph-node. Both can be overridden via the `subgraphUrl` option of // `addEnsContracts`. export const subgraphs = { [electroneum.id]: { ens: { url: 'https://subgraph.electroneum.com/subgraphs/name/etn-subgraph', }, }, [electroneumTestnet.id]: { ens: { url: 'http://localhost:8000/subgraphs/name/graphprotocol/ens', }, }, } as const satisfies Record type EnsChainContracts = { ensBaseRegistrarImplementation: ChainContract ensDnsRegistrar: ChainContract ensEthRegistrarController: ChainContract ensNameWrapper: ChainContract ensPublicResolver: ChainContract ensRegistry: ChainContract ensReverseRegistrar: ChainContract ensDefaultReverseRegistrar: ChainContract ensBulkRenewal: ChainContract ensDnssecImpl: ChainContract } type BaseChainContracts = { multicall3: ChainContract ensUniversalResolver: ChainContract } export type ChainWithEns = Omit< TChain, 'contracts' > & { contracts: BaseChainContracts & EnsChainContracts subgraphs: Subgraphs } // viem's Electroneum chain definitions ship no contract addresses; all base // contracts (multicall3, universal resolver) are supplied by `addresses`. export type ChainWithBaseContracts = Assign< Omit, { contracts?: Partial } > export type CheckedChainWithEns = TChain['id'] extends SupportedChain ? TChain & { contracts: Prettify<(typeof addresses)[TChain['id']]> subgraphs: (typeof subgraphs)[TChain['id']] } : never export type ClientWithEns< TTransport extends Transport = Transport, TChain extends ChainWithEns = ChainWithEns, > = Client export type ClientWithAccount< TTransport extends Transport = Transport, TChain extends ChainWithEns = ChainWithEns, TAccount extends Account | undefined = Account | undefined, > = Client