@metamask-previews/assets-controllers 47.0.0-preview-33c13522 → 47.0.0-preview-59b4e66e

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 CHANGED
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+
12
+ - Bump `@metamask/snaps-utils` from `^8.9.0` to `^8.10.0` ([#5265](https://github.com/MetaMask/core/pull/5265))
13
+
10
14
  ## [47.0.0]
11
15
 
12
16
  ### Added
@@ -19,7 +19,6 @@ const keyring_snap_client_1 = require("@metamask/keyring-snap-client");
19
19
  const snaps_utils_1 = require("@metamask/snaps-utils");
20
20
  const utils_1 = require("@metamask/utils");
21
21
  const async_mutex_1 = require("async-mutex");
22
- const uuid_1 = require("uuid");
23
22
  const utils_2 = require("./utils.cjs");
24
23
  const controllerName = 'MultichainAssetsController';
25
24
  /**
@@ -31,7 +30,7 @@ const controllerName = 'MultichainAssetsController';
31
30
  * @returns The default {@link MultichainAssetsController} state.
32
31
  */
33
32
  function getDefaultMultichainAssetsControllerState() {
34
- return { allNonEvmTokens: {}, metadata: {} };
33
+ return { accountsAssets: {}, assetsMetadata: {} };
35
34
  }
36
35
  exports.getDefaultMultichainAssetsControllerState = getDefaultMultichainAssetsControllerState;
37
36
  /**
@@ -42,16 +41,16 @@ exports.getDefaultMultichainAssetsControllerState = getDefaultMultichainAssetsCo
42
41
  * the `anonymous` flag.
43
42
  */
44
43
  const assetsControllerMetadata = {
45
- metadata: {
44
+ assetsMetadata: {
46
45
  persist: true,
47
46
  anonymous: false,
48
47
  },
49
- allNonEvmTokens: {
48
+ accountsAssets: {
50
49
  persist: true,
51
50
  anonymous: false,
52
51
  },
53
52
  };
54
- // TODO make this controller extends StaticIntervalPollingController and update all metadata once a day.
53
+ // TODO: make this controller extends StaticIntervalPollingController and update all assetsMetadata once a day.
55
54
  class MultichainAssetsController extends base_controller_1.BaseController {
56
55
  constructor({ messenger, state = {}, }) {
57
56
  super({
@@ -90,11 +89,9 @@ async function _MultichainAssetsController_handleAccountAssetListUpdated(event)
90
89
  let assetsForMetadataRefresh = new Set([]);
91
90
  for (const accountId in assetsToUpdate) {
92
91
  if ((0, utils_1.hasProperty)(assetsToUpdate, accountId)) {
93
- const newAccountAssets = assetsToUpdate[accountId];
94
- if (newAccountAssets.added.length !== 0 ||
95
- newAccountAssets.removed.length !== 0) {
96
- const { added, removed } = newAccountAssets;
97
- const existing = this.state.allNonEvmTokens[accountId] || [];
92
+ const { added, removed } = assetsToUpdate[accountId];
93
+ if (added.length > 0 || removed.length > 0) {
94
+ const existing = this.state.accountsAssets[accountId] || [];
98
95
  const assets = new Set([
99
96
  ...existing,
100
97
  ...added.filter((asset) => (0, utils_1.isCaipAssetType)(asset)),
@@ -107,12 +104,12 @@ async function _MultichainAssetsController_handleAccountAssetListUpdated(event)
107
104
  ...assets,
108
105
  ]);
109
106
  this.update((state) => {
110
- state.allNonEvmTokens[accountId] = Array.from(assets);
107
+ state.accountsAssets[accountId] = Array.from(assets);
111
108
  });
112
109
  }
113
110
  }
114
111
  }
115
- // trigger fetching metadata for new assets
112
+ // Trigger fetching metadata for new assets
116
113
  await __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_refreshAssetsMetadata).call(this, Array.from(assetsForMetadataRefresh));
117
114
  }, _MultichainAssetsController_isNonEvmAccount = function _MultichainAssetsController_isNonEvmAccount(account) {
118
115
  return (!(0, keyring_api_1.isEvmAccountType)(account.type) &&
@@ -135,7 +132,7 @@ async function _MultichainAssetsController_handleOnAccountAdded(account) {
135
132
  const assets = await __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_getAssetsList).call(this, account.id, account.metadata.snap.id);
136
133
  await __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_refreshAssetsMetadata).call(this, assets);
137
134
  this.update((state) => {
138
- state.allNonEvmTokens[account.id] = assets;
135
+ state.accountsAssets[account.id] = assets;
139
136
  });
140
137
  }
141
138
  }, _MultichainAssetsController_handleOnAccountRemovedEvent =
@@ -145,10 +142,12 @@ async function _MultichainAssetsController_handleOnAccountAdded(account) {
145
142
  * @param accountId - The new account id being removed.
146
143
  */
147
144
  async function _MultichainAssetsController_handleOnAccountRemovedEvent(accountId) {
148
- // Check if accountId is in allNonEvmTokens and if it is, remove it
149
- if (this.state.allNonEvmTokens[accountId]) {
145
+ // Check if accountId is in accountsAssets and if it is, remove it
146
+ if (this.state.accountsAssets[accountId]) {
150
147
  this.update((state) => {
151
- delete state.allNonEvmTokens[accountId];
148
+ // TODO: We are not deleting the assetsMetadata because we will soon make this controller extends StaticIntervalPollingController
149
+ // and update all assetsMetadata once a day.
150
+ delete state.accountsAssets[accountId];
152
151
  });
153
152
  }
154
153
  }, _MultichainAssetsController_refreshAssetsMetadata =
@@ -158,10 +157,11 @@ async function _MultichainAssetsController_handleOnAccountRemovedEvent(accountId
158
157
  * @param assets - The assets to refresh
159
158
  */
160
159
  async function _MultichainAssetsController_refreshAssetsMetadata(assets) {
161
- const assetsWithoutMetadata = assets.filter((asset) => !this.state.metadata[asset]);
162
- // call the snap to get the metadata
160
+ __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_assertControllerMutexIsLocked).call(this);
161
+ const assetsWithoutMetadata = assets.filter((asset) => !this.state.assetsMetadata[asset]);
162
+ // Call the snap to get the metadata
163
163
  if (assetsWithoutMetadata.length > 0) {
164
- // check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps
164
+ // Check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps
165
165
  if (!assetsWithoutMetadata.every((asset) => {
166
166
  const { chainId } = (0, utils_1.parseCaipAssetType)(asset);
167
167
  return Boolean(__classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_getAssetSnapFor).call(this, chainId));
@@ -200,8 +200,8 @@ async function _MultichainAssetsController_updateAssetsMetadata(assets) {
200
200
  }
201
201
  }
202
202
  this.update((state) => {
203
- state.metadata = {
204
- ...this.state.metadata,
203
+ state.assetsMetadata = {
204
+ ...this.state.assetsMetadata,
205
205
  ...newMetadata,
206
206
  };
207
207
  });
@@ -251,7 +251,6 @@ async function _MultichainAssetsController_getAssetsMetadataFrom(assets, snapId)
251
251
  origin: 'metamask',
252
252
  handler: snaps_utils_1.HandlerType.OnAssetsLookup,
253
253
  request: {
254
- id: (0, uuid_1.v4)(),
255
254
  jsonrpc: '2.0',
256
255
  method: 'onAssetLookup',
257
256
  params: {
@@ -261,7 +260,7 @@ async function _MultichainAssetsController_getAssetsMetadataFrom(assets, snapId)
261
260
  }));
262
261
  }
263
262
  catch (error) {
264
- // ignore
263
+ // Ignore
265
264
  console.error(error);
266
265
  return undefined;
267
266
  }
@@ -286,7 +285,7 @@ async function _MultichainAssetsController_getAssetsList(accountId, snapId) {
286
285
  });
287
286
  }, _MultichainAssetsController_assertControllerMutexIsLocked = function _MultichainAssetsController_assertControllerMutexIsLocked() {
288
287
  if (!__classPrivateFieldGet(this, _MultichainAssetsController_controllerOperationMutex, "f").isLocked()) {
289
- throw new Error('MultichainAssetsControllerError- Attempt to update state');
288
+ throw new Error('MultichainAssetsControllerError - Attempt to update state');
290
289
  }
291
290
  }, _MultichainAssetsController_withControllerLock =
292
291
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAssetsController.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n AccountAssetListUpdatedEventPayload,\n CaipAssetType,\n CaipAssetTypeOrId,\n} from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type {\n GetPermissions,\n PermissionConstraint,\n SubjectPermissions,\n} from '@metamask/permission-controller';\nimport type {\n GetAllSnaps,\n HandleSnapRequest,\n} from '@metamask/snaps-controllers';\nimport type { FungibleAssetMetadata, Snap, SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport {\n hasProperty,\n isCaipAssetType,\n parseCaipAssetType,\n type CaipChainId,\n} from '@metamask/utils';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\nimport type { MutexInterface } from 'async-mutex';\nimport { Mutex } from 'async-mutex';\nimport { v4 as uuid } from 'uuid';\n\nimport { getChainIdsCaveat } from './utils';\nimport type { AccountsControllerAccountAssetListUpdatedEvent } from '../../../accounts-controller/src/AccountsController';\n\nconst controllerName = 'MultichainAssetsController';\n\nexport type MultichainAssetsControllerState = {\n metadata: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n allNonEvmTokens: { [account: string]: CaipAssetType[] };\n};\n\n// Represents the response of the asset snap's onAssetLookup handler\nexport type AssetMetadataResponse = {\n assets: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n};\n\n/**\n * Constructs the default {@link MultichainAssetsController} 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 MultichainAssetsController} state.\n */\nexport function getDefaultMultichainAssetsControllerState(): MultichainAssetsControllerState {\n return { allNonEvmTokens: {}, metadata: {} };\n}\n\n/**\n * Returns the state of the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsControllerState\n>;\n\n/**\n * Event emitted when the state of the {@link MultichainAssetsController} changes.\n */\nexport type MultichainAssetsControllerStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsControllerState\n>;\n\n/**\n * Actions exposed by the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerActions =\n MultichainAssetsControllerGetStateAction;\n\n/**\n * Events emitted by {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerEvents =\n MultichainAssetsControllerStateChange;\n\n/**\n * A function executed within a mutually exclusive lock, with\n * a mutex releaser in its option bag.\n *\n * @param releaseLock - A function to release the lock.\n */\ntype MutuallyExclusiveCallback<Result> = ({\n releaseLock,\n}: {\n releaseLock: MutexInterface.Releaser;\n}) => Promise<Result>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | HandleSnapRequest\n | GetAllSnaps\n | GetPermissions\n | AccountsControllerListMultichainAccountsAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * Messenger type for the MultichainAssetsController.\n */\nexport type MultichainAssetsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n MultichainAssetsControllerActions | AllowedActions,\n MultichainAssetsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * {@link MultichainAssetsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst assetsControllerMetadata = {\n metadata: {\n persist: true,\n anonymous: false,\n },\n allNonEvmTokens: {\n persist: true,\n anonymous: false,\n },\n};\n\n// TODO make this controller extends StaticIntervalPollingController and update all metadata once a day.\n\nexport class MultichainAssetsController extends BaseController<\n typeof controllerName,\n MultichainAssetsControllerState,\n MultichainAssetsControllerMessenger\n> {\n // Mapping of CAIP-2 Chain ID to Asset Snaps.\n #snaps: Record<CaipChainId, Snap[]>;\n\n readonly #controllerOperationMutex = new Mutex();\n\n constructor({\n messenger,\n state = {},\n }: {\n messenger: MultichainAssetsControllerMessenger;\n state?: Partial<MultichainAssetsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: assetsControllerMetadata,\n state: {\n ...getDefaultMultichainAssetsControllerState(),\n ...state,\n },\n });\n\n this.#snaps = {};\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n async (account) => await this.#handleOnAccountAddedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n async (account) => await this.#handleOnAccountRemovedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountAssetListUpdated',\n async (event) => await this.#handleAccountAssetListUpdatedEvent(event),\n );\n }\n\n async #handleAccountAssetListUpdatedEvent(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n return this.#withControllerLock(async () =>\n this.#handleAccountAssetListUpdated(event),\n );\n }\n\n async #handleOnAccountAddedEvent(account: InternalAccount) {\n return this.#withControllerLock(async () =>\n this.#handleOnAccountAdded(account),\n );\n }\n\n /**\n * Function to update the assets list for an account\n *\n * @param event - The list of assets to update\n */\n async #handleAccountAssetListUpdated(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n this.#assertControllerMutexIsLocked();\n const assetsToUpdate = event.assets;\n let assetsForMetadataRefresh = new Set<CaipAssetType>([]);\n for (const accountId in assetsToUpdate) {\n if (hasProperty(assetsToUpdate, accountId)) {\n const newAccountAssets = assetsToUpdate[accountId];\n if (\n newAccountAssets.added.length !== 0 ||\n newAccountAssets.removed.length !== 0\n ) {\n const { added, removed } = newAccountAssets;\n const existing = this.state.allNonEvmTokens[accountId] || [];\n const assets = new Set<CaipAssetType>([\n ...existing,\n ...added.filter((asset) => isCaipAssetType(asset)),\n ]);\n for (const removedAsset of removed) {\n assets.delete(removedAsset);\n }\n assetsForMetadataRefresh = new Set([\n ...assetsForMetadataRefresh,\n ...assets,\n ]);\n this.update((state) => {\n state.allNonEvmTokens[accountId] = Array.from(assets);\n });\n }\n }\n }\n // trigger fetching metadata for new assets\n await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount): Promise<void> {\n if (!this.#isNonEvmAccount(account)) {\n // Nothing to do here for EVM accounts\n return;\n }\n this.#assertControllerMutexIsLocked();\n\n // Get assets list\n if (account.metadata.snap) {\n const assets = await this.#getAssetsList(\n account.id,\n account.metadata.snap.id,\n );\n await this.#refreshAssetsMetadata(assets);\n this.update((state) => {\n state.allNonEvmTokens[account.id] = assets;\n });\n }\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The new account id being removed.\n */\n async #handleOnAccountRemovedEvent(accountId: string): Promise<void> {\n // Check if accountId is in allNonEvmTokens and if it is, remove it\n if (this.state.allNonEvmTokens[accountId]) {\n this.update((state) => {\n delete state.allNonEvmTokens[accountId];\n });\n }\n }\n\n /**\n * Refreshes the assets snaps and metadata for the given list of assets\n *\n * @param assets - The assets to refresh\n */\n async #refreshAssetsMetadata(assets: CaipAssetType[]) {\n const assetsWithoutMetadata: CaipAssetType[] = assets.filter(\n (asset) => !this.state.metadata[asset],\n );\n\n // call the snap to get the metadata\n if (assetsWithoutMetadata.length > 0) {\n // check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps\n if (\n !assetsWithoutMetadata.every((asset: CaipAssetType) => {\n const { chainId } = parseCaipAssetType(asset);\n return Boolean(this.#getAssetSnapFor(chainId));\n })\n ) {\n this.#snaps = this.#getAssetSnaps();\n }\n await this.#updateAssetsMetadata(assetsWithoutMetadata);\n }\n }\n\n /**\n * Updates the assets metadata for the given list of assets\n *\n * @param assets - The assets to update\n */\n async #updateAssetsMetadata(assets: CaipAssetType[]) {\n // Creates a mapping of scope to their respective assets list.\n const assetsByScope: Record<CaipChainId, CaipAssetType[]> = {};\n for (const asset of assets) {\n const { chainId } = parseCaipAssetType(asset);\n if (!assetsByScope[chainId]) {\n assetsByScope[chainId] = [];\n }\n assetsByScope[chainId].push(asset);\n }\n let newMetadata: Record<CaipAssetType, FungibleAssetMetadata> = {};\n\n for (const chainId of Object.keys(assetsByScope) as CaipChainId[]) {\n const assetsForChain = assetsByScope[chainId];\n // Now fetch metadata from the associated asset Snaps:\n const snap = this.#getAssetSnapFor(chainId);\n if (snap) {\n const metadata = await this.#getAssetsMetadataFrom(\n assetsForChain,\n snap.id,\n );\n newMetadata = {\n ...newMetadata,\n ...(metadata?.assets ?? {}),\n };\n }\n }\n this.update((state) => {\n state.metadata = {\n ...this.state.metadata,\n ...newMetadata,\n };\n });\n }\n\n /**\n * Creates a mapping of CAIP-2 Chain ID to Asset Snaps.\n *\n * @returns A mapping of CAIP-2 Chain ID to Asset Snaps.\n */\n #getAssetSnaps(): Record<CaipChainId, Snap[]> {\n const snaps: Record<CaipChainId, Snap[]> = {};\n const allSnaps = this.#getAllSnaps();\n const allPermissions = allSnaps.map((snap) =>\n this.#getSnapsPermissions(snap.id),\n );\n\n for (const [index, permission] of allPermissions.entries()) {\n let scopes;\n for (const singlePermissionConstraint of Object.values(permission)) {\n scopes = getChainIdsCaveat(singlePermissionConstraint);\n if (!scopes) {\n continue;\n }\n for (const scope of scopes as CaipChainId[]) {\n if (!snaps[scope]) {\n snaps[scope] = [];\n }\n snaps[scope].push(allSnaps[index]);\n }\n }\n }\n return snaps;\n }\n\n /**\n * Returns the first asset snap for the given scope\n *\n * @param scope - The scope to get the asset snap for\n * @returns The asset snap for the given scope\n */\n #getAssetSnapFor(scope: CaipChainId): Snap | undefined {\n const allSnaps = this.#snaps[scope];\n // Pick only the first one, we ignore the other Snaps if there are multiple candidates for now.\n return allSnaps?.[0]; // Will be undefined if there's no Snaps candidate for this scope.\n }\n\n /**\n * Returns all the asset snaps\n *\n * @returns All the asset snaps\n */\n #getAllSnaps(): Snap[] {\n // TODO: Use dedicated SnapController's action once available for this:\n return this.messagingSystem\n .call('SnapController:getAll')\n .filter((snap) => snap.enabled && !snap.blocked);\n }\n\n /**\n * Returns the permissions for the given origin\n *\n * @param origin - The origin to get the permissions for\n * @returns The permissions for the given origin\n */\n #getSnapsPermissions(\n origin: string,\n ): SubjectPermissions<PermissionConstraint> {\n return this.messagingSystem.call(\n 'PermissionController:getPermissions',\n origin,\n ) as SubjectPermissions<PermissionConstraint>;\n }\n\n /**\n * Returns the metadata for the given assets\n *\n * @param assets - The assets to get metadata for\n * @param snapId - The snap ID to get metadata from\n * @returns The metadata for the assets\n */\n async #getAssetsMetadataFrom(\n assets: CaipAssetType[],\n snapId: string,\n ): Promise<AssetMetadataResponse | undefined> {\n try {\n return (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnAssetsLookup,\n request: {\n id: uuid(),\n jsonrpc: '2.0',\n method: 'onAssetLookup',\n params: {\n assets,\n },\n },\n })) as Promise<AssetMetadataResponse>;\n } catch (error) {\n // ignore\n console.error(error);\n return undefined;\n }\n }\n\n /**\n * Get assets list for an account\n *\n * @param accountId - AccountId to get assets for\n * @param snapId - Snap ID for the account\n * @returns list of assets\n */\n async #getAssetsList(\n accountId: string,\n snapId: string,\n ): Promise<CaipAssetTypeOrId[]> {\n return await this.#getClient(snapId).listAccountAssets(accountId);\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n\n /**\n * Assert that the controller mutex is locked.\n *\n * @throws If the controller mutex is not locked.\n */\n #assertControllerMutexIsLocked() {\n if (!this.#controllerOperationMutex.isLocked()) {\n throw new Error(\n 'MultichainAssetsControllerError- Attempt to update state',\n );\n }\n }\n\n /**\n * Lock the controller mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * This wrapper ensures that each mutable operation that interacts with the\n * controller and that changes its state is executed in a mutually exclusive way,\n * preventing unsafe concurrent access that could lead to unpredictable behavior.\n *\n * @param callback - The function to execute while the controller mutex is locked.\n * @returns The result of the function.\n */\n async #withControllerLock<Result>(\n callback: MutuallyExclusiveCallback<Result>,\n ): Promise<Result> {\n return withLock(this.#controllerOperationMutex, callback);\n }\n}\n\n/**\n * Lock the given mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * @param mutex - The mutex to lock.\n * @param callback - The function to execute while the mutex is locked.\n * @returns The result of the function.\n */\nasync function withLock<Result>(\n mutex: Mutex,\n callback: MutuallyExclusiveCallback<Result>,\n): Promise<Result> {\n const releaseLock = await mutex.acquire();\n\n try {\n return await callback({ releaseLock });\n } finally {\n releaseLock();\n }\n}\n"]}
1
+ {"version":3,"file":"MultichainAssetsController.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountAssetListUpdatedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n AccountAssetListUpdatedEventPayload,\n CaipAssetType,\n CaipAssetTypeOrId,\n} from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type {\n GetPermissions,\n PermissionConstraint,\n SubjectPermissions,\n} from '@metamask/permission-controller';\nimport type {\n GetAllSnaps,\n HandleSnapRequest,\n} from '@metamask/snaps-controllers';\nimport type { FungibleAssetMetadata, Snap, SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport {\n hasProperty,\n isCaipAssetType,\n parseCaipAssetType,\n type CaipChainId,\n} from '@metamask/utils';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\nimport type { MutexInterface } from 'async-mutex';\nimport { Mutex } from 'async-mutex';\n\nimport { getChainIdsCaveat } from './utils';\n\nconst controllerName = 'MultichainAssetsController';\n\nexport type MultichainAssetsControllerState = {\n assetsMetadata: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n accountsAssets: { [account: string]: CaipAssetType[] };\n};\n\n// Represents the response of the asset snap's onAssetLookup handler\nexport type AssetMetadataResponse = {\n assets: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n};\n\n/**\n * Constructs the default {@link MultichainAssetsController} 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 MultichainAssetsController} state.\n */\nexport function getDefaultMultichainAssetsControllerState(): MultichainAssetsControllerState {\n return { accountsAssets: {}, assetsMetadata: {} };\n}\n\n/**\n * Returns the state of the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsControllerState\n>;\n\n/**\n * Event emitted when the state of the {@link MultichainAssetsController} changes.\n */\nexport type MultichainAssetsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsControllerState\n >;\n\n/**\n * Actions exposed by the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerActions =\n MultichainAssetsControllerGetStateAction;\n\n/**\n * Events emitted by {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerEvents =\n MultichainAssetsControllerStateChangeEvent;\n\n/**\n * A function executed within a mutually exclusive lock, with\n * a mutex releaser in its option bag.\n *\n * @param releaseLock - A function to release the lock.\n */\ntype MutuallyExclusiveCallback<Result> = ({\n releaseLock,\n}: {\n releaseLock: MutexInterface.Releaser;\n}) => Promise<Result>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | HandleSnapRequest\n | GetAllSnaps\n | GetPermissions\n | AccountsControllerListMultichainAccountsAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * Messenger type for the MultichainAssetsController.\n */\nexport type MultichainAssetsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n MultichainAssetsControllerActions | AllowedActions,\n MultichainAssetsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * {@link MultichainAssetsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst assetsControllerMetadata = {\n assetsMetadata: {\n persist: true,\n anonymous: false,\n },\n accountsAssets: {\n persist: true,\n anonymous: false,\n },\n};\n\n// TODO: make this controller extends StaticIntervalPollingController and update all assetsMetadata once a day.\n\nexport class MultichainAssetsController extends BaseController<\n typeof controllerName,\n MultichainAssetsControllerState,\n MultichainAssetsControllerMessenger\n> {\n // Mapping of CAIP-2 Chain ID to Asset Snaps.\n #snaps: Record<CaipChainId, Snap[]>;\n\n readonly #controllerOperationMutex = new Mutex();\n\n constructor({\n messenger,\n state = {},\n }: {\n messenger: MultichainAssetsControllerMessenger;\n state?: Partial<MultichainAssetsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: assetsControllerMetadata,\n state: {\n ...getDefaultMultichainAssetsControllerState(),\n ...state,\n },\n });\n\n this.#snaps = {};\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n async (account) => await this.#handleOnAccountAddedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n async (account) => await this.#handleOnAccountRemovedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountAssetListUpdated',\n async (event) => await this.#handleAccountAssetListUpdatedEvent(event),\n );\n }\n\n async #handleAccountAssetListUpdatedEvent(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n return this.#withControllerLock(async () =>\n this.#handleAccountAssetListUpdated(event),\n );\n }\n\n async #handleOnAccountAddedEvent(account: InternalAccount) {\n return this.#withControllerLock(async () =>\n this.#handleOnAccountAdded(account),\n );\n }\n\n /**\n * Function to update the assets list for an account\n *\n * @param event - The list of assets to update\n */\n async #handleAccountAssetListUpdated(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n this.#assertControllerMutexIsLocked();\n\n const assetsToUpdate = event.assets;\n let assetsForMetadataRefresh = new Set<CaipAssetType>([]);\n for (const accountId in assetsToUpdate) {\n if (hasProperty(assetsToUpdate, accountId)) {\n const { added, removed } = assetsToUpdate[accountId];\n if (added.length > 0 || removed.length > 0) {\n const existing = this.state.accountsAssets[accountId] || [];\n const assets = new Set<CaipAssetType>([\n ...existing,\n ...added.filter((asset) => isCaipAssetType(asset)),\n ]);\n for (const removedAsset of removed) {\n assets.delete(removedAsset);\n }\n assetsForMetadataRefresh = new Set([\n ...assetsForMetadataRefresh,\n ...assets,\n ]);\n this.update((state) => {\n state.accountsAssets[accountId] = Array.from(assets);\n });\n }\n }\n }\n // Trigger fetching metadata for new assets\n await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount): Promise<void> {\n if (!this.#isNonEvmAccount(account)) {\n // Nothing to do here for EVM accounts\n return;\n }\n this.#assertControllerMutexIsLocked();\n\n // Get assets list\n if (account.metadata.snap) {\n const assets = await this.#getAssetsList(\n account.id,\n account.metadata.snap.id,\n );\n await this.#refreshAssetsMetadata(assets);\n this.update((state) => {\n state.accountsAssets[account.id] = assets;\n });\n }\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The new account id being removed.\n */\n async #handleOnAccountRemovedEvent(accountId: string): Promise<void> {\n // Check if accountId is in accountsAssets and if it is, remove it\n if (this.state.accountsAssets[accountId]) {\n this.update((state) => {\n // TODO: We are not deleting the assetsMetadata because we will soon make this controller extends StaticIntervalPollingController\n // and update all assetsMetadata once a day.\n delete state.accountsAssets[accountId];\n });\n }\n }\n\n /**\n * Refreshes the assets snaps and metadata for the given list of assets\n *\n * @param assets - The assets to refresh\n */\n async #refreshAssetsMetadata(assets: CaipAssetType[]) {\n this.#assertControllerMutexIsLocked();\n\n const assetsWithoutMetadata: CaipAssetType[] = assets.filter(\n (asset) => !this.state.assetsMetadata[asset],\n );\n\n // Call the snap to get the metadata\n if (assetsWithoutMetadata.length > 0) {\n // Check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps\n if (\n !assetsWithoutMetadata.every((asset: CaipAssetType) => {\n const { chainId } = parseCaipAssetType(asset);\n return Boolean(this.#getAssetSnapFor(chainId));\n })\n ) {\n this.#snaps = this.#getAssetSnaps();\n }\n await this.#updateAssetsMetadata(assetsWithoutMetadata);\n }\n }\n\n /**\n * Updates the assets metadata for the given list of assets\n *\n * @param assets - The assets to update\n */\n async #updateAssetsMetadata(assets: CaipAssetType[]) {\n // Creates a mapping of scope to their respective assets list.\n const assetsByScope: Record<CaipChainId, CaipAssetType[]> = {};\n for (const asset of assets) {\n const { chainId } = parseCaipAssetType(asset);\n if (!assetsByScope[chainId]) {\n assetsByScope[chainId] = [];\n }\n assetsByScope[chainId].push(asset);\n }\n\n let newMetadata: Record<CaipAssetType, FungibleAssetMetadata> = {};\n for (const chainId of Object.keys(assetsByScope) as CaipChainId[]) {\n const assetsForChain = assetsByScope[chainId];\n // Now fetch metadata from the associated asset Snaps:\n const snap = this.#getAssetSnapFor(chainId);\n if (snap) {\n const metadata = await this.#getAssetsMetadataFrom(\n assetsForChain,\n snap.id,\n );\n newMetadata = {\n ...newMetadata,\n ...(metadata?.assets ?? {}),\n };\n }\n }\n this.update((state) => {\n state.assetsMetadata = {\n ...this.state.assetsMetadata,\n ...newMetadata,\n };\n });\n }\n\n /**\n * Creates a mapping of CAIP-2 Chain ID to Asset Snaps.\n *\n * @returns A mapping of CAIP-2 Chain ID to Asset Snaps.\n */\n #getAssetSnaps(): Record<CaipChainId, Snap[]> {\n const snaps: Record<CaipChainId, Snap[]> = {};\n const allSnaps = this.#getAllSnaps();\n const allPermissions = allSnaps.map((snap) =>\n this.#getSnapsPermissions(snap.id),\n );\n\n for (const [index, permission] of allPermissions.entries()) {\n let scopes;\n for (const singlePermissionConstraint of Object.values(permission)) {\n scopes = getChainIdsCaveat(singlePermissionConstraint);\n if (!scopes) {\n continue;\n }\n for (const scope of scopes as CaipChainId[]) {\n if (!snaps[scope]) {\n snaps[scope] = [];\n }\n snaps[scope].push(allSnaps[index]);\n }\n }\n }\n return snaps;\n }\n\n /**\n * Returns the first asset snap for the given scope\n *\n * @param scope - The scope to get the asset snap for\n * @returns The asset snap for the given scope\n */\n #getAssetSnapFor(scope: CaipChainId): Snap | undefined {\n const allSnaps = this.#snaps[scope];\n // Pick only the first one, we ignore the other Snaps if there are multiple candidates for now.\n return allSnaps?.[0]; // Will be undefined if there's no Snaps candidate for this scope.\n }\n\n /**\n * Returns all the asset snaps\n *\n * @returns All the asset snaps\n */\n #getAllSnaps(): Snap[] {\n // TODO: Use dedicated SnapController's action once available for this:\n return this.messagingSystem\n .call('SnapController:getAll')\n .filter((snap) => snap.enabled && !snap.blocked);\n }\n\n /**\n * Returns the permissions for the given origin\n *\n * @param origin - The origin to get the permissions for\n * @returns The permissions for the given origin\n */\n #getSnapsPermissions(\n origin: string,\n ): SubjectPermissions<PermissionConstraint> {\n return this.messagingSystem.call(\n 'PermissionController:getPermissions',\n origin,\n ) as SubjectPermissions<PermissionConstraint>;\n }\n\n /**\n * Returns the metadata for the given assets\n *\n * @param assets - The assets to get metadata for\n * @param snapId - The snap ID to get metadata from\n * @returns The metadata for the assets\n */\n async #getAssetsMetadataFrom(\n assets: CaipAssetType[],\n snapId: string,\n ): Promise<AssetMetadataResponse | undefined> {\n try {\n return (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnAssetsLookup,\n request: {\n jsonrpc: '2.0',\n method: 'onAssetLookup',\n params: {\n assets,\n },\n },\n })) as Promise<AssetMetadataResponse>;\n } catch (error) {\n // Ignore\n console.error(error);\n return undefined;\n }\n }\n\n /**\n * Get assets list for an account\n *\n * @param accountId - AccountId to get assets for\n * @param snapId - Snap ID for the account\n * @returns list of assets\n */\n async #getAssetsList(\n accountId: string,\n snapId: string,\n ): Promise<CaipAssetTypeOrId[]> {\n return await this.#getClient(snapId).listAccountAssets(accountId);\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n\n /**\n * Assert that the controller mutex is locked.\n *\n * @throws If the controller mutex is not locked.\n */\n #assertControllerMutexIsLocked() {\n if (!this.#controllerOperationMutex.isLocked()) {\n throw new Error(\n 'MultichainAssetsControllerError - Attempt to update state',\n );\n }\n }\n\n /**\n * Lock the controller mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * This wrapper ensures that each mutable operation that interacts with the\n * controller and that changes its state is executed in a mutually exclusive way,\n * preventing unsafe concurrent access that could lead to unpredictable behavior.\n *\n * @param callback - The function to execute while the controller mutex is locked.\n * @returns The result of the function.\n */\n async #withControllerLock<Result>(\n callback: MutuallyExclusiveCallback<Result>,\n ): Promise<Result> {\n return withLock(this.#controllerOperationMutex, callback);\n }\n}\n\n/**\n * Lock the given mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * @param mutex - The mutex to lock.\n * @param callback - The function to execute while the mutex is locked.\n * @returns The result of the function.\n */\nasync function withLock<Result>(\n mutex: Mutex,\n callback: MutuallyExclusiveCallback<Result>,\n): Promise<Result> {\n const releaseLock = await mutex.acquire();\n\n try {\n return await callback({ releaseLock });\n } finally {\n releaseLock();\n }\n}\n"]}
@@ -1,16 +1,15 @@
1
- import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
1
+ import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountAssetListUpdatedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
2
2
  import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedControllerMessenger } from "@metamask/base-controller";
3
3
  import type { CaipAssetType } from "@metamask/keyring-api";
4
4
  import type { GetPermissions } from "@metamask/permission-controller";
5
5
  import type { GetAllSnaps, HandleSnapRequest } from "@metamask/snaps-controllers";
6
6
  import type { FungibleAssetMetadata } from "@metamask/snaps-sdk";
7
- import type { AccountsControllerAccountAssetListUpdatedEvent } from "../../../accounts-controller/src/AccountsController.cjs";
8
7
  declare const controllerName = "MultichainAssetsController";
9
8
  export type MultichainAssetsControllerState = {
10
- metadata: {
9
+ assetsMetadata: {
11
10
  [asset: CaipAssetType]: FungibleAssetMetadata;
12
11
  };
13
- allNonEvmTokens: {
12
+ accountsAssets: {
14
13
  [account: string]: CaipAssetType[];
15
14
  };
16
15
  };
@@ -35,7 +34,7 @@ export type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<
35
34
  /**
36
35
  * Event emitted when the state of the {@link MultichainAssetsController} changes.
37
36
  */
38
- export type MultichainAssetsControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainAssetsControllerState>;
37
+ export type MultichainAssetsControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, MultichainAssetsControllerState>;
39
38
  /**
40
39
  * Actions exposed by the {@link MultichainAssetsController}.
41
40
  */
@@ -43,7 +42,7 @@ export type MultichainAssetsControllerActions = MultichainAssetsControllerGetSta
43
42
  /**
44
43
  * Events emitted by {@link MultichainAssetsController}.
45
44
  */
46
- export type MultichainAssetsControllerEvents = MultichainAssetsControllerStateChange;
45
+ export type MultichainAssetsControllerEvents = MultichainAssetsControllerStateChangeEvent;
47
46
  /**
48
47
  * Actions that this controller is allowed to call.
49
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAssetsController.d.cts","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EACnC,kCAAkC;AAEnC,OAAO,KAAK,EAEV,aAAa,EAEd,8BAA8B;AAG/B,OAAO,KAAK,EACV,cAAc,EAGf,wCAAwC;AACzC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAClB,oCAAoC;AACrC,OAAO,KAAK,EAAE,qBAAqB,EAAgB,4BAA4B;AAc/E,OAAO,KAAK,EAAE,8CAA8C,EAAE,gEAA4D;AAE1H,QAAA,MAAM,cAAc,+BAA+B,CAAC;AAEpD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,EAAE;QACR,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;IACF,eAAe,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAAA;KAAE,CAAC;CACzD,CAAC;AAGF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE;QACN,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,yCAAyC,IAAI,+BAA+B,CAE3F;AAED;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG,wBAAwB,CAC7E,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iCAAiC,GAC3C,wCAAwC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAC1C,qCAAqC,CAAC;AAcxC;;GAEG;AACH,KAAK,cAAc,GACf,iBAAiB,GACjB,WAAW,GACX,cAAc,GACd,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,GACrC,8CAA8C,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,6BAA6B,CAC7E,OAAO,cAAc,EACrB,iCAAiC,GAAG,cAAc,EAClD,gCAAgC,GAAG,aAAa,EAChD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAsBF,qBAAa,0BAA2B,SAAQ,cAAc,CAC5D,OAAO,cAAc,EACrB,+BAA+B,EAC/B,mCAAmC,CACpC;;gBAMa,EACV,SAAS,EACT,KAAU,GACX,EAAE;QACD,SAAS,EAAE,mCAAmC,CAAC;QAC/C,KAAK,CAAC,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;KAClD;CA2WF"}
1
+ {"version":3,"file":"MultichainAssetsController.d.cts","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,8CAA8C,EAC9C,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EACnC,kCAAkC;AAEnC,OAAO,KAAK,EAEV,aAAa,EAEd,8BAA8B;AAG/B,OAAO,KAAK,EACV,cAAc,EAGf,wCAAwC;AACzC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAClB,oCAAoC;AACrC,OAAO,KAAK,EAAE,qBAAqB,EAAgB,4BAA4B;AAc/E,QAAA,MAAM,cAAc,+BAA+B,CAAC;AAEpD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,EAAE;QACd,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;IACF,cAAc,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAAA;KAAE,CAAC;CACxD,CAAC;AAGF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE;QACN,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,yCAAyC,IAAI,+BAA+B,CAE3F;AAED;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG,wBAAwB,CAC7E,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,0CAA0C,GACpD,0BAA0B,CACxB,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,iCAAiC,GAC3C,wCAAwC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAC1C,0CAA0C,CAAC;AAc7C;;GAEG;AACH,KAAK,cAAc,GACf,iBAAiB,GACjB,WAAW,GACX,cAAc,GACd,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,GACrC,8CAA8C,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,6BAA6B,CAC7E,OAAO,cAAc,EACrB,iCAAiC,GAAG,cAAc,EAClD,gCAAgC,GAAG,aAAa,EAChD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAsBF,qBAAa,0BAA2B,SAAQ,cAAc,CAC5D,OAAO,cAAc,EACrB,+BAA+B,EAC/B,mCAAmC,CACpC;;gBAMa,EACV,SAAS,EACT,KAAU,GACX,EAAE;QACD,SAAS,EAAE,mCAAmC,CAAC;QAC/C,KAAK,CAAC,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;KAClD;CA2WF"}
@@ -1,16 +1,15 @@
1
- import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
1
+ import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountAssetListUpdatedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
2
2
  import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedControllerMessenger } from "@metamask/base-controller";
3
3
  import type { CaipAssetType } from "@metamask/keyring-api";
4
4
  import type { GetPermissions } from "@metamask/permission-controller";
5
5
  import type { GetAllSnaps, HandleSnapRequest } from "@metamask/snaps-controllers";
6
6
  import type { FungibleAssetMetadata } from "@metamask/snaps-sdk";
7
- import type { AccountsControllerAccountAssetListUpdatedEvent } from "../../../accounts-controller/src/AccountsController.mjs";
8
7
  declare const controllerName = "MultichainAssetsController";
9
8
  export type MultichainAssetsControllerState = {
10
- metadata: {
9
+ assetsMetadata: {
11
10
  [asset: CaipAssetType]: FungibleAssetMetadata;
12
11
  };
13
- allNonEvmTokens: {
12
+ accountsAssets: {
14
13
  [account: string]: CaipAssetType[];
15
14
  };
16
15
  };
@@ -35,7 +34,7 @@ export type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<
35
34
  /**
36
35
  * Event emitted when the state of the {@link MultichainAssetsController} changes.
37
36
  */
38
- export type MultichainAssetsControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainAssetsControllerState>;
37
+ export type MultichainAssetsControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, MultichainAssetsControllerState>;
39
38
  /**
40
39
  * Actions exposed by the {@link MultichainAssetsController}.
41
40
  */
@@ -43,7 +42,7 @@ export type MultichainAssetsControllerActions = MultichainAssetsControllerGetSta
43
42
  /**
44
43
  * Events emitted by {@link MultichainAssetsController}.
45
44
  */
46
- export type MultichainAssetsControllerEvents = MultichainAssetsControllerStateChange;
45
+ export type MultichainAssetsControllerEvents = MultichainAssetsControllerStateChangeEvent;
47
46
  /**
48
47
  * Actions that this controller is allowed to call.
49
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAssetsController.d.mts","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EACnC,kCAAkC;AAEnC,OAAO,KAAK,EAEV,aAAa,EAEd,8BAA8B;AAG/B,OAAO,KAAK,EACV,cAAc,EAGf,wCAAwC;AACzC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAClB,oCAAoC;AACrC,OAAO,KAAK,EAAE,qBAAqB,EAAgB,4BAA4B;AAc/E,OAAO,KAAK,EAAE,8CAA8C,EAAE,gEAA4D;AAE1H,QAAA,MAAM,cAAc,+BAA+B,CAAC;AAEpD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,EAAE;QACR,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;IACF,eAAe,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAAA;KAAE,CAAC;CACzD,CAAC;AAGF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE;QACN,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,yCAAyC,IAAI,+BAA+B,CAE3F;AAED;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG,wBAAwB,CAC7E,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG,0BAA0B,CAC5E,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iCAAiC,GAC3C,wCAAwC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAC1C,qCAAqC,CAAC;AAcxC;;GAEG;AACH,KAAK,cAAc,GACf,iBAAiB,GACjB,WAAW,GACX,cAAc,GACd,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,GACrC,8CAA8C,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,6BAA6B,CAC7E,OAAO,cAAc,EACrB,iCAAiC,GAAG,cAAc,EAClD,gCAAgC,GAAG,aAAa,EAChD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAsBF,qBAAa,0BAA2B,SAAQ,cAAc,CAC5D,OAAO,cAAc,EACrB,+BAA+B,EAC/B,mCAAmC,CACpC;;gBAMa,EACV,SAAS,EACT,KAAU,GACX,EAAE;QACD,SAAS,EAAE,mCAAmC,CAAC;QAC/C,KAAK,CAAC,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;KAClD;CA2WF"}
1
+ {"version":3,"file":"MultichainAssetsController.d.mts","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,8CAA8C,EAC9C,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EACnC,kCAAkC;AAEnC,OAAO,KAAK,EAEV,aAAa,EAEd,8BAA8B;AAG/B,OAAO,KAAK,EACV,cAAc,EAGf,wCAAwC;AACzC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAClB,oCAAoC;AACrC,OAAO,KAAK,EAAE,qBAAqB,EAAgB,4BAA4B;AAc/E,QAAA,MAAM,cAAc,+BAA+B,CAAC;AAEpD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,EAAE;QACd,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;IACF,cAAc,EAAE;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAAA;KAAE,CAAC;CACxD,CAAC;AAGF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE;QACN,CAAC,KAAK,EAAE,aAAa,GAAG,qBAAqB,CAAC;KAC/C,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,yCAAyC,IAAI,+BAA+B,CAE3F;AAED;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG,wBAAwB,CAC7E,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,0CAA0C,GACpD,0BAA0B,CACxB,OAAO,cAAc,EACrB,+BAA+B,CAChC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,iCAAiC,GAC3C,wCAAwC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAC1C,0CAA0C,CAAC;AAc7C;;GAEG;AACH,KAAK,cAAc,GACf,iBAAiB,GACjB,WAAW,GACX,cAAc,GACd,8CAA8C,CAAC;AAEnD;;GAEG;AACH,KAAK,aAAa,GACd,mCAAmC,GACnC,qCAAqC,GACrC,8CAA8C,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG,6BAA6B,CAC7E,OAAO,cAAc,EACrB,iCAAiC,GAAG,cAAc,EAClD,gCAAgC,GAAG,aAAa,EAChD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAsBF,qBAAa,0BAA2B,SAAQ,cAAc,CAC5D,OAAO,cAAc,EACrB,+BAA+B,EAC/B,mCAAmC,CACpC;;gBAMa,EACV,SAAS,EACT,KAAU,GACX,EAAE;QACD,SAAS,EAAE,mCAAmC,CAAC;QAC/C,KAAK,CAAC,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;KAClD;CA2WF"}
@@ -16,7 +16,6 @@ import { KeyringClient } from "@metamask/keyring-snap-client";
16
16
  import { HandlerType } from "@metamask/snaps-utils";
17
17
  import { hasProperty, isCaipAssetType, parseCaipAssetType } from "@metamask/utils";
18
18
  import { Mutex } from "async-mutex";
19
- import { v4 as uuid } from "uuid";
20
19
  import { getChainIdsCaveat } from "./utils.mjs";
21
20
  const controllerName = 'MultichainAssetsController';
22
21
  /**
@@ -28,7 +27,7 @@ const controllerName = 'MultichainAssetsController';
28
27
  * @returns The default {@link MultichainAssetsController} state.
29
28
  */
30
29
  export function getDefaultMultichainAssetsControllerState() {
31
- return { allNonEvmTokens: {}, metadata: {} };
30
+ return { accountsAssets: {}, assetsMetadata: {} };
32
31
  }
33
32
  /**
34
33
  * {@link MultichainAssetsController}'s metadata.
@@ -38,16 +37,16 @@ export function getDefaultMultichainAssetsControllerState() {
38
37
  * the `anonymous` flag.
39
38
  */
40
39
  const assetsControllerMetadata = {
41
- metadata: {
40
+ assetsMetadata: {
42
41
  persist: true,
43
42
  anonymous: false,
44
43
  },
45
- allNonEvmTokens: {
44
+ accountsAssets: {
46
45
  persist: true,
47
46
  anonymous: false,
48
47
  },
49
48
  };
50
- // TODO make this controller extends StaticIntervalPollingController and update all metadata once a day.
49
+ // TODO: make this controller extends StaticIntervalPollingController and update all assetsMetadata once a day.
51
50
  export class MultichainAssetsController extends BaseController {
52
51
  constructor({ messenger, state = {}, }) {
53
52
  super({
@@ -85,11 +84,9 @@ async function _MultichainAssetsController_handleAccountAssetListUpdated(event)
85
84
  let assetsForMetadataRefresh = new Set([]);
86
85
  for (const accountId in assetsToUpdate) {
87
86
  if (hasProperty(assetsToUpdate, accountId)) {
88
- const newAccountAssets = assetsToUpdate[accountId];
89
- if (newAccountAssets.added.length !== 0 ||
90
- newAccountAssets.removed.length !== 0) {
91
- const { added, removed } = newAccountAssets;
92
- const existing = this.state.allNonEvmTokens[accountId] || [];
87
+ const { added, removed } = assetsToUpdate[accountId];
88
+ if (added.length > 0 || removed.length > 0) {
89
+ const existing = this.state.accountsAssets[accountId] || [];
93
90
  const assets = new Set([
94
91
  ...existing,
95
92
  ...added.filter((asset) => isCaipAssetType(asset)),
@@ -102,12 +99,12 @@ async function _MultichainAssetsController_handleAccountAssetListUpdated(event)
102
99
  ...assets,
103
100
  ]);
104
101
  this.update((state) => {
105
- state.allNonEvmTokens[accountId] = Array.from(assets);
102
+ state.accountsAssets[accountId] = Array.from(assets);
106
103
  });
107
104
  }
108
105
  }
109
106
  }
110
- // trigger fetching metadata for new assets
107
+ // Trigger fetching metadata for new assets
111
108
  await __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_refreshAssetsMetadata).call(this, Array.from(assetsForMetadataRefresh));
112
109
  }, _MultichainAssetsController_isNonEvmAccount = function _MultichainAssetsController_isNonEvmAccount(account) {
113
110
  return (!isEvmAccountType(account.type) &&
@@ -130,7 +127,7 @@ async function _MultichainAssetsController_handleOnAccountAdded(account) {
130
127
  const assets = await __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_getAssetsList).call(this, account.id, account.metadata.snap.id);
131
128
  await __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_refreshAssetsMetadata).call(this, assets);
132
129
  this.update((state) => {
133
- state.allNonEvmTokens[account.id] = assets;
130
+ state.accountsAssets[account.id] = assets;
134
131
  });
135
132
  }
136
133
  }, _MultichainAssetsController_handleOnAccountRemovedEvent =
@@ -140,10 +137,12 @@ async function _MultichainAssetsController_handleOnAccountAdded(account) {
140
137
  * @param accountId - The new account id being removed.
141
138
  */
142
139
  async function _MultichainAssetsController_handleOnAccountRemovedEvent(accountId) {
143
- // Check if accountId is in allNonEvmTokens and if it is, remove it
144
- if (this.state.allNonEvmTokens[accountId]) {
140
+ // Check if accountId is in accountsAssets and if it is, remove it
141
+ if (this.state.accountsAssets[accountId]) {
145
142
  this.update((state) => {
146
- delete state.allNonEvmTokens[accountId];
143
+ // TODO: We are not deleting the assetsMetadata because we will soon make this controller extends StaticIntervalPollingController
144
+ // and update all assetsMetadata once a day.
145
+ delete state.accountsAssets[accountId];
147
146
  });
148
147
  }
149
148
  }, _MultichainAssetsController_refreshAssetsMetadata =
@@ -153,10 +152,11 @@ async function _MultichainAssetsController_handleOnAccountRemovedEvent(accountId
153
152
  * @param assets - The assets to refresh
154
153
  */
155
154
  async function _MultichainAssetsController_refreshAssetsMetadata(assets) {
156
- const assetsWithoutMetadata = assets.filter((asset) => !this.state.metadata[asset]);
157
- // call the snap to get the metadata
155
+ __classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_assertControllerMutexIsLocked).call(this);
156
+ const assetsWithoutMetadata = assets.filter((asset) => !this.state.assetsMetadata[asset]);
157
+ // Call the snap to get the metadata
158
158
  if (assetsWithoutMetadata.length > 0) {
159
- // check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps
159
+ // Check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps
160
160
  if (!assetsWithoutMetadata.every((asset) => {
161
161
  const { chainId } = parseCaipAssetType(asset);
162
162
  return Boolean(__classPrivateFieldGet(this, _MultichainAssetsController_instances, "m", _MultichainAssetsController_getAssetSnapFor).call(this, chainId));
@@ -195,8 +195,8 @@ async function _MultichainAssetsController_updateAssetsMetadata(assets) {
195
195
  }
196
196
  }
197
197
  this.update((state) => {
198
- state.metadata = {
199
- ...this.state.metadata,
198
+ state.assetsMetadata = {
199
+ ...this.state.assetsMetadata,
200
200
  ...newMetadata,
201
201
  };
202
202
  });
@@ -246,7 +246,6 @@ async function _MultichainAssetsController_getAssetsMetadataFrom(assets, snapId)
246
246
  origin: 'metamask',
247
247
  handler: HandlerType.OnAssetsLookup,
248
248
  request: {
249
- id: uuid(),
250
249
  jsonrpc: '2.0',
251
250
  method: 'onAssetLookup',
252
251
  params: {
@@ -256,7 +255,7 @@ async function _MultichainAssetsController_getAssetsMetadataFrom(assets, snapId)
256
255
  }));
257
256
  }
258
257
  catch (error) {
259
- // ignore
258
+ // Ignore
260
259
  console.error(error);
261
260
  return undefined;
262
261
  }
@@ -281,7 +280,7 @@ async function _MultichainAssetsController_getAssetsList(accountId, snapId) {
281
280
  });
282
281
  }, _MultichainAssetsController_assertControllerMutexIsLocked = function _MultichainAssetsController_assertControllerMutexIsLocked() {
283
282
  if (!__classPrivateFieldGet(this, _MultichainAssetsController_controllerOperationMutex, "f").isLocked()) {
284
- throw new Error('MultichainAssetsControllerError- Attempt to update state');
283
+ throw new Error('MultichainAssetsControllerError - Attempt to update state');
285
284
  }
286
285
  }, _MultichainAssetsController_withControllerLock =
287
286
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAssetsController.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n AccountAssetListUpdatedEventPayload,\n CaipAssetType,\n CaipAssetTypeOrId,\n} from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type {\n GetPermissions,\n PermissionConstraint,\n SubjectPermissions,\n} from '@metamask/permission-controller';\nimport type {\n GetAllSnaps,\n HandleSnapRequest,\n} from '@metamask/snaps-controllers';\nimport type { FungibleAssetMetadata, Snap, SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport {\n hasProperty,\n isCaipAssetType,\n parseCaipAssetType,\n type CaipChainId,\n} from '@metamask/utils';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\nimport type { MutexInterface } from 'async-mutex';\nimport { Mutex } from 'async-mutex';\nimport { v4 as uuid } from 'uuid';\n\nimport { getChainIdsCaveat } from './utils';\nimport type { AccountsControllerAccountAssetListUpdatedEvent } from '../../../accounts-controller/src/AccountsController';\n\nconst controllerName = 'MultichainAssetsController';\n\nexport type MultichainAssetsControllerState = {\n metadata: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n allNonEvmTokens: { [account: string]: CaipAssetType[] };\n};\n\n// Represents the response of the asset snap's onAssetLookup handler\nexport type AssetMetadataResponse = {\n assets: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n};\n\n/**\n * Constructs the default {@link MultichainAssetsController} 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 MultichainAssetsController} state.\n */\nexport function getDefaultMultichainAssetsControllerState(): MultichainAssetsControllerState {\n return { allNonEvmTokens: {}, metadata: {} };\n}\n\n/**\n * Returns the state of the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsControllerState\n>;\n\n/**\n * Event emitted when the state of the {@link MultichainAssetsController} changes.\n */\nexport type MultichainAssetsControllerStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsControllerState\n>;\n\n/**\n * Actions exposed by the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerActions =\n MultichainAssetsControllerGetStateAction;\n\n/**\n * Events emitted by {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerEvents =\n MultichainAssetsControllerStateChange;\n\n/**\n * A function executed within a mutually exclusive lock, with\n * a mutex releaser in its option bag.\n *\n * @param releaseLock - A function to release the lock.\n */\ntype MutuallyExclusiveCallback<Result> = ({\n releaseLock,\n}: {\n releaseLock: MutexInterface.Releaser;\n}) => Promise<Result>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | HandleSnapRequest\n | GetAllSnaps\n | GetPermissions\n | AccountsControllerListMultichainAccountsAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * Messenger type for the MultichainAssetsController.\n */\nexport type MultichainAssetsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n MultichainAssetsControllerActions | AllowedActions,\n MultichainAssetsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * {@link MultichainAssetsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst assetsControllerMetadata = {\n metadata: {\n persist: true,\n anonymous: false,\n },\n allNonEvmTokens: {\n persist: true,\n anonymous: false,\n },\n};\n\n// TODO make this controller extends StaticIntervalPollingController and update all metadata once a day.\n\nexport class MultichainAssetsController extends BaseController<\n typeof controllerName,\n MultichainAssetsControllerState,\n MultichainAssetsControllerMessenger\n> {\n // Mapping of CAIP-2 Chain ID to Asset Snaps.\n #snaps: Record<CaipChainId, Snap[]>;\n\n readonly #controllerOperationMutex = new Mutex();\n\n constructor({\n messenger,\n state = {},\n }: {\n messenger: MultichainAssetsControllerMessenger;\n state?: Partial<MultichainAssetsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: assetsControllerMetadata,\n state: {\n ...getDefaultMultichainAssetsControllerState(),\n ...state,\n },\n });\n\n this.#snaps = {};\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n async (account) => await this.#handleOnAccountAddedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n async (account) => await this.#handleOnAccountRemovedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountAssetListUpdated',\n async (event) => await this.#handleAccountAssetListUpdatedEvent(event),\n );\n }\n\n async #handleAccountAssetListUpdatedEvent(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n return this.#withControllerLock(async () =>\n this.#handleAccountAssetListUpdated(event),\n );\n }\n\n async #handleOnAccountAddedEvent(account: InternalAccount) {\n return this.#withControllerLock(async () =>\n this.#handleOnAccountAdded(account),\n );\n }\n\n /**\n * Function to update the assets list for an account\n *\n * @param event - The list of assets to update\n */\n async #handleAccountAssetListUpdated(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n this.#assertControllerMutexIsLocked();\n const assetsToUpdate = event.assets;\n let assetsForMetadataRefresh = new Set<CaipAssetType>([]);\n for (const accountId in assetsToUpdate) {\n if (hasProperty(assetsToUpdate, accountId)) {\n const newAccountAssets = assetsToUpdate[accountId];\n if (\n newAccountAssets.added.length !== 0 ||\n newAccountAssets.removed.length !== 0\n ) {\n const { added, removed } = newAccountAssets;\n const existing = this.state.allNonEvmTokens[accountId] || [];\n const assets = new Set<CaipAssetType>([\n ...existing,\n ...added.filter((asset) => isCaipAssetType(asset)),\n ]);\n for (const removedAsset of removed) {\n assets.delete(removedAsset);\n }\n assetsForMetadataRefresh = new Set([\n ...assetsForMetadataRefresh,\n ...assets,\n ]);\n this.update((state) => {\n state.allNonEvmTokens[accountId] = Array.from(assets);\n });\n }\n }\n }\n // trigger fetching metadata for new assets\n await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount): Promise<void> {\n if (!this.#isNonEvmAccount(account)) {\n // Nothing to do here for EVM accounts\n return;\n }\n this.#assertControllerMutexIsLocked();\n\n // Get assets list\n if (account.metadata.snap) {\n const assets = await this.#getAssetsList(\n account.id,\n account.metadata.snap.id,\n );\n await this.#refreshAssetsMetadata(assets);\n this.update((state) => {\n state.allNonEvmTokens[account.id] = assets;\n });\n }\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The new account id being removed.\n */\n async #handleOnAccountRemovedEvent(accountId: string): Promise<void> {\n // Check if accountId is in allNonEvmTokens and if it is, remove it\n if (this.state.allNonEvmTokens[accountId]) {\n this.update((state) => {\n delete state.allNonEvmTokens[accountId];\n });\n }\n }\n\n /**\n * Refreshes the assets snaps and metadata for the given list of assets\n *\n * @param assets - The assets to refresh\n */\n async #refreshAssetsMetadata(assets: CaipAssetType[]) {\n const assetsWithoutMetadata: CaipAssetType[] = assets.filter(\n (asset) => !this.state.metadata[asset],\n );\n\n // call the snap to get the metadata\n if (assetsWithoutMetadata.length > 0) {\n // check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps\n if (\n !assetsWithoutMetadata.every((asset: CaipAssetType) => {\n const { chainId } = parseCaipAssetType(asset);\n return Boolean(this.#getAssetSnapFor(chainId));\n })\n ) {\n this.#snaps = this.#getAssetSnaps();\n }\n await this.#updateAssetsMetadata(assetsWithoutMetadata);\n }\n }\n\n /**\n * Updates the assets metadata for the given list of assets\n *\n * @param assets - The assets to update\n */\n async #updateAssetsMetadata(assets: CaipAssetType[]) {\n // Creates a mapping of scope to their respective assets list.\n const assetsByScope: Record<CaipChainId, CaipAssetType[]> = {};\n for (const asset of assets) {\n const { chainId } = parseCaipAssetType(asset);\n if (!assetsByScope[chainId]) {\n assetsByScope[chainId] = [];\n }\n assetsByScope[chainId].push(asset);\n }\n let newMetadata: Record<CaipAssetType, FungibleAssetMetadata> = {};\n\n for (const chainId of Object.keys(assetsByScope) as CaipChainId[]) {\n const assetsForChain = assetsByScope[chainId];\n // Now fetch metadata from the associated asset Snaps:\n const snap = this.#getAssetSnapFor(chainId);\n if (snap) {\n const metadata = await this.#getAssetsMetadataFrom(\n assetsForChain,\n snap.id,\n );\n newMetadata = {\n ...newMetadata,\n ...(metadata?.assets ?? {}),\n };\n }\n }\n this.update((state) => {\n state.metadata = {\n ...this.state.metadata,\n ...newMetadata,\n };\n });\n }\n\n /**\n * Creates a mapping of CAIP-2 Chain ID to Asset Snaps.\n *\n * @returns A mapping of CAIP-2 Chain ID to Asset Snaps.\n */\n #getAssetSnaps(): Record<CaipChainId, Snap[]> {\n const snaps: Record<CaipChainId, Snap[]> = {};\n const allSnaps = this.#getAllSnaps();\n const allPermissions = allSnaps.map((snap) =>\n this.#getSnapsPermissions(snap.id),\n );\n\n for (const [index, permission] of allPermissions.entries()) {\n let scopes;\n for (const singlePermissionConstraint of Object.values(permission)) {\n scopes = getChainIdsCaveat(singlePermissionConstraint);\n if (!scopes) {\n continue;\n }\n for (const scope of scopes as CaipChainId[]) {\n if (!snaps[scope]) {\n snaps[scope] = [];\n }\n snaps[scope].push(allSnaps[index]);\n }\n }\n }\n return snaps;\n }\n\n /**\n * Returns the first asset snap for the given scope\n *\n * @param scope - The scope to get the asset snap for\n * @returns The asset snap for the given scope\n */\n #getAssetSnapFor(scope: CaipChainId): Snap | undefined {\n const allSnaps = this.#snaps[scope];\n // Pick only the first one, we ignore the other Snaps if there are multiple candidates for now.\n return allSnaps?.[0]; // Will be undefined if there's no Snaps candidate for this scope.\n }\n\n /**\n * Returns all the asset snaps\n *\n * @returns All the asset snaps\n */\n #getAllSnaps(): Snap[] {\n // TODO: Use dedicated SnapController's action once available for this:\n return this.messagingSystem\n .call('SnapController:getAll')\n .filter((snap) => snap.enabled && !snap.blocked);\n }\n\n /**\n * Returns the permissions for the given origin\n *\n * @param origin - The origin to get the permissions for\n * @returns The permissions for the given origin\n */\n #getSnapsPermissions(\n origin: string,\n ): SubjectPermissions<PermissionConstraint> {\n return this.messagingSystem.call(\n 'PermissionController:getPermissions',\n origin,\n ) as SubjectPermissions<PermissionConstraint>;\n }\n\n /**\n * Returns the metadata for the given assets\n *\n * @param assets - The assets to get metadata for\n * @param snapId - The snap ID to get metadata from\n * @returns The metadata for the assets\n */\n async #getAssetsMetadataFrom(\n assets: CaipAssetType[],\n snapId: string,\n ): Promise<AssetMetadataResponse | undefined> {\n try {\n return (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnAssetsLookup,\n request: {\n id: uuid(),\n jsonrpc: '2.0',\n method: 'onAssetLookup',\n params: {\n assets,\n },\n },\n })) as Promise<AssetMetadataResponse>;\n } catch (error) {\n // ignore\n console.error(error);\n return undefined;\n }\n }\n\n /**\n * Get assets list for an account\n *\n * @param accountId - AccountId to get assets for\n * @param snapId - Snap ID for the account\n * @returns list of assets\n */\n async #getAssetsList(\n accountId: string,\n snapId: string,\n ): Promise<CaipAssetTypeOrId[]> {\n return await this.#getClient(snapId).listAccountAssets(accountId);\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n\n /**\n * Assert that the controller mutex is locked.\n *\n * @throws If the controller mutex is not locked.\n */\n #assertControllerMutexIsLocked() {\n if (!this.#controllerOperationMutex.isLocked()) {\n throw new Error(\n 'MultichainAssetsControllerError- Attempt to update state',\n );\n }\n }\n\n /**\n * Lock the controller mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * This wrapper ensures that each mutable operation that interacts with the\n * controller and that changes its state is executed in a mutually exclusive way,\n * preventing unsafe concurrent access that could lead to unpredictable behavior.\n *\n * @param callback - The function to execute while the controller mutex is locked.\n * @returns The result of the function.\n */\n async #withControllerLock<Result>(\n callback: MutuallyExclusiveCallback<Result>,\n ): Promise<Result> {\n return withLock(this.#controllerOperationMutex, callback);\n }\n}\n\n/**\n * Lock the given mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * @param mutex - The mutex to lock.\n * @param callback - The function to execute while the mutex is locked.\n * @returns The result of the function.\n */\nasync function withLock<Result>(\n mutex: Mutex,\n callback: MutuallyExclusiveCallback<Result>,\n): Promise<Result> {\n const releaseLock = await mutex.acquire();\n\n try {\n return await callback({ releaseLock });\n } finally {\n releaseLock();\n }\n}\n"]}
1
+ {"version":3,"file":"MultichainAssetsController.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/MultichainAssetsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountAssetListUpdatedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n AccountAssetListUpdatedEventPayload,\n CaipAssetType,\n CaipAssetTypeOrId,\n} from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type {\n GetPermissions,\n PermissionConstraint,\n SubjectPermissions,\n} from '@metamask/permission-controller';\nimport type {\n GetAllSnaps,\n HandleSnapRequest,\n} from '@metamask/snaps-controllers';\nimport type { FungibleAssetMetadata, Snap, SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport {\n hasProperty,\n isCaipAssetType,\n parseCaipAssetType,\n type CaipChainId,\n} from '@metamask/utils';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\nimport type { MutexInterface } from 'async-mutex';\nimport { Mutex } from 'async-mutex';\n\nimport { getChainIdsCaveat } from './utils';\n\nconst controllerName = 'MultichainAssetsController';\n\nexport type MultichainAssetsControllerState = {\n assetsMetadata: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n accountsAssets: { [account: string]: CaipAssetType[] };\n};\n\n// Represents the response of the asset snap's onAssetLookup handler\nexport type AssetMetadataResponse = {\n assets: {\n [asset: CaipAssetType]: FungibleAssetMetadata;\n };\n};\n\n/**\n * Constructs the default {@link MultichainAssetsController} 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 MultichainAssetsController} state.\n */\nexport function getDefaultMultichainAssetsControllerState(): MultichainAssetsControllerState {\n return { accountsAssets: {}, assetsMetadata: {} };\n}\n\n/**\n * Returns the state of the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsControllerState\n>;\n\n/**\n * Event emitted when the state of the {@link MultichainAssetsController} changes.\n */\nexport type MultichainAssetsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsControllerState\n >;\n\n/**\n * Actions exposed by the {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerActions =\n MultichainAssetsControllerGetStateAction;\n\n/**\n * Events emitted by {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerEvents =\n MultichainAssetsControllerStateChangeEvent;\n\n/**\n * A function executed within a mutually exclusive lock, with\n * a mutex releaser in its option bag.\n *\n * @param releaseLock - A function to release the lock.\n */\ntype MutuallyExclusiveCallback<Result> = ({\n releaseLock,\n}: {\n releaseLock: MutexInterface.Releaser;\n}) => Promise<Result>;\n\n/**\n * Actions that this controller is allowed to call.\n */\ntype AllowedActions =\n | HandleSnapRequest\n | GetAllSnaps\n | GetPermissions\n | AccountsControllerListMultichainAccountsAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\ntype AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * Messenger type for the MultichainAssetsController.\n */\nexport type MultichainAssetsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n MultichainAssetsControllerActions | AllowedActions,\n MultichainAssetsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * {@link MultichainAssetsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst assetsControllerMetadata = {\n assetsMetadata: {\n persist: true,\n anonymous: false,\n },\n accountsAssets: {\n persist: true,\n anonymous: false,\n },\n};\n\n// TODO: make this controller extends StaticIntervalPollingController and update all assetsMetadata once a day.\n\nexport class MultichainAssetsController extends BaseController<\n typeof controllerName,\n MultichainAssetsControllerState,\n MultichainAssetsControllerMessenger\n> {\n // Mapping of CAIP-2 Chain ID to Asset Snaps.\n #snaps: Record<CaipChainId, Snap[]>;\n\n readonly #controllerOperationMutex = new Mutex();\n\n constructor({\n messenger,\n state = {},\n }: {\n messenger: MultichainAssetsControllerMessenger;\n state?: Partial<MultichainAssetsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: assetsControllerMetadata,\n state: {\n ...getDefaultMultichainAssetsControllerState(),\n ...state,\n },\n });\n\n this.#snaps = {};\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n async (account) => await this.#handleOnAccountAddedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n async (account) => await this.#handleOnAccountRemovedEvent(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountAssetListUpdated',\n async (event) => await this.#handleAccountAssetListUpdatedEvent(event),\n );\n }\n\n async #handleAccountAssetListUpdatedEvent(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n return this.#withControllerLock(async () =>\n this.#handleAccountAssetListUpdated(event),\n );\n }\n\n async #handleOnAccountAddedEvent(account: InternalAccount) {\n return this.#withControllerLock(async () =>\n this.#handleOnAccountAdded(account),\n );\n }\n\n /**\n * Function to update the assets list for an account\n *\n * @param event - The list of assets to update\n */\n async #handleAccountAssetListUpdated(\n event: AccountAssetListUpdatedEventPayload,\n ) {\n this.#assertControllerMutexIsLocked();\n\n const assetsToUpdate = event.assets;\n let assetsForMetadataRefresh = new Set<CaipAssetType>([]);\n for (const accountId in assetsToUpdate) {\n if (hasProperty(assetsToUpdate, accountId)) {\n const { added, removed } = assetsToUpdate[accountId];\n if (added.length > 0 || removed.length > 0) {\n const existing = this.state.accountsAssets[accountId] || [];\n const assets = new Set<CaipAssetType>([\n ...existing,\n ...added.filter((asset) => isCaipAssetType(asset)),\n ]);\n for (const removedAsset of removed) {\n assets.delete(removedAsset);\n }\n assetsForMetadataRefresh = new Set([\n ...assetsForMetadataRefresh,\n ...assets,\n ]);\n this.update((state) => {\n state.accountsAssets[accountId] = Array.from(assets);\n });\n }\n }\n }\n // Trigger fetching metadata for new assets\n await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount): Promise<void> {\n if (!this.#isNonEvmAccount(account)) {\n // Nothing to do here for EVM accounts\n return;\n }\n this.#assertControllerMutexIsLocked();\n\n // Get assets list\n if (account.metadata.snap) {\n const assets = await this.#getAssetsList(\n account.id,\n account.metadata.snap.id,\n );\n await this.#refreshAssetsMetadata(assets);\n this.update((state) => {\n state.accountsAssets[account.id] = assets;\n });\n }\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The new account id being removed.\n */\n async #handleOnAccountRemovedEvent(accountId: string): Promise<void> {\n // Check if accountId is in accountsAssets and if it is, remove it\n if (this.state.accountsAssets[accountId]) {\n this.update((state) => {\n // TODO: We are not deleting the assetsMetadata because we will soon make this controller extends StaticIntervalPollingController\n // and update all assetsMetadata once a day.\n delete state.accountsAssets[accountId];\n });\n }\n }\n\n /**\n * Refreshes the assets snaps and metadata for the given list of assets\n *\n * @param assets - The assets to refresh\n */\n async #refreshAssetsMetadata(assets: CaipAssetType[]) {\n this.#assertControllerMutexIsLocked();\n\n const assetsWithoutMetadata: CaipAssetType[] = assets.filter(\n (asset) => !this.state.assetsMetadata[asset],\n );\n\n // Call the snap to get the metadata\n if (assetsWithoutMetadata.length > 0) {\n // Check if for every asset in assetsWithoutMetadata there is a snap in snaps by chainId else call getAssetSnaps\n if (\n !assetsWithoutMetadata.every((asset: CaipAssetType) => {\n const { chainId } = parseCaipAssetType(asset);\n return Boolean(this.#getAssetSnapFor(chainId));\n })\n ) {\n this.#snaps = this.#getAssetSnaps();\n }\n await this.#updateAssetsMetadata(assetsWithoutMetadata);\n }\n }\n\n /**\n * Updates the assets metadata for the given list of assets\n *\n * @param assets - The assets to update\n */\n async #updateAssetsMetadata(assets: CaipAssetType[]) {\n // Creates a mapping of scope to their respective assets list.\n const assetsByScope: Record<CaipChainId, CaipAssetType[]> = {};\n for (const asset of assets) {\n const { chainId } = parseCaipAssetType(asset);\n if (!assetsByScope[chainId]) {\n assetsByScope[chainId] = [];\n }\n assetsByScope[chainId].push(asset);\n }\n\n let newMetadata: Record<CaipAssetType, FungibleAssetMetadata> = {};\n for (const chainId of Object.keys(assetsByScope) as CaipChainId[]) {\n const assetsForChain = assetsByScope[chainId];\n // Now fetch metadata from the associated asset Snaps:\n const snap = this.#getAssetSnapFor(chainId);\n if (snap) {\n const metadata = await this.#getAssetsMetadataFrom(\n assetsForChain,\n snap.id,\n );\n newMetadata = {\n ...newMetadata,\n ...(metadata?.assets ?? {}),\n };\n }\n }\n this.update((state) => {\n state.assetsMetadata = {\n ...this.state.assetsMetadata,\n ...newMetadata,\n };\n });\n }\n\n /**\n * Creates a mapping of CAIP-2 Chain ID to Asset Snaps.\n *\n * @returns A mapping of CAIP-2 Chain ID to Asset Snaps.\n */\n #getAssetSnaps(): Record<CaipChainId, Snap[]> {\n const snaps: Record<CaipChainId, Snap[]> = {};\n const allSnaps = this.#getAllSnaps();\n const allPermissions = allSnaps.map((snap) =>\n this.#getSnapsPermissions(snap.id),\n );\n\n for (const [index, permission] of allPermissions.entries()) {\n let scopes;\n for (const singlePermissionConstraint of Object.values(permission)) {\n scopes = getChainIdsCaveat(singlePermissionConstraint);\n if (!scopes) {\n continue;\n }\n for (const scope of scopes as CaipChainId[]) {\n if (!snaps[scope]) {\n snaps[scope] = [];\n }\n snaps[scope].push(allSnaps[index]);\n }\n }\n }\n return snaps;\n }\n\n /**\n * Returns the first asset snap for the given scope\n *\n * @param scope - The scope to get the asset snap for\n * @returns The asset snap for the given scope\n */\n #getAssetSnapFor(scope: CaipChainId): Snap | undefined {\n const allSnaps = this.#snaps[scope];\n // Pick only the first one, we ignore the other Snaps if there are multiple candidates for now.\n return allSnaps?.[0]; // Will be undefined if there's no Snaps candidate for this scope.\n }\n\n /**\n * Returns all the asset snaps\n *\n * @returns All the asset snaps\n */\n #getAllSnaps(): Snap[] {\n // TODO: Use dedicated SnapController's action once available for this:\n return this.messagingSystem\n .call('SnapController:getAll')\n .filter((snap) => snap.enabled && !snap.blocked);\n }\n\n /**\n * Returns the permissions for the given origin\n *\n * @param origin - The origin to get the permissions for\n * @returns The permissions for the given origin\n */\n #getSnapsPermissions(\n origin: string,\n ): SubjectPermissions<PermissionConstraint> {\n return this.messagingSystem.call(\n 'PermissionController:getPermissions',\n origin,\n ) as SubjectPermissions<PermissionConstraint>;\n }\n\n /**\n * Returns the metadata for the given assets\n *\n * @param assets - The assets to get metadata for\n * @param snapId - The snap ID to get metadata from\n * @returns The metadata for the assets\n */\n async #getAssetsMetadataFrom(\n assets: CaipAssetType[],\n snapId: string,\n ): Promise<AssetMetadataResponse | undefined> {\n try {\n return (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnAssetsLookup,\n request: {\n jsonrpc: '2.0',\n method: 'onAssetLookup',\n params: {\n assets,\n },\n },\n })) as Promise<AssetMetadataResponse>;\n } catch (error) {\n // Ignore\n console.error(error);\n return undefined;\n }\n }\n\n /**\n * Get assets list for an account\n *\n * @param accountId - AccountId to get assets for\n * @param snapId - Snap ID for the account\n * @returns list of assets\n */\n async #getAssetsList(\n accountId: string,\n snapId: string,\n ): Promise<CaipAssetTypeOrId[]> {\n return await this.#getClient(snapId).listAccountAssets(accountId);\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n\n /**\n * Assert that the controller mutex is locked.\n *\n * @throws If the controller mutex is not locked.\n */\n #assertControllerMutexIsLocked() {\n if (!this.#controllerOperationMutex.isLocked()) {\n throw new Error(\n 'MultichainAssetsControllerError - Attempt to update state',\n );\n }\n }\n\n /**\n * Lock the controller mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * This wrapper ensures that each mutable operation that interacts with the\n * controller and that changes its state is executed in a mutually exclusive way,\n * preventing unsafe concurrent access that could lead to unpredictable behavior.\n *\n * @param callback - The function to execute while the controller mutex is locked.\n * @returns The result of the function.\n */\n async #withControllerLock<Result>(\n callback: MutuallyExclusiveCallback<Result>,\n ): Promise<Result> {\n return withLock(this.#controllerOperationMutex, callback);\n }\n}\n\n/**\n * Lock the given mutex before executing the given function,\n * and release it after the function is resolved or after an\n * error is thrown.\n *\n * @param mutex - The mutex to lock.\n * @param callback - The function to execute while the mutex is locked.\n * @returns The result of the function.\n */\nasync function withLock<Result>(\n mutex: Mutex,\n callback: MutuallyExclusiveCallback<Result>,\n): Promise<Result> {\n const releaseLock = await mutex.acquire();\n\n try {\n return await callback({ releaseLock });\n } finally {\n releaseLock();\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultichainAssetsController = void 0;
3
+ exports.getDefaultMultichainAssetsControllerState = exports.MultichainAssetsController = void 0;
4
4
  var MultichainAssetsController_1 = require("./MultichainAssetsController.cjs");
5
5
  Object.defineProperty(exports, "MultichainAssetsController", { enumerable: true, get: function () { return MultichainAssetsController_1.MultichainAssetsController; } });
6
+ Object.defineProperty(exports, "getDefaultMultichainAssetsControllerState", { enumerable: true, get: function () { return MultichainAssetsController_1.getDefaultMultichainAssetsControllerState; } });
6
7
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":";;;AAAA,+EAA0E;AAAjE,wIAAA,0BAA0B,OAAA","sourcesContent":["export { MultichainAssetsController } from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChange,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":";;;AAAA,+EAGsC;AAFpC,wIAAA,0BAA0B,OAAA;AAC1B,uJAAA,yCAAyC,OAAA","sourcesContent":["export {\n MultichainAssetsController,\n getDefaultMultichainAssetsControllerState,\n} from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChangeEvent,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
@@ -1,3 +1,3 @@
1
- export { MultichainAssetsController } from "./MultichainAssetsController.cjs";
2
- export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChange, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController.cjs";
1
+ export { MultichainAssetsController, getDefaultMultichainAssetsControllerState, } from "./MultichainAssetsController.cjs";
2
+ export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChangeEvent, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController.cjs";
3
3
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,yCAAqC;AAE1E,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,qCAAqC,EACrC,iCAAiC,EACjC,gCAAgC,EAChC,mCAAmC,GACpC,yCAAqC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,yCAAyC,GAC1C,yCAAqC;AAEtC,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,0CAA0C,EAC1C,iCAAiC,EACjC,gCAAgC,EAChC,mCAAmC,GACpC,yCAAqC"}
@@ -1,3 +1,3 @@
1
- export { MultichainAssetsController } from "./MultichainAssetsController.mjs";
2
- export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChange, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController.mjs";
1
+ export { MultichainAssetsController, getDefaultMultichainAssetsControllerState, } from "./MultichainAssetsController.mjs";
2
+ export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChangeEvent, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController.mjs";
3
3
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,yCAAqC;AAE1E,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,qCAAqC,EACrC,iCAAiC,EACjC,gCAAgC,EAChC,mCAAmC,GACpC,yCAAqC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,yCAAyC,GAC1C,yCAAqC;AAEtC,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,0CAA0C,EAC1C,iCAAiC,EACjC,gCAAgC,EAChC,mCAAmC,GACpC,yCAAqC"}
@@ -1,2 +1,2 @@
1
- export { MultichainAssetsController } from "./MultichainAssetsController.mjs";
1
+ export { MultichainAssetsController, getDefaultMultichainAssetsControllerState } from "./MultichainAssetsController.mjs";
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,yCAAqC","sourcesContent":["export { MultichainAssetsController } from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChange,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsController/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,yCAAyC,EAC1C,yCAAqC","sourcesContent":["export {\n MultichainAssetsController,\n getDefaultMultichainAssetsControllerState,\n} from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChangeEvent,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
package/dist/index.cjs CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.MultichainAssetsController = exports.MultichainNativeAssets = exports.MultichainNetworks = exports.NETWORK_ASSETS_MAP = exports.BALANCE_UPDATE_INTERVALS = exports.MultichainBalancesController = exports.BalancesTracker = exports.Cryptocurrency = exports.RatesController = exports.getNativeTokenAddress = exports.SUPPORTED_CHAIN_IDS = exports.CodefiTokenPricesServiceV2 = exports.getKeyByValue = exports.fetchTokenContractExchangeRates = exports.getFormattedIpfsUrl = exports.formatIconUrlWithProxy = exports.isTokenDetectionSupportedForNetwork = exports.TokensController = exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.TokenListController = exports.TokenDetectionController = exports.TokenBalancesController = exports.NftDetectionController = exports.NftController = exports.getDefaultNftControllerState = exports.AssetsContractController = exports.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID = exports.AccountTrackerController = void 0;
17
+ exports.getDefaultMultichainAssetsControllerState = exports.MultichainAssetsController = exports.MultichainNativeAssets = exports.MultichainNetworks = exports.NETWORK_ASSETS_MAP = exports.BALANCE_UPDATE_INTERVALS = exports.MultichainBalancesController = exports.BalancesTracker = exports.Cryptocurrency = exports.RatesController = exports.getNativeTokenAddress = exports.SUPPORTED_CHAIN_IDS = exports.CodefiTokenPricesServiceV2 = exports.getKeyByValue = exports.fetchTokenContractExchangeRates = exports.getFormattedIpfsUrl = exports.formatIconUrlWithProxy = exports.isTokenDetectionSupportedForNetwork = exports.TokensController = exports.TokenRatesController = exports.getDefaultTokenRatesControllerState = exports.TokenListController = exports.TokenDetectionController = exports.TokenBalancesController = exports.NftDetectionController = exports.NftController = exports.getDefaultNftControllerState = exports.AssetsContractController = exports.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID = exports.AccountTrackerController = void 0;
18
18
  var AccountTrackerController_1 = require("./AccountTrackerController.cjs");
19
19
  Object.defineProperty(exports, "AccountTrackerController", { enumerable: true, get: function () { return AccountTrackerController_1.AccountTrackerController; } });
20
20
  var AssetsContractController_1 = require("./AssetsContractController.cjs");
@@ -60,4 +60,5 @@ Object.defineProperty(exports, "MultichainNetworks", { enumerable: true, get: fu
60
60
  Object.defineProperty(exports, "MultichainNativeAssets", { enumerable: true, get: function () { return MultichainBalancesController_1.MultichainNativeAssets; } });
61
61
  var MultichainAssetsController_1 = require("./MultichainAssetsController/index.cjs");
62
62
  Object.defineProperty(exports, "MultichainAssetsController", { enumerable: true, get: function () { return MultichainAssetsController_1.MultichainAssetsController; } });
63
+ Object.defineProperty(exports, "getDefaultMultichainAssetsControllerState", { enumerable: true, get: function () { return MultichainAssetsController_1.getDefaultMultichainAssetsControllerState; } });
63
64
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASA,2EAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AAuBjC,2EAGoC;AAFlC,mJAAA,uCAAuC,OAAA;AACvC,oIAAA,wBAAwB,OAAA;AAE1B,+DAAyC;AAYzC,qDAA8E;AAArE,6HAAA,4BAA4B,OAAA;AAAE,8GAAA,aAAa,OAAA;AAwBpD,uEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAS/B,yEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAQhC,2EAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AAWjC,iEAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAa5B,mEAGgC;AAF9B,2IAAA,mCAAmC,OAAA;AACnC,4HAAA,oBAAoB,OAAA;AAWtB,2DAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,+CAMsB;AALpB,iIAAA,mCAAmC,OAAA;AACnC,oHAAA,sBAAsB,OAAA;AACtB,iHAAA,mBAAmB,OAAA;AACnB,6HAAA,+BAA+B,OAAA;AAC/B,2GAAA,aAAa,OAAA;AAEf,yEAIgC;AAH9B,kIAAA,0BAA0B,OAAA;AAC1B,2HAAA,mBAAmB,OAAA;AACnB,6HAAA,qBAAqB,OAAA;AAEvB,+DAAoE;AAA3D,kHAAA,eAAe,OAAA;AAAE,iHAAA,cAAc,OAAA;AAWxC,yFAQwC;AAPtC,+HAAA,eAAe,OAAA;AACf,4IAAA,4BAA4B,OAAA;AAC5B,YAAY;AACZ,wIAAA,wBAAwB,OAAA;AACxB,kIAAA,kBAAkB,OAAA;AAClB,kIAAA,kBAAkB,OAAA;AAClB,sIAAA,sBAAsB,OAAA;AAYxB,qFAA0E;AAAjE,wIAAA,0BAA0B,OAAA","sourcesContent":["export type {\n AccountInformation,\n AccountTrackerControllerMessenger,\n AccountTrackerControllerState,\n AccountTrackerControllerActions,\n AccountTrackerControllerGetStateAction,\n AccountTrackerControllerStateChangeEvent,\n AccountTrackerControllerEvents,\n} from './AccountTrackerController';\nexport { AccountTrackerController } from './AccountTrackerController';\nexport type {\n AssetsContractControllerActions,\n AssetsContractControllerEvents,\n AssetsContractControllerGetERC20StandardAction,\n AssetsContractControllerGetERC721StandardAction,\n AssetsContractControllerGetERC1155StandardAction,\n AssetsContractControllerGetERC20BalanceOfAction,\n AssetsContractControllerGetERC20TokenDecimalsAction,\n AssetsContractControllerGetERC20TokenNameAction,\n AssetsContractControllerGetERC721NftTokenIdAction,\n AssetsContractControllerGetERC721TokenURIAction,\n AssetsContractControllerGetERC721AssetNameAction,\n AssetsContractControllerGetERC721AssetSymbolAction,\n AssetsContractControllerGetERC721OwnerOfAction,\n AssetsContractControllerGetERC1155TokenURIAction,\n AssetsContractControllerGetERC1155BalanceOfAction,\n AssetsContractControllerTransferSingleERC1155Action,\n AssetsContractControllerGetTokenStandardAndDetailsAction,\n AssetsContractControllerGetBalancesInSingleCallAction,\n AssetsContractControllerMessenger,\n BalanceMap,\n} from './AssetsContractController';\nexport {\n SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID,\n AssetsContractController,\n} from './AssetsContractController';\nexport * from './CurrencyRateController';\nexport type {\n NftControllerState,\n NftControllerMessenger,\n NftControllerActions,\n NftControllerGetStateAction,\n NftControllerEvents,\n NftControllerStateChangeEvent,\n Nft,\n NftContract,\n NftMetadata,\n} from './NftController';\nexport { getDefaultNftControllerState, NftController } from './NftController';\nexport type {\n NftDetectionControllerMessenger,\n ApiNft,\n ApiNftContract,\n ApiNftLastSale,\n ApiNftCreator,\n ReservoirResponse,\n TokensResponse,\n BlockaidResultType,\n Blockaid,\n Market,\n TokenResponse,\n TopBid,\n LastSale,\n FeeBreakdown,\n Attributes,\n Collection,\n Royalties,\n Ownership,\n FloorAsk,\n Price,\n Metadata,\n} from './NftDetectionController';\nexport { NftDetectionController } from './NftDetectionController';\nexport type {\n TokenBalancesControllerMessenger,\n TokenBalancesControllerActions,\n TokenBalancesControllerGetStateAction,\n TokenBalancesControllerEvents,\n TokenBalancesControllerStateChangeEvent,\n TokenBalancesControllerState,\n} from './TokenBalancesController';\nexport { TokenBalancesController } from './TokenBalancesController';\nexport type {\n TokenDetectionControllerMessenger,\n TokenDetectionControllerActions,\n TokenDetectionControllerGetStateAction,\n TokenDetectionControllerEvents,\n TokenDetectionControllerStateChangeEvent,\n} from './TokenDetectionController';\nexport { TokenDetectionController } from './TokenDetectionController';\nexport type {\n TokenListState,\n TokenListToken,\n TokenListMap,\n TokenListStateChange,\n TokenListControllerEvents,\n GetTokenListState,\n TokenListControllerActions,\n TokenListControllerMessenger,\n} from './TokenListController';\nexport { TokenListController } from './TokenListController';\nexport type {\n ContractExchangeRates,\n ContractMarketData,\n Token,\n TokenRatesControllerActions,\n TokenRatesControllerEvents,\n TokenRatesControllerGetStateAction,\n TokenRatesControllerMessenger,\n TokenRatesControllerState,\n TokenRatesControllerStateChangeEvent,\n MarketDataDetails,\n} from './TokenRatesController';\nexport {\n getDefaultTokenRatesControllerState,\n TokenRatesController,\n} from './TokenRatesController';\nexport type {\n TokensControllerState,\n TokensControllerActions,\n TokensControllerGetStateAction,\n TokensControllerAddDetectedTokensAction,\n TokensControllerEvents,\n TokensControllerStateChangeEvent,\n TokensControllerMessenger,\n} from './TokensController';\nexport { TokensController } from './TokensController';\nexport {\n isTokenDetectionSupportedForNetwork,\n formatIconUrlWithProxy,\n getFormattedIpfsUrl,\n fetchTokenContractExchangeRates,\n getKeyByValue,\n} from './assetsUtil';\nexport {\n CodefiTokenPricesServiceV2,\n SUPPORTED_CHAIN_IDS,\n getNativeTokenAddress,\n} from './token-prices-service';\nexport { RatesController, Cryptocurrency } from './RatesController';\nexport type {\n RatesControllerState,\n RatesControllerEvents,\n RatesControllerActions,\n RatesControllerMessenger,\n RatesControllerGetStateAction,\n RatesControllerStateChangeEvent,\n RatesControllerPollingStartedEvent,\n RatesControllerPollingStoppedEvent,\n} from './RatesController';\nexport {\n BalancesTracker,\n MultichainBalancesController,\n // constants\n BALANCE_UPDATE_INTERVALS,\n NETWORK_ASSETS_MAP,\n MultichainNetworks,\n MultichainNativeAssets,\n} from './MultichainBalancesController';\nexport type {\n MultichainBalancesControllerState,\n MultichainBalancesControllerGetStateAction,\n MultichainBalancesControllerUpdateBalancesAction,\n MultichainBalancesControllerStateChange,\n MultichainBalancesControllerActions,\n MultichainBalancesControllerEvents,\n MultichainBalancesControllerMessenger,\n} from './MultichainBalancesController';\n\nexport { MultichainAssetsController } from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChange,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASA,2EAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AAuBjC,2EAGoC;AAFlC,mJAAA,uCAAuC,OAAA;AACvC,oIAAA,wBAAwB,OAAA;AAE1B,+DAAyC;AAYzC,qDAA8E;AAArE,6HAAA,4BAA4B,OAAA;AAAE,8GAAA,aAAa,OAAA;AAwBpD,uEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAS/B,yEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAQhC,2EAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AAWjC,iEAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAa5B,mEAGgC;AAF9B,2IAAA,mCAAmC,OAAA;AACnC,4HAAA,oBAAoB,OAAA;AAWtB,2DAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,+CAMsB;AALpB,iIAAA,mCAAmC,OAAA;AACnC,oHAAA,sBAAsB,OAAA;AACtB,iHAAA,mBAAmB,OAAA;AACnB,6HAAA,+BAA+B,OAAA;AAC/B,2GAAA,aAAa,OAAA;AAEf,yEAIgC;AAH9B,kIAAA,0BAA0B,OAAA;AAC1B,2HAAA,mBAAmB,OAAA;AACnB,6HAAA,qBAAqB,OAAA;AAEvB,+DAAoE;AAA3D,kHAAA,eAAe,OAAA;AAAE,iHAAA,cAAc,OAAA;AAWxC,yFAQwC;AAPtC,+HAAA,eAAe,OAAA;AACf,4IAAA,4BAA4B,OAAA;AAC5B,YAAY;AACZ,wIAAA,wBAAwB,OAAA;AACxB,kIAAA,kBAAkB,OAAA;AAClB,kIAAA,kBAAkB,OAAA;AAClB,sIAAA,sBAAsB,OAAA;AAYxB,qFAGsC;AAFpC,wIAAA,0BAA0B,OAAA;AAC1B,uJAAA,yCAAyC,OAAA","sourcesContent":["export type {\n AccountInformation,\n AccountTrackerControllerMessenger,\n AccountTrackerControllerState,\n AccountTrackerControllerActions,\n AccountTrackerControllerGetStateAction,\n AccountTrackerControllerStateChangeEvent,\n AccountTrackerControllerEvents,\n} from './AccountTrackerController';\nexport { AccountTrackerController } from './AccountTrackerController';\nexport type {\n AssetsContractControllerActions,\n AssetsContractControllerEvents,\n AssetsContractControllerGetERC20StandardAction,\n AssetsContractControllerGetERC721StandardAction,\n AssetsContractControllerGetERC1155StandardAction,\n AssetsContractControllerGetERC20BalanceOfAction,\n AssetsContractControllerGetERC20TokenDecimalsAction,\n AssetsContractControllerGetERC20TokenNameAction,\n AssetsContractControllerGetERC721NftTokenIdAction,\n AssetsContractControllerGetERC721TokenURIAction,\n AssetsContractControllerGetERC721AssetNameAction,\n AssetsContractControllerGetERC721AssetSymbolAction,\n AssetsContractControllerGetERC721OwnerOfAction,\n AssetsContractControllerGetERC1155TokenURIAction,\n AssetsContractControllerGetERC1155BalanceOfAction,\n AssetsContractControllerTransferSingleERC1155Action,\n AssetsContractControllerGetTokenStandardAndDetailsAction,\n AssetsContractControllerGetBalancesInSingleCallAction,\n AssetsContractControllerMessenger,\n BalanceMap,\n} from './AssetsContractController';\nexport {\n SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID,\n AssetsContractController,\n} from './AssetsContractController';\nexport * from './CurrencyRateController';\nexport type {\n NftControllerState,\n NftControllerMessenger,\n NftControllerActions,\n NftControllerGetStateAction,\n NftControllerEvents,\n NftControllerStateChangeEvent,\n Nft,\n NftContract,\n NftMetadata,\n} from './NftController';\nexport { getDefaultNftControllerState, NftController } from './NftController';\nexport type {\n NftDetectionControllerMessenger,\n ApiNft,\n ApiNftContract,\n ApiNftLastSale,\n ApiNftCreator,\n ReservoirResponse,\n TokensResponse,\n BlockaidResultType,\n Blockaid,\n Market,\n TokenResponse,\n TopBid,\n LastSale,\n FeeBreakdown,\n Attributes,\n Collection,\n Royalties,\n Ownership,\n FloorAsk,\n Price,\n Metadata,\n} from './NftDetectionController';\nexport { NftDetectionController } from './NftDetectionController';\nexport type {\n TokenBalancesControllerMessenger,\n TokenBalancesControllerActions,\n TokenBalancesControllerGetStateAction,\n TokenBalancesControllerEvents,\n TokenBalancesControllerStateChangeEvent,\n TokenBalancesControllerState,\n} from './TokenBalancesController';\nexport { TokenBalancesController } from './TokenBalancesController';\nexport type {\n TokenDetectionControllerMessenger,\n TokenDetectionControllerActions,\n TokenDetectionControllerGetStateAction,\n TokenDetectionControllerEvents,\n TokenDetectionControllerStateChangeEvent,\n} from './TokenDetectionController';\nexport { TokenDetectionController } from './TokenDetectionController';\nexport type {\n TokenListState,\n TokenListToken,\n TokenListMap,\n TokenListStateChange,\n TokenListControllerEvents,\n GetTokenListState,\n TokenListControllerActions,\n TokenListControllerMessenger,\n} from './TokenListController';\nexport { TokenListController } from './TokenListController';\nexport type {\n ContractExchangeRates,\n ContractMarketData,\n Token,\n TokenRatesControllerActions,\n TokenRatesControllerEvents,\n TokenRatesControllerGetStateAction,\n TokenRatesControllerMessenger,\n TokenRatesControllerState,\n TokenRatesControllerStateChangeEvent,\n MarketDataDetails,\n} from './TokenRatesController';\nexport {\n getDefaultTokenRatesControllerState,\n TokenRatesController,\n} from './TokenRatesController';\nexport type {\n TokensControllerState,\n TokensControllerActions,\n TokensControllerGetStateAction,\n TokensControllerAddDetectedTokensAction,\n TokensControllerEvents,\n TokensControllerStateChangeEvent,\n TokensControllerMessenger,\n} from './TokensController';\nexport { TokensController } from './TokensController';\nexport {\n isTokenDetectionSupportedForNetwork,\n formatIconUrlWithProxy,\n getFormattedIpfsUrl,\n fetchTokenContractExchangeRates,\n getKeyByValue,\n} from './assetsUtil';\nexport {\n CodefiTokenPricesServiceV2,\n SUPPORTED_CHAIN_IDS,\n getNativeTokenAddress,\n} from './token-prices-service';\nexport { RatesController, Cryptocurrency } from './RatesController';\nexport type {\n RatesControllerState,\n RatesControllerEvents,\n RatesControllerActions,\n RatesControllerMessenger,\n RatesControllerGetStateAction,\n RatesControllerStateChangeEvent,\n RatesControllerPollingStartedEvent,\n RatesControllerPollingStoppedEvent,\n} from './RatesController';\nexport {\n BalancesTracker,\n MultichainBalancesController,\n // constants\n BALANCE_UPDATE_INTERVALS,\n NETWORK_ASSETS_MAP,\n MultichainNetworks,\n MultichainNativeAssets,\n} from './MultichainBalancesController';\nexport type {\n MultichainBalancesControllerState,\n MultichainBalancesControllerGetStateAction,\n MultichainBalancesControllerUpdateBalancesAction,\n MultichainBalancesControllerStateChange,\n MultichainBalancesControllerActions,\n MultichainBalancesControllerEvents,\n MultichainBalancesControllerMessenger,\n} from './MultichainBalancesController';\n\nexport {\n MultichainAssetsController,\n getDefaultMultichainAssetsControllerState,\n} from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChangeEvent,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
package/dist/index.d.cts CHANGED
@@ -23,6 +23,6 @@ export { RatesController, Cryptocurrency } from "./RatesController/index.cjs";
23
23
  export type { RatesControllerState, RatesControllerEvents, RatesControllerActions, RatesControllerMessenger, RatesControllerGetStateAction, RatesControllerStateChangeEvent, RatesControllerPollingStartedEvent, RatesControllerPollingStoppedEvent, } from "./RatesController/index.cjs";
24
24
  export { BalancesTracker, MultichainBalancesController, BALANCE_UPDATE_INTERVALS, NETWORK_ASSETS_MAP, MultichainNetworks, MultichainNativeAssets, } from "./MultichainBalancesController/index.cjs";
25
25
  export type { MultichainBalancesControllerState, MultichainBalancesControllerGetStateAction, MultichainBalancesControllerUpdateBalancesAction, MultichainBalancesControllerStateChange, MultichainBalancesControllerActions, MultichainBalancesControllerEvents, MultichainBalancesControllerMessenger, } from "./MultichainBalancesController/index.cjs";
26
- export { MultichainAssetsController } from "./MultichainAssetsController/index.cjs";
27
- export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChange, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController/index.cjs";
26
+ export { MultichainAssetsController, getDefaultMultichainAssetsControllerState, } from "./MultichainAssetsController/index.cjs";
27
+ export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChangeEvent, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController/index.cjs";
28
28
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,iCAAiC,EACjC,6BAA6B,EAC7B,+BAA+B,EAC/B,sCAAsC,EACtC,wCAAwC,EACxC,8BAA8B,GAC/B,uCAAmC;AACpC,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,YAAY,EACV,+BAA+B,EAC/B,8BAA8B,EAC9B,8CAA8C,EAC9C,+CAA+C,EAC/C,gDAAgD,EAChD,+CAA+C,EAC/C,mDAAmD,EACnD,+CAA+C,EAC/C,iDAAiD,EACjD,+CAA+C,EAC/C,gDAAgD,EAChD,kDAAkD,EAClD,8CAA8C,EAC9C,gDAAgD,EAChD,iDAAiD,EACjD,mDAAmD,EACnD,wDAAwD,EACxD,qDAAqD,EACrD,iCAAiC,EACjC,UAAU,GACX,uCAAmC;AACpC,OAAO,EACL,uCAAuC,EACvC,wBAAwB,GACzB,uCAAmC;AACpC,6CAAyC;AACzC,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,6BAA6B,EAC7B,GAAG,EACH,WAAW,EACX,WAAW,GACZ,4BAAwB;AACzB,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,4BAAwB;AAC9E,YAAY,EACV,+BAA+B,EAC/B,MAAM,EACN,cAAc,EACd,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,aAAa,EACb,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,qCAAiC;AAClC,OAAO,EAAE,sBAAsB,EAAE,qCAAiC;AAClE,YAAY,EACV,gCAAgC,EAChC,8BAA8B,EAC9B,qCAAqC,EACrC,6BAA6B,EAC7B,uCAAuC,EACvC,4BAA4B,GAC7B,sCAAkC;AACnC,OAAO,EAAE,uBAAuB,EAAE,sCAAkC;AACpE,YAAY,EACV,iCAAiC,EACjC,+BAA+B,EAC/B,sCAAsC,EACtC,8BAA8B,EAC9B,wCAAwC,GACzC,uCAAmC;AACpC,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AACtE,YAAY,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,4BAA4B,GAC7B,kCAA8B;AAC/B,OAAO,EAAE,mBAAmB,EAAE,kCAA8B;AAC5D,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,EAC7B,yBAAyB,EACzB,oCAAoC,EACpC,iBAAiB,GAClB,mCAA+B;AAChC,OAAO,EACL,mCAAmC,EACnC,oBAAoB,GACrB,mCAA+B;AAChC,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,8BAA8B,EAC9B,uCAAuC,EACvC,sBAAsB,EACtB,gCAAgC,EAChC,yBAAyB,GAC1B,+BAA2B;AAC5B,OAAO,EAAE,gBAAgB,EAAE,+BAA2B;AACtD,OAAO,EACL,mCAAmC,EACnC,sBAAsB,EACtB,mBAAmB,EACnB,+BAA+B,EAC/B,aAAa,GACd,yBAAqB;AACtB,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,yCAA+B;AAChC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,oCAA0B;AACpE,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,6BAA6B,EAC7B,+BAA+B,EAC/B,kCAAkC,EAClC,kCAAkC,GACnC,oCAA0B;AAC3B,OAAO,EACL,eAAe,EACf,4BAA4B,EAE5B,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACvB,iDAAuC;AACxC,YAAY,EACV,iCAAiC,EACjC,0CAA0C,EAC1C,gDAAgD,EAChD,uCAAuC,EACvC,mCAAmC,EACnC,kCAAkC,EAClC,qCAAqC,GACtC,iDAAuC;AAExC,OAAO,EAAE,0BAA0B,EAAE,+CAAqC;AAE1E,YAAY,EACV,+BAA+B,EAC/B,wCAAwC,EACxC,qCAAqC,EACrC,iCAAiC,EACjC,gCAAgC,EAChC,mCAAmC,GACpC,+CAAqC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -23,6 +23,6 @@ export { RatesController, Cryptocurrency } from "./RatesController/index.mjs";
23
23
  export type { RatesControllerState, RatesControllerEvents, RatesControllerActions, RatesControllerMessenger, RatesControllerGetStateAction, RatesControllerStateChangeEvent, RatesControllerPollingStartedEvent, RatesControllerPollingStoppedEvent, } from "./RatesController/index.mjs";
24
24
  export { BalancesTracker, MultichainBalancesController, BALANCE_UPDATE_INTERVALS, NETWORK_ASSETS_MAP, MultichainNetworks, MultichainNativeAssets, } from "./MultichainBalancesController/index.mjs";
25
25
  export type { MultichainBalancesControllerState, MultichainBalancesControllerGetStateAction, MultichainBalancesControllerUpdateBalancesAction, MultichainBalancesControllerStateChange, MultichainBalancesControllerActions, MultichainBalancesControllerEvents, MultichainBalancesControllerMessenger, } from "./MultichainBalancesController/index.mjs";
26
- export { MultichainAssetsController } from "./MultichainAssetsController/index.mjs";
27
- export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChange, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController/index.mjs";
26
+ export { MultichainAssetsController, getDefaultMultichainAssetsControllerState, } from "./MultichainAssetsController/index.mjs";
27
+ export type { MultichainAssetsControllerState, MultichainAssetsControllerGetStateAction, MultichainAssetsControllerStateChangeEvent, MultichainAssetsControllerActions, MultichainAssetsControllerEvents, MultichainAssetsControllerMessenger, } from "./MultichainAssetsController/index.mjs";
28
28
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -14,5 +14,5 @@ export { RatesController, Cryptocurrency } from "./RatesController/index.mjs";
14
14
  export { BalancesTracker, MultichainBalancesController,
15
15
  // constants
16
16
  BALANCE_UPDATE_INTERVALS, NETWORK_ASSETS_MAP, MultichainNetworks, MultichainNativeAssets } from "./MultichainBalancesController/index.mjs";
17
- export { MultichainAssetsController } from "./MultichainAssetsController/index.mjs";
17
+ export { MultichainAssetsController, getDefaultMultichainAssetsControllerState } from "./MultichainAssetsController/index.mjs";
18
18
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AAuBtE,OAAO,EACL,uCAAuC,EACvC,wBAAwB,EACzB,uCAAmC;AACpC,6CAAyC;AAYzC,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,4BAAwB;AAwB9E,OAAO,EAAE,sBAAsB,EAAE,qCAAiC;AASlE,OAAO,EAAE,uBAAuB,EAAE,sCAAkC;AAQpE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AAWtE,OAAO,EAAE,mBAAmB,EAAE,kCAA8B;AAa5D,OAAO,EACL,mCAAmC,EACnC,oBAAoB,EACrB,mCAA+B;AAUhC,OAAO,EAAE,gBAAgB,EAAE,+BAA2B;AACtD,OAAO,EACL,mCAAmC,EACnC,sBAAsB,EACtB,mBAAmB,EACnB,+BAA+B,EAC/B,aAAa,EACd,yBAAqB;AACtB,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACtB,yCAA+B;AAChC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,oCAA0B;AAWpE,OAAO,EACL,eAAe,EACf,4BAA4B;AAC5B,YAAY;AACZ,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACvB,iDAAuC;AAWxC,OAAO,EAAE,0BAA0B,EAAE,+CAAqC","sourcesContent":["export type {\n AccountInformation,\n AccountTrackerControllerMessenger,\n AccountTrackerControllerState,\n AccountTrackerControllerActions,\n AccountTrackerControllerGetStateAction,\n AccountTrackerControllerStateChangeEvent,\n AccountTrackerControllerEvents,\n} from './AccountTrackerController';\nexport { AccountTrackerController } from './AccountTrackerController';\nexport type {\n AssetsContractControllerActions,\n AssetsContractControllerEvents,\n AssetsContractControllerGetERC20StandardAction,\n AssetsContractControllerGetERC721StandardAction,\n AssetsContractControllerGetERC1155StandardAction,\n AssetsContractControllerGetERC20BalanceOfAction,\n AssetsContractControllerGetERC20TokenDecimalsAction,\n AssetsContractControllerGetERC20TokenNameAction,\n AssetsContractControllerGetERC721NftTokenIdAction,\n AssetsContractControllerGetERC721TokenURIAction,\n AssetsContractControllerGetERC721AssetNameAction,\n AssetsContractControllerGetERC721AssetSymbolAction,\n AssetsContractControllerGetERC721OwnerOfAction,\n AssetsContractControllerGetERC1155TokenURIAction,\n AssetsContractControllerGetERC1155BalanceOfAction,\n AssetsContractControllerTransferSingleERC1155Action,\n AssetsContractControllerGetTokenStandardAndDetailsAction,\n AssetsContractControllerGetBalancesInSingleCallAction,\n AssetsContractControllerMessenger,\n BalanceMap,\n} from './AssetsContractController';\nexport {\n SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID,\n AssetsContractController,\n} from './AssetsContractController';\nexport * from './CurrencyRateController';\nexport type {\n NftControllerState,\n NftControllerMessenger,\n NftControllerActions,\n NftControllerGetStateAction,\n NftControllerEvents,\n NftControllerStateChangeEvent,\n Nft,\n NftContract,\n NftMetadata,\n} from './NftController';\nexport { getDefaultNftControllerState, NftController } from './NftController';\nexport type {\n NftDetectionControllerMessenger,\n ApiNft,\n ApiNftContract,\n ApiNftLastSale,\n ApiNftCreator,\n ReservoirResponse,\n TokensResponse,\n BlockaidResultType,\n Blockaid,\n Market,\n TokenResponse,\n TopBid,\n LastSale,\n FeeBreakdown,\n Attributes,\n Collection,\n Royalties,\n Ownership,\n FloorAsk,\n Price,\n Metadata,\n} from './NftDetectionController';\nexport { NftDetectionController } from './NftDetectionController';\nexport type {\n TokenBalancesControllerMessenger,\n TokenBalancesControllerActions,\n TokenBalancesControllerGetStateAction,\n TokenBalancesControllerEvents,\n TokenBalancesControllerStateChangeEvent,\n TokenBalancesControllerState,\n} from './TokenBalancesController';\nexport { TokenBalancesController } from './TokenBalancesController';\nexport type {\n TokenDetectionControllerMessenger,\n TokenDetectionControllerActions,\n TokenDetectionControllerGetStateAction,\n TokenDetectionControllerEvents,\n TokenDetectionControllerStateChangeEvent,\n} from './TokenDetectionController';\nexport { TokenDetectionController } from './TokenDetectionController';\nexport type {\n TokenListState,\n TokenListToken,\n TokenListMap,\n TokenListStateChange,\n TokenListControllerEvents,\n GetTokenListState,\n TokenListControllerActions,\n TokenListControllerMessenger,\n} from './TokenListController';\nexport { TokenListController } from './TokenListController';\nexport type {\n ContractExchangeRates,\n ContractMarketData,\n Token,\n TokenRatesControllerActions,\n TokenRatesControllerEvents,\n TokenRatesControllerGetStateAction,\n TokenRatesControllerMessenger,\n TokenRatesControllerState,\n TokenRatesControllerStateChangeEvent,\n MarketDataDetails,\n} from './TokenRatesController';\nexport {\n getDefaultTokenRatesControllerState,\n TokenRatesController,\n} from './TokenRatesController';\nexport type {\n TokensControllerState,\n TokensControllerActions,\n TokensControllerGetStateAction,\n TokensControllerAddDetectedTokensAction,\n TokensControllerEvents,\n TokensControllerStateChangeEvent,\n TokensControllerMessenger,\n} from './TokensController';\nexport { TokensController } from './TokensController';\nexport {\n isTokenDetectionSupportedForNetwork,\n formatIconUrlWithProxy,\n getFormattedIpfsUrl,\n fetchTokenContractExchangeRates,\n getKeyByValue,\n} from './assetsUtil';\nexport {\n CodefiTokenPricesServiceV2,\n SUPPORTED_CHAIN_IDS,\n getNativeTokenAddress,\n} from './token-prices-service';\nexport { RatesController, Cryptocurrency } from './RatesController';\nexport type {\n RatesControllerState,\n RatesControllerEvents,\n RatesControllerActions,\n RatesControllerMessenger,\n RatesControllerGetStateAction,\n RatesControllerStateChangeEvent,\n RatesControllerPollingStartedEvent,\n RatesControllerPollingStoppedEvent,\n} from './RatesController';\nexport {\n BalancesTracker,\n MultichainBalancesController,\n // constants\n BALANCE_UPDATE_INTERVALS,\n NETWORK_ASSETS_MAP,\n MultichainNetworks,\n MultichainNativeAssets,\n} from './MultichainBalancesController';\nexport type {\n MultichainBalancesControllerState,\n MultichainBalancesControllerGetStateAction,\n MultichainBalancesControllerUpdateBalancesAction,\n MultichainBalancesControllerStateChange,\n MultichainBalancesControllerActions,\n MultichainBalancesControllerEvents,\n MultichainBalancesControllerMessenger,\n} from './MultichainBalancesController';\n\nexport { MultichainAssetsController } from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChange,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AAuBtE,OAAO,EACL,uCAAuC,EACvC,wBAAwB,EACzB,uCAAmC;AACpC,6CAAyC;AAYzC,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,4BAAwB;AAwB9E,OAAO,EAAE,sBAAsB,EAAE,qCAAiC;AASlE,OAAO,EAAE,uBAAuB,EAAE,sCAAkC;AAQpE,OAAO,EAAE,wBAAwB,EAAE,uCAAmC;AAWtE,OAAO,EAAE,mBAAmB,EAAE,kCAA8B;AAa5D,OAAO,EACL,mCAAmC,EACnC,oBAAoB,EACrB,mCAA+B;AAUhC,OAAO,EAAE,gBAAgB,EAAE,+BAA2B;AACtD,OAAO,EACL,mCAAmC,EACnC,sBAAsB,EACtB,mBAAmB,EACnB,+BAA+B,EAC/B,aAAa,EACd,yBAAqB;AACtB,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACtB,yCAA+B;AAChC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,oCAA0B;AAWpE,OAAO,EACL,eAAe,EACf,4BAA4B;AAC5B,YAAY;AACZ,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACvB,iDAAuC;AAWxC,OAAO,EACL,0BAA0B,EAC1B,yCAAyC,EAC1C,+CAAqC","sourcesContent":["export type {\n AccountInformation,\n AccountTrackerControllerMessenger,\n AccountTrackerControllerState,\n AccountTrackerControllerActions,\n AccountTrackerControllerGetStateAction,\n AccountTrackerControllerStateChangeEvent,\n AccountTrackerControllerEvents,\n} from './AccountTrackerController';\nexport { AccountTrackerController } from './AccountTrackerController';\nexport type {\n AssetsContractControllerActions,\n AssetsContractControllerEvents,\n AssetsContractControllerGetERC20StandardAction,\n AssetsContractControllerGetERC721StandardAction,\n AssetsContractControllerGetERC1155StandardAction,\n AssetsContractControllerGetERC20BalanceOfAction,\n AssetsContractControllerGetERC20TokenDecimalsAction,\n AssetsContractControllerGetERC20TokenNameAction,\n AssetsContractControllerGetERC721NftTokenIdAction,\n AssetsContractControllerGetERC721TokenURIAction,\n AssetsContractControllerGetERC721AssetNameAction,\n AssetsContractControllerGetERC721AssetSymbolAction,\n AssetsContractControllerGetERC721OwnerOfAction,\n AssetsContractControllerGetERC1155TokenURIAction,\n AssetsContractControllerGetERC1155BalanceOfAction,\n AssetsContractControllerTransferSingleERC1155Action,\n AssetsContractControllerGetTokenStandardAndDetailsAction,\n AssetsContractControllerGetBalancesInSingleCallAction,\n AssetsContractControllerMessenger,\n BalanceMap,\n} from './AssetsContractController';\nexport {\n SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID,\n AssetsContractController,\n} from './AssetsContractController';\nexport * from './CurrencyRateController';\nexport type {\n NftControllerState,\n NftControllerMessenger,\n NftControllerActions,\n NftControllerGetStateAction,\n NftControllerEvents,\n NftControllerStateChangeEvent,\n Nft,\n NftContract,\n NftMetadata,\n} from './NftController';\nexport { getDefaultNftControllerState, NftController } from './NftController';\nexport type {\n NftDetectionControllerMessenger,\n ApiNft,\n ApiNftContract,\n ApiNftLastSale,\n ApiNftCreator,\n ReservoirResponse,\n TokensResponse,\n BlockaidResultType,\n Blockaid,\n Market,\n TokenResponse,\n TopBid,\n LastSale,\n FeeBreakdown,\n Attributes,\n Collection,\n Royalties,\n Ownership,\n FloorAsk,\n Price,\n Metadata,\n} from './NftDetectionController';\nexport { NftDetectionController } from './NftDetectionController';\nexport type {\n TokenBalancesControllerMessenger,\n TokenBalancesControllerActions,\n TokenBalancesControllerGetStateAction,\n TokenBalancesControllerEvents,\n TokenBalancesControllerStateChangeEvent,\n TokenBalancesControllerState,\n} from './TokenBalancesController';\nexport { TokenBalancesController } from './TokenBalancesController';\nexport type {\n TokenDetectionControllerMessenger,\n TokenDetectionControllerActions,\n TokenDetectionControllerGetStateAction,\n TokenDetectionControllerEvents,\n TokenDetectionControllerStateChangeEvent,\n} from './TokenDetectionController';\nexport { TokenDetectionController } from './TokenDetectionController';\nexport type {\n TokenListState,\n TokenListToken,\n TokenListMap,\n TokenListStateChange,\n TokenListControllerEvents,\n GetTokenListState,\n TokenListControllerActions,\n TokenListControllerMessenger,\n} from './TokenListController';\nexport { TokenListController } from './TokenListController';\nexport type {\n ContractExchangeRates,\n ContractMarketData,\n Token,\n TokenRatesControllerActions,\n TokenRatesControllerEvents,\n TokenRatesControllerGetStateAction,\n TokenRatesControllerMessenger,\n TokenRatesControllerState,\n TokenRatesControllerStateChangeEvent,\n MarketDataDetails,\n} from './TokenRatesController';\nexport {\n getDefaultTokenRatesControllerState,\n TokenRatesController,\n} from './TokenRatesController';\nexport type {\n TokensControllerState,\n TokensControllerActions,\n TokensControllerGetStateAction,\n TokensControllerAddDetectedTokensAction,\n TokensControllerEvents,\n TokensControllerStateChangeEvent,\n TokensControllerMessenger,\n} from './TokensController';\nexport { TokensController } from './TokensController';\nexport {\n isTokenDetectionSupportedForNetwork,\n formatIconUrlWithProxy,\n getFormattedIpfsUrl,\n fetchTokenContractExchangeRates,\n getKeyByValue,\n} from './assetsUtil';\nexport {\n CodefiTokenPricesServiceV2,\n SUPPORTED_CHAIN_IDS,\n getNativeTokenAddress,\n} from './token-prices-service';\nexport { RatesController, Cryptocurrency } from './RatesController';\nexport type {\n RatesControllerState,\n RatesControllerEvents,\n RatesControllerActions,\n RatesControllerMessenger,\n RatesControllerGetStateAction,\n RatesControllerStateChangeEvent,\n RatesControllerPollingStartedEvent,\n RatesControllerPollingStoppedEvent,\n} from './RatesController';\nexport {\n BalancesTracker,\n MultichainBalancesController,\n // constants\n BALANCE_UPDATE_INTERVALS,\n NETWORK_ASSETS_MAP,\n MultichainNetworks,\n MultichainNativeAssets,\n} from './MultichainBalancesController';\nexport type {\n MultichainBalancesControllerState,\n MultichainBalancesControllerGetStateAction,\n MultichainBalancesControllerUpdateBalancesAction,\n MultichainBalancesControllerStateChange,\n MultichainBalancesControllerActions,\n MultichainBalancesControllerEvents,\n MultichainBalancesControllerMessenger,\n} from './MultichainBalancesController';\n\nexport {\n MultichainAssetsController,\n getDefaultMultichainAssetsControllerState,\n} from './MultichainAssetsController';\n\nexport type {\n MultichainAssetsControllerState,\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerStateChangeEvent,\n MultichainAssetsControllerActions,\n MultichainAssetsControllerEvents,\n MultichainAssetsControllerMessenger,\n} from './MultichainAssetsController';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/assets-controllers",
3
- "version": "47.0.0-preview-33c13522",
3
+ "version": "47.0.0-preview-59b4e66e",
4
4
  "description": "Controllers which manage interactions involving ERC-20, ERC-721, and ERC-1155 tokens (including NFTs)",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -56,13 +56,13 @@
56
56
  "@metamask/abi-utils": "^2.0.3",
57
57
  "@metamask/base-controller": "^7.1.1",
58
58
  "@metamask/contract-metadata": "^2.4.0",
59
- "@metamask/controller-utils": "^11.4.5",
59
+ "@metamask/controller-utils": "^11.5.0",
60
60
  "@metamask/eth-query": "^4.0.0",
61
61
  "@metamask/keyring-api": "^16.1.0",
62
62
  "@metamask/metamask-eth-abis": "^3.1.1",
63
63
  "@metamask/polling-controller": "^12.0.2",
64
64
  "@metamask/rpc-errors": "^7.0.2",
65
- "@metamask/snaps-utils": "^8.9.0",
65
+ "@metamask/snaps-utils": "^8.10.0",
66
66
  "@metamask/utils": "^11.1.0",
67
67
  "@types/bn.js": "^5.1.5",
68
68
  "@types/uuid": "^8.3.0",
@@ -84,11 +84,12 @@
84
84
  "@metamask/keyring-controller": "^19.0.5",
85
85
  "@metamask/keyring-internal-api": "^4.0.1",
86
86
  "@metamask/keyring-snap-client": "^3.0.3",
87
- "@metamask/network-controller": "^22.1.1",
87
+ "@metamask/network-controller": "^22.2.0",
88
+ "@metamask/permission-controller": "^11.0.5",
88
89
  "@metamask/preferences-controller": "^15.0.1",
89
90
  "@metamask/providers": "^18.1.1",
90
- "@metamask/snaps-controllers": "^9.10.0",
91
- "@metamask/snaps-sdk": "^6.16.0",
91
+ "@metamask/snaps-controllers": "^9.19.0",
92
+ "@metamask/snaps-sdk": "^6.17.1",
92
93
  "@types/jest": "^27.4.1",
93
94
  "@types/lodash": "^4.14.191",
94
95
  "@types/node": "^16.18.54",
@@ -108,8 +109,10 @@
108
109
  "@metamask/approval-controller": "^7.0.0",
109
110
  "@metamask/keyring-controller": "^19.0.0",
110
111
  "@metamask/network-controller": "^22.0.0",
112
+ "@metamask/permission-controller": "^11.0.0",
111
113
  "@metamask/preferences-controller": "^15.0.0",
112
114
  "@metamask/providers": "^18.1.0",
115
+ "@metamask/snaps-controllers": "^9.19.0",
113
116
  "webextension-polyfill": "^0.10.0 || ^0.11.0 || ^0.12.0"
114
117
  },
115
118
  "engines": {