@metamask/assets-controllers 50.0.0 → 51.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs +43 -43
  3. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -1
  4. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts +19 -19
  5. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts +19 -19
  6. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs +41 -41
  7. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -1
  8. package/dist/MultichainAssetsRatesController/index.cjs +2 -2
  9. package/dist/MultichainAssetsRatesController/index.cjs.map +1 -1
  10. package/dist/MultichainAssetsRatesController/index.d.cts +1 -1
  11. package/dist/MultichainAssetsRatesController/index.d.mts +1 -1
  12. package/dist/MultichainAssetsRatesController/index.mjs +1 -1
  13. package/dist/MultichainAssetsRatesController/index.mjs.map +1 -1
  14. package/dist/RatesController/RatesController.cjs +1 -0
  15. package/dist/RatesController/RatesController.cjs.map +1 -1
  16. package/dist/RatesController/RatesController.d.cts.map +1 -1
  17. package/dist/RatesController/RatesController.d.mts.map +1 -1
  18. package/dist/RatesController/RatesController.mjs +1 -0
  19. package/dist/RatesController/RatesController.mjs.map +1 -1
  20. package/dist/index.cjs +2 -2
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +1 -1
  23. package/dist/index.d.mts +1 -1
  24. package/dist/index.mjs +1 -1
  25. package/dist/index.mjs.map +1 -1
  26. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [51.0.1]
