@metamask/name-controller 2.0.0 → 3.0.0

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [3.0.0]
10
+ ### Changed
11
+ - **BREAKING**: Normalize addresses and chain IDs ([#1732](https://github.com/MetaMask/core/pull/1732))
12
+ - Save addresses and chain IDs as lowercase in state
13
+ - Remove `getChainId` constructor callback
14
+ - Require a `variation` property when calling `setName` or `updateProposedNames` with the `ethereumAddress` type
15
+
9
16
  ## [2.0.0]
10
17
  ### Changed
11
18
  - **BREAKING**: Support rate limiting in name providers ([#1715](https://github.com/MetaMask/core/pull/1715))
@@ -25,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
25
32
  ### Added
26
33
  - Initial Release ([#1647](https://github.com/MetaMask/core/pull/1647))
27
34
 
28
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/name-controller@2.0.0...HEAD
35
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/name-controller@3.0.0...HEAD
36
+ [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/name-controller@2.0.0...@metamask/name-controller@3.0.0
29
37
  [2.0.0]: https://github.com/MetaMask/core/compare/@metamask/name-controller@1.0.0...@metamask/name-controller@2.0.0
30
38
  [1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/name-controller@1.0.0
@@ -33,7 +33,6 @@ export declare type NameControllerActions = GetNameState;
33
33
  export declare type NameControllerEvents = NameStateChange;
34
34
  export declare type NameControllerMessenger = RestrictedControllerMessenger<typeof controllerName, NameControllerActions, NameControllerEvents, never, never>;
35
35
  export declare type NameControllerOptions = {
36
- getChainId: () => string;
37
36
  messenger: NameControllerMessenger;
38
37
  providers: NameProvider[];
39
38
  state?: Partial<NameControllerState>;
@@ -44,6 +43,7 @@ export declare type UpdateProposedNamesRequest = {
44
43
  type: NameType;
45
44
  sourceIds?: string[];
46
45
  onlyUpdateAfterDelay?: boolean;
46
+ variation?: string;
47
47
  };
48
48
  export declare type UpdateProposedNamesResult = {
49
49
  results: Record<string, {
@@ -56,6 +56,7 @@ export declare type SetNameRequest = {
56
56
  type: NameType;
57
57
  name: string | null;
58
58
  sourceId?: string;
59
+ variation?: string;
59
60
  };
60
61
  /**
61
62
  * Controller for storing and deriving names for values such as Ethereum addresses.
@@ -66,13 +67,12 @@ export declare class NameController extends BaseControllerV2<typeof controllerNa
66
67
  * Construct a Name controller.
67
68
  *
68
69
  * @param options - Controller options.
69
- * @param options.getChainId - Callback that returns the chain ID of the current network.
70
70
  * @param options.messenger - Restricted controller messenger for the name controller.
71
71
  * @param options.providers - Array of name provider instances to propose names.
72
72
  * @param options.state - Initial state to set on the controller.
73
73
  * @param options.updateDelay - The delay in seconds before a new request to a source should be made.
74
74
  */
75
- constructor({ getChainId, messenger, providers, state, updateDelay, }: NameControllerOptions);
75
+ constructor({ messenger, providers, state, updateDelay, }: NameControllerOptions);
76
76
  /**
77
77
  * Set the user specified name for a value.
78
78
  *
@@ -81,6 +81,7 @@ export declare class NameController extends BaseControllerV2<typeof controllerNa
81
81
  * @param request.sourceId - Optional ID of the source of the proposed name.
82
82
  * @param request.type - Type of value to set the name for.
83
83
  * @param request.value - Value to set the name for.
84
+ * @param request.variation - Variation of the raw value to set the name for. The chain ID if the type is Ethereum address.
84
85
  */
85
86
  setName(request: SetNameRequest): void;
86
87
  /**
@@ -90,6 +91,7 @@ export declare class NameController extends BaseControllerV2<typeof controllerNa
90
91
  * @param request.value - Value to update the proposed names for.
91
92
  * @param request.type - Type of value to update the proposed names for.
92
93
  * @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.
94
+ * @param request.variation - Variation of the raw value to update proposed names for. The chain ID if the type is Ethereum address.
93
95
  * @returns The updated proposed names for the value.
94
96
  */
95
97
  updateProposedNames(request: UpdateProposedNamesRequest): Promise<UpdateProposedNamesResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"NameController.d.ts","sourceRoot":"","sources":["../src/NameController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NameController.d.ts","sourceRoot":"","sources":["../src/NameController.ts"],"names":[],"mappings":"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"}
@@ -19,12 +19,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
19
19
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
20
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
21
  };
22
- var _NameController_instances, _NameController_getChainId, _NameController_providers, _NameController_updateDelay, _NameController_updateProposedNameState, _NameController_updateSourceState, _NameController_getUpdateProposedNamesResult, _NameController_getProviderResponse, _NameController_normalizeProviderResult, _NameController_normalizeProviderSourceResult, _NameController_updateEntry, _NameController_getTypeVariationKey, _NameController_getCurrentTimeSeconds, _NameController_validateSetNameRequest, _NameController_validateUpdateProposedNamesRequest, _NameController_validateValue, _NameController_validateType, _NameController_validateName, _NameController_validateSourceIds, _NameController_validateSourceId, _NameController_validateDuplicateSourceIds, _NameController_getAllSourceIds, _NameController_getSourceIds, _NameController_removeDormantProposedNames;
22
+ var _NameController_instances, _NameController_providers, _NameController_updateDelay, _NameController_updateProposedNameState, _NameController_updateSourceState, _NameController_getUpdateProposedNamesResult, _NameController_getProviderResponse, _NameController_normalizeProviderResult, _NameController_normalizeProviderSourceResult, _NameController_normalizeValue, _NameController_normalizeVariation, _NameController_updateEntry, _NameController_getCurrentTimeSeconds, _NameController_validateSetNameRequest, _NameController_validateUpdateProposedNamesRequest, _NameController_validateValue, _NameController_validateType, _NameController_validateName, _NameController_validateSourceIds, _NameController_validateSourceId, _NameController_validateDuplicateSourceIds, _NameController_validateVariation, _NameController_getAllSourceIds, _NameController_getSourceIds, _NameController_removeDormantProposedNames;
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.NameController = void 0;
25
25
  const base_controller_1 = require("@metamask/base-controller");
26
26
  const types_1 = require("./types");
27
27
  const DEFAULT_UPDATE_DELAY = 60 * 2; // 2 Minutes
28
+ const DEFAULT_VARIATION = '';
28
29
  const controllerName = 'NameController';
29
30
  const stateMetadata = {
30
31
  names: { persist: true, anonymous: false },
@@ -44,13 +45,12 @@ class NameController extends base_controller_1.BaseControllerV2 {
44
45
  * Construct a Name controller.
45
46
  *
46
47
  * @param options - Controller options.
47
- * @param options.getChainId - Callback that returns the chain ID of the current network.
48
48
  * @param options.messenger - Restricted controller messenger for the name controller.
49
49
  * @param options.providers - Array of name provider instances to propose names.
50
50
  * @param options.state - Initial state to set on the controller.
51
51
  * @param options.updateDelay - The delay in seconds before a new request to a source should be made.
52
52
  */
53
- constructor({ getChainId, messenger, providers, state, updateDelay, }) {
53
+ constructor({ messenger, providers, state, updateDelay, }) {
54
54
  super({
55
55
  name: controllerName,
56
56
  metadata: stateMetadata,
@@ -58,10 +58,8 @@ class NameController extends base_controller_1.BaseControllerV2 {
58
58
  state: Object.assign(Object.assign({}, getDefaultState()), state),
59
59
  });
60
60
  _NameController_instances.add(this);
61
- _NameController_getChainId.set(this, void 0);
62
61
  _NameController_providers.set(this, void 0);
63
62
  _NameController_updateDelay.set(this, void 0);
64
- __classPrivateFieldSet(this, _NameController_getChainId, getChainId, "f");
65
63
  __classPrivateFieldSet(this, _NameController_providers, providers, "f");
66
64
  __classPrivateFieldSet(this, _NameController_updateDelay, updateDelay !== null && updateDelay !== void 0 ? updateDelay : DEFAULT_UPDATE_DELAY, "f");
67
65
  }
@@ -73,12 +71,13 @@ class NameController extends base_controller_1.BaseControllerV2 {
73
71
  * @param request.sourceId - Optional ID of the source of the proposed name.
74
72
  * @param request.type - Type of value to set the name for.
75
73
  * @param request.value - Value to set the name for.
74
+ * @param request.variation - Variation of the raw value to set the name for. The chain ID if the type is Ethereum address.
76
75
  */
77
76
  setName(request) {
78
77
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateSetNameRequest).call(this, request);
79
- const { value, type, name, sourceId: requestSourceId } = request;
78
+ const { value, type, name, sourceId: requestSourceId, variation } = request;
80
79
  const sourceId = requestSourceId !== null && requestSourceId !== void 0 ? requestSourceId : null;
81
- __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_updateEntry).call(this, value, type, (entry) => {
80
+ __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_updateEntry).call(this, value, type, variation, (entry) => {
82
81
  entry.name = name;
83
82
  entry.sourceId = sourceId;
84
83
  });
@@ -90,13 +89,13 @@ class NameController extends base_controller_1.BaseControllerV2 {
90
89
  * @param request.value - Value to update the proposed names for.
91
90
  * @param request.type - Type of value to update the proposed names for.
92
91
  * @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.
92
+ * @param request.variation - Variation of the raw value to update proposed names for. The chain ID if the type is Ethereum address.
93
93
  * @returns The updated proposed names for the value.
94
94
  */
95
95
  updateProposedNames(request) {
96
96
  return __awaiter(this, void 0, void 0, function* () {
97
97
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateUpdateProposedNamesRequest).call(this, request);
98
- const chainId = __classPrivateFieldGet(this, _NameController_getChainId, "f").call(this);
99
- const providerResponses = (yield Promise.all(__classPrivateFieldGet(this, _NameController_providers, "f").map((provider) => __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getProviderResponse).call(this, request, chainId, provider)))).filter((response) => Boolean(response));
98
+ const providerResponses = (yield Promise.all(__classPrivateFieldGet(this, _NameController_providers, "f").map((provider) => __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getProviderResponse).call(this, request, provider)))).filter((response) => Boolean(response));
100
99
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_updateProposedNameState).call(this, request, providerResponses);
101
100
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_updateSourceState).call(this, __classPrivateFieldGet(this, _NameController_providers, "f"));
102
101
  return __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getUpdateProposedNamesResult).call(this, providerResponses);
@@ -104,10 +103,10 @@ class NameController extends base_controller_1.BaseControllerV2 {
104
103
  }
105
104
  }
106
105
  exports.NameController = NameController;
107
- _NameController_getChainId = new WeakMap(), _NameController_providers = new WeakMap(), _NameController_updateDelay = new WeakMap(), _NameController_instances = new WeakSet(), _NameController_updateProposedNameState = function _NameController_updateProposedNameState(request, providerResponses) {
108
- const { value, type } = request;
106
+ _NameController_providers = new WeakMap(), _NameController_updateDelay = new WeakMap(), _NameController_instances = new WeakSet(), _NameController_updateProposedNameState = function _NameController_updateProposedNameState(request, providerResponses) {
107
+ const { value, type, variation } = request;
109
108
  const currentTime = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getCurrentTimeSeconds).call(this);
110
- __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_updateEntry).call(this, value, type, (entry) => {
109
+ __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_updateEntry).call(this, value, type, variation, (entry) => {
111
110
  var _a;
112
111
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_removeDormantProposedNames).call(this, entry.proposedNames, type);
113
112
  for (const providerResponse of providerResponses) {
@@ -154,19 +153,21 @@ _NameController_getChainId = new WeakMap(), _NameController_providers = new Weak
154
153
  }
155
154
  return acc;
156
155
  }, { results: {} });
157
- }, _NameController_getProviderResponse = function _NameController_getProviderResponse(request, chainId, provider) {
156
+ }, _NameController_getProviderResponse = function _NameController_getProviderResponse(request, provider) {
158
157
  return __awaiter(this, void 0, void 0, function* () {
159
- const { value, type, sourceIds: requestedSourceIds, onlyUpdateAfterDelay, } = request;
160
- const variationKey = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getTypeVariationKey).call(this, type);
158
+ const { value, type, sourceIds: requestedSourceIds, onlyUpdateAfterDelay, variation, } = request;
159
+ /* istanbul ignore next */
160
+ const variationKey = variation !== null && variation !== void 0 ? variation : DEFAULT_VARIATION;
161
161
  const supportedSourceIds = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getSourceIds).call(this, provider, type);
162
162
  const currentTime = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getCurrentTimeSeconds).call(this);
163
+ const normalizedValue = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_normalizeValue).call(this, value, type);
163
164
  const matchingSourceIds = supportedSourceIds.filter((sourceId) => {
164
165
  var _a, _b, _c, _d, _e, _f, _g;
165
166
  if (requestedSourceIds && !requestedSourceIds.includes(sourceId)) {
166
167
  return false;
167
168
  }
168
169
  if (onlyUpdateAfterDelay) {
169
- const entry = (_c = (_b = (_a = this.state.names[type]) === null || _a === void 0 ? void 0 : _a[value]) === null || _b === void 0 ? void 0 : _b[variationKey]) !== null && _c !== void 0 ? _c : {};
170
+ const entry = (_c = (_b = (_a = this.state.names[type]) === null || _a === void 0 ? void 0 : _a[normalizedValue]) === null || _b === void 0 ? void 0 : _b[variationKey]) !== null && _c !== void 0 ? _c : {};
170
171
  const proposedNamesEntry = (_e = (_d = entry.proposedNames) === null || _d === void 0 ? void 0 : _d[sourceId]) !== null && _e !== void 0 ? _e : {};
171
172
  const lastRequestTime = (_f = proposedNamesEntry.lastRequestTime) !== null && _f !== void 0 ? _f : 0;
172
173
  const updateDelay = (_g = proposedNamesEntry.updateDelay) !== null && _g !== void 0 ? _g : __classPrivateFieldGet(this, _NameController_updateDelay, "f");
@@ -180,10 +181,10 @@ _NameController_getChainId = new WeakMap(), _NameController_providers = new Weak
180
181
  return undefined;
181
182
  }
182
183
  const providerRequest = {
183
- chainId,
184
- value,
184
+ value: __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_normalizeValue).call(this, value, type),
185
185
  type,
186
186
  sourceIds: requestedSourceIds ? matchingSourceIds : undefined,
187
+ variation: __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_normalizeVariation).call(this, variationKey, type),
187
188
  };
188
189
  let responseError;
189
190
  let response;
@@ -218,47 +219,62 @@ _NameController_getChainId = new WeakMap(), _NameController_providers = new Weak
218
219
  error,
219
220
  updateDelay,
220
221
  };
221
- }, _NameController_updateEntry = function _NameController_updateEntry(value, type, callback) {
222
- const variationKey = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_getTypeVariationKey).call(this, type);
222
+ }, _NameController_normalizeValue = function _NameController_normalizeValue(value, type) {
223
+ /* istanbul ignore next */
224
+ switch (type) {
225
+ case types_1.NameType.ETHEREUM_ADDRESS:
226
+ return value.toLowerCase();
227
+ default:
228
+ return value;
229
+ }
230
+ }, _NameController_normalizeVariation = function _NameController_normalizeVariation(variation, type) {
231
+ /* istanbul ignore next */
232
+ switch (type) {
233
+ case types_1.NameType.ETHEREUM_ADDRESS:
234
+ return variation.toLowerCase();
235
+ default:
236
+ return variation;
237
+ }
238
+ }, _NameController_updateEntry = function _NameController_updateEntry(value, type, variation, callback) {
239
+ /* istanbul ignore next */
240
+ const variationKey = variation !== null && variation !== void 0 ? variation : DEFAULT_VARIATION;
241
+ const normalizedValue = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_normalizeValue).call(this, value, type);
242
+ const normalizedVariation = __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_normalizeVariation).call(this, variationKey, type);
223
243
  this.update((state) => {
224
244
  var _a;
225
245
  const typeEntries = state.names[type] || {};
226
246
  state.names[type] = typeEntries;
227
- const variationEntries = typeEntries[value] || {};
228
- typeEntries[value] = variationEntries;
229
- const entry = (_a = variationEntries[variationKey]) !== null && _a !== void 0 ? _a : {
247
+ const variationEntries = typeEntries[normalizedValue] || {};
248
+ typeEntries[normalizedValue] = variationEntries;
249
+ const entry = (_a = variationEntries[normalizedVariation]) !== null && _a !== void 0 ? _a : {
230
250
  proposedNames: {},
231
251
  name: null,
232
252
  sourceId: null,
233
253
  };
234
- variationEntries[variationKey] = entry;
254
+ variationEntries[normalizedVariation] = entry;
235
255
  callback(entry);
236
256
  });
237
- }, _NameController_getTypeVariationKey = function _NameController_getTypeVariationKey(type) {
238
- switch (type) {
239
- default: {
240
- return __classPrivateFieldGet(this, _NameController_getChainId, "f").call(this);
241
- }
242
- }
243
257
  }, _NameController_getCurrentTimeSeconds = function _NameController_getCurrentTimeSeconds() {
244
258
  return Math.round(Date.now() / 1000);
245
259
  }, _NameController_validateSetNameRequest = function _NameController_validateSetNameRequest(request) {
246
- const { name, value, type, sourceId } = request;
260
+ const { name, value, type, sourceId, variation } = request;
247
261
  const errorMessages = [];
248
262
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateValue).call(this, value, errorMessages);
249
263
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateType).call(this, type, errorMessages);
250
264
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateName).call(this, name, errorMessages);
251
265
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateSourceId).call(this, sourceId, type, name, errorMessages);
266
+ __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateVariation).call(this, variation, type, errorMessages);
252
267
  if (errorMessages.length) {
253
268
  throw new Error(errorMessages.join(' '));
254
269
  }
255
270
  }, _NameController_validateUpdateProposedNamesRequest = function _NameController_validateUpdateProposedNamesRequest(request) {
256
- const { value, type, sourceIds } = request;
271
+ const { value, type, sourceIds, variation } = request;
257
272
  const errorMessages = [];
258
273
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateValue).call(this, value, errorMessages);
259
274
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateType).call(this, type, errorMessages);
260
275
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateSourceIds).call(this, sourceIds, type, errorMessages);
261
276
  __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateDuplicateSourceIds).call(this, type, errorMessages);
