@metamask-previews/phishing-controller 13.1.0-preview-f059664 → 13.1.0-preview-8ccfcb37
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 +6 -0
- package/dist/CacheManager.cjs +177 -0
- package/dist/CacheManager.cjs.map +1 -0
- package/dist/CacheManager.d.cts +104 -0
- package/dist/CacheManager.d.cts.map +1 -0
- package/dist/CacheManager.d.mts +104 -0
- package/dist/CacheManager.d.mts.map +1 -0
- package/dist/CacheManager.mjs +173 -0
- package/dist/CacheManager.mjs.map +1 -0
- package/dist/PhishingController.cjs +132 -8
- package/dist/PhishingController.cjs.map +1 -1
- package/dist/PhishingController.d.cts +31 -5
- package/dist/PhishingController.d.cts.map +1 -1
- package/dist/PhishingController.d.mts +31 -5
- package/dist/PhishingController.d.mts.map +1 -1
- package/dist/PhishingController.mjs +132 -8
- package/dist/PhishingController.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs +35 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +68 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +68 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +34 -0
- package/dist/types.mjs.map +1 -1
- package/dist/utils.cjs +54 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +55 -0
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts +55 -0
- package/dist/utils.d.mts.map +1 -1
- package/dist/utils.mjs +50 -0
- package/dist/utils.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/UrlScanCache.cjs +0 -127
- package/dist/UrlScanCache.cjs.map +0 -1
- package/dist/UrlScanCache.d.cts +0 -67
- package/dist/UrlScanCache.d.cts.map +0 -1
- package/dist/UrlScanCache.d.mts +0 -67
- package/dist/UrlScanCache.d.mts.map +0 -1
- package/dist/UrlScanCache.mjs +0 -123
- package/dist/UrlScanCache.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhishingController.d.cts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EAEpB,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;
|
|
1
|
+
{"version":3,"file":"PhishingController.d.cts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ControllerGetStateAction, ControllerStateChangeEvent, RestrictedMessenger } from "@metamask/base-controller";
|
|
2
2
|
import { BaseController } from "@metamask/base-controller";
|
|
3
|
-
import { type
|
|
4
|
-
import { type
|
|
3
|
+
import { type CacheEntry } from "./CacheManager.mjs";
|
|
4
|
+
import { type PhishingDetectorResult, type PhishingDetectionScanResult, type TokenScanCacheData, type BulkTokenScanResponse, type BulkTokenScanRequest } from "./types.mjs";
|
|
5
5
|
export declare const PHISHING_CONFIG_BASE_URL = "https://phishing-detection.api.cx.metamask.io";
|
|
6
6
|
export declare const METAMASK_STALELIST_FILE = "/v1/stalelist";
|
|
7
7
|
export declare const METAMASK_HOTLIST_DIFF_FILE = "/v1/diffsSince";
|
|
@@ -10,6 +10,12 @@ export declare const C2_DOMAIN_BLOCKLIST_ENDPOINT = "/v1/request-blocklist";
|
|
|
10
10
|
export declare const PHISHING_DETECTION_BASE_URL = "https://dapp-scanning.api.cx.metamask.io";
|
|
11
11
|
export declare const PHISHING_DETECTION_SCAN_ENDPOINT = "v2/scan";
|
|
12
12
|
export declare const PHISHING_DETECTION_BULK_SCAN_ENDPOINT = "bulk-scan";
|
|
13
|
+
export declare const SECURITY_ALERTS_BASE_URL = "https://security-alerts.api.cx.metamask.io";
|
|
14
|
+
export declare const TOKEN_BULK_SCANNING_ENDPOINT = "/token/scan-bulk";
|
|
15
|
+
export declare const DEFAULT_URL_SCAN_CACHE_TTL: number;
|
|
16
|
+
export declare const DEFAULT_URL_SCAN_CACHE_MAX_SIZE = 250;
|
|
17
|
+
export declare const DEFAULT_TOKEN_SCAN_CACHE_TTL: number;
|
|
18
|
+
export declare const DEFAULT_TOKEN_SCAN_CACHE_MAX_SIZE = 1000;
|
|
13
19
|
export declare const C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL: number;
|
|
14
20
|
export declare const HOTLIST_REFRESH_INTERVAL: number;
|
|
15
21
|
export declare const STALELIST_REFRESH_INTERVAL: number;
|
|
@@ -153,7 +159,8 @@ export type PhishingControllerState = {
|
|
|
153
159
|
hotlistLastFetched: number;
|
|
154
160
|
stalelistLastFetched: number;
|
|
155
161
|
c2DomainBlocklistLastFetched: number;
|
|
156
|
-
urlScanCache: Record<string,
|
|
162
|
+
urlScanCache: Record<string, CacheEntry<PhishingDetectionScanResult>>;
|
|
163
|
+
tokenScanCache: Record<string, CacheEntry<TokenScanCacheData>>;
|
|
157
164
|
};
|
|
158
165
|
/**
|
|
159
166
|
* PhishingControllerOptions
|
|
@@ -164,6 +171,8 @@ export type PhishingControllerState = {
|
|
|
164
171
|
* c2DomainBlocklistRefreshInterval - Polling interval used to fetch c2 domain blocklist.
|
|
165
172
|
* urlScanCacheTTL - Time to live in seconds for cached scan results.
|
|
166
173
|
* urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
174
|
+
* tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
175
|
+
* tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
167
176
|
*/
|
|
168
177
|
export type PhishingControllerOptions = {
|
|
169
178
|
stalelistRefreshInterval?: number;
|
|
@@ -171,6 +180,8 @@ export type PhishingControllerOptions = {
|
|
|
171
180
|
c2DomainBlocklistRefreshInterval?: number;
|
|
172
181
|
urlScanCacheTTL?: number;
|
|
173
182
|
urlScanCacheMaxSize?: number;
|
|
183
|
+
tokenScanCacheTTL?: number;
|
|
184
|
+
tokenScanCacheMaxSize?: number;
|
|
174
185
|
messenger: PhishingControllerMessenger;
|
|
175
186
|
state?: Partial<PhishingControllerState>;
|
|
176
187
|
};
|
|
@@ -186,8 +197,12 @@ export type PhishingControllerBulkScanUrlsAction = {
|
|
|
186
197
|
type: `${typeof controllerName}:bulkScanUrls`;
|
|
187
198
|
handler: PhishingController['bulkScanUrls'];
|
|
188
199
|
};
|
|
200
|
+
export type PhishingControllerBulkScanTokensAction = {
|
|
201
|
+
type: `${typeof controllerName}:bulkScanTokens`;
|
|
202
|
+
handler: PhishingController['bulkScanTokens'];
|
|
203
|
+
};
|
|
189
204
|
export type PhishingControllerGetStateAction = ControllerGetStateAction<typeof controllerName, PhishingControllerState>;
|
|
190
|
-
export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin | PhishingControllerBulkScanUrlsAction;
|
|
205
|
+
export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin | PhishingControllerBulkScanUrlsAction | PhishingControllerBulkScanTokensAction;
|
|
191
206
|
export type PhishingControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, PhishingControllerState>;
|
|
192
207
|
export type PhishingControllerEvents = PhishingControllerStateChangeEvent;
|
|
193
208
|
export type PhishingControllerMessenger = RestrictedMessenger<typeof controllerName, PhishingControllerActions, PhishingControllerEvents, never, never>;
|
|
@@ -217,10 +232,12 @@ export declare class PhishingController extends BaseController<typeof controller
|
|
|
217
232
|
* @param config.c2DomainBlocklistRefreshInterval - Polling interval used to fetch c2 domain blocklist.
|
|
218
233
|
* @param config.urlScanCacheTTL - Time to live in seconds for cached scan results.
|
|
219
234
|
* @param config.urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
235
|
+
* @param config.tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
236
|
+
* @param config.tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
220
237
|
* @param config.messenger - The controller restricted messenger.
|
|
221
238
|
* @param config.state - Initial state to set on this controller.
|
|
222
239
|
*/
|
|
223
|
-
constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, urlScanCacheTTL, urlScanCacheMaxSize, messenger, state, }: PhishingControllerOptions);
|
|
240
|
+
constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, urlScanCacheTTL, urlScanCacheMaxSize, tokenScanCacheTTL, tokenScanCacheMaxSize, messenger, state, }: PhishingControllerOptions);
|
|
224
241
|
/**
|
|
225
242
|
* Updates this.detector with an instance of PhishingDetector using the current state.
|
|
226
243
|
*/
|
|
@@ -357,6 +374,15 @@ export declare class PhishingController extends BaseController<typeof controller
|
|
|
357
374
|
* @returns A mapping of URLs to their phishing detection scan results and errors.
|
|
358
375
|
*/
|
|
359
376
|
bulkScanUrls: (urls: string[]) => Promise<BulkPhishingDetectionScanResponse>;
|
|
377
|
+
/**
|
|
378
|
+
* Scan multiple tokens for malicious activity in bulk.
|
|
379
|
+
*
|
|
380
|
+
* @param request - The bulk scan request containing chainId and tokens.
|
|
381
|
+
* @param request.chainId - The chain ID in hex format (e.g., '0x1' for Ethereum).
|
|
382
|
+
* @param request.tokens - Array of token addresses to scan.
|
|
383
|
+
* @returns A mapping of lowercase token addresses to their scan results. Tokens that fail to scan are omitted.
|
|
384
|
+
*/
|
|
385
|
+
bulkScanTokens: (request: BulkTokenScanRequest) => Promise<BulkTokenScanResponse>;
|
|
360
386
|
}
|
|
361
387
|
export default PhishingController;
|
|
362
388
|
export type { PhishingDetectorResult };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhishingController.d.mts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EAEpB,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;
|
|
1
|
+
{"version":3,"file":"PhishingController.d.mts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,15 +9,15 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
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
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _PhishingController_instances, _PhishingController_detector, _PhishingController_stalelistRefreshInterval, _PhishingController_hotlistRefreshInterval, _PhishingController_c2DomainBlocklistRefreshInterval, _PhishingController_urlScanCache, _PhishingController_inProgressHotlistUpdate, _PhishingController_inProgressStalelistUpdate, _PhishingController_isProgressC2DomainBlocklistUpdate, _PhishingController_registerMessageHandlers, _PhishingController_processBatch, _PhishingController_updateStalelist, _PhishingController_updateHotlist, _PhishingController_updateC2DomainBlocklist, _PhishingController_queryConfig;
|
|
12
|
+
var _PhishingController_instances, _PhishingController_detector, _PhishingController_stalelistRefreshInterval, _PhishingController_hotlistRefreshInterval, _PhishingController_c2DomainBlocklistRefreshInterval, _PhishingController_urlScanCache, _PhishingController_tokenScanCache, _PhishingController_inProgressHotlistUpdate, _PhishingController_inProgressStalelistUpdate, _PhishingController_isProgressC2DomainBlocklistUpdate, _PhishingController_registerMessageHandlers, _PhishingController_fetchTokenScanBulkResults, _PhishingController_processBatch, _PhishingController_updateStalelist, _PhishingController_updateHotlist, _PhishingController_updateC2DomainBlocklist, _PhishingController_queryConfig;
|
|
13
13
|
import { BaseController } from "@metamask/base-controller";
|
|
14
14
|
import { safelyExecute, safelyExecuteWithTimeout } from "@metamask/controller-utils";
|
|
15
15
|
import $punycodepunycodejs from "punycode/punycode.js";
|
|
16
16
|
const { toASCII } = $punycodepunycodejs;
|
|
17
|
+
import { CacheManager } from "./CacheManager.mjs";
|
|
17
18
|
import { PhishingDetector } from "./PhishingDetector.mjs";
|
|
18
19
|
import { PhishingDetectorResultType, RecommendedAction } from "./types.mjs";
|
|
19
|
-
import {
|
|
20
|
-
import { applyDiffs, fetchTimeNow, getHostnameFromUrl, roundToNearestMinute, getHostnameFromWebUrl } from "./utils.mjs";
|
|
20
|
+
import { applyDiffs, fetchTimeNow, getHostnameFromUrl, roundToNearestMinute, getHostnameFromWebUrl, buildCacheKey, splitCacheHits, resolveChainName } from "./utils.mjs";
|
|
21
21
|
export const PHISHING_CONFIG_BASE_URL = 'https://phishing-detection.api.cx.metamask.io';
|
|
22
22
|
export const METAMASK_STALELIST_FILE = '/v1/stalelist';
|
|
23
23
|
export const METAMASK_HOTLIST_DIFF_FILE = '/v1/diffsSince';
|
|
@@ -26,6 +26,13 @@ export const C2_DOMAIN_BLOCKLIST_ENDPOINT = '/v1/request-blocklist';
|
|
|
26
26
|
export const PHISHING_DETECTION_BASE_URL = 'https://dapp-scanning.api.cx.metamask.io';
|
|
27
27
|
export const PHISHING_DETECTION_SCAN_ENDPOINT = 'v2/scan';
|
|
28
28
|
export const PHISHING_DETECTION_BULK_SCAN_ENDPOINT = 'bulk-scan';
|
|
29
|
+
export const SECURITY_ALERTS_BASE_URL = 'https://security-alerts.api.cx.metamask.io';
|
|
30
|
+
export const TOKEN_BULK_SCANNING_ENDPOINT = '/token/scan-bulk';
|
|
31
|
+
// Cache configuration defaults
|
|
32
|
+
export const DEFAULT_URL_SCAN_CACHE_TTL = 15 * 60; // 15 minutes in seconds
|
|
33
|
+
export const DEFAULT_URL_SCAN_CACHE_MAX_SIZE = 250;
|
|
34
|
+
export const DEFAULT_TOKEN_SCAN_CACHE_TTL = 15 * 60; // 15 minutes in seconds
|
|
35
|
+
export const DEFAULT_TOKEN_SCAN_CACHE_MAX_SIZE = 1000;
|
|
29
36
|
export const C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL = 5 * 60; // 5 mins in seconds
|
|
30
37
|
export const HOTLIST_REFRESH_INTERVAL = 5 * 60; // 5 mins in seconds
|
|
31
38
|
export const STALELIST_REFRESH_INTERVAL = 30 * 24 * 60 * 60; // 30 days in seconds
|
|
@@ -99,6 +106,12 @@ const metadata = {
|
|
|
99
106
|
anonymous: false,
|
|
100
107
|
usedInUi: true,
|
|
101
108
|
},
|
|
109
|
+
tokenScanCache: {
|
|
110
|
+
includeInStateLogs: false,
|
|
111
|
+
persist: true,
|
|
112
|
+
anonymous: false,
|
|
113
|
+
usedInUi: true,
|
|
114
|
+
},
|
|
102
115
|
};
|
|
103
116
|
/**
|
|
104
117
|
* Get a default empty state for the controller.
|
|
@@ -112,6 +125,7 @@ const getDefaultState = () => {
|
|
|
112
125
|
stalelistLastFetched: 0,
|
|
113
126
|
c2DomainBlocklistLastFetched: 0,
|
|
114
127
|
urlScanCache: {},
|
|
128
|
+
tokenScanCache: {},
|
|
115
129
|
};
|
|
116
130
|
};
|
|
117
131
|
/**
|
|
@@ -127,10 +141,12 @@ export class PhishingController extends BaseController {
|
|
|
127
141
|
* @param config.c2DomainBlocklistRefreshInterval - Polling interval used to fetch c2 domain blocklist.
|
|
128
142
|
* @param config.urlScanCacheTTL - Time to live in seconds for cached scan results.
|
|
129
143
|
* @param config.urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
144
|
+
* @param config.tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
145
|
+
* @param config.tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
130
146
|
* @param config.messenger - The controller restricted messenger.
|
|
131
147
|
* @param config.state - Initial state to set on this controller.
|
|
132
148
|
*/
|
|
133
|
-
constructor({ stalelistRefreshInterval = STALELIST_REFRESH_INTERVAL, hotlistRefreshInterval = HOTLIST_REFRESH_INTERVAL, c2DomainBlocklistRefreshInterval = C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL, urlScanCacheTTL = DEFAULT_URL_SCAN_CACHE_TTL, urlScanCacheMaxSize = DEFAULT_URL_SCAN_CACHE_MAX_SIZE, messenger, state = {}, }) {
|
|
149
|
+
constructor({ stalelistRefreshInterval = STALELIST_REFRESH_INTERVAL, hotlistRefreshInterval = HOTLIST_REFRESH_INTERVAL, c2DomainBlocklistRefreshInterval = C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL, urlScanCacheTTL = DEFAULT_URL_SCAN_CACHE_TTL, urlScanCacheMaxSize = DEFAULT_URL_SCAN_CACHE_MAX_SIZE, tokenScanCacheTTL = DEFAULT_TOKEN_SCAN_CACHE_TTL, tokenScanCacheMaxSize = DEFAULT_TOKEN_SCAN_CACHE_MAX_SIZE, messenger, state = {}, }) {
|
|
134
150
|
super({
|
|
135
151
|
name: controllerName,
|
|
136
152
|
metadata,
|
|
@@ -148,6 +164,7 @@ export class PhishingController extends BaseController {
|
|
|
148
164
|
_PhishingController_hotlistRefreshInterval.set(this, void 0);
|
|
149
165
|
_PhishingController_c2DomainBlocklistRefreshInterval.set(this, void 0);
|
|
150
166
|
_PhishingController_urlScanCache.set(this, void 0);
|
|
167
|
+
_PhishingController_tokenScanCache.set(this, void 0);
|
|
151
168
|
_PhishingController_inProgressHotlistUpdate.set(this, void 0);
|
|
152
169
|
_PhishingController_inProgressStalelistUpdate.set(this, void 0);
|
|
153
170
|
_PhishingController_isProgressC2DomainBlocklistUpdate.set(this, void 0);
|
|
@@ -205,7 +222,7 @@ export class PhishingController extends BaseController {
|
|
|
205
222
|
hostname,
|
|
206
223
|
recommendedAction: apiResponse.recommendedAction,
|
|
207
224
|
};
|
|
208
|
-
__classPrivateFieldGet(this, _PhishingController_urlScanCache, "f").
|
|
225
|
+
__classPrivateFieldGet(this, _PhishingController_urlScanCache, "f").set(hostname, result);
|
|
209
226
|
return result;
|
|
210
227
|
};
|
|
211
228
|
/**
|
|
@@ -282,7 +299,7 @@ export class PhishingController extends BaseController {
|
|
|
282
299
|
Object.entries(batchResponse.results).forEach(([url, result]) => {
|
|
283
300
|
const hostname = urlsToHostnames[url];
|
|
284
301
|
if (hostname) {
|
|
285
|
-
__classPrivateFieldGet(this, _PhishingController_urlScanCache, "f").
|
|
302
|
+
__classPrivateFieldGet(this, _PhishingController_urlScanCache, "f").set(hostname, result);
|
|
286
303
|
}
|
|
287
304
|
combinedResponse.results[url] = result;
|
|
288
305
|
});
|
|
@@ -297,6 +314,102 @@ export class PhishingController extends BaseController {
|
|
|
297
314
|
}
|
|
298
315
|
return combinedResponse;
|
|
299
316
|
};
|
|
317
|
+
/**
|
|
318
|
+
* Fetch bulk token scan results from the security alerts API.
|
|
319
|
+
*
|
|
320
|
+
* @param chain - The chain name.
|
|
321
|
+
* @param tokens - Array of token addresses to scan.
|
|
322
|
+
* @returns The API response or null if there was an error.
|
|
323
|
+
*/
|
|
324
|
+
_PhishingController_fetchTokenScanBulkResults.set(this, async (chain, tokens) => {
|
|
325
|
+
const timeout = 8000; // 8 seconds
|
|
326
|
+
const apiResponse = await safelyExecuteWithTimeout(async () => {
|
|
327
|
+
const response = await fetch(`${SECURITY_ALERTS_BASE_URL}${TOKEN_BULK_SCANNING_ENDPOINT}`, {
|
|
328
|
+
method: 'POST',
|
|
329
|
+
headers: {
|
|
330
|
+
Accept: 'application/json',
|
|
331
|
+
'Content-Type': 'application/json',
|
|
332
|
+
},
|
|
333
|
+
body: JSON.stringify({
|
|
334
|
+
chain,
|
|
335
|
+
tokens,
|
|
336
|
+
}),
|
|
337
|
+
});
|
|
338
|
+
if (!response.ok) {
|
|
339
|
+
return {
|
|
340
|
+
error: `${response.status} ${response.statusText}`,
|
|
341
|
+
status: response.status,
|
|
342
|
+
statusText: response.statusText,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
const data = await response.json();
|
|
346
|
+
return data;
|
|
347
|
+
}, true, timeout);
|
|
348
|
+
if (!apiResponse) {
|
|
349
|
+
console.error(`Error scanning tokens: timeout of ${timeout}ms exceeded`);
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
if ('error' in apiResponse &&
|
|
353
|
+
'status' in apiResponse &&
|
|
354
|
+
'statusText' in apiResponse) {
|
|
355
|
+
console.warn(`Token bulk screening API error: ${apiResponse.status} ${apiResponse.statusText}`);
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
return apiResponse;
|
|
359
|
+
});
|
|
360
|
+
/**
|
|
361
|
+
* Scan multiple tokens for malicious activity in bulk.
|
|
362
|
+
*
|
|
363
|
+
* @param request - The bulk scan request containing chainId and tokens.
|
|
364
|
+
* @param request.chainId - The chain ID in hex format (e.g., '0x1' for Ethereum).
|
|
365
|
+
* @param request.tokens - Array of token addresses to scan.
|
|
366
|
+
* @returns A mapping of lowercase token addresses to their scan results. Tokens that fail to scan are omitted.
|
|
367
|
+
*/
|
|
368
|
+
this.bulkScanTokens = async (request) => {
|
|
369
|
+
const { chainId, tokens } = request;
|
|
370
|
+
if (!tokens || tokens.length === 0) {
|
|
371
|
+
return {};
|
|
372
|
+
}
|
|
373
|
+
const MAX_TOKENS_PER_REQUEST = 100;
|
|
374
|
+
if (tokens.length > MAX_TOKENS_PER_REQUEST) {
|
|
375
|
+
console.warn(`Maximum of ${MAX_TOKENS_PER_REQUEST} tokens allowed per request`);
|
|
376
|
+
return {};
|
|
377
|
+
}
|
|
378
|
+
const normalizedChainId = chainId.toLowerCase();
|
|
379
|
+
const chain = resolveChainName(normalizedChainId);
|
|
380
|
+
if (!chain) {
|
|
381
|
+
console.warn(`Unknown chain ID: ${chainId}`);
|
|
382
|
+
return {};
|
|
383
|
+
}
|
|
384
|
+
// Split tokens into cached results and tokens that need to be fetched
|
|
385
|
+
const { cachedResults, tokensToFetch } = splitCacheHits(__classPrivateFieldGet(this, _PhishingController_tokenScanCache, "f"), normalizedChainId, tokens);
|
|
386
|
+
const results = { ...cachedResults };
|
|
387
|
+
// If there are tokens to fetch, call the bulk token scan API
|
|
388
|
+
if (tokensToFetch.length > 0) {
|
|
389
|
+
const apiResponse = await __classPrivateFieldGet(this, _PhishingController_fetchTokenScanBulkResults, "f").call(this, chain, tokensToFetch);
|
|
390
|
+
if (apiResponse?.results) {
|
|
391
|
+
// Process API results and update cache
|
|
392
|
+
for (const tokenAddress of tokensToFetch) {
|
|
393
|
+
const normalizedAddress = tokenAddress.toLowerCase();
|
|
394
|
+
const tokenResult = apiResponse.results[normalizedAddress];
|
|
395
|
+
if (tokenResult?.result_type) {
|
|
396
|
+
const result = {
|
|
397
|
+
result_type: tokenResult.result_type,
|
|
398
|
+
chain: tokenResult.chain || normalizedChainId,
|
|
399
|
+
address: tokenResult.address || normalizedAddress,
|
|
400
|
+
};
|
|
401
|
+
// Update cache
|
|
402
|
+
const cacheKey = buildCacheKey(normalizedChainId, normalizedAddress);
|
|
403
|
+
__classPrivateFieldGet(this, _PhishingController_tokenScanCache, "f").set(cacheKey, {
|
|
404
|
+
result_type: tokenResult.result_type,
|
|
405
|
+
});
|
|
406
|
+
results[normalizedAddress] = result;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return results;
|
|
412
|
+
};
|
|
300
413
|
/**
|
|
301
414
|
* Process a batch of URLs (up to 50) for phishing detection.
|
|
302
415
|
*
|
|
@@ -348,7 +461,7 @@ export class PhishingController extends BaseController {
|
|
|
348
461
|
__classPrivateFieldSet(this, _PhishingController_stalelistRefreshInterval, stalelistRefreshInterval, "f");
|
|
349
462
|
__classPrivateFieldSet(this, _PhishingController_hotlistRefreshInterval, hotlistRefreshInterval, "f");
|
|
350
463
|
__classPrivateFieldSet(this, _PhishingController_c2DomainBlocklistRefreshInterval, c2DomainBlocklistRefreshInterval, "f");
|
|
351
|
-
__classPrivateFieldSet(this, _PhishingController_urlScanCache, new
|
|
464
|
+
__classPrivateFieldSet(this, _PhishingController_urlScanCache, new CacheManager({
|
|
352
465
|
cacheTTL: urlScanCacheTTL,
|
|
353
466
|
maxCacheSize: urlScanCacheMaxSize,
|
|
354
467
|
initialCache: this.state.urlScanCache,
|
|
@@ -358,6 +471,16 @@ export class PhishingController extends BaseController {
|
|
|
358
471
|
});
|
|
359
472
|
},
|
|
360
473
|
}), "f");
|
|
474
|
+
__classPrivateFieldSet(this, _PhishingController_tokenScanCache, new CacheManager({
|
|
475
|
+
cacheTTL: tokenScanCacheTTL,
|
|
476
|
+
maxCacheSize: tokenScanCacheMaxSize,
|
|
477
|
+
initialCache: this.state.tokenScanCache,
|
|
478
|
+
updateState: (cache) => {
|
|
479
|
+
this.update((draftState) => {
|
|
480
|
+
draftState.tokenScanCache = cache;
|
|
481
|
+
});
|
|
482
|
+
},
|
|
483
|
+
}), "f");
|
|
361
484
|
__classPrivateFieldGet(this, _PhishingController_instances, "m", _PhishingController_registerMessageHandlers).call(this);
|
|
362
485
|
this.updatePhishingDetector();
|
|
363
486
|
}
|
|
@@ -579,10 +702,11 @@ export class PhishingController extends BaseController {
|
|
|
579
702
|
}
|
|
580
703
|
}
|
|
581
704
|
}
|
|
582
|
-
_PhishingController_detector = new WeakMap(), _PhishingController_stalelistRefreshInterval = new WeakMap(), _PhishingController_hotlistRefreshInterval = new WeakMap(), _PhishingController_c2DomainBlocklistRefreshInterval = new WeakMap(), _PhishingController_urlScanCache = new WeakMap(), _PhishingController_inProgressHotlistUpdate = new WeakMap(), _PhishingController_inProgressStalelistUpdate = new WeakMap(), _PhishingController_isProgressC2DomainBlocklistUpdate = new WeakMap(), _PhishingController_processBatch = new WeakMap(), _PhishingController_instances = new WeakSet(), _PhishingController_registerMessageHandlers = function _PhishingController_registerMessageHandlers() {
|
|
705
|
+
_PhishingController_detector = new WeakMap(), _PhishingController_stalelistRefreshInterval = new WeakMap(), _PhishingController_hotlistRefreshInterval = new WeakMap(), _PhishingController_c2DomainBlocklistRefreshInterval = new WeakMap(), _PhishingController_urlScanCache = new WeakMap(), _PhishingController_tokenScanCache = new WeakMap(), _PhishingController_inProgressHotlistUpdate = new WeakMap(), _PhishingController_inProgressStalelistUpdate = new WeakMap(), _PhishingController_isProgressC2DomainBlocklistUpdate = new WeakMap(), _PhishingController_fetchTokenScanBulkResults = new WeakMap(), _PhishingController_processBatch = new WeakMap(), _PhishingController_instances = new WeakSet(), _PhishingController_registerMessageHandlers = function _PhishingController_registerMessageHandlers() {
|
|
583
706
|
this.messagingSystem.registerActionHandler(`${controllerName}:maybeUpdateState`, this.maybeUpdateState.bind(this));
|
|
584
707
|
this.messagingSystem.registerActionHandler(`${controllerName}:testOrigin`, this.test.bind(this));
|
|
585
708
|
this.messagingSystem.registerActionHandler(`${controllerName}:bulkScanUrls`, this.bulkScanUrls.bind(this));
|
|
709
|
+
this.messagingSystem.registerActionHandler(`${controllerName}:bulkScanTokens`, this.bulkScanTokens.bind(this));
|
|
586
710
|
}, _PhishingController_updateStalelist =
|
|
587
711
|
/**
|
|
588
712
|
* Update the stalelist configuration.
|