@metamask/ens-controller 1.0.2 → 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,15 @@ 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:** Convert the ENS controller to the BaseController v2 API ([#1134](https://github.com/MetaMask/core/pull/1134))
12
+
13
+ ## [2.0.0]
14
+ ### Removed
15
+ - **BREAKING:** Remove `isomorphic-fetch` ([#1106](https://github.com/MetaMask/controllers/pull/1106))
16
+ - Consumers must now import `isomorphic-fetch` or another polyfill themselves if they are running in an environment without `fetch`
17
+
9
18
  ## [1.0.2]
10
19
  ### Changed
11
20
  - Rename this repository to `core` ([#1031](https://github.com/MetaMask/controllers/pull/1031))
@@ -24,7 +33,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
24
33
 
25
34
  All changes listed after this point were applied to this package following the monorepo conversion.
26
35
 
27
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@1.0.2...HEAD
36
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@3.0.0...HEAD
37
+ [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@2.0.0...@metamask/ens-controller@3.0.0
38
+ [2.0.0]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@1.0.2...@metamask/ens-controller@2.0.0
28
39
  [1.0.2]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@1.0.1...@metamask/ens-controller@1.0.2
29
40
  [1.0.1]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@1.0.0...@metamask/ens-controller@1.0.1
30
41
  [1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/ens-controller@1.0.0
@@ -1,4 +1,5 @@
1
- import { BaseController, BaseConfig, BaseState } from '@metamask/base-controller';
1
+ import { BaseControllerV2, RestrictedControllerMessenger } from '@metamask/base-controller';
2
+ declare const name = "EnsController";
2
3
  /**
3
4
  * @type EnsEntry
4
5
  *
@@ -7,40 +8,41 @@ import { BaseController, BaseConfig, BaseState } from '@metamask/base-controller
7
8
  * @property ensName - The ENS name
8
9
  * @property address - Hex address with the ENS name, or null
9
10
  */
10
- export interface EnsEntry {
11
+ export declare type EnsEntry = {
11
12
  chainId: string;
12
13
  ensName: string;
13
14
  address: string | null;
14
- }
15
+ };
15
16
  /**
16
- * @type EnsState
17
+ * @type EnsControllerState
17
18
  *
18
19
  * ENS controller state
19
20
  * @property ensEntries - Object of ENS entry objects
20
21
  */
21
- export interface EnsState extends BaseState {
22
+ export declare type EnsControllerState = {
22
23
  ensEntries: {
23
24
  [chainId: string]: {
24
25
  [ensName: string]: EnsEntry;
25
26
  };
26
27
  };
27
- }
28
+ };
29
+ export declare type EnsControllerMessenger = RestrictedControllerMessenger<typeof name, never, never, never, never>;
28
30
  /**
29
31
  * Controller that manages a list ENS names and their resolved addresses
30
32
  * by chainId. A null address indicates an unresolved ENS name.
31
33
  */
32
- export declare class EnsController extends BaseController<BaseConfig, EnsState> {
33
- /**
34
- * Name of this controller used during composition
35
- */
36
- name: string;
34
+ export declare class EnsController extends BaseControllerV2<typeof name, EnsControllerState, EnsControllerMessenger> {
37
35
  /**
38
36
  * Creates an EnsController instance.
39
37
  *
40
- * @param config - Initial options used to configure this controller.
41
- * @param state - Initial state to set on this controller.
38
+ * @param options - Constructor options.
39
+ * @param options.messenger - A reference to the messaging system.
40
+ * @param options.state - Initial state to set on this controller.
42
41
  */
43
- constructor(config?: Partial<BaseConfig>, state?: Partial<EnsState>);
42
+ constructor({ messenger, state, }: {
43
+ messenger: EnsControllerMessenger;
44
+ state?: Partial<EnsControllerState>;
45
+ });
44
46
  /**
45
47
  * Remove all chain Ids and ENS entries from state.
46
48
  */
@@ -3,31 +3,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EnsController = void 0;
4
4
  const base_controller_1 = require("@metamask/base-controller");
5
5
  const controller_utils_1 = require("@metamask/controller-utils");
6
+ const name = 'EnsController';
7
+ const metadata = {
8
+ ensEntries: { persist: true, anonymous: false },
9
+ };
10
+ const defaultState = {
11
+ ensEntries: {},
12
+ };
6
13
  /**
7
14
  * Controller that manages a list ENS names and their resolved addresses
8
15
  * by chainId. A null address indicates an unresolved ENS name.
9
16
  */
10
- class EnsController extends base_controller_1.BaseController {
17
+ class EnsController extends base_controller_1.BaseControllerV2 {
11
18
  /**
12
19
  * Creates an EnsController instance.
13
20
  *
14
- * @param config - Initial options used to configure this controller.
15
- * @param state - Initial state to set on this controller.
21
+ * @param options - Constructor options.
22
+ * @param options.messenger - A reference to the messaging system.
23
+ * @param options.state - Initial state to set on this controller.
16
24
  */
17
- constructor(config, state) {
18
- super(config, state);
19
- /**
20
- * Name of this controller used during composition
21
- */
22
- this.name = 'EnsController';
23
- this.defaultState = { ensEntries: {} };
24
- this.initialize();
25
+ constructor({ messenger, state, }) {
26
+ super({
27
+ name,
28
+ metadata,
29
+ messenger,
30
+ state: Object.assign(Object.assign({}, defaultState), state),
31
+ });
25
32
  }
26
33
  /**
27
34
  * Remove all chain Ids and ENS entries from state.
28
35
  */
29
36
  clear() {
30
- this.update({ ensEntries: {} });
37
+ this.update((state) => {
38
+ state.ensEntries = {};
39
+ });
31
40
  }
32
41
  /**
33
42
  * Delete an ENS entry.
@@ -43,12 +52,12 @@ class EnsController extends base_controller_1.BaseController {
43
52
  !this.state.ensEntries[chainId][normalizedEnsName]) {
44
53
  return false;
45
54
  }
46
- const ensEntries = Object.assign({}, this.state.ensEntries);
47
- delete ensEntries[chainId][normalizedEnsName];
48
- if (Object.keys(ensEntries[chainId]).length === 0) {
49
- delete ensEntries[chainId];
50
- }
51
- this.update({ ensEntries });
55
+ this.update((state) => {
56
+ delete state.ensEntries[chainId][normalizedEnsName];
57
+ if (Object.keys(state.ensEntries[chainId]).length === 0) {
58
+ delete state.ensEntries[chainId];
59
+ }
60
+ });
52
61
  return true;
53
62
  }
54
63
  /**
@@ -93,12 +102,12 @@ class EnsController extends base_controller_1.BaseController {
93
102
  subState[normalizedEnsName].address === normalizedAddress) {
94
103
  return false;
95
104
  }
96
- this.update({
97
- ensEntries: Object.assign(Object.assign({}, this.state.ensEntries), { [chainId]: Object.assign(Object.assign({}, this.state.ensEntries[chainId]), { [normalizedEnsName]: {
105
+ this.update((state) => {
106
+ state.ensEntries = Object.assign(Object.assign({}, this.state.ensEntries), { [chainId]: Object.assign(Object.assign({}, this.state.ensEntries[chainId]), { [normalizedEnsName]: {
98
107
  address: normalizedAddress,
99
108
  chainId,
100
109
  ensName: normalizedEnsName,
101
- } }) }),
110
+ } }) });
102
111
  });
103
112
  return true;
104
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EnsController.js","sourceRoot":"","sources":["../src/EnsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseController,\n BaseConfig,\n BaseState,\n} from '@metamask/base-controller';\nimport {\n normalizeEnsName,\n isValidHexAddress,\n toChecksumHexAddress,\n} from '@metamask/controller-utils';\n\n/**\n * @type EnsEntry\n *\n * ENS entry representation\n * @property chainId - Id of the associated chain\n * @property ensName - The ENS name\n * @property address - Hex address with the ENS name, or null\n */\nexport interface EnsEntry {\n chainId: string;\n ensName: string;\n address: string | null;\n}\n\n/**\n * @type EnsState\n *\n * ENS controller state\n * @property ensEntries - Object of ENS entry objects\n */\nexport interface EnsState extends BaseState {\n ensEntries: { [chainId: string]: { [ensName: string]: EnsEntry } };\n}\n\n/**\n * Controller that manages a list ENS names and their resolved addresses\n * by chainId. A null address indicates an unresolved ENS name.\n */\nexport class EnsController extends BaseController<BaseConfig, EnsState> {\n /**\n * Name of this controller used during composition\n */\n override name = 'EnsController';\n\n /**\n * Creates an EnsController instance.\n *\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(config?: Partial<BaseConfig>, state?: Partial<EnsState>) {\n super(config, state);\n\n this.defaultState = { ensEntries: {} };\n\n this.initialize();\n }\n\n /**\n * Remove all chain Ids and ENS entries from state.\n */\n clear() {\n this.update({ ensEntries: {} });\n }\n\n /**\n * Delete an ENS entry.\n *\n * @param chainId - Parent chain of the ENS entry to delete.\n * @param ensName - Name of the ENS entry to delete.\n * @returns Boolean indicating if the entry was deleted.\n */\n delete(chainId: string, ensName: string): boolean {\n const normalizedEnsName = normalizeEnsName(ensName);\n if (\n !normalizedEnsName ||\n !this.state.ensEntries[chainId] ||\n !this.state.ensEntries[chainId][normalizedEnsName]\n ) {\n return false;\n }\n\n const ensEntries = Object.assign({}, this.state.ensEntries);\n delete ensEntries[chainId][normalizedEnsName];\n\n if (Object.keys(ensEntries[chainId]).length === 0) {\n delete ensEntries[chainId];\n }\n\n this.update({ ensEntries });\n return true;\n }\n\n /**\n * Retrieve a DNS entry.\n *\n * @param chainId - Parent chain of the ENS entry to retrieve.\n * @param ensName - Name of the ENS entry to retrieve.\n * @returns The EnsEntry or null if it does not exist.\n */\n get(chainId: string, ensName: string): EnsEntry | null {\n const normalizedEnsName = normalizeEnsName(ensName);\n\n // TODO Explicitly handle the case where `normalizedEnsName` is `null`\n // eslint-disable-next-line no-implicit-coercion\n return !!normalizedEnsName && this.state.ensEntries[chainId]\n ? this.state.ensEntries[chainId][normalizedEnsName] || null\n : null;\n }\n\n /**\n * Add or update an ENS entry by chainId and ensName.\n *\n * A null address indicates that the ENS name does not resolve.\n *\n * @param chainId - Id of the associated chain.\n * @param ensName - The ENS name.\n * @param address - Associated address (or null) to add or update.\n * @returns Boolean indicating if the entry was set.\n */\n set(chainId: string, ensName: string, address: string | null): boolean {\n if (\n !Number.isInteger(Number.parseInt(chainId, 10)) ||\n !ensName ||\n typeof ensName !== 'string' ||\n (address && !isValidHexAddress(address))\n ) {\n throw new Error(\n `Invalid ENS entry: { chainId:${chainId}, ensName:${ensName}, address:${address}}`,\n );\n }\n\n const normalizedEnsName = normalizeEnsName(ensName);\n if (!normalizedEnsName) {\n throw new Error(`Invalid ENS name: ${ensName}`);\n }\n\n const normalizedAddress = address ? toChecksumHexAddress(address) : null;\n const subState = this.state.ensEntries[chainId];\n\n if (\n subState?.[normalizedEnsName] &&\n subState[normalizedEnsName].address === normalizedAddress\n ) {\n return false;\n }\n\n this.update({\n ensEntries: {\n ...this.state.ensEntries,\n [chainId]: {\n ...this.state.ensEntries[chainId],\n [normalizedEnsName]: {\n address: normalizedAddress,\n chainId,\n ensName: normalizedEnsName,\n },\n },\n },\n });\n return true;\n }\n}\n\nexport default EnsController;\n"]}
1
+ {"version":3,"file":"EnsController.js","sourceRoot":"","sources":["../src/EnsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseControllerV2,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport {\n normalizeEnsName,\n isValidHexAddress,\n toChecksumHexAddress,\n} from '@metamask/controller-utils';\n\nconst name = 'EnsController';\n\n/**\n * @type EnsEntry\n *\n * ENS entry representation\n * @property chainId - Id of the associated chain\n * @property ensName - The ENS name\n * @property address - Hex address with the ENS name, or null\n */\nexport type EnsEntry = {\n chainId: string;\n ensName: string;\n address: string | null;\n};\n\n/**\n * @type EnsControllerState\n *\n * ENS controller state\n * @property ensEntries - Object of ENS entry objects\n */\nexport type EnsControllerState = {\n ensEntries: {\n [chainId: string]: {\n [ensName: string]: EnsEntry;\n };\n };\n};\n\nexport type EnsControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n never,\n never,\n never,\n never\n>;\n\nconst metadata = {\n ensEntries: { persist: true, anonymous: false },\n};\n\nconst defaultState = {\n ensEntries: {},\n};\n\n/**\n * Controller that manages a list ENS names and their resolved addresses\n * by chainId. A null address indicates an unresolved ENS name.\n */\nexport class EnsController extends BaseControllerV2<\n typeof name,\n EnsControllerState,\n EnsControllerMessenger\n> {\n /**\n * Creates an EnsController instance.\n *\n * @param options - Constructor options.\n * @param options.messenger - A reference to the messaging system.\n * @param options.state - Initial state to set on this controller.\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: EnsControllerMessenger;\n state?: Partial<EnsControllerState>;\n }) {\n super({\n name,\n metadata,\n messenger,\n state: {\n ...defaultState,\n ...state,\n },\n });\n }\n\n /**\n * Remove all chain Ids and ENS entries from state.\n */\n clear() {\n this.update((state) => {\n state.ensEntries = {};\n });\n }\n\n /**\n * Delete an ENS entry.\n *\n * @param chainId - Parent chain of the ENS entry to delete.\n * @param ensName - Name of the ENS entry to delete.\n * @returns Boolean indicating if the entry was deleted.\n */\n delete(chainId: string, ensName: string): boolean {\n const normalizedEnsName = normalizeEnsName(ensName);\n if (\n !normalizedEnsName ||\n !this.state.ensEntries[chainId] ||\n !this.state.ensEntries[chainId][normalizedEnsName]\n ) {\n return false;\n }\n\n this.update((state) => {\n delete state.ensEntries[chainId][normalizedEnsName];\n\n if (Object.keys(state.ensEntries[chainId]).length === 0) {\n delete state.ensEntries[chainId];\n }\n });\n return true;\n }\n\n /**\n * Retrieve a DNS entry.\n *\n * @param chainId - Parent chain of the ENS entry to retrieve.\n * @param ensName - Name of the ENS entry to retrieve.\n * @returns The EnsEntry or null if it does not exist.\n */\n get(chainId: string, ensName: string): EnsEntry | null {\n const normalizedEnsName = normalizeEnsName(ensName);\n\n // TODO Explicitly handle the case where `normalizedEnsName` is `null`\n // eslint-disable-next-line no-implicit-coercion\n return !!normalizedEnsName && this.state.ensEntries[chainId]\n ? this.state.ensEntries[chainId][normalizedEnsName] || null\n : null;\n }\n\n /**\n * Add or update an ENS entry by chainId and ensName.\n *\n * A null address indicates that the ENS name does not resolve.\n *\n * @param chainId - Id of the associated chain.\n * @param ensName - The ENS name.\n * @param address - Associated address (or null) to add or update.\n * @returns Boolean indicating if the entry was set.\n */\n set(chainId: string, ensName: string, address: string | null): boolean {\n if (\n !Number.isInteger(Number.parseInt(chainId, 10)) ||\n !ensName ||\n typeof ensName !== 'string' ||\n (address && !isValidHexAddress(address))\n ) {\n throw new Error(\n `Invalid ENS entry: { chainId:${chainId}, ensName:${ensName}, address:${address}}`,\n );\n }\n\n const normalizedEnsName = normalizeEnsName(ensName);\n if (!normalizedEnsName) {\n throw new Error(`Invalid ENS name: ${ensName}`);\n }\n\n const normalizedAddress = address ? toChecksumHexAddress(address) : null;\n const subState = this.state.ensEntries[chainId];\n\n if (\n subState?.[normalizedEnsName] &&\n subState[normalizedEnsName].address === normalizedAddress\n ) {\n return false;\n }\n\n this.update((state) => {\n state.ensEntries = {\n ...this.state.ensEntries,\n [chainId]: {\n ...this.state.ensEntries[chainId],\n [normalizedEnsName]: {\n address: normalizedAddress,\n chainId,\n ensName: normalizedEnsName,\n },\n },\n };\n });\n return true;\n }\n}\n\nexport default EnsController;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/ens-controller",
3
- "version": "1.0.2",
3
+ "version": "3.0.0",
4
4
  "description": "Maps ENS names to their resolved addresses by chain id",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -29,8 +29,8 @@
29
29
  "test:watch": "jest --watch"
30
30
  },
31
31
  "dependencies": {
32
- "@metamask/base-controller": "^1.1.2",
33
- "@metamask/controller-utils": "^2.0.0"
32
+ "@metamask/base-controller": "^2.0.0",
33
+ "@metamask/controller-utils": "^3.1.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@metamask/auto-changelog": "^3.1.0",