@metamask/assets-controllers 34.0.0 → 36.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.
Files changed (91) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/dist/AssetsContractController.js +6 -6
  3. package/dist/AssetsContractController.mjs +5 -5
  4. package/dist/NftController.js +3 -3
  5. package/dist/NftController.mjs +2 -2
  6. package/dist/NftDetectionController.js +5 -2
  7. package/dist/NftDetectionController.mjs +4 -1
  8. package/dist/Standards/ERC20Standard.js +3 -3
  9. package/dist/Standards/ERC20Standard.mjs +2 -2
  10. package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.js +3 -3
  11. package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.mjs +2 -2
  12. package/dist/Standards/NftStandards/ERC721/ERC721Standard.js +3 -3
  13. package/dist/Standards/NftStandards/ERC721/ERC721Standard.mjs +2 -2
  14. package/dist/TokenDetectionController.js +3 -3
  15. package/dist/TokenDetectionController.mjs +2 -2
  16. package/dist/TokenListController.js +4 -4
  17. package/dist/TokenListController.mjs +3 -3
  18. package/dist/TokenRatesController.js +3 -3
  19. package/dist/TokenRatesController.mjs +2 -2
  20. package/dist/TokensController.js +6 -6
  21. package/dist/TokensController.mjs +5 -5
  22. package/dist/assetsUtil.js +4 -2
  23. package/dist/assetsUtil.mjs +3 -1
  24. package/dist/{chunk-VELPHITE.mjs → chunk-24HGVPDI.mjs} +7 -1
  25. package/dist/chunk-24HGVPDI.mjs.map +1 -0
  26. package/dist/{chunk-GHKGU6GK.js → chunk-2J3CVSQ5.js} +5 -5
  27. package/dist/{chunk-56O7BVZV.mjs → chunk-2YFZGRUL.mjs} +2 -2
  28. package/dist/{chunk-7OZL6IDY.js → chunk-3QLHZOXA.js} +7 -7
  29. package/dist/{chunk-LBJTMJFA.js → chunk-4U2L56TY.js} +4 -4
  30. package/dist/{chunk-47CRHAUE.mjs → chunk-5IMEJ2FS.mjs} +2 -2
  31. package/dist/{chunk-TWR6P5WG.mjs → chunk-62HDABFM.mjs} +4 -4
  32. package/dist/chunk-62HDABFM.mjs.map +1 -0
  33. package/dist/{chunk-JEIAMJGS.mjs → chunk-7H2V5SW4.mjs} +2 -2
  34. package/dist/{chunk-UYH6NWKB.mjs → chunk-A7VI64MA.mjs} +2 -2
  35. package/dist/{chunk-JBF4XEGR.js → chunk-B46K3T54.js} +5 -5
  36. package/dist/{chunk-6PPM4ETZ.js → chunk-DOCJ35CC.js} +3 -3
  37. package/dist/{chunk-RPQ737HL.js → chunk-DSDI75PJ.js} +4 -4
  38. package/dist/{chunk-7JWDWDXT.js → chunk-HTIZ4JKG.js} +42 -8
  39. package/dist/chunk-HTIZ4JKG.js.map +1 -0
  40. package/dist/{chunk-XSNGD5US.js → chunk-IJS7EZU2.js} +7 -7
  41. package/dist/{chunk-XSNGD5US.js.map → chunk-IJS7EZU2.js.map} +1 -1
  42. package/dist/{chunk-GJCTAKK5.mjs → chunk-K6DUHENW.mjs} +2 -2
  43. package/dist/{chunk-W57QXOHJ.mjs → chunk-OCV7GPA2.mjs} +41 -7
  44. package/dist/chunk-OCV7GPA2.mjs.map +1 -0
  45. package/dist/{chunk-X4RMS365.js → chunk-OJLB6FID.js} +3 -3
  46. package/dist/{chunk-2TSAUGE7.mjs → chunk-PPJTMDXC.mjs} +2 -2
  47. package/dist/{chunk-NYVA7ZTQ.js → chunk-R4HATJKU.js} +8 -2
  48. package/dist/chunk-R4HATJKU.js.map +1 -0
  49. package/dist/{chunk-2IIQTSLV.mjs → chunk-RI6LDZPC.mjs} +67 -3
  50. package/dist/chunk-RI6LDZPC.mjs.map +1 -0
  51. package/dist/{chunk-4JLB5OIJ.mjs → chunk-RXBDSHHH.mjs} +5 -5
  52. package/dist/{chunk-2NQRWANM.js → chunk-TPUVGGNO.js} +11 -11
  53. package/dist/{chunk-354SINOH.js → chunk-Z6NCPTNT.js} +67 -3
  54. package/dist/chunk-Z6NCPTNT.js.map +1 -0
  55. package/dist/{chunk-Y45HQET7.mjs → chunk-ZWZZUFO5.mjs} +3 -3
  56. package/dist/index.js +13 -13
  57. package/dist/index.mjs +12 -12
  58. package/dist/token-service.js +3 -3
  59. package/dist/token-service.mjs +2 -2
  60. package/dist/tsconfig.build.tsbuildinfo +1 -1
  61. package/dist/types/AssetsContractController.d.ts.map +1 -1
  62. package/dist/types/NftController.d.ts +5 -3
  63. package/dist/types/NftController.d.ts.map +1 -1
  64. package/dist/types/NftDetectionController.d.ts +35 -1
  65. package/dist/types/NftDetectionController.d.ts.map +1 -1
  66. package/dist/types/assetsUtil.d.ts +7 -0
  67. package/dist/types/assetsUtil.d.ts.map +1 -1
  68. package/package.json +10 -10
  69. package/dist/chunk-2IIQTSLV.mjs.map +0 -1
  70. package/dist/chunk-354SINOH.js.map +0 -1
  71. package/dist/chunk-7JWDWDXT.js.map +0 -1
  72. package/dist/chunk-NYVA7ZTQ.js.map +0 -1
  73. package/dist/chunk-TWR6P5WG.mjs.map +0 -1
  74. package/dist/chunk-VELPHITE.mjs.map +0 -1
  75. package/dist/chunk-W57QXOHJ.mjs.map +0 -1
  76. /package/dist/{chunk-GHKGU6GK.js.map → chunk-2J3CVSQ5.js.map} +0 -0
  77. /package/dist/{chunk-56O7BVZV.mjs.map → chunk-2YFZGRUL.mjs.map} +0 -0
  78. /package/dist/{chunk-7OZL6IDY.js.map → chunk-3QLHZOXA.js.map} +0 -0
  79. /package/dist/{chunk-LBJTMJFA.js.map → chunk-4U2L56TY.js.map} +0 -0
  80. /package/dist/{chunk-47CRHAUE.mjs.map → chunk-5IMEJ2FS.mjs.map} +0 -0
  81. /package/dist/{chunk-JEIAMJGS.mjs.map → chunk-7H2V5SW4.mjs.map} +0 -0
  82. /package/dist/{chunk-UYH6NWKB.mjs.map → chunk-A7VI64MA.mjs.map} +0 -0
  83. /package/dist/{chunk-JBF4XEGR.js.map → chunk-B46K3T54.js.map} +0 -0
  84. /package/dist/{chunk-6PPM4ETZ.js.map → chunk-DOCJ35CC.js.map} +0 -0
  85. /package/dist/{chunk-RPQ737HL.js.map → chunk-DSDI75PJ.js.map} +0 -0
  86. /package/dist/{chunk-GJCTAKK5.mjs.map → chunk-K6DUHENW.mjs.map} +0 -0
  87. /package/dist/{chunk-X4RMS365.js.map → chunk-OJLB6FID.js.map} +0 -0
  88. /package/dist/{chunk-2TSAUGE7.mjs.map → chunk-PPJTMDXC.mjs.map} +0 -0
  89. /package/dist/{chunk-4JLB5OIJ.mjs.map → chunk-RXBDSHHH.mjs.map} +0 -0
  90. /package/dist/{chunk-2NQRWANM.js.map → chunk-TPUVGGNO.js.map} +0 -0
  91. /package/dist/{chunk-Y45HQET7.mjs.map → chunk-ZWZZUFO5.mjs.map} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ reduceInBatchesSerially
