UNPKG

ens-did-resolver

Version:
1 lines 22.7 kB
{"version":3,"file":"index.modern.mjs","sources":["../src/helpers.ts","../src/configuration.ts","../src/resolver.ts"],"sourcesContent":["export const identifierMatcher = /^(.*:)?(.*\\.eth)$/\nexport const nullAddress = '0x0000000000000000000000000000000000000000'\nexport const DEFAULT_JSON_RPC = 'http://127.0.0.1:8545/'\n\nexport const knownInfuraNetworks: Record<string, string> = {\n mainnet: '0x1',\n goerli: '0x5',\n}\n\nexport const knownNetworks: Record<string, string> = {\n ...knownInfuraNetworks,\n rsk: '0x1e',\n 'rsk:testnet': '0x1f',\n artis_t1: '0x03c401',\n artis_s1: '0x03c301',\n matic: '0x89',\n maticmum: '0x13881',\n}\n\nexport enum Errors {\n /**\n * The resolver has failed to construct the DID document.\n * This can be caused by a network issue, a wrong registry address or malformed logs while parsing the registry\n * history. Please inspect the `DIDResolutionMetadata.message` to debug further.\n */\n notFound = 'notFound',\n\n /**\n * The resolver does not know how to resolve the given DID. Most likely it is not a `did:ens`.\n */\n invalidDid = 'invalidDid',\n\n /**\n * The resolver is misconfigured or is being asked to resolve a DID anchored on an unknown network\n */\n unknownNetwork = 'unknownNetwork',\n\n /**\n * The resolver is being asked to resolve a DID anchored on a network without a known ENS resolver.\n */\n unknownEnsResolver = 'unknownEnsResolver',\n}\n\nexport function isDefined<T>(arg: T): arg is Exclude<T, null | undefined> {\n return arg && typeof arg !== 'undefined'\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { InfuraProvider, JsonRpcProvider, Provider } from '@ethersproject/providers'\nimport { knownInfuraNetworks, knownNetworks } from './helpers'\n\n/**\n * A configuration entry for an ethereum network\n * It should contain at least one of `name` or `chainId` AND one of `provider`, `web3`, or `rpcUrl`\n *\n * @example ```js\n * { name: 'development', rpcUrl: 'http://127.0.0.1:8545/' }\n * { name: 'goerli', chainId: 5, provider: new InfuraProvider('goerli') }\n * { name: 'rinkeby', provider: new AlchemyProvider('rinkeby') }\n * { name: 'rsk:testnet', chainId: '0x1f', rpcUrl: 'https://public-node.testnet.rsk.co' }\n * ```\n */\nexport interface ProviderConfiguration {\n name?: string\n provider?: Provider\n rpcUrl?: string\n chainId?: string | number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n web3?: any\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [index: string]: any\n}\n\nexport interface MultiProviderConfiguration extends ProviderConfiguration {\n networks?: ProviderConfiguration[]\n}\n\nexport interface InfuraConfiguration {\n infuraProjectId: string\n}\n\nexport type ConfigurationOptions = MultiProviderConfiguration | InfuraConfiguration\n\nexport type ConfiguredNetworks = Record<string, Provider>\n\nfunction configureNetworksWithInfura(projectId?: string): ConfiguredNetworks {\n if (!projectId) {\n return {}\n }\n const networks: ProviderConfiguration[] = [\n { name: 'mainnet', chainId: '0x1', provider: new InfuraProvider('homestead', projectId) },\n { name: 'goerli', chainId: '0x5', provider: new InfuraProvider('goerli', projectId) },\n ]\n return configureNetworks({ networks })\n}\n\nexport function getProviderForNetwork(conf: ProviderConfiguration): Provider {\n let provider: Provider = conf.provider || conf.web3?.currentProvider\n if (!provider) {\n if (conf.rpcUrl) {\n const chainIdRaw = conf.chainId ? conf.chainId : knownNetworks[conf.name || '']\n const chainId = chainIdRaw ? BigNumber.from(chainIdRaw).toNumber() : chainIdRaw\n const networkName = knownInfuraNetworks[conf.name || ''] ? conf.name?.replace('mainnet', 'homestead') : 'any'\n provider = new JsonRpcProvider(conf.rpcUrl, chainId || networkName)\n } else {\n throw new Error(`invalid_config: No web3 provider could be determined for network ${conf.name || conf.chainId}`)\n }\n }\n return provider\n}\n\nfunction configureNetwork(net: ProviderConfiguration): ConfiguredNetworks {\n const networks: ConfiguredNetworks = {}\n const chainId = net.chainId || knownNetworks[net.name || '']\n if (chainId) {\n if (net.name) {\n networks[net.name] = getProviderForNetwork(net)\n }\n const id = typeof chainId === 'number' ? `0x${chainId.toString(16)}` : chainId\n networks[id] = getProviderForNetwork(net)\n } else if (net.provider || net.web3 || net.rpcUrl) {\n networks[net.name || ''] = getProviderForNetwork(net)\n }\n return networks\n}\n\nfunction configureNetworks(conf: MultiProviderConfiguration): ConfiguredNetworks {\n return {\n ...configureNetwork(conf),\n ...conf.networks?.reduce<ConfiguredNetworks>((networks, net) => {\n return { ...networks, ...configureNetwork(net) }\n }, {}),\n }\n}\n\n/**\n * Generates a configuration that maps ethereum network names and chainIDs to the respective web3 providers.\n * @returns a record of providers\n * @param conf configuration options for the resolver. An array of network details.\n * Each network entry should contain at least one of `name` or `chainId` AND one of `provider`, `web3`, or `rpcUrl`\n * For convenience, you can also specify an `infuraProjectId` which will create a mapping for all the networks\n * supported by https://infura.io.\n * @example ```js\n * [\n * { name: 'development', rpcUrl: 'http://127.0.0.1:8545/' },\n * { name: 'goerli', chainId: 5, provider: new InfuraProvider('goerli') },\n * { name: 'rinkeby', provider: new AlchemyProvider('rinkeby') },\n * { name: 'rsk:testnet', chainId: '0x1f', rpcUrl: 'https://public-node.testnet.rsk.co' },\n * ]\n * ```\n */\nexport function configureResolverWithNetworks(conf: ConfigurationOptions = {}): ConfiguredNetworks {\n const networks = {\n ...configureNetworksWithInfura((<InfuraConfiguration>conf).infuraProjectId),\n ...configureNetworks(<MultiProviderConfiguration>conf),\n }\n if (Object.keys(networks).length === 0) {\n throw new Error('invalid_config: Please make sure to have at least one network')\n }\n return networks\n}\n","import { EnsResolver, Provider, Web3Provider } from '@ethersproject/providers'\nimport { DIDDocument, DIDResolutionResult, DIDResolver, ParsedDID, Service, VerificationMethod } from 'did-resolver'\nimport { ConfigurationOptions, configureResolverWithNetworks } from './configuration'\nimport { Errors, identifierMatcher, isDefined } from './helpers'\n\nexport function getResolver(config?: ConfigurationOptions): Record<string, DIDResolver> {\n async function resolve(did: string, parsed: ParsedDID): Promise<DIDResolutionResult> {\n const networks = configureResolverWithNetworks(config)\n // check if identifier(parsed.id) contains a network code\n const fullId = parsed.id.match(identifierMatcher)\n if (!fullId) {\n return {\n didResolutionMetadata: {\n error: Errors.invalidDid,\n message: `Not a valid did:ens: ${parsed.id}`,\n },\n didDocumentMetadata: {},\n didDocument: null,\n }\n }\n const ensName = fullId[2]\n const networkCode = typeof fullId[1] === 'string' ? fullId[1].slice(0, -1) : ''\n\n // get provider for that network or the mainnet provider if none other is given\n const provider: Provider = networks[networkCode]\n if (!provider || typeof provider === 'undefined') {\n return {\n didResolutionMetadata: {\n error: Errors.unknownNetwork,\n message: `This resolver is not configured for the ${networkCode} network required by ${\n parsed.id\n }. Networks: ${JSON.stringify(Object.keys(networks))}`,\n },\n didDocumentMetadata: {},\n didDocument: null,\n }\n }\n const ensResolver: EnsResolver | null = await (provider as Web3Provider).getResolver(ensName)\n if (!ensResolver) {\n return {\n didResolutionMetadata: {\n error: Errors.unknownEnsResolver,\n message: `This network (${networkCode}), required by ${parsed.id}, does not have a known ENS resolver`,\n },\n didDocumentMetadata: {},\n didDocument: null,\n }\n }\n let err: string | null = null\n let address: string | null = null\n try {\n address = await ensResolver.getAddress()\n } catch (error) {\n err = `resolver_error: Cannot resolve ENS name: ${error}`\n }\n\n const didDocumentMetadata = {}\n let didDocument: DIDDocument | null = null\n\n if (address) {\n const chainId = (await provider.getNetwork()).chainId\n const blockchainAccountId = `${address}@eip155:${chainId}`\n const postfix = address\n\n // setup default did doc\n didDocument = {\n id: did,\n service: [\n {\n id: `${did}#Web3PublicProfile-${postfix}`,\n type: 'Web3PublicProfile',\n serviceEndpoint: ensName,\n },\n ],\n verificationMethod: [\n {\n id: `${did}#${postfix}`,\n type: 'EcdsaSecp256k1RecoveryMethod2020',\n controller: did,\n blockchainAccountId,\n },\n ],\n authentication: [`${did}#${postfix}`],\n capabilityDelegation: [`${did}#${postfix}`],\n capabilityInvocation: [`${did}#${postfix}`],\n assertionMethod: [`${did}#${postfix}`],\n }\n }\n\n const getEnsRecord = async <T>(ensResolver: EnsResolver, name: string): Promise<T | null> => {\n let parsedEntry: T | null = null\n const entry = await ensResolver.getText(name)\n if (entry) {\n try {\n parsedEntry = JSON.parse(unescape(entry))\n } catch (e) {\n return null\n }\n }\n return parsedEntry\n }\n\n const filterValidVerificationMethods = (\n did: string,\n current: (string | VerificationMethod)[],\n all: VerificationMethod[]\n ): (string | VerificationMethod)[] => {\n const methodLinks = (current.filter((entry) => typeof entry === 'string') as string[])\n .map((entry) => (entry.startsWith('#') ? `${did}${entry}` : entry))\n .filter((entry) => all?.some((b) => b.id === entry))\n\n const fullMethods = (\n current.filter(\n (entry) =>\n entry != null &&\n typeof entry === 'object' &&\n Object.keys(entry).includes('id') &&\n Object.keys(entry).includes('type') &&\n Object.keys(entry).some((k) => k.startsWith('publicKey'))\n ) as VerificationMethod[]\n ).map((entry: VerificationMethod) => {\n entry.controller = entry.controller || did\n if (entry.id.startsWith('#')) {\n entry.id = `${did}${entry}`\n }\n return entry\n })\n return [...methodLinks, ...fullMethods]\n }\n\n const services = (await getEnsRecord<Service[]>(ensResolver, 'org.w3c.did.service')) || []\n if (services) {\n if (didDocument) {\n didDocument.service = [...(didDocument.service || []), ...services].filter(isDefined)\n }\n }\n\n const verificationMethods =\n (await getEnsRecord<VerificationMethod[]>(ensResolver, 'org.w3c.did.verificationMethod')) || []\n\n if (verificationMethods) {\n verificationMethods.map((method) => {\n if (method.id.startsWith('#')) {\n method.id = `${did}${method.id}`\n }\n method.controller = method.controller || did\n return method\n })\n if (didDocument) {\n didDocument.verificationMethod = [...(didDocument.verificationMethod || []), ...verificationMethods].filter(\n isDefined\n )\n }\n }\n\n const relationships = [\n 'keyAgreement',\n 'assertionMethod',\n 'authentication',\n 'capabilityInvocation',\n 'capabilityDelegation',\n ]\n await relationships.reduce(async (memo, relationship) => {\n await memo\n try {\n const verificationMethod =\n (await getEnsRecord<(string | VerificationMethod)[]>(ensResolver, `org.w3c.did.${relationship}`)) || []\n if (verificationMethod) {\n if (didDocument) {\n didDocument[relationship] = [\n ...(didDocument[relationship] || []),\n ...filterValidVerificationMethods(did, verificationMethod, verificationMethods),\n ]\n }\n }\n } catch (e) {\n // nop\n }\n }, Promise.resolve())\n\n const contentType =\n typeof didDocument?.['@context'] !== 'undefined' ? 'application/did+ld+json' : 'application/did+json'\n\n if (err) {\n return {\n didDocument,\n didDocumentMetadata,\n didResolutionMetadata: {\n error: Errors.notFound,\n message: err,\n },\n }\n } else {\n return {\n didDocument,\n didDocumentMetadata,\n didResolutionMetadata: { contentType },\n }\n }\n }\n\n return { ens: resolve }\n}\n"],"names":["identifierMatcher","knownInfuraNetworks","mainnet","goerli","knownNetworks","rsk","artis_t1","artis_s1","matic","maticmum","Errors","isDefined","arg","configureNetworksWithInfura","projectId","networks","name","chainId","provider","InfuraProvider","configureNetworks","getProviderForNetwork","conf","web3","currentProvider","rpcUrl","chainIdRaw","BigNumber","from","toNumber","networkName","replace","JsonRpcProvider","Error","configureNetwork","net","id","toString","reduce","configureResolverWithNetworks","infuraProjectId","Object","keys","length","getResolver","config","resolve","did","parsed","fullId","match","didResolutionMetadata","error","invalidDid","message","didDocumentMetadata","didDocument","ensName","networkCode","slice","unknownNetwork","JSON","stringify","ensResolver","unknownEnsResolver","err","address","getAddress","getNetwork","blockchainAccountId","postfix","service","type","serviceEndpoint","verificationMethod","controller","authentication","capabilityDelegation","capabilityInvocation","assertionMethod","getEnsRecord","parsedEntry","entry","getText","parse","unescape","e","filterValidVerificationMethods","current","all","methodLinks","filter","map","startsWith","some","b","fullMethods","includes","k","services","verificationMethods","method","relationships","memo","relationship","Promise","contentType","notFound","ens"],"mappings":"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"}