@metamask/name-controller 5.0.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/dist/NameController.js +14 -419
  3. package/dist/NameController.js.map +1 -1
  4. package/dist/NameController.mjs +15 -0
  5. package/dist/NameController.mjs.map +1 -0
  6. package/dist/chunk-6W3DEAGA.mjs +10 -0
  7. package/dist/chunk-6W3DEAGA.mjs.map +1 -0
  8. package/dist/chunk-B2WJNTJS.js +513 -0
  9. package/dist/chunk-B2WJNTJS.js.map +1 -0
  10. package/dist/chunk-BLG7EQAA.mjs +66 -0
  11. package/dist/chunk-BLG7EQAA.mjs.map +1 -0
  12. package/dist/chunk-DSVOMJX6.mjs +43 -0
  13. package/dist/chunk-DSVOMJX6.mjs.map +1 -0
  14. package/dist/chunk-EOUDE5KM.mjs +67 -0
  15. package/dist/chunk-EOUDE5KM.mjs.map +1 -0
  16. package/dist/chunk-GJYKWMRC.mjs +513 -0
  17. package/dist/chunk-GJYKWMRC.mjs.map +1 -0
  18. package/dist/chunk-JHYBLEC5.js +43 -0
  19. package/dist/chunk-JHYBLEC5.js.map +1 -0
  20. package/dist/chunk-L244TFFU.mjs +9 -0
  21. package/dist/chunk-L244TFFU.mjs.map +1 -0
  22. package/dist/chunk-PL7IXD33.js +10 -0
  23. package/dist/chunk-PL7IXD33.js.map +1 -0
  24. package/dist/chunk-QBR7BSWB.js +9 -0
  25. package/dist/chunk-QBR7BSWB.js.map +1 -0
  26. package/dist/chunk-RYIUDJOI.js +66 -0
  27. package/dist/chunk-RYIUDJOI.js.map +1 -0
  28. package/dist/chunk-SHTSUEYM.mjs +113 -0
  29. package/dist/chunk-SHTSUEYM.mjs.map +1 -0
  30. package/dist/chunk-UALYD4SG.mjs +138 -0
  31. package/dist/chunk-UALYD4SG.mjs.map +1 -0
  32. package/dist/chunk-W64QIPGB.js +80 -0
  33. package/dist/chunk-W64QIPGB.js.map +1 -0
  34. package/dist/chunk-WSOVXHAC.mjs +80 -0
  35. package/dist/chunk-WSOVXHAC.mjs.map +1 -0
  36. package/dist/chunk-X55IV67M.js +138 -0
  37. package/dist/chunk-X55IV67M.js.map +1 -0
  38. package/dist/chunk-XQXO5QPM.js +113 -0
  39. package/dist/chunk-XQXO5QPM.js.map +1 -0
  40. package/dist/chunk-XUI43LEZ.mjs +30 -0
  41. package/dist/chunk-XUI43LEZ.mjs.map +1 -0
  42. package/dist/chunk-Z4BLTVTB.js +30 -0
  43. package/dist/chunk-Z4BLTVTB.js.map +1 -0
  44. package/dist/chunk-Z6YC2DHC.js +67 -0
  45. package/dist/chunk-Z6YC2DHC.js.map +1 -0
  46. package/dist/constants.js +9 -105
  47. package/dist/constants.js.map +1 -1
  48. package/dist/constants.mjs +10 -0
  49. package/dist/constants.mjs.map +1 -0
  50. package/dist/index.js +36 -22
  51. package/dist/index.js.map +1 -1
  52. package/dist/index.mjs +37 -0
  53. package/dist/index.mjs.map +1 -0
  54. package/dist/logger.js +9 -6
  55. package/dist/logger.js.map +1 -1
  56. package/dist/logger.mjs +10 -0
  57. package/dist/logger.mjs.map +1 -0
  58. package/dist/providers/ens.js +9 -75
  59. package/dist/providers/ens.js.map +1 -1
  60. package/dist/providers/ens.mjs +10 -0
  61. package/dist/providers/ens.mjs.map +1 -0
  62. package/dist/providers/etherscan.js +11 -141
  63. package/dist/providers/etherscan.js.map +1 -1
  64. package/dist/providers/etherscan.mjs +12 -0
  65. package/dist/providers/etherscan.mjs.map +1 -0
  66. package/dist/providers/lens.js +10 -88
  67. package/dist/providers/lens.js.map +1 -1
  68. package/dist/providers/lens.mjs +11 -0
  69. package/dist/providers/lens.mjs.map +1 -0
  70. package/dist/providers/token.js +10 -78
  71. package/dist/providers/token.js.map +1 -1
  72. package/dist/providers/token.mjs +11 -0
  73. package/dist/providers/token.mjs.map +1 -0
  74. package/dist/tsconfig.build.tsbuildinfo +1 -0
  75. package/dist/types/NameController.d.ts.map +1 -0
  76. package/dist/{constants.d.ts → types/constants.d.ts} +7 -2
  77. package/dist/types/constants.d.ts.map +1 -0
  78. package/dist/types/index.d.ts.map +1 -0
  79. package/dist/types/logger.d.ts.map +1 -0
  80. package/dist/types/providers/ens.d.ts.map +1 -0
  81. package/dist/types/providers/etherscan.d.ts.map +1 -0
  82. package/dist/types/providers/lens.d.ts.map +1 -0
  83. package/dist/types/providers/token.d.ts.map +1 -0
  84. package/dist/types/types.d.ts.map +1 -0
  85. package/dist/types/util.d.ts.map +1 -0
  86. package/dist/types.js +7 -9
  87. package/dist/types.js.map +1 -1
  88. package/dist/types.mjs +8 -0
  89. package/dist/types.mjs.map +1 -0
  90. package/dist/util.js +13 -88
  91. package/dist/util.js.map +1 -1
  92. package/dist/util.mjs +14 -0
  93. package/dist/util.mjs.map +1 -0
  94. package/package.json +13 -3
  95. package/dist/NameController.d.ts.map +0 -1
  96. package/dist/constants.d.ts.map +0 -1
  97. package/dist/index.d.ts.map +0 -1
  98. package/dist/logger.d.ts.map +0 -1
  99. package/dist/providers/ens.d.ts.map +0 -1
  100. package/dist/providers/etherscan.d.ts.map +0 -1
  101. package/dist/providers/lens.d.ts.map +0 -1
  102. package/dist/providers/token.d.ts.map +0 -1
  103. package/dist/types.d.ts.map +0 -1
  104. package/dist/util.d.ts.map +0 -1
  105. /package/dist/{NameController.d.ts → types/NameController.d.ts} +0 -0
  106. /package/dist/{index.d.ts → types/index.d.ts} +0 -0
  107. /package/dist/{logger.d.ts → types/logger.d.ts} +0 -0
  108. /package/dist/{providers → types/providers}/ens.d.ts +0 -0
  109. /package/dist/{providers → types/providers}/etherscan.d.ts +0 -0
  110. /package/dist/{providers → types/providers}/lens.d.ts +0 -0
  111. /package/dist/{providers → types/providers}/token.d.ts +0 -0
  112. /package/dist/{types.d.ts → types/types.d.ts} +0 -0
  113. /package/dist/{util.d.ts → types/util.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/NameController.ts"],"sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\n\nimport type {\n NameProvider,\n NameProviderRequest,\n NameProviderResult,\n NameProviderSourceResult,\n} from './types';\nimport { NameType } from './types';\n\nexport const FALLBACK_VARIATION = '*';\nexport const PROPOSED_NAME_EXPIRE_DURATION = 60 * 60 * 24; // 24 hours\n\n/**\n * Enumerates the possible origins responsible for setting a petname.\n */\nexport enum NameOrigin {\n // Originated from an account identity.\n ACCOUNT_IDENTITY = 'account-identity',\n // Originated from an address book entry.\n ADDRESS_BOOK = 'address-book',\n // Originated from the API (NameController.setName). This is the default.\n API = 'api',\n // Originated from the user taking action in the UI.\n UI = 'ui',\n}\n\nconst DEFAULT_UPDATE_DELAY = 60 * 2; // 2 Minutes\nconst DEFAULT_VARIATION = '';\n\nconst controllerName = 'NameController';\n\nconst stateMetadata = {\n names: { persist: true, anonymous: false },\n nameSources: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n names: {\n [NameType.ETHEREUM_ADDRESS]: {},\n },\n nameSources: {},\n});\n\nexport type ProposedNamesEntry = {\n proposedNames: string[];\n lastRequestTime: number | null;\n updateDelay: number | null;\n};\n\nexport type NameEntry = {\n name: string | null;\n sourceId: string | null;\n origin: NameOrigin | null;\n proposedNames: Record<string, ProposedNamesEntry>;\n};\n\nexport type SourceEntry = {\n label: string;\n};\n\nexport type NameControllerState = {\n // Type > Value > Variation > Entry\n names: Record<NameType, Record<string, Record<string, NameEntry>>>;\n nameSources: Record<string, SourceEntry>;\n};\n\nexport type GetNameState = ControllerGetStateAction<\n typeof controllerName,\n NameControllerState\n>;\n\nexport type NameStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n NameControllerState\n>;\n\nexport type NameControllerActions = GetNameState;\n\nexport type NameControllerEvents = NameStateChange;\n\nexport type NameControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n NameControllerActions,\n NameControllerEvents,\n never,\n never\n>;\n\nexport type NameControllerOptions = {\n messenger: NameControllerMessenger;\n providers: NameProvider[];\n state?: Partial<NameControllerState>;\n updateDelay?: number;\n};\n\nexport type UpdateProposedNamesRequest = {\n value: string;\n type: NameType;\n sourceIds?: string[];\n onlyUpdateAfterDelay?: boolean;\n variation?: string;\n};\n\nexport type UpdateProposedNamesResult = {\n results: Record<string, { proposedNames?: string[]; error?: unknown }>;\n};\n\nexport type SetNameRequest = {\n value: string;\n type: NameType;\n name: string | null;\n sourceId?: string;\n variation?: string;\n origin?: NameOrigin;\n};\n\n/**\n * Controller for storing and deriving names for values such as Ethereum addresses.\n */\nexport class NameController extends BaseController<\n typeof controllerName,\n NameControllerState,\n NameControllerMessenger\n> {\n #providers: NameProvider[];\n\n #updateDelay: number;\n\n /**\n * Construct a Name controller.\n *\n * @param options - Controller options.\n * @param options.messenger - Restricted controller messenger for the name controller.\n * @param options.providers - Array of name provider instances to propose names.\n * @param options.state - Initial state to set on the controller.\n * @param options.updateDelay - The delay in seconds before a new request to a source should be made.\n */\n constructor({\n messenger,\n providers,\n state,\n updateDelay,\n }: NameControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#providers = providers;\n this.#updateDelay = updateDelay ?? DEFAULT_UPDATE_DELAY;\n }\n\n /**\n * Set the user specified name for a value.\n *\n * @param request - Request object.\n * @param request.name - Name to set.\n * @param request.sourceId - Optional ID of the source of the proposed name.\n * @param request.type - Type of value to set the name for.\n * @param request.value - Value to set the name for.\n * @param request.variation - Variation of the raw value to set the name for. The chain ID if the type is Ethereum address.\n */\n setName(request: SetNameRequest) {\n this.#validateSetNameRequest(request);\n\n const {\n value,\n type,\n name,\n sourceId: requestSourceId,\n origin: requestOrigin,\n variation,\n } = request;\n const sourceId = requestSourceId ?? null;\n // If the name is being cleared, the fallback origin should be cleared as well.\n const fallbackOrigin = name === null ? null : NameOrigin.API;\n const origin = requestOrigin ?? fallbackOrigin;\n\n this.#updateEntry(value, type, variation, (entry: NameEntry) => {\n entry.name = name;\n entry.sourceId = sourceId;\n entry.origin = origin;\n });\n }\n\n /**\n * Generate the proposed names for a value using the name providers and store them in the state.\n *\n * @param request - Request object.\n * @param request.value - Value to update the proposed names for.\n * @param request.type - Type of value to update the proposed names for.\n * @param request.sourceIds - Optional array of source IDs to limit which sources are used by the providers. If not provided, all sources in all providers will be used.\n * @param request.variation - Variation of the raw value to update proposed names for. The chain ID if the type is Ethereum address.\n * @returns The updated proposed names for the value.\n */\n async updateProposedNames(\n request: UpdateProposedNamesRequest,\n ): Promise<UpdateProposedNamesResult> {\n this.#validateUpdateProposedNamesRequest(request);\n\n const providerResponses = (\n await Promise.all(\n this.#providers.map((provider) =>\n this.#getProviderResponse(request, provider),\n ),\n )\n ).filter((response) => Boolean(response)) as NameProviderResult[];\n\n this.#updateProposedNameState(request, providerResponses);\n this.#updateSourceState(this.#providers);\n this.#removeExpiredEntries();\n\n return this.#getUpdateProposedNamesResult(providerResponses);\n }\n\n #updateProposedNameState(\n request: UpdateProposedNamesRequest,\n providerResponses: NameProviderResult[],\n ) {\n const { value, type, variation } = request;\n const currentTime = this.#getCurrentTimeSeconds();\n\n this.#updateEntry(value, type, variation, (entry: NameEntry) => {\n this.#removeDormantProposedNames(entry.proposedNames, type);\n\n for (const providerResponse of providerResponses) {\n const { results } = providerResponse;\n\n for (const sourceId of Object.keys(providerResponse.results)) {\n const result = results[sourceId];\n const { proposedNames, updateDelay } = result;\n\n const proposedNameEntry = entry.proposedNames[sourceId] ?? {\n proposedNames: [],\n lastRequestTime: null,\n updateDelay: null,\n };\n\n entry.proposedNames[sourceId] = proposedNameEntry;\n\n if (proposedNames) {\n proposedNameEntry.proposedNames = proposedNames;\n }\n\n proposedNameEntry.lastRequestTime = currentTime;\n proposedNameEntry.updateDelay = updateDelay ?? null;\n }\n }\n });\n }\n\n #updateSourceState(providers: NameProvider[]) {\n const newNameSources = { ...this.state.nameSources };\n\n for (const provider of providers) {\n const { sourceLabels } = provider.getMetadata();\n\n for (const sourceId of Object.keys(sourceLabels)) {\n newNameSources[sourceId] = {\n label: sourceLabels[sourceId],\n };\n }\n }\n\n this.update((state) => {\n state.nameSources = newNameSources;\n });\n }\n\n #getUpdateProposedNamesResult(\n providerResponses: NameProviderResult[],\n ): UpdateProposedNamesResult {\n return providerResponses.reduce(\n (acc: UpdateProposedNamesResult, providerResponse) => {\n const { results } = providerResponse;\n\n for (const sourceId of Object.keys(results)) {\n const { proposedNames, error } = results[sourceId];\n\n acc.results[sourceId] = {\n proposedNames,\n error,\n };\n }\n\n return acc;\n },\n { results: {} },\n );\n }\n\n async #getProviderResponse(\n request: UpdateProposedNamesRequest,\n provider: NameProvider,\n ): Promise<NameProviderResult | undefined> {\n const {\n value,\n type,\n sourceIds: requestedSourceIds,\n onlyUpdateAfterDelay,\n variation,\n } = request;\n\n /* istanbul ignore next */\n const variationKey = variation ?? DEFAULT_VARIATION;\n const supportedSourceIds = this.#getSourceIds(provider, type);\n const currentTime = this.#getCurrentTimeSeconds();\n const normalizedValue = this.#normalizeValue(value, type);\n\n const matchingSourceIds = supportedSourceIds.filter((sourceId) => {\n if (requestedSourceIds && !requestedSourceIds.includes(sourceId)) {\n return false;\n }\n\n if (onlyUpdateAfterDelay) {\n const entry =\n this.state.names[type]?.[normalizedValue]?.[variationKey] ?? {};\n const proposedNamesEntry = entry.proposedNames?.[sourceId] ?? {};\n const lastRequestTime = proposedNamesEntry.lastRequestTime ?? 0;\n const updateDelay = proposedNamesEntry.updateDelay ?? this.#updateDelay;\n\n if (currentTime - lastRequestTime < updateDelay) {\n return false;\n }\n }\n\n return true;\n });\n\n if (!matchingSourceIds.length) {\n return undefined;\n }\n\n const providerRequest: NameProviderRequest = {\n value: this.#normalizeValue(value, type),\n type,\n sourceIds: requestedSourceIds ? matchingSourceIds : undefined,\n variation: this.#normalizeVariation(variationKey, type),\n };\n\n let responseError: unknown | undefined;\n let response: NameProviderResult | undefined;\n\n try {\n response = await provider.getProposedNames(providerRequest);\n responseError = response.error;\n } catch (error) {\n responseError = error;\n }\n\n return this.#normalizeProviderResult(\n response,\n responseError,\n matchingSourceIds,\n );\n }\n\n #normalizeProviderResult(\n result: NameProviderResult | undefined,\n responseError: unknown,\n matchingSourceIds: string[],\n ): NameProviderResult {\n const error = responseError ?? undefined;\n\n const results = matchingSourceIds.reduce((acc, sourceId) => {\n const sourceResult = result?.results?.[sourceId];\n\n const normalizedSourceResult = this.#normalizeProviderSourceResult(\n sourceResult,\n responseError,\n );\n\n return {\n ...acc,\n [sourceId]: normalizedSourceResult,\n };\n }, {});\n\n return { results, error };\n }\n\n #normalizeProviderSourceResult(\n result: NameProviderSourceResult | undefined,\n responseError: unknown,\n ): NameProviderSourceResult | undefined {\n const error = result?.error ?? responseError ?? undefined;\n const updateDelay = result?.updateDelay ?? undefined;\n let proposedNames = error ? undefined : result?.proposedNames ?? undefined;\n\n if (proposedNames) {\n proposedNames = proposedNames.filter(\n (proposedName) => proposedName?.length,\n );\n }\n\n return {\n proposedNames,\n error,\n updateDelay,\n };\n }\n\n #normalizeValue(value: string, type: NameType): string {\n /* istanbul ignore next */\n switch (type) {\n case NameType.ETHEREUM_ADDRESS:\n return value.toLowerCase();\n\n default:\n return value;\n }\n }\n\n #normalizeVariation(variation: string, type: NameType): string {\n /* istanbul ignore next */\n switch (type) {\n case NameType.ETHEREUM_ADDRESS:\n return variation.toLowerCase();\n\n default:\n return variation;\n }\n }\n\n #updateEntry(\n value: string,\n type: NameType,\n variation: string | undefined,\n callback: (entry: NameEntry) => void,\n ) {\n /* istanbul ignore next */\n const variationKey = variation ?? DEFAULT_VARIATION;\n const normalizedValue = this.#normalizeValue(value, type);\n const normalizedVariation = this.#normalizeVariation(variationKey, type);\n\n this.update((state) => {\n const typeEntries = state.names[type] || {};\n state.names[type] = typeEntries;\n\n const variationEntries = typeEntries[normalizedValue] || {};\n typeEntries[normalizedValue] = variationEntries;\n\n const entry = variationEntries[normalizedVariation] ?? {\n proposedNames: {},\n name: null,\n sourceId: null,\n origin: null,\n };\n variationEntries[normalizedVariation] = entry;\n\n callback(entry);\n });\n }\n\n #getCurrentTimeSeconds(): number {\n return Math.round(Date.now() / 1000);\n }\n\n #validateSetNameRequest(request: SetNameRequest) {\n const { name, value, type, sourceId, variation, origin } = request;\n const errorMessages: string[] = [];\n\n this.#validateValue(value, errorMessages);\n this.#validateType(type, errorMessages);\n this.#validateName(name, errorMessages);\n this.#validateSourceId(sourceId, type, name, errorMessages);\n this.#validateVariation(variation, type, errorMessages);\n this.#validateOrigin(origin, name, errorMessages);\n\n if (errorMessages.length) {\n throw new Error(errorMessages.join(' '));\n }\n }\n\n #validateUpdateProposedNamesRequest(request: UpdateProposedNamesRequest) {\n const { value, type, sourceIds, variation } = request;\n const errorMessages: string[] = [];\n\n this.#validateValue(value, errorMessages);\n this.#validateType(type, errorMessages);\n this.#validateSourceIds(sourceIds, type, errorMessages);\n this.#validateDuplicateSourceIds(type, errorMessages);\n this.#validateVariation(variation, type, errorMessages);\n\n if (errorMessages.length) {\n throw new Error(errorMessages.join(' '));\n }\n }\n\n #validateValue(value: string, errorMessages: string[]) {\n if (!value?.length || typeof value !== 'string') {\n errorMessages.push('Must specify a non-empty string for value.');\n }\n }\n\n #validateType(type: NameType, errorMessages: string[]) {\n if (!Object.values(NameType).includes(type)) {\n errorMessages.push(\n `Must specify one of the following types: ${Object.values(\n NameType,\n ).join(', ')}`,\n );\n }\n }\n\n #validateName(name: string | null, errorMessages: string[]) {\n if (name === null) {\n return;\n }\n\n if (!name?.length || typeof name !== 'string') {\n errorMessages.push('Must specify a non-empty string or null for name.');\n }\n }\n\n #validateSourceIds(\n sourceIds: string[] | undefined,\n type: NameType,\n errorMessages: string[],\n ) {\n if (!sourceIds) {\n return;\n }\n\n const allSourceIds = this.#getAllSourceIds(type);\n const missingSourceIds = [];\n\n for (const sourceId of sourceIds) {\n if (!allSourceIds.includes(sourceId)) {\n missingSourceIds.push(sourceId);\n continue;\n }\n }\n\n if (missingSourceIds.length) {\n errorMessages.push(\n `Unknown source IDs for type '${type}': ${missingSourceIds.join(', ')}`,\n );\n }\n }\n\n #validateSourceId(\n sourceId: string | undefined,\n type: NameType,\n name: string | null,\n errorMessages: string[],\n ) {\n if (sourceId === null || sourceId === undefined) {\n return;\n }\n\n if (name === null) {\n errorMessages.push(\n `Cannot specify a source ID when clearing the saved name: ${sourceId}`,\n );\n return;\n }\n\n const allSourceIds = this.#getAllSourceIds(type);\n\n if (!sourceId.length || typeof sourceId !== 'string') {\n errorMessages.push('Must specify a non-empty string for sourceId.');\n return;\n }\n\n if (!allSourceIds.includes(sourceId)) {\n errorMessages.push(`Unknown source ID for type '${type}': ${sourceId}`);\n }\n }\n\n #validateDuplicateSourceIds(type: NameType, errorMessages: string[]) {\n const allSourceIds = this.#getAllSourceIds(type);\n\n const duplicateSourceIds = allSourceIds.filter(\n (sourceId, index) => allSourceIds.indexOf(sourceId) !== index,\n );\n\n if (duplicateSourceIds.length) {\n errorMessages.push(\n `Duplicate source IDs found for type '${type}': ${duplicateSourceIds.join(\n ', ',\n )}`,\n );\n }\n }\n\n #validateVariation(\n variation: string | undefined,\n type: string,\n errorMessages: string[],\n ) {\n if (type !== NameType.ETHEREUM_ADDRESS) {\n return;\n }\n\n if (\n !variation?.length ||\n typeof variation !== 'string' ||\n (!variation.match(/^0x[0-9A-Fa-f]+$/u) &&\n variation !== FALLBACK_VARIATION)\n ) {\n errorMessages.push(\n `Must specify a chain ID in hexidecimal format or the fallback, \"${FALLBACK_VARIATION}\", for variation when using '${type}' type.`,\n );\n }\n }\n\n #validateOrigin(\n origin: NameOrigin | null | undefined,\n name: string | null,\n errorMessages: string[],\n ) {\n if (!origin) {\n return;\n }\n\n if (name === null) {\n errorMessages.push(\n `Cannot specify an origin when clearing the saved name: ${origin}`,\n );\n return;\n }\n\n if (!Object.values(NameOrigin).includes(origin)) {\n errorMessages.push(\n `Must specify one of the following origins: ${Object.values(\n NameOrigin,\n ).join(', ')}`,\n );\n }\n }\n\n #getAllSourceIds(type: NameType): string[] {\n return (\n this.#providers\n /* istanbul ignore next */\n .map((provider) => this.#getSourceIds(provider, type))\n .flat()\n );\n }\n\n #getSourceIds(provider: NameProvider, type: NameType): string[] {\n return provider.getMetadata().sourceIds[type];\n }\n\n #removeDormantProposedNames(\n proposedNames: Record<string, ProposedNamesEntry>,\n type: NameType,\n ) {\n if (Object.keys(proposedNames).length === 0) {\n return;\n }\n\n const typeSourceIds = this.#getAllSourceIds(type);\n\n const dormantSourceIds = Object.keys(proposedNames).filter(\n (sourceId) => !typeSourceIds.includes(sourceId),\n );\n\n for (const dormantSourceId of dormantSourceIds) {\n delete proposedNames[dormantSourceId];\n }\n }\n\n #removeExpiredEntries(): void {\n const currentTime = this.#getCurrentTimeSeconds();\n\n this.update((state: NameControllerState) => {\n const entries = this.#getEntriesList(state);\n for (const { nameType, value, variation, entry } of entries) {\n if (entry.name !== null) {\n continue;\n }\n\n const proposedNames = Object.values(entry.proposedNames);\n const allProposedNamesExpired = proposedNames.every(\n (proposedName: ProposedNamesEntry) =>\n currentTime - (proposedName.lastRequestTime ?? 0) >=\n PROPOSED_NAME_EXPIRE_DURATION,\n );\n\n if (allProposedNamesExpired) {\n delete state.names[nameType][value][variation];\n }\n }\n });\n }\n\n #getEntriesList(state: NameControllerState): {\n nameType: NameType;\n value: string;\n variation: string;\n entry: NameEntry;\n }[] {\n return Object.entries(state.names).flatMap(([type, typeEntries]) =>\n Object.entries(typeEntries).flatMap(([value, variationEntries]) =>\n Object.entries(variationEntries).map(([variation, entry]) => ({\n entry,\n nameType: type as NameType,\n value,\n variation,\n })),\n ),\n );\n }\n}\n"],"mappings":"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","names":["NameOrigin"]}
@@ -0,0 +1,43 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/util.ts
2
+ async function graphQL(url, query, variables) {
3
+ const body = JSON.stringify({
4
+ query,
5
+ variables
6
+ });
7
+ const response = await handleFetch(url, {
8
+ body,
9
+ method: "POST",
10
+ headers: {
11
+ "Content-Type": "application/json"
12
+ }
13
+ });
14
+ return response?.data;
15
+ }
16
+ async function handleFetch(request, options) {
17
+ const response = await successfulFetch(request, options);
18
+ const object = await response.json();
19
+ return object;
20
+ }
21
+ async function successfulFetch(request, options) {
22
+ const response = await fetch(request, options);
23
+ if (!response.ok) {
24
+ throw new Error(
25
+ `Fetch failed with status '${response.status}' for request '${request}'`
26
+ );
27
+ }
28
+ return response;
29
+ }
30
+ function assertIsError(error) {
31
+ if (error instanceof Error) {
32
+ return;
33
+ }
34
+ throw new Error(`Invalid error of type '${typeof error}'`);
35
+ }
36
+
37
+
38
+
39
+
40
+
41
+
42
+ exports.graphQL = graphQL; exports.handleFetch = handleFetch; exports.successfulFetch = successfulFetch; exports.assertIsError = assertIsError;
43
+ //# sourceMappingURL=chunk-JHYBLEC5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util.ts"],"names":[],"mappings":";AAOA,eAAsB,QACpB,KACA,OAGA,WACY;AACZ,QAAM,OAAO,KAAK,UAAU;AAAA,IAC1B;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,YAAY,KAAK;AAAA,IACtC;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAO,UAAU;AACnB;AAWA,eAAsB,YAAY,SAAiB,SAAuB;AACxE,QAAM,WAAW,MAAM,gBAAgB,SAAS,OAAO;AACvD,QAAM,SAAS,MAAM,SAAS,KAAK;AACnC,SAAO;AACT;AASA,eAAsB,gBAAgB,SAAiB,SAAuB;AAC5E,QAAM,WAAW,MAAM,MAAM,SAAS,OAAO;AAC7C,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,6BAA6B,SAAS,MAAM,kBAAkB,OAAO;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;AAWO,SAAS,cAAc,OAAwC;AACpE,MAAI,iBAAiB,OAAO;AAC1B;AAAA,EACF;AACA,QAAM,IAAI,MAAM,0BAA0B,OAAO,KAAK,GAAG;AAC3D","sourcesContent":["/**\n * Execute a GraphQL query.\n *\n * @param url - GraphQL endpoint URL.\n * @param query - GraphQL query.\n * @param variables - GraphQL variables.\n */\nexport async function graphQL<T>(\n url: string,\n query: string,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n variables: Record<string, any>,\n): Promise<T> {\n const body = JSON.stringify({\n query,\n variables,\n });\n\n const response = await handleFetch(url, {\n body,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n return response?.data;\n}\n\n// Below functions are intentionally copied from controller-utils to avoid a package dependency\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await successfulFetch(request, options);\n const object = await response.json();\n return object;\n}\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options);\n if (!response.ok) {\n throw new Error(\n `Fetch failed with status '${response.status}' for request '${request}'`,\n );\n }\n return response;\n}\n\n/**\n * Assert that a value is an error. If it's not an error, throw an\n * error that wraps the given value.\n *\n * TODO: Migrate this to @metamask/utils\n *\n * @param error - The value that we expect to be an error.\n * @throws Throws an error wrapping the given value if it's not an error.\n */\nexport function assertIsError(error: unknown): asserts error is Error {\n if (error instanceof Error) {\n return;\n }\n throw new Error(`Invalid error of type '${typeof error}'`);\n}\n"]}
@@ -0,0 +1,9 @@
1
+ // src/logger.ts
2
+ import { createProjectLogger, createModuleLogger } from "@metamask/utils";
3
+ var projectLogger = createProjectLogger("name-controller");
4
+
5
+ export {
6
+ createModuleLogger,
7
+ projectLogger
8
+ };
9
+ //# sourceMappingURL=chunk-L244TFFU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger.ts"],"sourcesContent":["import { createProjectLogger, createModuleLogger } from '@metamask/utils';\n\nexport const projectLogger = createProjectLogger('name-controller');\n\nexport { createModuleLogger };\n"],"mappings":";AAAA,SAAS,qBAAqB,0BAA0B;AAEjD,IAAM,gBAAgB,oBAAoB,iBAAiB;","names":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/types.ts
2
+ var NameType = /* @__PURE__ */ ((NameType2) => {
3
+ NameType2["ETHEREUM_ADDRESS"] = "ethereumAddress";
4
+ return NameType2;
5
+ })(NameType || {});
6
+
7
+
8
+
9
+ exports.NameType = NameType;
10
+ //# sourceMappingURL=chunk-PL7IXD33.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"names":["NameType"],"mappings":";AACO,IAAK,WAAL,kBAAKA,cAAL;AAEL,EAAAA,UAAA,sBAAmB;AAFT,SAAAA;AAAA,GAAA","sourcesContent":["/** The name types supported by the NameController. */\nexport enum NameType {\n /** The address of an Ethereum account. */\n ETHEREUM_ADDRESS = 'ethereumAddress',\n}\n\n/** The metadata for a name provider. */\nexport type NameProviderMetadata = {\n /**\n * IDs for each alternate source of proposed names.\n * Keyed by the name type.\n */\n sourceIds: Record<NameType, string[]>;\n\n /**\n * Friendly labels to describe each source of proposed names.\n * Keyed by the source ID.\n */\n sourceLabels: Record<string, string>;\n};\n\n/** The request data to get proposed names from a name provider. */\nexport type NameProviderRequest = {\n /** The optional list of source IDs to get proposed names from. */\n sourceIds?: string[];\n\n /** The type of name being requested. */\n type: NameType;\n\n /** The raw value to get proposed names for. */\n value: string;\n\n /**\n * The variation of the raw value to get proposed names for.\n * For example, the chain ID if the raw value is an Ethereum address.\n */\n variation: string;\n};\n\n/** The resulting data after requesting proposed names from a name provider, for a single source. */\nexport type NameProviderSourceResult = {\n /**\n * The array of proposed names from the source.\n * Undefined if there is an error.\n */\n proposedNames?: string[];\n\n /**\n * The delay in seconds before the next request to the source should be made.\n * Can be used to avoid rate limiting for example.\n */\n updateDelay?: number;\n\n /**\n * An error that occurred while fetching the proposed names from the source.\n * Undefined if there was no error.\n */\n error?: unknown;\n};\n\n/** The resulting data after requesting proposed names from a name provider. */\nexport type NameProviderResult = {\n /**\n * The resulting data from each alternate source of proposed names supported by the name provider.\n * Keyed by the source ID.\n */\n results: Record<string, NameProviderSourceResult>;\n\n /**\n * An error that occurred while fetching the proposed names that was not specific to a single source.\n * Undefined if there was no error.\n */\n error?: unknown;\n};\n\n/** An object capable of proposing friendly names for a raw value of a given type. */\nexport type NameProvider = {\n /**\n * Returns metadata about the name provider.\n */\n getMetadata(): NameProviderMetadata;\n\n /**\n * Returns proposed names for the given value and request data.\n *\n * @param request - The request data including the value to propose names for.\n */\n getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;\n};\n"]}
@@ -0,0 +1,9 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/logger.ts
2
+ var _utils = require('@metamask/utils');
3
+ var projectLogger = _utils.createProjectLogger.call(void 0, "name-controller");
4
+
5
+
6
+
7
+
8
+ exports.createModuleLogger = _utils.createModuleLogger; exports.projectLogger = projectLogger;
9
+ //# sourceMappingURL=chunk-QBR7BSWB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger.ts"],"names":[],"mappings":";AAAA,SAAS,qBAAqB,0BAA0B;AAEjD,IAAM,gBAAgB,oBAAoB,iBAAiB","sourcesContent":["import { createProjectLogger, createModuleLogger } from '@metamask/utils';\n\nexport const projectLogger = createProjectLogger('name-controller');\n\nexport { createModuleLogger };\n"]}
@@ -0,0 +1,66 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkQBR7BSWBjs = require('./chunk-QBR7BSWB.js');
5
+
6
+
7
+
8
+
9
+ var _chunkZ4BLTVTBjs = require('./chunk-Z4BLTVTB.js');
10
+
11
+ // src/providers/ens.ts
12
+ var ID = "ens";
13
+ var LABEL = "Ethereum Name Service (ENS)";
14
+ var log = _chunkQBR7BSWBjs.createModuleLogger.call(void 0, _chunkQBR7BSWBjs.projectLogger, "ens");
15
+ var _isEnabled, _reverseLookup;
16
+ var ENSNameProvider = class {
17
+ constructor({
18
+ isEnabled,
19
+ reverseLookup
20
+ }) {
21
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _isEnabled, void 0);
22
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _reverseLookup, void 0);
23
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isEnabled, isEnabled || (() => true));
24
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _reverseLookup, reverseLookup);
25
+ }
26
+ getMetadata() {
27
+ return {
28
+ sourceIds: { ["ethereumAddress" /* ETHEREUM_ADDRESS */]: [ID] },
29
+ sourceLabels: { [ID]: LABEL }
30
+ };
31
+ }
32
+ async getProposedNames(request) {
33
+ if (!_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isEnabled).call(this)) {
34
+ log("Skipping request as disabled");
35
+ return {
36
+ results: {
37
+ [ID]: {
38
+ proposedNames: []
39
+ }
40
+ }
41
+ };
42
+ }
43
+ const { value, variation: chainId } = request;
44
+ log("Invoking callback", { value, chainId });
45
+ try {
46
+ const proposedName = await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _reverseLookup).call(this, value, chainId);
47
+ const proposedNames = proposedName ? [proposedName] : [];
48
+ log("New proposed names", proposedNames);
49
+ return {
50
+ results: {
51
+ [ID]: { proposedNames }
52
+ }
53
+ };
54
+ } catch (error) {
55
+ log("Request failed", error);
56
+ throw error;
57
+ }
58
+ }
59
+ };
60
+ _isEnabled = new WeakMap();
61
+ _reverseLookup = new WeakMap();
62
+
63
+
64
+
65
+ exports.ENSNameProvider = ENSNameProvider;
66
+ //# sourceMappingURL=chunk-RYIUDJOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/ens.ts"],"names":[],"mappings":";;;;;;;;;;;AAcA,IAAM,KAAK;AACX,IAAM,QAAQ;AAEd,IAAM,MAAM,mBAAmB,eAAe,KAAK;AAjBnD;AAmBO,IAAM,kBAAN,MAA8C;AAAA,EAKnD,YAAY;AAAA,IACV;AAAA,IACA;AAAA,EACF,GAGG;AAVH;AAEA;AASE,uBAAK,YAAa,cAAc,MAAM;AACtC,uBAAK,gBAAiB;AAAA,EACxB;AAAA,EAEA,cAAoC;AAClC,WAAO;AAAA,MACL,WAAW,EAAE,yCAA0B,GAAG,CAAC,EAAE,EAAE;AAAA,MAC/C,cAAc,EAAE,CAAC,EAAE,GAAG,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,SAC6B;AAC7B,QAAI,CAAC,mBAAK,YAAL,YAAmB;AACtB,UAAI,8BAA8B;AAElC,aAAO;AAAA,QACL,SAAS;AAAA,UACP,CAAC,EAAE,GAAG;AAAA,YACJ,eAAe,CAAC;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,WAAW,QAAQ,IAAI;AAEtC,QAAI,qBAAqB,EAAE,OAAO,QAAQ,CAAC;AAE3C,QAAI;AACF,YAAM,eAAe,MAAM,mBAAK,gBAAL,WAAoB,OAAO;AACtD,YAAM,gBAAgB,eAAe,CAAC,YAAY,IAAI,CAAC;AAEvD,UAAI,sBAAsB,aAAa;AAEvC,aAAO;AAAA,QACL,SAAS;AAAA,UACP,CAAC,EAAE,GAAG,EAAE,cAAc;AAAA,QACxB;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,kBAAkB,KAAK;AAC3B,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAzDE;AAEA","sourcesContent":["import { projectLogger, createModuleLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\n\nexport type ReverseLookupCallback = (\n address: string,\n chainId: string,\n) => Promise<string>;\n\nconst ID = 'ens';\nconst LABEL = 'Ethereum Name Service (ENS)';\n\nconst log = createModuleLogger(projectLogger, 'ens');\n\nexport class ENSNameProvider implements NameProvider {\n #isEnabled: () => boolean;\n\n #reverseLookup: ReverseLookupCallback;\n\n constructor({\n isEnabled,\n reverseLookup,\n }: {\n isEnabled?: () => boolean;\n reverseLookup: ReverseLookupCallback;\n }) {\n this.#isEnabled = isEnabled || (() => true);\n this.#reverseLookup = reverseLookup;\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const { value, variation: chainId } = request;\n\n log('Invoking callback', { value, chainId });\n\n try {\n const proposedName = await this.#reverseLookup(value, chainId);\n const proposedNames = proposedName ? [proposedName] : [];\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: { proposedNames },\n },\n };\n } catch (error) {\n log('Request failed', error);\n throw error;\n }\n }\n}\n"]}
@@ -0,0 +1,113 @@
1
+ // src/constants.ts
2
+ var CHAIN_IDS = {
3
+ MAINNET: "0x1",
4
+ GOERLI: "0x5",
5
+ BSC: "0x38",
6
+ BSC_TESTNET: "0x61",
7
+ OPTIMISM: "0xa",
8
+ OPTIMISM_SEPOLIA: "0xaa37dc",
9
+ POLYGON: "0x89",
10
+ POLYGON_TESTNET: "0x13881",
11
+ AVALANCHE: "0xa86a",
12
+ AVALANCHE_TESTNET: "0xa869",
13
+ FANTOM: "0xfa",
14
+ FANTOM_TESTNET: "0xfa2",
15
+ SEPOLIA: "0xaa36a7",
16
+ LINEA_GOERLI: "0xe704",
17
+ LINEA_SEPOLIA: "0xe705",
18
+ LINEA_MAINNET: "0xe708",
19
+ MOONBEAM: "0x504",
20
+ MOONBEAM_TESTNET: "0x507",
21
+ MOONRIVER: "0x505",
22
+ GNOSIS: "0x64"
23
+ };
24
+ var DEFAULT_ETHERSCAN_DOMAIN = "etherscan.io";
25
+ var DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = "api";
26
+ var ETHERSCAN_SUPPORTED_NETWORKS = {
27
+ [CHAIN_IDS.GOERLI]: {
28
+ domain: DEFAULT_ETHERSCAN_DOMAIN,
29
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`
30
+ },
31
+ [CHAIN_IDS.MAINNET]: {
32
+ domain: DEFAULT_ETHERSCAN_DOMAIN,
33
+ subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
34
+ },
35
+ [CHAIN_IDS.SEPOLIA]: {
36
+ domain: DEFAULT_ETHERSCAN_DOMAIN,
37
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`
38
+ },
39
+ [CHAIN_IDS.LINEA_GOERLI]: {
40
+ domain: "lineascan.build",
41
+ subdomain: "goerli"
42
+ },
43
+ [CHAIN_IDS.LINEA_SEPOLIA]: {
44
+ domain: "lineascan.build",
45
+ subdomain: "sepolia"
46
+ },
47
+ [CHAIN_IDS.LINEA_MAINNET]: {
48
+ domain: "lineascan.build",
49
+ subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
50
+ },
51
+ [CHAIN_IDS.BSC]: {
52
+ domain: "bscscan.com",
53
+ subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
54
+ },
55
+ [CHAIN_IDS.BSC_TESTNET]: {
56
+ domain: "bscscan.com",
57
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`
58
+ },
59
+ [CHAIN_IDS.OPTIMISM]: {
60
+ domain: DEFAULT_ETHERSCAN_DOMAIN,
61
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-optimistic`
62
+ },
63
+ [CHAIN_IDS.OPTIMISM_SEPOLIA]: {
64
+ domain: DEFAULT_ETHERSCAN_DOMAIN,
65
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia-optimistic`
66
+ },
67
+ [CHAIN_IDS.POLYGON]: {
68
+ domain: "polygonscan.com",
69
+ subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
70
+ },
71
+ [CHAIN_IDS.POLYGON_TESTNET]: {
72
+ domain: "polygonscan.com",
73
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-mumbai`
74
+ },
75
+ [CHAIN_IDS.AVALANCHE]: {
76
+ domain: "snowtrace.io",
77
+ subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
78
+ },
79
+ [CHAIN_IDS.AVALANCHE_TESTNET]: {
80
+ domain: "snowtrace.io",
81
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`
82
+ },
83
+ [CHAIN_IDS.FANTOM]: {
84
+ domain: "ftmscan.com",
85
+ subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX
86
+ },
87
+ [CHAIN_IDS.FANTOM_TESTNET]: {
88
+ domain: "ftmscan.com",
89
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`
90
+ },
91
+ [CHAIN_IDS.MOONBEAM]: {
92
+ domain: "moonscan.io",
93
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbeam`
94
+ },
95
+ [CHAIN_IDS.MOONBEAM_TESTNET]: {
96
+ domain: "moonscan.io",
97
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbase`
98
+ },
99
+ [CHAIN_IDS.MOONRIVER]: {
100
+ domain: "moonscan.io",
101
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonriver`
102
+ },
103
+ [CHAIN_IDS.GNOSIS]: {
104
+ domain: "gnosisscan.io",
105
+ subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-gnosis`
106
+ }
107
+ };
108
+
109
+ export {
110
+ CHAIN_IDS,
111
+ ETHERSCAN_SUPPORTED_NETWORKS
112
+ };
113
+ //# sourceMappingURL=chunk-SHTSUEYM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["// Below constants are intentionally copied from transaction-controller to avoid package dependency\n\nexport const CHAIN_IDS = {\n MAINNET: '0x1',\n GOERLI: '0x5',\n BSC: '0x38',\n BSC_TESTNET: '0x61',\n OPTIMISM: '0xa',\n OPTIMISM_SEPOLIA: '0xaa37dc',\n POLYGON: '0x89',\n POLYGON_TESTNET: '0x13881',\n AVALANCHE: '0xa86a',\n AVALANCHE_TESTNET: '0xa869',\n FANTOM: '0xfa',\n FANTOM_TESTNET: '0xfa2',\n SEPOLIA: '0xaa36a7',\n LINEA_GOERLI: '0xe704',\n LINEA_SEPOLIA: '0xe705',\n LINEA_MAINNET: '0xe708',\n MOONBEAM: '0x504',\n MOONBEAM_TESTNET: '0x507',\n MOONRIVER: '0x505',\n GNOSIS: '0x64',\n} as const;\n\nconst DEFAULT_ETHERSCAN_DOMAIN = 'etherscan.io';\nconst DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = 'api';\n\nexport const ETHERSCAN_SUPPORTED_NETWORKS = {\n [CHAIN_IDS.GOERLI]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`,\n },\n [CHAIN_IDS.MAINNET]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`,\n },\n [CHAIN_IDS.LINEA_GOERLI]: {\n domain: 'lineascan.build',\n subdomain: 'goerli',\n },\n [CHAIN_IDS.LINEA_SEPOLIA]: {\n domain: 'lineascan.build',\n subdomain: 'sepolia',\n },\n [CHAIN_IDS.LINEA_MAINNET]: {\n domain: 'lineascan.build',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC]: {\n domain: 'bscscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC_TESTNET]: {\n domain: 'bscscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.OPTIMISM]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-optimistic`,\n },\n [CHAIN_IDS.OPTIMISM_SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia-optimistic`,\n },\n [CHAIN_IDS.POLYGON]: {\n domain: 'polygonscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.POLYGON_TESTNET]: {\n domain: 'polygonscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-mumbai`,\n },\n [CHAIN_IDS.AVALANCHE]: {\n domain: 'snowtrace.io',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.AVALANCHE_TESTNET]: {\n domain: 'snowtrace.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.FANTOM]: {\n domain: 'ftmscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.FANTOM_TESTNET]: {\n domain: 'ftmscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.MOONBEAM]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbeam`,\n },\n [CHAIN_IDS.MOONBEAM_TESTNET]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbase`,\n },\n [CHAIN_IDS.MOONRIVER]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonriver`,\n },\n [CHAIN_IDS.GNOSIS]: {\n domain: 'gnosisscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-gnosis`,\n },\n};\n"],"mappings":";AAEO,IAAM,YAAY;AAAA,EACvB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,QAAQ;AACV;AAEA,IAAM,2BAA2B;AACjC,IAAM,qCAAqC;AAEpC,IAAM,+BAA+B;AAAA,EAC1C,CAAC,UAAU,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,OAAO,GAAG;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,OAAO,GAAG;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,YAAY,GAAG;AAAA,IACxB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,aAAa,GAAG;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,aAAa,GAAG;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,GAAG,GAAG;AAAA,IACf,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,WAAW,GAAG;AAAA,IACvB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,QAAQ,GAAG;AAAA,IACpB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,gBAAgB,GAAG;AAAA,IAC5B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,OAAO,GAAG;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,eAAe,GAAG;AAAA,IAC3B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,SAAS,GAAG;AAAA,IACrB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,iBAAiB,GAAG;AAAA,IAC7B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,CAAC,UAAU,cAAc,GAAG;AAAA,IAC1B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,QAAQ,GAAG;AAAA,IACpB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,gBAAgB,GAAG;AAAA,IAC5B,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,SAAS,GAAG;AAAA,IACrB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AAAA,EACA,CAAC,UAAU,MAAM,GAAG;AAAA,IAClB,QAAQ;AAAA,IACR,WAAW,GAAG,kCAAkC;AAAA,EAClD;AACF;","names":[]}
@@ -0,0 +1,138 @@
1
+ import {
2
+ ETHERSCAN_SUPPORTED_NETWORKS
3
+ } from "./chunk-SHTSUEYM.mjs";
4
+ import {
5
+ assertIsError,
6
+ handleFetch
7
+ } from "./chunk-DSVOMJX6.mjs";
8
+ import {
9
+ createModuleLogger,
10
+ projectLogger
11
+ } from "./chunk-L244TFFU.mjs";
12
+ import {
13
+ __privateAdd,
14
+ __privateGet,
15
+ __privateMethod,
16
+ __privateSet
17
+ } from "./chunk-XUI43LEZ.mjs";
18
+
19
+ // src/providers/etherscan.ts
20
+ import { Mutex } from "async-mutex";
21
+ var ID = "etherscan";
22
+ var LABEL = "Etherscan (Verified Contract Name)";
23
+ var RATE_LIMIT_UPDATE_DELAY = 5;
24
+ var RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1e3;
25
+ var log = createModuleLogger(projectLogger, "etherscan");
26
+ var _isEnabled, _lastRequestTime, _mutex, _sendRequest, sendRequest_fn, _getUrl, getUrl_fn;
27
+ var EtherscanNameProvider = class {
28
+ constructor({ isEnabled } = {}) {
29
+ __privateAdd(this, _sendRequest);
30
+ __privateAdd(this, _getUrl);
31
+ __privateAdd(this, _isEnabled, void 0);
32
+ __privateAdd(this, _lastRequestTime, 0);
33
+ __privateAdd(this, _mutex, new Mutex());
34
+ __privateSet(this, _isEnabled, isEnabled || (() => true));
35
+ }
36
+ getMetadata() {
37
+ return {
38
+ sourceIds: { ["ethereumAddress" /* ETHEREUM_ADDRESS */]: [ID] },
39
+ sourceLabels: { [ID]: LABEL }
40
+ };
41
+ }
42
+ async getProposedNames(request) {
43
+ if (!__privateGet(this, _isEnabled).call(this)) {
44
+ log("Skipping request as disabled");
45
+ return {
46
+ results: {
47
+ [ID]: {
48
+ proposedNames: []
49
+ }
50
+ }
51
+ };
52
+ }
53
+ const releaseLock = await __privateGet(this, _mutex).acquire();
54
+ try {
55
+ const { value, variation: chainId } = request;
56
+ const time = Date.now();
57
+ const timeSinceLastRequest = time - __privateGet(this, _lastRequestTime);
58
+ if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {
59
+ log("Skipping request to avoid rate limit");
60
+ return {
61
+ results: {
62
+ [ID]: {
63
+ updateDelay: RATE_LIMIT_UPDATE_DELAY
64
+ }
65
+ }
66
+ };
67
+ }
68
+ const url = __privateMethod(this, _getUrl, getUrl_fn).call(this, chainId, {
69
+ module: "contract",
70
+ action: "getsourcecode",
71
+ address: value
72
+ });
73
+ const { responseData, error } = await __privateMethod(this, _sendRequest, sendRequest_fn).call(this, url);
74
+ if (error) {
75
+ log("Request failed", error);
76
+ throw error;
77
+ }
78
+ if (responseData?.message === "NOTOK") {
79
+ log("Request warning", responseData.result);
80
+ return {
81
+ results: {
82
+ [ID]: {
83
+ updateDelay: RATE_LIMIT_UPDATE_DELAY
84
+ }
85
+ }
86
+ };
87
+ }
88
+ const results = responseData?.result ?? [];
89
+ const proposedNames = results.map((result) => result.ContractName);
90
+ log("New proposed names", proposedNames);
91
+ return {
92
+ results: {
93
+ [ID]: {
94
+ proposedNames
95
+ }
96
+ }
97
+ };
98
+ } finally {
99
+ releaseLock();
100
+ }
101
+ }
102
+ };
103
+ _isEnabled = new WeakMap();
104
+ _lastRequestTime = new WeakMap();
105
+ _mutex = new WeakMap();
106
+ _sendRequest = new WeakSet();
107
+ sendRequest_fn = async function(url) {
108
+ try {
109
+ log("Sending request", url);
110
+ const responseData = await handleFetch(
111
+ url
112
+ );
113
+ return { responseData };
114
+ } catch (error) {
115
+ assertIsError(error);
116
+ return { error };
117
+ } finally {
118
+ __privateSet(this, _lastRequestTime, Date.now());
119
+ }
120
+ };
121
+ _getUrl = new WeakSet();
122
+ getUrl_fn = function(chainId, params) {
123
+ const networkInfo = ETHERSCAN_SUPPORTED_NETWORKS[chainId];
124
+ if (!networkInfo) {
125
+ throw new Error(`Etherscan does not support chain with ID: ${chainId}`);
126
+ }
127
+ let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;
128
+ Object.keys(params).forEach((key, index) => {
129
+ const value = params[key];
130
+ url += `${index === 0 ? "?" : "&"}${key}=${value}`;
131
+ });
132
+ return url;
133
+ };
134
+
135
+ export {
136
+ EtherscanNameProvider
137
+ };
138
+ //# sourceMappingURL=chunk-UALYD4SG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/etherscan.ts"],"sourcesContent":["import { Mutex } from 'async-mutex';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { handleFetch, assertIsError } from '../util';\n\nconst ID = 'etherscan';\nconst LABEL = 'Etherscan (Verified Contract Name)';\nconst RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds\nconst RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;\n\nconst log = createModuleLogger(projectLogger, 'etherscan');\n\ntype EtherscanGetSourceCodeResponse = {\n status: '1' | '0';\n message: string;\n result: [\n {\n SourceCode: string;\n ABI: string;\n ContractName: string;\n CompilerVersion: string;\n OptimizationUsed: string;\n Runs: string;\n ConstructorArguments: string;\n Library: string;\n LicenseType: string;\n Proxy: string;\n Implementation: string;\n SwarmSource: string;\n },\n ];\n};\n\nexport class EtherscanNameProvider implements NameProvider {\n #isEnabled: () => boolean;\n\n #lastRequestTime = 0;\n\n #mutex = new Mutex();\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const releaseLock = await this.#mutex.acquire();\n\n try {\n const { value, variation: chainId } = request;\n\n const time = Date.now();\n const timeSinceLastRequest = time - this.#lastRequestTime;\n\n if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {\n log('Skipping request to avoid rate limit');\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const url = this.#getUrl(chainId, {\n module: 'contract',\n action: 'getsourcecode',\n address: value,\n });\n\n const { responseData, error } = await this.#sendRequest(url);\n\n if (error) {\n log('Request failed', error);\n throw error;\n }\n\n if (responseData?.message === 'NOTOK') {\n log('Request warning', responseData.result);\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const results = responseData?.result ?? [];\n const proposedNames = results.map((result) => result.ContractName);\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } finally {\n releaseLock();\n }\n }\n\n async #sendRequest(url: string): Promise<{\n responseData?: EtherscanGetSourceCodeResponse;\n error?: Error;\n }> {\n try {\n log('Sending request', url);\n\n const responseData = (await handleFetch(\n url,\n )) as EtherscanGetSourceCodeResponse;\n\n return { responseData };\n } catch (error) {\n assertIsError(error);\n return { error };\n } finally {\n this.#lastRequestTime = Date.now();\n }\n }\n\n #getUrl(chainId: string, params: Record<string, string | undefined>): string {\n type SupportedChainId = keyof typeof ETHERSCAN_SUPPORTED_NETWORKS;\n\n const networkInfo =\n ETHERSCAN_SUPPORTED_NETWORKS[chainId as SupportedChainId];\n\n if (!networkInfo) {\n throw new Error(`Etherscan does not support chain with ID: ${chainId}`);\n }\n\n let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;\n\n Object.keys(params).forEach((key, index) => {\n const value = params[key];\n url += `${index === 0 ? '?' : '&'}${key}=${value}`;\n });\n\n return url;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,80 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkJHYBLEC5js = require('./chunk-JHYBLEC5.js');
4
+
5
+
6
+
7
+ var _chunkQBR7BSWBjs = require('./chunk-QBR7BSWB.js');
8
+
9
+
10
+
11
+
12
+ var _chunkZ4BLTVTBjs = require('./chunk-Z4BLTVTB.js');
13
+
14
+ // src/providers/lens.ts
15
+ var ID = "lens";
16
+ var LABEL = "Lens Protocol";
17
+ var LENS_URL = `https://api.lens.dev`;
18
+ var QUERY = `
19
+ query HandlesForAddress($address: EthereumAddress!) {
20
+ profiles(request: { ownedBy: [$address] }) {
21
+ items {
22
+ handle
23
+ }
24
+ }
25
+ }`;
26
+ var log = _chunkQBR7BSWBjs.createModuleLogger.call(void 0, _chunkQBR7BSWBjs.projectLogger, "lens");
27
+ var _isEnabled;
28
+ var LensNameProvider = class {
29
+ constructor({ isEnabled } = {}) {
30
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _isEnabled, void 0);
31
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isEnabled, isEnabled || (() => true));
32
+ }
33
+ getMetadata() {
34
+ return {
35
+ sourceIds: { ["ethereumAddress" /* ETHEREUM_ADDRESS */]: [ID] },
36
+ sourceLabels: { [ID]: LABEL }
37
+ };
38
+ }
39
+ async getProposedNames(request) {
40
+ if (!_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isEnabled).call(this)) {
41
+ log("Skipping request as disabled");
42
+ return {
43
+ results: {
44
+ [ID]: {
45
+ proposedNames: []
46
+ }
47
+ }
48
+ };
49
+ }
50
+ const { value } = request;
51
+ const variables = { address: value };
52
+ log("Sending request", { variables });
53
+ try {
54
+ const responseData = await _chunkJHYBLEC5js.graphQL.call(void 0,
55
+ LENS_URL,
56
+ QUERY,
57
+ variables
58
+ );
59
+ const profiles = responseData?.profiles?.items ?? [];
60
+ const proposedNames = profiles.map((profile) => profile.handle);
61
+ log("New proposed names", proposedNames);
62
+ return {
63
+ results: {
64
+ [ID]: {
65
+ proposedNames
66
+ }
67
+ }
68
+ };
69
+ } catch (error) {
70
+ log("Request failed", error);
71
+ throw error;
72
+ }
73
+ }
74
+ };
75
+ _isEnabled = new WeakMap();
76
+
77
+
78
+
79
+ exports.LensNameProvider = LensNameProvider;
80
+ //# sourceMappingURL=chunk-W64QIPGB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/lens.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAUA,IAAM,KAAK;AACX,IAAM,QAAQ;AACd,IAAM,WAAW;AAEjB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASd,IAAM,MAAM,mBAAmB,eAAe,MAAM;AAvBpD;AAmCO,IAAM,mBAAN,MAA+C;AAAA,EAGpD,YAAY,EAAE,UAAU,IAAmC,CAAC,GAAG;AAF/D;AAGE,uBAAK,YAAa,cAAc,MAAM;AAAA,EACxC;AAAA,EAEA,cAAoC;AAClC,WAAO;AAAA,MACL,WAAW,EAAE,yCAA0B,GAAG,CAAC,EAAE,EAAE;AAAA,MAC/C,cAAc,EAAE,CAAC,EAAE,GAAG,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,iBACJ,SAC6B;AAC7B,QAAI,CAAC,mBAAK,YAAL,YAAmB;AACtB,UAAI,8BAA8B;AAElC,aAAO;AAAA,QACL,SAAS;AAAA,UACP,CAAC,EAAE,GAAG;AAAA,YACJ,eAAe,CAAC;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,YAAY,EAAE,SAAS,MAAM;AAEnC,QAAI,mBAAmB,EAAE,UAAU,CAAC;AAEpC,QAAI;AACF,YAAM,eAAe,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,WAAW,cAAc,UAAU,SAAS,CAAC;AACnD,YAAM,gBAAgB,SAAS,IAAI,CAAC,YAAY,QAAQ,MAAM;AAE9D,UAAI,sBAAsB,aAAa;AAEvC,aAAO;AAAA,QACL,SAAS;AAAA,UACP,CAAC,EAAE,GAAG;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,kBAAkB,KAAK;AAC3B,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAzDE","sourcesContent":["import { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { graphQL } from '../util';\n\nconst ID = 'lens';\nconst LABEL = 'Lens Protocol';\nconst LENS_URL = `https://api.lens.dev`;\n\nconst QUERY = `\nquery HandlesForAddress($address: EthereumAddress!) {\n profiles(request: { ownedBy: [$address] }) {\n items {\n handle\n }\n }\n}`;\n\nconst log = createModuleLogger(projectLogger, 'lens');\n\ntype LensResponse = {\n profiles: {\n items: [\n {\n handle: string;\n },\n ];\n };\n};\n\nexport class LensNameProvider implements NameProvider {\n #isEnabled: () => boolean;\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const { value } = request;\n const variables = { address: value };\n\n log('Sending request', { variables });\n\n try {\n const responseData = await graphQL<LensResponse>(\n LENS_URL,\n QUERY,\n variables,\n );\n\n const profiles = responseData?.profiles?.items ?? [];\n const proposedNames = profiles.map((profile) => profile.handle);\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } catch (error) {\n log('Request failed', error);\n throw error;\n }\n }\n}\n"]}