277
+ __classPrivateFieldGet(this, _NameController_instances, "m", _NameController_validateVariation).call(this, variation, type, errorMessages);
262
278
  if (errorMessages.length) {
263
279
  throw new Error(errorMessages.join(' '));
264
280
  }
@@ -314,6 +330,15 @@ _NameController_getChainId = new WeakMap(), _NameController_providers = new Weak
314
330
  if (duplicateSourceIds.length) {
315
331
  errorMessages.push(`Duplicate source IDs found for type '${type}': ${duplicateSourceIds.join(', ')}`);
316
332
  }
333
+ }, _NameController_validateVariation = function _NameController_validateVariation(variation, type, errorMessages) {
334
+ if (type !== types_1.NameType.ETHEREUM_ADDRESS) {
335
+ return;
336
+ }
337
+ if (!(variation === null || variation === void 0 ? void 0 : variation.length) ||
338
+ typeof variation !== 'string' ||
339
+ !variation.match(/^0x[0-9A-Fa-f]+$/u)) {
340
+ errorMessages.push(`Must specify a chain ID in hexidecimal format for variation when using '${type}' type.`);
341
+ }
317
342
  }, _NameController_getAllSourceIds = function _NameController_getAllSourceIds(type) {
318
343
  return (__classPrivateFieldGet(this, _NameController_providers, "f")
319
344
  /* istanbul ignore next */
@@ -1 +1 @@
1
- {"version":3,"file":"NameController.js","sourceRoot":"","sources":["../src/NameController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport type { Patch } from 'immer';\n\nimport type {\n NameProvider,\n NameProviderRequest,\n NameProviderResult,\n NameProviderSourceResult,\n} from './types';\nimport { NameType } from './types';\n\nconst DEFAULT_UPDATE_DELAY = 60 * 2; // 2 Minutes\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 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 = {\n type: `${typeof controllerName}:getState`;\n handler: () => NameControllerState;\n};\n\nexport type NameStateChange = {\n type: `${typeof controllerName}:stateChange`;\n payload: [NameControllerState, Patch[]];\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 getChainId: () => string;\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};\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};\n\n/**\n * Controller for storing and deriving names for values such as Ethereum addresses.\n */\nexport class NameController extends BaseControllerV2<\n typeof controllerName,\n NameControllerState,\n NameControllerMessenger\n> {\n #getChainId: () => string;\n\n #providers: NameProvider[];\n\n #updateDelay: number;\n\n /**\n * Construct a Name controller.\n *\n * @param options - Controller options.\n * @param options.getChainId - Callback that returns the chain ID of the current network.\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 getChainId,\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.#getChainId = getChainId;\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 */\n setName(request: SetNameRequest) {\n this.#validateSetNameRequest(request);\n\n const { value, type, name, sourceId: requestSourceId } = request;\n const sourceId = requestSourceId ?? null;\n\n this.#updateEntry(value, type, (entry: NameEntry) => {\n entry.name = name;\n entry.sourceId = sourceId;\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 * @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 chainId = this.#getChainId();\n\n const providerResponses = (\n await Promise.all(\n this.#providers.map((provider) =>\n this.#getProviderResponse(request, chainId, provider),\n ),\n )\n ).filter((response) => Boolean(response)) as NameProviderResult[];\n\n this.#updateProposedNameState(request, providerResponses);\n this.#updateSourceState(this.#providers);\n\n return this.#getUpdateProposedNamesResult(providerResponses);\n }\n\n #updateProposedNameState(\n request: UpdateProposedNamesRequest,\n providerResponses: NameProviderResult[],\n ) {\n const { value, type } = request;\n const currentTime = this.#getCurrentTimeSeconds();\n\n this.#updateEntry(value, type, (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 chainId: string,\n provider: NameProvider,\n ): Promise<NameProviderResult | undefined> {\n const {\n value,\n type,\n sourceIds: requestedSourceIds,\n onlyUpdateAfterDelay,\n } = request;\n\n const variationKey = this.#getTypeVariationKey(type);\n const supportedSourceIds = this.#getSourceIds(provider, type);\n const currentTime = this.#getCurrentTimeSeconds();\n\n const matchingSourceIds = supportedSourceIds.filter((sourceId) => {\n if (requestedSourceIds && !requestedSourceIds.includes(sourceId)) {\n return false;\n }\n\n if (onlyUpdateAfterDelay) {\n const entry = this.state.names[type]?.[value]?.[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 chainId,\n value,\n type,\n sourceIds: requestedSourceIds ? matchingSourceIds : undefined,\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 #updateEntry(\n value: string,\n type: NameType,\n callback: (entry: NameEntry) => void,\n ) {\n const variationKey = this.#getTypeVariationKey(type);\n\n this.update((state) => {\n const typeEntries = state.names[type] || {};\n state.names[type] = typeEntries;\n\n const variationEntries = typeEntries[value] || {};\n typeEntries[value] = variationEntries;\n\n const entry = variationEntries[variationKey] ?? {\n proposedNames: {},\n name: null,\n sourceId: null,\n };\n variationEntries[variationKey] = entry;\n\n callback(entry);\n });\n }\n\n #getTypeVariationKey(type: NameType): string {\n switch (type) {\n default: {\n return this.#getChainId();\n }\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 } = 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\n if (errorMessages.length) {\n throw new Error(errorMessages.join(' '));\n }\n }\n\n #validateUpdateProposedNamesRequest(request: UpdateProposedNamesRequest) {\n const { value, type, sourceIds } = 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\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 #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"]}
1
+ {"version":3,"file":"NameController.js","sourceRoot":"","sources":["../src/NameController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport type { Patch } from 'immer';\n\nimport type {\n NameProvider,\n NameProviderRequest,\n NameProviderResult,\n NameProviderSourceResult,\n} from './types';\nimport { NameType } from './types';\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 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 = {\n type: `${typeof controllerName}:getState`;\n handler: () => NameControllerState;\n};\n\nexport type NameStateChange = {\n type: `${typeof controllerName}:stateChange`;\n payload: [NameControllerState, Patch[]];\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};\n\n/**\n * Controller for storing and deriving names for values such as Ethereum addresses.\n */\nexport class NameController extends BaseControllerV2<\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 { value, type, name, sourceId: requestSourceId, variation } = request;\n const sourceId = requestSourceId ?? null;\n\n this.#updateEntry(value, type, variation, (entry: NameEntry) => {\n entry.name = name;\n entry.sourceId = sourceId;\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\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 };\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 } = 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\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 ) {\n errorMessages.push(\n `Must specify a chain ID in hexidecimal format for variation when using '${type}' type.`,\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"]}
@@ -52,7 +52,7 @@ class ENSNameProvider {
52
52
  },
53
53
  };
54
54
  }
