@metamask-previews/assets-controllers 29.0.0-preview-a1db0714 → 29.0.0-preview-699063fc
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/dist/AccountTrackerController.js +2 -2
- package/dist/AccountTrackerController.mjs +1 -1
- package/dist/NftController.js +2 -2
- package/dist/NftController.mjs +1 -1
- package/dist/NftDetectionController.js +2 -2
- package/dist/NftDetectionController.mjs +1 -1
- package/dist/TokenBalancesController.js +2 -2
- package/dist/TokenBalancesController.mjs +1 -1
- package/dist/TokenDetectionController.js +2 -2
- package/dist/TokenDetectionController.mjs +1 -1
- package/dist/TokenListController.js +3 -3
- package/dist/TokenListController.mjs +2 -2
- package/dist/TokenRatesController.js +2 -2
- package/dist/TokenRatesController.mjs +1 -1
- package/dist/TokensController.js +3 -3
- package/dist/TokensController.mjs +2 -2
- package/dist/{chunk-6AID3HJG.mjs → chunk-4LY47RPI.mjs} +5 -9
- package/dist/chunk-4LY47RPI.mjs.map +1 -0
- package/dist/{chunk-2IFE6FHM.mjs → chunk-ASFD56OL.mjs} +9 -37
- package/dist/chunk-ASFD56OL.mjs.map +1 -0
- package/dist/{chunk-FWKJDOD5.js → chunk-AVPUXAZY.js} +25 -78
- package/dist/chunk-AVPUXAZY.js.map +1 -0
- package/dist/{chunk-RUE635TV.mjs → chunk-C64L6MMU.mjs} +2 -2
- package/dist/{chunk-2MMZPHA6.mjs → chunk-D3PCUDTX.mjs} +21 -44
- package/dist/chunk-D3PCUDTX.mjs.map +1 -0
- package/dist/{chunk-IUDE4QAH.js → chunk-F2F3NGG3.js} +82 -137
- package/dist/chunk-F2F3NGG3.js.map +1 -0
- package/dist/{chunk-OPYNW5AW.js → chunk-I53XGBU3.js} +21 -44
- package/dist/chunk-I53XGBU3.js.map +1 -0
- package/dist/{chunk-3YTCRJI6.js → chunk-IOQX3VTD.js} +13 -27
- package/dist/chunk-IOQX3VTD.js.map +1 -0
- package/dist/{chunk-WNDGC3UZ.js → chunk-LD4GC7OR.js} +5 -9
- package/dist/chunk-LD4GC7OR.js.map +1 -0
- package/dist/{chunk-NRWTWDPT.mjs → chunk-MDHJNCTR.mjs} +23 -76
- package/dist/chunk-MDHJNCTR.mjs.map +1 -0
- package/dist/{chunk-OHSQRYVL.js → chunk-OKEA7NPV.js} +14 -3
- package/dist/chunk-OKEA7NPV.js.map +1 -0
- package/dist/{chunk-Z6FI22NX.mjs → chunk-ONJIVH6M.mjs} +82 -137
- package/dist/chunk-ONJIVH6M.mjs.map +1 -0
- package/dist/{chunk-ZWIFMJBZ.mjs → chunk-OWTCG2N3.mjs} +13 -27
- package/dist/chunk-OWTCG2N3.mjs.map +1 -0
- package/dist/{chunk-6562LMBM.mjs → chunk-PAJTKWEC.mjs} +12 -23
- package/dist/chunk-PAJTKWEC.mjs.map +1 -0
- package/dist/{chunk-NXGX7LZJ.mjs → chunk-S6KASB6I.mjs} +15 -4
- package/dist/chunk-S6KASB6I.mjs.map +1 -0
- package/dist/{chunk-DEQZ35QE.js → chunk-U36OEBF2.js} +3 -3
- package/dist/{chunk-4XJFIURR.js → chunk-V4ZO3F2S.js} +12 -23
- package/dist/chunk-V4ZO3F2S.js.map +1 -0
- package/dist/{chunk-BIUBOZW5.js → chunk-X2MMIBYW.js} +9 -37
- package/dist/chunk-X2MMIBYW.js.map +1 -0
- package/dist/index.js +10 -10
- package/dist/index.mjs +9 -9
- package/dist/token-service.js +2 -2
- package/dist/token-service.mjs +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/AccountTrackerController.d.ts +9 -10
- package/dist/types/AccountTrackerController.d.ts.map +1 -1
- package/dist/types/NftController.d.ts +6 -8
- package/dist/types/NftController.d.ts.map +1 -1
- package/dist/types/NftDetectionController.d.ts +6 -15
- package/dist/types/NftDetectionController.d.ts.map +1 -1
- package/dist/types/TokenBalancesController.d.ts +2 -2
- package/dist/types/TokenBalancesController.d.ts.map +1 -1
- package/dist/types/TokenDetectionController.d.ts +5 -5
- package/dist/types/TokenDetectionController.d.ts.map +1 -1
- package/dist/types/TokenRatesController.d.ts +7 -10
- package/dist/types/TokenRatesController.d.ts.map +1 -1
- package/dist/types/TokensController.d.ts +6 -6
- package/dist/types/TokensController.d.ts.map +1 -1
- package/dist/types/token-service.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-2IFE6FHM.mjs.map +0 -1
- package/dist/chunk-2MMZPHA6.mjs.map +0 -1
- package/dist/chunk-3YTCRJI6.js.map +0 -1
- package/dist/chunk-4XJFIURR.js.map +0 -1
- package/dist/chunk-6562LMBM.mjs.map +0 -1
- package/dist/chunk-6AID3HJG.mjs.map +0 -1
- package/dist/chunk-BIUBOZW5.js.map +0 -1
- package/dist/chunk-FWKJDOD5.js.map +0 -1
- package/dist/chunk-IUDE4QAH.js.map +0 -1
- package/dist/chunk-NRWTWDPT.mjs.map +0 -1
- package/dist/chunk-NXGX7LZJ.mjs.map +0 -1
- package/dist/chunk-OHSQRYVL.js.map +0 -1
- package/dist/chunk-OPYNW5AW.js.map +0 -1
- package/dist/chunk-WNDGC3UZ.js.map +0 -1
- package/dist/chunk-Z6FI22NX.mjs.map +0 -1
- package/dist/chunk-ZWIFMJBZ.mjs.map +0 -1
- /package/dist/{chunk-RUE635TV.mjs.map → chunk-C64L6MMU.mjs.map} +0 -0
- /package/dist/{chunk-DEQZ35QE.js.map → chunk-U36OEBF2.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkV4ZO3F2Sjs = require('./chunk-V4ZO3F2S.js');
|
|
5
5
|
require('./chunk-Z4BLTVTB.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
exports.AccountTrackerController =
|
|
9
|
+
exports.AccountTrackerController = _chunkV4ZO3F2Sjs.AccountTrackerController; exports.default = _chunkV4ZO3F2Sjs.AccountTrackerController_default;
|
|
10
10
|
//# sourceMappingURL=AccountTrackerController.js.map
|
package/dist/NftController.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkF2F3NGG3js = require('./chunk-F2F3NGG3.js');
|
|
6
6
|
require('./chunk-RGHTNZQ6.js');
|
|
7
7
|
require('./chunk-LS6R3HQL.js');
|
|
8
8
|
require('./chunk-Z4BLTVTB.js');
|
|
@@ -10,5 +10,5 @@ require('./chunk-Z4BLTVTB.js');
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
exports.NftController =
|
|
13
|
+
exports.NftController = _chunkF2F3NGG3js.NftController; exports.default = _chunkF2F3NGG3js.NftController_default; exports.getDefaultNftState = _chunkF2F3NGG3js.getDefaultNftState;
|
|
14
14
|
//# sourceMappingURL=NftController.js.map
|
package/dist/NftController.mjs
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkX2MMIBYWjs = require('./chunk-X2MMIBYW.js');
|
|
6
6
|
require('./chunk-RGHTNZQ6.js');
|
|
7
7
|
require('./chunk-Z4BLTVTB.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
exports.BlockaidResultType =
|
|
12
|
+
exports.BlockaidResultType = _chunkX2MMIBYWjs.BlockaidResultType; exports.NftDetectionController = _chunkX2MMIBYWjs.NftDetectionController; exports.default = _chunkX2MMIBYWjs.NftDetectionController_default;
|
|
13
13
|
//# sourceMappingURL=NftDetectionController.js.map
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkLD4GC7ORjs = require('./chunk-LD4GC7OR.js');
|
|
6
6
|
require('./chunk-Z4BLTVTB.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
exports.TokenBalancesController =
|
|
11
|
+
exports.TokenBalancesController = _chunkLD4GC7ORjs.TokenBalancesController; exports.default = _chunkLD4GC7ORjs.TokenBalancesController_default; exports.getDefaultTokenBalancesState = _chunkLD4GC7ORjs.getDefaultTokenBalancesState;
|
|
12
12
|
//# sourceMappingURL=TokenBalancesController.js.map
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkI53XGBU3js = require('./chunk-I53XGBU3.js');
|
|
8
8
|
require('./chunk-LS6R3HQL.js');
|
|
9
9
|
require('./chunk-Z4BLTVTB.js');
|
|
10
10
|
|
|
@@ -13,5 +13,5 @@ require('./chunk-Z4BLTVTB.js');
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
exports.STATIC_MAINNET_TOKEN_LIST =
|
|
16
|
+
exports.STATIC_MAINNET_TOKEN_LIST = _chunkI53XGBU3js.STATIC_MAINNET_TOKEN_LIST; exports.TokenDetectionController = _chunkI53XGBU3js.TokenDetectionController; exports.controllerName = _chunkI53XGBU3js.controllerName; exports.default = _chunkI53XGBU3js.TokenDetectionController_default; exports.isEqualCaseInsensitive = _chunkI53XGBU3js.isEqualCaseInsensitive;
|
|
17
17
|
//# sourceMappingURL=TokenDetectionController.js.map
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
require('./chunk-
|
|
5
|
+
var _chunkU36OEBF2js = require('./chunk-U36OEBF2.js');
|
|
6
|
+
require('./chunk-OKEA7NPV.js');
|
|
7
7
|
require('./chunk-LS6R3HQL.js');
|
|
8
8
|
require('./chunk-Z4BLTVTB.js');
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
exports.TokenListController =
|
|
13
|
+
exports.TokenListController = _chunkU36OEBF2js.TokenListController; exports.default = _chunkU36OEBF2js.TokenListController_default; exports.getDefaultTokenListState = _chunkU36OEBF2js.getDefaultTokenListState;
|
|
14
14
|
//# sourceMappingURL=TokenListController.js.map
|
|
@@ -2,8 +2,8 @@ import {
|
|
|
2
2
|
TokenListController,
|
|
3
3
|
TokenListController_default,
|
|
4
4
|
getDefaultTokenListState
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-C64L6MMU.mjs";
|
|
6
|
+
import "./chunk-S6KASB6I.mjs";
|
|
7
7
|
import "./chunk-X5PLVMOQ.mjs";
|
|
8
8
|
import "./chunk-XUI43LEZ.mjs";
|
|
9
9
|
export {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkIOQX3VTDjs = require('./chunk-IOQX3VTD.js');
|
|
5
5
|
require('./chunk-DYH5P3VY.js');
|
|
6
6
|
require('./chunk-LS6R3HQL.js');
|
|
7
7
|
require('./chunk-Z4BLTVTB.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
exports.TokenRatesController =
|
|
11
|
+
exports.TokenRatesController = _chunkIOQX3VTDjs.TokenRatesController; exports.default = _chunkIOQX3VTDjs.TokenRatesController_default;
|
|
12
12
|
//# sourceMappingURL=TokenRatesController.js.map
|
package/dist/TokensController.js
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkAVPUXAZYjs = require('./chunk-AVPUXAZY.js');
|
|
6
6
|
require('./chunk-3ZHN4GFT.js');
|
|
7
7
|
require('./chunk-BO2WZDUM.js');
|
|
8
|
-
require('./chunk-
|
|
8
|
+
require('./chunk-OKEA7NPV.js');
|
|
9
9
|
require('./chunk-LS6R3HQL.js');
|
|
10
10
|
require('./chunk-Z4BLTVTB.js');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
exports.TokensController =
|
|
15
|
+
exports.TokensController = _chunkAVPUXAZYjs.TokensController; exports.default = _chunkAVPUXAZYjs.TokensController_default; exports.getDefaultTokensState = _chunkAVPUXAZYjs.getDefaultTokensState;
|
|
16
16
|
//# sourceMappingURL=TokensController.js.map
|
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
TokensController,
|
|
3
3
|
TokensController_default,
|
|
4
4
|
getDefaultTokensState
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MDHJNCTR.mjs";
|
|
6
6
|
import "./chunk-S7UA2DU7.mjs";
|
|
7
7
|
import "./chunk-LLYYJY7H.mjs";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-S6KASB6I.mjs";
|
|
9
9
|
import "./chunk-X5PLVMOQ.mjs";
|
|
10
10
|
import "./chunk-XUI43LEZ.mjs";
|
|
11
11
|
export {
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
BaseController
|
|
10
10
|
} from "@metamask/base-controller";
|
|
11
11
|
import { safelyExecute, toHex } from "@metamask/controller-utils";
|
|
12
|
-
import { isEvmAccountType } from "@metamask/keyring-api";
|
|
13
12
|
var DEFAULT_INTERVAL = 18e4;
|
|
14
13
|
var controllerName = "TokenBalancesController";
|
|
15
14
|
var metadata = {
|
|
@@ -104,18 +103,15 @@ var TokenBalancesController = class extends BaseController {
|
|
|
104
103
|
if (__privateGet(this, _disabled)) {
|
|
105
104
|
return;
|
|
106
105
|
}
|
|
107
|
-
const selectedInternalAccount = this.messagingSystem.call(
|
|
108
|
-
"AccountsController:getSelectedAccount"
|
|
109
|
-
);
|
|
110
|
-
if (!isEvmAccountType(selectedInternalAccount.type)) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
106
|
const newContractBalances = {};
|
|
114
107
|
for (const token of __privateGet(this, _tokens)) {
|
|
115
108
|
const { address } = token;
|
|
109
|
+
const { selectedAddress } = this.messagingSystem.call(
|
|
110
|
+
"PreferencesController:getState"
|
|
111
|
+
);
|
|
116
112
|
try {
|
|
117
113
|
newContractBalances[address] = toHex(
|
|
118
|
-
await __privateGet(this, _getERC20BalanceOf).call(this, address,
|
|
114
|
+
await __privateGet(this, _getERC20BalanceOf).call(this, address, selectedAddress)
|
|
119
115
|
);
|
|
120
116
|
token.balanceError = null;
|
|
121
117
|
} catch (error) {
|
|
@@ -140,4 +136,4 @@ export {
|
|
|
140
136
|
TokenBalancesController,
|
|
141
137
|
TokenBalancesController_default
|
|
142
138
|
};
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
139
|
+
//# sourceMappingURL=chunk-4LY47RPI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/TokenBalancesController.ts"],"sourcesContent":["import {\n type RestrictedControllerMessenger,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n BaseController,\n} from '@metamask/base-controller';\nimport { safelyExecute, toHex } from '@metamask/controller-utils';\nimport type { PreferencesControllerGetStateAction } from '@metamask/preferences-controller';\n\nimport type { AssetsContractController } from './AssetsContractController';\nimport type { Token } from './TokenRatesController';\nimport type { TokensControllerStateChangeEvent } from './TokensController';\n\nconst DEFAULT_INTERVAL = 180000;\n\nconst controllerName = 'TokenBalancesController';\n\nconst metadata = {\n contractBalances: { persist: true, anonymous: false },\n};\n\n/**\n * Token balances controller options\n * @property interval - Polling interval used to fetch new token balances.\n * @property tokens - List of tokens to track balances for.\n * @property disabled - If set to true, all tracked tokens contract balances updates are blocked.\n * @property getERC20BalanceOf - Gets the balance of the given account at the given contract address.\n */\ntype TokenBalancesControllerOptions = {\n interval?: number;\n tokens?: Token[];\n disabled?: boolean;\n getERC20BalanceOf: AssetsContractController['getERC20BalanceOf'];\n messenger: TokenBalancesControllerMessenger;\n state?: Partial<TokenBalancesControllerState>;\n};\n\n/**\n * Represents a mapping of hash token contract addresses to their balances.\n */\ntype ContractBalances = Record<string, string>;\n\n/**\n * Token balances controller state\n * @property contractBalances - Hash of token contract addresses to balances\n */\nexport type TokenBalancesControllerState = {\n contractBalances: ContractBalances;\n};\n\nexport type TokenBalancesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenBalancesControllerState\n>;\n\nexport type TokenBalancesControllerActions =\n TokenBalancesControllerGetStateAction;\n\nexport type AllowedActions = PreferencesControllerGetStateAction;\n\nexport type TokenBalancesControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n TokenBalancesControllerState\n >;\n\nexport type TokenBalancesControllerEvents =\n TokenBalancesControllerStateChangeEvent;\n\nexport type AllowedEvents = TokensControllerStateChangeEvent;\n\nexport type TokenBalancesControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n TokenBalancesControllerActions | AllowedActions,\n TokenBalancesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * Get the default TokenBalancesController state.\n *\n * @returns The default TokenBalancesController state.\n */\nexport function getDefaultTokenBalancesState(): TokenBalancesControllerState {\n return {\n contractBalances: {},\n };\n}\n\n/**\n * Controller that passively polls on a set interval token balances\n * for tokens stored in the TokensController\n */\nexport class TokenBalancesController extends BaseController<\n typeof controllerName,\n TokenBalancesControllerState,\n TokenBalancesControllerMessenger\n> {\n #handle?: ReturnType<typeof setTimeout>;\n\n #getERC20BalanceOf: AssetsContractController['getERC20BalanceOf'];\n\n #interval: number;\n\n #tokens: Token[];\n\n #disabled: boolean;\n\n /**\n * Construct a Token Balances Controller.\n *\n * @param options - The controller options.\n * @param options.interval - Polling interval used to fetch new token balances.\n * @param options.tokens - List of tokens to track balances for.\n * @param options.disabled - If set to true, all tracked tokens contract balances updates are blocked.\n * @param options.getERC20BalanceOf - Gets the balance of the given account at the given contract address.\n * @param options.state - Initial state to set on this controller.\n * @param options.messenger - The controller restricted messenger.\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n tokens = [],\n disabled = false,\n getERC20BalanceOf,\n messenger,\n state = {},\n }: TokenBalancesControllerOptions) {\n super({\n name: controllerName,\n metadata,\n messenger,\n state: {\n ...getDefaultTokenBalancesState(),\n ...state,\n },\n });\n\n this.#disabled = disabled;\n this.#interval = interval;\n this.#tokens = tokens;\n\n this.messagingSystem.subscribe(\n 'TokensController:stateChange',\n ({ tokens: newTokens, detectedTokens }) => {\n this.#tokens = [...newTokens, ...detectedTokens];\n this.updateBalances();\n },\n );\n\n this.#getERC20BalanceOf = getERC20BalanceOf;\n\n this.poll();\n }\n\n /**\n * Allows controller to update tracked tokens contract balances.\n */\n enable() {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from updating tracked tokens contract balances.\n */\n disable() {\n this.#disabled = true;\n }\n\n /**\n * Starts a new polling interval.\n *\n * @param interval - Polling interval used to fetch new token balances.\n */\n async poll(interval?: number): Promise<void> {\n if (interval) {\n this.#interval = interval;\n }\n\n if (this.#handle) {\n clearTimeout(this.#handle);\n }\n\n await safelyExecute(() => this.updateBalances());\n\n this.#handle = setTimeout(() => {\n this.poll(this.#interval);\n }, this.#interval);\n }\n\n /**\n * Updates balances for all tokens.\n */\n async updateBalances() {\n if (this.#disabled) {\n return;\n }\n\n const newContractBalances: ContractBalances = {};\n for (const token of this.#tokens) {\n const { address } = token;\n const { selectedAddress } = this.messagingSystem.call(\n 'PreferencesController:getState',\n );\n try {\n newContractBalances[address] = toHex(\n await this.#getERC20BalanceOf(address, selectedAddress),\n );\n token.balanceError = null;\n } catch (error) {\n newContractBalances[address] = toHex(0);\n token.balanceError = error;\n }\n }\n\n this.update((state) => {\n state.contractBalances = newContractBalances;\n });\n }\n}\n\nexport default TokenBalancesController;\n"],"mappings":";;;;;;;AAAA;AAAA,EAIE;AAAA,OACK;AACP,SAAS,eAAe,aAAa;AAOrC,IAAM,mBAAmB;AAEzB,IAAM,iBAAiB;AAEvB,IAAM,WAAW;AAAA,EACf,kBAAkB,EAAE,SAAS,MAAM,WAAW,MAAM;AACtD;AAiEO,SAAS,+BAA6D;AAC3E,SAAO;AAAA,IACL,kBAAkB,CAAC;AAAA,EACrB;AACF;AAxFA;AA8FO,IAAM,0BAAN,cAAsC,eAI3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,YAAY;AAAA,IACV,WAAW;AAAA,IACX,SAAS,CAAC;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,EACX,GAAmC;AACjC,UAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,GAAG,6BAA6B;AAAA,QAChC,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AArCH;AAEA;AAEA;AAEA;AAEA;AA+BE,uBAAK,WAAY;AACjB,uBAAK,WAAY;AACjB,uBAAK,SAAU;AAEf,SAAK,gBAAgB;AAAA,MACnB;AAAA,MACA,CAAC,EAAE,QAAQ,WAAW,eAAe,MAAM;AACzC,2BAAK,SAAU,CAAC,GAAG,WAAW,GAAG,cAAc;AAC/C,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAEA,uBAAK,oBAAqB;AAE1B,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,uBAAK,WAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,uBAAK,WAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,UAAkC;AAC3C,QAAI,UAAU;AACZ,yBAAK,WAAY;AAAA,IACnB;AAEA,QAAI,mBAAK,UAAS;AAChB,mBAAa,mBAAK,QAAO;AAAA,IAC3B;AAEA,UAAM,cAAc,MAAM,KAAK,eAAe,CAAC;AAE/C,uBAAK,SAAU,WAAW,MAAM;AAC9B,WAAK,KAAK,mBAAK,UAAS;AAAA,IAC1B,GAAG,mBAAK,UAAS;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB;AACrB,QAAI,mBAAK,YAAW;AAClB;AAAA,IACF;AAEA,UAAM,sBAAwC,CAAC;AAC/C,eAAW,SAAS,mBAAK,UAAS;AAChC,YAAM,EAAE,QAAQ,IAAI;AACpB,YAAM,EAAE,gBAAgB,IAAI,KAAK,gBAAgB;AAAA,QAC/C;AAAA,MACF;AACA,UAAI;AACF,4BAAoB,OAAO,IAAI;AAAA,UAC7B,MAAM,mBAAK,oBAAL,WAAwB,SAAS;AAAA,QACzC;AACA,cAAM,eAAe;AAAA,MACvB,SAAS,OAAO;AACd,4BAAoB,OAAO,IAAI,MAAM,CAAC;AACtC,cAAM,eAAe;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,OAAO,CAAC,UAAU;AACrB,YAAM,mBAAmB;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AAxHE;AAEA;AAEA;AAEA;AAEA;AAkHF,IAAO,kCAAQ;","names":[]}
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
ChainId,
|
|
6
6
|
NFT_API_BASE_URL
|
|
7
7
|
} from "@metamask/controller-utils";
|
|
8
|
-
import { isEvmAccountType } from "@metamask/keyring-api";
|
|
9
8
|
import { StaticIntervalPollingControllerV1 } from "@metamask/polling-controller";
|
|
10
9
|
var DEFAULT_INTERVAL = 18e4;
|
|
11
10
|
var BlockaidResultType = /* @__PURE__ */ ((BlockaidResultType2) => {
|
|
@@ -24,16 +23,13 @@ var NftDetectionController = class extends StaticIntervalPollingControllerV1 {
|
|
|
24
23
|
* @param options.onNftsStateChange - Allows subscribing to assets controller state changes.
|
|
25
24
|
* @param options.onPreferencesStateChange - Allows subscribing to preferences controller state changes.
|
|
26
25
|
* @param options.onNetworkStateChange - Allows subscribing to network controller state changes.
|
|
27
|
-
* @param options.onSelectedAccountChange - Allows subscribing to the change of account from the accoutns controller.
|
|
28
26
|
* @param options.getOpenSeaApiKey - Gets the OpenSea API key, if one is set.
|
|
29
27
|
* @param options.addNft - Add an NFT.
|
|
30
28
|
* @param options.getNftApi - Gets the URL to fetch an NFT from OpenSea.
|
|
31
29
|
* @param options.getNftState - Gets the current state of the Assets controller.
|
|
32
30
|
* @param options.disabled - Represents previous value of useNftDetection. Used to detect changes of useNftDetection. Default value is true.
|
|
33
|
-
* @param options.
|
|
31
|
+
* @param options.selectedAddress - Represents current selected address.
|
|
34
32
|
* @param options.getNetworkClientById - Gets the network client by ID, from the NetworkController.
|
|
35
|
-
* @param options.getInternalAccount - Gets the internal account from the AccountsController.
|
|
36
|
-
* @param options.getSelectedAccount - Gets the selected account from the AccountsController.
|
|
37
33
|
* @param config - Initial options used to configure this controller.
|
|
38
34
|
* @param state - Initial state to set on this controller.
|
|
39
35
|
*/
|
|
@@ -42,15 +38,12 @@ var NftDetectionController = class extends StaticIntervalPollingControllerV1 {
|
|
|
42
38
|
getNetworkClientById,
|
|
43
39
|
onPreferencesStateChange,
|
|
44
40
|
onNetworkStateChange,
|
|
45
|
-
onSelectedAccountChange,
|
|
46
41
|
getOpenSeaApiKey,
|
|
47
42
|
addNft,
|
|
48
43
|
getNftApi,
|
|
49
44
|
getNftState,
|
|
50
|
-
getInternalAccount,
|
|
51
|
-
getSelectedAccount,
|
|
52
45
|
disabled: initialDisabled,
|
|
53
|
-
|
|
46
|
+
selectedAddress: initialSelectedAddress
|
|
54
47
|
}, config, state) {
|
|
55
48
|
super(config, state);
|
|
56
49
|
/**
|
|
@@ -69,31 +62,16 @@ var NftDetectionController = class extends StaticIntervalPollingControllerV1 {
|
|
|
69
62
|
this.defaultConfig = {
|
|
70
63
|
interval: DEFAULT_INTERVAL,
|
|
71
64
|
chainId: initialChainId,
|
|
72
|
-
|
|
65
|
+
selectedAddress: initialSelectedAddress,
|
|
73
66
|
disabled: initialDisabled
|
|
74
67
|
};
|
|
75
68
|
this.initialize();
|
|
76
69
|
this.getNftState = getNftState;
|
|
77
70
|
this.getNetworkClientById = getNetworkClientById;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const { selectedAccountId, disabled } = this.config;
|
|
83
|
-
if (!disabled || selectedAccountId !== internalAccount.id) {
|
|
84
|
-
this.start();
|
|
85
|
-
} else {
|
|
86
|
-
this.stop();
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
onPreferencesStateChange(({ useNftDetection }) => {
|
|
90
|
-
const { selectedAccountId: previousSelectedAccountId, disabled } = this.config;
|
|
91
|
-
const newSelectedAccount = this.getSelectedAccount();
|
|
92
|
-
if (newSelectedAccount.id !== previousSelectedAccountId || !useNftDetection !== disabled) {
|
|
93
|
-
this.configure({
|
|
94
|
-
disabled: !useNftDetection,
|
|
95
|
-
selectedAccountId: newSelectedAccount.id
|
|
96
|
-
});
|
|
71
|
+
onPreferencesStateChange(({ selectedAddress, useNftDetection }) => {
|
|
72
|
+
const { selectedAddress: previouslySelectedAddress, disabled } = this.config;
|
|
73
|
+
if (selectedAddress !== previouslySelectedAddress || !useNftDetection !== disabled) {
|
|
74
|
+
this.configure({ selectedAddress, disabled: !useNftDetection });
|
|
97
75
|
if (useNftDetection) {
|
|
98
76
|
this.start();
|
|
99
77
|
} else {
|
|
@@ -188,13 +166,7 @@ var NftDetectionController = class extends StaticIntervalPollingControllerV1 {
|
|
|
188
166
|
async detectNfts({
|
|
189
167
|
networkClientId,
|
|
190
168
|
userAddress
|
|
191
|
-
} = {}) {
|
|
192
|
-
const { selectedAccountId } = this.config;
|
|
193
|
-
const selectedInternalAccount = this.getInternalAccount(selectedAccountId);
|
|
194
|
-
if (!isEvmAccountType(selectedInternalAccount.type)) {
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
userAddress = userAddress || selectedInternalAccount.address;
|
|
169
|
+
} = { userAddress: this.config.selectedAddress }) {
|
|
198
170
|
if (!this.isMainnet() || this.disabled) {
|
|
199
171
|
return;
|
|
200
172
|
}
|
|
@@ -260,4 +232,4 @@ export {
|
|
|
260
232
|
NftDetectionController,
|
|
261
233
|
NftDetectionController_default
|
|
262
234
|
};
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
235
|
+
//# sourceMappingURL=chunk-ASFD56OL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/NftDetectionController.ts"],"sourcesContent":["import type { BaseConfig, BaseState } from '@metamask/base-controller';\nimport {\n fetchWithErrorHandling,\n toChecksumHexAddress,\n ChainId,\n NFT_API_BASE_URL,\n} from '@metamask/controller-utils';\nimport type {\n NetworkClientId,\n NetworkController,\n NetworkState,\n NetworkClient,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingControllerV1 } from '@metamask/polling-controller';\nimport type { PreferencesState } from '@metamask/preferences-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport { Source } from './constants';\nimport {\n type NftController,\n type NftState,\n type NftMetadata,\n} from './NftController';\n\nconst DEFAULT_INTERVAL = 180000;\n\n/**\n * @type ApiNft\n *\n * NFT object coming from OpenSea api\n * @property token_id - The NFT identifier\n * @property num_sales - Number of sales\n * @property background_color - The background color to be displayed with the item\n * @property image_url - URI of an image associated with this NFT\n * @property image_preview_url - URI of a smaller image associated with this NFT\n * @property image_thumbnail_url - URI of a thumbnail image associated with this NFT\n * @property image_original_url - URI of the original image associated with this NFT\n * @property animation_url - URI of a animation associated with this NFT\n * @property animation_original_url - URI of the original animation associated with this NFT\n * @property name - The NFT name\n * @property description - The NFT description\n * @property external_link - External link containing additional information\n * @property assetContract - The NFT contract information object\n * @property creator - The NFT owner information object\n * @property lastSale - When this item was last sold\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface ApiNft {\n token_id: string;\n num_sales: number | null;\n background_color: string | null;\n image_url: string | null;\n image_preview_url: string | null;\n image_thumbnail_url: string | null;\n image_original_url: string | null;\n animation_url: string | null;\n animation_original_url: string | null;\n name: string | null;\n description: string | null;\n external_link: string | null;\n asset_contract: ApiNftContract;\n creator: ApiNftCreator;\n last_sale: ApiNftLastSale | null;\n}\n\n/**\n * @type ApiNftContract\n *\n * NFT contract object coming from OpenSea api\n * @property address - Address of the NFT contract\n * @property asset_contract_type - The NFT type, it could be `semi-fungible` or `non-fungible`\n * @property created_date - Creation date\n * @property collection - Object containing the contract name and URI of an image associated\n * @property schema_name - The schema followed by the contract, it could be `ERC721` or `ERC1155`\n * @property symbol - The NFT contract symbol\n * @property total_supply - Total supply of NFTs\n * @property description - The NFT contract description\n * @property external_link - External link containing additional information\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface ApiNftContract {\n address: string;\n asset_contract_type: string | null;\n created_date: string | null;\n schema_name: string | null;\n symbol: string | null;\n total_supply: string | null;\n description: string | null;\n external_link: string | null;\n collection: {\n name: string | null;\n image_url?: string | null;\n tokenCount?: string | null;\n };\n}\n\n/**\n * @type ApiNftLastSale\n *\n * NFT sale object coming from OpenSea api\n * @property event_timestamp - Object containing a `username`\n * @property total_price - URI of NFT image associated with this owner\n * @property transaction - Object containing transaction_hash and block_hash\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface ApiNftLastSale {\n event_timestamp: string;\n total_price: string;\n transaction: { transaction_hash: string; block_hash: string };\n}\n\n/**\n * @type ApiNftCreator\n *\n * NFT creator object coming from OpenSea api\n * @property user - Object containing a `username`\n * @property profile_img_url - URI of NFT image associated with this owner\n * @property address - The owner address\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface ApiNftCreator {\n user: { username: string };\n profile_img_url: string;\n address: string;\n}\n\n/**\n * @type NftDetectionConfig\n *\n * NftDetection configuration\n * @property interval - Polling interval used to fetch new token rates\n * @property chainId - Current chain ID\n * @property selectedAddress - Vault selected address\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface NftDetectionConfig extends BaseConfig {\n interval: number;\n chainId: Hex;\n selectedAddress: string;\n}\n\nexport type ReservoirResponse = {\n tokens: TokensResponse[];\n continuation?: string;\n};\n\nexport type TokensResponse = {\n token: TokenResponse;\n ownership: Ownership;\n market?: Market;\n blockaidResult?: Blockaid;\n};\n\nexport enum BlockaidResultType {\n Benign = 'Benign',\n Spam = 'Spam',\n Warning = 'Warning',\n Malicious = 'Malicious',\n}\n\nexport type Blockaid = {\n contract: string;\n chainId: number;\n result_type: BlockaidResultType;\n malicious_score: string;\n attack_types: object;\n};\n\nexport type Market = {\n floorAsk?: FloorAsk;\n topBid?: TopBid;\n};\n\nexport type TokenResponse = {\n chainId: number;\n contract: string;\n tokenId: string;\n kind?: string;\n name?: string;\n image?: string;\n imageSmall?: string;\n imageLarge?: string;\n metadata?: Metadata;\n description?: string;\n supply?: number;\n remainingSupply?: number;\n rarityScore?: number;\n rarity?: number;\n rarityRank?: number;\n media?: string;\n isFlagged?: boolean;\n isSpam?: boolean;\n isNsfw?: boolean;\n metadataDisabled?: boolean;\n lastFlagUpdate?: string;\n lastFlagChange?: string;\n collection?: Collection;\n lastSale?: LastSale;\n topBid?: TopBid;\n lastAppraisalValue?: number;\n attributes?: Attributes[];\n};\n\nexport type TopBid = {\n id?: string;\n price?: Price;\n source?: {\n id?: string;\n domain?: string;\n name?: string;\n icon?: string;\n url?: string;\n };\n};\n\nexport type LastSale = {\n saleId?: string;\n token?: {\n contract?: string;\n tokenId?: string;\n name?: string;\n image?: string;\n collection?: {\n id?: string;\n name?: string;\n };\n };\n orderSource?: string;\n orderSide?: 'ask' | 'bid';\n orderKind?: string;\n orderId?: string;\n from?: string;\n to?: string;\n amount?: string;\n fillSource?: string;\n block?: number;\n txHash?: string;\n logIndex?: number;\n batchIndex?: number;\n timestamp?: number;\n price?: Price;\n washTradingScore?: number;\n royaltyFeeBps?: number;\n marketplaceFeeBps?: number;\n paidFullRoyalty?: boolean;\n feeBreakdown?: FeeBreakdown[];\n isDeleted?: boolean;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type FeeBreakdown = {\n kind?: string;\n bps?: number;\n recipient?: string;\n source?: string;\n rawAmount?: string;\n};\n\nexport type Attributes = {\n key?: string;\n kind?: string;\n value: string;\n tokenCount?: number;\n onSaleCount?: number;\n floorAskPrice?: Price | null;\n topBidValue?: number | null;\n createdAt?: string;\n};\n\nexport type Collection = {\n id?: string;\n name?: string;\n slug?: string;\n symbol?: string;\n imageUrl?: string;\n image?: string;\n isSpam?: boolean;\n isNsfw?: boolean;\n creator?: string;\n tokenCount?: string;\n metadataDisabled?: boolean;\n openseaVerificationStatus?: string;\n floorAskPrice?: Price;\n royaltiesBps?: number;\n royalties?: Royalties[];\n};\n\nexport type Royalties = {\n bps?: number;\n recipient?: string;\n};\n\nexport type Ownership = {\n tokenCount?: string;\n onSaleCount?: string;\n floorAsk?: FloorAsk;\n acquiredAt?: string;\n};\n\nexport type FloorAsk = {\n id?: string;\n price?: Price;\n maker?: string;\n kind?: string;\n validFrom?: number;\n validUntil?: number;\n source?: Source;\n rawData?: Metadata;\n isNativeOffChainCancellable?: boolean;\n};\n\nexport type Price = {\n currency?: {\n contract?: string;\n name?: string;\n symbol?: string;\n decimals?: number;\n chainId?: number;\n };\n amount?: {\n raw?: string;\n decimal?: number;\n usd?: number;\n native?: number;\n };\n netAmount?: {\n raw?: string;\n decimal?: number;\n usd?: number;\n native?: number;\n };\n};\n\nexport type Metadata = {\n imageOriginal?: string;\n tokenURI?: string;\n};\n\n/**\n * Controller that passively polls on a set interval for NFT auto detection\n */\nexport class NftDetectionController extends StaticIntervalPollingControllerV1<\n NftDetectionConfig,\n BaseState\n> {\n private intervalId?: ReturnType<typeof setTimeout>;\n\n private getOwnerNftApi({\n address,\n next,\n }: {\n address: string;\n next?: string;\n }) {\n return `${NFT_API_BASE_URL}/users/${address}/tokens?chainIds=1&limit=50&includeTopBid=true&continuation=${\n next ?? ''\n }`;\n }\n\n private async getOwnerNfts(address: string) {\n let nftApiResponse: ReservoirResponse;\n let nfts: TokensResponse[] = [];\n let next;\n\n do {\n nftApiResponse = await fetchWithErrorHandling({\n url: this.getOwnerNftApi({ address, next }),\n options: {\n headers: {\n Version: '1',\n },\n },\n timeout: 15000,\n });\n\n if (!nftApiResponse) {\n return nfts;\n }\n\n const newNfts = nftApiResponse.tokens.filter(\n (elm) =>\n elm.token.isSpam === false &&\n (elm.blockaidResult?.result_type\n ? elm.blockaidResult?.result_type === BlockaidResultType.Benign\n : true),\n );\n\n nfts = [...nfts, ...newNfts];\n } while ((next = nftApiResponse.continuation));\n\n return nfts;\n }\n\n /**\n * Name of this controller used during composition\n */\n override name = 'NftDetectionController';\n\n private readonly getOpenSeaApiKey: () => string | undefined;\n\n private readonly addNft: NftController['addNft'];\n\n private readonly getNftApi: NftController['getNftApi'];\n\n private readonly getNftState: () => NftState;\n\n private readonly getNetworkClientById: NetworkController['getNetworkClientById'];\n\n /**\n * Creates an NftDetectionController instance.\n *\n * @param options - The controller options.\n * @param options.chainId - The chain ID of the current network.\n * @param options.onNftsStateChange - Allows subscribing to assets controller state changes.\n * @param options.onPreferencesStateChange - Allows subscribing to preferences controller state changes.\n * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.\n * @param options.getOpenSeaApiKey - Gets the OpenSea API key, if one is set.\n * @param options.addNft - Add an NFT.\n * @param options.getNftApi - Gets the URL to fetch an NFT from OpenSea.\n * @param options.getNftState - Gets the current state of the Assets controller.\n * @param options.disabled - Represents previous value of useNftDetection. Used to detect changes of useNftDetection. Default value is true.\n * @param options.selectedAddress - Represents current selected address.\n * @param options.getNetworkClientById - Gets the network client by ID, from the NetworkController.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n chainId: initialChainId,\n getNetworkClientById,\n onPreferencesStateChange,\n onNetworkStateChange,\n getOpenSeaApiKey,\n addNft,\n getNftApi,\n getNftState,\n disabled: initialDisabled,\n selectedAddress: initialSelectedAddress,\n }: {\n chainId: Hex;\n getNetworkClientById: NetworkController['getNetworkClientById'];\n onNftsStateChange: (listener: (nftsState: NftState) => void) => void;\n onPreferencesStateChange: (\n listener: (preferencesState: PreferencesState) => void,\n ) => void;\n onNetworkStateChange: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n getOpenSeaApiKey: () => string | undefined;\n addNft: NftController['addNft'];\n getNftApi: NftController['getNftApi'];\n getNftState: () => NftState;\n disabled: boolean;\n selectedAddress: string;\n },\n config?: Partial<NftDetectionConfig>,\n state?: Partial<BaseState>,\n ) {\n super(config, state);\n this.defaultConfig = {\n interval: DEFAULT_INTERVAL,\n chainId: initialChainId,\n selectedAddress: initialSelectedAddress,\n disabled: initialDisabled,\n };\n this.initialize();\n this.getNftState = getNftState;\n this.getNetworkClientById = getNetworkClientById;\n onPreferencesStateChange(({ selectedAddress, useNftDetection }) => {\n const { selectedAddress: previouslySelectedAddress, disabled } =\n this.config;\n\n if (\n selectedAddress !== previouslySelectedAddress ||\n !useNftDetection !== disabled\n ) {\n this.configure({ selectedAddress, disabled: !useNftDetection });\n if (useNftDetection) {\n this.start();\n } else {\n this.stop();\n }\n }\n });\n\n onNetworkStateChange(({ providerConfig }) => {\n this.configure({\n chainId: providerConfig.chainId,\n });\n });\n this.getOpenSeaApiKey = getOpenSeaApiKey;\n this.addNft = addNft;\n this.getNftApi = getNftApi;\n this.setIntervalLength(this.config.interval);\n }\n\n async _executePoll(\n networkClientId: string,\n options: { address: string },\n ): Promise<void> {\n await this.detectNfts({ networkClientId, userAddress: options.address });\n }\n\n /**\n * Start polling for the currency rate.\n */\n async start() {\n if (!this.isMainnet() || this.disabled) {\n return;\n }\n\n await this.startPolling();\n }\n\n /**\n * Stop polling for the currency rate.\n */\n stop() {\n this.stopPolling();\n }\n\n private stopPolling() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n }\n\n /**\n * Starts a new polling interval.\n *\n * @param interval - An interval on which to poll.\n */\n private async startPolling(interval?: number): Promise<void> {\n interval && this.configure({ interval }, false, false);\n this.stopPolling();\n await this.detectNfts();\n this.intervalId = setInterval(async () => {\n await this.detectNfts();\n }, this.config.interval);\n }\n\n /**\n * Checks whether network is mainnet or not.\n *\n * @returns Whether current network is mainnet.\n */\n isMainnet = (): boolean => this.config.chainId === ChainId.mainnet;\n\n isMainnetByNetworkClientId = (networkClient: NetworkClient): boolean => {\n return networkClient.configuration.chainId === ChainId.mainnet;\n };\n\n /**\n * Triggers asset ERC721 token auto detection on mainnet. Any newly detected NFTs are\n * added.\n *\n * @param options - Options bag.\n * @param options.networkClientId - The network client ID to detect NFTs on.\n * @param options.userAddress - The address to detect NFTs for.\n */\n async detectNfts(\n {\n networkClientId,\n userAddress,\n }: {\n networkClientId?: NetworkClientId;\n userAddress: string;\n } = { userAddress: this.config.selectedAddress },\n ) {\n /* istanbul ignore if */\n if (!this.isMainnet() || this.disabled) {\n return;\n }\n /* istanbul ignore else */\n if (!userAddress) {\n return;\n }\n\n const apiNfts = await this.getOwnerNfts(userAddress);\n const addNftPromises = apiNfts.map(async (nft) => {\n const {\n tokenId: token_id,\n contract,\n kind,\n image: image_url,\n imageSmall: image_thumbnail_url,\n metadata: { imageOriginal: image_original_url } = {},\n name,\n description,\n attributes,\n topBid,\n lastSale,\n rarityRank,\n rarityScore,\n collection,\n } = nft.token;\n\n let ignored;\n /* istanbul ignore else */\n const { ignoredNfts } = this.getNftState();\n if (ignoredNfts.length) {\n ignored = ignoredNfts.find((c) => {\n /* istanbul ignore next */\n return (\n c.address === toChecksumHexAddress(contract) &&\n c.tokenId === token_id\n );\n });\n }\n\n /* istanbul ignore else */\n if (!ignored) {\n /* istanbul ignore next */\n const nftMetadata: NftMetadata = Object.assign(\n {},\n { name },\n description && { description },\n image_url && { image: image_url },\n image_thumbnail_url && { imageThumbnail: image_thumbnail_url },\n image_original_url && { imageOriginal: image_original_url },\n kind && { standard: kind.toUpperCase() },\n lastSale && { lastSale },\n attributes && { attributes },\n topBid && { topBid },\n rarityRank && { rarityRank },\n rarityScore && { rarityScore },\n collection && { collection },\n );\n\n await this.addNft(contract, token_id, {\n nftMetadata,\n userAddress,\n source: Source.Detected,\n networkClientId,\n });\n }\n });\n await Promise.all(addNftPromises);\n }\n}\n\nexport default NftDetectionController;\n"],"mappings":"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","names":["BlockaidResultType"]}
|
|
@@ -7,7 +7,7 @@ var _chunkBO2WZDUMjs = require('./chunk-BO2WZDUM.js');
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkOKEA7NPVjs = require('./chunk-OKEA7NPV.js');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
@@ -29,7 +29,6 @@ var _contractmetadata = require('@metamask/contract-metadata'); var _contractmet
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
var _controllerutils = require('@metamask/controller-utils');
|
|
32
|
-
var _keyringapi = require('@metamask/keyring-api');
|
|
33
32
|
var _metamaskethabis = require('@metamask/metamask-eth-abis');
|
|
34
33
|
var _rpcerrors = require('@metamask/rpc-errors');
|
|
35
34
|
var _asyncmutex = require('async-mutex');
|
|
@@ -73,7 +72,7 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
73
72
|
*/
|
|
74
73
|
this.name = "TokensController";
|
|
75
74
|
this.defaultConfig = {
|
|
76
|
-
|
|
75
|
+
selectedAddress: "",
|
|
77
76
|
chainId: initialChainId,
|
|
78
77
|
provider: void 0,
|
|
79
78
|
...config
|
|
@@ -90,18 +89,15 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
90
89
|
this.addDetectedTokens.bind(this)
|
|
91
90
|
);
|
|
92
91
|
this.messagingSystem.subscribe(
|
|
93
|
-
"
|
|
94
|
-
(
|
|
95
|
-
this.configure({ selectedAccountId: internalAccount.id });
|
|
96
|
-
if (!_keyringapi.isEvmAccountType.call(void 0, internalAccount.type)) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
92
|
+
"PreferencesController:stateChange",
|
|
93
|
+
({ selectedAddress }) => {
|
|
99
94
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
100
95
|
const { chainId } = this.config;
|
|
96
|
+
this.configure({ selectedAddress });
|
|
101
97
|
this.update({
|
|
102
|
-
tokens: allTokens[chainId]?.[
|
|
103
|
-
ignoredTokens: allIgnoredTokens[chainId]?.[
|
|
104
|
-
detectedTokens: allDetectedTokens[chainId]?.[
|
|
98
|
+
tokens: allTokens[chainId]?.[selectedAddress] ?? [],
|
|
99
|
+
ignoredTokens: allIgnoredTokens[chainId]?.[selectedAddress] ?? [],
|
|
100
|
+
detectedTokens: allDetectedTokens[chainId]?.[selectedAddress] ?? []
|
|
105
101
|
});
|
|
106
102
|
}
|
|
107
103
|
);
|
|
@@ -109,22 +105,15 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
109
105
|
"NetworkController:networkDidChange",
|
|
110
106
|
({ providerConfig }) => {
|
|
111
107
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
112
|
-
const {
|
|
113
|
-
const selectedInternalAccount = this.messagingSystem.call(
|
|
114
|
-
"AccountsController:getAccount",
|
|
115
|
-
selectedAccountId
|
|
116
|
-
);
|
|
108
|
+
const { selectedAddress } = this.config;
|
|
117
109
|
const { chainId } = providerConfig;
|
|
118
110
|
this.abortController.abort();
|
|
119
111
|
this.abortController = new AbortController();
|
|
120
112
|
this.configure({ chainId });
|
|
121
|
-
if (!selectedInternalAccount || !_keyringapi.isEvmAccountType.call(void 0, selectedInternalAccount.type)) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
113
|
this.update({
|
|
125
|
-
tokens: allTokens[chainId]?.[
|
|
126
|
-
ignoredTokens: allIgnoredTokens[chainId]?.[
|
|
127
|
-
detectedTokens: allDetectedTokens[chainId]?.[
|
|
114
|
+
tokens: allTokens[chainId]?.[selectedAddress] || [],
|
|
115
|
+
ignoredTokens: allIgnoredTokens[chainId]?.[selectedAddress] || [],
|
|
116
|
+
detectedTokens: allDetectedTokens[chainId]?.[selectedAddress] || []
|
|
128
117
|
});
|
|
129
118
|
}
|
|
130
119
|
);
|
|
@@ -146,14 +135,14 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
146
135
|
*/
|
|
147
136
|
async fetchTokenMetadata(tokenAddress) {
|
|
148
137
|
try {
|
|
149
|
-
const token = await
|
|
138
|
+
const token = await _chunkOKEA7NPVjs.fetchTokenMetadata.call(void 0,
|
|
150
139
|
this.config.chainId,
|
|
151
140
|
tokenAddress,
|
|
152
141
|
this.abortController.signal
|
|
153
142
|
);
|
|
154
143
|
return token;
|
|
155
144
|
} catch (error) {
|
|
156
|
-
if (error instanceof Error && error.message.includes(
|
|
145
|
+
if (error instanceof Error && error.message.includes(_chunkOKEA7NPVjs.TOKEN_METADATA_NO_SUPPORT_ERROR)) {
|
|
157
146
|
return void 0;
|
|
158
147
|
}
|
|
159
148
|
throw error;
|
|
@@ -181,7 +170,7 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
181
170
|
interactingAddress,
|
|
182
171
|
networkClientId
|
|
183
172
|
}) {
|
|
184
|
-
const { chainId,
|
|
173
|
+
const { chainId, selectedAddress } = this.config;
|
|
185
174
|
const releaseLock = await this.mutex.acquire();
|
|
186
175
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
187
176
|
let currentChainId = chainId;
|
|
@@ -191,16 +180,8 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
191
180
|
networkClientId
|
|
192
181
|
).configuration.chainId;
|
|
193
182
|
}
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
selectedAccountId
|
|
197
|
-
);
|
|
198
|
-
if (!internalAccount || !_keyringapi.isEvmAccountType.call(void 0, internalAccount.type)) {
|
|
199
|
-
releaseLock();
|
|
200
|
-
return [];
|
|
201
|
-
}
|
|
202
|
-
const accountAddress = interactingAddress || internalAccount.address;
|
|
203
|
-
const isInteractingWithWalletAccount = accountAddress === internalAccount.address;
|
|
183
|
+
const accountAddress = interactingAddress || selectedAddress;
|
|
184
|
+
const isInteractingWithWalletAccount = accountAddress === selectedAddress;
|
|
204
185
|
try {
|
|
205
186
|
address = _controllerutils.toChecksumHexAddress.call(void 0, address);
|
|
206
187
|
const tokens = allTokens[currentChainId]?.[accountAddress] || [];
|
|
@@ -376,16 +357,8 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
376
357
|
*/
|
|
377
358
|
async addDetectedTokens(incomingDetectedTokens, detectionDetails) {
|
|
378
359
|
const releaseLock = await this.mutex.acquire();
|
|
379
|
-
const internalAccount = this.messagingSystem.call(
|
|
380
|
-
"AccountsController:getAccount",
|
|
381
|
-
this.config.selectedAccountId
|
|
382
|
-
);
|
|
383
|
-
if (!internalAccount || !_keyringapi.isEvmAccountType.call(void 0, internalAccount.type)) {
|
|
384
|
-
releaseLock();
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
360
|
const chainId = detectionDetails?.chainId ?? this.config.chainId;
|
|
388
|
-
const accountAddress = detectionDetails?.selectedAddress ??
|
|
361
|
+
const accountAddress = detectionDetails?.selectedAddress ?? this.config.selectedAddress;
|
|
389
362
|
const { allTokens, allDetectedTokens, allIgnoredTokens } = this.state;
|
|
390
363
|
let newTokens = [...allTokens?.[chainId]?.[accountAddress] ?? []];
|
|
391
364
|
let newDetectedTokens = [
|
|
@@ -439,17 +412,9 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
439
412
|
interactingChainId: chainId
|
|
440
413
|
}
|
|
441
414
|
);
|
|
442
|
-
const { chainId: currentChain,
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
currentAccountId
|
|
446
|
-
);
|
|
447
|
-
if (!currentInternalAccount || !_keyringapi.isEvmAccountType.call(void 0, currentInternalAccount.type)) {
|
|
448
|
-
releaseLock();
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
newTokens = newAllTokens?.[currentChain]?.[currentInternalAccount.address] || [];
|
|
452
|
-
newDetectedTokens = newAllDetectedTokens?.[currentChain]?.[currentInternalAccount.address] || [];
|
|
415
|
+
const { chainId: currentChain, selectedAddress: currentAddress } = this.config;
|
|
416
|
+
newTokens = newAllTokens?.[currentChain]?.[currentAddress] || [];
|
|
417
|
+
newDetectedTokens = newAllDetectedTokens?.[currentChain]?.[currentAddress] || [];
|
|
453
418
|
this.update({
|
|
454
419
|
tokens: newTokens,
|
|
455
420
|
allTokens: newAllTokens,
|
|
@@ -560,13 +525,6 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
560
525
|
if (!_controllerutils.isValidHexAddress.call(void 0, asset.address)) {
|
|
561
526
|
throw _rpcerrors.rpcErrors.invalidParams(`Invalid address "${asset.address}"`);
|
|
562
527
|
}
|
|
563
|
-
const selectedAccount = this.messagingSystem.call(
|
|
564
|
-
"AccountsController:getAccount",
|
|
565
|
-
this.config.selectedAccountId
|
|
566
|
-
);
|
|
567
|
-
if (!selectedAccount || !_keyringapi.isEvmAccountType.call(void 0, selectedAccount.type)) {
|
|
568
|
-
throw new Error(`Account is not an EVM account`);
|
|
569
|
-
}
|
|
570
528
|
if (await this._detectIsERC721(asset.address, networkClientId)) {
|
|
571
529
|
throw _rpcerrors.rpcErrors.invalidParams(
|
|
572
530
|
`Contract ${asset.address} must match type ${type}, but was detected as ${_controllerutils.ERC721}`
|
|
@@ -632,7 +590,7 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
632
590
|
id: this._generateRandomId(),
|
|
633
591
|
time: Date.now(),
|
|
634
592
|
type,
|
|
635
|
-
interactingAddress: interactingAddress ||
|
|
593
|
+
interactingAddress: interactingAddress || this.config.selectedAddress
|
|
636
594
|
};
|
|
637
595
|
await this._requestApproval(suggestedAssetMeta);
|
|
638
596
|
const { address, symbol, decimals, name, image } = asset;
|
|
@@ -667,19 +625,8 @@ var TokensController = class extends _basecontroller.BaseControllerV1 {
|
|
|
667
625
|
interactingChainId
|
|
668
626
|
} = params;
|
|
669
627
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
670
|
-
const { chainId,
|
|
671
|
-
const
|
|
672
|
-
"AccountsController:getAccount",
|
|
673
|
-
selectedAccountId
|
|
674
|
-
);
|
|
675
|
-
if (!selectedInternalAccount || !_keyringapi.isEvmAccountType.call(void 0, selectedInternalAccount.type)) {
|
|
676
|
-
return {
|
|
677
|
-
newAllTokens: allTokens,
|
|
678
|
-
newAllIgnoredTokens: allIgnoredTokens,
|
|
679
|
-
newAllDetectedTokens: allDetectedTokens
|
|
680
|
-
};
|
|
681
|
-
}
|
|
682
|
-
const userAddressToAddTokens = interactingAddress ?? selectedInternalAccount.address;
|
|
628
|
+
const { chainId, selectedAddress } = this.config;
|
|
629
|
+
const userAddressToAddTokens = interactingAddress ?? selectedAddress;
|
|
683
630
|
const chainIdToAddTokens = interactingChainId ?? chainId;
|
|
684
631
|
let newAllTokens = allTokens;
|
|
685
632
|
if (newTokens?.length || newTokens && allTokens && allTokens[chainIdToAddTokens] && allTokens[chainIdToAddTokens][userAddressToAddTokens]) {
|
|
@@ -754,4 +701,4 @@ var TokensController_default = TokensController;
|
|
|
754
701
|
|
|
755
702
|
|
|
756
703
|
exports.getDefaultTokensState = getDefaultTokensState; exports.TokensController = TokensController; exports.TokensController_default = TokensController_default;
|
|
757
|
-
//# sourceMappingURL=chunk-
|
|
704
|
+
//# sourceMappingURL=chunk-AVPUXAZY.js.map
|