@metamask/ens-controller 3.0.0 → 4.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 +21 -2
- package/dist/EnsController.d.ts +30 -6
- package/dist/EnsController.d.ts.map +1 -0
- package/dist/EnsController.js +127 -1
- package/dist/EnsController.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/package.json +15 -7
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [4.0.0]
|
|
10
|
+
### Changed
|
|
11
|
+
- **BREAKING:** Bump to Node 16 ([#1262](https://github.com/MetaMask/core/pull/1262))
|
|
12
|
+
- **BREAKING:** Add `@metamask/network-controller` as a dependency and peer dependency ([#1367](https://github.com/MetaMask/core/pull/1367), [#1362](https://github.com/MetaMask/core/pull/1362))
|
|
13
|
+
- **BREAKING:** The `ensEntries` state property is now keyed by `Hex` chain ID rather than `string`, and the `chainId` property of each ENS entry is also `Hex` rather than `string`. ([#1367](https://github.com/MetaMask/core/pull/1367))
|
|
14
|
+
- This requires a state migration
|
|
15
|
+
- **BREAKING:** The methods `get`, `set`, and `delete` have been updated to accept and return chain IDs as 0x-prefixed hex strings, rather than decimal strings. ([#1367](https://github.com/MetaMask/core/pull/1367))
|
|
16
|
+
- Bump @metamask/utils from 5.0.1 to 5.0.2 ([#1271](https://github.com/MetaMask/core/pull/1271))
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- Fix ENS controller failure to initialize after switching networks ([#1362](https://github.com/MetaMask/core/pull/1362))
|
|
20
|
+
|
|
21
|
+
## [3.1.0]
|
|
22
|
+
### Changed
|
|
23
|
+
- Add support for reverse ENS address resolution ([#1170](https://github.com/MetaMask/core/pull/1170))
|
|
24
|
+
- This controller can now resolve a network address to an ENS address. This feature was ported from the extension ENS controller.
|
|
25
|
+
|
|
9
26
|
## [3.0.0]
|
|
10
27
|
### Changed
|
|
11
28
|
- **BREAKING:** Convert the ENS controller to the BaseController v2 API ([#1134](https://github.com/MetaMask/core/pull/1134))
|
|
@@ -18,7 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
18
35
|
## [1.0.2]
|
|
19
36
|
### Changed
|
|
20
37
|
- Rename this repository to `core` ([#1031](https://github.com/MetaMask/controllers/pull/1031))
|
|
21
|
-
- Update `@metamask/controller-utils` package ([#1041](https://github.com/MetaMask/controllers/pull/1041))
|
|
38
|
+
- Update `@metamask/controller-utils` package ([#1041](https://github.com/MetaMask/controllers/pull/1041))
|
|
22
39
|
|
|
23
40
|
## [1.0.1]
|
|
24
41
|
### Changed
|
|
@@ -33,7 +50,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
33
50
|
|
|
34
51
|
All changes listed after this point were applied to this package following the monorepo conversion.
|
|
35
52
|
|
|
36
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@
|
|
53
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@4.0.0...HEAD
|
|
54
|
+
[4.0.0]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@3.1.0...@metamask/ens-controller@4.0.0
|
|
55
|
+
[3.1.0]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@3.0.0...@metamask/ens-controller@3.1.0
|
|
37
56
|
[3.0.0]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@2.0.0...@metamask/ens-controller@3.0.0
|
|
38
57
|
[2.0.0]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@1.0.2...@metamask/ens-controller@2.0.0
|
|
39
58
|
[1.0.2]: https://github.com/MetaMask/core/compare/@metamask/ens-controller@1.0.1...@metamask/ens-controller@1.0.2
|
package/dist/EnsController.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { BaseControllerV2, RestrictedControllerMessenger } from '@metamask/base-controller';
|
|
2
|
+
import { ExternalProvider, JsonRpcFetchFunc } from '@ethersproject/providers';
|
|
3
|
+
import { Hex } from '@metamask/utils';
|
|
4
|
+
import type { NetworkState } from '@metamask/network-controller';
|
|
2
5
|
declare const name = "EnsController";
|
|
3
6
|
/**
|
|
4
7
|
* @type EnsEntry
|
|
@@ -9,7 +12,7 @@ declare const name = "EnsController";
|
|
|
9
12
|
* @property address - Hex address with the ENS name, or null
|
|
10
13
|
*/
|
|
11
14
|
export declare type EnsEntry = {
|
|
12
|
-
chainId:
|
|
15
|
+
chainId: Hex;
|
|
13
16
|
ensName: string;
|
|
14
17
|
address: string | null;
|
|
15
18
|
};
|
|
@@ -21,10 +24,13 @@ export declare type EnsEntry = {
|
|
|
21
24
|
*/
|
|
22
25
|
export declare type EnsControllerState = {
|
|
23
26
|
ensEntries: {
|
|
24
|
-
[chainId:
|
|
27
|
+
[chainId: Hex]: {
|
|
25
28
|
[ensName: string]: EnsEntry;
|
|
26
29
|
};
|
|
27
30
|
};
|
|
31
|
+
ensResolutionsByAddress: {
|
|
32
|
+
[key: string]: string;
|
|
33
|
+
};
|
|
28
34
|
};
|
|
29
35
|
export declare type EnsControllerMessenger = RestrictedControllerMessenger<typeof name, never, never, never, never>;
|
|
30
36
|
/**
|
|
@@ -32,17 +38,27 @@ export declare type EnsControllerMessenger = RestrictedControllerMessenger<typeo
|
|
|
32
38
|
* by chainId. A null address indicates an unresolved ENS name.
|
|
33
39
|
*/
|
|
34
40
|
export declare class EnsController extends BaseControllerV2<typeof name, EnsControllerState, EnsControllerMessenger> {
|
|
41
|
+
#private;
|
|
35
42
|
/**
|
|
36
43
|
* Creates an EnsController instance.
|
|
37
44
|
*
|
|
38
45
|
* @param options - Constructor options.
|
|
39
46
|
* @param options.messenger - A reference to the messaging system.
|
|
40
47
|
* @param options.state - Initial state to set on this controller.
|
|
48
|
+
* @param options.provider - Provider instance.
|
|
49
|
+
* @param options.onNetworkStateChange - Allows registering an event handler for
|
|
50
|
+
* when the network controller state updated.
|
|
41
51
|
*/
|
|
42
|
-
constructor({ messenger, state, }: {
|
|
52
|
+
constructor({ messenger, state, provider, onNetworkStateChange, }: {
|
|
43
53
|
messenger: EnsControllerMessenger;
|
|
44
54
|
state?: Partial<EnsControllerState>;
|
|
55
|
+
provider?: ExternalProvider | JsonRpcFetchFunc;
|
|
56
|
+
onNetworkStateChange?: (listener: (networkState: Pick<NetworkState, 'networkId' | 'providerConfig'>) => void) => void;
|
|
45
57
|
});
|
|
58
|
+
/**
|
|
59
|
+
* Clears ensResolutionsByAddress state property.
|
|
60
|
+
*/
|
|
61
|
+
resetState(): void;
|
|
46
62
|
/**
|
|
47
63
|
* Remove all chain Ids and ENS entries from state.
|
|
48
64
|
*/
|
|
@@ -54,7 +70,7 @@ export declare class EnsController extends BaseControllerV2<typeof name, EnsCont
|
|
|
54
70
|
* @param ensName - Name of the ENS entry to delete.
|
|
55
71
|
* @returns Boolean indicating if the entry was deleted.
|
|
56
72
|
*/
|
|
57
|
-
delete(chainId:
|
|
73
|
+
delete(chainId: Hex, ensName: string): boolean;
|
|
58
74
|
/**
|
|
59
75
|
* Retrieve a DNS entry.
|
|
60
76
|
*
|
|
@@ -62,7 +78,7 @@ export declare class EnsController extends BaseControllerV2<typeof name, EnsCont
|
|
|
62
78
|
* @param ensName - Name of the ENS entry to retrieve.
|
|
63
79
|
* @returns The EnsEntry or null if it does not exist.
|
|
64
80
|
*/
|
|
65
|
-
get(chainId:
|
|
81
|
+
get(chainId: Hex, ensName: string): EnsEntry | null;
|
|
66
82
|
/**
|
|
67
83
|
* Add or update an ENS entry by chainId and ensName.
|
|
68
84
|
*
|
|
@@ -73,6 +89,14 @@ export declare class EnsController extends BaseControllerV2<typeof name, EnsCont
|
|
|
73
89
|
* @param address - Associated address (or null) to add or update.
|
|
74
90
|
* @returns Boolean indicating if the entry was set.
|
|
75
91
|
*/
|
|
76
|
-
set(chainId:
|
|
92
|
+
set(chainId: Hex, ensName: string, address: string | null): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Resolve ens by address.
|
|
95
|
+
*
|
|
96
|
+
* @param nonChecksummedAddress - address
|
|
97
|
+
* @returns ens resolution
|
|
98
|
+
*/
|
|
99
|
+
reverseResolveAddress(nonChecksummedAddress: string): Promise<string | undefined>;
|
|
77
100
|
}
|
|
78
101
|
export default EnsController;
|
|
102
|
+
//# sourceMappingURL=EnsController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnsController.d.ts","sourceRoot":"","sources":["../src/EnsController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,GAAG,EAAoC,MAAM,iBAAiB,CAAC;AAQxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAqBjE,QAAA,MAAM,IAAI,kBAAkB,CAAC;AAE7B;;;;;;;GAOG;AACH,oBAAY,QAAQ,GAAG;IACrB,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,oBAAY,kBAAkB,GAAG;IAC/B,UAAU,EAAE;QACV,CAAC,OAAO,EAAE,GAAG,GAAG;YACd,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;SAC7B,CAAC;KACH,CAAC;IACF,uBAAuB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,oBAAY,sBAAsB,GAAG,6BAA6B,CAChE,OAAO,IAAI,EACX,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,CACN,CAAC;AAeF;;;GAGG;AACH,qBAAa,aAAc,SAAQ,gBAAgB,CACjD,OAAO,IAAI,EACX,kBAAkB,EAClB,sBAAsB,CACvB;;IAGC;;;;;;;;;OASG;gBACS,EACV,SAAS,EACT,KAAU,EACV,QAAQ,EACR,oBAAoB,GACrB,EAAE;QACD,SAAS,EAAE,sBAAsB,CAAC;QAClC,KAAK,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;QAC/C,oBAAoB,CAAC,EAAE,CACrB,QAAQ,EAAE,CACR,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,gBAAgB,CAAC,KAC7D,IAAI,KACN,IAAI,CAAC;KACX;IA+BD;;OAEG;IACH,UAAU;IAMV;;OAEG;IACH,KAAK;IAML;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAoB9C;;;;;;OAMG;IACH,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAUnD;;;;;;;;;OASG;IACH,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAqDnE;;;;;OAKG;IACG,qBAAqB,CAAC,qBAAqB,EAAE,MAAM;CAkD1D;AAED,eAAe,aAAa,CAAC"}
|
package/dist/EnsController.js
CHANGED
|
@@ -1,15 +1,58 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
12
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
13
|
+
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");
|
|
14
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
15
|
+
};
|
|
16
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
17
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
18
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
19
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
20
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
var _EnsController_instances, _EnsController_ethProvider, _EnsController_getNetworkEnsSupport;
|
|
2
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
27
|
exports.EnsController = void 0;
|
|
4
28
|
const base_controller_1 = require("@metamask/base-controller");
|
|
29
|
+
const providers_1 = require("@ethersproject/providers");
|
|
30
|
+
const utils_1 = require("@metamask/utils");
|
|
5
31
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
32
|
+
const punycode_1 = require("punycode/");
|
|
33
|
+
const ethereum_ens_network_map_1 = __importDefault(require("ethereum-ens-network-map"));
|
|
34
|
+
const log = (0, utils_1.createProjectLogger)('ens-controller');
|
|
35
|
+
/**
|
|
36
|
+
* Checks whether the given string is a known network ID.
|
|
37
|
+
*
|
|
38
|
+
* @param networkId - Network id.
|
|
39
|
+
* @returns Boolean indicating if the network ID is recognized.
|
|
40
|
+
*/
|
|
41
|
+
function isKnownNetworkId(networkId) {
|
|
42
|
+
return (networkId !== null &&
|
|
43
|
+
(0, utils_1.hasProperty)(controller_utils_1.NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP, networkId));
|
|
44
|
+
}
|
|
6
45
|
const name = 'EnsController';
|
|
7
46
|
const metadata = {
|
|
8
47
|
ensEntries: { persist: true, anonymous: false },
|
|
48
|
+
ensResolutionsByAddress: { persist: true, anonymous: false },
|
|
9
49
|
};
|
|
10
50
|
const defaultState = {
|
|
11
51
|
ensEntries: {},
|
|
52
|
+
ensResolutionsByAddress: {},
|
|
12
53
|
};
|
|
54
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
55
|
+
const ZERO_X_ERROR_ADDRESS = '0x';
|
|
13
56
|
/**
|
|
14
57
|
* Controller that manages a list ENS names and their resolved addresses
|
|
15
58
|
* by chainId. A null address indicates an unresolved ENS name.
|
|
@@ -21,14 +64,44 @@ class EnsController extends base_controller_1.BaseControllerV2 {
|
|
|
21
64
|
* @param options - Constructor options.
|
|
22
65
|
* @param options.messenger - A reference to the messaging system.
|
|
23
66
|
* @param options.state - Initial state to set on this controller.
|
|
67
|
+
* @param options.provider - Provider instance.
|
|
68
|
+
* @param options.onNetworkStateChange - Allows registering an event handler for
|
|
69
|
+
* when the network controller state updated.
|
|
24
70
|
*/
|
|
25
|
-
constructor({ messenger, state, }) {
|
|
71
|
+
constructor({ messenger, state = {}, provider, onNetworkStateChange, }) {
|
|
26
72
|
super({
|
|
27
73
|
name,
|
|
28
74
|
metadata,
|
|
29
75
|
messenger,
|
|
30
76
|
state: Object.assign(Object.assign({}, defaultState), state),
|
|
31
77
|
});
|
|
78
|
+
_EnsController_instances.add(this);
|
|
79
|
+
_EnsController_ethProvider.set(this, null);
|
|
80
|
+
if (provider && onNetworkStateChange) {
|
|
81
|
+
onNetworkStateChange((networkState) => {
|
|
82
|
+
this.resetState();
|
|
83
|
+
const currentNetwork = networkState.networkId;
|
|
84
|
+
if (isKnownNetworkId(currentNetwork) &&
|
|
85
|
+
__classPrivateFieldGet(this, _EnsController_instances, "m", _EnsController_getNetworkEnsSupport).call(this, currentNetwork)) {
|
|
86
|
+
__classPrivateFieldSet(this, _EnsController_ethProvider, new providers_1.Web3Provider(provider, {
|
|
87
|
+
chainId: (0, controller_utils_1.convertHexToDecimal)(networkState.providerConfig.chainId),
|
|
88
|
+
name: controller_utils_1.NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP[currentNetwork],
|
|
89
|
+
ensAddress: ethereum_ens_network_map_1.default[currentNetwork],
|
|
90
|
+
}), "f");
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
__classPrivateFieldSet(this, _EnsController_ethProvider, null, "f");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Clears ensResolutionsByAddress state property.
|
|
100
|
+
*/
|
|
101
|
+
resetState() {
|
|
102
|
+
this.update((currentState) => {
|
|
103
|
+
currentState.ensResolutionsByAddress = {};
|
|
104
|
+
});
|
|
32
105
|
}
|
|
33
106
|
/**
|
|
34
107
|
* Remove all chain Ids and ENS entries from state.
|
|
@@ -111,7 +184,60 @@ class EnsController extends base_controller_1.BaseControllerV2 {
|
|
|
111
184
|
});
|
|
112
185
|
return true;
|
|
113
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Resolve ens by address.
|
|
189
|
+
*
|
|
190
|
+
* @param nonChecksummedAddress - address
|
|
191
|
+
* @returns ens resolution
|
|
192
|
+
*/
|
|
193
|
+
reverseResolveAddress(nonChecksummedAddress) {
|
|
194
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
195
|
+
if (!__classPrivateFieldGet(this, _EnsController_ethProvider, "f")) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
const address = (0, controller_utils_1.toChecksumHexAddress)(nonChecksummedAddress);
|
|
199
|
+
if (this.state.ensResolutionsByAddress[address]) {
|
|
200
|
+
return this.state.ensResolutionsByAddress[address];
|
|
201
|
+
}
|
|
202
|
+
let domain;
|
|
203
|
+
try {
|
|
204
|
+
domain = yield __classPrivateFieldGet(this, _EnsController_ethProvider, "f").lookupAddress(address);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
log(error);
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (!domain) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
let registeredAddress;
|
|
214
|
+
try {
|
|
215
|
+
registeredAddress = yield __classPrivateFieldGet(this, _EnsController_ethProvider, "f").resolveName(domain);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
log(error);
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
if (!registeredAddress) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
if (registeredAddress === ZERO_ADDRESS ||
|
|
225
|
+
registeredAddress === ZERO_X_ERROR_ADDRESS) {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
if ((0, controller_utils_1.toChecksumHexAddress)(registeredAddress) !== address) {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
this.update((state) => {
|
|
232
|
+
state.ensResolutionsByAddress[address] = (0, punycode_1.toASCII)(domain);
|
|
233
|
+
});
|
|
234
|
+
return domain;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
114
237
|
}
|
|
115
238
|
exports.EnsController = EnsController;
|
|
239
|
+
_EnsController_ethProvider = new WeakMap(), _EnsController_instances = new WeakSet(), _EnsController_getNetworkEnsSupport = function _EnsController_getNetworkEnsSupport(networkId) {
|
|
240
|
+
return Boolean(ethereum_ens_network_map_1.default[networkId]);
|
|
241
|
+
};
|
|
116
242
|
exports.default = EnsController;
|
|
117
243
|
//# sourceMappingURL=EnsController.js.map
|
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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 Web3Provider,\n ExternalProvider,\n JsonRpcFetchFunc,\n} from '@ethersproject/providers';\nimport { Hex, createProjectLogger, hasProperty } from '@metamask/utils';\nimport {\n normalizeEnsName,\n isValidHexAddress,\n toChecksumHexAddress,\n NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP,\n convertHexToDecimal,\n} from '@metamask/controller-utils';\nimport type { NetworkState } from '@metamask/network-controller';\nimport { toASCII } from 'punycode/';\nimport ensNetworkMap from 'ethereum-ens-network-map';\n\nconst log = createProjectLogger('ens-controller');\n\n/**\n * Checks whether the given string is a known network ID.\n *\n * @param networkId - Network id.\n * @returns Boolean indicating if the network ID is recognized.\n */\nfunction isKnownNetworkId(\n networkId: string | null,\n): networkId is keyof typeof NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP {\n return (\n networkId !== null &&\n hasProperty(NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP, networkId)\n );\n}\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: Hex;\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: Hex]: {\n [ensName: string]: EnsEntry;\n };\n };\n ensResolutionsByAddress: { [key: string]: string };\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 ensResolutionsByAddress: { persist: true, anonymous: false },\n};\n\nconst defaultState = {\n ensEntries: {},\n ensResolutionsByAddress: {},\n};\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst ZERO_X_ERROR_ADDRESS = '0x';\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 #ethProvider: Web3Provider | null = null;\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 * @param options.provider - Provider instance.\n * @param options.onNetworkStateChange - Allows registering an event handler for\n * when the network controller state updated.\n */\n constructor({\n messenger,\n state = {},\n provider,\n onNetworkStateChange,\n }: {\n messenger: EnsControllerMessenger;\n state?: Partial<EnsControllerState>;\n provider?: ExternalProvider | JsonRpcFetchFunc;\n onNetworkStateChange?: (\n listener: (\n networkState: Pick<NetworkState, 'networkId' | 'providerConfig'>,\n ) => void,\n ) => void;\n }) {\n super({\n name,\n metadata,\n messenger,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n if (provider && onNetworkStateChange) {\n onNetworkStateChange((networkState) => {\n this.resetState();\n const currentNetwork = networkState.networkId;\n if (\n isKnownNetworkId(currentNetwork) &&\n this.#getNetworkEnsSupport(currentNetwork)\n ) {\n this.#ethProvider = new Web3Provider(provider, {\n chainId: convertHexToDecimal(networkState.providerConfig.chainId),\n name: NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP[currentNetwork],\n ensAddress: ensNetworkMap[currentNetwork],\n });\n } else {\n this.#ethProvider = null;\n }\n });\n }\n }\n\n /**\n * Clears ensResolutionsByAddress state property.\n */\n resetState() {\n this.update((currentState) => {\n currentState.ensResolutionsByAddress = {};\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: Hex, 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: Hex, 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: Hex, 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 /**\n * Check if network supports ENS.\n *\n * @param networkId - Network id.\n * @returns Boolean indicating if the network supports ENS.\n */\n #getNetworkEnsSupport(networkId: string) {\n return Boolean(ensNetworkMap[networkId]);\n }\n\n /**\n * Resolve ens by address.\n *\n * @param nonChecksummedAddress - address\n * @returns ens resolution\n */\n async reverseResolveAddress(nonChecksummedAddress: string) {\n if (!this.#ethProvider) {\n return undefined;\n }\n\n const address = toChecksumHexAddress(nonChecksummedAddress);\n if (this.state.ensResolutionsByAddress[address]) {\n return this.state.ensResolutionsByAddress[address];\n }\n\n let domain: string | null;\n try {\n domain = await this.#ethProvider.lookupAddress(address);\n } catch (error) {\n log(error);\n return undefined;\n }\n\n if (!domain) {\n return undefined;\n }\n\n let registeredAddress: string | null;\n try {\n registeredAddress = await this.#ethProvider.resolveName(domain);\n } catch (error) {\n log(error);\n return undefined;\n }\n\n if (!registeredAddress) {\n return undefined;\n }\n\n if (\n registeredAddress === ZERO_ADDRESS ||\n registeredAddress === ZERO_X_ERROR_ADDRESS\n ) {\n return undefined;\n }\n if (toChecksumHexAddress(registeredAddress) !== address) {\n return undefined;\n }\n\n this.update((state) => {\n state.ensResolutionsByAddress[address] = toASCII(domain as string);\n });\n\n return domain;\n }\n}\n\nexport default EnsController;\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/ens-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Maps ENS names to their resolved addresses by chain id",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -29,21 +29,29 @@
|
|
|
29
29
|
"test:watch": "jest --watch"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@
|
|
33
|
-
"@metamask/controller
|
|
32
|
+
"@ethersproject/providers": "^5.7.0",
|
|
33
|
+
"@metamask/base-controller": "^3.0.0",
|
|
34
|
+
"@metamask/controller-utils": "^4.0.0",
|
|
35
|
+
"@metamask/network-controller": "^9.0.0",
|
|
36
|
+
"@metamask/utils": "^5.0.2",
|
|
37
|
+
"ethereum-ens-network-map": "^1.0.2",
|
|
38
|
+
"punycode": "^2.1.1"
|
|
34
39
|
},
|
|
35
40
|
"devDependencies": {
|
|
36
41
|
"@metamask/auto-changelog": "^3.1.0",
|
|
37
|
-
"@types/jest": "^
|
|
42
|
+
"@types/jest": "^27.4.1",
|
|
38
43
|
"deepmerge": "^4.2.2",
|
|
39
|
-
"jest": "^
|
|
40
|
-
"ts-jest": "^
|
|
44
|
+
"jest": "^27.5.1",
|
|
45
|
+
"ts-jest": "^27.1.4",
|
|
41
46
|
"typedoc": "^0.22.15",
|
|
42
47
|
"typedoc-plugin-missing-exports": "^0.22.6",
|
|
43
48
|
"typescript": "~4.6.3"
|
|
44
49
|
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"@metamask/network-controller": "^9.0.0"
|
|
52
|
+
},
|
|
45
53
|
"engines": {
|
|
46
|
-
"node": ">=
|
|
54
|
+
"node": ">=16.0.0"
|
|
47
55
|
},
|
|
48
56
|
"publishConfig": {
|
|
49
57
|
"access": "public",
|