11
+
12
+ ### Changed
13
+
14
+ - Bump `@metamask/keyring-api"` from `^17.0.0` to `^17.2.0` ([#5366](https://github.com/MetaMask/core/pull/5366))
15
+
16
+ ## [51.0.0]
17
+
18
+ ### Changed
19
+
20
+ - **BREAKING:** Rename `MultiChainAssetsRatesController` to `MultichainAssetsRatesController` ([#5354](https://github.com/MetaMask/core/pull/5354))
21
+ - Bump `@metamask/utils` from `^11.1.0` to `^11.2.0` ([#5301](https://github.com/MetaMask/core/pull/5301))
22
+
23
+ ### Fixed
24
+
25
+ - Resolved an issue where rate polling would only begin after the default 3-minute interval by manually triggering a rate update upon initialization, ensuring an immediate refresh for a better user experience ([#5364](https://github.com/MetaMask/core/pull/5364))
26
+
10
27
  ## [50.0.0]
11
28
 
12
29
  ### Changed
@@ -1405,7 +1422,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1405
1422
 
1406
1423
  - Use Ethers for AssetsContractController ([#845](https://github.com/MetaMask/core/pull/845))
1407
1424
 
1408
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@50.0.0...HEAD
1425
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@51.0.1...HEAD
1426
+ [51.0.1]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@51.0.0...@metamask/assets-controllers@51.0.1
1427
+ [51.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@50.0.0...@metamask/assets-controllers@51.0.0
1409
1428
  [50.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@49.0.0...@metamask/assets-controllers@50.0.0
1410
1429
  [49.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@48.0.0...@metamask/assets-controllers@49.0.0
1411
1430
  [48.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@47.0.0...@metamask/assets-controllers@48.0.0
@@ -10,18 +10,18 @@ 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 _MultiChainAssetsRatesController_instances, _MultiChainAssetsRatesController_mutex, _MultiChainAssetsRatesController_currentCurrency, _MultiChainAssetsRatesController_accountsAssets, _MultiChainAssetsRatesController_isUnlocked, _MultiChainAssetsRatesController_isNonEvmAccount, _MultiChainAssetsRatesController_listMultichainAccounts, _MultiChainAssetsRatesController_listAccounts, _MultiChainAssetsRatesController_getAssetsForAccount, _MultiChainAssetsRatesController_buildConversions, _MultiChainAssetsRatesController_flattenRates, _MultiChainAssetsRatesController_buildUpdatedRates, _MultiChainAssetsRatesController_applyUpdatedRates, _MultiChainAssetsRatesController_handleSnapRequest;
13
+ var _MultichainAssetsRatesController_instances, _MultichainAssetsRatesController_mutex, _MultichainAssetsRatesController_currentCurrency, _MultichainAssetsRatesController_accountsAssets, _MultichainAssetsRatesController_isUnlocked, _MultichainAssetsRatesController_isNonEvmAccount, _MultichainAssetsRatesController_listMultichainAccounts, _MultichainAssetsRatesController_listAccounts, _MultichainAssetsRatesController_getAssetsForAccount, _MultichainAssetsRatesController_buildConversions, _MultichainAssetsRatesController_flattenRates, _MultichainAssetsRatesController_buildUpdatedRates, _MultichainAssetsRatesController_applyUpdatedRates, _MultichainAssetsRatesController_handleSnapRequest;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.MultiChainAssetsRatesController = exports.getDefaultMultichainAssetsRatesControllerState = void 0;
15
+ exports.MultichainAssetsRatesController = exports.getDefaultMultichainAssetsRatesControllerState = void 0;
16
16
  const keyring_api_1 = require("@metamask/keyring-api");
17
17
  const polling_controller_1 = require("@metamask/polling-controller");
18
18
  const snaps_utils_1 = require("@metamask/snaps-utils");
19
19
  const async_mutex_1 = require("async-mutex");
20
20
  const constant_1 = require("./constant.cjs");
21
21
  /**
22
- * The name of the MultiChainAssetsRatesController.
22
+ * The name of the MultichainAssetsRatesController.
23
23
  */
24
- const controllerName = 'MultiChainAssetsRatesController';
24
+ const controllerName = 'MultichainAssetsRatesController';
25
25
  /**
26
26
  * Constructs the default {@link MultichainAssetsRatesController} state. This allows
27
27
  * consumers to provide a partial state object when initializing the controller
@@ -42,9 +42,9 @@ const metadata = {
42
42
  *
43
43
  * This controller polls for token conversion rates and updates its state.
44
44
  */
45
- class MultiChainAssetsRatesController extends (0, polling_controller_1.StaticIntervalPollingController)() {
45
+ class MultichainAssetsRatesController extends (0, polling_controller_1.StaticIntervalPollingController)() {
46
46
  /**
47
- * Creates an instance of MultiChainAssetsRatesController.
47
+ * Creates an instance of MultichainAssetsRatesController.
48
48
  *
49
49
  * @param options - Constructor options.
50
50
  * @param options.interval - The polling interval in milliseconds.
@@ -62,27 +62,27 @@ class MultiChainAssetsRatesController extends (0, polling_controller_1.StaticInt
62
62
  },
63
63
  metadata,
64
64
  });
65
- _MultiChainAssetsRatesController_instances.add(this);
66
- _MultiChainAssetsRatesController_mutex.set(this, new async_mutex_1.Mutex());
67
- _MultiChainAssetsRatesController_currentCurrency.set(this, void 0);
68
- _MultiChainAssetsRatesController_accountsAssets.set(this, void 0);
69
- _MultiChainAssetsRatesController_isUnlocked.set(this, true);
65
+ _MultichainAssetsRatesController_instances.add(this);
66
+ _MultichainAssetsRatesController_mutex.set(this, new async_mutex_1.Mutex());
67
+ _MultichainAssetsRatesController_currentCurrency.set(this, void 0);
68
+ _MultichainAssetsRatesController_accountsAssets.set(this, void 0);
69
+ _MultichainAssetsRatesController_isUnlocked.set(this, true);
70
70
  this.setIntervalLength(interval);
71
71
  // Subscribe to keyring lock/unlock events.
72
72
  this.messagingSystem.subscribe('KeyringController:lock', () => {
73
- __classPrivateFieldSet(this, _MultiChainAssetsRatesController_isUnlocked, false, "f");
73
+ __classPrivateFieldSet(this, _MultichainAssetsRatesController_isUnlocked, false, "f");
74
74
  });
75
75
  this.messagingSystem.subscribe('KeyringController:unlock', () => {
76
- __classPrivateFieldSet(this, _MultiChainAssetsRatesController_isUnlocked, true, "f");
76
+ __classPrivateFieldSet(this, _MultichainAssetsRatesController_isUnlocked, true, "f");
77
77
  });
78
- (_a = this, { accountsAssets: ({ set value(_c) { __classPrivateFieldSet(_a, _MultiChainAssetsRatesController_accountsAssets, _c, "f"); } }).value } = this.messagingSystem.call('MultichainAssetsController:getState'));
79
- (_b = this, { currentCurrency: ({ set value(_c) { __classPrivateFieldSet(_b, _MultiChainAssetsRatesController_currentCurrency, _c, "f"); } }).value } = this.messagingSystem.call('CurrencyRateController:getState'));
78
+ (_a = this, { accountsAssets: ({ set value(_c) { __classPrivateFieldSet(_a, _MultichainAssetsRatesController_accountsAssets, _c, "f"); } }).value } = this.messagingSystem.call('MultichainAssetsController:getState'));
79
+ (_b = this, { currentCurrency: ({ set value(_c) { __classPrivateFieldSet(_b, _MultichainAssetsRatesController_currentCurrency, _c, "f"); } }).value } = this.messagingSystem.call('CurrencyRateController:getState'));
80
80
  this.messagingSystem.subscribe('CurrencyRateController:stateChange', async (currencyRatesState) => {
81
- __classPrivateFieldSet(this, _MultiChainAssetsRatesController_currentCurrency, currencyRatesState.currentCurrency, "f");
81
+ __classPrivateFieldSet(this, _MultichainAssetsRatesController_currentCurrency, currencyRatesState.currentCurrency, "f");
82
82
  await this.updateAssetsRates();
83
83
  });
84
- this.messagingSystem.subscribe('MultichainAssetsController:stateChange', async (multiChainAssetsState) => {
85
- __classPrivateFieldSet(this, _MultiChainAssetsRatesController_accountsAssets, multiChainAssetsState.accountsAssets, "f");
84
+ this.messagingSystem.subscribe('MultichainAssetsController:stateChange', async (multichainAssetsState) => {
85
+ __classPrivateFieldSet(this, _MultichainAssetsRatesController_accountsAssets, multichainAssetsState.accountsAssets, "f");
86
86
  await this.updateAssetsRates();
87
87
  });
88
88
  }
@@ -100,7 +100,7 @@ class MultiChainAssetsRatesController extends (0, polling_controller_1.StaticInt
100
100
  * @returns True if the keyring is unlocked; otherwise, false.
101
101
  */
102
102
  get isActive() {
103
- return __classPrivateFieldGet(this, _MultiChainAssetsRatesController_isUnlocked, "f");
103
+ return __classPrivateFieldGet(this, _MultichainAssetsRatesController_isUnlocked, "f");
104
104
  }
105
105
  /**
106
106
  * Updates token conversion rates for each non-EVM account.
@@ -108,79 +108,79 @@ class MultiChainAssetsRatesController extends (0, polling_controller_1.StaticInt
108
108
  * @returns A promise that resolves when the rates are updated.
109
109
  */
110
110
  async updateAssetsRates() {
111
- const releaseLock = await __classPrivateFieldGet(this, _MultiChainAssetsRatesController_mutex, "f").acquire();
111
+ const releaseLock = await __classPrivateFieldGet(this, _MultichainAssetsRatesController_mutex, "f").acquire();
112
112
  return (async () => {
113
113
  if (!this.isActive) {
114
114
  return;
115
115
  }
116
- const accounts = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_listAccounts).call(this);
116
+ const accounts = __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_listAccounts).call(this);
117
117
  for (const account of accounts) {
118
- const assets = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_getAssetsForAccount).call(this, account.id);
118
+ const assets = __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_getAssetsForAccount).call(this, account.id);
119
119
  // Build the conversions array
120
- const conversions = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_buildConversions).call(this, assets);
120
+ const conversions = __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_buildConversions).call(this, assets);
121
121
  // Retrieve rates from Snap
122
- const accountRates = await __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_handleSnapRequest).call(this, {
122
+ const accountRates = await __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_handleSnapRequest).call(this, {
123
123
  snapId: account?.metadata.snap?.id,
124
124
  handler: snaps_utils_1.HandlerType.OnAssetsConversion,
125
125
  params: conversions,
126
126
  });
127
127
  // Flatten nested rates if needed
128
- const flattenedRates = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_flattenRates).call(this, accountRates);
128
+ const flattenedRates = __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_flattenRates).call(this, accountRates);
129
129
  // Build the updatedRates object for these assets
130
- const updatedRates = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_buildUpdatedRates).call(this, assets, flattenedRates);
130
+ const updatedRates = __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_buildUpdatedRates).call(this, assets, flattenedRates);
131
131
  // Apply these updated rates to controller state
132
- __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_applyUpdatedRates).call(this, updatedRates);
132
+ __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_applyUpdatedRates).call(this, updatedRates);
133
133
  }
134
134
  })().finally(() => {
135
135
  releaseLock();
136
136
  });
137
137
  }
138
138
  }
139
- exports.MultiChainAssetsRatesController = MultiChainAssetsRatesController;
140
- _MultiChainAssetsRatesController_mutex = new WeakMap(), _MultiChainAssetsRatesController_currentCurrency = new WeakMap(), _MultiChainAssetsRatesController_accountsAssets = new WeakMap(), _MultiChainAssetsRatesController_isUnlocked = new WeakMap(), _MultiChainAssetsRatesController_instances = new WeakSet(), _MultiChainAssetsRatesController_isNonEvmAccount = function _MultiChainAssetsRatesController_isNonEvmAccount(account) {
139
+ exports.MultichainAssetsRatesController = MultichainAssetsRatesController;
140
+ _MultichainAssetsRatesController_mutex = new WeakMap(), _MultichainAssetsRatesController_currentCurrency = new WeakMap(), _MultichainAssetsRatesController_accountsAssets = new WeakMap(), _MultichainAssetsRatesController_isUnlocked = new WeakMap(), _MultichainAssetsRatesController_instances = new WeakSet(), _MultichainAssetsRatesController_isNonEvmAccount = function _MultichainAssetsRatesController_isNonEvmAccount(account) {
141
141
  return (!(0, keyring_api_1.isEvmAccountType)(account.type) && account.metadata.snap !== undefined);
142
- }, _MultiChainAssetsRatesController_listMultichainAccounts = function _MultiChainAssetsRatesController_listMultichainAccounts() {
142
+ }, _MultichainAssetsRatesController_listMultichainAccounts = function _MultichainAssetsRatesController_listMultichainAccounts() {
143
143
  return this.messagingSystem.call('AccountsController:listMultichainAccounts');
144
- }, _MultiChainAssetsRatesController_listAccounts = function _MultiChainAssetsRatesController_listAccounts() {
145
- const accounts = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_listMultichainAccounts).call(this);
146
- return accounts.filter((account) => __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_isNonEvmAccount).call(this, account));
147
- }, _MultiChainAssetsRatesController_getAssetsForAccount = function _MultiChainAssetsRatesController_getAssetsForAccount(accountId) {
148
- return __classPrivateFieldGet(this, _MultiChainAssetsRatesController_accountsAssets, "f")?.[accountId] ?? [];
149
- }, _MultiChainAssetsRatesController_buildConversions = function _MultiChainAssetsRatesController_buildConversions(assets) {
150
- const currency = constant_1.MAP_CAIP_CURRENCIES[__classPrivateFieldGet(this, _MultiChainAssetsRatesController_currentCurrency, "f")] ?? constant_1.MAP_CAIP_CURRENCIES.usd;
144
+ }, _MultichainAssetsRatesController_listAccounts = function _MultichainAssetsRatesController_listAccounts() {
145
+ const accounts = __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_listMultichainAccounts).call(this);
146
+ return accounts.filter((account) => __classPrivateFieldGet(this, _MultichainAssetsRatesController_instances, "m", _MultichainAssetsRatesController_isNonEvmAccount).call(this, account));
147
+ }, _MultichainAssetsRatesController_getAssetsForAccount = function _MultichainAssetsRatesController_getAssetsForAccount(accountId) {
148
+ return __classPrivateFieldGet(this, _MultichainAssetsRatesController_accountsAssets, "f")?.[accountId] ?? [];
149
+ }, _MultichainAssetsRatesController_buildConversions = function _MultichainAssetsRatesController_buildConversions(assets) {
150
+ const currency = constant_1.MAP_CAIP_CURRENCIES[__classPrivateFieldGet(this, _MultichainAssetsRatesController_currentCurrency, "f")] ?? constant_1.MAP_CAIP_CURRENCIES.usd;
151
151
  return {
152
152
  conversions: assets.map((asset) => ({
153
153
  from: asset,
154
154
  to: currency,
155
155
  })),
156
156
  };
157
- }, _MultiChainAssetsRatesController_flattenRates = function _MultiChainAssetsRatesController_flattenRates(assetsConversionResponse) {
157
+ }, _MultichainAssetsRatesController_flattenRates = function _MultichainAssetsRatesController_flattenRates(assetsConversionResponse) {
158
158
  const { conversionRates } = assetsConversionResponse;
159
159
  return Object.fromEntries(Object.entries(conversionRates).map(([asset, nestedObj]) => {
160
160
  // e.g., nestedObj might look like: { "swift:0/iso4217:EUR": { rate, conversionTime } }
161
161
  const singleValue = Object.values(nestedObj)[0];
162
162
  return [asset, singleValue];
163
163
  }));
164
- }, _MultiChainAssetsRatesController_buildUpdatedRates = function _MultiChainAssetsRatesController_buildUpdatedRates(assets, flattenedRates) {
164
+ }, _MultichainAssetsRatesController_buildUpdatedRates = function _MultichainAssetsRatesController_buildUpdatedRates(assets, flattenedRates) {
165
165
  const updatedRates = {};
166
166
  for (const asset of assets) {
167
167
  if (flattenedRates[asset]) {
168
168
  updatedRates[asset] = {
169
169
  ...flattenedRates[asset],
170
- currency: constant_1.MAP_CAIP_CURRENCIES[__classPrivateFieldGet(this, _MultiChainAssetsRatesController_currentCurrency, "f")] ??
170
+ currency: constant_1.MAP_CAIP_CURRENCIES[__classPrivateFieldGet(this, _MultichainAssetsRatesController_currentCurrency, "f")] ??
171
171
  constant_1.MAP_CAIP_CURRENCIES.usd,
172
172
  };
173
173
  }
174
174
  }
175
175
  return updatedRates;
176
- }, _MultiChainAssetsRatesController_applyUpdatedRates = function _MultiChainAssetsRatesController_applyUpdatedRates(updatedRates) {
176
+ }, _MultichainAssetsRatesController_applyUpdatedRates = function _MultichainAssetsRatesController_applyUpdatedRates(updatedRates) {
177
177
  this.update((state) => {
178
178
  state.conversionRates = {
179
179
  ...state.conversionRates,
180
180
  ...updatedRates,
181
181
  };
182
182
  });
183
- }, _MultiChainAssetsRatesController_handleSnapRequest =
183
+ }, _MultichainAssetsRatesController_handleSnapRequest =
184
184
  /**
185
185
  * Forwards a Snap request to the SnapController.
186
186
  *
@@ -190,7 +190,7 @@ _MultiChainAssetsRatesController_mutex = new WeakMap(), _MultiChainAssetsRatesCo
190
190
  * @param args.params - The asset conversions.
191
191
  * @returns A promise that resolves with the account rates.
192
192
  */