55
- const { value, chainId } = request;
55
+ const { value, variation: chainId } = request;
56
56
  log('Invoking callback', { value, chainId });
57
57
  try {
58
58
  const proposedName = yield __classPrivateFieldGet(this, _ENSNameProvider_reverseLookup, "f").call(this, value, chainId);
@@ -1 +1 @@
1
- {"version":3,"file":"ens.js","sourceRoot":"","sources":["../../src/providers/ens.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAA8D;AAO9D,oCAAoC;AAOpC,MAAM,EAAE,GAAG,KAAK,CAAC;AACjB,MAAM,KAAK,GAAG,6BAA6B,CAAC;AAE5C,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,KAAK,CAAC,CAAC;AAErD,MAAa,eAAe;IAK1B,YAAY,EACV,SAAS,EACT,aAAa,GAId;QAVD,6CAA0B;QAE1B,iDAAsC;QASpC,uBAAA,IAAI,8BAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QAC5C,uBAAA,IAAI,kCAAkB,aAAa,MAAA,CAAC;IACtC,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAEK,gBAAgB,CACpB,OAA4B;;YAE5B,IAAI,CAAC,uBAAA,IAAI,kCAAW,MAAf,IAAI,CAAa,EAAE;gBACtB,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAEpC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE;4BACJ,aAAa,EAAE,EAAE;yBAClB;qBACF;iBACF,CAAC;aACH;YAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAEnC,GAAG,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAE7C,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sCAAe,MAAnB,IAAI,EAAgB,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC/D,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzD,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;gBAEzC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE;qBACxB;iBACF,CAAC;aACH;YAAC,OAAO,KAAK,EAAE;gBACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;QACH,CAAC;KAAA;CACF;AA1DD,0CA0DC","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, 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"]}
1
+ {"version":3,"file":"ens.js","sourceRoot":"","sources":["../../src/providers/ens.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAA8D;AAO9D,oCAAoC;AAOpC,MAAM,EAAE,GAAG,KAAK,CAAC;AACjB,MAAM,KAAK,GAAG,6BAA6B,CAAC;AAE5C,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,KAAK,CAAC,CAAC;AAErD,MAAa,eAAe;IAK1B,YAAY,EACV,SAAS,EACT,aAAa,GAId;QAVD,6CAA0B;QAE1B,iDAAsC;QASpC,uBAAA,IAAI,8BAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QAC5C,uBAAA,IAAI,kCAAkB,aAAa,MAAA,CAAC;IACtC,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAEK,gBAAgB,CACpB,OAA4B;;YAE5B,IAAI,CAAC,uBAAA,IAAI,kCAAW,MAAf,IAAI,CAAa,EAAE;gBACtB,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAEpC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE;4BACJ,aAAa,EAAE,EAAE;yBAClB;qBACF;iBACF,CAAC;aACH;YAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAE9C,GAAG,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAE7C,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sCAAe,MAAnB,IAAI,EAAgB,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC/D,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzD,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;gBAEzC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE;qBACxB;iBACF,CAAC;aACH;YAAC,OAAO,KAAK,EAAE;gBACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;QACH,CAAC;KAAA;CACF;AA1DD,0CA0DC","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"]}
@@ -61,7 +61,7 @@ class EtherscanNameProvider {
61
61
  }
62
62
  const releaseLock = yield __classPrivateFieldGet(this, _EtherscanNameProvider_mutex, "f").acquire();
63
63
  try {
64
- const { value, chainId } = request;
64
+ const { value, variation: chainId } = request;
65
65
  const time = Date.now();
66
66
  const timeSinceLastRequest = time - __classPrivateFieldGet(this, _EtherscanNameProvider_lastRequestTime, "f");
67
67
  if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {
@@ -1 +1 @@
1
- {"version":3,"file":"etherscan.js","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"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","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, 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"]}
1
+ {"version":3,"file":"etherscan.js","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"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","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"]}
@@ -51,7 +51,7 @@ class TokenNameProvider {
51
51
  },
52
52
  };
53
53
  }
54
- const { value, chainId } = request;
54
+ const { value, variation: chainId } = request;
55
55
  const url = `https://token-api.metaswap.codefi.network/token/${chainId}?address=${value}`;
56
56
  log('Sending request', url);
57
57
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/providers/token.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAA8D;AAO9D,oCAAoC;AACpC,kCAAsC;AAEtC,MAAM,EAAE,GAAG,OAAO,CAAC;AACnB,MAAM,KAAK,GAAG,yBAAyB,CAAC;AAExC,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,OAAO,CAAC,CAAC;AAEvD,MAAa,iBAAiB;IAG5B,YAAY,EAAE,SAAS,KAAoC,EAAE;QAF7D,+CAA0B;QAGxB,uBAAA,IAAI,gCAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;IAC9C,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAEK,gBAAgB,CACpB,OAA4B;;YAE5B,IAAI,CAAC,uBAAA,IAAI,oCAAW,MAAf,IAAI,CAAa,EAAE;gBACtB,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAEpC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE;4BACJ,aAAa,EAAE,EAAE;yBAClB;qBACF;iBACF,CAAC;aACH;YAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YACnC,MAAM,GAAG,GAAG,mDAAmD,OAAO,YAAY,KAAK,EAAE,CAAC;YAE1F,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YAE5B,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAW,EAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;gBACvC,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzD,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;gBAEzC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE;4BACJ,aAAa;yBACd;qBACF;iBACF,CAAC;aACH;YAAC,OAAO,KAAK,EAAE;gBACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;QACH,CAAC;KAAA;CACF;AArDD,8CAqDC","sourcesContent":["import { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { handleFetch } from '../util';\n\nconst ID = 'token';\nconst LABEL = 'Blockchain (Token Name)';\n\nconst log = createModuleLogger(projectLogger, 'token');\n\nexport class TokenNameProvider 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, chainId } = request;\n const url = `https://token-api.metaswap.codefi.network/token/${chainId}?address=${value}`;\n\n log('Sending request', url);\n\n try {\n const responseData = await handleFetch(url);\n const proposedName = responseData.name;\n const proposedNames = proposedName ? [proposedName] : [];\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"]}
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/providers/token.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAA8D;AAO9D,oCAAoC;AACpC,kCAAsC;AAEtC,MAAM,EAAE,GAAG,OAAO,CAAC;AACnB,MAAM,KAAK,GAAG,yBAAyB,CAAC;AAExC,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,OAAO,CAAC,CAAC;AAEvD,MAAa,iBAAiB;IAG5B,YAAY,EAAE,SAAS,KAAoC,EAAE;QAF7D,+CAA0B;QAGxB,uBAAA,IAAI,gCAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;IAC9C,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAEK,gBAAgB,CACpB,OAA4B;;YAE5B,IAAI,CAAC,uBAAA,IAAI,oCAAW,MAAf,IAAI,CAAa,EAAE;gBACtB,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAEpC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE;4BACJ,aAAa,EAAE,EAAE;yBAClB;qBACF;iBACF,CAAC;aACH;YAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC9C,MAAM,GAAG,GAAG,mDAAmD,OAAO,YAAY,KAAK,EAAE,CAAC;YAE1F,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YAE5B,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAW,EAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;gBACvC,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzD,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;gBAEzC,OAAO;oBACL,OAAO,EAAE;wBACP,CAAC,EAAE,CAAC,EAAE;4BACJ,aAAa;yBACd;qBACF;iBACF,CAAC;aACH;YAAC,OAAO,KAAK,EAAE;gBACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;QACH,CAAC;KAAA;CACF;AArDD,8CAqDC","sourcesContent":["import { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { handleFetch } from '../util';\n\nconst ID = 'token';\nconst LABEL = 'Blockchain (Token Name)';\n\nconst log = createModuleLogger(projectLogger, 'token');\n\nexport class TokenNameProvider 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, variation: chainId } = request;\n const url = `https://token-api.metaswap.codefi.network/token/${chainId}?address=${value}`;\n\n log('Sending request', url);\n\n try {\n const responseData = await handleFetch(url);\n const proposedName = responseData.name;\n const proposedNames = proposedName ? [proposedName] : [];\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"]}
package/dist/types.d.ts CHANGED
@@ -18,14 +18,17 @@ export declare type NameProviderMetadata = {
18
18
  };
19
19
  /** The request data to get proposed names from a name provider. */
20
20
  export declare type NameProviderRequest = {
21
- /** The current chain ID of the client. */
22
- chainId: string;
23
21
  /** The optional list of source IDs to get proposed names from. */
24
22
  sourceIds?: string[];
25
23
  /** The type of name being requested. */
26
24
  type: NameType;
27
25
  /** The raw value to get proposed names for. */
28
26
  value: string;
27
+ /**
28
+ * The variation of the raw value to get proposed names for.
29
+ * For example, the chain ID if the raw value is an Ethereum address.
30
+ */
31
+ variation: string;
29
32
  };
30
33
  /** The resulting data after requesting proposed names from a name provider, for a single source. */
31
34
  export declare type NameProviderSourceResult = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,oBAAY,QAAQ;IAClB,0CAA0C;IAC1C,gBAAgB,oBAAoB;CACrC;AAED,wCAAwC;AACxC,oBAAY,oBAAoB,GAAG;IACjC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtC;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,mEAAmE;AACnE,oBAAY,mBAAmB,GAAG;IAChC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAEhB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,wCAAwC;IACxC,IAAI,EAAE,QAAQ,CAAC;IAEf,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oGAAoG;AACpG,oBAAY,wBAAwB,GAAG;IACrC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,+EAA+E;AAC/E,oBAAY,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAElD;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qFAAqF;AACrF,oBAAY,YAAY,GAAG;IACzB;;OAEG;IACH,WAAW,IAAI,oBAAoB,CAAC;IAEpC;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC7E,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,oBAAY,QAAQ;IAClB,0CAA0C;IAC1C,gBAAgB,oBAAoB;CACrC;AAED,wCAAwC;AACxC,oBAAY,oBAAoB,GAAG;IACjC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtC;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,mEAAmE;AACnE,oBAAY,mBAAmB,GAAG;IAChC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,wCAAwC;IACxC,IAAI,EAAE,QAAQ,CAAC;IAEf,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oGAAoG;AACpG,oBAAY,wBAAwB,GAAG;IACrC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,+EAA+E;AAC/E,oBAAY,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAElD;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qFAAqF;AACrF,oBAAY,YAAY,GAAG;IACzB;;OAEG;IACH,WAAW,IAAI,oBAAoB,CAAC;IAEpC;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC7E,CAAC"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,sDAAsD;AACtD,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,0CAA0C;IAC1C,gDAAoC,CAAA;AACtC,CAAC,EAHW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAGnB","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 current chain ID of the client. */\n chainId: string;\n\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 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"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,sDAAsD;AACtD,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,0CAA0C;IAC1C,gDAAoC,CAAA;AACtC,CAAC,EAHW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAGnB","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/name-controller",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "description": "Stores and suggests names for values such as Ethereum addresses",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -26,6 +26,7 @@
26
26
  "prepare-manifest:preview": "../../scripts/prepare-preview-manifest.sh",
27
27
  "publish:preview": "yarn npm publish --tag preview",
28
28
  "test": "jest",
29
+ "test:clean": "jest --clearCache",
29
30
  "test:watch": "jest --watch"
30
31
  },
31
32
  "dependencies": {