@metamask/name-controller 7.0.0 → 8.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 +35 -1
- package/dist/NameController.cjs +410 -0
- package/dist/NameController.cjs.map +1 -0
- package/dist/{types/NameController.d.ts → NameController.d.cts} +5 -5
- package/dist/NameController.d.cts.map +1 -0
- package/dist/NameController.d.mts +106 -0
- package/dist/NameController.d.mts.map +1 -0
- package/dist/NameController.mjs +404 -13
- package/dist/NameController.mjs.map +1 -1
- package/dist/constants.cjs +111 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/{types/constants.d.ts → constants.d.cts} +1 -1
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.mts +105 -0
- package/dist/constants.d.mts.map +1 -0
- package/dist/constants.mjs +106 -8
- package/dist/constants.mjs.map +1 -1
- package/dist/index.cjs +23 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +6 -36
- package/dist/index.mjs.map +1 -1
- package/dist/logger.cjs +7 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/{types/logger.d.ts → logger.d.cts} +2 -2
- package/dist/logger.d.cts.map +1 -0
- package/dist/logger.d.mts +5 -0
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +3 -9
- package/dist/logger.mjs.map +1 -1
- package/dist/providers/ens.cjs +65 -0
- package/dist/providers/ens.cjs.map +1 -0
- package/dist/{types/providers/ens.d.ts → providers/ens.d.cts} +2 -2
- package/dist/providers/ens.d.cts.map +1 -0
- package/dist/providers/ens.d.mts +12 -0
- package/dist/providers/ens.d.mts.map +1 -0
- package/dist/providers/ens.mjs +59 -8
- package/dist/providers/ens.mjs.map +1 -1
- package/dist/providers/etherscan.cjs +130 -0
- package/dist/providers/etherscan.cjs.map +1 -0
- package/dist/{types/providers/etherscan.d.ts → providers/etherscan.d.cts} +2 -2
- package/dist/providers/etherscan.d.cts.map +1 -0
- package/dist/providers/etherscan.d.mts +10 -0
- package/dist/providers/etherscan.d.mts.map +1 -0
- package/dist/providers/etherscan.mjs +124 -10
- package/dist/providers/etherscan.mjs.map +1 -1
- package/dist/providers/lens.cjs +77 -0
- package/dist/providers/lens.cjs.map +1 -0
- package/dist/{types/providers/lens.d.ts → providers/lens.d.cts} +2 -2
- package/dist/providers/lens.d.cts.map +1 -0
- package/dist/providers/lens.d.mts +10 -0
- package/dist/providers/lens.d.mts.map +1 -0
- package/dist/providers/lens.mjs +71 -9
- package/dist/providers/lens.mjs.map +1 -1
- package/dist/providers/token.cjs +68 -0
- package/dist/providers/token.cjs.map +1 -0
- package/dist/{types/providers/token.d.ts → providers/token.d.cts} +2 -2
- package/dist/providers/token.d.cts.map +1 -0
- package/dist/providers/token.d.mts +10 -0
- package/dist/providers/token.d.mts.map +1 -0
- package/dist/providers/token.mjs +62 -9
- package/dist/providers/token.mjs.map +1 -1
- package/dist/types.cjs +12 -0
- package/dist/types.cjs.map +1 -0
- package/dist/{types/types.d.ts → types.d.cts} +1 -1
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +77 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +8 -7
- package/dist/types.mjs.map +1 -1
- package/dist/util.cjs +76 -0
- package/dist/util.cjs.map +1 -0
- package/dist/{types/util.d.ts → util.d.cts} +1 -1
- package/dist/util.d.cts.map +1 -0
- package/dist/util.d.mts +35 -0
- package/dist/util.d.mts.map +1 -0
- package/dist/util.mjs +68 -13
- package/dist/util.mjs.map +1 -1
- package/package.json +22 -16
- package/dist/NameController.js +0 -15
- package/dist/NameController.js.map +0 -1
- package/dist/chunk-6AVJOVIX.mjs +0 -519
- package/dist/chunk-6AVJOVIX.mjs.map +0 -1
- package/dist/chunk-6W3DEAGA.mjs +0 -10
- package/dist/chunk-6W3DEAGA.mjs.map +0 -1
- package/dist/chunk-BLG7EQAA.mjs +0 -66
- package/dist/chunk-BLG7EQAA.mjs.map +0 -1
- package/dist/chunk-DSVOMJX6.mjs +0 -43
- package/dist/chunk-DSVOMJX6.mjs.map +0 -1
- package/dist/chunk-JHYBLEC5.js +0 -43
- package/dist/chunk-JHYBLEC5.js.map +0 -1
- package/dist/chunk-L244TFFU.mjs +0 -9
- package/dist/chunk-L244TFFU.mjs.map +0 -1
- package/dist/chunk-PL2KMW2Y.js +0 -519
- package/dist/chunk-PL2KMW2Y.js.map +0 -1
- package/dist/chunk-PL7IXD33.js +0 -10
- package/dist/chunk-PL7IXD33.js.map +0 -1
- package/dist/chunk-QBR7BSWB.js +0 -9
- package/dist/chunk-QBR7BSWB.js.map +0 -1
- package/dist/chunk-RYIUDJOI.js +0 -66
- package/dist/chunk-RYIUDJOI.js.map +0 -1
- package/dist/chunk-SHTSUEYM.mjs +0 -113
- package/dist/chunk-SHTSUEYM.mjs.map +0 -1
- package/dist/chunk-ST2ADXPO.js +0 -67
- package/dist/chunk-ST2ADXPO.js.map +0 -1
- package/dist/chunk-UALYD4SG.mjs +0 -138
- package/dist/chunk-UALYD4SG.mjs.map +0 -1
- package/dist/chunk-W64QIPGB.js +0 -80
- package/dist/chunk-W64QIPGB.js.map +0 -1
- package/dist/chunk-WHDNAWDA.mjs +0 -67
- package/dist/chunk-WHDNAWDA.mjs.map +0 -1
- package/dist/chunk-WSOVXHAC.mjs +0 -80
- package/dist/chunk-WSOVXHAC.mjs.map +0 -1
- package/dist/chunk-X55IV67M.js +0 -138
- package/dist/chunk-X55IV67M.js.map +0 -1
- package/dist/chunk-XQXO5QPM.js +0 -113
- package/dist/chunk-XQXO5QPM.js.map +0 -1
- package/dist/chunk-XUI43LEZ.mjs +0 -30
- package/dist/chunk-XUI43LEZ.mjs.map +0 -1
- package/dist/chunk-Z4BLTVTB.js +0 -30
- package/dist/chunk-Z4BLTVTB.js.map +0 -1
- package/dist/constants.js +0 -10
- package/dist/constants.js.map +0 -1
- package/dist/index.js +0 -37
- package/dist/index.js.map +0 -1
- package/dist/logger.js +0 -10
- package/dist/logger.js.map +0 -1
- package/dist/providers/ens.js +0 -10
- package/dist/providers/ens.js.map +0 -1
- package/dist/providers/etherscan.js +0 -12
- package/dist/providers/etherscan.js.map +0 -1
- package/dist/providers/lens.js +0 -11
- package/dist/providers/lens.js.map +0 -1
- package/dist/providers/token.js +0 -11
- package/dist/providers/token.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/types/NameController.d.ts.map +0 -1
- package/dist/types/constants.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -7
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/logger.d.ts.map +0 -1
- package/dist/types/providers/ens.d.ts.map +0 -1
- package/dist/types/providers/etherscan.d.ts.map +0 -1
- package/dist/types/providers/lens.d.ts.map +0 -1
- package/dist/types/providers/token.d.ts.map +0 -1
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/util.d.ts.map +0 -1
- package/dist/types.js +0 -8
- package/dist/types.js.map +0 -1
- package/dist/util.js +0 -14
- package/dist/util.js.map +0 -1
package/dist/providers/ens.mjs
CHANGED
|
@@ -1,10 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import "../chunk-XUI43LEZ.mjs";
|
|
7
|
-
export {
|
|
8
|
-
ENSNameProvider
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
9
6
|
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _ENSNameProvider_isEnabled, _ENSNameProvider_reverseLookup;
|
|
13
|
+
import { projectLogger, createModuleLogger } from "../logger.mjs";
|
|
14
|
+
import { NameType } from "../types.mjs";
|
|
15
|
+
const ID = 'ens';
|
|
16
|
+
const LABEL = 'Ethereum Name Service (ENS)';
|
|
17
|
+
const log = createModuleLogger(projectLogger, 'ens');
|
|
18
|
+
export class ENSNameProvider {
|
|
19
|
+
constructor({ isEnabled, reverseLookup, }) {
|
|
20
|
+
_ENSNameProvider_isEnabled.set(this, void 0);
|
|
21
|
+
_ENSNameProvider_reverseLookup.set(this, void 0);
|
|
22
|
+
__classPrivateFieldSet(this, _ENSNameProvider_isEnabled, isEnabled || (() => true), "f");
|
|
23
|
+
__classPrivateFieldSet(this, _ENSNameProvider_reverseLookup, reverseLookup, "f");
|
|
24
|
+
}
|
|
25
|
+
getMetadata() {
|
|
26
|
+
return {
|
|
27
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
28
|
+
sourceLabels: { [ID]: LABEL },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async getProposedNames(request) {
|
|
32
|
+
if (!__classPrivateFieldGet(this, _ENSNameProvider_isEnabled, "f").call(this)) {
|
|
33
|
+
log('Skipping request as disabled');
|
|
34
|
+
return {
|
|
35
|
+
results: {
|
|
36
|
+
[ID]: {
|
|
37
|
+
proposedNames: [],
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const { value, variation: chainId } = request;
|
|
43
|
+
log('Invoking callback', { value, chainId });
|
|
44
|
+
try {
|
|
45
|
+
const proposedName = await __classPrivateFieldGet(this, _ENSNameProvider_reverseLookup, "f").call(this, value, chainId);
|
|
46
|
+
const proposedNames = proposedName ? [proposedName] : [];
|
|
47
|
+
log('New proposed names', proposedNames);
|
|
48
|
+
return {
|
|
49
|
+
results: {
|
|
50
|
+
[ID]: { proposedNames },
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
log('Request failed', error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
_ENSNameProvider_isEnabled = new WeakMap(), _ENSNameProvider_reverseLookup = new WeakMap();
|
|
10
61
|
//# sourceMappingURL=ens.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"file":"ens.mjs","sourceRoot":"","sources":["../../src/providers/ens.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAkB;AAO9D,OAAO,EAAE,QAAQ,EAAE,qBAAiB;AAOpC,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;IAK1B,YAAY,EACV,SAAS,EACT,aAAa,GAId;QAVD,6CAA0B;QAE1B,iDAAsC;QASpC,uBAAA,IAAI,8BAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QAC5C,uBAAA,IAAI,kCAAkB,aAAa,MAAA,CAAC;IACtC,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,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,uBAAA,IAAI,kCAAW,MAAf,IAAI,CAAa,EAAE;YACtB,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF,CAAC;SACH;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;YACF,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,sCAAe,MAAnB,IAAI,EAAgB,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;SACH;QAAC,OAAO,KAAK,EAAE;YACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF","sourcesContent":["import { projectLogger, createModuleLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\n\nexport type ReverseLookupCallback = (\n address: string,\n chainId: string,\n) => Promise<string>;\n\nconst ID = 'ens';\nconst LABEL = 'Ethereum Name Service (ENS)';\n\nconst log = createModuleLogger(projectLogger, 'ens');\n\nexport class ENSNameProvider implements NameProvider {\n #isEnabled: () => boolean;\n\n #reverseLookup: ReverseLookupCallback;\n\n constructor({\n isEnabled,\n reverseLookup,\n }: {\n isEnabled?: () => boolean;\n reverseLookup: ReverseLookupCallback;\n }) {\n this.#isEnabled = isEnabled || (() => true);\n this.#reverseLookup = reverseLookup;\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const { value, variation: chainId } = request;\n\n log('Invoking callback', { value, chainId });\n\n try {\n const proposedName = await this.#reverseLookup(value, chainId);\n const proposedNames = proposedName ? [proposedName] : [];\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: { proposedNames },\n },\n };\n } catch (error) {\n log('Request failed', error);\n throw error;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _EtherscanNameProvider_instances, _EtherscanNameProvider_isEnabled, _EtherscanNameProvider_lastRequestTime, _EtherscanNameProvider_mutex, _EtherscanNameProvider_sendRequest, _EtherscanNameProvider_getUrl;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.EtherscanNameProvider = void 0;
|
|
16
|
+
const async_mutex_1 = require("async-mutex");
|
|
17
|
+
const constants_1 = require("../constants.cjs");
|
|
18
|
+
const logger_1 = require("../logger.cjs");
|
|
19
|
+
const types_1 = require("../types.cjs");
|
|
20
|
+
const util_1 = require("../util.cjs");
|
|
21
|
+
const ID = 'etherscan';
|
|
22
|
+
const LABEL = 'Etherscan (Verified Contract Name)';
|
|
23
|
+
const RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds
|
|
24
|
+
const RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;
|
|
25
|
+
const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, 'etherscan');
|
|
26
|
+
class EtherscanNameProvider {
|
|
27
|
+
constructor({ isEnabled } = {}) {
|
|
28
|
+
_EtherscanNameProvider_instances.add(this);
|
|
29
|
+
_EtherscanNameProvider_isEnabled.set(this, void 0);
|
|
30
|
+
_EtherscanNameProvider_lastRequestTime.set(this, 0);
|
|
31
|
+
_EtherscanNameProvider_mutex.set(this, new async_mutex_1.Mutex());
|
|
32
|
+
__classPrivateFieldSet(this, _EtherscanNameProvider_isEnabled, isEnabled || (() => true), "f");
|
|
33
|
+
}
|
|
34
|
+
getMetadata() {
|
|
35
|
+
return {
|
|
36
|
+
sourceIds: { [types_1.NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
37
|
+
sourceLabels: { [ID]: LABEL },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async getProposedNames(request) {
|
|
41
|
+
if (!__classPrivateFieldGet(this, _EtherscanNameProvider_isEnabled, "f").call(this)) {
|
|
42
|
+
log('Skipping request as disabled');
|
|
43
|
+
return {
|
|
44
|
+
results: {
|
|
45
|
+
[ID]: {
|
|
46
|
+
proposedNames: [],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const releaseLock = await __classPrivateFieldGet(this, _EtherscanNameProvider_mutex, "f").acquire();
|
|
52
|
+
try {
|
|
53
|
+
const { value, variation: chainId } = request;
|
|
54
|
+
const time = Date.now();
|
|
55
|
+
const timeSinceLastRequest = time - __classPrivateFieldGet(this, _EtherscanNameProvider_lastRequestTime, "f");
|
|
56
|
+
if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {
|
|
57
|
+
log('Skipping request to avoid rate limit');
|
|
58
|
+
return {
|
|
59
|
+
results: {
|
|
60
|
+
[ID]: {
|
|
61
|
+
updateDelay: RATE_LIMIT_UPDATE_DELAY,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const url = __classPrivateFieldGet(this, _EtherscanNameProvider_instances, "m", _EtherscanNameProvider_getUrl).call(this, chainId, {
|
|
67
|
+
module: 'contract',
|
|
68
|
+
action: 'getsourcecode',
|
|
69
|
+
address: value,
|
|
70
|
+
});
|
|
71
|
+
const { responseData, error } = await __classPrivateFieldGet(this, _EtherscanNameProvider_instances, "m", _EtherscanNameProvider_sendRequest).call(this, url);
|
|
72
|
+
if (error) {
|
|
73
|
+
log('Request failed', error);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
if (responseData?.message === 'NOTOK') {
|
|
77
|
+
log('Request warning', responseData.result);
|
|
78
|
+
return {
|
|
79
|
+
results: {
|
|
80
|
+
[ID]: {
|
|
81
|
+
updateDelay: RATE_LIMIT_UPDATE_DELAY,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const results = responseData?.result ?? [];
|
|
87
|
+
const proposedNames = results.map((result) => result.ContractName);
|
|
88
|
+
log('New proposed names', proposedNames);
|
|
89
|
+
return {
|
|
90
|
+
results: {
|
|
91
|
+
[ID]: {
|
|
92
|
+
proposedNames,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
releaseLock();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.EtherscanNameProvider = EtherscanNameProvider;
|
|
103
|
+
_EtherscanNameProvider_isEnabled = new WeakMap(), _EtherscanNameProvider_lastRequestTime = new WeakMap(), _EtherscanNameProvider_mutex = new WeakMap(), _EtherscanNameProvider_instances = new WeakSet(), _EtherscanNameProvider_sendRequest = async function _EtherscanNameProvider_sendRequest(url) {
|
|
104
|
+
try {
|
|
105
|
+
log('Sending request', url);
|
|
106
|
+
const responseData = (await (0, util_1.handleFetch)(url));
|
|
107
|
+
return { responseData };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
(0, util_1.assertIsError)(error);
|
|
111
|
+
return { error };
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
__classPrivateFieldSet(this, _EtherscanNameProvider_lastRequestTime, Date.now(), "f");
|
|
115
|
+
}
|
|
116
|
+
}, _EtherscanNameProvider_getUrl = function _EtherscanNameProvider_getUrl(chainId, params) {
|
|
117
|
+
const networkInfo = constants_1.ETHERSCAN_SUPPORTED_NETWORKS[chainId];
|
|
118
|
+
if (!networkInfo) {
|
|
119
|
+
throw new Error(`Etherscan does not support chain with ID: ${chainId}`);
|
|
120
|
+
}
|
|
121
|
+
let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;
|
|
122
|
+
Object.keys(params).forEach((key, index) => {
|
|
123
|
+
const value = params[key];
|
|
124
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
126
|
+
url += `${index === 0 ? '?' : '&'}${key}=${value}`;
|
|
127
|
+
});
|
|
128
|
+
return url;
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=etherscan.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"etherscan.cjs","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from 'async-mutex';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { handleFetch, assertIsError } from '../util';\n\nconst ID = 'etherscan';\nconst LABEL = 'Etherscan (Verified Contract Name)';\nconst RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds\nconst RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;\n\nconst log = createModuleLogger(projectLogger, 'etherscan');\n\ntype EtherscanGetSourceCodeResponse = {\n status: '1' | '0';\n message: string;\n result: [\n {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n SourceCode: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ABI: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ContractName: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CompilerVersion: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n OptimizationUsed: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Runs: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ConstructorArguments: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Library: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LicenseType: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Proxy: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Implementation: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n SwarmSource: string;\n },\n ];\n};\n\nexport class EtherscanNameProvider implements NameProvider {\n #isEnabled: () => boolean;\n\n #lastRequestTime = 0;\n\n #mutex = new Mutex();\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const releaseLock = await this.#mutex.acquire();\n\n try {\n const { value, variation: chainId } = request;\n\n const time = Date.now();\n const timeSinceLastRequest = time - this.#lastRequestTime;\n\n if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {\n log('Skipping request to avoid rate limit');\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const url = this.#getUrl(chainId, {\n module: 'contract',\n action: 'getsourcecode',\n address: value,\n });\n\n const { responseData, error } = await this.#sendRequest(url);\n\n if (error) {\n log('Request failed', error);\n throw error;\n }\n\n if (responseData?.message === 'NOTOK') {\n log('Request warning', responseData.result);\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const results = responseData?.result ?? [];\n const proposedNames = results.map((result) => result.ContractName);\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } finally {\n releaseLock();\n }\n }\n\n async #sendRequest(url: string): Promise<{\n responseData?: EtherscanGetSourceCodeResponse;\n error?: Error;\n }> {\n try {\n log('Sending request', url);\n\n const responseData = (await handleFetch(\n url,\n )) as EtherscanGetSourceCodeResponse;\n\n return { responseData };\n } catch (error) {\n assertIsError(error);\n return { error };\n } finally {\n this.#lastRequestTime = Date.now();\n }\n }\n\n #getUrl(chainId: string, params: Record<string, string | undefined>): string {\n type SupportedChainId = keyof typeof ETHERSCAN_SUPPORTED_NETWORKS;\n\n const networkInfo =\n ETHERSCAN_SUPPORTED_NETWORKS[chainId as SupportedChainId];\n\n if (!networkInfo) {\n throw new Error(`Etherscan does not support chain with ID: ${chainId}`);\n }\n\n let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;\n\n Object.keys(params).forEach((key, index) => {\n const value = params[key];\n // 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 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.cjs";
|
|
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.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"etherscan.d.cts","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,qBAAiB;AAwDlB,qBAAa,qBAAsB,YAAW,YAAY;;gBAO5C,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO;IAI7D,WAAW,IAAI,oBAAoB;IAO7B,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC;CAoH/B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from "../types.mjs";
|
|
2
|
+
export declare class EtherscanNameProvider implements NameProvider {
|
|
3
|
+
#private;
|
|
4
|
+
constructor({ isEnabled }?: {
|
|
5
|
+
isEnabled?: () => boolean;
|
|
6
|
+
});
|
|
7
|
+
getMetadata(): NameProviderMetadata;
|
|
8
|
+
getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=etherscan.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"etherscan.d.mts","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,qBAAiB;AAwDlB,qBAAa,qBAAsB,YAAW,YAAY;;gBAO5C,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO;IAI7D,WAAW,IAAI,oBAAoB;IAO7B,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC;CAoH/B"}
|
|
@@ -1,12 +1,126 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _EtherscanNameProvider_instances, _EtherscanNameProvider_isEnabled, _EtherscanNameProvider_lastRequestTime, _EtherscanNameProvider_mutex, _EtherscanNameProvider_sendRequest, _EtherscanNameProvider_getUrl;
|
|
13
|
+
import { Mutex } from "async-mutex";
|
|
14
|
+
import { ETHERSCAN_SUPPORTED_NETWORKS } from "../constants.mjs";
|
|
15
|
+
import { createModuleLogger, projectLogger } from "../logger.mjs";
|
|
16
|
+
import { NameType } from "../types.mjs";
|
|
17
|
+
import { handleFetch, assertIsError } from "../util.mjs";
|
|
18
|
+
const ID = 'etherscan';
|
|
19
|
+
const LABEL = 'Etherscan (Verified Contract Name)';
|
|
20
|
+
const RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds
|
|
21
|
+
const RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;
|
|
22
|
+
const log = createModuleLogger(projectLogger, 'etherscan');
|
|
23
|
+
export class EtherscanNameProvider {
|
|
24
|
+
constructor({ isEnabled } = {}) {
|
|
25
|
+
_EtherscanNameProvider_instances.add(this);
|
|
26
|
+
_EtherscanNameProvider_isEnabled.set(this, void 0);
|
|
27
|
+
_EtherscanNameProvider_lastRequestTime.set(this, 0);
|
|
28
|
+
_EtherscanNameProvider_mutex.set(this, new Mutex());
|
|
29
|
+
__classPrivateFieldSet(this, _EtherscanNameProvider_isEnabled, isEnabled || (() => true), "f");
|
|
30
|
+
}
|
|
31
|
+
getMetadata() {
|
|
32
|
+
return {
|
|
33
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
34
|
+
sourceLabels: { [ID]: LABEL },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async getProposedNames(request) {
|
|
38
|
+
if (!__classPrivateFieldGet(this, _EtherscanNameProvider_isEnabled, "f").call(this)) {
|
|
39
|
+
log('Skipping request as disabled');
|
|
40
|
+
return {
|
|
41
|
+
results: {
|
|
42
|
+
[ID]: {
|
|
43
|
+
proposedNames: [],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const releaseLock = await __classPrivateFieldGet(this, _EtherscanNameProvider_mutex, "f").acquire();
|
|
49
|
+
try {
|
|
50
|
+
const { value, variation: chainId } = request;
|
|
51
|
+
const time = Date.now();
|
|
52
|
+
const timeSinceLastRequest = time - __classPrivateFieldGet(this, _EtherscanNameProvider_lastRequestTime, "f");
|
|
53
|
+
if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {
|
|
54
|
+
log('Skipping request to avoid rate limit');
|
|
55
|
+
return {
|
|
56
|
+
results: {
|
|
57
|
+
[ID]: {
|
|
58
|
+
updateDelay: RATE_LIMIT_UPDATE_DELAY,
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const url = __classPrivateFieldGet(this, _EtherscanNameProvider_instances, "m", _EtherscanNameProvider_getUrl).call(this, chainId, {
|
|
64
|
+
module: 'contract',
|
|
65
|
+
action: 'getsourcecode',
|
|
66
|
+
address: value,
|
|
67
|
+
});
|
|
68
|
+
const { responseData, error } = await __classPrivateFieldGet(this, _EtherscanNameProvider_instances, "m", _EtherscanNameProvider_sendRequest).call(this, url);
|
|
69
|
+
if (error) {
|
|
70
|
+
log('Request failed', error);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
if (responseData?.message === 'NOTOK') {
|
|
74
|
+
log('Request warning', responseData.result);
|
|
75
|
+
return {
|
|
76
|
+
results: {
|
|
77
|
+
[ID]: {
|
|
78
|
+
updateDelay: RATE_LIMIT_UPDATE_DELAY,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const results = responseData?.result ?? [];
|
|
84
|
+
const proposedNames = results.map((result) => result.ContractName);
|
|
85
|
+
log('New proposed names', proposedNames);
|
|
86
|
+
return {
|
|
87
|
+
results: {
|
|
88
|
+
[ID]: {
|
|
89
|
+
proposedNames,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
releaseLock();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
_EtherscanNameProvider_isEnabled = new WeakMap(), _EtherscanNameProvider_lastRequestTime = new WeakMap(), _EtherscanNameProvider_mutex = new WeakMap(), _EtherscanNameProvider_instances = new WeakSet(), _EtherscanNameProvider_sendRequest = async function _EtherscanNameProvider_sendRequest(url) {
|
|
100
|
+
try {
|
|
101
|
+
log('Sending request', url);
|
|
102
|
+
const responseData = (await handleFetch(url));
|
|
103
|
+
return { responseData };
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
assertIsError(error);
|
|
107
|
+
return { error };
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
__classPrivateFieldSet(this, _EtherscanNameProvider_lastRequestTime, Date.now(), "f");
|
|
111
|
+
}
|
|
112
|
+
}, _EtherscanNameProvider_getUrl = function _EtherscanNameProvider_getUrl(chainId, params) {
|
|
113
|
+
const networkInfo = ETHERSCAN_SUPPORTED_NETWORKS[chainId];
|
|
114
|
+
if (!networkInfo) {
|
|
115
|
+
throw new Error(`Etherscan does not support chain with ID: ${chainId}`);
|
|
116
|
+
}
|
|
117
|
+
let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;
|
|
118
|
+
Object.keys(params).forEach((key, index) => {
|
|
119
|
+
const value = params[key];
|
|
120
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
122
|
+
url += `${index === 0 ? '?' : '&'}${key}=${value}`;
|
|
123
|
+
});
|
|
124
|
+
return url;
|
|
11
125
|
};
|
|
12
126
|
//# sourceMappingURL=etherscan.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"file":"etherscan.mjs","sourceRoot":"","sources":["../../src/providers/etherscan.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mutex } from 'async-mutex';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { handleFetch, assertIsError } from '../util';\n\nconst ID = 'etherscan';\nconst LABEL = 'Etherscan (Verified Contract Name)';\nconst RATE_LIMIT_UPDATE_DELAY = 5; // 5 Seconds\nconst RATE_LIMIT_INTERVAL = RATE_LIMIT_UPDATE_DELAY * 1000;\n\nconst log = createModuleLogger(projectLogger, 'etherscan');\n\ntype EtherscanGetSourceCodeResponse = {\n status: '1' | '0';\n message: string;\n result: [\n {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n SourceCode: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ABI: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ContractName: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n CompilerVersion: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n OptimizationUsed: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Runs: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ConstructorArguments: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Library: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n LicenseType: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Proxy: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Implementation: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n SwarmSource: string;\n },\n ];\n};\n\nexport class EtherscanNameProvider implements NameProvider {\n #isEnabled: () => boolean;\n\n #lastRequestTime = 0;\n\n #mutex = new Mutex();\n\n constructor({ isEnabled }: { isEnabled?: () => boolean } = {}) {\n this.#isEnabled = isEnabled || (() => true);\n }\n\n getMetadata(): NameProviderMetadata {\n return {\n sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },\n sourceLabels: { [ID]: LABEL },\n };\n }\n\n async getProposedNames(\n request: NameProviderRequest,\n ): Promise<NameProviderResult> {\n if (!this.#isEnabled()) {\n log('Skipping request as disabled');\n\n return {\n results: {\n [ID]: {\n proposedNames: [],\n },\n },\n };\n }\n\n const releaseLock = await this.#mutex.acquire();\n\n try {\n const { value, variation: chainId } = request;\n\n const time = Date.now();\n const timeSinceLastRequest = time - this.#lastRequestTime;\n\n if (timeSinceLastRequest < RATE_LIMIT_INTERVAL) {\n log('Skipping request to avoid rate limit');\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const url = this.#getUrl(chainId, {\n module: 'contract',\n action: 'getsourcecode',\n address: value,\n });\n\n const { responseData, error } = await this.#sendRequest(url);\n\n if (error) {\n log('Request failed', error);\n throw error;\n }\n\n if (responseData?.message === 'NOTOK') {\n log('Request warning', responseData.result);\n\n return {\n results: {\n [ID]: {\n updateDelay: RATE_LIMIT_UPDATE_DELAY,\n },\n },\n };\n }\n\n const results = responseData?.result ?? [];\n const proposedNames = results.map((result) => result.ContractName);\n\n log('New proposed names', proposedNames);\n\n return {\n results: {\n [ID]: {\n proposedNames,\n },\n },\n };\n } finally {\n releaseLock();\n }\n }\n\n async #sendRequest(url: string): Promise<{\n responseData?: EtherscanGetSourceCodeResponse;\n error?: Error;\n }> {\n try {\n log('Sending request', url);\n\n const responseData = (await handleFetch(\n url,\n )) as EtherscanGetSourceCodeResponse;\n\n return { responseData };\n } catch (error) {\n assertIsError(error);\n return { error };\n } finally {\n this.#lastRequestTime = Date.now();\n }\n }\n\n #getUrl(chainId: string, params: Record<string, string | undefined>): string {\n type SupportedChainId = keyof typeof ETHERSCAN_SUPPORTED_NETWORKS;\n\n const networkInfo =\n ETHERSCAN_SUPPORTED_NETWORKS[chainId as SupportedChainId];\n\n if (!networkInfo) {\n throw new Error(`Etherscan does not support chain with ID: ${chainId}`);\n }\n\n let url = `https://${networkInfo.subdomain}.${networkInfo.domain}/api`;\n\n Object.keys(params).forEach((key, index) => {\n const value = params[key];\n // 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 url += `${index === 0 ? '?' : '&'}${key}=${value}`;\n });\n\n return url;\n }\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _LensNameProvider_isEnabled;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.LensNameProvider = void 0;
|
|
16
|
+
const logger_1 = require("../logger.cjs");
|
|
17
|
+
const types_1 = require("../types.cjs");
|
|
18
|
+
const util_1 = require("../util.cjs");
|
|
19
|
+
const ID = 'lens';
|
|
20
|
+
const LABEL = 'Lens Protocol';
|
|
21
|
+
const LENS_URL = `https://api.lens.dev`;
|
|
22
|
+
const QUERY = `
|
|
23
|
+
query HandlesForAddress($address: EthereumAddress!) {
|
|
24
|
+
profiles(request: { ownedBy: [$address] }) {
|
|
25
|
+
items {
|
|
26
|
+
handle
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}`;
|
|
30
|
+
const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, 'lens');
|
|
31
|
+
class LensNameProvider {
|
|
32
|
+
constructor({ isEnabled } = {}) {
|
|
33
|
+
_LensNameProvider_isEnabled.set(this, void 0);
|
|
34
|
+
__classPrivateFieldSet(this, _LensNameProvider_isEnabled, isEnabled || (() => true), "f");
|
|
35
|
+
}
|
|
36
|
+
getMetadata() {
|
|
37
|
+
return {
|
|
38
|
+
sourceIds: { [types_1.NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
39
|
+
sourceLabels: { [ID]: LABEL },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async getProposedNames(request) {
|
|
43
|
+
if (!__classPrivateFieldGet(this, _LensNameProvider_isEnabled, "f").call(this)) {
|
|
44
|
+
log('Skipping request as disabled');
|
|
45
|
+
return {
|
|
46
|
+
results: {
|
|
47
|
+
[ID]: {
|
|
48
|
+
proposedNames: [],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const { value } = request;
|
|
54
|
+
const variables = { address: value };
|
|
55
|
+
log('Sending request', { variables });
|
|
56
|
+
try {
|
|
57
|
+
const responseData = await (0, util_1.graphQL)(LENS_URL, QUERY, variables);
|
|
58
|
+
const profiles = responseData?.profiles?.items ?? [];
|
|
59
|
+
const proposedNames = profiles.map((profile) => profile.handle);
|
|
60
|
+
log('New proposed names', proposedNames);
|
|
61
|
+
return {
|
|
62
|
+
results: {
|
|
63
|
+
[ID]: {
|
|
64
|
+
proposedNames,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
log('Request failed', error);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.LensNameProvider = LensNameProvider;
|
|
76
|
+
_LensNameProvider_isEnabled = new WeakMap();
|
|
77
|
+
//# sourceMappingURL=lens.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lens.cjs","sourceRoot":"","sources":["../../src/providers/lens.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,0CAA8D;AAO9D,wCAAoC;AACpC,sCAAkC;AAElC,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,IAAA,2BAAkB,EAAC,sBAAa,EAAE,MAAM,CAAC,CAAC;AAYtD,MAAa,gBAAgB;IAG3B,YAAY,EAAE,SAAS,KAAoC,EAAE;QAF7D,8CAA0B;QAGxB,uBAAA,IAAI,+BAAc,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;IAC9C,CAAC;IAED,WAAW;QACT,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAChD,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAA4B;QAE5B,IAAI,CAAC,uBAAA,IAAI,mCAAW,MAAf,IAAI,CAAa,EAAE;YACtB,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAEpC,OAAO;gBACL,OAAO,EAAE;oBACP,CAAC,EAAE,CAAC,EAAE;wBACJ,aAAa,EAAE,EAAE;qBAClB;iBACF;aACF,CAAC;SACH;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;YACF,MAAM,YAAY,GAAG,MAAM,IAAA,cAAO,EAChC,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;SACH;QAAC,OAAO,KAAK,EAAE;YACd,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF;AA1DD,4CA0DC","sourcesContent":["import { createModuleLogger, projectLogger } from '../logger';\nimport type {\n NameProvider,\n NameProviderMetadata,\n NameProviderRequest,\n NameProviderResult,\n} from '../types';\nimport { NameType } from '../types';\nimport { graphQL } from '../util';\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 #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.cjs";
|
|
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.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lens.d.cts","sourceRoot":"","sources":["../../src/providers/lens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,qBAAiB;AA6BlB,qBAAa,gBAAiB,YAAW,YAAY;;gBAGvC,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO;IAI7D,WAAW,IAAI,oBAAoB;IAO7B,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC;CA0C/B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NameProvider, NameProviderMetadata, NameProviderRequest, NameProviderResult } from "../types.mjs";
|
|
2
|
+
export declare class LensNameProvider implements NameProvider {
|
|
3
|
+
#private;
|
|
4
|
+
constructor({ isEnabled }?: {
|
|
5
|
+
isEnabled?: () => boolean;
|
|
6
|
+
});
|
|
7
|
+
getMetadata(): NameProviderMetadata;
|
|
8
|
+
getProposedNames(request: NameProviderRequest): Promise<NameProviderResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=lens.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lens.d.mts","sourceRoot":"","sources":["../../src/providers/lens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,qBAAiB;AA6BlB,qBAAa,gBAAiB,YAAW,YAAY;;gBAGvC,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;KAAO;IAI7D,WAAW,IAAI,oBAAoB;IAO7B,gBAAgB,CACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC;CA0C/B"}
|
package/dist/providers/lens.mjs
CHANGED
|
@@ -1,11 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import "../chunk-6W3DEAGA.mjs";
|
|
7
|
-
import "../chunk-XUI43LEZ.mjs";
|
|
8
|
-
export {
|
|
9
|
-
LensNameProvider
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
10
6
|
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _LensNameProvider_isEnabled;
|
|
13
|
+
import { createModuleLogger, projectLogger } from "../logger.mjs";
|
|
14
|
+
import { NameType } from "../types.mjs";
|
|
15
|
+
import { graphQL } from "../util.mjs";
|
|
16
|
+
const ID = 'lens';
|
|
17
|
+
const LABEL = 'Lens Protocol';
|
|
18
|
+
const LENS_URL = `https://api.lens.dev`;
|
|
19
|
+
const QUERY = `
|
|
20
|
+
query HandlesForAddress($address: EthereumAddress!) {
|
|
21
|
+
profiles(request: { ownedBy: [$address] }) {
|
|
22
|
+
items {
|
|
23
|
+
handle
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}`;
|
|
27
|
+
const log = createModuleLogger(projectLogger, 'lens');
|
|
28
|
+
export class LensNameProvider {
|
|
29
|
+
constructor({ isEnabled } = {}) {
|
|
30
|
+
_LensNameProvider_isEnabled.set(this, void 0);
|
|
31
|
+
__classPrivateFieldSet(this, _LensNameProvider_isEnabled, isEnabled || (() => true), "f");
|
|
32
|
+
}
|
|
33
|
+
getMetadata() {
|
|
34
|
+
return {
|
|
35
|
+
sourceIds: { [NameType.ETHEREUM_ADDRESS]: [ID] },
|
|
36
|
+
sourceLabels: { [ID]: LABEL },
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async getProposedNames(request) {
|
|
40
|
+
if (!__classPrivateFieldGet(this, _LensNameProvider_isEnabled, "f").call(this)) {
|
|
41
|
+
log('Skipping request as disabled');
|
|
42
|
+
return {
|
|
43
|
+
results: {
|
|
44
|
+
[ID]: {
|
|
45
|
+
proposedNames: [],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const { value } = request;
|
|
51
|
+
const variables = { address: value };
|
|
52
|
+
log('Sending request', { variables });
|
|
53
|
+
try {
|
|
54
|
+
const responseData = await graphQL(LENS_URL, QUERY, variables);
|
|
55
|
+
const profiles = responseData?.profiles?.items ?? [];
|
|
56
|
+
const proposedNames = profiles.map((profile) => profile.handle);
|
|
57
|
+
log('New proposed names', proposedNames);
|
|
58
|
+
return {
|
|
59
|
+
results: {
|
|
60
|
+
[ID]: {
|
|
61
|
+
proposedNames,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
log('Request failed', error);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
_LensNameProvider_isEnabled = new WeakMap();
|
|
11
73
|
//# sourceMappingURL=lens.mjs.map
|