@metamask-previews/name-controller 9.1.2-preview-abca9bcea → 10.0.0-preview-0a30e47
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 +17 -8
- package/dist/{NameController-method-action-types.d.mts → NameController-method-action-types.d.ts} +2 -2
- package/dist/NameController-method-action-types.d.ts.map +1 -0
- package/dist/{NameController-method-action-types.mjs → NameController-method-action-types.js} +1 -1
- package/dist/NameController-method-action-types.js.map +1 -0
- package/dist/{NameController.d.cts → NameController.d.ts} +7 -7
- package/dist/NameController.d.ts.map +1 -0
- package/dist/NameController.js +427 -0
- package/dist/NameController.js.map +1 -0
- package/dist/{constants.d.mts → constants.d.ts} +21 -21
- package/dist/constants.d.ts.map +1 -0
- package/dist/{constants.mjs → constants.js} +1 -1
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -0
- package/dist/providers/{ens.d.cts → ens.d.ts} +2 -2
- package/dist/providers/ens.d.ts.map +1 -0
- package/dist/providers/ens.js +48 -0
- package/dist/providers/ens.js.map +1 -0
- package/dist/providers/{etherscan.d.cts → etherscan.d.ts} +2 -2
- package/dist/providers/etherscan.d.ts.map +1 -0
- package/dist/providers/etherscan.js +112 -0
- package/dist/providers/etherscan.js.map +1 -0
- package/dist/providers/{lens.d.cts → lens.d.ts} +2 -2
- package/dist/providers/lens.d.ts.map +1 -0
- package/dist/providers/lens.js +60 -0
- package/dist/providers/lens.js.map +1 -0
- package/dist/providers/{token.d.cts → token.d.ts} +2 -2
- package/dist/providers/token.d.ts.map +1 -0
- package/dist/providers/token.js +51 -0
- package/dist/providers/token.js.map +1 -0
- package/dist/{types.d.mts → types.d.ts} +1 -1
- package/dist/types.d.ts.map +1 -0
- package/dist/{types.mjs → types.js} +1 -1
- package/dist/types.js.map +1 -0
- package/dist/{util.d.mts → util.d.ts} +1 -1
- package/dist/util.d.ts.map +1 -0
- package/dist/{util.mjs → util.js} +1 -1
- package/dist/util.js.map +1 -0
- package/package.json +15 -19
- package/dist/NameController-method-action-types.cjs +0 -7
- package/dist/NameController-method-action-types.cjs.map +0 -1
- package/dist/NameController-method-action-types.d.cts +0 -38
- package/dist/NameController-method-action-types.d.cts.map +0 -1
- package/dist/NameController-method-action-types.d.mts.map +0 -1
- package/dist/NameController-method-action-types.mjs.map +0 -1
- package/dist/NameController.cjs +0 -420
- package/dist/NameController.cjs.map +0 -1
- package/dist/NameController.d.cts.map +0 -1
- package/dist/NameController.d.mts +0 -108
- package/dist/NameController.d.mts.map +0 -1
- package/dist/NameController.mjs +0 -416
- package/dist/NameController.mjs.map +0 -1
- package/dist/constants.cjs +0 -111
- package/dist/constants.cjs.map +0 -1
- package/dist/constants.d.cts +0 -105
- package/dist/constants.d.cts.map +0 -1
- package/dist/constants.d.mts.map +0 -1
- package/dist/constants.mjs.map +0 -1
- package/dist/index.cjs +0 -23
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -8
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -8
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -7
- package/dist/index.mjs.map +0 -1
- package/dist/logger.cjs +0 -7
- package/dist/logger.cjs.map +0 -1
- package/dist/logger.d.cts +0 -5
- package/dist/logger.d.cts.map +0 -1
- package/dist/logger.d.mts +0 -5
- package/dist/logger.d.mts.map +0 -1
- package/dist/logger.mjs +0 -4
- package/dist/logger.mjs.map +0 -1
- package/dist/providers/ens.cjs +0 -65
- package/dist/providers/ens.cjs.map +0 -1
- package/dist/providers/ens.d.cts.map +0 -1
- package/dist/providers/ens.d.mts +0 -12
- package/dist/providers/ens.d.mts.map +0 -1
- package/dist/providers/ens.mjs +0 -61
- package/dist/providers/ens.mjs.map +0 -1
- package/dist/providers/etherscan.cjs +0 -128
- package/dist/providers/etherscan.cjs.map +0 -1
- package/dist/providers/etherscan.d.cts.map +0 -1
- package/dist/providers/etherscan.d.mts +0 -10
- package/dist/providers/etherscan.d.mts.map +0 -1
- package/dist/providers/etherscan.mjs +0 -124
- package/dist/providers/etherscan.mjs.map +0 -1
- package/dist/providers/lens.cjs +0 -77
- package/dist/providers/lens.cjs.map +0 -1
- package/dist/providers/lens.d.cts.map +0 -1
- package/dist/providers/lens.d.mts +0 -10
- package/dist/providers/lens.d.mts.map +0 -1
- package/dist/providers/lens.mjs +0 -73
- package/dist/providers/lens.mjs.map +0 -1
- package/dist/providers/token.cjs +0 -68
- package/dist/providers/token.cjs.map +0 -1
- package/dist/providers/token.d.cts.map +0 -1
- package/dist/providers/token.d.mts +0 -10
- package/dist/providers/token.d.mts.map +0 -1
- package/dist/providers/token.mjs +0 -64
- package/dist/providers/token.mjs.map +0 -1
- package/dist/types.cjs +0 -10
- package/dist/types.cjs.map +0 -1
- package/dist/types.d.cts +0 -77
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs.map +0 -1
- package/dist/util.cjs +0 -74
- package/dist/util.cjs.map +0 -1
- package/dist/util.d.cts +0 -35
- package/dist/util.d.cts.map +0 -1
- package/dist/util.d.mts.map +0 -1
- package/dist/util.mjs.map +0 -1
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
export declare const CHAIN_IDS: {
|
|
2
|
-
readonly MAINNET:
|
|
3
|
-
readonly GOERLI:
|
|
4
|
-
readonly BSC:
|
|
5
|
-
readonly BSC_TESTNET:
|
|
6
|
-
readonly OPTIMISM:
|
|
7
|
-
readonly OPTIMISM_SEPOLIA:
|
|
8
|
-
readonly POLYGON:
|
|
9
|
-
readonly POLYGON_TESTNET:
|
|
10
|
-
readonly AVALANCHE:
|
|
11
|
-
readonly AVALANCHE_TESTNET:
|
|
12
|
-
readonly FANTOM:
|
|
13
|
-
readonly FANTOM_TESTNET:
|
|
14
|
-
readonly SEPOLIA:
|
|
15
|
-
readonly LINEA_GOERLI:
|
|
16
|
-
readonly LINEA_SEPOLIA:
|
|
17
|
-
readonly LINEA_MAINNET:
|
|
18
|
-
readonly MOONBEAM:
|
|
19
|
-
readonly MOONBEAM_TESTNET:
|
|
20
|
-
readonly MOONRIVER:
|
|
21
|
-
readonly GNOSIS:
|
|
2
|
+
readonly MAINNET: '0x1';
|
|
3
|
+
readonly GOERLI: '0x5';
|
|
4
|
+
readonly BSC: '0x38';
|
|
5
|
+
readonly BSC_TESTNET: '0x61';
|
|
6
|
+
readonly OPTIMISM: '0xa';
|
|
7
|
+
readonly OPTIMISM_SEPOLIA: '0xaa37dc';
|
|
8
|
+
readonly POLYGON: '0x89';
|
|
9
|
+
readonly POLYGON_TESTNET: '0x13881';
|
|
10
|
+
readonly AVALANCHE: '0xa86a';
|
|
11
|
+
readonly AVALANCHE_TESTNET: '0xa869';
|
|
12
|
+
readonly FANTOM: '0xfa';
|
|
13
|
+
readonly FANTOM_TESTNET: '0xfa2';
|
|
14
|
+
readonly SEPOLIA: '0xaa36a7';
|
|
15
|
+
readonly LINEA_GOERLI: '0xe704';
|
|
16
|
+
readonly LINEA_SEPOLIA: '0xe705';
|
|
17
|
+
readonly LINEA_MAINNET: '0xe708';
|
|
18
|
+
readonly MOONBEAM: '0x504';
|
|
19
|
+
readonly MOONBEAM_TESTNET: '0x507';
|
|
20
|
+
readonly MOONRIVER: '0x505';
|
|
21
|
+
readonly GNOSIS: '0x64';
|
|
22
22
|
};
|
|
23
23
|
export declare const ETHERSCAN_SUPPORTED_NETWORKS: {
|
|
24
24
|
"0x5": {
|
|
@@ -102,4 +102,4 @@ export declare const ETHERSCAN_SUPPORTED_NETWORKS: {
|
|
|
102
102
|
subdomain: string;
|
|
103
103
|
};
|
|
104
104
|
};
|
|
105
|
-
//# sourceMappingURL=constants.d.
|
|
105
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;aACpB,OAAO,EAAE,KAAK;aACd,MAAM,EAAE,KAAK;aACb,GAAG,EAAE,MAAM;aACX,WAAW,EAAE,MAAM;aACnB,QAAQ,EAAE,KAAK;aACf,gBAAgB,EAAE,UAAU;aAC5B,OAAO,EAAE,MAAM;aACf,eAAe,EAAE,SAAS;aAC1B,SAAS,EAAE,QAAQ;aACnB,iBAAiB,EAAE,QAAQ;aAC3B,MAAM,EAAE,MAAM;aACd,cAAc,EAAE,OAAO;aACvB,OAAO,EAAE,UAAU;aACnB,YAAY,EAAE,QAAQ;aACtB,aAAa,EAAE,QAAQ;aACvB,aAAa,EAAE,QAAQ;aACvB,QAAQ,EAAE,OAAO;aACjB,gBAAgB,EAAE,OAAO;aACzB,SAAS,EAAE,OAAO;aAClB,MAAM,EAAE,MAAM;CACN,CAAC;AAKX,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;QAcrC,MAAM;QACN,SAAS;;;QAGT,MAAM;QACN,SAAS;;;;;;;;;;;QAWT,MAAM;QACN,SAAS;;;;;;;;;;;;;;;QAeT,MAAM;QACN,SAAS;;;;;;;QAOT,MAAM;QACN,SAAS;;;;;;;QAOT,MAAM;QACN,SAAS;;;QAGT,MAAM;QACN,SAAS;;;QAGT,MAAM;QACN,SAAS;;;QAGT,MAAM;QACN,SAAS;;;QAGT,MAAM;QACN,SAAS;;CAEZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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","sourcesContent":["// Below constants are intentionally copied from transaction-controller to avoid package dependency\n\nexport const CHAIN_IDS = {\n MAINNET: '0x1',\n GOERLI: '0x5',\n BSC: '0x38',\n BSC_TESTNET: '0x61',\n OPTIMISM: '0xa',\n OPTIMISM_SEPOLIA: '0xaa37dc',\n POLYGON: '0x89',\n POLYGON_TESTNET: '0x13881',\n AVALANCHE: '0xa86a',\n AVALANCHE_TESTNET: '0xa869',\n FANTOM: '0xfa',\n FANTOM_TESTNET: '0xfa2',\n SEPOLIA: '0xaa36a7',\n LINEA_GOERLI: '0xe704',\n LINEA_SEPOLIA: '0xe705',\n LINEA_MAINNET: '0xe708',\n MOONBEAM: '0x504',\n MOONBEAM_TESTNET: '0x507',\n MOONRIVER: '0x505',\n GNOSIS: '0x64',\n} as const;\n\nconst DEFAULT_ETHERSCAN_DOMAIN = 'etherscan.io';\nconst DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = 'api';\n\nexport const ETHERSCAN_SUPPORTED_NETWORKS = {\n [CHAIN_IDS.GOERLI]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`,\n },\n [CHAIN_IDS.MAINNET]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`,\n },\n [CHAIN_IDS.LINEA_GOERLI]: {\n domain: 'lineascan.build',\n subdomain: 'goerli',\n },\n [CHAIN_IDS.LINEA_SEPOLIA]: {\n domain: 'lineascan.build',\n subdomain: 'sepolia',\n },\n [CHAIN_IDS.LINEA_MAINNET]: {\n domain: 'lineascan.build',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC]: {\n domain: 'bscscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC_TESTNET]: {\n domain: 'bscscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.OPTIMISM]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-optimistic`,\n },\n [CHAIN_IDS.OPTIMISM_SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia-optimistic`,\n },\n [CHAIN_IDS.POLYGON]: {\n domain: 'polygonscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.POLYGON_TESTNET]: {\n domain: 'polygonscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-mumbai`,\n },\n [CHAIN_IDS.AVALANCHE]: {\n domain: 'snowtrace.io',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.AVALANCHE_TESTNET]: {\n domain: 'snowtrace.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.FANTOM]: {\n domain: 'ftmscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.FANTOM_TESTNET]: {\n domain: 'ftmscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.MOONBEAM]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbeam`,\n },\n [CHAIN_IDS.MOONBEAM_TESTNET]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbase`,\n },\n [CHAIN_IDS.MOONRIVER]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonriver`,\n },\n [CHAIN_IDS.GNOSIS]: {\n domain: 'gnosisscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-gnosis`,\n },\n};\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './NameController.js';
|
|
2
|
+
export type { NameControllerSetNameAction, NameControllerUpdateProposedNamesAction, } from './NameController-method-action-types.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
export * from './providers/ens.js';
|
|
5
|
+
export * from './providers/etherscan.js';
|
|
6
|
+
export * from './providers/token.js';
|
|
7
|
+
export * from './providers/lens.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,YAAY,EACV,2BAA2B,EAC3B,uCAAuC,GACxC,MAAM,yCAAyC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AAKpC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './NameController.js';\nexport type {\n NameControllerSetNameAction,\n NameControllerUpdateProposedNamesAction,\n} from './NameController-method-action-types.js';\nexport * from './types.js';\nexport * from './providers/ens.js';\nexport * from './providers/etherscan.js';\nexport * from './providers/token.js';\nexport * from './providers/lens.js';\n"]}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,eAAO,MAAM,aAAa,0BAAyC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,CAAC","sourcesContent":["import { createProjectLogger, createModuleLogger } from '@metamask/utils';\n\nexport const projectLogger = createProjectLogger('name-controller');\n\nexport { createModuleLogger };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from
|
|
1
|
+
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from '../types.js';
|
|
2
2
|
export type ReverseLookupCallback = (address: string, chainId: string) => Promise<string>;
|
|
3
3
|
export declare class ENSNameProvider implements NameProvider {
|
|
4
4
|
#private;
|
|
@@ -9,4 +9,4 @@ export declare class ENSNameProvider implements NameProvider {
|
|
|
9
9
|
getMetadata(): NameProviderMetadata;
|
|
10
10
|
getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;
|
|
11
11
|
}
|
|
12
|
-
//# sourceMappingURL=ens.d.
|
|
12
|
+
//# sourceMappingURL=ens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ens.d.ts","sourceRoot":"","sources":["../../src/providers/ens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,CAAC,CAAC;AAOrB,qBAAa,eAAgB,YAAW,YAAY;;IAKlD,YAAY,EACV,SAAS,EACT,aAAa,GACd,EAAE;QACD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,aAAa,EAAE,qBAAqB,CAAC;KACtC,EAGA;IAED,WAAW,IAAI,oBAAoB,CAKlC;IAEK,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAgC7B;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { projectLogger, createModuleLogger } from '../logger.js';
|
|
2
|
+
import { NameType } from '../types.js';
|
|
3
|
+
const ID = 'ens';
|
|
4
|
+
const LABEL = 'Ethereum Name Service (ENS)';
|
|
5
|
+
const log = createModuleLogger(projectLogger, 'ens');
|
|
6
|
+
export class ENSNameProvider {
|
|
7
|
+
#isEnabled;
|
|
8
|
+
#reverseLookup;
|
|
9
|
+
constructor({ isEnabled, reverseLookup, }) {
|
|
10
|
+
this.#isEnabled = isEnabled || (() => true);
|
|
11
|
+
this.#reverseLookup = reverseLookup;
|
|
12
|
+
}
|
|
13
|
+
getMetadata() {
|
|
14
|
+
return {
|
|
15
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
16
|
+
sourceLabels: { [ID]: LABEL },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async getProposedNames(request) {
|
|
20
|
+
if (!this.#isEnabled()) {
|
|
21
|
+
log('Skipping request as disabled');
|
|
22
|
+
return {
|
|
23
|
+
results: {
|
|
24
|
+
[ID]: {
|
|
25
|
+
proposedNames: [],
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const { value, variation: chainId } = request;
|
|
31
|
+
log('Invoking callback', { value, chainId });
|
|
32
|
+
try {
|
|
33
|
+
const proposedName = await this.#reverseLookup(value, chainId);
|
|
34
|
+
const proposedNames = proposedName ? [proposedName] : [];
|
|
35
|
+
log('New proposed names', proposedNames);
|
|
36
|
+
return {
|
|
37
|
+
results: {
|
|
38
|
+
[ID]: { proposedNames },
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
log('Request failed', error);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../src/providers/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOjE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC,MAAM,EAAE,GAAG,KAAK,CAAC;AACjB,MAAM,KAAK,GAAG,6BAA6B,CAAC;AAE5C,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAErD,MAAM,OAAO,eAAe;IACjB,UAAU,CAAgB;IAE1B,cAAc,CAAwB;IAE/C,YAAY,EACV,SAAS,EACT,aAAa,GAId;QACC,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAA4B;QAE5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAE9C,GAAG,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzD,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE;iBACxB;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF","sourcesContent":["import { projectLogger, createModuleLogger } from '../logger.js';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types.js';\nimport { NameType } from '../types.js';\n\nexport type ReverseLookupCallback = (\n address: string,\n chainId: string,\n) => Promise<string>;\n\nconst ID = 'ens';\nconst LABEL = 'Ethereum Name Service (ENS)';\n\nconst log = createModuleLogger(projectLogger, 'ens');\n\nexport class ENSNameProvider implements NameProvider {\n readonly #isEnabled: () => boolean;\n\n readonly #reverseLookup: ReverseLookupCallback;\n\n constructor({\n isEnabled,\n reverseLookup,\n }: {\n isEnabled?: () => boolean;\n reverseLookup: ReverseLookupCallback;\n }) {\n this.#isEnabled = isEnabled || (() => true);\n this.#reverseLookup = reverseLookup;\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const { value, variation: chainId } = request;\n\n log('Invoking callback', { value, chainId });\n\n try {\n const proposedName = await this.#reverseLookup(value, chainId);\n const proposedNames = proposedName ? [proposedName] : [];\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: { proposedNames },\n },\n };\n } catch (error) {\n log('Request failed', error);\n throw error;\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from
|
|
1
|
+
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from '../types.js';
|
|
2
2
|
export declare class EtherscanNameProvider implements NameProvider {
|
|
3
3
|
#private;
|
|
4
4
|
constructor({ isEnabled }?: {
|
|
@@ -7,4 +7,4 @@ export declare class EtherscanNameProvider implements NameProvider {
|
|
|
7
7
|
getMetadata(): NameProviderMetadata;
|
|
8
8
|
getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=etherscan.d.
|
|
10
|
+
//# sourceMappingURL=etherscan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"etherscan.d.ts","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAgCrB,qBAAa,qBAAsB,YAAW,YAAY;;IAOxD,YAAY,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO,EAE5D;IAED,WAAW,IAAI,oBAAoB,CAKlC;IAEK,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAyE7B;CAyCF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Mutex } from 'async-mutex';
|
|
2
|
+
import { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants.js';
|
|
3
|
+
import { createModuleLogger, projectLogger } from '../logger.js';
|
|
4
|
+
import { NameType } from '../types.js';
|
|
5
|
+
import { handleFetch, assertIsError } from '../util.js';
|
|
6
|
+
const ID = 'etherscan';
|
|
7
|
+
const LABEL = 'Etherscan (Verified Contract Name)';
|
|
8
|
+
const RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds
|
|
9
|
+
const RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;
|
|
10
|
+
const log = createModuleLogger(projectLogger, 'etherscan');
|
|
11
|
+
export class EtherscanNameProvider {
|
|
12
|
+
#isEnabled;
|
|
13
|
+
#lastRequestTime = 0;
|
|
14
|
+
#mutex = new Mutex();
|
|
15
|
+
constructor({ isEnabled } = {}) {
|
|
16
|
+
this.#isEnabled = isEnabled || (() => true);
|
|
17
|
+
}
|
|
18
|
+
getMetadata() {
|
|
19
|
+
return {
|
|
20
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
21
|
+
sourceLabels: { [ID]: LABEL },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async getProposedNames(request) {
|
|
25
|
+
if (!this.#isEnabled()) {
|
|
26
|
+
log('Skipping request as disabled');
|
|
27
|
+
return {
|
|
28
|
+
results: {
|
|
29
|
+
[ID]: {
|
|
30
|
+
proposedNames: [],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const releaseLock = await this.#mutex.acquire();
|
|
36
|
+
try {
|
|
37
|
+
const { value, variation: chainId } = request;
|
|
38
|
+
const time = Date.now();
|
|
39
|
+
const timeSinceLastRequest = time - this.#lastRequestTime;
|
|
40
|
+
if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {
|
|
41
|
+
log('Skipping request to avoid rate limit');
|
|
42
|
+
return {
|
|
43
|
+
results: {
|
|
44
|
+
[ID]: {
|
|
45
|
+
updateDelay: RATE_LIMIT_UPDATE_DELAY,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const url = this.#getUrl(chainId, {
|
|
51
|
+
module: 'contract',
|
|
52
|
+
action: 'getsourcecode',
|
|
53
|
+
address: value,
|
|
54
|
+
});
|
|
55
|
+
const { responseData, error } = await this.#sendRequest(url);
|
|
56
|
+
if (error) {
|
|
57
|
+
log('Request failed', error);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
if (responseData?.message === 'NOTOK') {
|
|
61
|
+
log('Request warning', responseData.result);
|
|
62
|
+
return {
|
|
63
|
+
results: {
|
|
64
|
+
[ID]: {
|
|
65
|
+
updateDelay: RATE_LIMIT_UPDATE_DELAY,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const results = responseData?.result ?? [];
|
|
71
|
+
const proposedNames = results.map((result) => result.ContractName);
|
|
72
|
+
log('New proposed names', proposedNames);
|
|
73
|
+
return {
|
|
74
|
+
results: {
|
|
75
|
+
[ID]: {
|
|
76
|
+
proposedNames,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
releaseLock();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async #sendRequest(url) {
|
|
86
|
+
try {
|
|
87
|
+
log('Sending request', url);
|
|
88
|
+
const responseData = (await handleFetch(url));
|
|
89
|
+
return { responseData };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
assertIsError(error);
|
|
93
|
+
return { error };
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
this.#lastRequestTime = Date.now();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
#getUrl(chainId, params) {
|
|
100
|
+
const networkInfo = ETHERSCAN_SUPPORTED_NETWORKS[chainId];
|
|
101
|
+
if (!networkInfo) {
|
|
102
|
+
throw new Error(`Etherscan does not support chain with ID: ${chainId}`);
|
|
103
|
+
}
|
|
104
|
+
let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;
|
|
105
|
+
Object.keys(params).forEach((key, index) => {
|
|
106
|
+
const value = params[key];
|
|
107
|
+
url += `${index === 0 ? '?' : '&'}${key}=${value}`;
|
|
108
|
+
});
|
|
109
|
+
return url;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=etherscan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"etherscan.js","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from 'async-mutex';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants.js';\nimport { createModuleLogger, projectLogger } from '../logger.js';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types.js';\nimport { NameType } from '../types.js';\nimport { handleFetch, assertIsError } from '../util.js';\n\nconst ID = 'etherscan';\nconst LABEL = 'Etherscan (Verified Contract Name)';\nconst RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds\nconst RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;\n\nconst log = createModuleLogger(projectLogger, 'etherscan');\n\ntype EtherscanGetSourceCodeResponse = {\n status: '1' | '0';\n message: string;\n result: [\n {\n SourceCode: string;\n ABI: string;\n ContractName: string;\n CompilerVersion: string;\n OptimizationUsed: string;\n Runs: string;\n ConstructorArguments: string;\n Library: string;\n LicenseType: string;\n Proxy: string;\n Implementation: string;\n SwarmSource: string;\n },\n ];\n};\n\nexport class EtherscanNameProvider implements NameProvider {\n readonly #isEnabled: () => boolean;\n\n #lastRequestTime = 0;\n\n readonly #mutex = new Mutex();\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const releaseLock = await this.#mutex.acquire();\n\n try {\n const { value, variation: chainId } = request;\n\n const time = Date.now();\n const timeSinceLastRequest = time - this.#lastRequestTime;\n\n if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {\n log('Skipping request to avoid rate limit');\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const url = this.#getUrl(chainId, {\n module: 'contract',\n action: 'getsourcecode',\n address: value,\n });\n\n const { responseData, error } = await this.#sendRequest(url);\n\n if (error) {\n log('Request failed', error);\n throw error;\n }\n\n if (responseData?.message === 'NOTOK') {\n log('Request warning', responseData.result);\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const results = responseData?.result ?? [];\n const proposedNames = results.map((result) => result.ContractName);\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } finally {\n releaseLock();\n }\n }\n\n async #sendRequest(url: string): Promise<{\n responseData?: EtherscanGetSourceCodeResponse;\n error?: Error;\n }> {\n try {\n log('Sending request', url);\n\n const responseData = (await handleFetch(\n url,\n )) as EtherscanGetSourceCodeResponse;\n\n return { responseData };\n } catch (error) {\n assertIsError(error);\n return { error };\n } finally {\n this.#lastRequestTime = Date.now();\n }\n }\n\n #getUrl(chainId: string, params: Record<string, string | undefined>): string {\n type SupportedChainId = keyof typeof ETHERSCAN_SUPPORTED_NETWORKS;\n\n const networkInfo =\n ETHERSCAN_SUPPORTED_NETWORKS[chainId as SupportedChainId];\n\n if (!networkInfo) {\n throw new Error(`Etherscan does not support chain with ID: ${chainId}`);\n }\n\n let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;\n\n Object.keys(params).forEach((key, index) => {\n const value = params[key];\n url += `${index === 0 ? '?' : '&'}${key}=${value}`;\n });\n\n return url;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from
|
|
1
|
+
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from '../types.js';
|
|
2
2
|
export declare class LensNameProvider implements NameProvider {
|
|
3
3
|
#private;
|
|
4
4
|
constructor({ isEnabled }?: {
|
|
@@ -7,4 +7,4 @@ export declare class LensNameProvider implements NameProvider {
|
|
|
7
7
|
getMetadata(): NameProviderMetadata;
|
|
8
8
|
getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=lens.d.
|
|
10
|
+
//# sourceMappingURL=lens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lens.d.ts","sourceRoot":"","sources":["../../src/providers/lens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AA6BrB,qBAAa,gBAAiB,YAAW,YAAY;;IAGnD,YAAY,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO,EAE5D;IAED,WAAW,IAAI,oBAAoB,CAKlC;IAEK,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAyC7B;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createModuleLogger, projectLogger } from '../logger.js';
|
|
2
|
+
import { NameType } from '../types.js';
|
|
3
|
+
import { graphQL } from '../util.js';
|
|
4
|
+
const ID = 'lens';
|
|
5
|
+
const LABEL = 'Lens Protocol';
|
|
6
|
+
const LENS_URL = `https://api.lens.dev`;
|
|
7
|
+
const QUERY = `
|
|
8
|
+
query HandlesForAddress($address: EthereumAddress!) {
|
|
9
|
+
profiles(request: { ownedBy: [$address] }) {
|
|
10
|
+
items {
|
|
11
|
+
handle
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}`;
|
|
15
|
+
const log = createModuleLogger(projectLogger, 'lens');
|
|
16
|
+
export class LensNameProvider {
|
|
17
|
+
#isEnabled;
|
|
18
|
+
constructor({ isEnabled } = {}) {
|
|
19
|
+
this.#isEnabled = isEnabled || (() => true);
|
|
20
|
+
}
|
|
21
|
+
getMetadata() {
|
|
22
|
+
return {
|
|
23
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
24
|
+
sourceLabels: { [ID]: LABEL },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async getProposedNames(request) {
|
|
28
|
+
if (!this.#isEnabled()) {
|
|
29
|
+
log('Skipping request as disabled');
|
|
30
|
+
return {
|
|
31
|
+
results: {
|
|
32
|
+
[ID]: {
|
|
33
|
+
proposedNames: [],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const { value } = request;
|
|
39
|
+
const variables = { address: value };
|
|
40
|
+
log('Sending request', { variables });
|
|
41
|
+
try {
|
|
42
|
+
const responseData = await graphQL(LENS_URL, QUERY, variables);
|
|
43
|
+
const profiles = responseData?.profiles?.items ?? [];
|
|
44
|
+
const proposedNames = profiles.map((profile) => profile.handle);
|
|
45
|
+
log('New proposed names', proposedNames);
|
|
46
|
+
return {
|
|
47
|
+
results: {
|
|
48
|
+
[ID]: {
|
|
49
|
+
proposedNames,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
log('Request failed', error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=lens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lens.js","sourceRoot":"","sources":["../../src/providers/lens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOjE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,EAAE,GAAG,MAAM,CAAC;AAClB,MAAM,KAAK,GAAG,eAAe,CAAC;AAC9B,MAAM,QAAQ,GAAG,sBAAsB,CAAC;AAExC,MAAM,KAAK,GAAG;;;;;;;EAOZ,CAAC;AAEH,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAYtD,MAAM,OAAO,gBAAgB;IAClB,UAAU,CAAgB;IAEnC,YAAY,EAAE,SAAS,EAAE,GAAkC,EAAE;QAC3D,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAA4B;QAE5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAC1B,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAErC,GAAG,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,QAAQ,EACR,KAAK,EACL,SAAS,CACV,CAAC;YAEF,MAAM,QAAQ,GAAG,YAAY,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEhE,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF","sourcesContent":["import { createModuleLogger, projectLogger } from '../logger.js';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types.js';\nimport { NameType } from '../types.js';\nimport { graphQL } from '../util.js';\n\nconst ID = 'lens';\nconst LABEL = 'Lens Protocol';\nconst LENS_URL = `https://api.lens.dev`;\n\nconst QUERY = `\nquery HandlesForAddress($address: EthereumAddress!) {\n profiles(request: { ownedBy: [$address] }) {\n items {\n handle\n }\n }\n}`;\n\nconst log = createModuleLogger(projectLogger, 'lens');\n\ntype LensResponse = {\n profiles: {\n items: [\n {\n handle: string;\n },\n ];\n };\n};\n\nexport class LensNameProvider implements NameProvider {\n readonly #isEnabled: () => boolean;\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const { value } = request;\n const variables = { address: value };\n\n log('Sending request', { variables });\n\n try {\n const responseData = await graphQL<LensResponse>(\n LENS_URL,\n QUERY,\n variables,\n );\n\n const profiles = responseData?.profiles?.items ?? [];\n const proposedNames = profiles.map((profile) => profile.handle);\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } catch (error) {\n log('Request failed', error);\n throw error;\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from
|
|
1
|
+
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from '../types.js';
|
|
2
2
|
export declare class TokenNameProvider implements NameProvider {
|
|
3
3
|
#private;
|
|
4
4
|
constructor({ isEnabled }?: {
|
|
@@ -7,4 +7,4 @@ export declare class TokenNameProvider implements NameProvider {
|
|
|
7
7
|
getMetadata(): NameProviderMetadata;
|
|
8
8
|
getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=token.d.
|
|
10
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/providers/token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AASrB,qBAAa,iBAAkB,YAAW,YAAY;;IAGpD,YAAY,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO,EAE5D;IAED,WAAW,IAAI,oBAAoB,CAKlC;IAEK,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAoC7B;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createModuleLogger, projectLogger } from '../logger.js';
|
|
2
|
+
import { NameType } from '../types.js';
|
|
3
|
+
import { handleFetch } from '../util.js';
|
|
4
|
+
const ID = 'token';
|
|
5
|
+
const LABEL = 'Blockchain (Token Name)';
|
|
6
|
+
const log = createModuleLogger(projectLogger, 'token');
|
|
7
|
+
export class TokenNameProvider {
|
|
8
|
+
#isEnabled;
|
|
9
|
+
constructor({ isEnabled } = {}) {
|
|
10
|
+
this.#isEnabled = isEnabled || (() => true);
|
|
11
|
+
}
|
|
12
|
+
getMetadata() {
|
|
13
|
+
return {
|
|
14
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
15
|
+
sourceLabels: { [ID]: LABEL },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async getProposedNames(request) {
|
|
19
|
+
if (!this.#isEnabled()) {
|
|
20
|
+
log('Skipping request as disabled');
|
|
21
|
+
return {
|
|
22
|
+
results: {
|
|
23
|
+
[ID]: {
|
|
24
|
+
proposedNames: [],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const { value, variation: chainId } = request;
|
|
30
|
+
const url = `https://token.api.cx.metamask.io/token/${chainId}?address=${value}`;
|
|
31
|
+
log('Sending request', url);
|
|
32
|
+
try {
|
|
33
|
+
const responseData = await handleFetch(url);
|
|
34
|
+
const proposedName = responseData.name;
|
|
35
|
+
const proposedNames = proposedName ? [proposedName] : [];
|
|
36
|
+
log('New proposed names', proposedNames);
|
|
37
|
+
return {
|
|
38
|
+
results: {
|
|
39
|
+
[ID]: {
|
|
40
|
+
proposedNames,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
log('Request failed', error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/providers/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOjE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,EAAE,GAAG,OAAO,CAAC;AACnB,MAAM,KAAK,GAAG,yBAAyB,CAAC;AAExC,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AAEvD,MAAM,OAAO,iBAAiB;IACnB,UAAU,CAAgB;IAEnC,YAAY,EAAE,SAAS,EAAE,GAAkC,EAAE;QAC3D,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAA4B;QAE5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAC9C,MAAM,GAAG,GAAG,0CAA0C,OAAO,YAAY,KAAK,EAAE,CAAC;QAEjF,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;YACvC,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzD,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF","sourcesContent":["import { createModuleLogger, projectLogger } from '../logger.js';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types.js';\nimport { NameType } from '../types.js';\nimport { handleFetch } from '../util.js';\n\nconst ID = 'token';\nconst LABEL = 'Blockchain (Token Name)';\n\nconst log = createModuleLogger(projectLogger, 'token');\n\nexport class TokenNameProvider implements NameProvider {\n readonly #isEnabled: () => boolean;\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const { value, variation: chainId } = request;\n const url = `https://token.api.cx.metamask.io/token/${chainId}?address=${value}`;\n\n log('Sending request', url);\n\n try {\n const responseData = await handleFetch(url);\n const proposedName = responseData.name;\n const proposedNames = proposedName ? [proposedName] : [];\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } catch (error) {\n log('Request failed', error);\n throw error;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,oBAAY,QAAQ;IAClB,0CAA0C;IAC1C,gBAAgB,oBAAoB;CACrC;AAED,wCAAwC;AACxC,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtC;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,mBAAmB,GAAG;IAChC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,wCAAwC;IACxC,IAAI,EAAE,QAAQ,CAAC;IAEf,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oGAAoG;AACpG,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAElD;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,WAAW,IAAI,oBAAoB,CAAC;IAEpC;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC7E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,0CAA0C;IAC1C,gDAAoC,CAAA;AACtC,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB","sourcesContent":["/** The name types supported by the NameController. */\nexport enum NameType {\n /** The address of an Ethereum account. */\n ETHEREUM_ADDRESS = 'ethereumAddress',\n}\n\n/** The metadata for a name provider. */\nexport type NameProviderMetadata = {\n /**\n * IDs for each alternate source of proposed names.\n * Keyed by the name type.\n */\n sourceIds: Record<NameType, string[]>;\n\n /**\n * Friendly labels to describe each source of proposed names.\n * Keyed by the source ID.\n */\n sourceLabels: Record<string, string>;\n};\n\n/** The request data to get proposed names from a name provider. */\nexport type NameProviderRequest = {\n /** The optional list of source IDs to get proposed names from. */\n sourceIds?: string[];\n\n /** The type of name being requested. */\n type: NameType;\n\n /** The raw value to get proposed names for. */\n value: string;\n\n /**\n * The variation of the raw value to get proposed names for.\n * For example, the chain ID if the raw value is an Ethereum address.\n */\n variation: string;\n};\n\n/** The resulting data after requesting proposed names from a name provider, for a single source. */\nexport type NameProviderSourceResult = {\n /**\n * The array of proposed names from the source.\n * Undefined if there is an error.\n */\n proposedNames?: string[];\n\n /**\n * The delay in seconds before the next request to the source should be made.\n * Can be used to avoid rate limiting for example.\n */\n updateDelay?: number;\n\n /**\n * An error that occurred while fetching the proposed names from the source.\n * Undefined if there was no error.\n */\n error?: unknown;\n};\n\n/** The resulting data after requesting proposed names from a name provider. */\nexport type NameProviderResult = {\n /**\n * The resulting data from each alternate source of proposed names supported by the name provider.\n * Keyed by the source ID.\n */\n results: Record<string, NameProviderSourceResult>;\n\n /**\n * An error that occurred while fetching the proposed names that was not specific to a single source.\n * Undefined if there was no error.\n */\n error?: unknown;\n};\n\n/** An object capable of proposing friendly names for a raw value of a given type. */\nexport type NameProvider = {\n /**\n * Returns metadata about the name provider.\n */\n getMetadata(): NameProviderMetadata;\n\n /**\n * Returns proposed names for the given value and request data.\n *\n * @param request - The request data including the value to propose names for.\n */\n getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;\n};\n"]}
|
|
@@ -32,4 +32,4 @@ export declare function successfulFetch(request: string, options?: RequestInit):
|
|
|
32
32
|
* @throws Throws an error wrapping the given value if it's not an error.
|
|
33
33
|
*/
|
|
34
34
|
export declare function assertIsError(error: unknown): asserts error is Error;
|
|
35
|
-
//# sourceMappingURL=util.d.
|
|
35
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAGb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CAeZ;AAID;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,gBAIvE;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,qBAQ3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAKpE"}
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAW,EACX,KAAa;AACb,gCAAgC;AAChC,8DAA8D;AAC9D,SAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,KAAK;QACL,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI;QACJ,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,OAAO,QAAQ,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,+FAA+F;AAE/F;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,OAAqB;IACtE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,OAAqB;IAC1E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,MAAM,kBAAkB,OAAO,GAAG,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,KAAK,GAAG,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["/**\n * Execute a GraphQL query.\n *\n * @param url - GraphQL endpoint URL.\n * @param query - GraphQL query.\n * @param variables - GraphQL variables.\n */\nexport async function graphQL<T>(\n url: string,\n query: string,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n variables: Record<string, any>,\n): Promise<T> {\n const body = JSON.stringify({\n query,\n variables,\n });\n\n const response = await handleFetch(url, {\n body,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n return response?.data;\n}\n\n// Below functions are intentionally copied from controller-utils to avoid a package dependency\n\n/**\n * Execute fetch and return object response.\n *\n * @param request - The request information.\n * @param options - The fetch options.\n * @returns The fetch response JSON data.\n */\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await successfulFetch(request, options);\n const object = await response.json();\n return object;\n}\n\n/**\n * Execute fetch and verify that the response was successful.\n *\n * @param request - Request information.\n * @param options - Fetch options.\n * @returns The fetch response.\n */\nexport async function successfulFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options);\n if (!response.ok) {\n throw new Error(\n `Fetch failed with status '${response.status}' for request '${request}'`,\n );\n }\n return response;\n}\n\n/**\n * Assert that a value is an error. If it's not an error, throw an\n * error that wraps the given value.\n *\n * TODO: Migrate this to @metamask/utils\n *\n * @param error - The value that we expect to be an error.\n * @throws Throws an error wrapping the given value if it's not an error.\n */\nexport function assertIsError(error: unknown): asserts error is Error {\n if (error instanceof Error) {\n return;\n }\n throw new Error(`Invalid error of type '${typeof error}'`);\n}\n"]}
|