3
+ } from "./chunk-24HGVPDI.mjs";
1
4
  import {
2
5
  __privateAdd,
3
6
  __privateGet,
@@ -13,11 +16,16 @@ import {
13
16
  NFT_API_BASE_URL,
14
17
  NFT_API_VERSION,
15
18
  convertHexToDecimal,
16
- handleFetch
19
+ handleFetch,
20
+ fetchWithErrorHandling,
21
+ NFT_API_TIMEOUT
17
22
  } from "@metamask/controller-utils";
18
23
  import { createDeferredPromise } from "@metamask/utils";
19
24
  var controllerName = "NftDetectionController";
20
- var supportedNftDetectionNetworks = [ChainId.mainnet];
25
+ var supportedNftDetectionNetworks = [
26
+ ChainId.mainnet,
27
+ ChainId["linea-mainnet"]
28
+ ];
21
29
  var BlockaidResultType = /* @__PURE__ */ ((BlockaidResultType2) => {
22
30
  BlockaidResultType2["Benign"] = "Benign";
23
31
  BlockaidResultType2["Spam"] = "Spam";
@@ -25,6 +33,7 @@ var BlockaidResultType = /* @__PURE__ */ ((BlockaidResultType2) => {
25
33
  BlockaidResultType2["Malicious"] = "Malicious";
26
34
  return BlockaidResultType2;
27
35
  })(BlockaidResultType || {});
36
+ var MAX_GET_COLLECTION_BATCH_SIZE = 20;
28
37
  var _disabled, _addNft, _getNftState, _inProcessNftFetchingUpdates, _onPreferencesControllerStateChange, onPreferencesControllerStateChange_fn, _getOwnerNftApi, getOwnerNftApi_fn, _getOwnerNfts, getOwnerNfts_fn;
29
38
  var NftDetectionController = class extends BaseController {
30
39
  /**
@@ -134,6 +143,60 @@ var NftDetectionController = class extends BaseController {
134
143
  apiNfts = resultNftApi.tokens.filter(
135
144
  (elm) => elm.token.isSpam === false && (elm.blockaidResult?.result_type ? elm.blockaidResult?.result_type === "Benign" /* Benign */ : true)
136
145
  );
146
+ const collections = apiNfts.reduce((acc, currValue) => {
147
+ if (!acc.includes(currValue.token.contract) && currValue.token.contract === currValue?.token?.collection?.id) {
148
+ acc.push(currValue.token.contract);
149
+ }
150
+ return acc;
151
+ }, []);
152
+ if (collections.length !== 0) {
153
+ const collectionResponse = await reduceInBatchesSerially({
154
+ values: collections,
155
+ batchSize: MAX_GET_COLLECTION_BATCH_SIZE,
156
+ eachBatch: async (allResponses, batch) => {
157
+ const params = new URLSearchParams(
158
+ batch.map((s) => ["contract", s])
159
+ );
160
+ params.append("chainId", "1");
161
+ const collectionResponseForBatch = await fetchWithErrorHandling(
162
+ {
163
+ url: `${NFT_API_BASE_URL}/collections?${params.toString()}`,
164
+ options: {
165
+ headers: {
166
+ Version: NFT_API_VERSION
167
+ }
168
+ },
169
+ timeout: NFT_API_TIMEOUT
170
+ }
171
+ );
172
+ return {
173
+ ...allResponses,
174
+ ...collectionResponseForBatch
175
+ };
176
+ },
177
+ initialResult: {}
178
+ });
179
+ if (collectionResponse.collections?.length) {
180
+ apiNfts.forEach((singleNFT) => {
181
+ const found = collectionResponse.collections.find(
182
+ (elm) => elm.id?.toLowerCase() === singleNFT.token.contract.toLowerCase()
183
+ );
184
+ if (found) {
185
+ singleNFT.token = {
186
+ ...singleNFT.token,
187
+ collection: {
188
+ ...singleNFT.token.collection ?? {},
189
+ creator: found?.creator,
190
+ openseaVerificationStatus: found?.openseaVerificationStatus,
191
+ contractDeployedAt: found.contractDeployedAt,
192
+ ownerCount: found.ownerCount,
193
+ topBid: found.topBid
194
+ }
195
+ };
196
+ }
197
+ });
198
+ }
199
+ }
137
200
  const addNftPromises = apiNfts.map(async (nft) => {
138
201
  const {
139
202
  tokenId,
@@ -230,7 +293,8 @@ var NftDetectionController_default = NftDetectionController;
230
293
 
231
294
  export {
232
295
  BlockaidResultType,
296
+ MAX_GET_COLLECTION_BATCH_SIZE,
233
297
  NftDetectionController,
234
298
  NftDetectionController_default
235
299
  };
236
- //# sourceMappingURL=chunk-2IIQTSLV.mjs.map
300
+ //# sourceMappingURL=chunk-RI6LDZPC.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 fetchWithErrorHandling,\n NFT_API_TIMEOUT,\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 { reduceInBatchesSerially } from './assetsUtil';\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[] = [\n ChainId.mainnet,\n ChainId['linea-mainnet'],\n];\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 GetCollectionsResponse = {\n collections: CollectionResponse[];\n};\n\nexport type CollectionResponse = {\n id?: string;\n openseaVerificationStatus?: string;\n contractDeployedAt?: string;\n creator?: string;\n ownerCount?: string;\n topBid?: TopBid & {\n sourceDomain?: string;\n };\n};\n\nexport type FloorAskCollection = {\n id?: string;\n price?: Price;\n maker?: string;\n kind?: string;\n validFrom?: number;\n validUntil?: number;\n source?: SourceCollection;\n rawData?: Metadata;\n isNativeOffChainCancellable?: boolean;\n};\n\nexport type SourceCollection = {\n id: string;\n domain: string;\n name: string;\n icon: string;\n url: string;\n};\n\nexport type TokenCollection = {\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 floorAsk?: FloorAskCollection;\n};\n\nexport type Collection = TokenCollection & CollectionResponse;\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\nexport const MAX_GET_COLLECTION_BATCH_SIZE = 20;\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 // Retrieve collections from apiNfts\n // contract and collection.id are equal for simple contract addresses; this is to exclude cases for shared contracts\n const collections = apiNfts.reduce<string[]>((acc, currValue) => {\n if (\n !acc.includes(currValue.token.contract) &&\n currValue.token.contract === currValue?.token?.collection?.id\n ) {\n acc.push(currValue.token.contract);\n }\n return acc;\n }, []);\n\n if (collections.length !== 0) {\n // Call API to retrive collections infos\n // The api accept a max of 20 contracts\n const collectionResponse: GetCollectionsResponse =\n await reduceInBatchesSerially({\n values: collections,\n batchSize: MAX_GET_COLLECTION_BATCH_SIZE,\n eachBatch: async (allResponses, batch) => {\n const params = new URLSearchParams(\n batch.map((s) => ['contract', s]),\n );\n params.append('chainId', '1'); // Adding chainId 1 because we are only detecting for mainnet\n const collectionResponseForBatch = await fetchWithErrorHandling(\n {\n url: `${\n NFT_API_BASE_URL as string\n }/collections?${params.toString()}`,\n options: {\n headers: {\n Version: NFT_API_VERSION,\n },\n },\n timeout: NFT_API_TIMEOUT,\n },\n );\n\n return {\n ...allResponses,\n ...collectionResponseForBatch,\n };\n },\n initialResult: {},\n });\n\n // Add collections response fields to newnfts\n if (collectionResponse.collections?.length) {\n apiNfts.forEach((singleNFT) => {\n const found = collectionResponse.collections.find(\n (elm) =>\n elm.id?.toLowerCase() ===\n singleNFT.token.contract.toLowerCase(),\n );\n if (found) {\n singleNFT.token = {\n ...singleNFT.token,\n collection: {\n ...(singleNFT.token.collection ?? {}),\n creator: found?.creator,\n openseaVerificationStatus: found?.openseaVerificationStatus,\n contractDeployedAt: found.contractDeployedAt,\n ownerCount: found.ownerCount,\n topBid: found.topBid,\n },\n };\n }\n });\n }\n }\n\n // Proceed to add NFTs\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 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
  import {
2
2
  ERC20Standard
3
- } from "./chunk-56O7BVZV.mjs";
3
+ } from "./chunk-2YFZGRUL.mjs";
4
4
  import {
5
5
  ERC1155Standard
6
- } from "./chunk-UYH6NWKB.mjs";
6
+ } from "./chunk-A7VI64MA.mjs";
7
7
  import {
8
8
  TOKEN_METADATA_NO_SUPPORT_ERROR,
9
9
  fetchTokenMetadata
10
- } from "./chunk-47CRHAUE.mjs";
10
+ } from "./chunk-5IMEJ2FS.mjs";
11
11
  import {
12
12
  formatAggregatorNames,
13
13
  formatIconUrlWithProxy
14
- } from "./chunk-VELPHITE.mjs";
14
+ } from "./chunk-24HGVPDI.mjs";
15
15
  import {
16
16
  __privateAdd,
17
17
  __privateGet,
@@ -810,4 +810,4 @@ export {
810
810
  TokensController,
811
811
  TokensController_default
812
812
  };
813
- //# sourceMappingURL=chunk-4JLB5OIJ.mjs.map
813
+ //# sourceMappingURL=chunk-RXBDSHHH.mjs.map
@@ -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 _chunk6PPM4ETZjs = require('./chunk-6PPM4ETZ.js');
3
+ var _chunkDOCJ35CCjs = require('./chunk-DOCJ35CC.js');
4
4
 
5
5
 
6
- var _chunkJBF4XEGRjs = require('./chunk-JBF4XEGR.js');
6
+ var _chunkB46K3T54js = require('./chunk-B46K3T54.js');
7
7
 
8
8
 
9
9
 
10
- var _chunkX4RMS365js = require('./chunk-X4RMS365.js');
10
+ var _chunkOJLB6FIDjs = require('./chunk-OJLB6FID.js');
11
11
 
12
12
 
13
13
 
14
- var _chunkNYVA7ZTQjs = require('./chunk-NYVA7ZTQ.js');
14
+ var _chunkR4HATJKUjs = require('./chunk-R4HATJKU.js');
15
15
 
16
16
 
17
17
 
@@ -243,12 +243,12 @@ var TokensController = class extends _basecontroller.BaseController {
243
243
  address,
244
244
  symbol,
245
245
  decimals,
246
- image: image || _chunkNYVA7ZTQjs.formatIconUrlWithProxy.call(void 0, {
246
+ image: image || _chunkR4HATJKUjs.formatIconUrlWithProxy.call(void 0, {
247
247
  chainId: currentChainId,
248
248
  tokenAddress: address
249
249
  }),
250
250
  isERC721,
251
- aggregators: _chunkNYVA7ZTQjs.formatAggregatorNames.call(void 0, tokenMetadata?.aggregators || []),
251
+ aggregators: _chunkR4HATJKUjs.formatAggregatorNames.call(void 0, tokenMetadata?.aggregators || []),
252
252
  name
253
253
  };
254
254
  const previousIndex = newTokens.findIndex(
@@ -522,7 +522,7 @@ var TokensController = class extends _basecontroller.BaseController {
522
522
  }
523
523
  const provider = _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getProvider, getProvider_fn).call(this, networkClientId);
524
524
  const isErc1155 = await _controllerutils.safelyExecute.call(void 0,
525
- () => new (0, _chunkJBF4XEGRjs.ERC1155Standard)(provider).contractSupportsBase1155Interface(
525
+ () => new (0, _chunkB46K3T54js.ERC1155Standard)(provider).contractSupportsBase1155Interface(
526
526
  asset.address
527
527
  )
528
528
  );
@@ -533,7 +533,7 @@ var TokensController = class extends _basecontroller.BaseController {
533
533
  `Contract ${asset.address} must match type ${type}, but was detected as ${_controllerutils.ERC1155}`
534
534
  );
535
535
  }
536
- const erc20 = new (0, _chunk6PPM4ETZjs.ERC20Standard)(provider);
536
+ const erc20 = new (0, _chunkDOCJ35CCjs.ERC20Standard)(provider);
537
537
  const [contractName, contractSymbol, contractDecimals] = await Promise.all([
538
538
  _controllerutils.safelyExecute.call(void 0, () => erc20.getTokenName(asset.address)),
539
539
  _controllerutils.safelyExecute.call(void 0, () => erc20.getTokenSymbol(asset.address)),
@@ -648,14 +648,14 @@ onSelectedAccountChange_fn = function(selectedAccount) {
648
648
  _fetchTokenMetadata = new WeakSet();
649
649
  fetchTokenMetadata_fn = async function(tokenAddress) {
650
650
  try {
651
- const token = await _chunkX4RMS365js.fetchTokenMetadata.call(void 0,
651
+ const token = await _chunkOJLB6FIDjs.fetchTokenMetadata.call(void 0,
652
652
  _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId),
653
653
  tokenAddress,
654
654
  _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _abortController).signal
655
655
  );
656
656
  return token;
657
657
  } catch (error) {
658
- if (error instanceof Error && error.message.includes(_chunkX4RMS365js.TOKEN_METADATA_NO_SUPPORT_ERROR)) {
658
+ if (error instanceof Error && error.message.includes(_chunkOJLB6FIDjs.TOKEN_METADATA_NO_SUPPORT_ERROR)) {
659
659
  return void 0;
660
660
  }
661
661
  throw error;
@@ -810,4 +810,4 @@ var TokensController_default = TokensController;
810
810
 
811
811
 
812
812
  exports.getDefaultTokensState = getDefaultTokensState; exports.TokensController = TokensController; exports.TokensController_default = TokensController_default;
813
- //# sourceMappingURL=chunk-2NQRWANM.js.map
813
+ //# sourceMappingURL=chunk-TPUVGGNO.js.map
@@ -1,5 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
+ var _chunkR4HATJKUjs = require('./chunk-R4HATJKU.js');
4
+
5
+
3
6
 
4
7
 
5
8
 
@@ -14,10 +17,15 @@ var _basecontroller = require('@metamask/base-controller');
14
17
 
15
18
 
16
19
 
20
+
21
+
17
22
  var _controllerutils = require('@metamask/controller-utils');
18
23
  var _utils = require('@metamask/utils');
19
24
  var controllerName = "NftDetectionController";
20
- var supportedNftDetectionNetworks = [_controllerutils.ChainId.mainnet];
25
+ var supportedNftDetectionNetworks = [
26
+ _controllerutils.ChainId.mainnet,
27
+ _controllerutils.ChainId["linea-mainnet"]
28
+ ];
21
29
  var BlockaidResultType = /* @__PURE__ */ ((BlockaidResultType2) => {
22
30
  BlockaidResultType2["Benign"] = "Benign";
23
31
  BlockaidResultType2["Spam"] = "Spam";
@@ -25,6 +33,7 @@ var BlockaidResultType = /* @__PURE__ */ ((BlockaidResultType2) => {
25
33
  BlockaidResultType2["Malicious"] = "Malicious";
26
34
  return BlockaidResultType2;
27
35
  })(BlockaidResultType || {});
36
+ var MAX_GET_COLLECTION_BATCH_SIZE = 20;
28
37
  var _disabled, _addNft, _getNftState, _inProcessNftFetchingUpdates, _onPreferencesControllerStateChange, onPreferencesControllerStateChange_fn, _getOwnerNftApi, getOwnerNftApi_fn, _getOwnerNfts, getOwnerNfts_fn;
29
38
  var NftDetectionController = class extends _basecontroller.BaseController {
30
39
  /**
@@ -134,6 +143,60 @@ var NftDetectionController = class extends _basecontroller.BaseController {
134
143
  apiNfts = resultNftApi.tokens.filter(
135
144
  (elm) => elm.token.isSpam === false && (elm.blockaidResult?.result_type ? elm.blockaidResult?.result_type === "Benign" /* Benign */ : true)
136
145
  );
146
+ const collections = apiNfts.reduce((acc, currValue) => {
147
+ if (!acc.includes(currValue.token.contract) && currValue.token.contract === currValue?.token?.collection?.id) {
148
+ acc.push(currValue.token.contract);
149
+ }
150
+ return acc;
151
+ }, []);
152
+ if (collections.length !== 0) {
153
+ const collectionResponse = await _chunkR4HATJKUjs.reduceInBatchesSerially.call(void 0, {
154
+ values: collections,
155
+ batchSize: MAX_GET_COLLECTION_BATCH_SIZE,
156
+ eachBatch: async (allResponses, batch) => {
157
+ const params = new URLSearchParams(
158
+ batch.map((s) => ["contract", s])
159
+ );
160
+ params.append("chainId", "1");
161
+ const collectionResponseForBatch = await _controllerutils.fetchWithErrorHandling.call(void 0,
162
+ {
163
+ url: `${_controllerutils.NFT_API_BASE_URL}/collections?${params.toString()}`,
164
+ options: {
165
+ headers: {
166
+ Version: _controllerutils.NFT_API_VERSION
167
+ }
168
+ },
169
+ timeout: _controllerutils.NFT_API_TIMEOUT
170
+ }
171
+ );
172
+ return {
173
+ ...allResponses,
174
+ ...collectionResponseForBatch
175
+ };
176
+ },
177
+ initialResult: {}
178
+ });
179
+ if (collectionResponse.collections?.length) {
180
+ apiNfts.forEach((singleNFT) => {
181
+ const found = collectionResponse.collections.find(
182
+ (elm) => elm.id?.toLowerCase() === singleNFT.token.contract.toLowerCase()
183
+ );
184
+ if (found) {
185
+ singleNFT.token = {
186
+ ...singleNFT.token,
187
+ collection: {
188
+ ...singleNFT.token.collection ?? {},
189
+ creator: found?.creator,
190
+ openseaVerificationStatus: found?.openseaVerificationStatus,
191
+ contractDeployedAt: found.contractDeployedAt,
192
+ ownerCount: found.ownerCount,
193
+ topBid: found.topBid
194
+ }
195
+ };
196
+ }
197
+ });
198
+ }
199
+ }
137
200
  const addNftPromises = apiNfts.map(async (nft) => {
138
201
  const {
139
202
  tokenId,
@@ -232,5 +295,6 @@ var NftDetectionController_default = NftDetectionController;
232
295
 
233
296
 
234
297
 
235
- exports.BlockaidResultType = BlockaidResultType; exports.NftDetectionController = NftDetectionController; exports.NftDetectionController_default = NftDetectionController_default;
236
- //# sourceMappingURL=chunk-354SINOH.js.map
298
+
299
+ exports.BlockaidResultType = BlockaidResultType; exports.MAX_GET_COLLECTION_BATCH_SIZE = MAX_GET_COLLECTION_BATCH_SIZE; exports.NftDetectionController = NftDetectionController; exports.NftDetectionController_default = NftDetectionController_default;
300
+ //# sourceMappingURL=chunk-Z6NCPTNT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/NftDetectionController.ts"],"names":["BlockaidResultType"],"mappings":"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","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 fetchWithErrorHandling,\n NFT_API_TIMEOUT,\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 { reduceInBatchesSerially } from './assetsUtil';\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[] = [\n ChainId.mainnet,\n ChainId['linea-mainnet'],\n];\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 GetCollectionsResponse = {\n collections: CollectionResponse[];\n};\n\nexport type CollectionResponse = {\n id?: string;\n openseaVerificationStatus?: string;\n contractDeployedAt?: string;\n creator?: string;\n ownerCount?: string;\n topBid?: TopBid & {\n sourceDomain?: string;\n };\n};\n\nexport type FloorAskCollection = {\n id?: string;\n price?: Price;\n maker?: string;\n kind?: string;\n validFrom?: number;\n validUntil?: number;\n source?: SourceCollection;\n rawData?: Metadata;\n isNativeOffChainCancellable?: boolean;\n};\n\nexport type SourceCollection = {\n id: string;\n domain: string;\n name: string;\n icon: string;\n url: string;\n};\n\nexport type TokenCollection = {\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 floorAsk?: FloorAskCollection;\n};\n\nexport type Collection = TokenCollection & CollectionResponse;\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\nexport const MAX_GET_COLLECTION_BATCH_SIZE = 20;\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 // Retrieve collections from apiNfts\n // contract and collection.id are equal for simple contract addresses; this is to exclude cases for shared contracts\n const collections = apiNfts.reduce<string[]>((acc, currValue) => {\n if (\n !acc.includes(currValue.token.contract) &&\n currValue.token.contract === currValue?.token?.collection?.id\n ) {\n acc.push(currValue.token.contract);\n }\n return acc;\n }, []);\n\n if (collections.length !== 0) {\n // Call API to retrive collections infos\n // The api accept a max of 20 contracts\n const collectionResponse: GetCollectionsResponse =\n await reduceInBatchesSerially({\n values: collections,\n batchSize: MAX_GET_COLLECTION_BATCH_SIZE,\n eachBatch: async (allResponses, batch) => {\n const params = new URLSearchParams(\n batch.map((s) => ['contract', s]),\n );\n params.append('chainId', '1'); // Adding chainId 1 because we are only detecting for mainnet\n const collectionResponseForBatch = await fetchWithErrorHandling(\n {\n url: `${\n NFT_API_BASE_URL as string\n }/collections?${params.toString()}`,\n options: {\n headers: {\n Version: NFT_API_VERSION,\n },\n },\n timeout: NFT_API_TIMEOUT,\n },\n );\n\n return {\n ...allResponses,\n ...collectionResponseForBatch,\n };\n },\n initialResult: {},\n });\n\n // Add collections response fields to newnfts\n if (collectionResponse.collections?.length) {\n apiNfts.forEach((singleNFT) => {\n const found = collectionResponse.collections.find(\n (elm) =>\n elm.id?.toLowerCase() ===\n singleNFT.token.contract.toLowerCase(),\n );\n if (found) {\n singleNFT.token = {\n ...singleNFT.token,\n collection: {\n ...(singleNFT.token.collection ?? {}),\n creator: found?.creator,\n openseaVerificationStatus: found?.openseaVerificationStatus,\n contractDeployedAt: found.contractDeployedAt,\n ownerCount: found.ownerCount,\n topBid: found.topBid,\n },\n };\n }\n });\n }\n }\n\n // Proceed to add NFTs\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 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"]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  fetchTokenListByChainId
3
- } from "./chunk-47CRHAUE.mjs";
3
+ } from "./chunk-5IMEJ2FS.mjs";
4
4
  import {
5
5
  formatAggregatorNames,
6
6
  formatIconUrlWithProxy,
7
7
  isTokenListSupportedForNetwork
8
- } from "./chunk-VELPHITE.mjs";
8
+ } from "./chunk-24HGVPDI.mjs";
9
9
  import {
10
10
  __privateAdd,
11
11
  __privateMethod
@@ -288,4 +288,4 @@ export {
288
288
  TokenListController,
289
289
  TokenListController_default
290
290
  };
291
- //# sourceMappingURL=chunk-Y45HQET7.mjs.map
291
+ //# sourceMappingURL=chunk-ZWZZUFO5.mjs.map
package/dist/index.js CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkRPQ737HLjs = require('./chunk-RPQ737HL.js');
5
+ var _chunkDSDI75PJjs = require('./chunk-DSDI75PJ.js');
6
6
 
7
7
 
8
8
 
9
9
  var _chunkV6DNVRODjs = require('./chunk-V6DNVROD.js');
10
10
 
11
11
 
12
- var _chunk2NQRWANMjs = require('./chunk-2NQRWANM.js');
12
+ var _chunkTPUVGGNOjs = require('./chunk-TPUVGGNO.js');
13
13
  require('./chunk-XC3SOOGC.js');
14
14
 
15
15
 
@@ -22,10 +22,10 @@ var _chunkHVOIBGYNjs = require('./chunk-HVOIBGYN.js');
22
22
 
23
23
 
24
24
 
25
- var _chunkXSNGD5USjs = require('./chunk-XSNGD5US.js');
26
- require('./chunk-LBJTMJFA.js');
27
- require('./chunk-6PPM4ETZ.js');
28
- require('./chunk-JBF4XEGR.js');
25
+ var _chunkIJS7EZU2js = require('./chunk-IJS7EZU2.js');
26
+ require('./chunk-4U2L56TY.js');
27
+ require('./chunk-DOCJ35CC.js');
28
+ require('./chunk-B46K3T54.js');
29
29
 
30
30
 
31
31
  var _chunkT5ZX5BV7js = require('./chunk-T5ZX5BV7.js');
@@ -34,27 +34,27 @@ require('./chunk-ZG5MS2TO.js');
34
34
 
35
35
 
36
36
 
37
- var _chunk7JWDWDXTjs = require('./chunk-7JWDWDXT.js');
37
+ var _chunkHTIZ4JKGjs = require('./chunk-HTIZ4JKG.js');
38
38
 
39
39
 
40
- var _chunk354SINOHjs = require('./chunk-354SINOH.js');
40
+ var _chunkZ6NCPTNTjs = require('./chunk-Z6NCPTNT.js');
41
41
  require('./chunk-RGHTNZQ6.js');
42
42
 
43
43
 
44
44
  var _chunkNHFZIY2Kjs = require('./chunk-NHFZIY2K.js');
45
45
 
46
46
 
47
- var _chunkGHKGU6GKjs = require('./chunk-GHKGU6GK.js');
47
+ var _chunk2J3CVSQ5js = require('./chunk-2J3CVSQ5.js');
48
48
 
49
49
 
50
- var _chunk7OZL6IDYjs = require('./chunk-7OZL6IDY.js');
51
- require('./chunk-X4RMS365.js');
50
+ var _chunk3QLHZOXAjs = require('./chunk-3QLHZOXA.js');
51
+ require('./chunk-OJLB6FID.js');
52
52
 
53
53
 
54
54
 
55
55
 
56
56
 
57
- var _chunkNYVA7ZTQjs = require('./chunk-NYVA7ZTQ.js');
57
+ var _chunkR4HATJKUjs = require('./chunk-R4HATJKU.js');
58
58
  require('./chunk-Z4BLTVTB.js');
59
59
 
60
60
 
@@ -79,5 +79,5 @@ require('./chunk-Z4BLTVTB.js');
79
79
 
80
80
 
81
81
 
82
- exports.AccountTrackerController = _chunkHVOIBGYNjs.AccountTrackerController; exports.AssetsContractController = _chunkXSNGD5USjs.AssetsContractController; exports.CodefiTokenPricesServiceV2 = _chunkV6DNVRODjs.CodefiTokenPricesServiceV2; exports.Cryptocurrency = _chunkF6L3DFOZjs.Cryptocurrency; exports.CurrencyRateController = _chunkT5ZX5BV7js.CurrencyRateController; exports.MISSING_PROVIDER_ERROR = _chunkXSNGD5USjs.MISSING_PROVIDER_ERROR; exports.NftController = _chunk7JWDWDXTjs.NftController; exports.NftDetectionController = _chunk354SINOHjs.NftDetectionController; exports.RatesController = _chunkF6L3DFOZjs.RatesController; exports.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID = _chunkXSNGD5USjs.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID; exports.SUPPORTED_CHAIN_IDS = _chunkV6DNVRODjs.SUPPORTED_CHAIN_IDS; exports.TokenBalancesController = _chunkNHFZIY2Kjs.TokenBalancesController; exports.TokenDetectionController = _chunkGHKGU6GKjs.TokenDetectionController; exports.TokenListController = _chunk7OZL6IDYjs.TokenListController; exports.TokenRatesController = _chunkRPQ737HLjs.TokenRatesController; exports.TokensController = _chunk2NQRWANMjs.TokensController; exports.fetchTokenContractExchangeRates = _chunkNYVA7ZTQjs.fetchTokenContractExchangeRates; exports.formatIconUrlWithProxy = _chunkNYVA7ZTQjs.formatIconUrlWithProxy; exports.getDefaultNftControllerState = _chunk7JWDWDXTjs.getDefaultNftControllerState; exports.getDefaultTokenRatesControllerState = _chunkRPQ737HLjs.getDefaultTokenRatesControllerState; exports.getFormattedIpfsUrl = _chunkNYVA7ZTQjs.getFormattedIpfsUrl; exports.isTokenDetectionSupportedForNetwork = _chunkNYVA7ZTQjs.isTokenDetectionSupportedForNetwork;
82
+ exports.AccountTrackerController = _chunkHVOIBGYNjs.AccountTrackerController; exports.AssetsContractController = _chunkIJS7EZU2js.AssetsContractController; exports.CodefiTokenPricesServiceV2 = _chunkV6DNVRODjs.CodefiTokenPricesServiceV2; exports.Cryptocurrency = _chunkF6L3DFOZjs.Cryptocurrency; exports.CurrencyRateController = _chunkT5ZX5BV7js.CurrencyRateController; exports.MISSING_PROVIDER_ERROR = _chunkIJS7EZU2js.MISSING_PROVIDER_ERROR; exports.NftController = _chunkHTIZ4JKGjs.NftController; exports.NftDetectionController = _chunkZ6NCPTNTjs.NftDetectionController; exports.RatesController = _chunkF6L3DFOZjs.RatesController; exports.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID = _chunkIJS7EZU2js.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID; exports.SUPPORTED_CHAIN_IDS = _chunkV6DNVRODjs.SUPPORTED_CHAIN_IDS; exports.TokenBalancesController = _chunkNHFZIY2Kjs.TokenBalancesController; exports.TokenDetectionController = _chunk2J3CVSQ5js.TokenDetectionController; exports.TokenListController = _chunk3QLHZOXAjs.TokenListController; exports.TokenRatesController = _chunkDSDI75PJjs.TokenRatesController; exports.TokensController = _chunkTPUVGGNOjs.TokensController; exports.fetchTokenContractExchangeRates = _chunkR4HATJKUjs.fetchTokenContractExchangeRates; exports.formatIconUrlWithProxy = _chunkR4HATJKUjs.formatIconUrlWithProxy; exports.getDefaultNftControllerState = _chunkHTIZ4JKGjs.getDefaultNftControllerState; exports.getDefaultTokenRatesControllerState = _chunkDSDI75PJjs.getDefaultTokenRatesControllerState; exports.getFormattedIpfsUrl = _chunkR4HATJKUjs.getFormattedIpfsUrl; exports.isTokenDetectionSupportedForNetwork = _chunkR4HATJKUjs.isTokenDetectionSupportedForNetwork;
83
83
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -2,14 +2,14 @@ import "./chunk-27KOXCQK.mjs";
2
2
  import {
3
3
  TokenRatesController,
4
4
  getDefaultTokenRatesControllerState
5
- } from "./chunk-GJCTAKK5.mjs";
5
+ } from "./chunk-K6DUHENW.mjs";
6
6
  import {
7
7
  CodefiTokenPricesServiceV2,
8
8
  SUPPORTED_CHAIN_IDS
9
9
  } from "./chunk-XQO3EG4J.mjs";
10
10
  import {
11
11
  TokensController
12
- } from "./chunk-4JLB5OIJ.mjs";
12
+ } from "./chunk-RXBDSHHH.mjs";
13
13
  import "./chunk-JYHAAA6W.mjs";
14
14
  import {
15
15
  Cryptocurrency,
@@ -22,10 +22,10 @@ import {
22
22
  AssetsContractController,
23
23
  MISSING_PROVIDER_ERROR,
24
24
  SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID
25
- } from "./chunk-TWR6P5WG.mjs";
26
- import "./chunk-JEIAMJGS.mjs";
27
- import "./chunk-56O7BVZV.mjs";
28
- import "./chunk-UYH6NWKB.mjs";
25
+ } from "./chunk-62HDABFM.mjs";
26
+ import "./chunk-7H2V5SW4.mjs";
27
+ import "./chunk-2YFZGRUL.mjs";
28
+ import "./chunk-A7VI64MA.mjs";
29
29
  import {
30
30
  CurrencyRateController
31
31
  } from "./chunk-HJ5GXVDT.mjs";
@@ -34,27 +34,27 @@ import "./chunk-JTXPJ6TK.mjs";
34
34
  import {
35
35
  NftController,
36
36
  getDefaultNftControllerState
37
- } from "./chunk-W57QXOHJ.mjs";
37
+ } from "./chunk-OCV7GPA2.mjs";
38
38
  import {
39
39
  NftDetectionController
40
- } from "./chunk-2IIQTSLV.mjs";
40
+ } from "./chunk-RI6LDZPC.mjs";
41
41
  import "./chunk-CP3HC7AQ.mjs";
42
42
  import {
43
43
  TokenBalancesController
44
44
  } from "./chunk-6VQJFTNC.mjs";
45
45
  import {
46
46
  TokenDetectionController
47
- } from "./chunk-2TSAUGE7.mjs";
47
+ } from "./chunk-PPJTMDXC.mjs";
48
48
  import {
49
49
  TokenListController
50
- } from "./chunk-Y45HQET7.mjs";
51
- import "./chunk-47CRHAUE.mjs";
50
+ } from "./chunk-ZWZZUFO5.mjs";
51
+ import "./chunk-5IMEJ2FS.mjs";
52
52
  import {
53
53
  fetchTokenContractExchangeRates,
54
54
  formatIconUrlWithProxy,
55
55
  getFormattedIpfsUrl,
56
56
  isTokenDetectionSupportedForNetwork
57
- } from "./chunk-VELPHITE.mjs";
57
+ } from "./chunk-24HGVPDI.mjs";
58
58
  import "./chunk-XUI43LEZ.mjs";
59
59
  export {
60
60
  AccountTrackerController,
@@ -3,13 +3,13 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkX4RMS365js = require('./chunk-X4RMS365.js');
7
- require('./chunk-NYVA7ZTQ.js');
6
+ var _chunkOJLB6FIDjs = require('./chunk-OJLB6FID.js');
7
+ require('./chunk-R4HATJKU.js');
8
8
  require('./chunk-Z4BLTVTB.js');
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
- exports.TOKEN_END_POINT_API = _chunkX4RMS365js.TOKEN_END_POINT_API; exports.TOKEN_METADATA_NO_SUPPORT_ERROR = _chunkX4RMS365js.TOKEN_METADATA_NO_SUPPORT_ERROR; exports.fetchTokenListByChainId = _chunkX4RMS365js.fetchTokenListByChainId; exports.fetchTokenMetadata = _chunkX4RMS365js.fetchTokenMetadata;
14
+ exports.TOKEN_END_POINT_API = _chunkOJLB6FIDjs.TOKEN_END_POINT_API; exports.TOKEN_METADATA_NO_SUPPORT_ERROR = _chunkOJLB6FIDjs.TOKEN_METADATA_NO_SUPPORT_ERROR; exports.fetchTokenListByChainId = _chunkOJLB6FIDjs.fetchTokenListByChainId; exports.fetchTokenMetadata = _chunkOJLB6FIDjs.fetchTokenMetadata;
15
15
  //# sourceMappingURL=token-service.js.map