@metamask/ens-controller 13.0.1 → 14.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -1
- package/dist/EnsController.cjs +262 -0
- package/dist/EnsController.cjs.map +1 -0
- package/dist/{types/EnsController.d.ts → EnsController.d.cts} +7 -10
- package/dist/EnsController.d.cts.map +1 -0
- package/dist/EnsController.d.mts +103 -0
- package/dist/EnsController.d.mts.map +1 -0
- package/dist/EnsController.mjs +257 -9
- package/dist/EnsController.mjs.map +1 -1
- package/dist/index.cjs +18 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +18 -12
- package/dist/EnsController.js +0 -11
- package/dist/EnsController.js.map +0 -1
- package/dist/chunk-BG4UCEGM.js +0 -279
- package/dist/chunk-BG4UCEGM.js.map +0 -1
- package/dist/chunk-QYSGUYCU.mjs +0 -279
- package/dist/chunk-QYSGUYCU.mjs.map +0 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/types/EnsController.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +0 -1
package/dist/chunk-BG4UCEGM.js
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var __accessCheck = (obj, member, msg) => {
|
|
2
|
-
if (!member.has(obj))
|
|
3
|
-
throw TypeError("Cannot " + msg);
|
|
4
|
-
};
|
|
5
|
-
var __privateGet = (obj, member, getter) => {
|
|
6
|
-
__accessCheck(obj, member, "read from private field");
|
|
7
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
-
};
|
|
9
|
-
var __privateAdd = (obj, member, value) => {
|
|
10
|
-
if (member.has(obj))
|
|
11
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
-
};
|
|
14
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
-
__accessCheck(obj, member, "write to private field");
|
|
16
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
-
return value;
|
|
18
|
-
};
|
|
19
|
-
var __privateMethod = (obj, member, method) => {
|
|
20
|
-
__accessCheck(obj, member, "access private method");
|
|
21
|
-
return method;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// src/EnsController.ts
|
|
25
|
-
var _providers = require('@ethersproject/providers');
|
|
26
|
-
var _basecontroller = require('@metamask/base-controller');
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
var _controllerutils = require('@metamask/controller-utils');
|
|
36
|
-
var _utils = require('@metamask/utils');
|
|
37
|
-
var _ = require('punycode/');
|
|
38
|
-
var log = _utils.createProjectLogger.call(void 0, "ens-controller");
|
|
39
|
-
var name = "EnsController";
|
|
40
|
-
var DEFAULT_ENS_NETWORK_MAP = {
|
|
41
|
-
// Mainnet
|
|
42
|
-
1: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
43
|
-
// Ropsten
|
|
44
|
-
3: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
45
|
-
// Rinkeby
|
|
46
|
-
4: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
47
|
-
// Goerli
|
|
48
|
-
5: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
49
|
-
// Holesky
|
|
50
|
-
17e3: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
51
|
-
// Sepolia
|
|
52
|
-
11155111: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"
|
|
53
|
-
};
|
|
54
|
-
var metadata = {
|
|
55
|
-
ensEntries: { persist: true, anonymous: false },
|
|
56
|
-
ensResolutionsByAddress: { persist: true, anonymous: false }
|
|
57
|
-
};
|
|
58
|
-
var defaultState = {
|
|
59
|
-
ensEntries: {},
|
|
60
|
-
ensResolutionsByAddress: {}
|
|
61
|
-
};
|
|
62
|
-
var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
63
|
-
var ZERO_X_ERROR_ADDRESS = "0x";
|
|
64
|
-
var _ethProvider, _getChainEnsSupport, getChainEnsSupport_fn;
|
|
65
|
-
var EnsController = class extends _basecontroller.BaseController {
|
|
66
|
-
/**
|
|
67
|
-
* Creates an EnsController instance.
|
|
68
|
-
*
|
|
69
|
-
* @param options - Constructor options.
|
|
70
|
-
* @param options.registriesByChainId - Map between chain IDs and ENS contract addresses.
|
|
71
|
-
* @param options.messenger - A reference to the messaging system.
|
|
72
|
-
* @param options.state - Initial state to set on this controller.
|
|
73
|
-
* @param options.provider - Provider instance.
|
|
74
|
-
* @param options.onNetworkDidChange - Allows subscribing to network controller networkDidChange events.
|
|
75
|
-
*/
|
|
76
|
-
constructor({
|
|
77
|
-
registriesByChainId = DEFAULT_ENS_NETWORK_MAP,
|
|
78
|
-
messenger,
|
|
79
|
-
state = {},
|
|
80
|
-
provider,
|
|
81
|
-
onNetworkDidChange
|
|
82
|
-
}) {
|
|
83
|
-
super({
|
|
84
|
-
name,
|
|
85
|
-
metadata,
|
|
86
|
-
messenger,
|
|
87
|
-
state: {
|
|
88
|
-
...defaultState,
|
|
89
|
-
ensEntries: Object.fromEntries(
|
|
90
|
-
Object.entries(registriesByChainId).map(([chainId, address]) => [
|
|
91
|
-
_controllerutils.toHex.call(void 0, chainId),
|
|
92
|
-
{
|
|
93
|
-
".": {
|
|
94
|
-
address,
|
|
95
|
-
chainId: _controllerutils.toHex.call(void 0, chainId),
|
|
96
|
-
ensName: "."
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
])
|
|
100
|
-
),
|
|
101
|
-
...state
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
/**
|
|
105
|
-
* Check if the chain supports ENS.
|
|
106
|
-
*
|
|
107
|
-
* @param chainId - chain id.
|
|
108
|
-
* @returns Boolean indicating if the chain supports ENS.
|
|
109
|
-
*/
|
|
110
|
-
__privateAdd(this, _getChainEnsSupport);
|
|
111
|
-
__privateAdd(this, _ethProvider, null);
|
|
112
|
-
if (provider && onNetworkDidChange) {
|
|
113
|
-
onNetworkDidChange(({ selectedNetworkClientId }) => {
|
|
114
|
-
this.resetState();
|
|
115
|
-
const selectedNetworkClient = this.messagingSystem.call(
|
|
116
|
-
"NetworkController:getNetworkClientById",
|
|
117
|
-
selectedNetworkClientId
|
|
118
|
-
);
|
|
119
|
-
const currentChainId = selectedNetworkClient.configuration.chainId;
|
|
120
|
-
if (__privateMethod(this, _getChainEnsSupport, getChainEnsSupport_fn).call(this, currentChainId)) {
|
|
121
|
-
__privateSet(this, _ethProvider, new (0, _providers.Web3Provider)(provider, {
|
|
122
|
-
chainId: _controllerutils.convertHexToDecimal.call(void 0, currentChainId),
|
|
123
|
-
name: _controllerutils.CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP[currentChainId],
|
|
124
|
-
ensAddress: registriesByChainId[parseInt(currentChainId, 16)]
|
|
125
|
-
}));
|
|
126
|
-
} else {
|
|
127
|
-
__privateSet(this, _ethProvider, null);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Clears ensResolutionsByAddress state property.
|
|
134
|
-
*/
|
|
135
|
-
resetState() {
|
|
136
|
-
this.update((currentState) => {
|
|
137
|
-
currentState.ensResolutionsByAddress = {};
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Remove all chain Ids and ENS entries from state.
|
|
142
|
-
*/
|
|
143
|
-
clear() {
|
|
144
|
-
this.update((state) => {
|
|
145
|
-
state.ensEntries = {};
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Delete an ENS entry.
|
|
150
|
-
*
|
|
151
|
-
* @param chainId - Parent chain of the ENS entry to delete.
|
|
152
|
-
* @param ensName - Name of the ENS entry to delete.
|
|
153
|
-
* @returns Boolean indicating if the entry was deleted.
|
|
154
|
-
*/
|
|
155
|
-
delete(chainId, ensName) {
|
|
156
|
-
const normalizedEnsName = _controllerutils.normalizeEnsName.call(void 0, ensName);
|
|
157
|
-
if (!_controllerutils.isSafeDynamicKey.call(void 0, chainId) || !normalizedEnsName || !this.state.ensEntries[chainId] || !this.state.ensEntries[chainId][normalizedEnsName]) {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
this.update((state) => {
|
|
161
|
-
delete state.ensEntries[chainId][normalizedEnsName];
|
|
162
|
-
if (Object.keys(state.ensEntries[chainId]).length === 0) {
|
|
163
|
-
delete state.ensEntries[chainId];
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Retrieve a DNS entry.
|
|
170
|
-
*
|
|
171
|
-
* @param chainId - Parent chain of the ENS entry to retrieve.
|
|
172
|
-
* @param ensName - Name of the ENS entry to retrieve.
|
|
173
|
-
* @returns The EnsEntry or null if it does not exist.
|
|
174
|
-
*/
|
|
175
|
-
get(chainId, ensName) {
|
|
176
|
-
const normalizedEnsName = _controllerutils.normalizeEnsName.call(void 0, ensName);
|
|
177
|
-
return !!normalizedEnsName && this.state.ensEntries[chainId] ? this.state.ensEntries[chainId][normalizedEnsName] || null : null;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Add or update an ENS entry by chainId and ensName.
|
|
181
|
-
*
|
|
182
|
-
* A null address indicates that the ENS name does not resolve.
|
|
183
|
-
*
|
|
184
|
-
* @param chainId - Id of the associated chain.
|
|
185
|
-
* @param ensName - The ENS name.
|
|
186
|
-
* @param address - Associated address (or null) to add or update.
|
|
187
|
-
* @returns Boolean indicating if the entry was set.
|
|
188
|
-
*/
|
|
189
|
-
set(chainId, ensName, address) {
|
|
190
|
-
if (!Number.isInteger(Number.parseInt(chainId, 10)) || !ensName || typeof ensName !== "string" || address && !_controllerutils.isValidHexAddress.call(void 0, address)) {
|
|
191
|
-
throw new Error(
|
|
192
|
-
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
193
|
-
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
194
|
-
`Invalid ENS entry: { chainId:${chainId}, ensName:${ensName}, address:${address}}`
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
const normalizedEnsName = _controllerutils.normalizeEnsName.call(void 0, ensName);
|
|
198
|
-
if (!normalizedEnsName) {
|
|
199
|
-
throw new Error(`Invalid ENS name: ${ensName}`);
|
|
200
|
-
}
|
|
201
|
-
const normalizedAddress = address ? _controllerutils.toChecksumHexAddress.call(void 0, address) : null;
|
|
202
|
-
const subState = this.state.ensEntries[chainId];
|
|
203
|
-
if (subState?.[normalizedEnsName] && subState[normalizedEnsName].address === normalizedAddress) {
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
this.update((state) => {
|
|
207
|
-
state.ensEntries = {
|
|
208
|
-
...this.state.ensEntries,
|
|
209
|
-
[chainId]: {
|
|
210
|
-
...this.state.ensEntries[chainId],
|
|
211
|
-
[normalizedEnsName]: {
|
|
212
|
-
address: normalizedAddress,
|
|
213
|
-
chainId,
|
|
214
|
-
ensName: normalizedEnsName
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
});
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Resolve ens by address.
|
|
223
|
-
*
|
|
224
|
-
* @param nonChecksummedAddress - address
|
|
225
|
-
* @returns ens resolution
|
|
226
|
-
*/
|
|
227
|
-
async reverseResolveAddress(nonChecksummedAddress) {
|
|
228
|
-
if (!__privateGet(this, _ethProvider)) {
|
|
229
|
-
return void 0;
|
|
230
|
-
}
|
|
231
|
-
const address = _controllerutils.toChecksumHexAddress.call(void 0, nonChecksummedAddress);
|
|
232
|
-
if (this.state.ensResolutionsByAddress[address]) {
|
|
233
|
-
return this.state.ensResolutionsByAddress[address];
|
|
234
|
-
}
|
|
235
|
-
let domain;
|
|
236
|
-
try {
|
|
237
|
-
domain = await __privateGet(this, _ethProvider).lookupAddress(address);
|
|
238
|
-
} catch (error) {
|
|
239
|
-
log(error);
|
|
240
|
-
return void 0;
|
|
241
|
-
}
|
|
242
|
-
if (!domain) {
|
|
243
|
-
return void 0;
|
|
244
|
-
}
|
|
245
|
-
let registeredAddress;
|
|
246
|
-
try {
|
|
247
|
-
registeredAddress = await __privateGet(this, _ethProvider).resolveName(domain);
|
|
248
|
-
} catch (error) {
|
|
249
|
-
log(error);
|
|
250
|
-
return void 0;
|
|
251
|
-
}
|
|
252
|
-
if (!registeredAddress) {
|
|
253
|
-
return void 0;
|
|
254
|
-
}
|
|
255
|
-
if (registeredAddress === ZERO_ADDRESS || registeredAddress === ZERO_X_ERROR_ADDRESS) {
|
|
256
|
-
return void 0;
|
|
257
|
-
}
|
|
258
|
-
if (_controllerutils.toChecksumHexAddress.call(void 0, registeredAddress) !== address) {
|
|
259
|
-
return void 0;
|
|
260
|
-
}
|
|
261
|
-
this.update((state) => {
|
|
262
|
-
state.ensResolutionsByAddress[address] = _.toASCII.call(void 0, domain);
|
|
263
|
-
});
|
|
264
|
-
return domain;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
_ethProvider = new WeakMap();
|
|
268
|
-
_getChainEnsSupport = new WeakSet();
|
|
269
|
-
getChainEnsSupport_fn = function(chainId) {
|
|
270
|
-
return Boolean(this.state.ensEntries[chainId]);
|
|
271
|
-
};
|
|
272
|
-
var EnsController_default = EnsController;
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
exports.DEFAULT_ENS_NETWORK_MAP = DEFAULT_ENS_NETWORK_MAP; exports.EnsController = EnsController; exports.EnsController_default = EnsController_default;
|
|
279
|
-
//# sourceMappingURL=chunk-BG4UCEGM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/EnsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ExternalProvider,\n JsonRpcFetchFunc,\n} from '@ethersproject/providers';\nimport { Web3Provider } from '@ethersproject/providers';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { ChainId } from '@metamask/controller-utils';\nimport {\n normalizeEnsName,\n isValidHexAddress,\n isSafeDynamicKey,\n toChecksumHexAddress,\n CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP,\n convertHexToDecimal,\n toHex,\n} from '@metamask/controller-utils';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n NetworkState,\n} from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createProjectLogger } from '@metamask/utils';\nimport { toASCII } from 'punycode/';\n\nconst log = createProjectLogger('ens-controller');\n\nconst name = 'EnsController';\n\n// Map of chainIDs and ENS registry contract addresses\nexport const DEFAULT_ENS_NETWORK_MAP: Record<number, Hex> = {\n // Mainnet\n 1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Ropsten\n 3: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Rinkeby\n 4: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Goerli\n 5: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Holesky\n 17000: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Sepolia\n 11155111: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n};\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\ntype AllowedActions = NetworkControllerGetNetworkClientByIdAction;\n\nexport type EnsControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n AllowedActions,\n never,\n AllowedActions['type'],\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 BaseController<\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.registriesByChainId - Map between chain IDs and ENS contract addresses.\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.onNetworkDidChange - Allows subscribing to network controller networkDidChange events.\n */\n constructor({\n registriesByChainId = DEFAULT_ENS_NETWORK_MAP,\n messenger,\n state = {},\n provider,\n onNetworkDidChange,\n }: {\n registriesByChainId?: Record<number, Hex>;\n messenger: EnsControllerMessenger;\n state?: Partial<EnsControllerState>;\n provider?: ExternalProvider | JsonRpcFetchFunc;\n onNetworkDidChange?: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n }) {\n super({\n name,\n metadata,\n messenger,\n state: {\n ...defaultState,\n ensEntries: Object.fromEntries(\n Object.entries(registriesByChainId).map(([chainId, address]) => [\n toHex(chainId),\n {\n '.': {\n address,\n chainId: toHex(chainId),\n ensName: '.',\n },\n },\n ]),\n ),\n ...state,\n },\n });\n\n if (provider && onNetworkDidChange) {\n onNetworkDidChange(({ selectedNetworkClientId }) => {\n this.resetState();\n const selectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n const currentChainId = selectedNetworkClient.configuration.chainId;\n\n if (this.#getChainEnsSupport(currentChainId)) {\n this.#ethProvider = new Web3Provider(provider, {\n chainId: convertHexToDecimal(currentChainId),\n name: CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP[\n currentChainId as ChainId\n ],\n ensAddress: registriesByChainId[parseInt(currentChainId, 16)],\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 !isSafeDynamicKey(chainId) ||\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 // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\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 the chain supports ENS.\n *\n * @param chainId - chain id.\n * @returns Boolean indicating if the chain supports ENS.\n */\n #getChainEnsSupport(chainId: Hex) {\n return Boolean(this.state.ensEntries[chainId]);\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/chunk-QYSGUYCU.mjs
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
var __accessCheck = (obj, member, msg) => {
|
|
2
|
-
if (!member.has(obj))
|
|
3
|
-
throw TypeError("Cannot " + msg);
|
|
4
|
-
};
|
|
5
|
-
var __privateGet = (obj, member, getter) => {
|
|
6
|
-
__accessCheck(obj, member, "read from private field");
|
|
7
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
-
};
|
|
9
|
-
var __privateAdd = (obj, member, value) => {
|
|
10
|
-
if (member.has(obj))
|
|
11
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
-
};
|
|
14
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
-
__accessCheck(obj, member, "write to private field");
|
|
16
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
-
return value;
|
|
18
|
-
};
|
|
19
|
-
var __privateMethod = (obj, member, method) => {
|
|
20
|
-
__accessCheck(obj, member, "access private method");
|
|
21
|
-
return method;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// src/EnsController.ts
|
|
25
|
-
import { Web3Provider } from "@ethersproject/providers";
|
|
26
|
-
import { BaseController } from "@metamask/base-controller";
|
|
27
|
-
import {
|
|
28
|
-
normalizeEnsName,
|
|
29
|
-
isValidHexAddress,
|
|
30
|
-
isSafeDynamicKey,
|
|
31
|
-
toChecksumHexAddress,
|
|
32
|
-
CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP,
|
|
33
|
-
convertHexToDecimal,
|
|
34
|
-
toHex
|
|
35
|
-
} from "@metamask/controller-utils";
|
|
36
|
-
import { createProjectLogger } from "@metamask/utils";
|
|
37
|
-
import { toASCII } from "punycode/";
|
|
38
|
-
var log = createProjectLogger("ens-controller");
|
|
39
|
-
var name = "EnsController";
|
|
40
|
-
var DEFAULT_ENS_NETWORK_MAP = {
|
|
41
|
-
// Mainnet
|
|
42
|
-
1: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
43
|
-
// Ropsten
|
|
44
|
-
3: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
45
|
-
// Rinkeby
|
|
46
|
-
4: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
47
|
-
// Goerli
|
|
48
|
-
5: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
49
|
-
// Holesky
|
|
50
|
-
17e3: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
|
51
|
-
// Sepolia
|
|
52
|
-
11155111: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"
|
|
53
|
-
};
|
|
54
|
-
var metadata = {
|
|
55
|
-
ensEntries: { persist: true, anonymous: false },
|
|
56
|
-
ensResolutionsByAddress: { persist: true, anonymous: false }
|
|
57
|
-
};
|
|
58
|
-
var defaultState = {
|
|
59
|
-
ensEntries: {},
|
|
60
|
-
ensResolutionsByAddress: {}
|
|
61
|
-
};
|
|
62
|
-
var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
63
|
-
var ZERO_X_ERROR_ADDRESS = "0x";
|
|
64
|
-
var _ethProvider, _getChainEnsSupport, getChainEnsSupport_fn;
|
|
65
|
-
var EnsController = class extends BaseController {
|
|
66
|
-
/**
|
|
67
|
-
* Creates an EnsController instance.
|
|
68
|
-
*
|
|
69
|
-
* @param options - Constructor options.
|
|
70
|
-
* @param options.registriesByChainId - Map between chain IDs and ENS contract addresses.
|
|
71
|
-
* @param options.messenger - A reference to the messaging system.
|
|
72
|
-
* @param options.state - Initial state to set on this controller.
|
|
73
|
-
* @param options.provider - Provider instance.
|
|
74
|
-
* @param options.onNetworkDidChange - Allows subscribing to network controller networkDidChange events.
|
|
75
|
-
*/
|
|
76
|
-
constructor({
|
|
77
|
-
registriesByChainId = DEFAULT_ENS_NETWORK_MAP,
|
|
78
|
-
messenger,
|
|
79
|
-
state = {},
|
|
80
|
-
provider,
|
|
81
|
-
onNetworkDidChange
|
|
82
|
-
}) {
|
|
83
|
-
super({
|
|
84
|
-
name,
|
|
85
|
-
metadata,
|
|
86
|
-
messenger,
|
|
87
|
-
state: {
|
|
88
|
-
...defaultState,
|
|
89
|
-
ensEntries: Object.fromEntries(
|
|
90
|
-
Object.entries(registriesByChainId).map(([chainId, address]) => [
|
|
91
|
-
toHex(chainId),
|
|
92
|
-
{
|
|
93
|
-
".": {
|
|
94
|
-
address,
|
|
95
|
-
chainId: toHex(chainId),
|
|
96
|
-
ensName: "."
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
])
|
|
100
|
-
),
|
|
101
|
-
...state
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
/**
|
|
105
|
-
* Check if the chain supports ENS.
|
|
106
|
-
*
|
|
107
|
-
* @param chainId - chain id.
|
|
108
|
-
* @returns Boolean indicating if the chain supports ENS.
|
|
109
|
-
*/
|
|
110
|
-
__privateAdd(this, _getChainEnsSupport);
|
|
111
|
-
__privateAdd(this, _ethProvider, null);
|
|
112
|
-
if (provider && onNetworkDidChange) {
|
|
113
|
-
onNetworkDidChange(({ selectedNetworkClientId }) => {
|
|
114
|
-
this.resetState();
|
|
115
|
-
const selectedNetworkClient = this.messagingSystem.call(
|
|
116
|
-
"NetworkController:getNetworkClientById",
|
|
117
|
-
selectedNetworkClientId
|
|
118
|
-
);
|
|
119
|
-
const currentChainId = selectedNetworkClient.configuration.chainId;
|
|
120
|
-
if (__privateMethod(this, _getChainEnsSupport, getChainEnsSupport_fn).call(this, currentChainId)) {
|
|
121
|
-
__privateSet(this, _ethProvider, new Web3Provider(provider, {
|
|
122
|
-
chainId: convertHexToDecimal(currentChainId),
|
|
123
|
-
name: CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP[currentChainId],
|
|
124
|
-
ensAddress: registriesByChainId[parseInt(currentChainId, 16)]
|
|
125
|
-
}));
|
|
126
|
-
} else {
|
|
127
|
-
__privateSet(this, _ethProvider, null);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Clears ensResolutionsByAddress state property.
|
|
134
|
-
*/
|
|
135
|
-
resetState() {
|
|
136
|
-
this.update((currentState) => {
|
|
137
|
-
currentState.ensResolutionsByAddress = {};
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Remove all chain Ids and ENS entries from state.
|
|
142
|
-
*/
|
|
143
|
-
clear() {
|
|
144
|
-
this.update((state) => {
|
|
145
|
-
state.ensEntries = {};
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Delete an ENS entry.
|
|
150
|
-
*
|
|
151
|
-
* @param chainId - Parent chain of the ENS entry to delete.
|
|
152
|
-
* @param ensName - Name of the ENS entry to delete.
|
|
153
|
-
* @returns Boolean indicating if the entry was deleted.
|
|
154
|
-
*/
|
|
155
|
-
delete(chainId, ensName) {
|
|
156
|
-
const normalizedEnsName = normalizeEnsName(ensName);
|
|
157
|
-
if (!isSafeDynamicKey(chainId) || !normalizedEnsName || !this.state.ensEntries[chainId] || !this.state.ensEntries[chainId][normalizedEnsName]) {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
this.update((state) => {
|
|
161
|
-
delete state.ensEntries[chainId][normalizedEnsName];
|
|
162
|
-
if (Object.keys(state.ensEntries[chainId]).length === 0) {
|
|
163
|
-
delete state.ensEntries[chainId];
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Retrieve a DNS entry.
|
|
170
|
-
*
|
|
171
|
-
* @param chainId - Parent chain of the ENS entry to retrieve.
|
|
172
|
-
* @param ensName - Name of the ENS entry to retrieve.
|
|
173
|
-
* @returns The EnsEntry or null if it does not exist.
|
|
174
|
-
*/
|
|
175
|
-
get(chainId, ensName) {
|
|
176
|
-
const normalizedEnsName = normalizeEnsName(ensName);
|
|
177
|
-
return !!normalizedEnsName && this.state.ensEntries[chainId] ? this.state.ensEntries[chainId][normalizedEnsName] || null : null;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Add or update an ENS entry by chainId and ensName.
|
|
181
|
-
*
|
|
182
|
-
* A null address indicates that the ENS name does not resolve.
|
|
183
|
-
*
|
|
184
|
-
* @param chainId - Id of the associated chain.
|
|
185
|
-
* @param ensName - The ENS name.
|
|
186
|
-
* @param address - Associated address (or null) to add or update.
|
|
187
|
-
* @returns Boolean indicating if the entry was set.
|
|
188
|
-
*/
|
|
189
|
-
set(chainId, ensName, address) {
|
|
190
|
-
if (!Number.isInteger(Number.parseInt(chainId, 10)) || !ensName || typeof ensName !== "string" || address && !isValidHexAddress(address)) {
|
|
191
|
-
throw new Error(
|
|
192
|
-
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
193
|
-
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
194
|
-
`Invalid ENS entry: { chainId:${chainId}, ensName:${ensName}, address:${address}}`
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
const normalizedEnsName = normalizeEnsName(ensName);
|
|
198
|
-
if (!normalizedEnsName) {
|
|
199
|
-
throw new Error(`Invalid ENS name: ${ensName}`);
|
|
200
|
-
}
|
|
201
|
-
const normalizedAddress = address ? toChecksumHexAddress(address) : null;
|
|
202
|
-
const subState = this.state.ensEntries[chainId];
|
|
203
|
-
if (subState?.[normalizedEnsName] && subState[normalizedEnsName].address === normalizedAddress) {
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
this.update((state) => {
|
|
207
|
-
state.ensEntries = {
|
|
208
|
-
...this.state.ensEntries,
|
|
209
|
-
[chainId]: {
|
|
210
|
-
...this.state.ensEntries[chainId],
|
|
211
|
-
[normalizedEnsName]: {
|
|
212
|
-
address: normalizedAddress,
|
|
213
|
-
chainId,
|
|
214
|
-
ensName: normalizedEnsName
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
});
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Resolve ens by address.
|
|
223
|
-
*
|
|
224
|
-
* @param nonChecksummedAddress - address
|
|
225
|
-
* @returns ens resolution
|
|
226
|
-
*/
|
|
227
|
-
async reverseResolveAddress(nonChecksummedAddress) {
|
|
228
|
-
if (!__privateGet(this, _ethProvider)) {
|
|
229
|
-
return void 0;
|
|
230
|
-
}
|
|
231
|
-
const address = toChecksumHexAddress(nonChecksummedAddress);
|
|
232
|
-
if (this.state.ensResolutionsByAddress[address]) {
|
|
233
|
-
return this.state.ensResolutionsByAddress[address];
|
|
234
|
-
}
|
|
235
|
-
let domain;
|
|
236
|
-
try {
|
|
237
|
-
domain = await __privateGet(this, _ethProvider).lookupAddress(address);
|
|
238
|
-
} catch (error) {
|
|
239
|
-
log(error);
|
|
240
|
-
return void 0;
|
|
241
|
-
}
|
|
242
|
-
if (!domain) {
|
|
243
|
-
return void 0;
|
|
244
|
-
}
|
|
245
|
-
let registeredAddress;
|
|
246
|
-
try {
|
|
247
|
-
registeredAddress = await __privateGet(this, _ethProvider).resolveName(domain);
|
|
248
|
-
} catch (error) {
|
|
249
|
-
log(error);
|
|
250
|
-
return void 0;
|
|
251
|
-
}
|
|
252
|
-
if (!registeredAddress) {
|
|
253
|
-
return void 0;
|
|
254
|
-
}
|
|
255
|
-
if (registeredAddress === ZERO_ADDRESS || registeredAddress === ZERO_X_ERROR_ADDRESS) {
|
|
256
|
-
return void 0;
|
|
257
|
-
}
|
|
258
|
-
if (toChecksumHexAddress(registeredAddress) !== address) {
|
|
259
|
-
return void 0;
|
|
260
|
-
}
|
|
261
|
-
this.update((state) => {
|
|
262
|
-
state.ensResolutionsByAddress[address] = toASCII(domain);
|
|
263
|
-
});
|
|
264
|
-
return domain;
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
_ethProvider = new WeakMap();
|
|
268
|
-
_getChainEnsSupport = new WeakSet();
|
|
269
|
-
getChainEnsSupport_fn = function(chainId) {
|
|
270
|
-
return Boolean(this.state.ensEntries[chainId]);
|
|
271
|
-
};
|
|
272
|
-
var EnsController_default = EnsController;
|
|
273
|
-
|
|
274
|
-
export {
|
|
275
|
-
DEFAULT_ENS_NETWORK_MAP,
|
|
276
|
-
EnsController,
|
|
277
|
-
EnsController_default
|
|
278
|
-
};
|
|
279
|
-
//# sourceMappingURL=chunk-QYSGUYCU.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/EnsController.ts"],"sourcesContent":["import type {\n ExternalProvider,\n JsonRpcFetchFunc,\n} from '@ethersproject/providers';\nimport { Web3Provider } from '@ethersproject/providers';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { ChainId } from '@metamask/controller-utils';\nimport {\n normalizeEnsName,\n isValidHexAddress,\n isSafeDynamicKey,\n toChecksumHexAddress,\n CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP,\n convertHexToDecimal,\n toHex,\n} from '@metamask/controller-utils';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n NetworkState,\n} from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createProjectLogger } from '@metamask/utils';\nimport { toASCII } from 'punycode/';\n\nconst log = createProjectLogger('ens-controller');\n\nconst name = 'EnsController';\n\n// Map of chainIDs and ENS registry contract addresses\nexport const DEFAULT_ENS_NETWORK_MAP: Record<number, Hex> = {\n // Mainnet\n 1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Ropsten\n 3: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Rinkeby\n 4: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Goerli\n 5: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Holesky\n 17000: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n // Sepolia\n 11155111: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n};\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\ntype AllowedActions = NetworkControllerGetNetworkClientByIdAction;\n\nexport type EnsControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n AllowedActions,\n never,\n AllowedActions['type'],\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 BaseController<\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.registriesByChainId - Map between chain IDs and ENS contract addresses.\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.onNetworkDidChange - Allows subscribing to network controller networkDidChange events.\n */\n constructor({\n registriesByChainId = DEFAULT_ENS_NETWORK_MAP,\n messenger,\n state = {},\n provider,\n onNetworkDidChange,\n }: {\n registriesByChainId?: Record<number, Hex>;\n messenger: EnsControllerMessenger;\n state?: Partial<EnsControllerState>;\n provider?: ExternalProvider | JsonRpcFetchFunc;\n onNetworkDidChange?: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n }) {\n super({\n name,\n metadata,\n messenger,\n state: {\n ...defaultState,\n ensEntries: Object.fromEntries(\n Object.entries(registriesByChainId).map(([chainId, address]) => [\n toHex(chainId),\n {\n '.': {\n address,\n chainId: toHex(chainId),\n ensName: '.',\n },\n },\n ]),\n ),\n ...state,\n },\n });\n\n if (provider && onNetworkDidChange) {\n onNetworkDidChange(({ selectedNetworkClientId }) => {\n this.resetState();\n const selectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n const currentChainId = selectedNetworkClient.configuration.chainId;\n\n if (this.#getChainEnsSupport(currentChainId)) {\n this.#ethProvider = new Web3Provider(provider, {\n chainId: convertHexToDecimal(currentChainId),\n name: CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP[\n currentChainId as ChainId\n ],\n ensAddress: registriesByChainId[parseInt(currentChainId, 16)],\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 !isSafeDynamicKey(chainId) ||\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 // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\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 the chain supports ENS.\n *\n * @param chainId - chain id.\n * @returns Boolean indicating if the chain supports ENS.\n */\n #getChainEnsSupport(chainId: Hex) {\n return Boolean(this.state.ensEntries[chainId]);\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"],"mappings":"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","names":[]}
|
package/dist/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var _chunkBG4UCEGMjs = require('./chunk-BG4UCEGM.js');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
exports.DEFAULT_ENS_NETWORK_MAP = _chunkBG4UCEGMjs.DEFAULT_ENS_NETWORK_MAP; exports.EnsController = _chunkBG4UCEGMjs.EnsController;
|
|
9
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|