@metamask-previews/assets-controllers 30.0.0-preview-4a95e5f → 32.0.0-preview-c439acc5

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 (72) hide show
  1. package/CHANGELOG.md +96 -1
  2. package/dist/AccountTrackerController.js +2 -2
  3. package/dist/AccountTrackerController.mjs +1 -1
  4. package/dist/NftController.js +2 -2
  5. package/dist/NftController.mjs +3 -3
  6. package/dist/NftDetectionController.js +2 -2
  7. package/dist/NftDetectionController.mjs +1 -1
  8. package/dist/TokenListController.js +3 -3
  9. package/dist/TokenListController.mjs +2 -2
  10. package/dist/TokenRatesController.js +3 -3
  11. package/dist/TokenRatesController.mjs +2 -2
  12. package/dist/TokensController.js +3 -3
  13. package/dist/TokensController.mjs +2 -2
  14. package/dist/{chunk-KCFBEGDV.js → chunk-4AC3X2U5.js} +4 -4
  15. package/dist/{chunk-WQ7TBYYE.mjs → chunk-543CC74T.mjs} +1 -1
  16. package/dist/chunk-543CC74T.mjs.map +1 -0
  17. package/dist/{chunk-Z3OQU4XW.mjs → chunk-5W5OO2Q5.mjs} +2 -2
  18. package/dist/chunk-5W5OO2Q5.mjs.map +1 -0
  19. package/dist/chunk-62T7RKU3.mjs +1265 -0
  20. package/dist/chunk-62T7RKU3.mjs.map +1 -0
  21. package/dist/{chunk-76IWVCR7.mjs → chunk-73F3SN5O.mjs} +2 -2
  22. package/dist/{chunk-65PB33TE.mjs → chunk-7J63MEC3.mjs} +2 -3
  23. package/dist/{chunk-65PB33TE.mjs.map → chunk-7J63MEC3.mjs.map} +1 -1
  24. package/dist/{chunk-XHMM35YT.mjs → chunk-A2DDWXMS.mjs} +2 -2
  25. package/dist/{chunk-GU53EI7A.js → chunk-A7SULHJK.js} +2 -3
  26. package/dist/chunk-A7SULHJK.js.map +1 -0
  27. package/dist/chunk-CGLUTXI7.js +1265 -0
  28. package/dist/chunk-CGLUTXI7.js.map +1 -0
  29. package/dist/{chunk-Y35SM7TO.mjs → chunk-G2ZRGQPQ.mjs} +2 -2
  30. package/dist/{chunk-Y35SM7TO.mjs.map → chunk-G2ZRGQPQ.mjs.map} +1 -1
  31. package/dist/{chunk-5F5EQAX5.js → chunk-JUI3XNEF.js} +3 -3
  32. package/dist/{chunk-UEDNQBJN.js → chunk-M4ZW6TYC.js} +4 -4
  33. package/dist/{chunk-3R43XIIX.js → chunk-PYMUBJQX.js} +2 -2
  34. package/dist/chunk-PYMUBJQX.js.map +1 -0
  35. package/dist/{chunk-5OC3ZKSE.js → chunk-QFDTOEYR.js} +1 -1
  36. package/dist/chunk-QFDTOEYR.js.map +1 -0
  37. package/dist/{chunk-E4ECCGJV.mjs → chunk-XSXRLN3P.mjs} +2 -2
  38. package/dist/{chunk-Z6TBQQE5.js → chunk-Y7G5RKIF.js} +2 -2
  39. package/dist/chunk-Y7G5RKIF.js.map +1 -0
  40. package/dist/index.js +9 -11
  41. package/dist/index.mjs +10 -12
  42. package/dist/token-prices-service/codefi-v2.js +2 -2
  43. package/dist/token-prices-service/codefi-v2.mjs +1 -1
  44. package/dist/token-prices-service/index.js +2 -2
  45. package/dist/token-prices-service/index.mjs +1 -1
  46. package/dist/token-service.js +2 -2
  47. package/dist/token-service.mjs +1 -1
  48. package/dist/tsconfig.build.tsbuildinfo +1 -1
  49. package/dist/types/AccountTrackerController.d.ts.map +1 -1
  50. package/dist/types/NftController.d.ts +65 -184
  51. package/dist/types/NftController.d.ts.map +1 -1
  52. package/dist/types/NftDetectionController.d.ts +2 -2
  53. package/dist/types/NftDetectionController.d.ts.map +1 -1
  54. package/dist/types/index.d.ts +4 -2
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/package.json +17 -17
  57. package/dist/chunk-3R43XIIX.js.map +0 -1
  58. package/dist/chunk-5OC3ZKSE.js.map +0 -1
  59. package/dist/chunk-E4SQFGKO.js +0 -1205
  60. package/dist/chunk-E4SQFGKO.js.map +0 -1
  61. package/dist/chunk-GU53EI7A.js.map +0 -1
  62. package/dist/chunk-WQ7TBYYE.mjs.map +0 -1
  63. package/dist/chunk-YAVESKOE.mjs +0 -1205
  64. package/dist/chunk-YAVESKOE.mjs.map +0 -1
  65. package/dist/chunk-Z3OQU4XW.mjs.map +0 -1
  66. package/dist/chunk-Z6TBQQE5.js.map +0 -1
  67. /package/dist/{chunk-KCFBEGDV.js.map → chunk-4AC3X2U5.js.map} +0 -0
  68. /package/dist/{chunk-76IWVCR7.mjs.map → chunk-73F3SN5O.mjs.map} +0 -0
  69. /package/dist/{chunk-XHMM35YT.mjs.map → chunk-A2DDWXMS.mjs.map} +0 -0
  70. /package/dist/{chunk-5F5EQAX5.js.map → chunk-JUI3XNEF.js.map} +0 -0
  71. /package/dist/{chunk-UEDNQBJN.js.map → chunk-M4ZW6TYC.js.map} +0 -0
  72. /package/dist/{chunk-E4ECCGJV.mjs.map → chunk-XSXRLN3P.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,99 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [32.0.0]
11
+
12
+ ### Changed
13
+
14
+ - **BREAKING:** Bump minimum Node version to 18.18 ([#3611](https://github.com/MetaMask/core/pull/3611))
15
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/accounts-controller` to `^16.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
16
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/approval-controller` to `^7.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
17
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/keyring-controller` to `^17.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
18
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/network-controller` to `^19.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
19
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/preferences-controller` to `^13.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
20
+ - Bump `@metamask/base-controller` to `^6.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
21
+ - Bump `@metamask/controller-utils` to `^11.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
22
+ - Bump `@metamask/polling-controller` to `^8.0.0` ([#4352](https://github.com/MetaMask/core/pull/4352))
23
+
24
+ ## [31.0.0]
25
+
26
+ ### Added
27
+
28
+ - **BREAKING:** The `NftDetectionController` now takes a `messenger`, which can be used for communication ([#4312](https://github.com/MetaMask/core/pull/4312))
29
+ - This messenger must allow the following actions `ApprovalController:addRequest`, `NetworkController:getState`, `NetworkController:getNetworkClientById`, and `PreferencesController:getState`, and must allow the events `PreferencesController:stateChange` and `NetworkController:stateChange`
30
+ - Add `NftDetectionControllerMessenger` type ([#4312](https://github.com/MetaMask/core/pull/4312))
31
+ - Add `NftControllerGetStateAction`, `NftControllerActions`, `NftControllerStateChangeEvent`, and `NftControllerEvents` types ([#4310](https://github.com/MetaMask/core/pull/4310))
32
+ - Add `NftController:getState` and `NftController:stateChange` as an available action and event to the `NftController` messenger ([#4310](https://github.com/MetaMask/core/pull/4310))
33
+
34
+ ### Changed
35
+
36
+ - **BREAKING:** Change `TokensController` to inherit from `BaseController` rather than `BaseControllerV1` ([#4304](https://github.com/MetaMask/core/pull/4304))
37
+ - The constructor now takes a single options object rather than three arguments, and all properties in `config` are now part of options.
38
+ - **BREAKING:** Rename `TokensState` type to `TokensControllerState` ([#4304](https://github.com/MetaMask/core/pull/4304))
39
+ - **BREAKING:** Make all `TokensController` methods and properties starting with `_` private ([#4304](https://github.com/MetaMask/core/pull/4304))
40
+ - **BREAKING:** Convert `Token` from `interface` to `type` ([#4304](https://github.com/MetaMask/core/pull/4304))
41
+ - **BREAKING:** Replace `balanceError` property in `Token` with `hasBalanceError`; update `TokenBalancesController` so that it no longer captures the error resulting from getting the balance of an ERC-20 token ([#4304](https://github.com/MetaMask/core/pull/4304))
42
+ - **BREAKING:** Change `NftDetectionController` to inherit from `StaticIntervalPollingController` rather than `StaticIntervalPollingControllerV1` ([#4312](https://github.com/MetaMask/core/pull/4312))
43
+ - The constructor now takes a single options object rather than three arguments, and all properties in `config` are now part of options.
44
+ - **BREAKING:** Convert `ApiNft`, `ApiNftContract`, `ApiNftLastSale`, and `ApiNftCreator` from `interface` to `type` ([#4312](https://github.com/MetaMask/core/pull/4312))
45
+ - **BREAKING:** Change `NftController` to inherit from `BaseController` rather than `BaseControllerV1` ([#4310](https://github.com/MetaMask/core/pull/4310))
46
+ - The constructor now takes a single options object rather than three arguments, and all properties in `config` are now part of options.
47
+ - **BREAKING:** Convert `Nft`, `NftContract`, and `NftMetadata` from `interface` to `type` ([#4310](https://github.com/MetaMask/core/pull/4310))
48
+ - **BREAKING:** Rename `NftState` to `NftControllerState`, and convert to `type` ([#4310](https://github.com/MetaMask/core/pull/4310))
49
+ - **BREAKING:** Rename `getDefaultNftState` to `getDefaultNftControllerState` ([#4310](https://github.com/MetaMask/core/pull/4310))
50
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/accounts-controller` to `^15.0.0` ([#4342](https://github.com/MetaMask/core/pull/4342))
51
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/approval-controller` to `^6.0.2` ([#4342](https://github.com/MetaMask/core/pull/4342))
52
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/keyring-controller` to `^16.1.0` ([#4342](https://github.com/MetaMask/core/pull/4342))
53
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/network-controller` to `^18.1.3` ([#4342](https://github.com/MetaMask/core/pull/4342))
54
+ - **BREAKING:** Bump dependency and peer dependency `@metamask/preferences-controller` to `^12.0.0` ([#4342](https://github.com/MetaMask/core/pull/4342))
55
+ - Change `NftDetectionController` method `detectNfts` so that `userAddress` option is optional ([#4312](https://github.com/MetaMask/core/pull/4312))
56
+ - This will default to the currently selected address as kept by PreferencesController.
57
+ - Bump `async-mutex` to `^0.5.0` ([#4335](https://github.com/MetaMask/core/pull/4335))
58
+ - Bump `@metamask/polling-controller` to `^7.0.0` ([#4342](https://github.com/MetaMask/core/pull/4342))
59
+
60
+ ### Removed
61
+
62
+ - **BREAKING:** Remove `config` property and `configure` method from `TokensController` ([#4304](https://github.com/MetaMask/core/pull/4304))
63
+ - The `TokensController` now takes a single options object which can be used for configuration, and configuration is now kept internally.
64
+ - **BREAKING:** Remove `notify`, `subscribe`, and `unsubscribe` methods from `TokensController` ([#4304](https://github.com/MetaMask/core/pull/4304))
65
+ - Use the controller messenger for subscribing to and publishing events instead.
66
+ - **BREAKING:** Remove `TokensConfig` type ([#4304](https://github.com/MetaMask/core/pull/4304))
67
+ - These properties have been merged into the options that `TokensController` takes.
68
+ - **BREAKING:** Remove `config` property and `configure` method from `TokensController` ([#4312](https://github.com/MetaMask/core/pull/4312))
69
+ - `TokensController` now takes a single options object which can be used for configuration, and configuration is now kept internally.
70
+ - **BREAKING:** Remove `notify`, `subscribe`, and `unsubscribe` methods from `NftDetectionController` ([#4312](https://github.com/MetaMask/core/pull/4312))
71
+ - Use the controller messenger for subscribing to and publishing events instead.
72
+ - **BREAKING:** Remove `chainId` as a `NftDetectionController` constructor argument ([#4312](https://github.com/MetaMask/core/pull/4312))
73
+ - The controller will now read the `networkClientId` from the NetworkController state through the messenger when needed.
74
+ - **BREAKING:** Remove `getNetworkClientById` as a `NftDetectionController` constructor argument ([#4312](https://github.com/MetaMask/core/pull/4312))
75
+ - The controller will now call `NetworkController:getNetworkClientId` through the messenger object.
76
+ - **BREAKING:** Remove `onPreferencesStateChange` as a `NftDetectionController` constructor argument ([#4312](https://github.com/MetaMask/core/pull/4312))
77
+ - The controller will now call `PreferencesController:stateChange` through the messenger object.
78
+ - **BREAKING:** Remove `onNetworkStateChange` as a `NftDetectionController` constructor argument ([#4312](https://github.com/MetaMask/core/pull/4312))
79
+ - The controller will now read the `networkClientId` from the NetworkController state through the messenger when needed.
80
+ - **BREAKING:** Remove `getOpenSeaApiKey` as a `NftDetectionController` constructor argument ([#4312](https://github.com/MetaMask/core/pull/4312))
81
+ - This was never used.
82
+ - **BREAKING:** Remove `getNftApi` as a `NftDetectionController` constructor argument ([#4312](https://github.com/MetaMask/core/pull/4312))
83
+ - This was never used.
84
+ - **BREAKING:** Remove `NftDetectionConfig` type ([#4312](https://github.com/MetaMask/core/pull/4312))
85
+ - These properties have been merged into the options that `NftDetectionController` takes.
86
+ - **BREAKING:** Remove `config` property and `configure` method from `NftController` ([#4310](https://github.com/MetaMask/core/pull/4310))
87
+ - `NftController` now takes a single options object which can be used for configuration, and configuration is now kept internally.
88
+ - **BREAKING:** Remove `notify`, `subscribe`, and `unsubscribe` methods from `NftController` ([#4310](https://github.com/MetaMask/core/pull/4310))
89
+ - Use the controller messenger for subscribing to and publishing events instead.
90
+ - **BREAKING:** Remove `onPreferencesStateChange` as a `NftController` constructor argument ([#4310](https://github.com/MetaMask/core/pull/4310))
91
+ - The controller will now call `PreferencesController:stateChange` through the messenger object.
92
+ - **BREAKING:** Remove `onNetworkStateChange` as a `NftController` constructor argument ([#4310](https://github.com/MetaMask/core/pull/4310))
93
+ - The controller will now call `NetworkController:stateChange` through the messenger object.
94
+ - **BREAKING:** Remove `NftConfig` type ([#4310](https://github.com/MetaMask/core/pull/4310))
95
+ - These properties have been merged into the options that `NftController` takes.
96
+ - **BREAKING:** Remove `config` property and `configure` method from `NftController` ([#4310](https://github.com/MetaMask/core/pull/4310))
97
+ - `NftController` now takes a single options object which can be used for configuration, and configuration is now kept internally.
98
+ - **BREAKING:** Remove `hub` property from `NftController` ([#4310](https://github.com/MetaMask/core/pull/4310))
99
+ - Use the controller messenger for subscribing to and publishing events instead.
100
+ - **BREAKING:** Modify `TokenListController` so that tokens fetched from the API and stored in state will no longer have `storage` and `erc20` properties ([#4235](https://github.com/MetaMask/core/pull/4235))
101
+ - These properties were never officially supported, but they were present in state anyway.
102
+
10
103
  ## [30.0.0]
11
104
 
12
105
  ### Added
@@ -796,7 +889,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
796
889
 
797
890
  - Use Ethers for AssetsContractController ([#845](https://github.com/MetaMask/core/pull/845))
798
891
 
799
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@30.0.0...HEAD
892
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@32.0.0...HEAD
893
+ [32.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@31.0.0...@metamask/assets-controllers@32.0.0
894
+ [31.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@30.0.0...@metamask/assets-controllers@31.0.0
800
895
  [30.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@29.0.0...@metamask/assets-controllers@30.0.0
801
896
  [29.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@28.0.0...@metamask/assets-controllers@29.0.0
802
897
  [28.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@27.2.0...@metamask/assets-controllers@28.0.0
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkGU53EI7Ajs = require('./chunk-GU53EI7A.js');
4
+ var _chunkA7SULHJKjs = require('./chunk-A7SULHJK.js');
5
5
  require('./chunk-Z4BLTVTB.js');
6
6
 
7
7
 
8
8
 
9
- exports.AccountTrackerController = _chunkGU53EI7Ajs.AccountTrackerController; exports.default = _chunkGU53EI7Ajs.AccountTrackerController_default;
9
+ exports.AccountTrackerController = _chunkA7SULHJKjs.AccountTrackerController; exports.default = _chunkA7SULHJKjs.AccountTrackerController_default;
10
10
  //# sourceMappingURL=AccountTrackerController.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  AccountTrackerController,
3
3
  AccountTrackerController_default
4
- } from "./chunk-65PB33TE.mjs";
4
+ } from "./chunk-7J63MEC3.mjs";
5
5
  import "./chunk-XUI43LEZ.mjs";
6
6
  export {
7
7
  AccountTrackerController,
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkE4SQFGKOjs = require('./chunk-E4SQFGKO.js');
5
+ var _chunkCGLUTXI7js = require('./chunk-CGLUTXI7.js');
6
6
  require('./chunk-RGHTNZQ6.js');
7
7
  require('./chunk-NEXY7SE2.js');
8
8
  require('./chunk-Z4BLTVTB.js');
@@ -10,5 +10,5 @@ require('./chunk-Z4BLTVTB.js');
10
10
 
11
11
 
12
12
 
13
- exports.NftController = _chunkE4SQFGKOjs.NftController; exports.default = _chunkE4SQFGKOjs.NftController_default; exports.getDefaultNftState = _chunkE4SQFGKOjs.getDefaultNftState;
13
+ exports.NftController = _chunkCGLUTXI7js.NftController; exports.default = _chunkCGLUTXI7js.NftController_default; exports.getDefaultNftControllerState = _chunkCGLUTXI7js.getDefaultNftControllerState;
14
14
  //# sourceMappingURL=NftController.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  NftController,
3
3
  NftController_default,
4
- getDefaultNftState
5
- } from "./chunk-YAVESKOE.mjs";
4
+ getDefaultNftControllerState
5
+ } from "./chunk-62T7RKU3.mjs";
6
6
  import "./chunk-CP3HC7AQ.mjs";
7
7
  import "./chunk-Q5JRBGWO.mjs";
8
8
  import "./chunk-XUI43LEZ.mjs";
9
9
  export {
10
10
  NftController,
11
11
  NftController_default as default,
12
- getDefaultNftState
12
+ getDefaultNftControllerState
13
13
  };
14
14
  //# sourceMappingURL=NftController.mjs.map
@@ -2,12 +2,12 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk5OC3ZKSEjs = require('./chunk-5OC3ZKSE.js');
5
+ var _chunkQFDTOEYRjs = require('./chunk-QFDTOEYR.js');
6
6
  require('./chunk-RGHTNZQ6.js');
7
7
  require('./chunk-Z4BLTVTB.js');
8
8
 
9
9
 
10
10
 
11
11
 
12
- exports.BlockaidResultType = _chunk5OC3ZKSEjs.BlockaidResultType; exports.NftDetectionController = _chunk5OC3ZKSEjs.NftDetectionController; exports.default = _chunk5OC3ZKSEjs.NftDetectionController_default;
12
+ exports.BlockaidResultType = _chunkQFDTOEYRjs.BlockaidResultType; exports.NftDetectionController = _chunkQFDTOEYRjs.NftDetectionController; exports.default = _chunkQFDTOEYRjs.NftDetectionController_default;
13
13
  //# sourceMappingURL=NftDetectionController.js.map
@@ -2,7 +2,7 @@ import {
2
2
  BlockaidResultType,
3
3
  NftDetectionController,
4
4
  NftDetectionController_default
5
- } from "./chunk-WQ7TBYYE.mjs";
5
+ } from "./chunk-543CC74T.mjs";
6
6
  import "./chunk-CP3HC7AQ.mjs";
7
7
  import "./chunk-XUI43LEZ.mjs";
8
8
  export {
@@ -2,13 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk5F5EQAX5js = require('./chunk-5F5EQAX5.js');
6
- require('./chunk-3R43XIIX.js');
5
+ var _chunkJUI3XNEFjs = require('./chunk-JUI3XNEF.js');
6
+ require('./chunk-PYMUBJQX.js');
7
7
  require('./chunk-NEXY7SE2.js');
8
8
  require('./chunk-Z4BLTVTB.js');
9
9
 
10
10
 
11
11
 
12
12
 
13
- exports.TokenListController = _chunk5F5EQAX5js.TokenListController; exports.default = _chunk5F5EQAX5js.TokenListController_default; exports.getDefaultTokenListState = _chunk5F5EQAX5js.getDefaultTokenListState;
13
+ exports.TokenListController = _chunkJUI3XNEFjs.TokenListController; exports.default = _chunkJUI3XNEFjs.TokenListController_default; exports.getDefaultTokenListState = _chunkJUI3XNEFjs.getDefaultTokenListState;
14
14
  //# sourceMappingURL=TokenListController.js.map
@@ -2,8 +2,8 @@ import {
2
2
  TokenListController,
3
3
  TokenListController_default,
4
4
  getDefaultTokenListState
5
- } from "./chunk-XHMM35YT.mjs";
6
- import "./chunk-Z3OQU4XW.mjs";
5
+ } from "./chunk-A2DDWXMS.mjs";
6
+ import "./chunk-5W5OO2Q5.mjs";
7
7
  import "./chunk-Q5JRBGWO.mjs";
8
8
  import "./chunk-XUI43LEZ.mjs";
9
9
  export {
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkUEDNQBJNjs = require('./chunk-UEDNQBJN.js');
5
- require('./chunk-Z6TBQQE5.js');
4
+ var _chunkM4ZW6TYCjs = require('./chunk-M4ZW6TYC.js');
5
+ require('./chunk-Y7G5RKIF.js');
6
6
  require('./chunk-7K6PSEAA.js');
7
7
  require('./chunk-WB6KJX4N.js');
8
8
  require('./chunk-NEXY7SE2.js');
@@ -10,5 +10,5 @@ require('./chunk-Z4BLTVTB.js');
10
10
 
11
11
 
12
12
 
13
- exports.TokenRatesController = _chunkUEDNQBJNjs.TokenRatesController; exports.default = _chunkUEDNQBJNjs.TokenRatesController_default;
13
+ exports.TokenRatesController = _chunkM4ZW6TYCjs.TokenRatesController; exports.default = _chunkM4ZW6TYCjs.TokenRatesController_default;
14
14
  //# sourceMappingURL=TokenRatesController.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  TokenRatesController,
3
3
  TokenRatesController_default
4
- } from "./chunk-E4ECCGJV.mjs";
5
- import "./chunk-Y35SM7TO.mjs";
4
+ } from "./chunk-XSXRLN3P.mjs";
5
+ import "./chunk-G2ZRGQPQ.mjs";
6
6
  import "./chunk-TTH3ES66.mjs";
7
7
  import "./chunk-CNKVITJO.mjs";
8
8
  import "./chunk-Q5JRBGWO.mjs";
@@ -2,15 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkKCFBEGDVjs = require('./chunk-KCFBEGDV.js');
5
+ var _chunk4AC3X2U5js = require('./chunk-4AC3X2U5.js');
6
6
  require('./chunk-B5YY22QQ.js');
7
7
  require('./chunk-BOTVAG4A.js');
8
- require('./chunk-3R43XIIX.js');
8
+ require('./chunk-PYMUBJQX.js');
9
9
  require('./chunk-NEXY7SE2.js');
10
10
  require('./chunk-Z4BLTVTB.js');
11
11
 
12
12
 
13
13
 
14
14
 
15
- exports.TokensController = _chunkKCFBEGDVjs.TokensController; exports.default = _chunkKCFBEGDVjs.TokensController_default; exports.getDefaultTokensState = _chunkKCFBEGDVjs.getDefaultTokensState;
15
+ exports.TokensController = _chunk4AC3X2U5js.TokensController; exports.default = _chunk4AC3X2U5js.TokensController_default; exports.getDefaultTokensState = _chunk4AC3X2U5js.getDefaultTokensState;
16
16
  //# sourceMappingURL=TokensController.js.map
@@ -2,10 +2,10 @@ import {
2
2
  TokensController,
3
3
  TokensController_default,
4
4
  getDefaultTokensState
5
- } from "./chunk-76IWVCR7.mjs";
5
+ } from "./chunk-73F3SN5O.mjs";
6
6
  import "./chunk-D3K5MPMW.mjs";
7
7
  import "./chunk-LZ5ZGQEX.mjs";
8
- import "./chunk-Z3OQU4XW.mjs";
8
+ import "./chunk-5W5OO2Q5.mjs";
9
9
  import "./chunk-Q5JRBGWO.mjs";
10
10
  import "./chunk-XUI43LEZ.mjs";
11
11
  export {
@@ -7,7 +7,7 @@ var _chunkBOTVAG4Ajs = require('./chunk-BOTVAG4A.js');
7
7
 
8
8
 
9
9
 
10
- var _chunk3R43XIIXjs = require('./chunk-3R43XIIX.js');
10
+ var _chunkPYMUBJQXjs = require('./chunk-PYMUBJQX.js');
11
11
 
12
12
 
13
13
 
@@ -630,14 +630,14 @@ onPreferenceControllerStateChange_fn = function({ selectedAddress }) {
630
630
  _fetchTokenMetadata = new WeakSet();
631
631
  fetchTokenMetadata_fn = async function(tokenAddress) {
632
632
  try {
633
- const token = await _chunk3R43XIIXjs.fetchTokenMetadata.call(void 0,
633
+ const token = await _chunkPYMUBJQXjs.fetchTokenMetadata.call(void 0,
634
634
  _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _chainId),
635
635
  tokenAddress,
636
636
  _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _abortController).signal
637
637
  );
638
638
  return token;
639
639
  } catch (error) {
640
- if (error instanceof Error && error.message.includes(_chunk3R43XIIXjs.TOKEN_METADATA_NO_SUPPORT_ERROR)) {
640
+ if (error instanceof Error && error.message.includes(_chunkPYMUBJQXjs.TOKEN_METADATA_NO_SUPPORT_ERROR)) {
641
641
  return void 0;
642
642
  }
643
643
  throw error;
@@ -768,4 +768,4 @@ var TokensController_default = TokensController;
768
768
 
769
769
 
770
770
  exports.getDefaultTokensState = getDefaultTokensState; exports.TokensController = TokensController; exports.TokensController_default = TokensController_default;
771
- //# sourceMappingURL=chunk-KCFBEGDV.js.map
771
+ //# sourceMappingURL=chunk-4AC3X2U5.js.map
@@ -250,4 +250,4 @@ export {
250
250
  NftDetectionController,
251
251
  NftDetectionController_default
252
252
  };
253
- //# sourceMappingURL=chunk-WQ7TBYYE.mjs.map
253
+ //# sourceMappingURL=chunk-543CC74T.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/NftDetectionController.ts"],"sourcesContent":["import type { AddApprovalRequest } from '@metamask/approval-controller';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport {\n fetchWithErrorHandling,\n toChecksumHexAddress,\n ChainId,\n NFT_API_BASE_URL,\n NFT_API_VERSION,\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 { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n PreferencesControllerGetStateAction,\n PreferencesControllerStateChangeEvent,\n PreferencesState,\n} from '@metamask/preferences-controller';\n\nimport { Source } from './constants';\nimport {\n type NftController,\n type NftControllerState,\n type NftMetadata,\n} from './NftController';\n\nconst DEFAULT_INTERVAL = 180000;\n\nconst controllerName = 'NftDetectionController';\n\nexport type AllowedActions =\n | AddApprovalRequest\n | NetworkControllerGetStateAction\n | NetworkControllerGetNetworkClientByIdAction\n | PreferencesControllerGetStateAction;\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>;\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 token_id: string;\n num_sales: number | null;\n background_color: string | null;\n image_url: string | null;\n image_preview_url: string | null;\n image_thumbnail_url: string | null;\n image_original_url: string | null;\n animation_url: string | null;\n animation_original_url: string | null;\n name: string | null;\n description: string | null;\n external_link: string | null;\n asset_contract: ApiNftContract;\n creator: ApiNftCreator;\n last_sale: ApiNftLastSale | null;\n};\n\n/**\n * @type ApiNftContract\n *\n * NFT contract object coming from OpenSea api\n * @property address - Address of the NFT contract\n * @property asset_contract_type - The NFT type, it could be `semi-fungible` or `non-fungible`\n * @property created_date - Creation date\n * @property collection - Object containing the contract name and URI of an image associated\n * @property schema_name - The schema followed by the contract, it could be `ERC721` or `ERC1155`\n * @property symbol - The NFT contract symbol\n * @property total_supply - Total supply of NFTs\n * @property description - The NFT contract description\n * @property external_link - External link containing additional information\n */\nexport type ApiNftContract = {\n address: string;\n asset_contract_type: string | null;\n created_date: string | null;\n schema_name: string | null;\n symbol: string | null;\n total_supply: string | null;\n description: string | null;\n external_link: string | null;\n collection: {\n name: string | null;\n image_url?: string | null;\n tokenCount?: string | null;\n };\n};\n\n/**\n * @type ApiNftLastSale\n *\n * NFT sale object coming from OpenSea api\n * @property event_timestamp - Object containing a `username`\n * @property total_price - URI of NFT image associated with this owner\n * @property transaction - Object containing transaction_hash and block_hash\n */\nexport type ApiNftLastSale = {\n event_timestamp: string;\n total_price: string;\n transaction: { transaction_hash: string; block_hash: string };\n};\n\n/**\n * @type ApiNftCreator\n *\n * NFT creator object coming from OpenSea api\n * @property user - Object containing a `username`\n * @property profile_img_url - URI of NFT image associated with this owner\n * @property address - The owner address\n */\nexport type ApiNftCreator = {\n user: { username: string };\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 result_type: BlockaidResultType;\n malicious_score: string;\n attack_types: object;\n};\n\nexport type Market = {\n floorAsk?: FloorAsk;\n topBid?: TopBid;\n};\n\nexport type TokenResponse = {\n chainId: number;\n contract: string;\n tokenId: string;\n kind?: string;\n name?: string;\n image?: string;\n imageSmall?: string;\n imageLarge?: string;\n metadata?: Metadata;\n description?: string;\n supply?: number;\n remainingSupply?: number;\n rarityScore?: number;\n rarity?: number;\n rarityRank?: number;\n media?: string;\n isFlagged?: boolean;\n isSpam?: boolean;\n isNsfw?: boolean;\n metadataDisabled?: boolean;\n lastFlagUpdate?: string;\n lastFlagChange?: string;\n collection?: Collection;\n lastSale?: LastSale;\n topBid?: TopBid;\n lastAppraisalValue?: number;\n attributes?: Attributes[];\n};\n\nexport type TopBid = {\n id?: string;\n price?: Price;\n source?: {\n id?: string;\n domain?: string;\n name?: string;\n icon?: string;\n url?: string;\n };\n};\n\nexport type LastSale = {\n saleId?: string;\n token?: {\n contract?: string;\n tokenId?: string;\n name?: string;\n image?: string;\n collection?: {\n id?: string;\n name?: string;\n };\n };\n orderSource?: string;\n orderSide?: 'ask' | 'bid';\n orderKind?: string;\n orderId?: string;\n from?: string;\n to?: string;\n amount?: string;\n fillSource?: string;\n block?: number;\n txHash?: string;\n logIndex?: number;\n batchIndex?: number;\n timestamp?: number;\n price?: Price;\n washTradingScore?: number;\n royaltyFeeBps?: number;\n marketplaceFeeBps?: number;\n paidFullRoyalty?: boolean;\n feeBreakdown?: FeeBreakdown[];\n isDeleted?: boolean;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type FeeBreakdown = {\n kind?: string;\n bps?: number;\n recipient?: string;\n source?: string;\n rawAmount?: string;\n};\n\nexport type Attributes = {\n key?: string;\n kind?: string;\n value: string;\n tokenCount?: number;\n onSaleCount?: number;\n floorAskPrice?: Price | null;\n topBidValue?: number | null;\n createdAt?: string;\n};\n\nexport type Collection = {\n id?: string;\n name?: string;\n slug?: string;\n symbol?: string;\n imageUrl?: string;\n image?: string;\n isSpam?: boolean;\n isNsfw?: boolean;\n creator?: string;\n tokenCount?: string;\n metadataDisabled?: boolean;\n openseaVerificationStatus?: string;\n floorAskPrice?: Price;\n royaltiesBps?: number;\n royalties?: Royalties[];\n};\n\nexport type Royalties = {\n bps?: number;\n recipient?: string;\n};\n\nexport type Ownership = {\n tokenCount?: string;\n onSaleCount?: string;\n floorAsk?: FloorAsk;\n acquiredAt?: string;\n};\n\nexport type FloorAsk = {\n id?: string;\n price?: Price;\n maker?: string;\n kind?: string;\n validFrom?: number;\n validUntil?: number;\n source?: Source;\n rawData?: Metadata;\n isNativeOffChainCancellable?: boolean;\n};\n\nexport type Price = {\n currency?: {\n contract?: string;\n name?: string;\n symbol?: string;\n decimals?: number;\n chainId?: number;\n };\n amount?: {\n raw?: string;\n decimal?: number;\n usd?: number;\n native?: number;\n };\n netAmount?: {\n raw?: string;\n decimal?: number;\n usd?: number;\n native?: number;\n };\n};\n\nexport type Metadata = {\n imageOriginal?: string;\n tokenURI?: string;\n};\n\n/**\n * Controller that passively polls on a set interval for NFT auto detection\n */\nexport class NftDetectionController extends StaticIntervalPollingController<\n typeof controllerName,\n Record<never, never>,\n NftDetectionControllerMessenger\n> {\n #intervalId?: ReturnType<typeof setTimeout>;\n\n #interval: number;\n\n #disabled: boolean;\n\n readonly #addNft: NftController['addNft'];\n\n readonly #getNftState: () => NftControllerState;\n\n /**\n * The controller options\n *\n * @param options - The controller options.\n * @param options.interval - The pooling interval.\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 interval = DEFAULT_INTERVAL,\n messenger,\n disabled = false,\n addNft,\n getNftState,\n }: {\n interval?: number;\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.#interval = interval;\n this.#disabled = disabled;\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 this.setIntervalLength(this.#interval);\n }\n\n async _executePoll(\n networkClientId: string,\n options: { address: string },\n ): Promise<void> {\n await this.detectNfts({ networkClientId, userAddress: options.address });\n }\n\n /**\n * Start polling for the currency rate.\n */\n async start() {\n if (!this.isMainnet() || this.#disabled) {\n return;\n }\n\n await this.#startPolling();\n }\n\n /**\n * Stop polling for the currency rate.\n */\n stop() {\n this.#stopPolling();\n }\n\n #stopPolling() {\n if (this.#intervalId) {\n clearInterval(this.#intervalId);\n }\n }\n\n /**\n * Starts a new polling interval.\n *\n */\n async #startPolling(): Promise<void> {\n this.#stopPolling();\n await this.detectNfts();\n this.#intervalId = setInterval(async () => {\n await this.detectNfts();\n }, this.#interval);\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 if (useNftDetection) {\n this.start();\n } else {\n this.stop();\n }\n }\n }\n\n #getOwnerNftApi({ address, next }: { address: string; next?: string }) {\n return `${NFT_API_BASE_URL}/users/${address}/tokens?chainIds=1&limit=50&includeTopBid=true&continuation=${\n next ?? ''\n }`;\n }\n\n async #getOwnerNfts(address: string) {\n let nftApiResponse: ReservoirResponse;\n let nfts: TokensResponse[] = [];\n let next;\n\n do {\n nftApiResponse = await fetchWithErrorHandling({\n url: this.#getOwnerNftApi({ address, next }),\n options: {\n headers: {\n Version: NFT_API_VERSION,\n },\n },\n timeout: NFT_API_TIMEOUT,\n });\n\n if (!nftApiResponse) {\n return nfts;\n }\n\n const newNfts =\n nftApiResponse.tokens?.filter(\n (elm) =>\n elm.token.isSpam === false &&\n (elm.blockaidResult?.result_type\n ? elm.blockaidResult?.result_type === BlockaidResultType.Benign\n : true),\n ) ?? [];\n\n nfts = [...nfts, ...newNfts];\n } while ((next = nftApiResponse.continuation));\n\n return nfts;\n }\n\n /**\n * 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('PreferencesController:getState')\n .selectedAddress;\n /* istanbul ignore if */\n if (!this.isMainnet() || this.#disabled) {\n return;\n }\n /* istanbul ignore else */\n if (!userAddress) {\n return;\n }\n\n const apiNfts = await this.#getOwnerNfts(userAddress);\n const addNftPromises = apiNfts.map(async (nft) => {\n const {\n tokenId: token_id,\n contract,\n kind,\n image: image_url,\n imageSmall: image_thumbnail_url,\n metadata: { imageOriginal: image_original_url } = {},\n name,\n description,\n attributes,\n topBid,\n lastSale,\n rarityRank,\n rarityScore,\n collection,\n } = nft.token;\n\n let ignored;\n /* istanbul ignore else */\n const { ignoredNfts } = this.#getNftState();\n if (ignoredNfts.length > 0) {\n ignored = ignoredNfts.find((c) => {\n /* istanbul ignore next */\n return (\n c.address === toChecksumHexAddress(contract) &&\n c.tokenId === token_id\n );\n });\n }\n\n /* istanbul ignore else */\n if (!ignored) {\n /* istanbul ignore next */\n const nftMetadata: NftMetadata = Object.assign(\n {},\n { name },\n description && { description },\n image_url && { image: image_url },\n image_thumbnail_url && { imageThumbnail: image_thumbnail_url },\n image_original_url && { imageOriginal: image_original_url },\n kind && { standard: kind.toUpperCase() },\n lastSale && { lastSale },\n attributes && { attributes },\n topBid && { topBid },\n rarityRank && { rarityRank },\n rarityScore && { rarityScore },\n collection && { collection },\n );\n\n await this.#addNft(contract, token_id, {\n nftMetadata,\n userAddress,\n source: Source.Detected,\n networkClientId: options?.networkClientId,\n });\n }\n });\n await Promise.all(addNftPromises);\n }\n}\n\nexport default NftDetectionController;\n"],"mappings":"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","names":["BlockaidResultType"]}
@@ -14,7 +14,7 @@ function getTokensURL(chainId) {
14
14
  const occurrenceFloor = chainId === ChainId["linea-mainnet"] ? 1 : 3;
15
15
  return `${TOKEN_END_POINT_API}/tokens/${convertHexToDecimal(
16
16
  chainId
17
- )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeDuplicateSymbolAssets=false&includeTokenFees=false&includeAssetType=false`;
17
+ )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeDuplicateSymbolAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`;
18
18
  }
19
19
  function getTokenMetadataURL(chainId, tokenAddress) {
20
20
  return `${TOKEN_END_POINT_API}/token/${convertHexToDecimal(
@@ -82,4 +82,4 @@ export {
82
82
  fetchTokenListByChainId,
83
83
  fetchTokenMetadata
84
84
  };
85
- //# sourceMappingURL=chunk-Z3OQU4XW.mjs.map
85
+ //# sourceMappingURL=chunk-5W5OO2Q5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/token-service.ts"],"sourcesContent":["import {\n ChainId,\n convertHexToDecimal,\n timeoutFetch,\n} from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { isTokenListSupportedForNetwork } from './assetsUtil';\n\nexport const TOKEN_END_POINT_API = 'https://token.api.cx.metamask.io';\nexport const TOKEN_METADATA_NO_SUPPORT_ERROR =\n 'TokenService Error: Network does not support fetchTokenMetadata';\n\n/**\n * Get the tokens URL for a specific network.\n *\n * @param chainId - The chain ID of the network the tokens requested are on.\n * @returns The tokens URL.\n */\nfunction getTokensURL(chainId: Hex) {\n const occurrenceFloor = chainId === ChainId['linea-mainnet'] ? 1 : 3;\n return `${TOKEN_END_POINT_API}/tokens/${convertHexToDecimal(\n chainId,\n )}?occurrenceFloor=${occurrenceFloor}&includeNativeAssets=false&includeDuplicateSymbolAssets=false&includeTokenFees=false&includeAssetType=false&includeERC20Permit=false&includeStorage=false`;\n}\n\n/**\n * Get the token metadata URL for the given network and token.\n *\n * @param chainId - The chain ID of the network the token is on.\n * @param tokenAddress - The token address.\n * @returns The token metadata URL.\n */\nfunction getTokenMetadataURL(chainId: Hex, tokenAddress: string) {\n return `${TOKEN_END_POINT_API}/token/${convertHexToDecimal(\n chainId,\n )}?address=${tokenAddress}`;\n}\n\nconst tenSecondsInMilliseconds = 10_000;\n\n// Token list averages 1.6 MB in size\n// timeoutFetch by default has a 500ms timeout, which will almost always timeout given the response size.\nconst defaultTimeout = tenSecondsInMilliseconds;\n\n/**\n * Fetch the list of token metadata for a given network. This request is cancellable using the\n * abort signal passed in.\n *\n * @param chainId - The chain ID of the network the requested tokens are on.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param options - Additional fetch options.\n * @param options.timeout - The fetch timeout.\n * @returns The token list, or `undefined` if the request was cancelled.\n */\nexport async function fetchTokenListByChainId(\n chainId: Hex,\n abortSignal: AbortSignal,\n { timeout = defaultTimeout } = {},\n): Promise<unknown> {\n const tokenURL = getTokensURL(chainId);\n const response = await queryApi(tokenURL, abortSignal, timeout);\n if (response) {\n const result = await parseJsonResponse(response);\n if (Array.isArray(result) && chainId === ChainId['linea-mainnet']) {\n return result.filter(\n (elm) =>\n elm.aggregators.includes('lineaTeam') || elm.aggregators.length >= 3,\n );\n }\n return result;\n }\n return undefined;\n}\n\n/**\n * Fetch metadata for the token address provided for a given network. This request is cancellable\n * using the abort signal passed in.\n *\n * @param chainId - The chain ID of the network the token is on.\n * @param tokenAddress - The address of the token to fetch metadata for.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param options - Additional fetch options.\n * @param options.timeout - The fetch timeout.\n * @returns The token metadata, or `undefined` if the request was either aborted or failed.\n */\nexport async function fetchTokenMetadata<T>(\n chainId: Hex,\n tokenAddress: string,\n abortSignal: AbortSignal,\n { timeout = defaultTimeout } = {},\n): Promise<T | undefined> {\n if (!isTokenListSupportedForNetwork(chainId)) {\n throw new Error(TOKEN_METADATA_NO_SUPPORT_ERROR);\n }\n const tokenMetadataURL = getTokenMetadataURL(chainId, tokenAddress);\n const response = await queryApi(tokenMetadataURL, abortSignal, timeout);\n if (response) {\n return parseJsonResponse(response) as Promise<T>;\n }\n return undefined;\n}\n\n/**\n * Perform fetch request against the api.\n *\n * @param apiURL - The URL of the API to fetch.\n * @param abortSignal - The abort signal used to cancel the request if necessary.\n * @param timeout - The fetch timeout.\n * @returns Promise resolving request response.\n */\nasync function queryApi(\n apiURL: string,\n abortSignal: AbortSignal,\n timeout: number,\n): Promise<Response | undefined> {\n const fetchOptions: RequestInit = {\n referrer: apiURL,\n referrerPolicy: 'no-referrer-when-downgrade',\n method: 'GET',\n mode: 'cors',\n signal: abortSignal,\n cache: 'default',\n };\n fetchOptions.headers = new window.Headers();\n fetchOptions.headers.set('Content-Type', 'application/json');\n try {\n return await timeoutFetch(apiURL, fetchOptions, timeout);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('Request is aborted');\n }\n }\n return undefined;\n}\n\n/**\n * Parse an API response and return the response JSON data.\n *\n * @param apiResponse - The API response to parse.\n * @returns The response JSON data.\n * @throws Will throw if the response includes an error.\n */\nasync function parseJsonResponse(apiResponse: Response): Promise<unknown> {\n const responseObj = await apiResponse.json();\n // api may return errors as json without setting an error http status code\n if (responseObj?.error) {\n throw new Error(`TokenService Error: ${responseObj.error}`);\n }\n return responseObj;\n}\n"],"mappings":";;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKA,IAAM,sBAAsB;AAC5B,IAAM,kCACX;AAQF,SAAS,aAAa,SAAc;AAClC,QAAM,kBAAkB,YAAY,QAAQ,eAAe,IAAI,IAAI;AACnE,SAAO,GAAG,mBAAmB,WAAW;AAAA,IACtC;AAAA,EACF,CAAC,oBAAoB,eAAe;AACtC;AASA,SAAS,oBAAoB,SAAc,cAAsB;AAC/D,SAAO,GAAG,mBAAmB,UAAU;AAAA,IACrC;AAAA,EACF,CAAC,YAAY,YAAY;AAC3B;AAEA,IAAM,2BAA2B;AAIjC,IAAM,iBAAiB;AAYvB,eAAsB,wBACpB,SACA,aACA,EAAE,UAAU,eAAe,IAAI,CAAC,GACd;AAClB,QAAM,WAAW,aAAa,OAAO;AACrC,QAAM,WAAW,MAAM,SAAS,UAAU,aAAa,OAAO;AAC9D,MAAI,UAAU;AACZ,UAAM,SAAS,MAAM,kBAAkB,QAAQ;AAC/C,QAAI,MAAM,QAAQ,MAAM,KAAK,YAAY,QAAQ,eAAe,GAAG;AACjE,aAAO,OAAO;AAAA,QACZ,CAAC,QACC,IAAI,YAAY,SAAS,WAAW,KAAK,IAAI,YAAY,UAAU;AAAA,MACvE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAaA,eAAsB,mBACpB,SACA,cACA,aACA,EAAE,UAAU,eAAe,IAAI,CAAC,GACR;AACxB,MAAI,CAAC,+BAA+B,OAAO,GAAG;AAC5C,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,QAAM,mBAAmB,oBAAoB,SAAS,YAAY;AAClE,QAAM,WAAW,MAAM,SAAS,kBAAkB,aAAa,OAAO;AACtE,MAAI,UAAU;AACZ,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AACA,SAAO;AACT;AAUA,eAAe,SACb,QACA,aACA,SAC+B;AAC/B,QAAM,eAA4B;AAAA,IAChC,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACA,eAAa,UAAU,IAAI,OAAO,QAAQ;AAC1C,eAAa,QAAQ,IAAI,gBAAgB,kBAAkB;AAC3D,MAAI;AACF,WAAO,MAAM,aAAa,QAAQ,cAAc,OAAO;AAAA,EACzD,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,cAAQ,IAAI,oBAAoB;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AASA,eAAe,kBAAkB,aAAyC;AACxE,QAAM,cAAc,MAAM,YAAY,KAAK;AAE3C,MAAI,aAAa,OAAO;AACtB,UAAM,IAAI,MAAM,uBAAuB,YAAY,KAAK,EAAE;AAAA,EAC5D;AACA,SAAO;AACT;","names":[]}