@metamask/assets-controllers 32.0.0 → 34.0.0
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 +95 -1
- package/dist/AccountTrackerController.js +2 -2
- package/dist/AccountTrackerController.mjs +1 -1
- package/dist/AssetsContractController.js +6 -6
- package/dist/AssetsContractController.mjs +5 -5
- package/dist/CurrencyRateController.js +3 -3
- package/dist/CurrencyRateController.mjs +2 -2
- package/dist/NftController.js +3 -3
- package/dist/NftController.mjs +2 -2
- package/dist/NftDetectionController.js +2 -2
- package/dist/NftDetectionController.mjs +1 -1
- package/dist/RatesController/RatesController.js +3 -3
- package/dist/RatesController/RatesController.mjs +2 -2
- package/dist/RatesController/index.js +3 -3
- package/dist/RatesController/index.mjs +2 -2
- package/dist/Standards/ERC20Standard.js +3 -3
- package/dist/Standards/ERC20Standard.mjs +2 -2
- package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.js +3 -3
- package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.mjs +2 -2
- package/dist/Standards/NftStandards/ERC721/ERC721Standard.js +3 -3
- package/dist/Standards/NftStandards/ERC721/ERC721Standard.mjs +2 -2
- package/dist/TokenBalancesController.js +2 -2
- package/dist/TokenBalancesController.mjs +1 -1
- package/dist/TokenDetectionController.js +3 -3
- package/dist/TokenDetectionController.mjs +2 -2
- package/dist/TokenListController.js +4 -4
- package/dist/TokenListController.mjs +3 -3
- package/dist/TokenRatesController.js +9 -5
- package/dist/TokenRatesController.mjs +10 -6
- package/dist/TokensController.js +6 -6
- package/dist/TokensController.mjs +5 -5
- package/dist/assetsUtil.js +2 -2
- package/dist/assetsUtil.mjs +1 -1
- package/dist/chunk-2IIQTSLV.mjs +236 -0
- package/dist/chunk-2IIQTSLV.mjs.map +1 -0
- package/dist/{chunk-4AC3X2U5.js → chunk-2NQRWANM.js} +85 -43
- package/dist/chunk-2NQRWANM.js.map +1 -0
- package/dist/{chunk-MR6EF4B7.mjs → chunk-2TSAUGE7.mjs} +43 -20
- package/dist/chunk-2TSAUGE7.mjs.map +1 -0
- package/dist/chunk-354SINOH.js +236 -0
- package/dist/chunk-354SINOH.js.map +1 -0
- package/dist/{chunk-5W5OO2Q5.mjs → chunk-47CRHAUE.mjs} +2 -2
- package/dist/chunk-47CRHAUE.mjs.map +1 -0
- package/dist/{chunk-73F3SN5O.mjs → chunk-4JLB5OIJ.mjs} +79 -37
- package/dist/chunk-4JLB5OIJ.mjs.map +1 -0
- package/dist/{chunk-D3K5MPMW.mjs → chunk-56O7BVZV.mjs} +2 -2
- package/dist/{chunk-B5YY22QQ.js → chunk-6PPM4ETZ.js} +3 -3
- package/dist/{chunk-WCCLSUOI.mjs → chunk-6VQJFTNC.mjs} +4 -4
- package/dist/chunk-6VQJFTNC.mjs.map +1 -0
- package/dist/{chunk-CGLUTXI7.js → chunk-7JWDWDXT.js} +190 -107
- package/dist/chunk-7JWDWDXT.js.map +1 -0
- package/dist/{chunk-JUI3XNEF.js → chunk-7OZL6IDY.js} +16 -9
- package/dist/chunk-7OZL6IDY.js.map +1 -0
- package/dist/{chunk-YIFA2HXH.js → chunk-F6L3DFOZ.js} +5 -3
- package/dist/chunk-F6L3DFOZ.js.map +1 -0
- package/dist/{chunk-HDI4L2DD.js → chunk-GHKGU6GK.js} +46 -23
- package/dist/chunk-GHKGU6GK.js.map +1 -0
- package/dist/{chunk-E4ECCGJV.mjs → chunk-GJCTAKK5.mjs} +197 -99
- package/dist/chunk-GJCTAKK5.mjs.map +1 -0
- package/dist/{chunk-B6W4CQOR.mjs → chunk-HJ5GXVDT.mjs} +2 -2
- package/dist/chunk-HJ5GXVDT.mjs.map +1 -0
- package/dist/chunk-HVOIBGYN.js +282 -0
- package/dist/chunk-HVOIBGYN.js.map +1 -0
- package/dist/{chunk-BOTVAG4A.js → chunk-JBF4XEGR.js} +5 -5
- package/dist/{chunk-ASA5RLBY.mjs → chunk-JEIAMJGS.mjs} +2 -2
- package/dist/{chunk-CNKVITJO.mjs → chunk-JTXPJ6TK.mjs} +4 -2
- package/dist/chunk-JTXPJ6TK.mjs.map +1 -0
- package/dist/{chunk-U3DJJN4X.js → chunk-LBJTMJFA.js} +4 -4
- package/dist/{chunk-IBK6AXPP.js → chunk-NHFZIY2K.js} +4 -4
- package/dist/chunk-NHFZIY2K.js.map +1 -0
- package/dist/{chunk-NEXY7SE2.js → chunk-NYVA7ZTQ.js} +2 -2
- package/dist/chunk-NYVA7ZTQ.js.map +1 -0
- package/dist/{chunk-UEDNQBJN.js → chunk-RPQ737HL.js} +202 -104
- package/dist/chunk-RPQ737HL.js.map +1 -0
- package/dist/{chunk-B5YVX5IO.mjs → chunk-SBWPU4VT.mjs} +4 -2
- package/dist/chunk-SBWPU4VT.mjs.map +1 -0
- package/dist/{chunk-ELSMS5S7.js → chunk-T5ZX5BV7.js} +3 -3
- package/dist/{chunk-ELSMS5S7.js.map → chunk-T5ZX5BV7.js.map} +1 -1
- package/dist/{chunk-HLCGZGPA.mjs → chunk-TWR6P5WG.mjs} +11 -7
- package/dist/chunk-TWR6P5WG.mjs.map +1 -0
- package/dist/{chunk-LZ5ZGQEX.mjs → chunk-UYH6NWKB.mjs} +2 -2
- package/dist/{chunk-Z6TBQQE5.js → chunk-V6DNVROD.js} +4 -4
- package/dist/chunk-V6DNVROD.js.map +1 -0
- package/dist/{chunk-Q5JRBGWO.mjs → chunk-VELPHITE.mjs} +2 -2
- package/dist/chunk-VELPHITE.mjs.map +1 -0
- package/dist/{chunk-62T7RKU3.mjs → chunk-W57QXOHJ.mjs} +188 -105
- package/dist/chunk-W57QXOHJ.mjs.map +1 -0
- package/dist/{chunk-PYMUBJQX.js → chunk-X4RMS365.js} +3 -3
- package/dist/chunk-X4RMS365.js.map +1 -0
- package/dist/{chunk-Y35SM7TO.mjs → chunk-XQO3EG4J.mjs} +4 -4
- package/dist/chunk-XQO3EG4J.mjs.map +1 -0
- package/dist/{chunk-QHWKLZUC.js → chunk-XSNGD5US.js} +14 -10
- package/dist/chunk-XSNGD5US.js.map +1 -0
- package/dist/{chunk-A2DDWXMS.mjs → chunk-Y45HQET7.mjs} +12 -5
- package/dist/chunk-Y45HQET7.mjs.map +1 -0
- package/dist/chunk-Z7RMCHD4.mjs +282 -0
- package/dist/chunk-Z7RMCHD4.mjs.map +1 -0
- package/dist/{chunk-WB6KJX4N.js → chunk-ZG5MS2TO.js} +4 -2
- package/dist/chunk-ZG5MS2TO.js.map +1 -0
- package/dist/crypto-compare-service/crypto-compare.js +2 -2
- package/dist/crypto-compare-service/crypto-compare.mjs +1 -1
- package/dist/crypto-compare-service/index.js +2 -2
- package/dist/crypto-compare-service/index.mjs +1 -1
- package/dist/index.js +21 -19
- package/dist/index.mjs +21 -19
- package/dist/token-prices-service/codefi-v2.js +2 -2
- package/dist/token-prices-service/codefi-v2.mjs +1 -1
- package/dist/token-prices-service/index.js +2 -2
- package/dist/token-prices-service/index.mjs +1 -1
- package/dist/token-service.js +3 -3
- package/dist/token-service.mjs +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/AccountTrackerController.d.ts +53 -68
- package/dist/types/AccountTrackerController.d.ts.map +1 -1
- package/dist/types/AssetsContractController.d.ts.map +1 -1
- package/dist/types/CurrencyRateController.d.ts.map +1 -1
- package/dist/types/NftController.d.ts +4 -5
- package/dist/types/NftController.d.ts.map +1 -1
- package/dist/types/NftDetectionController.d.ts +7 -18
- package/dist/types/NftDetectionController.d.ts.map +1 -1
- package/dist/types/RatesController/RatesController.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 +4 -6
- package/dist/types/TokenDetectionController.d.ts.map +1 -1
- package/dist/types/TokenListController.d.ts.map +1 -1
- package/dist/types/TokenRatesController.d.ts +72 -65
- package/dist/types/TokenRatesController.d.ts.map +1 -1
- package/dist/types/TokensController.d.ts +4 -6
- package/dist/types/TokensController.d.ts.map +1 -1
- package/dist/types/assetsUtil.d.ts.map +1 -1
- package/dist/types/crypto-compare-service/crypto-compare.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/token-prices-service/abstract-token-prices-service.d.ts +0 -1
- package/dist/types/token-prices-service/abstract-token-prices-service.d.ts.map +1 -1
- package/dist/types/token-prices-service/codefi-v2.d.ts +1 -1
- package/dist/types/token-prices-service/codefi-v2.d.ts.map +1 -1
- package/dist/types/token-service.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-4AC3X2U5.js.map +0 -1
- package/dist/chunk-543CC74T.mjs +0 -253
- package/dist/chunk-543CC74T.mjs.map +0 -1
- package/dist/chunk-5W5OO2Q5.mjs.map +0 -1
- package/dist/chunk-62T7RKU3.mjs.map +0 -1
- package/dist/chunk-65PB33TE.mjs +0 -246
- package/dist/chunk-65PB33TE.mjs.map +0 -1
- package/dist/chunk-73F3SN5O.mjs.map +0 -1
- package/dist/chunk-A2DDWXMS.mjs.map +0 -1
- package/dist/chunk-B5YVX5IO.mjs.map +0 -1
- package/dist/chunk-B6W4CQOR.mjs.map +0 -1
- package/dist/chunk-CGLUTXI7.js.map +0 -1
- package/dist/chunk-CNKVITJO.mjs.map +0 -1
- package/dist/chunk-E4ECCGJV.mjs.map +0 -1
- package/dist/chunk-GU53EI7A.js +0 -246
- package/dist/chunk-GU53EI7A.js.map +0 -1
- package/dist/chunk-HDI4L2DD.js.map +0 -1
- package/dist/chunk-HLCGZGPA.mjs.map +0 -1
- package/dist/chunk-IBK6AXPP.js.map +0 -1
- package/dist/chunk-JUI3XNEF.js.map +0 -1
- package/dist/chunk-MR6EF4B7.mjs.map +0 -1
- package/dist/chunk-NEXY7SE2.js.map +0 -1
- package/dist/chunk-PYMUBJQX.js.map +0 -1
- package/dist/chunk-Q5JRBGWO.mjs.map +0 -1
- package/dist/chunk-QFDTOEYR.js +0 -253
- package/dist/chunk-QFDTOEYR.js.map +0 -1
- package/dist/chunk-QHWKLZUC.js.map +0 -1
- package/dist/chunk-UEDNQBJN.js.map +0 -1
- package/dist/chunk-WB6KJX4N.js.map +0 -1
- package/dist/chunk-WCCLSUOI.mjs.map +0 -1
- package/dist/chunk-Y35SM7TO.mjs.map +0 -1
- package/dist/chunk-YIFA2HXH.js.map +0 -1
- package/dist/chunk-Z6TBQQE5.js.map +0 -1
- /package/dist/{chunk-D3K5MPMW.mjs.map → chunk-56O7BVZV.mjs.map} +0 -0
- /package/dist/{chunk-B5YY22QQ.js.map → chunk-6PPM4ETZ.js.map} +0 -0
- /package/dist/{chunk-BOTVAG4A.js.map → chunk-JBF4XEGR.js.map} +0 -0
- /package/dist/{chunk-ASA5RLBY.mjs.map → chunk-JEIAMJGS.mjs.map} +0 -0
- /package/dist/{chunk-U3DJJN4X.js.map → chunk-LBJTMJFA.js.map} +0 -0
- /package/dist/{chunk-LZ5ZGQEX.mjs.map → chunk-UYH6NWKB.mjs.map} +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__privateAdd,
|
|
3
|
+
__privateGet,
|
|
4
|
+
__privateMethod,
|
|
5
|
+
__privateSet
|
|
6
|
+
} from "./chunk-XUI43LEZ.mjs";
|
|
7
|
+
|
|
8
|
+
// src/NftDetectionController.ts
|
|
9
|
+
import { BaseController } from "@metamask/base-controller";
|
|
10
|
+
import {
|
|
11
|
+
toChecksumHexAddress,
|
|
12
|
+
ChainId,
|
|
13
|
+
NFT_API_BASE_URL,
|
|
14
|
+
NFT_API_VERSION,
|
|
15
|
+
convertHexToDecimal,
|
|
16
|
+
handleFetch
|
|
17
|
+
} from "@metamask/controller-utils";
|
|
18
|
+
import { createDeferredPromise } from "@metamask/utils";
|
|
19
|
+
var controllerName = "NftDetectionController";
|
|
20
|
+
var supportedNftDetectionNetworks = [ChainId.mainnet];
|
|
21
|
+
var BlockaidResultType = /* @__PURE__ */ ((BlockaidResultType2) => {
|
|
22
|
+
BlockaidResultType2["Benign"] = "Benign";
|
|
23
|
+
BlockaidResultType2["Spam"] = "Spam";
|
|
24
|
+
BlockaidResultType2["Warning"] = "Warning";
|
|
25
|
+
BlockaidResultType2["Malicious"] = "Malicious";
|
|
26
|
+
return BlockaidResultType2;
|
|
27
|
+
})(BlockaidResultType || {});
|
|
28
|
+
var _disabled, _addNft, _getNftState, _inProcessNftFetchingUpdates, _onPreferencesControllerStateChange, onPreferencesControllerStateChange_fn, _getOwnerNftApi, getOwnerNftApi_fn, _getOwnerNfts, getOwnerNfts_fn;
|
|
29
|
+
var NftDetectionController = class extends BaseController {
|
|
30
|
+
/**
|
|
31
|
+
* The controller options
|
|
32
|
+
*
|
|
33
|
+
* @param options - The controller options.
|
|
34
|
+
* @param options.messenger - A reference to the messaging system.
|
|
35
|
+
* @param options.disabled - Represents previous value of useNftDetection. Used to detect changes of useNftDetection. Default value is true.
|
|
36
|
+
* @param options.addNft - Add an NFT.
|
|
37
|
+
* @param options.getNftState - Gets the current state of the Assets controller.
|
|
38
|
+
*/
|
|
39
|
+
constructor({
|
|
40
|
+
messenger,
|
|
41
|
+
disabled = false,
|
|
42
|
+
addNft,
|
|
43
|
+
getNftState
|
|
44
|
+
}) {
|
|
45
|
+
super({
|
|
46
|
+
name: controllerName,
|
|
47
|
+
messenger,
|
|
48
|
+
metadata: {},
|
|
49
|
+
state: {}
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Handles the state change of the preference controller.
|
|
53
|
+
* @param preferencesState - The new state of the preference controller.
|
|
54
|
+
* @param preferencesState.useNftDetection - Boolean indicating user preference on NFT detection.
|
|
55
|
+
*/
|
|
56
|
+
__privateAdd(this, _onPreferencesControllerStateChange);
|
|
57
|
+
__privateAdd(this, _getOwnerNftApi);
|
|
58
|
+
__privateAdd(this, _getOwnerNfts);
|
|
59
|
+
__privateAdd(this, _disabled, void 0);
|
|
60
|
+
__privateAdd(this, _addNft, void 0);
|
|
61
|
+
__privateAdd(this, _getNftState, void 0);
|
|
62
|
+
__privateAdd(this, _inProcessNftFetchingUpdates, void 0);
|
|
63
|
+
__privateSet(this, _disabled, disabled);
|
|
64
|
+
__privateSet(this, _inProcessNftFetchingUpdates, {});
|
|
65
|
+
__privateSet(this, _getNftState, getNftState);
|
|
66
|
+
__privateSet(this, _addNft, addNft);
|
|
67
|
+
this.messagingSystem.subscribe(
|
|
68
|
+
"PreferencesController:stateChange",
|
|
69
|
+
__privateMethod(this, _onPreferencesControllerStateChange, onPreferencesControllerStateChange_fn).bind(this)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Checks whether network is mainnet or not.
|
|
74
|
+
*
|
|
75
|
+
* @returns Whether current network is mainnet.
|
|
76
|
+
*/
|
|
77
|
+
isMainnet() {
|
|
78
|
+
const { selectedNetworkClientId } = this.messagingSystem.call(
|
|
79
|
+
"NetworkController:getState"
|
|
80
|
+
);
|
|
81
|
+
const {
|
|
82
|
+
configuration: { chainId }
|
|
83
|
+
} = this.messagingSystem.call(
|
|
84
|
+
"NetworkController:getNetworkClientById",
|
|
85
|
+
selectedNetworkClientId
|
|
86
|
+
);
|
|
87
|
+
return chainId === ChainId.mainnet;
|
|
88
|
+
}
|
|
89
|
+
isMainnetByNetworkClientId(networkClient) {
|
|
90
|
+
return networkClient.configuration.chainId === ChainId.mainnet;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Triggers asset ERC721 token auto detection on mainnet. Any newly detected NFTs are
|
|
94
|
+
* added.
|
|
95
|
+
*
|
|
96
|
+
* @param options - Options bag.
|
|
97
|
+
* @param options.networkClientId - The network client ID to detect NFTs on.
|
|
98
|
+
* @param options.userAddress - The address to detect NFTs for.
|
|
99
|
+
*/
|
|
100
|
+
async detectNfts(options) {
|
|
101
|
+
const userAddress = options?.userAddress ?? this.messagingSystem.call("AccountsController:getSelectedAccount").address;
|
|
102
|
+
const { selectedNetworkClientId } = this.messagingSystem.call(
|
|
103
|
+
"NetworkController:getState"
|
|
104
|
+
);
|
|
105
|
+
const {
|
|
106
|
+
configuration: { chainId }
|
|
107
|
+
} = this.messagingSystem.call(
|
|
108
|
+
"NetworkController:getNetworkClientById",
|
|
109
|
+
selectedNetworkClientId
|
|
110
|
+
);
|
|
111
|
+
if (!supportedNftDetectionNetworks.includes(chainId) || __privateGet(this, _disabled)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!userAddress) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const updateKey = `${chainId}:${userAddress}`;
|
|
118
|
+
if (updateKey in __privateGet(this, _inProcessNftFetchingUpdates)) {
|
|
119
|
+
await __privateGet(this, _inProcessNftFetchingUpdates)[updateKey];
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const {
|
|
123
|
+
promise: inProgressUpdate,
|
|
124
|
+
resolve: updateSucceeded,
|
|
125
|
+
reject: updateFailed
|
|
126
|
+
} = createDeferredPromise({ suppressUnhandledRejection: true });
|
|
127
|
+
__privateGet(this, _inProcessNftFetchingUpdates)[updateKey] = inProgressUpdate;
|
|
128
|
+
let next;
|
|
129
|
+
let apiNfts = [];
|
|
130
|
+
let resultNftApi;
|
|
131
|
+
try {
|
|
132
|
+
do {
|
|
133
|
+
resultNftApi = await __privateMethod(this, _getOwnerNfts, getOwnerNfts_fn).call(this, userAddress, chainId, next);
|
|
134
|
+
apiNfts = resultNftApi.tokens.filter(
|
|
135
|
+
(elm) => elm.token.isSpam === false && (elm.blockaidResult?.result_type ? elm.blockaidResult?.result_type === "Benign" /* Benign */ : true)
|
|
136
|
+
);
|
|
137
|
+
const addNftPromises = apiNfts.map(async (nft) => {
|
|
138
|
+
const {
|
|
139
|
+
tokenId,
|
|
140
|
+
contract,
|
|
141
|
+
kind,
|
|
142
|
+
image: imageUrl,
|
|
143
|
+
imageSmall: imageThumbnailUrl,
|
|
144
|
+
metadata: { imageOriginal: imageOriginalUrl } = {},
|
|
145
|
+
name,
|
|
146
|
+
description,
|
|
147
|
+
attributes,
|
|
148
|
+
topBid,
|
|
149
|
+
lastSale,
|
|
150
|
+
rarityRank,
|
|
151
|
+
rarityScore,
|
|
152
|
+
collection
|
|
153
|
+
} = nft.token;
|
|
154
|
+
let ignored;
|
|
155
|
+
const { ignoredNfts } = __privateGet(this, _getNftState).call(this);
|
|
156
|
+
if (ignoredNfts.length) {
|
|
157
|
+
ignored = ignoredNfts.find((c) => {
|
|
158
|
+
return c.address === toChecksumHexAddress(contract) && c.tokenId === tokenId;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (!ignored) {
|
|
162
|
+
const nftMetadata = Object.assign(
|
|
163
|
+
{},
|
|
164
|
+
{ name },
|
|
165
|
+
description && { description },
|
|
166
|
+
imageUrl && { image: imageUrl },
|
|
167
|
+
imageThumbnailUrl && { imageThumbnail: imageThumbnailUrl },
|
|
168
|
+
imageOriginalUrl && { imageOriginal: imageOriginalUrl },
|
|
169
|
+
kind && { standard: kind.toUpperCase() },
|
|
170
|
+
lastSale && { lastSale },
|
|
171
|
+
attributes && { attributes },
|
|
172
|
+
topBid && { topBid },
|
|
173
|
+
rarityRank && { rarityRank },
|
|
174
|
+
rarityScore && { rarityScore },
|
|
175
|
+
collection && { collection }
|
|
176
|
+
);
|
|
177
|
+
await __privateGet(this, _addNft).call(this, contract, tokenId, {
|
|
178
|
+
nftMetadata,
|
|
179
|
+
userAddress,
|
|
180
|
+
source: "detected" /* Detected */,
|
|
181
|
+
networkClientId: options?.networkClientId
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
await Promise.all(addNftPromises);
|
|
186
|
+
} while (next = resultNftApi.continuation);
|
|
187
|
+
updateSucceeded();
|
|
188
|
+
} catch (error) {
|
|
189
|
+
updateFailed(error);
|
|
190
|
+
throw error;
|
|
191
|
+
} finally {
|
|
192
|
+
delete __privateGet(this, _inProcessNftFetchingUpdates)[updateKey];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
_disabled = new WeakMap();
|
|
197
|
+
_addNft = new WeakMap();
|
|
198
|
+
_getNftState = new WeakMap();
|
|
199
|
+
_inProcessNftFetchingUpdates = new WeakMap();
|
|
200
|
+
_onPreferencesControllerStateChange = new WeakSet();
|
|
201
|
+
onPreferencesControllerStateChange_fn = function({ useNftDetection }) {
|
|
202
|
+
if (!useNftDetection !== __privateGet(this, _disabled)) {
|
|
203
|
+
__privateSet(this, _disabled, !useNftDetection);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
_getOwnerNftApi = new WeakSet();
|
|
207
|
+
getOwnerNftApi_fn = function({
|
|
208
|
+
chainId,
|
|
209
|
+
address,
|
|
210
|
+
next
|
|
211
|
+
}) {
|
|
212
|
+
return `${NFT_API_BASE_URL}/users/${address}/tokens?chainIds=${chainId}&limit=50&includeTopBid=true&continuation=${next ?? ""}`;
|
|
213
|
+
};
|
|
214
|
+
_getOwnerNfts = new WeakSet();
|
|
215
|
+
getOwnerNfts_fn = async function(address, chainId, cursor) {
|
|
216
|
+
const convertedChainId = convertHexToDecimal(chainId).toString();
|
|
217
|
+
const url = __privateMethod(this, _getOwnerNftApi, getOwnerNftApi_fn).call(this, {
|
|
218
|
+
chainId: convertedChainId,
|
|
219
|
+
address,
|
|
220
|
+
next: cursor
|
|
221
|
+
});
|
|
222
|
+
const nftApiResponse = await handleFetch(url, {
|
|
223
|
+
headers: {
|
|
224
|
+
Version: NFT_API_VERSION
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
return nftApiResponse;
|
|
228
|
+
};
|
|
229
|
+
var NftDetectionController_default = NftDetectionController;
|
|
230
|
+
|
|
231
|
+
export {
|
|
232
|
+
BlockaidResultType,
|
|
233
|
+
NftDetectionController,
|
|
234
|
+
NftDetectionController_default
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=chunk-2IIQTSLV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/NftDetectionController.ts"],"sourcesContent":["import type { AccountsControllerGetSelectedAccountAction } from '@metamask/accounts-controller';\nimport type { AddApprovalRequest } from '@metamask/approval-controller';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport {\n toChecksumHexAddress,\n ChainId,\n NFT_API_BASE_URL,\n NFT_API_VERSION,\n convertHexToDecimal,\n handleFetch,\n} from '@metamask/controller-utils';\nimport type {\n NetworkClientId,\n NetworkClient,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerStateChangeEvent,\n NetworkControllerGetStateAction,\n} from '@metamask/network-controller';\nimport type {\n PreferencesControllerGetStateAction,\n PreferencesControllerStateChangeEvent,\n PreferencesState,\n} from '@metamask/preferences-controller';\nimport { createDeferredPromise, type Hex } from '@metamask/utils';\n\nimport { Source } from './constants';\nimport {\n type NftController,\n type NftControllerState,\n type NftMetadata,\n} from './NftController';\n\nconst controllerName = 'NftDetectionController';\n\nexport type NFTDetectionControllerState = Record<never, never>;\n\nexport type AllowedActions =\n | AddApprovalRequest\n | NetworkControllerGetStateAction\n | NetworkControllerGetNetworkClientByIdAction\n | PreferencesControllerGetStateAction\n | AccountsControllerGetSelectedAccountAction;\n\nexport type AllowedEvents =\n | PreferencesControllerStateChangeEvent\n | NetworkControllerStateChangeEvent;\n\nexport type NftDetectionControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AllowedActions,\n AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\nconst supportedNftDetectionNetworks: Hex[] = [ChainId.mainnet];\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 */\nexport type ApiNft = {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n token_id: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n num_sales: number | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n background_color: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n image_url: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n image_preview_url: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n image_thumbnail_url: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n image_original_url: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n animation_url: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n animation_original_url: string | null;\n name: string | null;\n description: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n external_link: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n asset_contract: ApiNftContract;\n creator: ApiNftCreator;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 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 */\nexport type ApiNftContract = {\n address: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n asset_contract_type: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n created_date: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n schema_name: string | null;\n symbol: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n total_supply: string | null;\n description: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n external_link: string | null;\n collection: {\n name: string | null;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 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 */\nexport type ApiNftLastSale = {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n event_timestamp: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n total_price: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 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 */\nexport type ApiNftCreator = {\n user: { username: string };\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n profile_img_url: string;\n address: 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 // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n result_type: BlockaidResultType;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n malicious_score: string;\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 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 detects nfts for a user address\n */\nexport class NftDetectionController extends BaseController<\n typeof controllerName,\n NFTDetectionControllerState,\n NftDetectionControllerMessenger\n> {\n #disabled: boolean;\n\n readonly #addNft: NftController['addNft'];\n\n readonly #getNftState: () => NftControllerState;\n\n #inProcessNftFetchingUpdates: Record<`${Hex}:${string}`, Promise<void>>;\n\n /**\n * The controller options\n *\n * @param options - The controller options.\n * @param options.messenger - A reference to the messaging system.\n * @param options.disabled - Represents previous value of useNftDetection. Used to detect changes of useNftDetection. Default value is true.\n * @param options.addNft - Add an NFT.\n * @param options.getNftState - Gets the current state of the Assets controller.\n */\n constructor({\n messenger,\n disabled = false,\n addNft,\n getNftState,\n }: {\n messenger: NftDetectionControllerMessenger;\n disabled: boolean;\n addNft: NftController['addNft'];\n getNftState: () => NftControllerState;\n }) {\n super({\n name: controllerName,\n messenger,\n metadata: {},\n state: {},\n });\n this.#disabled = disabled;\n this.#inProcessNftFetchingUpdates = {};\n\n this.#getNftState = getNftState;\n this.#addNft = addNft;\n\n this.messagingSystem.subscribe(\n 'PreferencesController:stateChange',\n this.#onPreferencesControllerStateChange.bind(this),\n );\n }\n\n /**\n * Checks whether network is mainnet or not.\n *\n * @returns Whether current network is mainnet.\n */\n isMainnet(): boolean {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n const {\n configuration: { chainId },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n return chainId === ChainId.mainnet;\n }\n\n isMainnetByNetworkClientId(networkClient: NetworkClient): boolean {\n return networkClient.configuration.chainId === ChainId.mainnet;\n }\n\n /**\n * Handles the state change of the preference controller.\n * @param preferencesState - The new state of the preference controller.\n * @param preferencesState.useNftDetection - Boolean indicating user preference on NFT detection.\n */\n #onPreferencesControllerStateChange({ useNftDetection }: PreferencesState) {\n if (!useNftDetection !== this.#disabled) {\n this.#disabled = !useNftDetection;\n }\n }\n\n #getOwnerNftApi({\n chainId,\n address,\n next,\n }: {\n chainId: string;\n address: string;\n next?: string;\n }) {\n return `${\n NFT_API_BASE_URL as string\n }/users/${address}/tokens?chainIds=${chainId}&limit=50&includeTopBid=true&continuation=${\n next ?? ''\n }`;\n }\n\n async #getOwnerNfts(\n address: string,\n chainId: Hex,\n cursor: string | undefined,\n ) {\n // Convert hex chainId to number\n const convertedChainId = convertHexToDecimal(chainId).toString();\n const url = this.#getOwnerNftApi({\n chainId: convertedChainId,\n address,\n next: cursor,\n });\n const nftApiResponse: ReservoirResponse = await handleFetch(url, {\n headers: {\n Version: NFT_API_VERSION,\n },\n });\n return nftApiResponse;\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(options?: {\n networkClientId?: NetworkClientId;\n userAddress?: string;\n }) {\n const userAddress =\n options?.userAddress ??\n this.messagingSystem.call('AccountsController:getSelectedAccount')\n .address;\n\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n const {\n configuration: { chainId },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n /* istanbul ignore if */\n if (!supportedNftDetectionNetworks.includes(chainId) || this.#disabled) {\n return;\n }\n /* istanbul ignore else */\n if (!userAddress) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n const updateKey: `${Hex}:${string}` = `${chainId}:${userAddress}`;\n if (updateKey in this.#inProcessNftFetchingUpdates) {\n // This prevents redundant updates\n // This promise is resolved after the in-progress update has finished,\n // and state has been updated.\n await this.#inProcessNftFetchingUpdates[updateKey];\n return;\n }\n\n const {\n promise: inProgressUpdate,\n resolve: updateSucceeded,\n reject: updateFailed,\n } = createDeferredPromise({ suppressUnhandledRejection: true });\n this.#inProcessNftFetchingUpdates[updateKey] = inProgressUpdate;\n\n let next;\n let apiNfts: TokensResponse[] = [];\n let resultNftApi: ReservoirResponse;\n try {\n do {\n resultNftApi = await this.#getOwnerNfts(userAddress, chainId, next);\n apiNfts = resultNftApi.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 const addNftPromises = apiNfts.map(async (nft) => {\n const {\n tokenId,\n contract,\n kind,\n image: imageUrl,\n imageSmall: imageThumbnailUrl,\n metadata: { imageOriginal: imageOriginalUrl } = {},\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 === tokenId\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 imageUrl && { image: imageUrl },\n imageThumbnailUrl && { imageThumbnail: imageThumbnailUrl },\n imageOriginalUrl && { imageOriginal: imageOriginalUrl },\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, tokenId, {\n nftMetadata,\n userAddress,\n source: Source.Detected,\n networkClientId: options?.networkClientId,\n });\n }\n });\n await Promise.all(addNftPromises);\n } while ((next = resultNftApi.continuation));\n updateSucceeded();\n } catch (error) {\n updateFailed(error);\n throw error;\n } finally {\n delete this.#inProcessNftFetchingUpdates[updateKey];\n }\n }\n}\n\nexport default NftDetectionController;\n"],"mappings":"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","names":["BlockaidResultType"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunk6PPM4ETZjs = require('./chunk-6PPM4ETZ.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkJBF4XEGRjs = require('./chunk-JBF4XEGR.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkX4RMS365js = require('./chunk-X4RMS365.js');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _chunkNYVA7ZTQjs = require('./chunk-NYVA7ZTQ.js');
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
|
|
@@ -76,20 +76,18 @@ var getDefaultTokensState = () => {
|
|
|
76
76
|
allDetectedTokens: {}
|
|
77
77
|
};
|
|
78
78
|
};
|
|
79
|
-
var _mutex, _chainId,
|
|
79
|
+
var _mutex, _chainId, _selectedAccountId, _provider, _abortController, _onNetworkDidChange, onNetworkDidChange_fn, _onSelectedAccountChange, onSelectedAccountChange_fn, _fetchTokenMetadata, fetchTokenMetadata_fn, _updateTokensAttribute, updateTokensAttribute_fn, _detectIsERC721, detectIsERC721_fn, _getProvider, getProvider_fn, _createEthersContract, createEthersContract_fn, _generateRandomId, generateRandomId_fn, _getNewAllTokensState, getNewAllTokensState_fn, _getAddressOrSelectedAddress, getAddressOrSelectedAddress_fn, _isInteractingWithWallet, isInteractingWithWallet_fn, _requestApproval, requestApproval_fn, _getSelectedAccount, getSelectedAccount_fn, _getSelectedAddress, getSelectedAddress_fn;
|
|
80
80
|
var TokensController = class extends _basecontroller.BaseController {
|
|
81
81
|
/**
|
|
82
82
|
* Tokens controller options
|
|
83
83
|
* @param options - Constructor options.
|
|
84
84
|
* @param options.chainId - The chain ID of the current network.
|
|
85
|
-
* @param options.selectedAddress - Vault selected address
|
|
86
85
|
* @param options.provider - Network provider.
|
|
87
86
|
* @param options.state - Initial state to set on this controller.
|
|
88
87
|
* @param options.messenger - The controller messenger.
|
|
89
88
|
*/
|
|
90
89
|
constructor({
|
|
91
90
|
chainId: initialChainId,
|
|
92
|
-
selectedAddress,
|
|
93
91
|
provider,
|
|
94
92
|
state,
|
|
95
93
|
messenger
|
|
@@ -107,15 +105,15 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
107
105
|
* Handles the event when the network changes.
|
|
108
106
|
*
|
|
109
107
|
* @param networkState - The changed network state.
|
|
110
|
-
* @param networkState.
|
|
108
|
+
* @param networkState.selectedNetworkClientId - The ID of the currently
|
|
109
|
+
* selected network client.
|
|
111
110
|
*/
|
|
112
111
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _onNetworkDidChange);
|
|
113
112
|
/**
|
|
114
|
-
* Handles the
|
|
115
|
-
* @param
|
|
116
|
-
* @param preferencesState.selectedAddress - The current selected address of the preference controller.
|
|
113
|
+
* Handles the selected account change in the accounts controller.
|
|
114
|
+
* @param selectedAccount - The new selected account
|
|
117
115
|
*/
|
|
118
|
-
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this,
|
|
116
|
+
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _onSelectedAccountChange);
|
|
119
117
|
/**
|
|
120
118
|
* Fetch metadata for a token.
|
|
121
119
|
*
|
|
@@ -155,23 +153,27 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
155
153
|
* @returns The updated `allTokens` and `allIgnoredTokens` state.
|
|
156
154
|
*/
|
|
157
155
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _getNewAllTokensState);
|
|
156
|
+
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _getAddressOrSelectedAddress);
|
|
157
|
+
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _isInteractingWithWallet);
|
|
158
158
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _requestApproval);
|
|
159
|
+
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _getSelectedAccount);
|
|
160
|
+
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _getSelectedAddress);
|
|
159
161
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _mutex, new (0, _asyncmutex.Mutex)());
|
|
160
162
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _chainId, void 0);
|
|
161
|
-
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this,
|
|
163
|
+
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _selectedAccountId, void 0);
|
|
162
164
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _provider, void 0);
|
|
163
165
|
_chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _abortController, void 0);
|
|
164
166
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _chainId, initialChainId);
|
|
165
167
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _provider, provider);
|
|
166
|
-
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this,
|
|
168
|
+
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _selectedAccountId, _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getSelectedAccount, getSelectedAccount_fn).call(this).id);
|
|
167
169
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _abortController, new AbortController());
|
|
168
170
|
this.messagingSystem.registerActionHandler(
|
|
169
171
|
`${controllerName}:addDetectedTokens`,
|
|
170
172
|
this.addDetectedTokens.bind(this)
|
|
171
173
|
);
|
|
172
174
|
this.messagingSystem.subscribe(
|
|
173
|
-
"
|
|
174
|
-
_chunkZ4BLTVTBjs.__privateMethod.call(void 0, this,
|
|
175
|
+
"AccountsController:selectedEvmAccountChange",
|
|
176
|
+
_chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _onSelectedAccountChange, onSelectedAccountChange_fn).bind(this)
|
|
175
177
|
);
|
|
176
178
|
this.messagingSystem.subscribe(
|
|
177
179
|
"NetworkController:networkDidChange",
|
|
@@ -210,7 +212,6 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
210
212
|
networkClientId
|
|
211
213
|
}) {
|
|
212
214
|
const chainId = _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId);
|
|
213
|
-
const selectedAddress = _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _selectedAddress);
|
|
214
215
|
const releaseLock = await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _mutex).acquire();
|
|
215
216
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
216
217
|
let currentChainId = chainId;
|
|
@@ -220,8 +221,8 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
220
221
|
networkClientId
|
|
221
222
|
).configuration.chainId;
|
|
222
223
|
}
|
|
223
|
-
const accountAddress =
|
|
224
|
-
const isInteractingWithWalletAccount =
|
|
224
|
+
const accountAddress = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getAddressOrSelectedAddress, getAddressOrSelectedAddress_fn).call(this, interactingAddress);
|
|
225
|
+
const isInteractingWithWalletAccount = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _isInteractingWithWallet, isInteractingWithWallet_fn).call(this, accountAddress);
|
|
225
226
|
try {
|
|
226
227
|
address = _controllerutils.toChecksumHexAddress.call(void 0, address);
|
|
227
228
|
const tokens = allTokens[currentChainId]?.[accountAddress] || [];
|
|
@@ -242,12 +243,12 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
242
243
|
address,
|
|
243
244
|
symbol,
|
|
244
245
|
decimals,
|
|
245
|
-
image: image ||
|
|
246
|
+
image: image || _chunkNYVA7ZTQjs.formatIconUrlWithProxy.call(void 0, {
|
|
246
247
|
chainId: currentChainId,
|
|
247
248
|
tokenAddress: address
|
|
248
249
|
}),
|
|
249
250
|
isERC721,
|
|
250
|
-
aggregators:
|
|
251
|
+
aggregators: _chunkNYVA7ZTQjs.formatAggregatorNames.call(void 0, tokenMetadata?.aggregators || []),
|
|
251
252
|
name
|
|
252
253
|
};
|
|
253
254
|
const previousIndex = newTokens.findIndex(
|
|
@@ -400,7 +401,7 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
400
401
|
async addDetectedTokens(incomingDetectedTokens, detectionDetails) {
|
|
401
402
|
const releaseLock = await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _mutex).acquire();
|
|
402
403
|
const chainId = detectionDetails?.chainId ?? _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId);
|
|
403
|
-
const accountAddress = detectionDetails?.selectedAddress ?? _chunkZ4BLTVTBjs.
|
|
404
|
+
const accountAddress = detectionDetails?.selectedAddress ?? _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getSelectedAddress, getSelectedAddress_fn).call(this);
|
|
404
405
|
const { allTokens, allDetectedTokens, allIgnoredTokens } = this.state;
|
|
405
406
|
let newTokens = [...allTokens?.[chainId]?.[accountAddress] ?? []];
|
|
406
407
|
let newDetectedTokens = [
|
|
@@ -452,8 +453,9 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
452
453
|
interactingAddress: accountAddress,
|
|
453
454
|
interactingChainId: chainId
|
|
454
455
|
});
|
|
455
|
-
|
|
456
|
-
|
|
456
|
+
const selectedAddress = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getSelectedAddress, getSelectedAddress_fn).call(this);
|
|
457
|
+
newTokens = newAllTokens?.[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[selectedAddress] || [];
|
|
458
|
+
newDetectedTokens = newAllDetectedTokens?.[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[selectedAddress] || [];
|
|
457
459
|
this.update((state) => {
|
|
458
460
|
state.tokens = newTokens;
|
|
459
461
|
state.allTokens = newAllTokens;
|
|
@@ -510,23 +512,28 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
510
512
|
if (!_controllerutils.isValidHexAddress.call(void 0, asset.address)) {
|
|
511
513
|
throw _rpcerrors.rpcErrors.invalidParams(`Invalid address "${asset.address}"`);
|
|
512
514
|
}
|
|
515
|
+
const selectedAddress = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getAddressOrSelectedAddress, getAddressOrSelectedAddress_fn).call(this, interactingAddress);
|
|
513
516
|
if (await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _detectIsERC721, detectIsERC721_fn).call(this, asset.address, networkClientId)) {
|
|
514
517
|
throw _rpcerrors.rpcErrors.invalidParams(
|
|
518
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
519
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
515
520
|
`Contract ${asset.address} must match type ${type}, but was detected as ${_controllerutils.ERC721}`
|
|
516
521
|
);
|
|
517
522
|
}
|
|
518
523
|
const provider = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getProvider, getProvider_fn).call(this, networkClientId);
|
|
519
524
|
const isErc1155 = await _controllerutils.safelyExecute.call(void 0,
|
|
520
|
-
() => new (0,
|
|
525
|
+
() => new (0, _chunkJBF4XEGRjs.ERC1155Standard)(provider).contractSupportsBase1155Interface(
|
|
521
526
|
asset.address
|
|
522
527
|
)
|
|
523
528
|
);
|
|
524
529
|
if (isErc1155) {
|
|
525
530
|
throw _rpcerrors.rpcErrors.invalidParams(
|
|
531
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
532
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
526
533
|
`Contract ${asset.address} must match type ${type}, but was detected as ${_controllerutils.ERC1155}`
|
|
527
534
|
);
|
|
528
535
|
}
|
|
529
|
-
const erc20 = new (0,
|
|
536
|
+
const erc20 = new (0, _chunk6PPM4ETZjs.ERC20Standard)(provider);
|
|
530
537
|
const [contractName, contractSymbol, contractDecimals] = await Promise.all([
|
|
531
538
|
_controllerutils.safelyExecute.call(void 0, () => erc20.getTokenName(asset.address)),
|
|
532
539
|
_controllerutils.safelyExecute.call(void 0, () => erc20.getTokenSymbol(asset.address)),
|
|
@@ -540,6 +547,8 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
540
547
|
}
|
|
541
548
|
if (contractSymbol !== void 0 && asset.symbol !== void 0 && asset.symbol.toUpperCase() !== contractSymbol.toUpperCase()) {
|
|
542
549
|
throw _rpcerrors.rpcErrors.invalidParams(
|
|
550
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
551
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
543
552
|
`The symbol in the request (${asset.symbol}) does not match the symbol in the contract (${contractSymbol})`
|
|
544
553
|
);
|
|
545
554
|
}
|
|
@@ -559,6 +568,8 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
559
568
|
}
|
|
560
569
|
if (contractDecimals !== void 0 && asset.decimals !== void 0 && String(asset.decimals) !== contractDecimals) {
|
|
561
570
|
throw _rpcerrors.rpcErrors.invalidParams(
|
|
571
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
572
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
562
573
|
`The decimals in the request (${asset.decimals}) do not match the decimals in the contract (${contractDecimals})`
|
|
563
574
|
);
|
|
564
575
|
}
|
|
@@ -566,6 +577,8 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
566
577
|
const decimalsNum = parseInt(decimalsStr, 10);
|
|
567
578
|
if (!Number.isInteger(decimalsNum) || decimalsNum > 36 || decimalsNum < 0) {
|
|
568
579
|
throw _rpcerrors.rpcErrors.invalidParams(
|
|
580
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
581
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
569
582
|
`Invalid decimals "${decimalsStr}": must be an integer 0 <= 36`
|
|
570
583
|
);
|
|
571
584
|
}
|
|
@@ -575,7 +588,7 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
575
588
|
id: _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _generateRandomId, generateRandomId_fn).call(this),
|
|
576
589
|
time: Date.now(),
|
|
577
590
|
type,
|
|
578
|
-
interactingAddress:
|
|
591
|
+
interactingAddress: selectedAddress
|
|
579
592
|
};
|
|
580
593
|
await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _requestApproval, requestApproval_fn).call(this, suggestedAssetMeta);
|
|
581
594
|
const { address, symbol, decimals, name, image } = asset;
|
|
@@ -601,43 +614,48 @@ var TokensController = class extends _basecontroller.BaseController {
|
|
|
601
614
|
};
|
|
602
615
|
_mutex = new WeakMap();
|
|
603
616
|
_chainId = new WeakMap();
|
|
604
|
-
|
|
617
|
+
_selectedAccountId = new WeakMap();
|
|
605
618
|
_provider = new WeakMap();
|
|
606
619
|
_abortController = new WeakMap();
|
|
607
620
|
_onNetworkDidChange = new WeakSet();
|
|
608
|
-
onNetworkDidChange_fn = function({
|
|
621
|
+
onNetworkDidChange_fn = function({ selectedNetworkClientId }) {
|
|
622
|
+
const selectedNetworkClient = this.messagingSystem.call(
|
|
623
|
+
"NetworkController:getNetworkClientById",
|
|
624
|
+
selectedNetworkClientId
|
|
625
|
+
);
|
|
609
626
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
610
|
-
const { chainId } =
|
|
627
|
+
const { chainId } = selectedNetworkClient.configuration;
|
|
611
628
|
_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _abortController).abort();
|
|
612
629
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _abortController, new AbortController());
|
|
613
630
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _chainId, chainId);
|
|
631
|
+
const selectedAddress = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getSelectedAddress, getSelectedAddress_fn).call(this);
|
|
614
632
|
this.update((state) => {
|
|
615
|
-
state.tokens = allTokens[chainId]?.[
|
|
616
|
-
state.ignoredTokens = allIgnoredTokens[chainId]?.[
|
|
617
|
-
state.detectedTokens = allDetectedTokens[chainId]?.[
|
|
633
|
+
state.tokens = allTokens[chainId]?.[selectedAddress] || [];
|
|
634
|
+
state.ignoredTokens = allIgnoredTokens[chainId]?.[selectedAddress] || [];
|
|
635
|
+
state.detectedTokens = allDetectedTokens[chainId]?.[selectedAddress] || [];
|
|
618
636
|
});
|
|
619
637
|
};
|
|
620
|
-
|
|
621
|
-
|
|
638
|
+
_onSelectedAccountChange = new WeakSet();
|
|
639
|
+
onSelectedAccountChange_fn = function(selectedAccount) {
|
|
622
640
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
623
|
-
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this,
|
|
641
|
+
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _selectedAccountId, selectedAccount.id);
|
|
624
642
|
this.update((state) => {
|
|
625
|
-
state.tokens = allTokens[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[
|
|
626
|
-
state.ignoredTokens = allIgnoredTokens[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[
|
|
627
|
-
state.detectedTokens = allDetectedTokens[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[
|
|
643
|
+
state.tokens = allTokens[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[selectedAccount.address] ?? [];
|
|
644
|
+
state.ignoredTokens = allIgnoredTokens[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[selectedAccount.address] ?? [];
|
|
645
|
+
state.detectedTokens = allDetectedTokens[_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId)]?.[selectedAccount.address] ?? [];
|
|
628
646
|
});
|
|
629
647
|
};
|
|
630
648
|
_fetchTokenMetadata = new WeakSet();
|
|
631
649
|
fetchTokenMetadata_fn = async function(tokenAddress) {
|
|
632
650
|
try {
|
|
633
|
-
const token = await
|
|
651
|
+
const token = await _chunkX4RMS365js.fetchTokenMetadata.call(void 0,
|
|
634
652
|
_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId),
|
|
635
653
|
tokenAddress,
|
|
636
654
|
_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _abortController).signal
|
|
637
655
|
);
|
|
638
656
|
return token;
|
|
639
657
|
} catch (error) {
|
|
640
|
-
if (error instanceof Error && error.message.includes(
|
|
658
|
+
if (error instanceof Error && error.message.includes(_chunkX4RMS365js.TOKEN_METADATA_NO_SUPPORT_ERROR)) {
|
|
641
659
|
return void 0;
|
|
642
660
|
}
|
|
643
661
|
throw error;
|
|
@@ -699,7 +717,7 @@ getNewAllTokensState_fn = function(params) {
|
|
|
699
717
|
interactingChainId
|
|
700
718
|
} = params;
|
|
701
719
|
const { allTokens, allIgnoredTokens, allDetectedTokens } = this.state;
|
|
702
|
-
const userAddressToAddTokens =
|
|
720
|
+
const userAddressToAddTokens = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getAddressOrSelectedAddress, getAddressOrSelectedAddress_fn).call(this, interactingAddress);
|
|
703
721
|
const chainIdToAddTokens = interactingChainId ?? _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId);
|
|
704
722
|
let newAllTokens = allTokens;
|
|
705
723
|
if (newTokens?.length || newTokens && allTokens && allTokens[chainIdToAddTokens] && allTokens[chainIdToAddTokens][userAddressToAddTokens]) {
|
|
@@ -739,6 +757,18 @@ getNewAllTokensState_fn = function(params) {
|
|
|
739
757
|
}
|
|
740
758
|
return { newAllTokens, newAllIgnoredTokens, newAllDetectedTokens };
|
|
741
759
|
};
|
|
760
|
+
_getAddressOrSelectedAddress = new WeakSet();
|
|
761
|
+
getAddressOrSelectedAddress_fn = function(address) {
|
|
762
|
+
if (address) {
|
|
763
|
+
return address;
|
|
764
|
+
}
|
|
765
|
+
return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getSelectedAddress, getSelectedAddress_fn).call(this);
|
|
766
|
+
};
|
|
767
|
+
_isInteractingWithWallet = new WeakSet();
|
|
768
|
+
isInteractingWithWallet_fn = function(address) {
|
|
769
|
+
const selectedAddress = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getSelectedAddress, getSelectedAddress_fn).call(this);
|
|
770
|
+
return selectedAddress === address;
|
|
771
|
+
};
|
|
742
772
|
_requestApproval = new WeakSet();
|
|
743
773
|
requestApproval_fn = async function(suggestedAssetMeta) {
|
|
744
774
|
return this.messagingSystem.call(
|
|
@@ -761,6 +791,18 @@ requestApproval_fn = async function(suggestedAssetMeta) {
|
|
|
761
791
|
true
|
|
762
792
|
);
|
|
763
793
|
};
|
|
794
|
+
_getSelectedAccount = new WeakSet();
|
|
795
|
+
getSelectedAccount_fn = function() {
|
|
796
|
+
return this.messagingSystem.call("AccountsController:getSelectedAccount");
|
|
797
|
+
};
|
|
798
|
+
_getSelectedAddress = new WeakSet();
|
|
799
|
+
getSelectedAddress_fn = function() {
|
|
800
|
+
const account = this.messagingSystem.call(
|
|
801
|
+
"AccountsController:getAccount",
|
|
802
|
+
_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _selectedAccountId)
|
|
803
|
+
);
|
|
804
|
+
return account?.address || "";
|
|
805
|
+
};
|
|
764
806
|
var TokensController_default = TokensController;
|
|
765
807
|
|
|
766
808
|
|
|
@@ -768,4 +810,4 @@ var TokensController_default = TokensController;
|
|
|
768
810
|
|
|
769
811
|
|
|
770
812
|
exports.getDefaultTokensState = getDefaultTokensState; exports.TokensController = TokensController; exports.TokensController_default = TokensController_default;
|
|
771
|
-
//# sourceMappingURL=chunk-
|
|
813
|
+
//# sourceMappingURL=chunk-2NQRWANM.js.map
|