@metamask-previews/phishing-controller 15.0.1-preview-21a5ddac → 16.0.0-preview-4ed214fa
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 +15 -5
- package/dist/PhishingController.cjs +101 -4
- package/dist/PhishingController.cjs.map +1 -1
- package/dist/PhishingController.d.cts +28 -4
- package/dist/PhishingController.d.cts.map +1 -1
- package/dist/PhishingController.d.mts +28 -4
- package/dist/PhishingController.d.mts.map +1 -1
- package/dist/PhishingController.mjs +101 -4
- package/dist/PhishingController.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs +37 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +55 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +55 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +36 -0
- package/dist/types.mjs.map +1 -1
- package/dist/utils.d.cts +14 -0
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts +14 -0
- package/dist/utils.d.mts.map +1 -1
- package/package.json +4 -4
|
@@ -3,7 +3,7 @@ import { type Messenger } from "@metamask/messenger";
|
|
|
3
3
|
import type { TransactionControllerStateChangeEvent } from "@metamask/transaction-controller";
|
|
4
4
|
import { type CacheEntry } from "./CacheManager.cjs";
|
|
5
5
|
import { type PathTrie } from "./PathTrie.cjs";
|
|
6
|
-
import { type PhishingDetectorResult, type PhishingDetectionScanResult, type TokenScanCacheData, type BulkTokenScanResponse, type BulkTokenScanRequest } from "./types.cjs";
|
|
6
|
+
import { type PhishingDetectorResult, type PhishingDetectionScanResult, type TokenScanCacheData, type BulkTokenScanResponse, type BulkTokenScanRequest, type AddressScanCacheData, type AddressScanResult } from "./types.cjs";
|
|
7
7
|
export declare const PHISHING_CONFIG_BASE_URL = "https://phishing-detection.api.cx.metamask.io";
|
|
8
8
|
export declare const METAMASK_STALELIST_FILE = "/v1/stalelist";
|
|
9
9
|
export declare const METAMASK_HOTLIST_DIFF_FILE = "/v2/diffsSince";
|
|
@@ -14,10 +14,13 @@ export declare const PHISHING_DETECTION_SCAN_ENDPOINT = "v2/scan";
|
|
|
14
14
|
export declare const PHISHING_DETECTION_BULK_SCAN_ENDPOINT = "bulk-scan";
|
|
15
15
|
export declare const SECURITY_ALERTS_BASE_URL = "https://security-alerts.api.cx.metamask.io";
|
|
16
16
|
export declare const TOKEN_BULK_SCANNING_ENDPOINT = "/token/scan-bulk";
|
|
17
|
+
export declare const ADDRESS_SCAN_ENDPOINT = "/address/evm/scan";
|
|
17
18
|
export declare const DEFAULT_URL_SCAN_CACHE_TTL: number;
|
|
18
19
|
export declare const DEFAULT_URL_SCAN_CACHE_MAX_SIZE = 250;
|
|
19
20
|
export declare const DEFAULT_TOKEN_SCAN_CACHE_TTL: number;
|
|
20
21
|
export declare const DEFAULT_TOKEN_SCAN_CACHE_MAX_SIZE = 1000;
|
|
22
|
+
export declare const DEFAULT_ADDRESS_SCAN_CACHE_TTL: number;
|
|
23
|
+
export declare const DEFAULT_ADDRESS_SCAN_CACHE_MAX_SIZE = 1000;
|
|
21
24
|
export declare const C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL: number;
|
|
22
25
|
export declare const HOTLIST_REFRESH_INTERVAL: number;
|
|
23
26
|
export declare const STALELIST_REFRESH_INTERVAL: number;
|
|
@@ -170,7 +173,9 @@ declare const controllerName = "PhishingController";
|
|
|
170
173
|
* hotlistLastFetched - timestamp of the last hotlist fetch
|
|
171
174
|
* stalelistLastFetched - timestamp of the last stalelist fetch
|
|
172
175
|
* c2DomainBlocklistLastFetched - timestamp of the last c2 domain blocklist fetch
|
|
173
|
-
* urlScanCache - cache of scan results
|
|
176
|
+
* urlScanCache - cache of URL scan results
|
|
177
|
+
* tokenScanCache - cache of token scan results
|
|
178
|
+
* addressScanCache - cache of address scan results
|
|
174
179
|
*/
|
|
175
180
|
export type PhishingControllerState = {
|
|
176
181
|
phishingLists: PhishingListState[];
|
|
@@ -181,6 +186,7 @@ export type PhishingControllerState = {
|
|
|
181
186
|
c2DomainBlocklistLastFetched: number;
|
|
182
187
|
urlScanCache: Record<string, CacheEntry<PhishingDetectionScanResult>>;
|
|
183
188
|
tokenScanCache: Record<string, CacheEntry<TokenScanCacheData>>;
|
|
189
|
+
addressScanCache: Record<string, CacheEntry<AddressScanCacheData>>;
|
|
184
190
|
};
|
|
185
191
|
/**
|
|
186
192
|
* PhishingControllerOptions
|
|
@@ -193,6 +199,8 @@ export type PhishingControllerState = {
|
|
|
193
199
|
* urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
194
200
|
* tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
195
201
|
* tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
202
|
+
* addressScanCacheTTL - Time to live in seconds for cached address scan results.
|
|
203
|
+
* addressScanCacheMaxSize - Maximum number of entries in the address scan cache.
|
|
196
204
|
*/
|
|
197
205
|
export type PhishingControllerOptions = {
|
|
198
206
|
stalelistRefreshInterval?: number;
|
|
@@ -202,6 +210,8 @@ export type PhishingControllerOptions = {
|
|
|
202
210
|
urlScanCacheMaxSize?: number;
|
|
203
211
|
tokenScanCacheTTL?: number;
|
|
204
212
|
tokenScanCacheMaxSize?: number;
|
|
213
|
+
addressScanCacheTTL?: number;
|
|
214
|
+
addressScanCacheMaxSize?: number;
|
|
205
215
|
messenger: PhishingControllerMessenger;
|
|
206
216
|
state?: Partial<PhishingControllerState>;
|
|
207
217
|
};
|
|
@@ -221,8 +231,12 @@ export type PhishingControllerBulkScanTokensAction = {
|
|
|
221
231
|
type: `${typeof controllerName}:bulkScanTokens`;
|
|
222
232
|
handler: PhishingController['bulkScanTokens'];
|
|
223
233
|
};
|
|
234
|
+
export type PhishingControllerScanAddressAction = {
|
|
235
|
+
type: `${typeof controllerName}:scanAddress`;
|
|
236
|
+
handler: PhishingController['scanAddress'];
|
|
237
|
+
};
|
|
224
238
|
export type PhishingControllerGetStateAction = ControllerGetStateAction<typeof controllerName, PhishingControllerState>;
|
|
225
|
-
export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin | PhishingControllerBulkScanUrlsAction | PhishingControllerBulkScanTokensAction;
|
|
239
|
+
export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin | PhishingControllerBulkScanUrlsAction | PhishingControllerBulkScanTokensAction | PhishingControllerScanAddressAction;
|
|
226
240
|
export type PhishingControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, PhishingControllerState>;
|
|
227
241
|
export type PhishingControllerEvents = PhishingControllerStateChangeEvent;
|
|
228
242
|
/**
|
|
@@ -262,10 +276,12 @@ export declare class PhishingController extends BaseController<typeof controller
|
|
|
262
276
|
* @param config.urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
263
277
|
* @param config.tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
264
278
|
* @param config.tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
279
|
+
* @param config.addressScanCacheTTL - Time to live in seconds for cached address scan results.
|
|
280
|
+
* @param config.addressScanCacheMaxSize - Maximum number of entries in the address scan cache.
|
|
265
281
|
* @param config.messenger - The controller restricted messenger.
|
|
266
282
|
* @param config.state - Initial state to set on this controller.
|
|
267
283
|
*/
|
|
268
|
-
constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, urlScanCacheTTL, urlScanCacheMaxSize, tokenScanCacheTTL, tokenScanCacheMaxSize, messenger, state, }: PhishingControllerOptions);
|
|
284
|
+
constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, urlScanCacheTTL, urlScanCacheMaxSize, tokenScanCacheTTL, tokenScanCacheMaxSize, addressScanCacheTTL, addressScanCacheMaxSize, messenger, state, }: PhishingControllerOptions);
|
|
269
285
|
/**
|
|
270
286
|
* Updates this.detector with an instance of PhishingDetector using the current state.
|
|
271
287
|
*/
|
|
@@ -402,6 +418,14 @@ export declare class PhishingController extends BaseController<typeof controller
|
|
|
402
418
|
* @returns A mapping of URLs to their phishing detection scan results and errors.
|
|
403
419
|
*/
|
|
404
420
|
bulkScanUrls: (urls: string[]) => Promise<BulkPhishingDetectionScanResponse>;
|
|
421
|
+
/**
|
|
422
|
+
* Scan an address for security alerts.
|
|
423
|
+
*
|
|
424
|
+
* @param chainId - The chain ID in hex format (e.g., '0x1' for Ethereum).
|
|
425
|
+
* @param address - The address to scan.
|
|
426
|
+
* @returns The address scan result.
|
|
427
|
+
*/
|
|
428
|
+
scanAddress: (chainId: string, address: string) => Promise<AddressScanResult>;
|
|
405
429
|
/**
|
|
406
430
|
* Scan multiple tokens for malicious activity in bulk.
|
|
407
431
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhishingController.d.cts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,kCAAkC;AAKnC,OAAO,EAAE,KAAK,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,qCAAqC,EAEtC,yCAAyC;AAI1C,OAAO,EAAgB,KAAK,UAAU,EAAE,2BAAuB;AAC/D,OAAO,EACL,KAAK,QAAQ,EAId,uBAAmB;AAEpB,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAEhC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"PhishingController.d.cts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { type Messenger } from "@metamask/messenger";
|
|
|
3
3
|
import type { TransactionControllerStateChangeEvent } from "@metamask/transaction-controller";
|
|
4
4
|
import { type CacheEntry } from "./CacheManager.mjs";
|
|
5
5
|
import { type PathTrie } from "./PathTrie.mjs";
|
|
6
|
-
import { type PhishingDetectorResult, type PhishingDetectionScanResult, type TokenScanCacheData, type BulkTokenScanResponse, type BulkTokenScanRequest } from "./types.mjs";
|
|
6
|
+
import { type PhishingDetectorResult, type PhishingDetectionScanResult, type TokenScanCacheData, type BulkTokenScanResponse, type BulkTokenScanRequest, type AddressScanCacheData, type AddressScanResult } from "./types.mjs";
|
|
7
7
|
export declare const PHISHING_CONFIG_BASE_URL = "https://phishing-detection.api.cx.metamask.io";
|
|
8
8
|
export declare const METAMASK_STALELIST_FILE = "/v1/stalelist";
|
|
9
9
|
export declare const METAMASK_HOTLIST_DIFF_FILE = "/v2/diffsSince";
|
|
@@ -14,10 +14,13 @@ export declare const PHISHING_DETECTION_SCAN_ENDPOINT = "v2/scan";
|
|
|
14
14
|
export declare const PHISHING_DETECTION_BULK_SCAN_ENDPOINT = "bulk-scan";
|
|
15
15
|
export declare const SECURITY_ALERTS_BASE_URL = "https://security-alerts.api.cx.metamask.io";
|
|
16
16
|
export declare const TOKEN_BULK_SCANNING_ENDPOINT = "/token/scan-bulk";
|
|
17
|
+
export declare const ADDRESS_SCAN_ENDPOINT = "/address/evm/scan";
|
|
17
18
|
export declare const DEFAULT_URL_SCAN_CACHE_TTL: number;
|
|
18
19
|
export declare const DEFAULT_URL_SCAN_CACHE_MAX_SIZE = 250;
|
|
19
20
|
export declare const DEFAULT_TOKEN_SCAN_CACHE_TTL: number;
|
|
20
21
|
export declare const DEFAULT_TOKEN_SCAN_CACHE_MAX_SIZE = 1000;
|
|
22
|
+
export declare const DEFAULT_ADDRESS_SCAN_CACHE_TTL: number;
|
|
23
|
+
export declare const DEFAULT_ADDRESS_SCAN_CACHE_MAX_SIZE = 1000;
|
|
21
24
|
export declare const C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL: number;
|
|
22
25
|
export declare const HOTLIST_REFRESH_INTERVAL: number;
|
|
23
26
|
export declare const STALELIST_REFRESH_INTERVAL: number;
|
|
@@ -170,7 +173,9 @@ declare const controllerName = "PhishingController";
|
|
|
170
173
|
* hotlistLastFetched - timestamp of the last hotlist fetch
|
|
171
174
|
* stalelistLastFetched - timestamp of the last stalelist fetch
|
|
172
175
|
* c2DomainBlocklistLastFetched - timestamp of the last c2 domain blocklist fetch
|
|
173
|
-
* urlScanCache - cache of scan results
|
|
176
|
+
* urlScanCache - cache of URL scan results
|
|
177
|
+
* tokenScanCache - cache of token scan results
|
|
178
|
+
* addressScanCache - cache of address scan results
|
|
174
179
|
*/
|
|
175
180
|
export type PhishingControllerState = {
|
|
176
181
|
phishingLists: PhishingListState[];
|
|
@@ -181,6 +186,7 @@ export type PhishingControllerState = {
|
|
|
181
186
|
c2DomainBlocklistLastFetched: number;
|
|
182
187
|
urlScanCache: Record<string, CacheEntry<PhishingDetectionScanResult>>;
|
|
183
188
|
tokenScanCache: Record<string, CacheEntry<TokenScanCacheData>>;
|
|
189
|
+
addressScanCache: Record<string, CacheEntry<AddressScanCacheData>>;
|
|
184
190
|
};
|
|
185
191
|
/**
|
|
186
192
|
* PhishingControllerOptions
|
|
@@ -193,6 +199,8 @@ export type PhishingControllerState = {
|
|
|
193
199
|
* urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
194
200
|
* tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
195
201
|
* tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
202
|
+
* addressScanCacheTTL - Time to live in seconds for cached address scan results.
|
|
203
|
+
* addressScanCacheMaxSize - Maximum number of entries in the address scan cache.
|
|
196
204
|
*/
|
|
197
205
|
export type PhishingControllerOptions = {
|
|
198
206
|
stalelistRefreshInterval?: number;
|
|
@@ -202,6 +210,8 @@ export type PhishingControllerOptions = {
|
|
|
202
210
|
urlScanCacheMaxSize?: number;
|
|
203
211
|
tokenScanCacheTTL?: number;
|
|
204
212
|
tokenScanCacheMaxSize?: number;
|
|
213
|
+
addressScanCacheTTL?: number;
|
|
214
|
+
addressScanCacheMaxSize?: number;
|
|
205
215
|
messenger: PhishingControllerMessenger;
|
|
206
216
|
state?: Partial<PhishingControllerState>;
|
|
207
217
|
};
|
|
@@ -221,8 +231,12 @@ export type PhishingControllerBulkScanTokensAction = {
|
|
|
221
231
|
type: `${typeof controllerName}:bulkScanTokens`;
|
|
222
232
|
handler: PhishingController['bulkScanTokens'];
|
|
223
233
|
};
|
|
234
|
+
export type PhishingControllerScanAddressAction = {
|
|
235
|
+
type: `${typeof controllerName}:scanAddress`;
|
|
236
|
+
handler: PhishingController['scanAddress'];
|
|
237
|
+
};
|
|
224
238
|
export type PhishingControllerGetStateAction = ControllerGetStateAction<typeof controllerName, PhishingControllerState>;
|
|
225
|
-
export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin | PhishingControllerBulkScanUrlsAction | PhishingControllerBulkScanTokensAction;
|
|
239
|
+
export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin | PhishingControllerBulkScanUrlsAction | PhishingControllerBulkScanTokensAction | PhishingControllerScanAddressAction;
|
|
226
240
|
export type PhishingControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, PhishingControllerState>;
|
|
227
241
|
export type PhishingControllerEvents = PhishingControllerStateChangeEvent;
|
|
228
242
|
/**
|
|
@@ -262,10 +276,12 @@ export declare class PhishingController extends BaseController<typeof controller
|
|
|
262
276
|
* @param config.urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
263
277
|
* @param config.tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
264
278
|
* @param config.tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
279
|
+
* @param config.addressScanCacheTTL - Time to live in seconds for cached address scan results.
|
|
280
|
+
* @param config.addressScanCacheMaxSize - Maximum number of entries in the address scan cache.
|
|
265
281
|
* @param config.messenger - The controller restricted messenger.
|
|
266
282
|
* @param config.state - Initial state to set on this controller.
|
|
267
283
|
*/
|
|
268
|
-
constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, urlScanCacheTTL, urlScanCacheMaxSize, tokenScanCacheTTL, tokenScanCacheMaxSize, messenger, state, }: PhishingControllerOptions);
|
|
284
|
+
constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, urlScanCacheTTL, urlScanCacheMaxSize, tokenScanCacheTTL, tokenScanCacheMaxSize, addressScanCacheTTL, addressScanCacheMaxSize, messenger, state, }: PhishingControllerOptions);
|
|
269
285
|
/**
|
|
270
286
|
* Updates this.detector with an instance of PhishingDetector using the current state.
|
|
271
287
|
*/
|
|
@@ -402,6 +418,14 @@ export declare class PhishingController extends BaseController<typeof controller
|
|
|
402
418
|
* @returns A mapping of URLs to their phishing detection scan results and errors.
|
|
403
419
|
*/
|
|
404
420
|
bulkScanUrls: (urls: string[]) => Promise<BulkPhishingDetectionScanResponse>;
|
|
421
|
+
/**
|
|
422
|
+
* Scan an address for security alerts.
|
|
423
|
+
*
|
|
424
|
+
* @param chainId - The chain ID in hex format (e.g., '0x1' for Ethereum).
|
|
425
|
+
* @param address - The address to scan.
|
|
426
|
+
* @returns The address scan result.
|
|
427
|
+
*/
|
|
428
|
+
scanAddress: (chainId: string, address: string) => Promise<AddressScanResult>;
|
|
405
429
|
/**
|
|
406
430
|
* Scan multiple tokens for malicious activity in bulk.
|
|
407
431
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhishingController.d.mts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,kCAAkC;AAKnC,OAAO,EAAE,KAAK,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,qCAAqC,EAEtC,yCAAyC;AAI1C,OAAO,EAAgB,KAAK,UAAU,EAAE,2BAAuB;AAC/D,OAAO,EACL,KAAK,QAAQ,EAId,uBAAmB;AAEpB,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAEhC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"PhishingController.d.mts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ 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_tokenScanCache, _PhishingController_inProgressHotlistUpdate, _PhishingController_inProgressStalelistUpdate, _PhishingController_isProgressC2DomainBlocklistUpdate, _PhishingController_transactionControllerStateChangeHandler, _PhishingController_subscribeToTransactionControllerStateChange, _PhishingController_registerMessageHandlers, _PhishingController_isTransactionPatch, _PhishingController_isSimulationDataPatch, _PhishingController_onTransactionControllerStateChange, _PhishingController_getTokensFromTransaction, _PhishingController_scanTokensByChain, _PhishingController_fetchTokenScanBulkResults, _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_addressScanCache, _PhishingController_inProgressHotlistUpdate, _PhishingController_inProgressStalelistUpdate, _PhishingController_isProgressC2DomainBlocklistUpdate, _PhishingController_transactionControllerStateChangeHandler, _PhishingController_subscribeToTransactionControllerStateChange, _PhishingController_registerMessageHandlers, _PhishingController_isTransactionPatch, _PhishingController_isSimulationDataPatch, _PhishingController_onTransactionControllerStateChange, _PhishingController_getTokensFromTransaction, _PhishingController_scanTokensByChain, _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";
|
|
@@ -17,7 +17,7 @@ const { toASCII } = $punycodepunycodejs;
|
|
|
17
17
|
import { CacheManager } from "./CacheManager.mjs";
|
|
18
18
|
import { convertListToTrie, insertToTrie, matchedPathPrefix } from "./PathTrie.mjs";
|
|
19
19
|
import { PhishingDetector } from "./PhishingDetector.mjs";
|
|
20
|
-
import { PhishingDetectorResultType, RecommendedAction } from "./types.mjs";
|
|
20
|
+
import { PhishingDetectorResultType, RecommendedAction, AddressScanResultType } from "./types.mjs";
|
|
21
21
|
import { applyDiffs, fetchTimeNow, getHostnameFromUrl, roundToNearestMinute, getHostnameFromWebUrl, buildCacheKey, splitCacheHits, resolveChainName, getPathnameFromUrl } from "./utils.mjs";
|
|
22
22
|
export const PHISHING_CONFIG_BASE_URL = 'https://phishing-detection.api.cx.metamask.io';
|
|
23
23
|
export const METAMASK_STALELIST_FILE = '/v1/stalelist';
|
|
@@ -29,11 +29,14 @@ export const PHISHING_DETECTION_SCAN_ENDPOINT = 'v2/scan';
|
|
|
29
29
|
export const PHISHING_DETECTION_BULK_SCAN_ENDPOINT = 'bulk-scan';
|
|
30
30
|
export const SECURITY_ALERTS_BASE_URL = 'https://security-alerts.api.cx.metamask.io';
|
|
31
31
|
export const TOKEN_BULK_SCANNING_ENDPOINT = '/token/scan-bulk';
|
|
32
|
+
export const ADDRESS_SCAN_ENDPOINT = '/address/evm/scan';
|
|
32
33
|
// Cache configuration defaults
|
|
33
34
|
export const DEFAULT_URL_SCAN_CACHE_TTL = 15 * 60; // 15 minutes in seconds
|
|
34
35
|
export const DEFAULT_URL_SCAN_CACHE_MAX_SIZE = 250;
|
|
35
36
|
export const DEFAULT_TOKEN_SCAN_CACHE_TTL = 15 * 60; // 15 minutes in seconds
|
|
36
37
|
export const DEFAULT_TOKEN_SCAN_CACHE_MAX_SIZE = 1000;
|
|
38
|
+
export const DEFAULT_ADDRESS_SCAN_CACHE_TTL = 15 * 60; // 15 minutes in seconds
|
|
39
|
+
export const DEFAULT_ADDRESS_SCAN_CACHE_MAX_SIZE = 1000;
|
|
37
40
|
export const C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL = 5 * 60; // 5 mins in seconds
|
|
38
41
|
export const HOTLIST_REFRESH_INTERVAL = 5 * 60; // 5 mins in seconds
|
|
39
42
|
export const STALELIST_REFRESH_INTERVAL = 30 * 24 * 60 * 60; // 30 days in seconds
|
|
@@ -119,6 +122,12 @@ const metadata = {
|
|
|
119
122
|
includeInDebugSnapshot: false,
|
|
120
123
|
usedInUi: true,
|
|
121
124
|
},
|
|
125
|
+
addressScanCache: {
|
|
126
|
+
includeInStateLogs: false,
|
|
127
|
+
persist: true,
|
|
128
|
+
includeInDebugSnapshot: false,
|
|
129
|
+
usedInUi: true,
|
|
130
|
+
},
|
|
122
131
|
};
|
|
123
132
|
/**
|
|
124
133
|
* Get a default empty state for the controller.
|
|
@@ -135,6 +144,7 @@ const getDefaultState = () => {
|
|
|
135
144
|
c2DomainBlocklistLastFetched: 0,
|
|
136
145
|
urlScanCache: {},
|
|
137
146
|
tokenScanCache: {},
|
|
147
|
+
addressScanCache: {},
|
|
138
148
|
};
|
|
139
149
|
};
|
|
140
150
|
/**
|
|
@@ -152,10 +162,12 @@ export class PhishingController extends BaseController {
|
|
|
152
162
|
* @param config.urlScanCacheMaxSize - Maximum number of entries in the scan cache.
|
|
153
163
|
* @param config.tokenScanCacheTTL - Time to live in seconds for cached token scan results.
|
|
154
164
|
* @param config.tokenScanCacheMaxSize - Maximum number of entries in the token scan cache.
|
|
165
|
+
* @param config.addressScanCacheTTL - Time to live in seconds for cached address scan results.
|
|
166
|
+
* @param config.addressScanCacheMaxSize - Maximum number of entries in the address scan cache.
|
|
155
167
|
* @param config.messenger - The controller restricted messenger.
|
|
156
168
|
* @param config.state - Initial state to set on this controller.
|
|
157
169
|
*/
|
|
158
|
-
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 = {}, }) {
|
|
170
|
+
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, addressScanCacheTTL = DEFAULT_ADDRESS_SCAN_CACHE_TTL, addressScanCacheMaxSize = DEFAULT_ADDRESS_SCAN_CACHE_MAX_SIZE, messenger, state = {}, }) {
|
|
159
171
|
super({
|
|
160
172
|
name: controllerName,
|
|
161
173
|
metadata,
|
|
@@ -174,6 +186,7 @@ export class PhishingController extends BaseController {
|
|
|
174
186
|
_PhishingController_c2DomainBlocklistRefreshInterval.set(this, void 0);
|
|
175
187
|
_PhishingController_urlScanCache.set(this, void 0);
|
|
176
188
|
_PhishingController_tokenScanCache.set(this, void 0);
|
|
189
|
+
_PhishingController_addressScanCache.set(this, void 0);
|
|
177
190
|
_PhishingController_inProgressHotlistUpdate.set(this, void 0);
|
|
178
191
|
_PhishingController_inProgressStalelistUpdate.set(this, void 0);
|
|
179
192
|
_PhishingController_isProgressC2DomainBlocklistUpdate.set(this, void 0);
|
|
@@ -367,6 +380,79 @@ export class PhishingController extends BaseController {
|
|
|
367
380
|
}
|
|
368
381
|
return apiResponse;
|
|
369
382
|
});
|
|
383
|
+
/**
|
|
384
|
+
* Scan an address for security alerts.
|
|
385
|
+
*
|
|
386
|
+
* @param chainId - The chain ID in hex format (e.g., '0x1' for Ethereum).
|
|
387
|
+
* @param address - The address to scan.
|
|
388
|
+
* @returns The address scan result.
|
|
389
|
+
*/
|
|
390
|
+
this.scanAddress = async (chainId, address) => {
|
|
391
|
+
if (!address || !chainId) {
|
|
392
|
+
return {
|
|
393
|
+
result_type: AddressScanResultType.ErrorResult,
|
|
394
|
+
label: '',
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
const normalizedChainId = chainId.toLowerCase();
|
|
398
|
+
const normalizedAddress = address.toLowerCase();
|
|
399
|
+
const chain = resolveChainName(normalizedChainId);
|
|
400
|
+
if (!chain) {
|
|
401
|
+
return {
|
|
402
|
+
result_type: AddressScanResultType.ErrorResult,
|
|
403
|
+
label: '',
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
const cacheKey = buildCacheKey(normalizedChainId, normalizedAddress);
|
|
407
|
+
const cachedResult = __classPrivateFieldGet(this, _PhishingController_addressScanCache, "f").get(cacheKey);
|
|
408
|
+
if (cachedResult) {
|
|
409
|
+
return {
|
|
410
|
+
result_type: cachedResult.result_type,
|
|
411
|
+
label: cachedResult.label,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
const apiResponse = await safelyExecuteWithTimeout(async () => {
|
|
415
|
+
const res = await fetch(`${SECURITY_ALERTS_BASE_URL}${ADDRESS_SCAN_ENDPOINT}`, {
|
|
416
|
+
method: 'POST',
|
|
417
|
+
headers: {
|
|
418
|
+
Accept: 'application/json',
|
|
419
|
+
'Content-Type': 'application/json',
|
|
420
|
+
},
|
|
421
|
+
body: JSON.stringify({
|
|
422
|
+
chain,
|
|
423
|
+
address: normalizedAddress,
|
|
424
|
+
}),
|
|
425
|
+
});
|
|
426
|
+
if (!res.ok) {
|
|
427
|
+
return {
|
|
428
|
+
error: `${res.status} ${res.statusText}`,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
const data = await res.json();
|
|
432
|
+
return data;
|
|
433
|
+
}, true, 5000);
|
|
434
|
+
if (!apiResponse) {
|
|
435
|
+
return {
|
|
436
|
+
result_type: AddressScanResultType.ErrorResult,
|
|
437
|
+
label: '',
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
else if ('error' in apiResponse) {
|
|
441
|
+
return {
|
|
442
|
+
result_type: AddressScanResultType.ErrorResult,
|
|
443
|
+
label: '',
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const result = {
|
|
447
|
+
result_type: apiResponse.result_type,
|
|
448
|
+
label: apiResponse.label,
|
|
449
|
+
};
|
|
450
|
+
__classPrivateFieldGet(this, _PhishingController_addressScanCache, "f").set(cacheKey, result);
|
|
451
|
+
return {
|
|
452
|
+
result_type: apiResponse.result_type,
|
|
453
|
+
label: apiResponse.label,
|
|
454
|
+
};
|
|
455
|
+
};
|
|
370
456
|
/**
|
|
371
457
|
* Scan multiple tokens for malicious activity in bulk.
|
|
372
458
|
*
|
|
@@ -492,6 +578,16 @@ export class PhishingController extends BaseController {
|
|
|
492
578
|
});
|
|
493
579
|
},
|
|
494
580
|
}), "f");
|
|
581
|
+
__classPrivateFieldSet(this, _PhishingController_addressScanCache, new CacheManager({
|
|
582
|
+
cacheTTL: addressScanCacheTTL,
|
|
583
|
+
maxCacheSize: addressScanCacheMaxSize,
|
|
584
|
+
initialCache: this.state.addressScanCache,
|
|
585
|
+
updateState: (cache) => {
|
|
586
|
+
this.update((draftState) => {
|
|
587
|
+
draftState.addressScanCache = cache;
|
|
588
|
+
});
|
|
589
|
+
},
|
|
590
|
+
}), "f");
|
|
495
591
|
__classPrivateFieldGet(this, _PhishingController_instances, "m", _PhishingController_registerMessageHandlers).call(this);
|
|
496
592
|
this.updatePhishingDetector();
|
|
497
593
|
__classPrivateFieldGet(this, _PhishingController_instances, "m", _PhishingController_subscribeToTransactionControllerStateChange).call(this);
|
|
@@ -729,13 +825,14 @@ export class PhishingController extends BaseController {
|
|
|
729
825
|
}
|
|
730
826
|
}
|
|
731
827
|
}
|
|
732
|
-
_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_transactionControllerStateChangeHandler = new WeakMap(), _PhishingController_fetchTokenScanBulkResults = new WeakMap(), _PhishingController_processBatch = new WeakMap(), _PhishingController_instances = new WeakSet(), _PhishingController_subscribeToTransactionControllerStateChange = function _PhishingController_subscribeToTransactionControllerStateChange() {
|
|
828
|
+
_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_addressScanCache = new WeakMap(), _PhishingController_inProgressHotlistUpdate = new WeakMap(), _PhishingController_inProgressStalelistUpdate = new WeakMap(), _PhishingController_isProgressC2DomainBlocklistUpdate = new WeakMap(), _PhishingController_transactionControllerStateChangeHandler = new WeakMap(), _PhishingController_fetchTokenScanBulkResults = new WeakMap(), _PhishingController_processBatch = new WeakMap(), _PhishingController_instances = new WeakSet(), _PhishingController_subscribeToTransactionControllerStateChange = function _PhishingController_subscribeToTransactionControllerStateChange() {
|
|
733
829
|
this.messenger.subscribe('TransactionController:stateChange', __classPrivateFieldGet(this, _PhishingController_transactionControllerStateChangeHandler, "f"));
|
|
734
830
|
}, _PhishingController_registerMessageHandlers = function _PhishingController_registerMessageHandlers() {
|
|
735
831
|
this.messenger.registerActionHandler(`${controllerName}:maybeUpdateState`, this.maybeUpdateState.bind(this));
|
|
736
832
|
this.messenger.registerActionHandler(`${controllerName}:testOrigin`, this.test.bind(this));
|
|
737
833
|
this.messenger.registerActionHandler(`${controllerName}:bulkScanUrls`, this.bulkScanUrls.bind(this));
|
|
738
834
|
this.messenger.registerActionHandler(`${controllerName}:bulkScanTokens`, this.bulkScanTokens.bind(this));
|
|
835
|
+
this.messenger.registerActionHandler(`${controllerName}:scanAddress`, this.scanAddress.bind(this));
|
|
739
836
|
}, _PhishingController_isTransactionPatch = function _PhishingController_isTransactionPatch(patch) {
|
|
740
837
|
const { path } = patch;
|
|
741
838
|
return (path.length === 2 &&
|