@metamask-previews/assets-controllers 108.5.0-preview-d04a0a1 → 108.5.0-preview-a3d867de5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -6
- package/dist/TokenRatesController.cjs +5 -16
- package/dist/TokenRatesController.cjs.map +1 -1
- package/dist/TokenRatesController.d.cts +1 -5
- package/dist/TokenRatesController.d.cts.map +1 -1
- package/dist/TokenRatesController.d.mts +1 -5
- package/dist/TokenRatesController.d.mts.map +1 -1
- package/dist/TokenRatesController.mjs +5 -16
- package/dist/TokenRatesController.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,15 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
### Added
|
|
11
|
-
|
|
12
|
-
- Add `isDeprecated` option to `TokenRatesController` constructor ([#9022](https://github.com/MetaMask/core/pull/9022))
|
|
13
|
-
- When `isDeprecated()` returns `true`, all entry points (`updateExchangeRates`, `_executePoll`, `TokensController:stateChange`, and `NetworkController:stateChange`) become no-ops: no network requests are sent and no state is updated.
|
|
14
|
-
|
|
15
10
|
### Changed
|
|
16
11
|
|
|
17
12
|
- Bump `@metamask/network-enablement-controller` from `^5.2.0` to `^5.3.0` ([#9003](https://github.com/MetaMask/core/pull/9003))
|
|
18
|
-
- Bump `@metamask/transaction-controller` from `^66.0.1` to `^67.0.0` ([#9021](https://github.com/MetaMask/core/pull/9021))
|
|
19
13
|
|
|
20
14
|
## [108.5.0]
|
|
21
15
|
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _TokenRatesController_instances, _TokenRatesController_tokenPricesService, _TokenRatesController_disabled,
|
|
13
|
+
var _TokenRatesController_instances, _TokenRatesController_tokenPricesService, _TokenRatesController_disabled, _TokenRatesController_allTokens, _TokenRatesController_allDetectedTokens, _TokenRatesController_subscribeToTokensStateChange, _TokenRatesController_subscribeToNetworkStateChange, _TokenRatesController_initNativeAssetIdentifiers, _TokenRatesController_getTokenAddresses, _TokenRatesController_getTokensControllerState, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.controllerName = void 0;
|
|
16
16
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
@@ -53,14 +53,11 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
53
53
|
* @param options - The controller options.
|
|
54
54
|
* @param options.interval - The polling interval in ms
|
|
55
55
|
* @param options.disabled - Boolean to track if network requests are blocked
|
|
56
|
-
* @param options.isDeprecated - Optional function that returns true to completely
|
|
57
|
-
* disable this controller (no requests, no state updates). Intended for use
|
|
58
|
-
* when a higher-level controller (e.g. AssetsController) supersedes this one.
|
|
59
56
|
* @param options.tokenPricesService - An object in charge of retrieving token price
|
|
60
57
|
* @param options.messenger - The messenger instance for communication
|
|
61
58
|
* @param options.state - Initial state to set on this controller
|
|
62
59
|
*/
|
|
63
|
-
constructor({ interval = DEFAULT_INTERVAL, disabled = false,
|
|
60
|
+
constructor({ interval = DEFAULT_INTERVAL, disabled = false, tokenPricesService, messenger, state, }) {
|
|
64
61
|
super({
|
|
65
62
|
name: exports.controllerName,
|
|
66
63
|
messenger,
|
|
@@ -70,13 +67,11 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
70
67
|
_TokenRatesController_instances.add(this);
|
|
71
68
|
_TokenRatesController_tokenPricesService.set(this, void 0);
|
|
72
69
|
_TokenRatesController_disabled.set(this, void 0);
|
|
73
|
-
_TokenRatesController_isDeprecated.set(this, void 0);
|
|
74
70
|
_TokenRatesController_allTokens.set(this, void 0);
|
|
75
71
|
_TokenRatesController_allDetectedTokens.set(this, void 0);
|
|
76
72
|
this.setIntervalLength(interval);
|
|
77
73
|
__classPrivateFieldSet(this, _TokenRatesController_tokenPricesService, tokenPricesService, "f");
|
|
78
74
|
__classPrivateFieldSet(this, _TokenRatesController_disabled, disabled, "f");
|
|
79
|
-
__classPrivateFieldSet(this, _TokenRatesController_isDeprecated, isDeprecated, "f");
|
|
80
75
|
const { allTokens, allDetectedTokens } = __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_getTokensControllerState).call(this);
|
|
81
76
|
__classPrivateFieldSet(this, _TokenRatesController_allTokens, allTokens, "f");
|
|
82
77
|
__classPrivateFieldSet(this, _TokenRatesController_allDetectedTokens, allDetectedTokens, "f");
|
|
@@ -103,7 +98,7 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
103
98
|
* @param chainIdAndNativeCurrency - The chain ID and native currency.
|
|
104
99
|
*/
|
|
105
100
|
async updateExchangeRates(chainIdAndNativeCurrency) {
|
|
106
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")
|
|
101
|
+
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")) {
|
|
107
102
|
return;
|
|
108
103
|
}
|
|
109
104
|
const marketData = {};
|
|
@@ -154,9 +149,6 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
154
149
|
* @param input.chainIds - The chain ids to poll token rates on.
|
|
155
150
|
*/
|
|
156
151
|
async _executePoll({ chainIds }) {
|
|
157
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_isDeprecated, "f").call(this)) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
152
|
const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
|
|
161
153
|
const chainIdAndNativeCurrency = chainIds.reduce((acc, chainId) => {
|
|
162
154
|
const networkConfiguration = networkConfigurationsByChainId[chainId];
|
|
@@ -182,12 +174,12 @@ class TokenRatesController extends (0, polling_controller_1.StaticIntervalPollin
|
|
|
182
174
|
}
|
|
183
175
|
}
|
|
184
176
|
exports.TokenRatesController = TokenRatesController;
|
|
185
|
-
_TokenRatesController_tokenPricesService = new WeakMap(), _TokenRatesController_disabled = new WeakMap(),
|
|
177
|
+
_TokenRatesController_tokenPricesService = new WeakMap(), _TokenRatesController_disabled = new WeakMap(), _TokenRatesController_allTokens = new WeakMap(), _TokenRatesController_allDetectedTokens = new WeakMap(), _TokenRatesController_instances = new WeakSet(), _TokenRatesController_subscribeToTokensStateChange = function _TokenRatesController_subscribeToTokensStateChange() {
|
|
186
178
|
this.messenger.subscribe('TokensController:stateChange',
|
|
187
179
|
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
188
180
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
189
181
|
async ({ allTokens, allDetectedTokens }) => {
|
|
190
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")
|
|
182
|
+
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")) {
|
|
191
183
|
return;
|
|
192
184
|
}
|
|
193
185
|
const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
|
|
@@ -219,9 +211,6 @@ _TokenRatesController_tokenPricesService = new WeakMap(), _TokenRatesController_
|
|
|
219
211
|
});
|
|
220
212
|
}, _TokenRatesController_subscribeToNetworkStateChange = function _TokenRatesController_subscribeToNetworkStateChange() {
|
|
221
213
|
this.messenger.subscribe('NetworkController:stateChange', (_state, patches) => {
|
|
222
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_isDeprecated, "f").call(this)) {
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
214
|
// Remove state for deleted networks
|
|
226
215
|
for (const patch of patches) {
|
|
227
216
|
if (patch.op === 'remove' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.cjs","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAKA,iEAAkE;AAOlE,qEAA+E;AAE/E,mCAAiC;AAEjC,iDAAgF;AAEhF,oEAAyE;AAkCzE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAsDhC;;GAEG;AACU,QAAA,cAAc,GAAG,sBAAsB,CAAC;AAgDrD,MAAM,4BAA4B,GAA6C;IAC7E,UAAU,EAAE;QACV,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF;;;;GAIG;AACI,MAAM,mCAAmC,GAC9C,GAA8B,EAAE;IAC9B,OAAO;QACL,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC,CAAC;AALS,QAAA,mCAAmC,uCAK5C;AAOJ;;;GAGG;AACH,MAAa,oBAAqB,SAAQ,IAAA,oDAA+B,GAIxE;IAWC;;;;;;;;;;;;OAYG;IACH,YAAY,EACV,QAAQ,GAAG,gBAAgB,EAC3B,QAAQ,GAAG,KAAK,EAChB,YAAY,GAAG,GAAY,EAAE,CAAC,KAAK,EACnC,kBAAkB,EAClB,SAAS,EACT,KAAK,GAQN;QACC,KAAK,CAAC;YACJ,IAAI,EAAE,sBAAc;YACpB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,IAAA,2CAAmC,GAAE,EAAE,GAAG,KAAK,EAAE;YAC7D,QAAQ,EAAE,4BAA4B;SACvC,CAAC,CAAC;;QA3CI,2DAAgD;QAEzD,iDAAmB;QAEV,qDAA6B;QAEtC,kDAA+C;QAE/C,0DAA+D;QAqC7D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,uBAAA,IAAI,4CAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,kCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,sCAAiB,YAAY,MAAA,CAAC;QAElC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,uBAAA,IAAI,uFAA0B,MAA9B,IAAI,CAA4B,CAAC;QAC1E,uBAAA,IAAI,mCAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,2CAAsB,iBAAiB,MAAA,CAAC;QAE5C,iGAAiG;QACjG,uBAAA,IAAI,yFAA4B,MAAhC,IAAI,CAA8B,CAAC;QAEnC,uBAAA,IAAI,2FAA8B,MAAlC,IAAI,CAAgC,CAAC;QAErC,uBAAA,IAAI,4FAA+B,MAAnC,IAAI,CAAiC,CAAC;IACxC,CAAC;IA0HD;;OAEG;IACH,MAAM;QACJ,uBAAA,IAAI,kCAAa,KAAK,MAAA,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,uBAAA,IAAI,kCAAa,IAAI,MAAA,CAAC;IACxB,CAAC;IAgBD;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CACvB,wBAAoD;QAEpD,IAAI,uBAAA,IAAI,sCAAU,IAAI,uBAAA,IAAI,0CAAc,MAAlB,IAAI,CAAgB,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAgD,EAAE,CAAC;QACnE,MAAM,sBAAsB,GAMxB,EAAE,CAAC;QACP,MAAM,iCAAiC,GAMnC,EAAE,CAAC;QACP,KAAK,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,wBAAwB,EAAE,CAAC;YACnE,IAAI,uBAAA,IAAI,gDAAoB,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/D,KAAK,MAAM,YAAY,IAAI,uBAAA,IAAI,gFAAmB,MAAvB,IAAI,EAAoB,OAAO,CAAC,EAAE,CAAC;oBAC5D,IACE,uBAAA,IAAI,gDAAoB,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAClE,CAAC;wBACD,CAAC,sBAAsB,CAAC,cAAc,MAArC,sBAAsB,CAAC,cAAc,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC;4BACnD,OAAO;4BACP,YAAY;yBACb,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,CAAC,iCAAiC,CAAC,cAAc,MAAhD,iCAAiC,CAAC,cAAc,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC;4BAC9D,OAAO;4BACP,YAAY;yBACb,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAC3C,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,CAC3B,uBAAA,IAAI,iHAAoD,MAAxD,IAAI,EACF,MAAM,EACN,cAAc,EACd,UAAU,CACX,CACJ;YACD,GAAG,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,CACtD,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,CAC3B,uBAAA,IAAI,mHAAsD,MAA1D,IAAI,EACF,MAAM,EACN,cAAc,EACd,UAAU,CACX,CACJ;SACF,CAAC;QAEF,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CACtE,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,UAAU,GAAG;oBACjB,GAAG,KAAK,CAAC,UAAU;oBACnB,GAAG,UAAU;iBACd,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAuGD;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,EAAE,QAAQ,EAA0B;QACrD,IAAI,uBAAA,IAAI,0CAAc,MAAlB,IAAI,CAAgB,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC5D,4BAA4B,CAC7B,CAAC;QAEF,MAAM,wBAAwB,GAAG,QAAQ,CAAC,MAAM,CAE9C,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACjB,MAAM,oBAAoB,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CACX,oEAAoE,OAAO,EAAE,CAC9E,CAAC;gBACF,OAAO,GAAG,CAAC;YACb,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO;gBACP,cAAc,EAAE,oBAAoB,CAAC,cAAc;aACpD,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,OAAO,IAAA,2CAAmC,GAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA/bD,oDA+bC;;IA3XG,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,8BAA8B;IAC9B,gFAAgF;IAChF,kEAAkE;IAClE,KAAK,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACzC,IAAI,uBAAA,IAAI,sCAAU,IAAI,uBAAA,IAAI,0CAAc,MAAlB,IAAI,CAAgB,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,MAAM,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC5D,4BAA4B,CAC7B,CAAC;QAEF,MAAM,QAAQ,GAAG;YACf,GAAG,IAAI,GAAG,CAAC;gBACT,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAClC,CAAC;SACM,CAAC;QAEX,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CACtC,CAAC,OAAO,EAAE,EAAE,CACV,CAAC,IAAA,gBAAO,EAAC,uBAAA,IAAI,uCAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC,IAAA,gBAAO,EACN,uBAAA,IAAI,+CAAmB,CAAC,OAAO,CAAC,EAChC,iBAAiB,CAAC,OAAO,CAAC,CAC3B,CACJ,CAAC;QAEF,uBAAA,IAAI,mCAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,2CAAsB,iBAAiB,MAAA,CAAC;QAE5C,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,MAAM,CAEtD,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACjB,MAAM,oBAAoB,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CACX,oEAAoE,OAAO,EAAE,CAC9E,CAAC;gBACF,OAAO,GAAG,CAAC;YACb,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO;gBACP,cAAc,EAAE,oBAAoB,CAAC,cAAc;aACpD,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IAC3D,CAAC,EACD,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACnC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC;IAGC,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,+BAA+B,EAC/B,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAClB,IAAI,uBAAA,IAAI,0CAAc,MAAlB,IAAI,CAAgB,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,oCAAoC;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IACE,KAAK,CAAC,EAAE,KAAK,QAAQ;gBACrB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gCAAgC,EAClD,CAAC;gBACD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAQ,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;IAOC,IAAI,uBAAA,IAAI,gDAAoB,CAAC,yBAAyB,EAAE,CAAC;QACvD,MAAM,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACpD,sCAAsC,CACvC,CAAC;QACF,uBAAA,IAAI,gDAAoB,CAAC,yBAAyB,CAChD,sBAAsB,CACvB,CAAC;IACJ,CAAC;AACH,CAAC,6FAQkB,OAAY;IAC7B,MAAM,SAAS,GAAG,CAAC,SAA6C,EAAE,EAAE,CAClE,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAA,uCAAoB,EAAC,OAAO,CAAQ,CAAC,CAClE,CAAC;IAEJ,MAAM,cAAc,GAAG,SAAS,CAAC,uBAAA,IAAI,uCAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,MAAM,sBAAsB,GAAG,SAAS,CAAC,uBAAA,IAAI,+CAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,cAAc;YACjB,GAAG,sBAAsB;YACzB,IAAA,iCAAqB,EAAC,OAAO,CAAC;SAC/B,CAAC;KACH,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;IAoBC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC1D,2BAA2B,CAC5B,CAAC;IAEF,OAAO;QACL,SAAS;QACT,iBAAiB;KAClB,CAAC;AACJ,CAAC,6EA0FD,KAAK,mFACH,MAGG,EACH,QAAgB,EAChB,aAA0D,EAAE;IAE5D,OAAO,MAAM,IAAA,oCAAuB,EAGlC;QACA,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,oCAAuB;QAClC,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,EAAE;;YAClD,MAAM,eAAe,GAAG,MAAM,uBAAA,IAAI,gDAAoB,CAAC,gBAAgB,CACrE;gBACE,MAAM,EAAE,WAAW;gBACnB,QAAQ;aACT,CACF,CAAC;YAEF,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;gBACzC,CAAC,iBAAiB,MAAC,UAAU,CAAC,OAAO,MAApC,iBAAiB,OAAyB,EAAE,EAAC,CAC5C,UAAU,CAAC,YAAY,CACxB,GAAG,UAAU,CAAC;YACjB,CAAC;YAED,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QACD,aAAa,EAAE,UAAU;KAC1B,CAAC,CAAC;AACL,CAAC,+EAED,KAAK,qFACH,MAGG,EACH,QAAgB,EAChB,UAAuD;IAEvD,uDAAuD;IACvD,MAAM,eAAe,GACnB,MAAM,uBAAA,IAAI,iHAAoD,MAAxD,IAAI,EACR,MAAM,EACN,KAAK,CACN,CAAC;IAEJ,oDAAoD;IACpD,MAAM,kBAAkB,GAAG,CACzB,UAAkB,EAClB,qBAA6B,EAC7B,EAAE,CAAC,UAAU,GAAG,qBAAqB,CAAC;IAExC,iDAAiD;IACjD,KAAK,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,IAAI,MAAM,CAAC,OAAO,CAC9D,eAAe,CAC2B,EAAE,CAAC;QAC7C,MAAM,qBAAqB,GACzB,wBAAwB,CAAC,IAAA,iCAAqB,EAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;QAElE,2CAA2C;QAC3C,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CACpD,wBAAwB,CACK,EAAE,CAAC;YAChC,CAAC,UAAU,CAAC,OAAO,MAAlB,UAAU,CAAC,OAAO,IAAM,EAAE,EAAC,CAAC,YAAY,CAAC,GAAG;gBAC3C,GAAG,SAAS;gBACZ,QAAQ;gBACR,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC;gBACjE,SAAS,EAAE,kBAAkB,CAC3B,SAAS,CAAC,SAAS,EACnB,qBAAqB,CACtB;gBACD,WAAW,EAAE,kBAAkB,CAC7B,SAAS,CAAC,WAAW,EACrB,qBAAqB,CACtB;gBACD,UAAU,EAAE,kBAAkB,CAC5B,SAAS,CAAC,UAAU,EACpB,qBAAqB,CACtB;gBACD,WAAW,EAAE,kBAAkB,CAC7B,SAAS,CAAC,WAAW,EACrB,qBAAqB,CACtB;gBACD,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBACnE,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC;gBACjE,gBAAgB,EAAE,kBAAkB,CAClC,SAAS,CAAC,gBAAgB,EAC1B,qBAAqB,CACtB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AA+CH,kBAAe,oBAAoB,CAAC","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NetworkEnablementControllerGetStateAction } from '@metamask/network-enablement-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from './assetsUtil';\nimport type { AbstractTokenPricesService } from './token-prices-service/abstract-token-prices-service';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport { TokenRwaData } from './token-service';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n TokensControllerState,\n} from './TokensController';\n\n/**\n * @type Token\n *\n * Token representation\n *\n * @property address - Hex address of the token contract\n * @property decimals - Number of decimals the token uses\n * @property symbol - Symbol of the token\n * @property aggregators - An array containing the token's aggregators\n * @property image - Image of the token, url or bit32 image\n * @property hasBalanceError - 'true' if there is an error while updating the token balance\n * @property isERC721 - 'true' if the token is a ERC721 token\n * @property name - Name of the token\n */\nexport type Token = {\n address: string;\n decimals: number;\n symbol: string;\n aggregators?: string[];\n image?: string;\n hasBalanceError?: boolean;\n isERC721?: boolean;\n name?: string;\n rwaData?: TokenRwaData;\n};\n\nconst DEFAULT_INTERVAL = 180000;\n\nexport type ContractExchangeRates = {\n [address: string]: number | undefined;\n};\n\nexport type MarketDataDetails = {\n tokenAddress: `0x${string}`;\n currency: string;\n allTimeHigh: number;\n allTimeLow: number;\n circulatingSupply: number;\n dilutedMarketCap: number;\n high1d: number;\n low1d: number;\n marketCap: number;\n marketCapPercentChange1d: number;\n price: number;\n priceChange1d: number;\n pricePercentChange1d: number;\n pricePercentChange1h: number;\n pricePercentChange1y: number;\n pricePercentChange7d: number;\n pricePercentChange14d: number;\n pricePercentChange30d: number;\n pricePercentChange200d: number;\n totalVolume: number;\n};\n\n/**\n * Represents a mapping of token contract addresses to their market data.\n */\nexport type ContractMarketData = Record<Hex, MarketDataDetails>;\n\ntype ChainIdAndNativeCurrency = {\n chainId: Hex;\n nativeCurrency: string;\n};\n\n/**\n * The external actions available to the {@link TokenRatesController}.\n */\nexport type AllowedActions =\n | TokensControllerGetStateAction\n | NetworkControllerGetStateAction\n | NetworkEnablementControllerGetStateAction;\n\n/**\n * The external events available to the {@link TokenRatesController}.\n */\nexport type AllowedEvents =\n | TokensControllerStateChangeEvent\n | NetworkControllerStateChangeEvent;\n\n/**\n * The name of the {@link TokenRatesController}.\n */\nexport const controllerName = 'TokenRatesController';\n\n/**\n * @type TokenRatesState\n *\n * Token rates controller state\n *\n * @property marketData - Market data for tokens, keyed by chain ID and then token contract address.\n */\nexport type TokenRatesControllerState = {\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>;\n};\n\n/**\n * The action that can be performed to get the state of the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The actions that can be performed using the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerActions = TokenRatesControllerGetStateAction;\n\n/**\n * The event that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The events that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerEvents = TokenRatesControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TokenRatesController} for communication.\n */\nexport type TokenRatesControllerMessenger = Messenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents\n>;\n\nconst tokenRatesControllerMetadata: StateMetadata<TokenRatesControllerState> = {\n marketData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * Get the default {@link TokenRatesController} state.\n *\n * @returns The default {@link TokenRatesController} state.\n */\nexport const getDefaultTokenRatesControllerState =\n (): TokenRatesControllerState => {\n return {\n marketData: {},\n };\n };\n\n/** The input to start polling for the {@link TokenRatesController} */\nexport type TokenRatesPollingInput = {\n chainIds: Hex[];\n};\n\n/**\n * Controller that passively polls on a set interval for token-to-fiat exchange rates\n * for tokens stored in the TokensController\n */\nexport class TokenRatesController extends StaticIntervalPollingController<TokenRatesPollingInput>()<\n typeof controllerName,\n TokenRatesControllerState,\n TokenRatesControllerMessenger\n> {\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n #disabled: boolean;\n\n readonly #isDeprecated: () => boolean;\n\n #allTokens: TokensControllerState['allTokens'];\n\n #allDetectedTokens: TokensControllerState['allDetectedTokens'];\n\n /**\n * Creates a TokenRatesController instance.\n *\n * @param options - The controller options.\n * @param options.interval - The polling interval in ms\n * @param options.disabled - Boolean to track if network requests are blocked\n * @param options.isDeprecated - Optional function that returns true to completely\n * disable this controller (no requests, no state updates). Intended for use\n * when a higher-level controller (e.g. AssetsController) supersedes this one.\n * @param options.tokenPricesService - An object in charge of retrieving token price\n * @param options.messenger - The messenger instance for communication\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = false,\n isDeprecated = (): boolean => false,\n tokenPricesService,\n messenger,\n state,\n }: {\n interval?: number;\n disabled?: boolean;\n isDeprecated?: () => boolean;\n tokenPricesService: AbstractTokenPricesService;\n messenger: TokenRatesControllerMessenger;\n state?: Partial<TokenRatesControllerState>;\n }) {\n super({\n name: controllerName,\n messenger,\n state: { ...getDefaultTokenRatesControllerState(), ...state },\n metadata: tokenRatesControllerMetadata,\n });\n\n this.setIntervalLength(interval);\n this.#tokenPricesService = tokenPricesService;\n this.#disabled = disabled;\n this.#isDeprecated = isDeprecated;\n\n const { allTokens, allDetectedTokens } = this.#getTokensControllerState();\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n // Set native asset identifiers from NetworkEnablementController for CAIP-19 native token lookups\n this.#initNativeAssetIdentifiers();\n\n this.#subscribeToTokensStateChange();\n\n this.#subscribeToNetworkStateChange();\n }\n\n #subscribeToTokensStateChange() {\n this.messenger.subscribe(\n 'TokensController:stateChange',\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async ({ allTokens, allDetectedTokens }) => {\n if (this.#disabled || this.#isDeprecated()) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = [\n ...new Set([\n ...Object.keys(allTokens),\n ...Object.keys(allDetectedTokens),\n ]),\n ] as Hex[];\n\n const chainIdsToUpdate = chainIds.filter(\n (chainId) =>\n !isEqual(this.#allTokens[chainId], allTokens[chainId]) ||\n !isEqual(\n this.#allDetectedTokens[chainId],\n allDetectedTokens[chainId],\n ),\n );\n\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const chainIdAndNativeCurrency = chainIdsToUpdate.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n (_state, patches) => {\n if (this.#isDeprecated()) {\n return;\n }\n // Remove state for deleted networks\n for (const patch of patches) {\n if (\n patch.op === 'remove' &&\n patch.path[0] === 'networkConfigurationsByChainId'\n ) {\n const removedChainId = patch.path[1] as Hex;\n this.update((state) => {\n delete state.marketData[removedChainId];\n });\n }\n }\n },\n );\n }\n\n /**\n * Initialize the native asset identifiers from NetworkEnablementController.\n * This provides CAIP-19 native asset IDs for the token prices service.\n */\n #initNativeAssetIdentifiers(): void {\n if (this.#tokenPricesService.setNativeAssetIdentifiers) {\n const { nativeAssetIdentifiers } = this.messenger.call(\n 'NetworkEnablementController:getState',\n );\n this.#tokenPricesService.setNativeAssetIdentifiers(\n nativeAssetIdentifiers,\n );\n }\n }\n\n /**\n * Get the tokens for the given chain.\n *\n * @param chainId - The chain ID.\n * @returns The list of tokens addresses for the current chain\n */\n #getTokenAddresses(chainId: Hex): Hex[] {\n const getTokens = (allTokens: Record<Hex, { address: string }[]>) =>\n Object.values(allTokens ?? {}).flatMap((tokens) =>\n tokens.map(({ address }) => toChecksumHexAddress(address) as Hex),\n );\n\n const tokenAddresses = getTokens(this.#allTokens[chainId]);\n const detectedTokenAddresses = getTokens(this.#allDetectedTokens[chainId]);\n\n return [\n ...new Set([\n ...tokenAddresses,\n ...detectedTokenAddresses,\n getNativeTokenAddress(chainId),\n ]),\n ].sort();\n }\n\n /**\n * Allows controller to make active and passive polling requests\n */\n enable(): void {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from making network calls\n */\n disable(): void {\n this.#disabled = true;\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messenger.call(\n 'TokensController:getState',\n );\n\n return {\n allTokens,\n allDetectedTokens,\n };\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRates(\n chainIdAndNativeCurrency: ChainIdAndNativeCurrency[],\n ): Promise<void> {\n if (this.#disabled || this.#isDeprecated()) {\n return;\n }\n\n const marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {};\n const assetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n const unsupportedAssetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n for (const { chainId, nativeCurrency } of chainIdAndNativeCurrency) {\n if (this.#tokenPricesService.validateChainIdSupported(chainId)) {\n for (const tokenAddress of this.#getTokenAddresses(chainId)) {\n if (\n this.#tokenPricesService.validateCurrencySupported(nativeCurrency)\n ) {\n (assetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n } else {\n (unsupportedAssetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n }\n }\n }\n }\n\n const promises = [\n ...Object.entries(assetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ...Object.entries(unsupportedAssetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ];\n\n await Promise.allSettled(promises);\n\n const chainIds = new Set(\n Object.values(chainIdAndNativeCurrency).map((chain) => chain.chainId),\n );\n\n for (const chainId of chainIds) {\n if (!marketData[chainId]) {\n marketData[chainId] = {};\n }\n }\n\n if (Object.keys(marketData).length > 0) {\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...marketData,\n };\n });\n }\n }\n\n async #fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {},\n ) {\n return await reduceInBatchesSerially<\n { chainId: Hex; tokenAddress: Hex },\n Record<Hex, Record<Hex, MarketDataDetails>>\n >({\n values: assets,\n batchSize: TOKEN_PRICES_BATCH_SIZE,\n eachBatch: async (partialMarketData, assetsBatch) => {\n const batchMarketData = await this.#tokenPricesService.fetchTokenPrices(\n {\n assets: assetsBatch,\n currency,\n },\n );\n\n for (const tokenPrice of batchMarketData) {\n (partialMarketData[tokenPrice.chainId] ??= {})[\n tokenPrice.tokenAddress\n ] = tokenPrice;\n }\n\n return partialMarketData;\n },\n initialResult: marketData,\n });\n }\n\n async #fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>,\n ) {\n // Step -1: Then fetch all tracked tokens priced in USD\n const marketDataInUSD =\n await this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n 'usd', // Fallback currency when the native currency is not supported\n );\n\n // Formula: price_in_native = token_usd / native_usd\n const convertUSDToNative = (\n valueInUSD: number,\n nativeTokenPriceInUSD: number,\n ) => valueInUSD / nativeTokenPriceInUSD;\n\n // Step -2: Convert USD prices to native currency\n for (const [chainId, marketDataByTokenAddress] of Object.entries(\n marketDataInUSD,\n ) as [Hex, Record<Hex, MarketDataDetails>][]) {\n const nativeTokenPriceInUSD =\n marketDataByTokenAddress[getNativeTokenAddress(chainId)]?.price;\n\n // Return here if it's null, undefined or 0\n if (!nativeTokenPriceInUSD) {\n continue;\n }\n\n for (const [tokenAddress, tokenData] of Object.entries(\n marketDataByTokenAddress,\n ) as [Hex, MarketDataDetails][]) {\n (marketData[chainId] ??= {})[tokenAddress] = {\n ...tokenData,\n currency,\n price: convertUSDToNative(tokenData.price, nativeTokenPriceInUSD),\n marketCap: convertUSDToNative(\n tokenData.marketCap,\n nativeTokenPriceInUSD,\n ),\n allTimeHigh: convertUSDToNative(\n tokenData.allTimeHigh,\n nativeTokenPriceInUSD,\n ),\n allTimeLow: convertUSDToNative(\n tokenData.allTimeLow,\n nativeTokenPriceInUSD,\n ),\n totalVolume: convertUSDToNative(\n tokenData.totalVolume,\n nativeTokenPriceInUSD,\n ),\n high1d: convertUSDToNative(tokenData.high1d, nativeTokenPriceInUSD),\n low1d: convertUSDToNative(tokenData.low1d, nativeTokenPriceInUSD),\n dilutedMarketCap: convertUSDToNative(\n tokenData.dilutedMarketCap,\n nativeTokenPriceInUSD,\n ),\n };\n }\n }\n }\n\n /**\n * Updates token rates for the given networkClientId\n *\n * @param input - The input for the poll.\n * @param input.chainIds - The chain ids to poll token rates on.\n */\n async _executePoll({ chainIds }: TokenRatesPollingInput): Promise<void> {\n if (this.#isDeprecated()) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIdAndNativeCurrency = chainIds.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n }\n\n /**\n * Reset the controller state to the default state.\n */\n resetState() {\n this.update(() => {\n return getDefaultTokenRatesControllerState();\n });\n }\n}\n\nexport default TokenRatesController;\n"]}
|
|
1
|
+
{"version":3,"file":"TokenRatesController.cjs","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NetworkEnablementControllerGetStateAction } from '@metamask/network-enablement-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from './assetsUtil';\nimport type { AbstractTokenPricesService } from './token-prices-service/abstract-token-prices-service';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport { TokenRwaData } from './token-service';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n TokensControllerState,\n} from './TokensController';\n\n/**\n * @type Token\n *\n * Token representation\n *\n * @property address - Hex address of the token contract\n * @property decimals - Number of decimals the token uses\n * @property symbol - Symbol of the token\n * @property aggregators - An array containing the token's aggregators\n * @property image - Image of the token, url or bit32 image\n * @property hasBalanceError - 'true' if there is an error while updating the token balance\n * @property isERC721 - 'true' if the token is a ERC721 token\n * @property name - Name of the token\n */\nexport type Token = {\n address: string;\n decimals: number;\n symbol: string;\n aggregators?: string[];\n image?: string;\n hasBalanceError?: boolean;\n isERC721?: boolean;\n name?: string;\n rwaData?: TokenRwaData;\n};\n\nconst DEFAULT_INTERVAL = 180000;\n\nexport type ContractExchangeRates = {\n [address: string]: number | undefined;\n};\n\nexport type MarketDataDetails = {\n tokenAddress: `0x${string}`;\n currency: string;\n allTimeHigh: number;\n allTimeLow: number;\n circulatingSupply: number;\n dilutedMarketCap: number;\n high1d: number;\n low1d: number;\n marketCap: number;\n marketCapPercentChange1d: number;\n price: number;\n priceChange1d: number;\n pricePercentChange1d: number;\n pricePercentChange1h: number;\n pricePercentChange1y: number;\n pricePercentChange7d: number;\n pricePercentChange14d: number;\n pricePercentChange30d: number;\n pricePercentChange200d: number;\n totalVolume: number;\n};\n\n/**\n * Represents a mapping of token contract addresses to their market data.\n */\nexport type ContractMarketData = Record<Hex, MarketDataDetails>;\n\ntype ChainIdAndNativeCurrency = {\n chainId: Hex;\n nativeCurrency: string;\n};\n\n/**\n * The external actions available to the {@link TokenRatesController}.\n */\nexport type AllowedActions =\n | TokensControllerGetStateAction\n | NetworkControllerGetStateAction\n | NetworkEnablementControllerGetStateAction;\n\n/**\n * The external events available to the {@link TokenRatesController}.\n */\nexport type AllowedEvents =\n | TokensControllerStateChangeEvent\n | NetworkControllerStateChangeEvent;\n\n/**\n * The name of the {@link TokenRatesController}.\n */\nexport const controllerName = 'TokenRatesController';\n\n/**\n * @type TokenRatesState\n *\n * Token rates controller state\n *\n * @property marketData - Market data for tokens, keyed by chain ID and then token contract address.\n */\nexport type TokenRatesControllerState = {\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>;\n};\n\n/**\n * The action that can be performed to get the state of the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The actions that can be performed using the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerActions = TokenRatesControllerGetStateAction;\n\n/**\n * The event that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The events that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerEvents = TokenRatesControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TokenRatesController} for communication.\n */\nexport type TokenRatesControllerMessenger = Messenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents\n>;\n\nconst tokenRatesControllerMetadata: StateMetadata<TokenRatesControllerState> = {\n marketData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * Get the default {@link TokenRatesController} state.\n *\n * @returns The default {@link TokenRatesController} state.\n */\nexport const getDefaultTokenRatesControllerState =\n (): TokenRatesControllerState => {\n return {\n marketData: {},\n };\n };\n\n/** The input to start polling for the {@link TokenRatesController} */\nexport type TokenRatesPollingInput = {\n chainIds: Hex[];\n};\n\n/**\n * Controller that passively polls on a set interval for token-to-fiat exchange rates\n * for tokens stored in the TokensController\n */\nexport class TokenRatesController extends StaticIntervalPollingController<TokenRatesPollingInput>()<\n typeof controllerName,\n TokenRatesControllerState,\n TokenRatesControllerMessenger\n> {\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n #disabled: boolean;\n\n #allTokens: TokensControllerState['allTokens'];\n\n #allDetectedTokens: TokensControllerState['allDetectedTokens'];\n\n /**\n * Creates a TokenRatesController instance.\n *\n * @param options - The controller options.\n * @param options.interval - The polling interval in ms\n * @param options.disabled - Boolean to track if network requests are blocked\n * @param options.tokenPricesService - An object in charge of retrieving token price\n * @param options.messenger - The messenger instance for communication\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = false,\n tokenPricesService,\n messenger,\n state,\n }: {\n interval?: number;\n disabled?: boolean;\n tokenPricesService: AbstractTokenPricesService;\n messenger: TokenRatesControllerMessenger;\n state?: Partial<TokenRatesControllerState>;\n }) {\n super({\n name: controllerName,\n messenger,\n state: { ...getDefaultTokenRatesControllerState(), ...state },\n metadata: tokenRatesControllerMetadata,\n });\n\n this.setIntervalLength(interval);\n this.#tokenPricesService = tokenPricesService;\n this.#disabled = disabled;\n\n const { allTokens, allDetectedTokens } = this.#getTokensControllerState();\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n // Set native asset identifiers from NetworkEnablementController for CAIP-19 native token lookups\n this.#initNativeAssetIdentifiers();\n\n this.#subscribeToTokensStateChange();\n\n this.#subscribeToNetworkStateChange();\n }\n\n #subscribeToTokensStateChange() {\n this.messenger.subscribe(\n 'TokensController:stateChange',\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async ({ allTokens, allDetectedTokens }) => {\n if (this.#disabled) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = [\n ...new Set([\n ...Object.keys(allTokens),\n ...Object.keys(allDetectedTokens),\n ]),\n ] as Hex[];\n\n const chainIdsToUpdate = chainIds.filter(\n (chainId) =>\n !isEqual(this.#allTokens[chainId], allTokens[chainId]) ||\n !isEqual(\n this.#allDetectedTokens[chainId],\n allDetectedTokens[chainId],\n ),\n );\n\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const chainIdAndNativeCurrency = chainIdsToUpdate.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n (_state, patches) => {\n // Remove state for deleted networks\n for (const patch of patches) {\n if (\n patch.op === 'remove' &&\n patch.path[0] === 'networkConfigurationsByChainId'\n ) {\n const removedChainId = patch.path[1] as Hex;\n this.update((state) => {\n delete state.marketData[removedChainId];\n });\n }\n }\n },\n );\n }\n\n /**\n * Initialize the native asset identifiers from NetworkEnablementController.\n * This provides CAIP-19 native asset IDs for the token prices service.\n */\n #initNativeAssetIdentifiers(): void {\n if (this.#tokenPricesService.setNativeAssetIdentifiers) {\n const { nativeAssetIdentifiers } = this.messenger.call(\n 'NetworkEnablementController:getState',\n );\n this.#tokenPricesService.setNativeAssetIdentifiers(\n nativeAssetIdentifiers,\n );\n }\n }\n\n /**\n * Get the tokens for the given chain.\n *\n * @param chainId - The chain ID.\n * @returns The list of tokens addresses for the current chain\n */\n #getTokenAddresses(chainId: Hex): Hex[] {\n const getTokens = (allTokens: Record<Hex, { address: string }[]>) =>\n Object.values(allTokens ?? {}).flatMap((tokens) =>\n tokens.map(({ address }) => toChecksumHexAddress(address) as Hex),\n );\n\n const tokenAddresses = getTokens(this.#allTokens[chainId]);\n const detectedTokenAddresses = getTokens(this.#allDetectedTokens[chainId]);\n\n return [\n ...new Set([\n ...tokenAddresses,\n ...detectedTokenAddresses,\n getNativeTokenAddress(chainId),\n ]),\n ].sort();\n }\n\n /**\n * Allows controller to make active and passive polling requests\n */\n enable(): void {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from making network calls\n */\n disable(): void {\n this.#disabled = true;\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messenger.call(\n 'TokensController:getState',\n );\n\n return {\n allTokens,\n allDetectedTokens,\n };\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRates(\n chainIdAndNativeCurrency: ChainIdAndNativeCurrency[],\n ): Promise<void> {\n if (this.#disabled) {\n return;\n }\n\n const marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {};\n const assetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n const unsupportedAssetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n for (const { chainId, nativeCurrency } of chainIdAndNativeCurrency) {\n if (this.#tokenPricesService.validateChainIdSupported(chainId)) {\n for (const tokenAddress of this.#getTokenAddresses(chainId)) {\n if (\n this.#tokenPricesService.validateCurrencySupported(nativeCurrency)\n ) {\n (assetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n } else {\n (unsupportedAssetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n }\n }\n }\n }\n\n const promises = [\n ...Object.entries(assetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ...Object.entries(unsupportedAssetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ];\n\n await Promise.allSettled(promises);\n\n const chainIds = new Set(\n Object.values(chainIdAndNativeCurrency).map((chain) => chain.chainId),\n );\n\n for (const chainId of chainIds) {\n if (!marketData[chainId]) {\n marketData[chainId] = {};\n }\n }\n\n if (Object.keys(marketData).length > 0) {\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...marketData,\n };\n });\n }\n }\n\n async #fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {},\n ) {\n return await reduceInBatchesSerially<\n { chainId: Hex; tokenAddress: Hex },\n Record<Hex, Record<Hex, MarketDataDetails>>\n >({\n values: assets,\n batchSize: TOKEN_PRICES_BATCH_SIZE,\n eachBatch: async (partialMarketData, assetsBatch) => {\n const batchMarketData = await this.#tokenPricesService.fetchTokenPrices(\n {\n assets: assetsBatch,\n currency,\n },\n );\n\n for (const tokenPrice of batchMarketData) {\n (partialMarketData[tokenPrice.chainId] ??= {})[\n tokenPrice.tokenAddress\n ] = tokenPrice;\n }\n\n return partialMarketData;\n },\n initialResult: marketData,\n });\n }\n\n async #fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>,\n ) {\n // Step -1: Then fetch all tracked tokens priced in USD\n const marketDataInUSD =\n await this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n 'usd', // Fallback currency when the native currency is not supported\n );\n\n // Formula: price_in_native = token_usd / native_usd\n const convertUSDToNative = (\n valueInUSD: number,\n nativeTokenPriceInUSD: number,\n ) => valueInUSD / nativeTokenPriceInUSD;\n\n // Step -2: Convert USD prices to native currency\n for (const [chainId, marketDataByTokenAddress] of Object.entries(\n marketDataInUSD,\n ) as [Hex, Record<Hex, MarketDataDetails>][]) {\n const nativeTokenPriceInUSD =\n marketDataByTokenAddress[getNativeTokenAddress(chainId)]?.price;\n\n // Return here if it's null, undefined or 0\n if (!nativeTokenPriceInUSD) {\n continue;\n }\n\n for (const [tokenAddress, tokenData] of Object.entries(\n marketDataByTokenAddress,\n ) as [Hex, MarketDataDetails][]) {\n (marketData[chainId] ??= {})[tokenAddress] = {\n ...tokenData,\n currency,\n price: convertUSDToNative(tokenData.price, nativeTokenPriceInUSD),\n marketCap: convertUSDToNative(\n tokenData.marketCap,\n nativeTokenPriceInUSD,\n ),\n allTimeHigh: convertUSDToNative(\n tokenData.allTimeHigh,\n nativeTokenPriceInUSD,\n ),\n allTimeLow: convertUSDToNative(\n tokenData.allTimeLow,\n nativeTokenPriceInUSD,\n ),\n totalVolume: convertUSDToNative(\n tokenData.totalVolume,\n nativeTokenPriceInUSD,\n ),\n high1d: convertUSDToNative(tokenData.high1d, nativeTokenPriceInUSD),\n low1d: convertUSDToNative(tokenData.low1d, nativeTokenPriceInUSD),\n dilutedMarketCap: convertUSDToNative(\n tokenData.dilutedMarketCap,\n nativeTokenPriceInUSD,\n ),\n };\n }\n }\n }\n\n /**\n * Updates token rates for the given networkClientId\n *\n * @param input - The input for the poll.\n * @param input.chainIds - The chain ids to poll token rates on.\n */\n async _executePoll({ chainIds }: TokenRatesPollingInput): Promise<void> {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIdAndNativeCurrency = chainIds.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n }\n\n /**\n * Reset the controller state to the default state.\n */\n resetState() {\n this.update(() => {\n return getDefaultTokenRatesControllerState();\n });\n }\n}\n\nexport default TokenRatesController;\n"]}
|
|
@@ -143,17 +143,13 @@ export declare class TokenRatesController extends TokenRatesController_base<type
|
|
|
143
143
|
* @param options - The controller options.
|
|
144
144
|
* @param options.interval - The polling interval in ms
|
|
145
145
|
* @param options.disabled - Boolean to track if network requests are blocked
|
|
146
|
-
* @param options.isDeprecated - Optional function that returns true to completely
|
|
147
|
-
* disable this controller (no requests, no state updates). Intended for use
|
|
148
|
-
* when a higher-level controller (e.g. AssetsController) supersedes this one.
|
|
149
146
|
* @param options.tokenPricesService - An object in charge of retrieving token price
|
|
150
147
|
* @param options.messenger - The messenger instance for communication
|
|
151
148
|
* @param options.state - Initial state to set on this controller
|
|
152
149
|
*/
|
|
153
|
-
constructor({ interval, disabled,
|
|
150
|
+
constructor({ interval, disabled, tokenPricesService, messenger, state, }: {
|
|
154
151
|
interval?: number;
|
|
155
152
|
disabled?: boolean;
|
|
156
|
-
isDeprecated?: () => boolean;
|
|
157
153
|
tokenPricesService: AbstractTokenPricesService;
|
|
158
154
|
messenger: TokenRatesControllerMessenger;
|
|
159
155
|
state?: Partial<TokenRatesControllerState>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.d.cts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TokenRatesController.d.cts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -143,17 +143,13 @@ export declare class TokenRatesController extends TokenRatesController_base<type
|
|
|
143
143
|
* @param options - The controller options.
|
|
144
144
|
* @param options.interval - The polling interval in ms
|
|
145
145
|
* @param options.disabled - Boolean to track if network requests are blocked
|
|
146
|
-
* @param options.isDeprecated - Optional function that returns true to completely
|
|
147
|
-
* disable this controller (no requests, no state updates). Intended for use
|
|
148
|
-
* when a higher-level controller (e.g. AssetsController) supersedes this one.
|
|
149
146
|
* @param options.tokenPricesService - An object in charge of retrieving token price
|
|
150
147
|
* @param options.messenger - The messenger instance for communication
|
|
151
148
|
* @param options.state - Initial state to set on this controller
|
|
152
149
|
*/
|
|
153
|
-
constructor({ interval, disabled,
|
|
150
|
+
constructor({ interval, disabled, tokenPricesService, messenger, state, }: {
|
|
154
151
|
interval?: number;
|
|
155
152
|
disabled?: boolean;
|
|
156
|
-
isDeprecated?: () => boolean;
|
|
157
153
|
tokenPricesService: AbstractTokenPricesService;
|
|
158
154
|
messenger: TokenRatesControllerMessenger;
|
|
159
155
|
state?: Partial<TokenRatesControllerState>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.d.mts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TokenRatesController.d.mts","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _TokenRatesController_instances, _TokenRatesController_tokenPricesService, _TokenRatesController_disabled,
|
|
12
|
+
var _TokenRatesController_instances, _TokenRatesController_tokenPricesService, _TokenRatesController_disabled, _TokenRatesController_allTokens, _TokenRatesController_allDetectedTokens, _TokenRatesController_subscribeToTokensStateChange, _TokenRatesController_subscribeToNetworkStateChange, _TokenRatesController_initNativeAssetIdentifiers, _TokenRatesController_getTokenAddresses, _TokenRatesController_getTokensControllerState, _TokenRatesController_fetchAndMapExchangeRatesForSupportedNativeCurrency, _TokenRatesController_fetchAndMapExchangeRatesForUnsupportedNativeCurrency;
|
|
13
13
|
import { toChecksumHexAddress } from "@metamask/controller-utils";
|
|
14
14
|
import { StaticIntervalPollingController } from "@metamask/polling-controller";
|
|
15
15
|
import $lodash from "lodash";
|
|
@@ -50,14 +50,11 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
50
50
|
* @param options - The controller options.
|
|
51
51
|
* @param options.interval - The polling interval in ms
|
|
52
52
|
* @param options.disabled - Boolean to track if network requests are blocked
|
|
53
|
-
* @param options.isDeprecated - Optional function that returns true to completely
|
|
54
|
-
* disable this controller (no requests, no state updates). Intended for use
|
|
55
|
-
* when a higher-level controller (e.g. AssetsController) supersedes this one.
|
|
56
53
|
* @param options.tokenPricesService - An object in charge of retrieving token price
|
|
57
54
|
* @param options.messenger - The messenger instance for communication
|
|
58
55
|
* @param options.state - Initial state to set on this controller
|
|
59
56
|
*/
|
|
60
|
-
constructor({ interval = DEFAULT_INTERVAL, disabled = false,
|
|
57
|
+
constructor({ interval = DEFAULT_INTERVAL, disabled = false, tokenPricesService, messenger, state, }) {
|
|
61
58
|
super({
|
|
62
59
|
name: controllerName,
|
|
63
60
|
messenger,
|
|
@@ -67,13 +64,11 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
67
64
|
_TokenRatesController_instances.add(this);
|
|
68
65
|
_TokenRatesController_tokenPricesService.set(this, void 0);
|
|
69
66
|
_TokenRatesController_disabled.set(this, void 0);
|
|
70
|
-
_TokenRatesController_isDeprecated.set(this, void 0);
|
|
71
67
|
_TokenRatesController_allTokens.set(this, void 0);
|
|
72
68
|
_TokenRatesController_allDetectedTokens.set(this, void 0);
|
|
73
69
|
this.setIntervalLength(interval);
|
|
74
70
|
__classPrivateFieldSet(this, _TokenRatesController_tokenPricesService, tokenPricesService, "f");
|
|
75
71
|
__classPrivateFieldSet(this, _TokenRatesController_disabled, disabled, "f");
|
|
76
|
-
__classPrivateFieldSet(this, _TokenRatesController_isDeprecated, isDeprecated, "f");
|
|
77
72
|
const { allTokens, allDetectedTokens } = __classPrivateFieldGet(this, _TokenRatesController_instances, "m", _TokenRatesController_getTokensControllerState).call(this);
|
|
78
73
|
__classPrivateFieldSet(this, _TokenRatesController_allTokens, allTokens, "f");
|
|
79
74
|
__classPrivateFieldSet(this, _TokenRatesController_allDetectedTokens, allDetectedTokens, "f");
|
|
@@ -100,7 +95,7 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
100
95
|
* @param chainIdAndNativeCurrency - The chain ID and native currency.
|
|
101
96
|
*/
|
|
102
97
|
async updateExchangeRates(chainIdAndNativeCurrency) {
|
|
103
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")
|
|
98
|
+
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")) {
|
|
104
99
|
return;
|
|
105
100
|
}
|
|
106
101
|
const marketData = {};
|
|
@@ -151,9 +146,6 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
151
146
|
* @param input.chainIds - The chain ids to poll token rates on.
|
|
152
147
|
*/
|
|
153
148
|
async _executePoll({ chainIds }) {
|
|
154
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_isDeprecated, "f").call(this)) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
149
|
const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
|
|
158
150
|
const chainIdAndNativeCurrency = chainIds.reduce((acc, chainId) => {
|
|
159
151
|
const networkConfiguration = networkConfigurationsByChainId[chainId];
|
|
@@ -178,12 +170,12 @@ export class TokenRatesController extends StaticIntervalPollingController() {
|
|
|
178
170
|
});
|
|
179
171
|
}
|
|
180
172
|
}
|
|
181
|
-
_TokenRatesController_tokenPricesService = new WeakMap(), _TokenRatesController_disabled = new WeakMap(),
|
|
173
|
+
_TokenRatesController_tokenPricesService = new WeakMap(), _TokenRatesController_disabled = new WeakMap(), _TokenRatesController_allTokens = new WeakMap(), _TokenRatesController_allDetectedTokens = new WeakMap(), _TokenRatesController_instances = new WeakSet(), _TokenRatesController_subscribeToTokensStateChange = function _TokenRatesController_subscribeToTokensStateChange() {
|
|
182
174
|
this.messenger.subscribe('TokensController:stateChange',
|
|
183
175
|
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
184
176
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
185
177
|
async ({ allTokens, allDetectedTokens }) => {
|
|
186
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")
|
|
178
|
+
if (__classPrivateFieldGet(this, _TokenRatesController_disabled, "f")) {
|
|
187
179
|
return;
|
|
188
180
|
}
|
|
189
181
|
const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
|
|
@@ -215,9 +207,6 @@ _TokenRatesController_tokenPricesService = new WeakMap(), _TokenRatesController_
|
|
|
215
207
|
});
|
|
216
208
|
}, _TokenRatesController_subscribeToNetworkStateChange = function _TokenRatesController_subscribeToNetworkStateChange() {
|
|
217
209
|
this.messenger.subscribe('NetworkController:stateChange', (_state, patches) => {
|
|
218
|
-
if (__classPrivateFieldGet(this, _TokenRatesController_isDeprecated, "f").call(this)) {
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
210
|
// Remove state for deleted networks
|
|
222
211
|
for (const patch of patches) {
|
|
223
212
|
if (patch.op === 'remove' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRatesController.mjs","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NetworkEnablementControllerGetStateAction } from '@metamask/network-enablement-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from './assetsUtil';\nimport type { AbstractTokenPricesService } from './token-prices-service/abstract-token-prices-service';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport { TokenRwaData } from './token-service';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n TokensControllerState,\n} from './TokensController';\n\n/**\n * @type Token\n *\n * Token representation\n *\n * @property address - Hex address of the token contract\n * @property decimals - Number of decimals the token uses\n * @property symbol - Symbol of the token\n * @property aggregators - An array containing the token's aggregators\n * @property image - Image of the token, url or bit32 image\n * @property hasBalanceError - 'true' if there is an error while updating the token balance\n * @property isERC721 - 'true' if the token is a ERC721 token\n * @property name - Name of the token\n */\nexport type Token = {\n address: string;\n decimals: number;\n symbol: string;\n aggregators?: string[];\n image?: string;\n hasBalanceError?: boolean;\n isERC721?: boolean;\n name?: string;\n rwaData?: TokenRwaData;\n};\n\nconst DEFAULT_INTERVAL = 180000;\n\nexport type ContractExchangeRates = {\n [address: string]: number | undefined;\n};\n\nexport type MarketDataDetails = {\n tokenAddress: `0x${string}`;\n currency: string;\n allTimeHigh: number;\n allTimeLow: number;\n circulatingSupply: number;\n dilutedMarketCap: number;\n high1d: number;\n low1d: number;\n marketCap: number;\n marketCapPercentChange1d: number;\n price: number;\n priceChange1d: number;\n pricePercentChange1d: number;\n pricePercentChange1h: number;\n pricePercentChange1y: number;\n pricePercentChange7d: number;\n pricePercentChange14d: number;\n pricePercentChange30d: number;\n pricePercentChange200d: number;\n totalVolume: number;\n};\n\n/**\n * Represents a mapping of token contract addresses to their market data.\n */\nexport type ContractMarketData = Record<Hex, MarketDataDetails>;\n\ntype ChainIdAndNativeCurrency = {\n chainId: Hex;\n nativeCurrency: string;\n};\n\n/**\n * The external actions available to the {@link TokenRatesController}.\n */\nexport type AllowedActions =\n | TokensControllerGetStateAction\n | NetworkControllerGetStateAction\n | NetworkEnablementControllerGetStateAction;\n\n/**\n * The external events available to the {@link TokenRatesController}.\n */\nexport type AllowedEvents =\n | TokensControllerStateChangeEvent\n | NetworkControllerStateChangeEvent;\n\n/**\n * The name of the {@link TokenRatesController}.\n */\nexport const controllerName = 'TokenRatesController';\n\n/**\n * @type TokenRatesState\n *\n * Token rates controller state\n *\n * @property marketData - Market data for tokens, keyed by chain ID and then token contract address.\n */\nexport type TokenRatesControllerState = {\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>;\n};\n\n/**\n * The action that can be performed to get the state of the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The actions that can be performed using the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerActions = TokenRatesControllerGetStateAction;\n\n/**\n * The event that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The events that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerEvents = TokenRatesControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TokenRatesController} for communication.\n */\nexport type TokenRatesControllerMessenger = Messenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents\n>;\n\nconst tokenRatesControllerMetadata: StateMetadata<TokenRatesControllerState> = {\n marketData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * Get the default {@link TokenRatesController} state.\n *\n * @returns The default {@link TokenRatesController} state.\n */\nexport const getDefaultTokenRatesControllerState =\n (): TokenRatesControllerState => {\n return {\n marketData: {},\n };\n };\n\n/** The input to start polling for the {@link TokenRatesController} */\nexport type TokenRatesPollingInput = {\n chainIds: Hex[];\n};\n\n/**\n * Controller that passively polls on a set interval for token-to-fiat exchange rates\n * for tokens stored in the TokensController\n */\nexport class TokenRatesController extends StaticIntervalPollingController<TokenRatesPollingInput>()<\n typeof controllerName,\n TokenRatesControllerState,\n TokenRatesControllerMessenger\n> {\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n #disabled: boolean;\n\n readonly #isDeprecated: () => boolean;\n\n #allTokens: TokensControllerState['allTokens'];\n\n #allDetectedTokens: TokensControllerState['allDetectedTokens'];\n\n /**\n * Creates a TokenRatesController instance.\n *\n * @param options - The controller options.\n * @param options.interval - The polling interval in ms\n * @param options.disabled - Boolean to track if network requests are blocked\n * @param options.isDeprecated - Optional function that returns true to completely\n * disable this controller (no requests, no state updates). Intended for use\n * when a higher-level controller (e.g. AssetsController) supersedes this one.\n * @param options.tokenPricesService - An object in charge of retrieving token price\n * @param options.messenger - The messenger instance for communication\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = false,\n isDeprecated = (): boolean => false,\n tokenPricesService,\n messenger,\n state,\n }: {\n interval?: number;\n disabled?: boolean;\n isDeprecated?: () => boolean;\n tokenPricesService: AbstractTokenPricesService;\n messenger: TokenRatesControllerMessenger;\n state?: Partial<TokenRatesControllerState>;\n }) {\n super({\n name: controllerName,\n messenger,\n state: { ...getDefaultTokenRatesControllerState(), ...state },\n metadata: tokenRatesControllerMetadata,\n });\n\n this.setIntervalLength(interval);\n this.#tokenPricesService = tokenPricesService;\n this.#disabled = disabled;\n this.#isDeprecated = isDeprecated;\n\n const { allTokens, allDetectedTokens } = this.#getTokensControllerState();\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n // Set native asset identifiers from NetworkEnablementController for CAIP-19 native token lookups\n this.#initNativeAssetIdentifiers();\n\n this.#subscribeToTokensStateChange();\n\n this.#subscribeToNetworkStateChange();\n }\n\n #subscribeToTokensStateChange() {\n this.messenger.subscribe(\n 'TokensController:stateChange',\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async ({ allTokens, allDetectedTokens }) => {\n if (this.#disabled || this.#isDeprecated()) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = [\n ...new Set([\n ...Object.keys(allTokens),\n ...Object.keys(allDetectedTokens),\n ]),\n ] as Hex[];\n\n const chainIdsToUpdate = chainIds.filter(\n (chainId) =>\n !isEqual(this.#allTokens[chainId], allTokens[chainId]) ||\n !isEqual(\n this.#allDetectedTokens[chainId],\n allDetectedTokens[chainId],\n ),\n );\n\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const chainIdAndNativeCurrency = chainIdsToUpdate.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n (_state, patches) => {\n if (this.#isDeprecated()) {\n return;\n }\n // Remove state for deleted networks\n for (const patch of patches) {\n if (\n patch.op === 'remove' &&\n patch.path[0] === 'networkConfigurationsByChainId'\n ) {\n const removedChainId = patch.path[1] as Hex;\n this.update((state) => {\n delete state.marketData[removedChainId];\n });\n }\n }\n },\n );\n }\n\n /**\n * Initialize the native asset identifiers from NetworkEnablementController.\n * This provides CAIP-19 native asset IDs for the token prices service.\n */\n #initNativeAssetIdentifiers(): void {\n if (this.#tokenPricesService.setNativeAssetIdentifiers) {\n const { nativeAssetIdentifiers } = this.messenger.call(\n 'NetworkEnablementController:getState',\n );\n this.#tokenPricesService.setNativeAssetIdentifiers(\n nativeAssetIdentifiers,\n );\n }\n }\n\n /**\n * Get the tokens for the given chain.\n *\n * @param chainId - The chain ID.\n * @returns The list of tokens addresses for the current chain\n */\n #getTokenAddresses(chainId: Hex): Hex[] {\n const getTokens = (allTokens: Record<Hex, { address: string }[]>) =>\n Object.values(allTokens ?? {}).flatMap((tokens) =>\n tokens.map(({ address }) => toChecksumHexAddress(address) as Hex),\n );\n\n const tokenAddresses = getTokens(this.#allTokens[chainId]);\n const detectedTokenAddresses = getTokens(this.#allDetectedTokens[chainId]);\n\n return [\n ...new Set([\n ...tokenAddresses,\n ...detectedTokenAddresses,\n getNativeTokenAddress(chainId),\n ]),\n ].sort();\n }\n\n /**\n * Allows controller to make active and passive polling requests\n */\n enable(): void {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from making network calls\n */\n disable(): void {\n this.#disabled = true;\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messenger.call(\n 'TokensController:getState',\n );\n\n return {\n allTokens,\n allDetectedTokens,\n };\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRates(\n chainIdAndNativeCurrency: ChainIdAndNativeCurrency[],\n ): Promise<void> {\n if (this.#disabled || this.#isDeprecated()) {\n return;\n }\n\n const marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {};\n const assetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n const unsupportedAssetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n for (const { chainId, nativeCurrency } of chainIdAndNativeCurrency) {\n if (this.#tokenPricesService.validateChainIdSupported(chainId)) {\n for (const tokenAddress of this.#getTokenAddresses(chainId)) {\n if (\n this.#tokenPricesService.validateCurrencySupported(nativeCurrency)\n ) {\n (assetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n } else {\n (unsupportedAssetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n }\n }\n }\n }\n\n const promises = [\n ...Object.entries(assetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ...Object.entries(unsupportedAssetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ];\n\n await Promise.allSettled(promises);\n\n const chainIds = new Set(\n Object.values(chainIdAndNativeCurrency).map((chain) => chain.chainId),\n );\n\n for (const chainId of chainIds) {\n if (!marketData[chainId]) {\n marketData[chainId] = {};\n }\n }\n\n if (Object.keys(marketData).length > 0) {\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...marketData,\n };\n });\n }\n }\n\n async #fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {},\n ) {\n return await reduceInBatchesSerially<\n { chainId: Hex; tokenAddress: Hex },\n Record<Hex, Record<Hex, MarketDataDetails>>\n >({\n values: assets,\n batchSize: TOKEN_PRICES_BATCH_SIZE,\n eachBatch: async (partialMarketData, assetsBatch) => {\n const batchMarketData = await this.#tokenPricesService.fetchTokenPrices(\n {\n assets: assetsBatch,\n currency,\n },\n );\n\n for (const tokenPrice of batchMarketData) {\n (partialMarketData[tokenPrice.chainId] ??= {})[\n tokenPrice.tokenAddress\n ] = tokenPrice;\n }\n\n return partialMarketData;\n },\n initialResult: marketData,\n });\n }\n\n async #fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>,\n ) {\n // Step -1: Then fetch all tracked tokens priced in USD\n const marketDataInUSD =\n await this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n 'usd', // Fallback currency when the native currency is not supported\n );\n\n // Formula: price_in_native = token_usd / native_usd\n const convertUSDToNative = (\n valueInUSD: number,\n nativeTokenPriceInUSD: number,\n ) => valueInUSD / nativeTokenPriceInUSD;\n\n // Step -2: Convert USD prices to native currency\n for (const [chainId, marketDataByTokenAddress] of Object.entries(\n marketDataInUSD,\n ) as [Hex, Record<Hex, MarketDataDetails>][]) {\n const nativeTokenPriceInUSD =\n marketDataByTokenAddress[getNativeTokenAddress(chainId)]?.price;\n\n // Return here if it's null, undefined or 0\n if (!nativeTokenPriceInUSD) {\n continue;\n }\n\n for (const [tokenAddress, tokenData] of Object.entries(\n marketDataByTokenAddress,\n ) as [Hex, MarketDataDetails][]) {\n (marketData[chainId] ??= {})[tokenAddress] = {\n ...tokenData,\n currency,\n price: convertUSDToNative(tokenData.price, nativeTokenPriceInUSD),\n marketCap: convertUSDToNative(\n tokenData.marketCap,\n nativeTokenPriceInUSD,\n ),\n allTimeHigh: convertUSDToNative(\n tokenData.allTimeHigh,\n nativeTokenPriceInUSD,\n ),\n allTimeLow: convertUSDToNative(\n tokenData.allTimeLow,\n nativeTokenPriceInUSD,\n ),\n totalVolume: convertUSDToNative(\n tokenData.totalVolume,\n nativeTokenPriceInUSD,\n ),\n high1d: convertUSDToNative(tokenData.high1d, nativeTokenPriceInUSD),\n low1d: convertUSDToNative(tokenData.low1d, nativeTokenPriceInUSD),\n dilutedMarketCap: convertUSDToNative(\n tokenData.dilutedMarketCap,\n nativeTokenPriceInUSD,\n ),\n };\n }\n }\n }\n\n /**\n * Updates token rates for the given networkClientId\n *\n * @param input - The input for the poll.\n * @param input.chainIds - The chain ids to poll token rates on.\n */\n async _executePoll({ chainIds }: TokenRatesPollingInput): Promise<void> {\n if (this.#isDeprecated()) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIdAndNativeCurrency = chainIds.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n }\n\n /**\n * Reset the controller state to the default state.\n */\n resetState() {\n this.update(() => {\n return getDefaultTokenRatesControllerState();\n });\n }\n}\n\nexport default TokenRatesController;\n"]}
|
|
1
|
+
{"version":3,"file":"TokenRatesController.mjs","sourceRoot":"","sources":["../src/TokenRatesController.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,OAAO,EAAE,oBAAoB,EAAE,mCAAmC;AAOlE,OAAO,EAAE,+BAA+B,EAAE,qCAAqC;;;AAI/E,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,yBAAqB;AAEhF,OAAO,EAAE,qBAAqB,EAAE,6CAAyC;AAkCzE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAsDhC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAgDrD,MAAM,4BAA4B,GAA6C;IAC7E,UAAU,EAAE;QACV,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAC9C,GAA8B,EAAE;IAC9B,OAAO;QACL,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC,CAAC;AAOJ;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,+BAA+B,EAIxE;IASC;;;;;;;;;OASG;IACH,YAAY,EACV,QAAQ,GAAG,gBAAgB,EAC3B,QAAQ,GAAG,KAAK,EAChB,kBAAkB,EAClB,SAAS,EACT,KAAK,GAON;QACC,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,mCAAmC,EAAE,EAAE,GAAG,KAAK,EAAE;YAC7D,QAAQ,EAAE,4BAA4B;SACvC,CAAC,CAAC;;QApCI,2DAAgD;QAEzD,iDAAmB;QAEnB,kDAA+C;QAE/C,0DAA+D;QAgC7D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,uBAAA,IAAI,4CAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,kCAAa,QAAQ,MAAA,CAAC;QAE1B,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,uBAAA,IAAI,uFAA0B,MAA9B,IAAI,CAA4B,CAAC;QAC1E,uBAAA,IAAI,mCAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,2CAAsB,iBAAiB,MAAA,CAAC;QAE5C,iGAAiG;QACjG,uBAAA,IAAI,yFAA4B,MAAhC,IAAI,CAA8B,CAAC;QAEnC,uBAAA,IAAI,2FAA8B,MAAlC,IAAI,CAAgC,CAAC;QAErC,uBAAA,IAAI,4FAA+B,MAAnC,IAAI,CAAiC,CAAC;IACxC,CAAC;IAuHD;;OAEG;IACH,MAAM;QACJ,uBAAA,IAAI,kCAAa,KAAK,MAAA,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,uBAAA,IAAI,kCAAa,IAAI,MAAA,CAAC;IACxB,CAAC;IAgBD;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CACvB,wBAAoD;QAEpD,IAAI,uBAAA,IAAI,sCAAU,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAgD,EAAE,CAAC;QACnE,MAAM,sBAAsB,GAMxB,EAAE,CAAC;QACP,MAAM,iCAAiC,GAMnC,EAAE,CAAC;QACP,KAAK,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,wBAAwB,EAAE,CAAC;YACnE,IAAI,uBAAA,IAAI,gDAAoB,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/D,KAAK,MAAM,YAAY,IAAI,uBAAA,IAAI,gFAAmB,MAAvB,IAAI,EAAoB,OAAO,CAAC,EAAE,CAAC;oBAC5D,IACE,uBAAA,IAAI,gDAAoB,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAClE,CAAC;wBACD,CAAC,sBAAsB,CAAC,cAAc,MAArC,sBAAsB,CAAC,cAAc,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC;4BACnD,OAAO;4BACP,YAAY;yBACb,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,CAAC,iCAAiC,CAAC,cAAc,MAAhD,iCAAiC,CAAC,cAAc,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC;4BAC9D,OAAO;4BACP,YAAY;yBACb,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAC3C,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,CAC3B,uBAAA,IAAI,iHAAoD,MAAxD,IAAI,EACF,MAAM,EACN,cAAc,EACd,UAAU,CACX,CACJ;YACD,GAAG,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,CACtD,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,CAC3B,uBAAA,IAAI,mHAAsD,MAA1D,IAAI,EACF,MAAM,EACN,cAAc,EACd,UAAU,CACX,CACJ;SACF,CAAC;QAEF,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CACtE,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,KAAK,CAAC,UAAU,GAAG;oBACjB,GAAG,KAAK,CAAC,UAAU;oBACnB,GAAG,UAAU;iBACd,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAuGD;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,EAAE,QAAQ,EAA0B;QACrD,MAAM,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC5D,4BAA4B,CAC7B,CAAC;QAEF,MAAM,wBAAwB,GAAG,QAAQ,CAAC,MAAM,CAE9C,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACjB,MAAM,oBAAoB,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CACX,oEAAoE,OAAO,EAAE,CAC9E,CAAC;gBACF,OAAO,GAAG,CAAC;YACb,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO;gBACP,cAAc,EAAE,oBAAoB,CAAC,cAAc;aACpD,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,OAAO,mCAAmC,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;CACF;;IApXG,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,8BAA8B;IAC9B,gFAAgF;IAChF,kEAAkE;IAClE,KAAK,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACzC,IAAI,uBAAA,IAAI,sCAAU,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC5D,4BAA4B,CAC7B,CAAC;QAEF,MAAM,QAAQ,GAAG;YACf,GAAG,IAAI,GAAG,CAAC;gBACT,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAClC,CAAC;SACM,CAAC;QAEX,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CACtC,CAAC,OAAO,EAAE,EAAE,CACV,CAAC,OAAO,CAAC,uBAAA,IAAI,uCAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC,OAAO,CACN,uBAAA,IAAI,+CAAmB,CAAC,OAAO,CAAC,EAChC,iBAAiB,CAAC,OAAO,CAAC,CAC3B,CACJ,CAAC;QAEF,uBAAA,IAAI,mCAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,2CAAsB,iBAAiB,MAAA,CAAC;QAE5C,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,MAAM,CAEtD,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YACjB,MAAM,oBAAoB,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CACX,oEAAoE,OAAO,EAAE,CAC9E,CAAC;gBACF,OAAO,GAAG,CAAC;YACb,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO;gBACP,cAAc,EAAE,oBAAoB,CAAC,cAAc;aACpD,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IAC3D,CAAC,EACD,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACnC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC;IAGC,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,+BAA+B,EAC/B,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAClB,oCAAoC;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IACE,KAAK,CAAC,EAAE,KAAK,QAAQ;gBACrB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gCAAgC,EAClD,CAAC;gBACD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAQ,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpB,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;IAOC,IAAI,uBAAA,IAAI,gDAAoB,CAAC,yBAAyB,EAAE,CAAC;QACvD,MAAM,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACpD,sCAAsC,CACvC,CAAC;QACF,uBAAA,IAAI,gDAAoB,CAAC,yBAAyB,CAChD,sBAAsB,CACvB,CAAC;IACJ,CAAC;AACH,CAAC,6FAQkB,OAAY;IAC7B,MAAM,SAAS,GAAG,CAAC,SAA6C,EAAE,EAAE,CAClE,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAQ,CAAC,CAClE,CAAC;IAEJ,MAAM,cAAc,GAAG,SAAS,CAAC,uBAAA,IAAI,uCAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,MAAM,sBAAsB,GAAG,SAAS,CAAC,uBAAA,IAAI,+CAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,cAAc;YACjB,GAAG,sBAAsB;YACzB,qBAAqB,CAAC,OAAO,CAAC;SAC/B,CAAC;KACH,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;IAoBC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC1D,2BAA2B,CAC5B,CAAC;IAEF,OAAO;QACL,SAAS;QACT,iBAAiB;KAClB,CAAC;AACJ,CAAC,6EA0FD,KAAK,mFACH,MAGG,EACH,QAAgB,EAChB,aAA0D,EAAE;IAE5D,OAAO,MAAM,uBAAuB,CAGlC;QACA,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,EAAE;;YAClD,MAAM,eAAe,GAAG,MAAM,uBAAA,IAAI,gDAAoB,CAAC,gBAAgB,CACrE;gBACE,MAAM,EAAE,WAAW;gBACnB,QAAQ;aACT,CACF,CAAC;YAEF,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;gBACzC,CAAC,iBAAiB,MAAC,UAAU,CAAC,OAAO,MAApC,iBAAiB,OAAyB,EAAE,EAAC,CAC5C,UAAU,CAAC,YAAY,CACxB,GAAG,UAAU,CAAC;YACjB,CAAC;YAED,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QACD,aAAa,EAAE,UAAU;KAC1B,CAAC,CAAC;AACL,CAAC,+EAED,KAAK,qFACH,MAGG,EACH,QAAgB,EAChB,UAAuD;IAEvD,uDAAuD;IACvD,MAAM,eAAe,GACnB,MAAM,uBAAA,IAAI,iHAAoD,MAAxD,IAAI,EACR,MAAM,EACN,KAAK,CACN,CAAC;IAEJ,oDAAoD;IACpD,MAAM,kBAAkB,GAAG,CACzB,UAAkB,EAClB,qBAA6B,EAC7B,EAAE,CAAC,UAAU,GAAG,qBAAqB,CAAC;IAExC,iDAAiD;IACjD,KAAK,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,IAAI,MAAM,CAAC,OAAO,CAC9D,eAAe,CAC2B,EAAE,CAAC;QAC7C,MAAM,qBAAqB,GACzB,wBAAwB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC;QAElE,2CAA2C;QAC3C,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CACpD,wBAAwB,CACK,EAAE,CAAC;YAChC,CAAC,UAAU,CAAC,OAAO,MAAlB,UAAU,CAAC,OAAO,IAAM,EAAE,EAAC,CAAC,YAAY,CAAC,GAAG;gBAC3C,GAAG,SAAS;gBACZ,QAAQ;gBACR,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC;gBACjE,SAAS,EAAE,kBAAkB,CAC3B,SAAS,CAAC,SAAS,EACnB,qBAAqB,CACtB;gBACD,WAAW,EAAE,kBAAkB,CAC7B,SAAS,CAAC,WAAW,EACrB,qBAAqB,CACtB;gBACD,UAAU,EAAE,kBAAkB,CAC5B,SAAS,CAAC,UAAU,EACpB,qBAAqB,CACtB;gBACD,WAAW,EAAE,kBAAkB,CAC7B,SAAS,CAAC,WAAW,EACrB,qBAAqB,CACtB;gBACD,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBACnE,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC;gBACjE,gBAAgB,EAAE,kBAAkB,CAClC,SAAS,CAAC,gBAAgB,EAC1B,qBAAqB,CACtB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AA2CH,eAAe,oBAAoB,CAAC","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NetworkEnablementControllerGetStateAction } from '@metamask/network-enablement-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { reduceInBatchesSerially, TOKEN_PRICES_BATCH_SIZE } from './assetsUtil';\nimport type { AbstractTokenPricesService } from './token-prices-service/abstract-token-prices-service';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport { TokenRwaData } from './token-service';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n TokensControllerState,\n} from './TokensController';\n\n/**\n * @type Token\n *\n * Token representation\n *\n * @property address - Hex address of the token contract\n * @property decimals - Number of decimals the token uses\n * @property symbol - Symbol of the token\n * @property aggregators - An array containing the token's aggregators\n * @property image - Image of the token, url or bit32 image\n * @property hasBalanceError - 'true' if there is an error while updating the token balance\n * @property isERC721 - 'true' if the token is a ERC721 token\n * @property name - Name of the token\n */\nexport type Token = {\n address: string;\n decimals: number;\n symbol: string;\n aggregators?: string[];\n image?: string;\n hasBalanceError?: boolean;\n isERC721?: boolean;\n name?: string;\n rwaData?: TokenRwaData;\n};\n\nconst DEFAULT_INTERVAL = 180000;\n\nexport type ContractExchangeRates = {\n [address: string]: number | undefined;\n};\n\nexport type MarketDataDetails = {\n tokenAddress: `0x${string}`;\n currency: string;\n allTimeHigh: number;\n allTimeLow: number;\n circulatingSupply: number;\n dilutedMarketCap: number;\n high1d: number;\n low1d: number;\n marketCap: number;\n marketCapPercentChange1d: number;\n price: number;\n priceChange1d: number;\n pricePercentChange1d: number;\n pricePercentChange1h: number;\n pricePercentChange1y: number;\n pricePercentChange7d: number;\n pricePercentChange14d: number;\n pricePercentChange30d: number;\n pricePercentChange200d: number;\n totalVolume: number;\n};\n\n/**\n * Represents a mapping of token contract addresses to their market data.\n */\nexport type ContractMarketData = Record<Hex, MarketDataDetails>;\n\ntype ChainIdAndNativeCurrency = {\n chainId: Hex;\n nativeCurrency: string;\n};\n\n/**\n * The external actions available to the {@link TokenRatesController}.\n */\nexport type AllowedActions =\n | TokensControllerGetStateAction\n | NetworkControllerGetStateAction\n | NetworkEnablementControllerGetStateAction;\n\n/**\n * The external events available to the {@link TokenRatesController}.\n */\nexport type AllowedEvents =\n | TokensControllerStateChangeEvent\n | NetworkControllerStateChangeEvent;\n\n/**\n * The name of the {@link TokenRatesController}.\n */\nexport const controllerName = 'TokenRatesController';\n\n/**\n * @type TokenRatesState\n *\n * Token rates controller state\n *\n * @property marketData - Market data for tokens, keyed by chain ID and then token contract address.\n */\nexport type TokenRatesControllerState = {\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>;\n};\n\n/**\n * The action that can be performed to get the state of the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The actions that can be performed using the {@link TokenRatesController}.\n */\nexport type TokenRatesControllerActions = TokenRatesControllerGetStateAction;\n\n/**\n * The event that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n TokenRatesControllerState\n>;\n\n/**\n * The events that {@link TokenRatesController} can emit.\n */\nexport type TokenRatesControllerEvents = TokenRatesControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link TokenRatesController} for communication.\n */\nexport type TokenRatesControllerMessenger = Messenger<\n typeof controllerName,\n TokenRatesControllerActions | AllowedActions,\n TokenRatesControllerEvents | AllowedEvents\n>;\n\nconst tokenRatesControllerMetadata: StateMetadata<TokenRatesControllerState> = {\n marketData: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\n/**\n * Get the default {@link TokenRatesController} state.\n *\n * @returns The default {@link TokenRatesController} state.\n */\nexport const getDefaultTokenRatesControllerState =\n (): TokenRatesControllerState => {\n return {\n marketData: {},\n };\n };\n\n/** The input to start polling for the {@link TokenRatesController} */\nexport type TokenRatesPollingInput = {\n chainIds: Hex[];\n};\n\n/**\n * Controller that passively polls on a set interval for token-to-fiat exchange rates\n * for tokens stored in the TokensController\n */\nexport class TokenRatesController extends StaticIntervalPollingController<TokenRatesPollingInput>()<\n typeof controllerName,\n TokenRatesControllerState,\n TokenRatesControllerMessenger\n> {\n readonly #tokenPricesService: AbstractTokenPricesService;\n\n #disabled: boolean;\n\n #allTokens: TokensControllerState['allTokens'];\n\n #allDetectedTokens: TokensControllerState['allDetectedTokens'];\n\n /**\n * Creates a TokenRatesController instance.\n *\n * @param options - The controller options.\n * @param options.interval - The polling interval in ms\n * @param options.disabled - Boolean to track if network requests are blocked\n * @param options.tokenPricesService - An object in charge of retrieving token price\n * @param options.messenger - The messenger instance for communication\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n interval = DEFAULT_INTERVAL,\n disabled = false,\n tokenPricesService,\n messenger,\n state,\n }: {\n interval?: number;\n disabled?: boolean;\n tokenPricesService: AbstractTokenPricesService;\n messenger: TokenRatesControllerMessenger;\n state?: Partial<TokenRatesControllerState>;\n }) {\n super({\n name: controllerName,\n messenger,\n state: { ...getDefaultTokenRatesControllerState(), ...state },\n metadata: tokenRatesControllerMetadata,\n });\n\n this.setIntervalLength(interval);\n this.#tokenPricesService = tokenPricesService;\n this.#disabled = disabled;\n\n const { allTokens, allDetectedTokens } = this.#getTokensControllerState();\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n // Set native asset identifiers from NetworkEnablementController for CAIP-19 native token lookups\n this.#initNativeAssetIdentifiers();\n\n this.#subscribeToTokensStateChange();\n\n this.#subscribeToNetworkStateChange();\n }\n\n #subscribeToTokensStateChange() {\n this.messenger.subscribe(\n 'TokensController:stateChange',\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async ({ allTokens, allDetectedTokens }) => {\n if (this.#disabled) {\n return;\n }\n\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIds = [\n ...new Set([\n ...Object.keys(allTokens),\n ...Object.keys(allDetectedTokens),\n ]),\n ] as Hex[];\n\n const chainIdsToUpdate = chainIds.filter(\n (chainId) =>\n !isEqual(this.#allTokens[chainId], allTokens[chainId]) ||\n !isEqual(\n this.#allDetectedTokens[chainId],\n allDetectedTokens[chainId],\n ),\n );\n\n this.#allTokens = allTokens;\n this.#allDetectedTokens = allDetectedTokens;\n\n const chainIdAndNativeCurrency = chainIdsToUpdate.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n },\n ({ allTokens, allDetectedTokens }) => {\n return { allTokens, allDetectedTokens };\n },\n );\n }\n\n #subscribeToNetworkStateChange() {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n (_state, patches) => {\n // Remove state for deleted networks\n for (const patch of patches) {\n if (\n patch.op === 'remove' &&\n patch.path[0] === 'networkConfigurationsByChainId'\n ) {\n const removedChainId = patch.path[1] as Hex;\n this.update((state) => {\n delete state.marketData[removedChainId];\n });\n }\n }\n },\n );\n }\n\n /**\n * Initialize the native asset identifiers from NetworkEnablementController.\n * This provides CAIP-19 native asset IDs for the token prices service.\n */\n #initNativeAssetIdentifiers(): void {\n if (this.#tokenPricesService.setNativeAssetIdentifiers) {\n const { nativeAssetIdentifiers } = this.messenger.call(\n 'NetworkEnablementController:getState',\n );\n this.#tokenPricesService.setNativeAssetIdentifiers(\n nativeAssetIdentifiers,\n );\n }\n }\n\n /**\n * Get the tokens for the given chain.\n *\n * @param chainId - The chain ID.\n * @returns The list of tokens addresses for the current chain\n */\n #getTokenAddresses(chainId: Hex): Hex[] {\n const getTokens = (allTokens: Record<Hex, { address: string }[]>) =>\n Object.values(allTokens ?? {}).flatMap((tokens) =>\n tokens.map(({ address }) => toChecksumHexAddress(address) as Hex),\n );\n\n const tokenAddresses = getTokens(this.#allTokens[chainId]);\n const detectedTokenAddresses = getTokens(this.#allDetectedTokens[chainId]);\n\n return [\n ...new Set([\n ...tokenAddresses,\n ...detectedTokenAddresses,\n getNativeTokenAddress(chainId),\n ]),\n ].sort();\n }\n\n /**\n * Allows controller to make active and passive polling requests\n */\n enable(): void {\n this.#disabled = false;\n }\n\n /**\n * Blocks controller from making network calls\n */\n disable(): void {\n this.#disabled = true;\n }\n\n #getTokensControllerState(): {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n } {\n const { allTokens, allDetectedTokens } = this.messenger.call(\n 'TokensController:getState',\n );\n\n return {\n allTokens,\n allDetectedTokens,\n };\n }\n\n /**\n * Updates exchange rates for all tokens.\n *\n * @param chainIdAndNativeCurrency - The chain ID and native currency.\n */\n async updateExchangeRates(\n chainIdAndNativeCurrency: ChainIdAndNativeCurrency[],\n ): Promise<void> {\n if (this.#disabled) {\n return;\n }\n\n const marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {};\n const assetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n const unsupportedAssetsByNativeCurrency: Record<\n string,\n {\n chainId: Hex;\n tokenAddress: Hex;\n }[]\n > = {};\n for (const { chainId, nativeCurrency } of chainIdAndNativeCurrency) {\n if (this.#tokenPricesService.validateChainIdSupported(chainId)) {\n for (const tokenAddress of this.#getTokenAddresses(chainId)) {\n if (\n this.#tokenPricesService.validateCurrencySupported(nativeCurrency)\n ) {\n (assetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n } else {\n (unsupportedAssetsByNativeCurrency[nativeCurrency] ??= []).push({\n chainId,\n tokenAddress,\n });\n }\n }\n }\n }\n\n const promises = [\n ...Object.entries(assetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ...Object.entries(unsupportedAssetsByNativeCurrency).map(\n ([nativeCurrency, assets]) =>\n this.#fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets,\n nativeCurrency,\n marketData,\n ),\n ),\n ];\n\n await Promise.allSettled(promises);\n\n const chainIds = new Set(\n Object.values(chainIdAndNativeCurrency).map((chain) => chain.chainId),\n );\n\n for (const chainId of chainIds) {\n if (!marketData[chainId]) {\n marketData[chainId] = {};\n }\n }\n\n if (Object.keys(marketData).length > 0) {\n this.update((state) => {\n state.marketData = {\n ...state.marketData,\n ...marketData,\n };\n });\n }\n }\n\n async #fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>> = {},\n ) {\n return await reduceInBatchesSerially<\n { chainId: Hex; tokenAddress: Hex },\n Record<Hex, Record<Hex, MarketDataDetails>>\n >({\n values: assets,\n batchSize: TOKEN_PRICES_BATCH_SIZE,\n eachBatch: async (partialMarketData, assetsBatch) => {\n const batchMarketData = await this.#tokenPricesService.fetchTokenPrices(\n {\n assets: assetsBatch,\n currency,\n },\n );\n\n for (const tokenPrice of batchMarketData) {\n (partialMarketData[tokenPrice.chainId] ??= {})[\n tokenPrice.tokenAddress\n ] = tokenPrice;\n }\n\n return partialMarketData;\n },\n initialResult: marketData,\n });\n }\n\n async #fetchAndMapExchangeRatesForUnsupportedNativeCurrency(\n assets: {\n chainId: Hex;\n tokenAddress: Hex;\n }[],\n currency: string,\n marketData: Record<Hex, Record<Hex, MarketDataDetails>>,\n ) {\n // Step -1: Then fetch all tracked tokens priced in USD\n const marketDataInUSD =\n await this.#fetchAndMapExchangeRatesForSupportedNativeCurrency(\n assets,\n 'usd', // Fallback currency when the native currency is not supported\n );\n\n // Formula: price_in_native = token_usd / native_usd\n const convertUSDToNative = (\n valueInUSD: number,\n nativeTokenPriceInUSD: number,\n ) => valueInUSD / nativeTokenPriceInUSD;\n\n // Step -2: Convert USD prices to native currency\n for (const [chainId, marketDataByTokenAddress] of Object.entries(\n marketDataInUSD,\n ) as [Hex, Record<Hex, MarketDataDetails>][]) {\n const nativeTokenPriceInUSD =\n marketDataByTokenAddress[getNativeTokenAddress(chainId)]?.price;\n\n // Return here if it's null, undefined or 0\n if (!nativeTokenPriceInUSD) {\n continue;\n }\n\n for (const [tokenAddress, tokenData] of Object.entries(\n marketDataByTokenAddress,\n ) as [Hex, MarketDataDetails][]) {\n (marketData[chainId] ??= {})[tokenAddress] = {\n ...tokenData,\n currency,\n price: convertUSDToNative(tokenData.price, nativeTokenPriceInUSD),\n marketCap: convertUSDToNative(\n tokenData.marketCap,\n nativeTokenPriceInUSD,\n ),\n allTimeHigh: convertUSDToNative(\n tokenData.allTimeHigh,\n nativeTokenPriceInUSD,\n ),\n allTimeLow: convertUSDToNative(\n tokenData.allTimeLow,\n nativeTokenPriceInUSD,\n ),\n totalVolume: convertUSDToNative(\n tokenData.totalVolume,\n nativeTokenPriceInUSD,\n ),\n high1d: convertUSDToNative(tokenData.high1d, nativeTokenPriceInUSD),\n low1d: convertUSDToNative(tokenData.low1d, nativeTokenPriceInUSD),\n dilutedMarketCap: convertUSDToNative(\n tokenData.dilutedMarketCap,\n nativeTokenPriceInUSD,\n ),\n };\n }\n }\n }\n\n /**\n * Updates token rates for the given networkClientId\n *\n * @param input - The input for the poll.\n * @param input.chainIds - The chain ids to poll token rates on.\n */\n async _executePoll({ chainIds }: TokenRatesPollingInput): Promise<void> {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n\n const chainIdAndNativeCurrency = chainIds.reduce<\n { chainId: Hex; nativeCurrency: string }[]\n >((acc, chainId) => {\n const networkConfiguration = networkConfigurationsByChainId[chainId];\n if (!networkConfiguration) {\n console.error(\n `TokenRatesController: No network configuration found for chainId ${chainId}`,\n );\n return acc;\n }\n acc.push({\n chainId,\n nativeCurrency: networkConfiguration.nativeCurrency,\n });\n return acc;\n }, []);\n\n await this.updateExchangeRates(chainIdAndNativeCurrency);\n }\n\n /**\n * Reset the controller state to the default state.\n */\n resetState() {\n this.update(() => {\n return getDefaultTokenRatesControllerState();\n });\n }\n}\n\nexport default TokenRatesController;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/assets-controllers",
|
|
3
|
-
"version": "108.5.0-preview-
|
|
3
|
+
"version": "108.5.0-preview-a3d867de5",
|
|
4
4
|
"description": "Controllers which manage interactions involving ERC-20, ERC-721, and ERC-1155 tokens (including NFTs)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"@metamask/snaps-sdk": "^11.0.0",
|
|
86
86
|
"@metamask/snaps-utils": "^12.1.2",
|
|
87
87
|
"@metamask/storage-service": "^1.0.1",
|
|
88
|
-
"@metamask/transaction-controller": "^
|
|
88
|
+
"@metamask/transaction-controller": "^66.0.1",
|
|
89
89
|
"@metamask/utils": "^11.9.0",
|
|
90
90
|
"@tanstack/query-core": "^5.62.16",
|
|
91
91
|
"@types/bn.js": "^5.1.5",
|