193
- async function _MultiChainAssetsRatesController_handleSnapRequest({ snapId, handler, params, }) {
193
+ async function _MultichainAssetsRatesController_handleSnapRequest({ snapId, handler, params, }) {
194
194
  return this.messagingSystem.call('SnapController:handleRequest', {
195
195
  snapId,
196
196
  origin: 'metamask',
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAssetsRatesController.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/MultichainAssetsRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerListMultichainAccountsAction,\n AccountsControllerAccountAddedEvent,\n} from '@metamask/accounts-controller';\nimport type {\n RestrictedMessenger,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { type CaipAssetType, isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\nimport type {\n SnapId,\n AssetConversion,\n OnAssetsConversionArguments,\n OnAssetsConversionResponse,\n} from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport { Mutex } from 'async-mutex';\nimport type { Draft } from 'immer';\n\nimport { MAP_CAIP_CURRENCIES } from './constant';\nimport type {\n CurrencyRateState,\n CurrencyRateStateChange,\n GetCurrencyRateState,\n} from '../CurrencyRateController';\nimport type {\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerState,\n MultichainAssetsControllerStateChangeEvent,\n} from '../MultichainAssetsController';\n\n/**\n * The name of the MultiChainAssetsRatesController.\n */\nconst controllerName = 'MultiChainAssetsRatesController';\n\n/**\n * State used by the MultiChainAssetsRatesController to cache token conversion rates.\n */\nexport type MultichainAssetsRatesControllerState = {\n conversionRates: Record<CaipAssetType, AssetConversion>;\n};\n\n/**\n * Returns the state of the MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsRatesControllerState\n >;\n\n/**\n * Action to update the rates of all supported tokens.\n */\nexport type MultichainAssetsRatesControllerUpdateRatesAction = {\n type: `${typeof controllerName}:updateAssetsRates`;\n handler: MultiChainAssetsRatesController['updateAssetsRates'];\n};\n\n/**\n * Constructs the default {@link MultichainAssetsRatesController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link MultichainAssetsRatesController} state.\n */\nexport function getDefaultMultichainAssetsRatesControllerState(): MultichainAssetsRatesControllerState {\n return { conversionRates: {} };\n}\n\n/**\n * Event emitted when the state of the MultiChainAssetsRatesController changes.\n */\nexport type MultichainAssetsRatesControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsRatesControllerState\n >;\n\n/**\n * Actions exposed by the MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerActions =\n | MultichainAssetsRatesControllerGetStateAction\n | MultichainAssetsRatesControllerUpdateRatesAction;\n\n/**\n * Events emitted by MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerEvents =\n MultichainAssetsRatesControllerStateChange;\n\n/**\n * Actions that this controller is allowed to call.\n */\nexport type AllowedActions =\n | HandleSnapRequest\n | AccountsControllerListMultichainAccountsAction\n | GetCurrencyRateState\n | MultichainAssetsControllerGetStateAction;\n/**\n * Events that this controller is allowed to subscribe to.\n */\nexport type AllowedEvents =\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | AccountsControllerAccountAddedEvent\n | CurrencyRateStateChange\n | MultichainAssetsControllerStateChangeEvent;\n\n/**\n * Messenger type for the MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n MultichainAssetsRatesControllerActions | AllowedActions,\n MultichainAssetsRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * The input for starting polling in MultiChainAssetsRatesController.\n */\nexport type MultiChainAssetsRatesPollingInput = {\n accountId: string;\n};\n\nconst metadata = {\n conversionRates: { persist: true, anonymous: true },\n};\n\n/**\n * Controller that manages multichain token conversion rates.\n *\n * This controller polls for token conversion rates and updates its state.\n */\nexport class MultiChainAssetsRatesController extends StaticIntervalPollingController<MultiChainAssetsRatesPollingInput>()<\n typeof controllerName,\n MultichainAssetsRatesControllerState,\n MultichainAssetsRatesControllerMessenger\n> {\n readonly #mutex = new Mutex();\n\n #currentCurrency: CurrencyRateState['currentCurrency'];\n\n #accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n\n #isUnlocked = true;\n\n /**\n * Creates an instance of MultiChainAssetsRatesController.\n *\n * @param options - Constructor options.\n * @param options.interval - The polling interval in milliseconds.\n * @param options.state - The initial state.\n * @param options.messenger - A reference to the messaging system.\n */\n constructor({\n interval = 18000,\n state = {},\n messenger,\n }: {\n interval?: number;\n state?: Partial<MultichainAssetsRatesControllerState>;\n messenger: MultichainAssetsRatesControllerMessenger;\n }) {\n super({\n name: controllerName,\n messenger,\n state: {\n ...getDefaultMultichainAssetsRatesControllerState(),\n ...state,\n },\n metadata,\n });\n\n this.setIntervalLength(interval);\n\n // Subscribe to keyring lock/unlock events.\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n });\n\n ({ accountsAssets: this.#accountsAssets } = this.messagingSystem.call(\n 'MultichainAssetsController:getState',\n ));\n\n ({ currentCurrency: this.#currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n ));\n\n this.messagingSystem.subscribe(\n 'CurrencyRateController:stateChange',\n async (currencyRatesState: CurrencyRateState) => {\n this.#currentCurrency = currencyRatesState.currentCurrency;\n await this.updateAssetsRates();\n },\n );\n\n this.messagingSystem.subscribe(\n 'MultichainAssetsController:stateChange',\n async (multiChainAssetsState: MultichainAssetsControllerState) => {\n this.#accountsAssets = multiChainAssetsState.accountsAssets;\n await this.updateAssetsRates();\n },\n );\n }\n\n /**\n * Executes a poll by updating token conversion rates for the current account.\n *\n * @returns A promise that resolves when the polling completes.\n */\n async _executePoll(): Promise<void> {\n await this.updateAssetsRates();\n }\n\n /**\n * Determines whether the controller is active.\n *\n * @returns True if the keyring is unlocked; otherwise, false.\n */\n get isActive(): boolean {\n return this.#isUnlocked;\n }\n\n /**\n * Checks if an account is a non-EVM account with a Snap.\n *\n * @param account - The account to check.\n * @returns True if the account is non-EVM and has Snap metadata; otherwise, false.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) && account.metadata.snap !== undefined\n );\n }\n\n /**\n * Retrieves all multichain accounts from the AccountsController.\n *\n * @returns An array of internal accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n\n /**\n * Filters and returns non-EVM accounts that should have balances.\n *\n * @returns An array of non-EVM internal accounts.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Updates token conversion rates for each non-EVM account.\n *\n * @returns A promise that resolves when the rates are updated.\n */\n async updateAssetsRates(): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n return (async () => {\n if (!this.isActive) {\n return;\n }\n const accounts = this.#listAccounts();\n\n for (const account of accounts) {\n const assets = this.#getAssetsForAccount(account.id);\n\n // Build the conversions array\n const conversions = this.#buildConversions(assets);\n\n // Retrieve rates from Snap\n const accountRates = await this.#handleSnapRequest({\n snapId: account?.metadata.snap?.id as SnapId,\n handler: HandlerType.OnAssetsConversion,\n params: conversions,\n });\n\n // Flatten nested rates if needed\n const flattenedRates = this.#flattenRates(accountRates);\n\n // Build the updatedRates object for these assets\n const updatedRates = this.#buildUpdatedRates(assets, flattenedRates);\n // Apply these updated rates to controller state\n this.#applyUpdatedRates(updatedRates);\n }\n })().finally(() => {\n releaseLock();\n });\n }\n\n /**\n * Returns the array of CAIP-19 assets for the given account ID.\n * If none are found, returns an empty array.\n *\n * @param accountId - The account ID to get the assets for.\n * @returns An array of CAIP-19 assets.\n */\n #getAssetsForAccount(accountId: string): CaipAssetType[] {\n return this.#accountsAssets?.[accountId] ?? [];\n }\n\n /**\n * Builds a conversions array (from each asset → the current currency).\n *\n * @param assets - The assets to build the conversions for.\n * @returns A conversions array.\n */\n #buildConversions(assets: CaipAssetType[]): OnAssetsConversionArguments {\n const currency =\n MAP_CAIP_CURRENCIES[this.#currentCurrency] ?? MAP_CAIP_CURRENCIES.usd;\n return {\n conversions: assets.map((asset) => ({\n from: asset,\n to: currency,\n })),\n };\n }\n\n /**\n * Flattens any nested structure in the conversion rates returned by Snap.\n *\n * @param assetsConversionResponse - The conversion rates to flatten.\n * @returns A flattened rates object.\n */\n #flattenRates(\n assetsConversionResponse: OnAssetsConversionResponse,\n ): Record<CaipAssetType, AssetConversion | null> {\n const { conversionRates } = assetsConversionResponse;\n\n return Object.fromEntries(\n Object.entries(conversionRates).map(([asset, nestedObj]) => {\n // e.g., nestedObj might look like: { \"swift:0/iso4217:EUR\": { rate, conversionTime } }\n const singleValue = Object.values(nestedObj)[0];\n return [asset, singleValue];\n }),\n );\n }\n\n /**\n * Builds a rates object that covers all given assets, ensuring that\n * any asset not returned by Snap is set to null for both `rate` and `conversionTime`.\n *\n * @param assets - The assets to build the rates for.\n * @param flattenedRates - The rates to merge.\n * @returns A rates object that covers all given assets.\n */\n #buildUpdatedRates(\n assets: CaipAssetType[],\n flattenedRates: Record<CaipAssetType, AssetConversion | null>,\n ): Record<string, AssetConversion & { currency: CaipAssetType }> {\n const updatedRates: Record<\n CaipAssetType,\n AssetConversion & { currency: CaipAssetType }\n > = {};\n\n for (const asset of assets) {\n if (flattenedRates[asset]) {\n updatedRates[asset] = {\n ...(flattenedRates[asset] as AssetConversion),\n currency:\n MAP_CAIP_CURRENCIES[this.#currentCurrency] ??\n MAP_CAIP_CURRENCIES.usd,\n };\n }\n }\n return updatedRates;\n }\n\n /**\n * Merges the new rates into the controller’s state.\n *\n * @param updatedRates - The new rates to merge.\n */\n #applyUpdatedRates(\n updatedRates: Record<\n string,\n { rate: string | null; conversionTime: number | null }\n >,\n ): void {\n this.update((state: Draft<MultichainAssetsRatesControllerState>) => {\n state.conversionRates = {\n ...state.conversionRates,\n ...updatedRates,\n };\n });\n }\n\n /**\n * Forwards a Snap request to the SnapController.\n *\n * @param args - The request parameters.\n * @param args.snapId - The ID of the Snap.\n * @param args.handler - The handler type.\n * @param args.params - The asset conversions.\n * @returns A promise that resolves with the account rates.\n */\n async #handleSnapRequest({\n snapId,\n handler,\n params,\n }: {\n snapId: SnapId;\n handler: HandlerType;\n params: OnAssetsConversionArguments;\n }): Promise<OnAssetsConversionResponse> {\n return this.messagingSystem.call('SnapController:handleRequest', {\n snapId,\n origin: 'metamask',\n handler,\n request: {\n jsonrpc: '2.0',\n method: handler,\n params,\n },\n }) as Promise<OnAssetsConversionResponse>;\n }\n}\n"]}
1
+ {"version":3,"file":"MultichainAssetsRatesController.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/MultichainAssetsRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerListMultichainAccountsAction,\n AccountsControllerAccountAddedEvent,\n} from '@metamask/accounts-controller';\nimport type {\n RestrictedMessenger,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { type CaipAssetType, isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\nimport type {\n SnapId,\n AssetConversion,\n OnAssetsConversionArguments,\n OnAssetsConversionResponse,\n} from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport { Mutex } from 'async-mutex';\nimport type { Draft } from 'immer';\n\nimport { MAP_CAIP_CURRENCIES } from './constant';\nimport type {\n CurrencyRateState,\n CurrencyRateStateChange,\n GetCurrencyRateState,\n} from '../CurrencyRateController';\nimport type {\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerState,\n MultichainAssetsControllerStateChangeEvent,\n} from '../MultichainAssetsController';\n\n/**\n * The name of the MultichainAssetsRatesController.\n */\nconst controllerName = 'MultichainAssetsRatesController';\n\n/**\n * State used by the MultichainAssetsRatesController to cache token conversion rates.\n */\nexport type MultichainAssetsRatesControllerState = {\n conversionRates: Record<CaipAssetType, AssetConversion>;\n};\n\n/**\n * Returns the state of the MultichainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsRatesControllerState\n >;\n\n/**\n * Action to update the rates of all supported tokens.\n */\nexport type MultichainAssetsRatesControllerUpdateRatesAction = {\n type: `${typeof controllerName}:updateAssetsRates`;\n handler: MultichainAssetsRatesController['updateAssetsRates'];\n};\n\n/**\n * Constructs the default {@link MultichainAssetsRatesController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link MultichainAssetsRatesController} state.\n */\nexport function getDefaultMultichainAssetsRatesControllerState(): MultichainAssetsRatesControllerState {\n return { conversionRates: {} };\n}\n\n/**\n * Event emitted when the state of the MultichainAssetsRatesController changes.\n */\nexport type MultichainAssetsRatesControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsRatesControllerState\n >;\n\n/**\n * Actions exposed by the MultichainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerActions =\n | MultichainAssetsRatesControllerGetStateAction\n | MultichainAssetsRatesControllerUpdateRatesAction;\n\n/**\n * Events emitted by MultichainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerEvents =\n MultichainAssetsRatesControllerStateChange;\n\n/**\n * Actions that this controller is allowed to call.\n */\nexport type AllowedActions =\n | HandleSnapRequest\n | AccountsControllerListMultichainAccountsAction\n | GetCurrencyRateState\n | MultichainAssetsControllerGetStateAction;\n/**\n * Events that this controller is allowed to subscribe to.\n */\nexport type AllowedEvents =\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | AccountsControllerAccountAddedEvent\n | CurrencyRateStateChange\n | MultichainAssetsControllerStateChangeEvent;\n\n/**\n * Messenger type for the MultichainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n MultichainAssetsRatesControllerActions | AllowedActions,\n MultichainAssetsRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * The input for starting polling in MultichainAssetsRatesController.\n */\nexport type MultichainAssetsRatesPollingInput = {\n accountId: string;\n};\n\nconst metadata = {\n conversionRates: { persist: true, anonymous: true },\n};\n\n/**\n * Controller that manages multichain token conversion rates.\n *\n * This controller polls for token conversion rates and updates its state.\n */\nexport class MultichainAssetsRatesController extends StaticIntervalPollingController<MultichainAssetsRatesPollingInput>()<\n typeof controllerName,\n MultichainAssetsRatesControllerState,\n MultichainAssetsRatesControllerMessenger\n> {\n readonly #mutex = new Mutex();\n\n #currentCurrency: CurrencyRateState['currentCurrency'];\n\n #accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n\n #isUnlocked = true;\n\n /**\n * Creates an instance of MultichainAssetsRatesController.\n *\n * @param options - Constructor options.\n * @param options.interval - The polling interval in milliseconds.\n * @param options.state - The initial state.\n * @param options.messenger - A reference to the messaging system.\n */\n constructor({\n interval = 18000,\n state = {},\n messenger,\n }: {\n interval?: number;\n state?: Partial<MultichainAssetsRatesControllerState>;\n messenger: MultichainAssetsRatesControllerMessenger;\n }) {\n super({\n name: controllerName,\n messenger,\n state: {\n ...getDefaultMultichainAssetsRatesControllerState(),\n ...state,\n },\n metadata,\n });\n\n this.setIntervalLength(interval);\n\n // Subscribe to keyring lock/unlock events.\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n });\n\n ({ accountsAssets: this.#accountsAssets } = this.messagingSystem.call(\n 'MultichainAssetsController:getState',\n ));\n\n ({ currentCurrency: this.#currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n ));\n\n this.messagingSystem.subscribe(\n 'CurrencyRateController:stateChange',\n async (currencyRatesState: CurrencyRateState) => {\n this.#currentCurrency = currencyRatesState.currentCurrency;\n await this.updateAssetsRates();\n },\n );\n\n this.messagingSystem.subscribe(\n 'MultichainAssetsController:stateChange',\n async (multichainAssetsState: MultichainAssetsControllerState) => {\n this.#accountsAssets = multichainAssetsState.accountsAssets;\n await this.updateAssetsRates();\n },\n );\n }\n\n /**\n * Executes a poll by updating token conversion rates for the current account.\n *\n * @returns A promise that resolves when the polling completes.\n */\n async _executePoll(): Promise<void> {\n await this.updateAssetsRates();\n }\n\n /**\n * Determines whether the controller is active.\n *\n * @returns True if the keyring is unlocked; otherwise, false.\n */\n get isActive(): boolean {\n return this.#isUnlocked;\n }\n\n /**\n * Checks if an account is a non-EVM account with a Snap.\n *\n * @param account - The account to check.\n * @returns True if the account is non-EVM and has Snap metadata; otherwise, false.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) && account.metadata.snap !== undefined\n );\n }\n\n /**\n * Retrieves all multichain accounts from the AccountsController.\n *\n * @returns An array of internal accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n\n /**\n * Filters and returns non-EVM accounts that should have balances.\n *\n * @returns An array of non-EVM internal accounts.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Updates token conversion rates for each non-EVM account.\n *\n * @returns A promise that resolves when the rates are updated.\n */\n async updateAssetsRates(): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n return (async () => {\n if (!this.isActive) {\n return;\n }\n const accounts = this.#listAccounts();\n\n for (const account of accounts) {\n const assets = this.#getAssetsForAccount(account.id);\n\n // Build the conversions array\n const conversions = this.#buildConversions(assets);\n\n // Retrieve rates from Snap\n const accountRates = await this.#handleSnapRequest({\n snapId: account?.metadata.snap?.id as SnapId,\n handler: HandlerType.OnAssetsConversion,\n params: conversions,\n });\n\n // Flatten nested rates if needed\n const flattenedRates = this.#flattenRates(accountRates);\n\n // Build the updatedRates object for these assets\n const updatedRates = this.#buildUpdatedRates(assets, flattenedRates);\n // Apply these updated rates to controller state\n this.#applyUpdatedRates(updatedRates);\n }\n })().finally(() => {\n releaseLock();\n });\n }\n\n /**\n * Returns the array of CAIP-19 assets for the given account ID.\n * If none are found, returns an empty array.\n *\n * @param accountId - The account ID to get the assets for.\n * @returns An array of CAIP-19 assets.\n */\n #getAssetsForAccount(accountId: string): CaipAssetType[] {\n return this.#accountsAssets?.[accountId] ?? [];\n }\n\n /**\n * Builds a conversions array (from each asset → the current currency).\n *\n * @param assets - The assets to build the conversions for.\n * @returns A conversions array.\n */\n #buildConversions(assets: CaipAssetType[]): OnAssetsConversionArguments {\n const currency =\n MAP_CAIP_CURRENCIES[this.#currentCurrency] ?? MAP_CAIP_CURRENCIES.usd;\n return {\n conversions: assets.map((asset) => ({\n from: asset,\n to: currency,\n })),\n };\n }\n\n /**\n * Flattens any nested structure in the conversion rates returned by Snap.\n *\n * @param assetsConversionResponse - The conversion rates to flatten.\n * @returns A flattened rates object.\n */\n #flattenRates(\n assetsConversionResponse: OnAssetsConversionResponse,\n ): Record<CaipAssetType, AssetConversion | null> {\n const { conversionRates } = assetsConversionResponse;\n\n return Object.fromEntries(\n Object.entries(conversionRates).map(([asset, nestedObj]) => {\n // e.g., nestedObj might look like: { \"swift:0/iso4217:EUR\": { rate, conversionTime } }\n const singleValue = Object.values(nestedObj)[0];\n return [asset, singleValue];\n }),\n );\n }\n\n /**\n * Builds a rates object that covers all given assets, ensuring that\n * any asset not returned by Snap is set to null for both `rate` and `conversionTime`.\n *\n * @param assets - The assets to build the rates for.\n * @param flattenedRates - The rates to merge.\n * @returns A rates object that covers all given assets.\n */\n #buildUpdatedRates(\n assets: CaipAssetType[],\n flattenedRates: Record<CaipAssetType, AssetConversion | null>,\n ): Record<string, AssetConversion & { currency: CaipAssetType }> {\n const updatedRates: Record<\n CaipAssetType,\n AssetConversion & { currency: CaipAssetType }\n > = {};\n\n for (const asset of assets) {\n if (flattenedRates[asset]) {\n updatedRates[asset] = {\n ...(flattenedRates[asset] as AssetConversion),\n currency:\n MAP_CAIP_CURRENCIES[this.#currentCurrency] ??\n MAP_CAIP_CURRENCIES.usd,\n };\n }\n }\n return updatedRates;\n }\n\n /**\n * Merges the new rates into the controller’s state.\n *\n * @param updatedRates - The new rates to merge.\n */\n #applyUpdatedRates(\n updatedRates: Record<\n string,\n { rate: string | null; conversionTime: number | null }\n >,\n ): void {\n this.update((state: Draft<MultichainAssetsRatesControllerState>) => {\n state.conversionRates = {\n ...state.conversionRates,\n ...updatedRates,\n };\n });\n }\n\n /**\n * Forwards a Snap request to the SnapController.\n *\n * @param args - The request parameters.\n * @param args.snapId - The ID of the Snap.\n * @param args.handler - The handler type.\n * @param args.params - The asset conversions.\n * @returns A promise that resolves with the account rates.\n */\n async #handleSnapRequest({\n snapId,\n handler,\n params,\n }: {\n snapId: SnapId;\n handler: HandlerType;\n params: OnAssetsConversionArguments;\n }): Promise<OnAssetsConversionResponse> {\n return this.messagingSystem.call('SnapController:handleRequest', {\n snapId,\n origin: 'metamask',\n handler,\n request: {\n jsonrpc: '2.0',\n method: handler,\n params,\n },\n }) as Promise<OnAssetsConversionResponse>;\n }\n}\n"]}
@@ -7,17 +7,17 @@ import type { AssetConversion } from "@metamask/snaps-sdk";
7
7
  import type { CurrencyRateStateChange, GetCurrencyRateState } from "../CurrencyRateController.cjs";
8
8
  import type { MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChangeEvent } from "../MultichainAssetsController/index.cjs";
9
9
  /**
10
- * The name of the MultiChainAssetsRatesController.
10
+ * The name of the MultichainAssetsRatesController.
11
11
  */
12
- declare const controllerName = "MultiChainAssetsRatesController";
12
+ declare const controllerName = "MultichainAssetsRatesController";
13
13
  /**
14
- * State used by the MultiChainAssetsRatesController to cache token conversion rates.
14
+ * State used by the MultichainAssetsRatesController to cache token conversion rates.
15
15
  */
16
16
  export type MultichainAssetsRatesControllerState = {
17
17
  conversionRates: Record<CaipAssetType, AssetConversion>;
18
18
  };
19
19
  /**
20
- * Returns the state of the MultiChainAssetsRatesController.
20
+ * Returns the state of the MultichainAssetsRatesController.
21
21
  */
22
22
  export type MultichainAssetsRatesControllerGetStateAction = ControllerGetStateAction<typeof controllerName, MultichainAssetsRatesControllerState>;
23
23
  /**
@@ -25,7 +25,7 @@ export type MultichainAssetsRatesControllerGetStateAction = ControllerGetStateAc
25
25
  */
26
26
  export type MultichainAssetsRatesControllerUpdateRatesAction = {
27
27
  type: `${typeof controllerName}:updateAssetsRates`;
28
- handler: MultiChainAssetsRatesController['updateAssetsRates'];
28
+ handler: MultichainAssetsRatesController['updateAssetsRates'];
29
29
  };
30
30
  /**
31
31
  * Constructs the default {@link MultichainAssetsRatesController} state. This allows
@@ -37,15 +37,15 @@ export type MultichainAssetsRatesControllerUpdateRatesAction = {
37
37
  */
38
38
  export declare function getDefaultMultichainAssetsRatesControllerState(): MultichainAssetsRatesControllerState;
39
39
  /**
40
- * Event emitted when the state of the MultiChainAssetsRatesController changes.
40
+ * Event emitted when the state of the MultichainAssetsRatesController changes.
41
41
  */
42
42
  export type MultichainAssetsRatesControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainAssetsRatesControllerState>;
43
43
  /**
44
- * Actions exposed by the MultiChainAssetsRatesController.
44
+ * Actions exposed by the MultichainAssetsRatesController.
45
45
  */
46
46
  export type MultichainAssetsRatesControllerActions = MultichainAssetsRatesControllerGetStateAction | MultichainAssetsRatesControllerUpdateRatesAction;
47
47
  /**
48
- * Events emitted by MultiChainAssetsRatesController.
48
+ * Events emitted by MultichainAssetsRatesController.
49
49
  */
50
50
  export type MultichainAssetsRatesControllerEvents = MultichainAssetsRatesControllerStateChange;
51
51
  /**
@@ -57,39 +57,39 @@ export type AllowedActions = HandleSnapRequest | AccountsControllerListMultichai
57
57
  */
58
58
  export type AllowedEvents = KeyringControllerLockEvent | KeyringControllerUnlockEvent | AccountsControllerAccountAddedEvent | CurrencyRateStateChange | MultichainAssetsControllerStateChangeEvent;
59
59
  /**
60
- * Messenger type for the MultiChainAssetsRatesController.
60
+ * Messenger type for the MultichainAssetsRatesController.
61
61
  */
62
62
  export type MultichainAssetsRatesControllerMessenger = RestrictedMessenger<typeof controllerName, MultichainAssetsRatesControllerActions | AllowedActions, MultichainAssetsRatesControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
63
63
  /**
64
- * The input for starting polling in MultiChainAssetsRatesController.
64
+ * The input for starting polling in MultichainAssetsRatesController.
65
65
  */
66
- export type MultiChainAssetsRatesPollingInput = {
66
+ export type MultichainAssetsRatesPollingInput = {
67
67
  accountId: string;
68
68
  };
69
- declare const MultiChainAssetsRatesController_base: (abstract new (...args: any[]) => {
69
+ declare const MultichainAssetsRatesController_base: (abstract new (...args: any[]) => {
70
70
  readonly "__#13@#intervalIds": Record<string, NodeJS.Timeout>;
71
71
  "__#13@#intervalLength": number | undefined;
72
72
  setIntervalLength(intervalLength: number): void;
73
73
  getIntervalLength(): number | undefined;
74
- _startPolling(input: MultiChainAssetsRatesPollingInput): void;
74
+ _startPolling(input: MultichainAssetsRatesPollingInput): void;
75
75
  _stopPollingByPollingTokenSetId(key: string): void;
76
76
  readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
77
- "__#3@#callbacks": Map<string, Set<(input: MultiChainAssetsRatesPollingInput) => void>>;
78
- _executePoll(input: MultiChainAssetsRatesPollingInput): Promise<void>;
79
- startPolling(input: MultiChainAssetsRatesPollingInput): string;
77
+ "__#3@#callbacks": Map<string, Set<(input: MultichainAssetsRatesPollingInput) => void>>;
78
+ _executePoll(input: MultichainAssetsRatesPollingInput): Promise<void>;
79
+ startPolling(input: MultichainAssetsRatesPollingInput): string;
80
80
  stopAllPolling(): void;
81
81
  stopPollingByPollingToken(pollingToken: string): void;
82
- onPollingComplete(input: MultiChainAssetsRatesPollingInput, callback: (input: MultiChainAssetsRatesPollingInput) => void): void;
82
+ onPollingComplete(input: MultichainAssetsRatesPollingInput, callback: (input: MultichainAssetsRatesPollingInput) => void): void;
83
83
  }) & typeof import("@metamask/base-controller").BaseController;
84
84
  /**
85
85
  * Controller that manages multichain token conversion rates.
86
86
  *
87
87
  * This controller polls for token conversion rates and updates its state.
88
88
  */
89
- export declare class MultiChainAssetsRatesController extends MultiChainAssetsRatesController_base<typeof controllerName, MultichainAssetsRatesControllerState, MultichainAssetsRatesControllerMessenger> {
89
+ export declare class MultichainAssetsRatesController extends MultichainAssetsRatesController_base<typeof controllerName, MultichainAssetsRatesControllerState, MultichainAssetsRatesControllerMessenger> {
90
90
  #private;
91
91
  /**
92
- * Creates an instance of MultiChainAssetsRatesController.
92
+ * Creates an instance of MultichainAssetsRatesController.
93
93
  *
94
94
  * @param options - Constructor options.
95
95
  * @param options.interval - The polling interval in milliseconds.
@@ -7,17 +7,17 @@ import type { AssetConversion } from "@metamask/snaps-sdk";
7
7
  import type { CurrencyRateStateChange, GetCurrencyRateState } from "../CurrencyRateController.mjs";
8
8
  import type { MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChangeEvent } from "../MultichainAssetsController/index.mjs";
9
9
  /**
10
- * The name of the MultiChainAssetsRatesController.
10
+ * The name of the MultichainAssetsRatesController.
11
11
  */
12
- declare const controllerName = "MultiChainAssetsRatesController";
12
+ declare const controllerName = "MultichainAssetsRatesController";
13
13
  /**
14
- * State used by the MultiChainAssetsRatesController to cache token conversion rates.
14
+ * State used by the MultichainAssetsRatesController to cache token conversion rates.
15
15
  */
16
16
  export type MultichainAssetsRatesControllerState = {
17
17
  conversionRates: Record<CaipAssetType, AssetConversion>;
18
18
  };
19
19
  /**
20
- * Returns the state of the MultiChainAssetsRatesController.
20
+ * Returns the state of the MultichainAssetsRatesController.
21
21
  */
22
22
  export type MultichainAssetsRatesControllerGetStateAction = ControllerGetStateAction<typeof controllerName, MultichainAssetsRatesControllerState>;
23
23
  /**
@@ -25,7 +25,7 @@ export type MultichainAssetsRatesControllerGetStateAction = ControllerGetStateAc
25
25
  */
26
26
  export type MultichainAssetsRatesControllerUpdateRatesAction = {
27
27
  type: `${typeof controllerName}:updateAssetsRates`;
28
- handler: MultiChainAssetsRatesController['updateAssetsRates'];
28
+ handler: MultichainAssetsRatesController['updateAssetsRates'];
29
29
  };
30
30
  /**
31
31
  * Constructs the default {@link MultichainAssetsRatesController} state. This allows
@@ -37,15 +37,15 @@ export type MultichainAssetsRatesControllerUpdateRatesAction = {
37
37
  */
38
38
  export declare function getDefaultMultichainAssetsRatesControllerState(): MultichainAssetsRatesControllerState;
39
39
  /**
40
- * Event emitted when the state of the MultiChainAssetsRatesController changes.
40
+ * Event emitted when the state of the MultichainAssetsRatesController changes.
41
41
  */
42
42
  export type MultichainAssetsRatesControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainAssetsRatesControllerState>;
43
43
  /**
44
- * Actions exposed by the MultiChainAssetsRatesController.
44
+ * Actions exposed by the MultichainAssetsRatesController.
45
45
  */
46
46
  export type MultichainAssetsRatesControllerActions = MultichainAssetsRatesControllerGetStateAction | MultichainAssetsRatesControllerUpdateRatesAction;
47
47
  /**
48
- * Events emitted by MultiChainAssetsRatesController.
48
+ * Events emitted by MultichainAssetsRatesController.
49
49
  */
50
50
  export type MultichainAssetsRatesControllerEvents = MultichainAssetsRatesControllerStateChange;
51
51
  /**
@@ -57,39 +57,39 @@ export type AllowedActions = HandleSnapRequest | AccountsControllerListMultichai
57
57
  */
58
58
  export type AllowedEvents = KeyringControllerLockEvent | KeyringControllerUnlockEvent | AccountsControllerAccountAddedEvent | CurrencyRateStateChange | MultichainAssetsControllerStateChangeEvent;
59
59
  /**
60
- * Messenger type for the MultiChainAssetsRatesController.
60
+ * Messenger type for the MultichainAssetsRatesController.
61
61
  */
62
62
  export type MultichainAssetsRatesControllerMessenger = RestrictedMessenger<typeof controllerName, MultichainAssetsRatesControllerActions | AllowedActions, MultichainAssetsRatesControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
63
63
  /**
64
- * The input for starting polling in MultiChainAssetsRatesController.
64
+ * The input for starting polling in MultichainAssetsRatesController.
65
65
  */
66
- export type MultiChainAssetsRatesPollingInput = {
66
+ export type MultichainAssetsRatesPollingInput = {
67
67
  accountId: string;
68
68
  };
69
- declare const MultiChainAssetsRatesController_base: (abstract new (...args: any[]) => {
69
+ declare const MultichainAssetsRatesController_base: (abstract new (...args: any[]) => {
70
70
  readonly "__#13@#intervalIds": Record<string, NodeJS.Timeout>;
71
71
  "__#13@#intervalLength": number | undefined;
72
72
  setIntervalLength(intervalLength: number): void;
73
73
  getIntervalLength(): number | undefined;
74
- _startPolling(input: MultiChainAssetsRatesPollingInput): void;
74
+ _startPolling(input: MultichainAssetsRatesPollingInput): void;
75
75
  _stopPollingByPollingTokenSetId(key: string): void;
76
76
  readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
77
- "__#3@#callbacks": Map<string, Set<(input: MultiChainAssetsRatesPollingInput) => void>>;
78
- _executePoll(input: MultiChainAssetsRatesPollingInput): Promise<void>;
79
- startPolling(input: MultiChainAssetsRatesPollingInput): string;
77
+ "__#3@#callbacks": Map<string, Set<(input: MultichainAssetsRatesPollingInput) => void>>;
78
+ _executePoll(input: MultichainAssetsRatesPollingInput): Promise<void>;
79
+ startPolling(input: MultichainAssetsRatesPollingInput): string;
80
80
  stopAllPolling(): void;
81
81
  stopPollingByPollingToken(pollingToken: string): void;
82
- onPollingComplete(input: MultiChainAssetsRatesPollingInput, callback: (input: MultiChainAssetsRatesPollingInput) => void): void;
82
+ onPollingComplete(input: MultichainAssetsRatesPollingInput, callback: (input: MultichainAssetsRatesPollingInput) => void): void;
83
83
  }) & typeof import("@metamask/base-controller").BaseController;
84
84
  /**
85
85
  * Controller that manages multichain token conversion rates.
86
86
  *
87
87
  * This controller polls for token conversion rates and updates its state.
88
88
  */
89
- export declare class MultiChainAssetsRatesController extends MultiChainAssetsRatesController_base<typeof controllerName, MultichainAssetsRatesControllerState, MultichainAssetsRatesControllerMessenger> {
89
+ export declare class MultichainAssetsRatesController extends MultichainAssetsRatesController_base<typeof controllerName, MultichainAssetsRatesControllerState, MultichainAssetsRatesControllerMessenger> {
90
90
  #private;
91
91
  /**
92
- * Creates an instance of MultiChainAssetsRatesController.
92
+ * Creates an instance of MultichainAssetsRatesController.
93
93
  *
94
94
  * @param options - Constructor options.
95
95
  * @param options.interval - The polling interval in milliseconds.