@metamask/assets-controllers 99.3.2 → 100.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.cjs +74 -3
- package/dist/MultichainAssetsController/MultichainAssetsController.cjs.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.cts +2 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.cts.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.mts +2 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.mts.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.mjs +74 -3
- package/dist/MultichainAssetsController/MultichainAssetsController.mjs.map +1 -1
- package/dist/multicall.cjs +2 -0
- package/dist/multicall.cjs.map +1 -1
- package/dist/multicall.d.cts.map +1 -1
- package/dist/multicall.d.mts.map +1 -1
- package/dist/multicall.mjs +2 -0
- package/dist/multicall.mjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.cjs +3 -2
- package/dist/token-prices-service/codefi-v2.cjs.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.cts +4 -2
- package/dist/token-prices-service/codefi-v2.d.cts.map +1 -1
- package/dist/token-prices-service/codefi-v2.d.mts +4 -2
- package/dist/token-prices-service/codefi-v2.d.mts.map +1 -1
- package/dist/token-prices-service/codefi-v2.mjs +3 -2
- package/dist/token-prices-service/codefi-v2.mjs.map +1 -1
- package/dist/token-service.cjs +8 -6
- package/dist/token-service.cjs.map +1 -1
- package/dist/token-service.d.cts +2 -1
- package/dist/token-service.d.cts.map +1 -1
- package/dist/token-service.d.mts +2 -1
- package/dist/token-service.d.mts.map +1 -1
- package/dist/token-service.mjs +8 -6
- package/dist/token-service.mjs.map +1 -1
- package/package.json +5 -6
|
@@ -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 AccountsControllerAccountAssetListUpdatedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\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 { Messenger } from '@metamask/messenger';\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 { isCaipAssetType, parseCaipAssetType } from '@metamask/utils';\nimport type { CaipChainId } 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 allIgnoredAssets: { [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\nexport type MultichainAssetsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: AccountsControllerAccountAssetListUpdatedEvent['payload'];\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: {}, allIgnoredAssets: {} };\n}\n\nexport type MultichainAssetsControllerGetAssetMetadataAction = {\n type: `${typeof controllerName}:getAssetMetadata`;\n handler: MultichainAssetsController['getAssetMetadata'];\n};\n\nexport type MultichainAssetsControllerIgnoreAssetsAction = {\n type: `${typeof controllerName}:ignoreAssets`;\n handler: MultichainAssetsController['ignoreAssets'];\n};\n\nexport type MultichainAssetsControllerAddAssetsAction = {\n type: `${typeof controllerName}:addAssets`;\n handler: MultichainAssetsController['addAssets'];\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 | MultichainAssetsControllerGetAssetMetadataAction\n | MultichainAssetsControllerIgnoreAssetsAction\n | MultichainAssetsControllerAddAssetsAction;\n\n/**\n * Events emitted by {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerEvents =\n | MultichainAssetsControllerStateChangeEvent\n | MultichainAssetsControllerAccountAssetListUpdatedEvent;\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 = Messenger<\n typeof controllerName,\n MultichainAssetsControllerActions | AllowedActions,\n MultichainAssetsControllerEvents | AllowedEvents\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: StateMetadata<MultichainAssetsControllerState> =\n {\n assetsMetadata: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n accountsAssets: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n allIgnoredAssets: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\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.messenger.subscribe(\n 'AccountsController:accountAdded',\n async (account) => await this.#handleOnAccountAddedEvent(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountRemoved',\n async (account) => await this.#handleOnAccountRemovedEvent(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountAssetListUpdated',\n async (event) => await this.#handleAccountAssetListUpdatedEvent(event),\n );\n\n this.#registerMessageHandlers();\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 * Constructor helper for registering the controller's messaging system\n * actions.\n */\n #registerMessageHandlers() {\n this.messenger.registerActionHandler(\n 'MultichainAssetsController:getAssetMetadata',\n this.getAssetMetadata.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'MultichainAssetsController:ignoreAssets',\n this.ignoreAssets.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'MultichainAssetsController:addAssets',\n this.addAssets.bind(this),\n );\n }\n\n /**\n * Returns the metadata for the given asset\n *\n * @param asset - The asset to get metadata for\n * @returns The metadata for the asset or undefined if not found.\n */\n getAssetMetadata(asset: CaipAssetType): FungibleAssetMetadata | undefined {\n return this.state.assetsMetadata[asset];\n }\n\n /**\n * Ignores a batch of assets for a specific account.\n *\n * @param assetsToIgnore - Array of asset IDs to ignore.\n * @param accountId - The account ID to ignore assets for.\n */\n ignoreAssets(assetsToIgnore: CaipAssetType[], accountId: string): void {\n this.update((state) => {\n if (state.accountsAssets[accountId]) {\n state.accountsAssets[accountId] = state.accountsAssets[\n accountId\n ].filter((asset) => !assetsToIgnore.includes(asset));\n }\n\n if (!state.allIgnoredAssets[accountId]) {\n state.allIgnoredAssets[accountId] = [];\n }\n\n const newIgnoredAssets = assetsToIgnore.filter(\n (asset) => !state.allIgnoredAssets[accountId].includes(asset),\n );\n state.allIgnoredAssets[accountId].push(...newIgnoredAssets);\n });\n }\n\n /**\n * Adds multiple assets to the stored asset list for a specific account.\n * All assets must belong to the same chain.\n *\n * @param assetIds - Array of CAIP asset IDs to add (must be from same chain).\n * @param accountId - The account ID to add the assets to.\n * @returns The updated asset list for the account.\n * @throws Error if assets are from different chains.\n */\n async addAssets(\n assetIds: CaipAssetType[],\n accountId: string,\n ): Promise<CaipAssetType[]> {\n if (assetIds.length === 0) {\n return this.state.accountsAssets[accountId] || [];\n }\n\n // Validate that all assets are from the same chain\n const chainIds = new Set(\n assetIds.map((assetId) => parseCaipAssetType(assetId).chainId),\n );\n if (chainIds.size > 1) {\n throw new Error(\n `All assets must belong to the same chain. Found assets from chains: ${Array.from(chainIds).join(', ')}`,\n );\n }\n\n return this.#withControllerLock(async () => {\n // Refresh metadata for all assets\n await this.#refreshAssetsMetadata(assetIds);\n\n const addedAssets: CaipAssetType[] = [];\n\n this.update((state) => {\n // Initialize account assets if it doesn't exist\n if (!state.accountsAssets[accountId]) {\n state.accountsAssets[accountId] = [];\n }\n\n // Add assets if they don't already exist\n for (const assetId of assetIds) {\n if (!state.accountsAssets[accountId].includes(assetId)) {\n state.accountsAssets[accountId].push(assetId);\n addedAssets.push(assetId);\n }\n }\n\n // Remove from ignored list if they exist there (inline logic like EVM)\n if (state.allIgnoredAssets[accountId]) {\n state.allIgnoredAssets[accountId] = state.allIgnoredAssets[\n accountId\n ].filter((asset) => !assetIds.includes(asset));\n\n // Clean up empty arrays\n if (state.allIgnoredAssets[accountId].length === 0) {\n delete state.allIgnoredAssets[accountId];\n }\n }\n });\n\n // Publish event to notify other controllers (balances, rates) about the new assets\n if (addedAssets.length > 0) {\n this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {\n assets: {\n [accountId]: {\n added: addedAssets,\n removed: [],\n },\n },\n });\n }\n\n return this.state.accountsAssets[accountId] || [];\n });\n }\n\n /**\n * Checks if an asset is ignored for a specific account.\n *\n * @param asset - The asset ID to check.\n * @param accountId - The account ID to check for.\n * @returns True if the asset is ignored, false otherwise.\n */\n #isAssetIgnored(asset: CaipAssetType, accountId: string): boolean {\n return this.state.allIgnoredAssets[accountId]?.includes(asset) ?? false;\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 assetsForMetadataRefresh = new Set<CaipAssetType>([]);\n const accountsAndAssetsToUpdate: AccountAssetListUpdatedEventPayload['assets'] =\n {};\n for (const [accountId, { added, removed }] of Object.entries(\n event.assets,\n )) {\n if (added.length > 0 || removed.length > 0) {\n const existing = this.state.accountsAssets[accountId] || [];\n\n // In case accountsAndAssetsToUpdate event is fired with \"added\" assets that already exist, we don't want to add them again\n // Also filter out ignored assets\n const filteredToBeAddedAssets = added.filter(\n (asset) =>\n !existing.includes(asset) &&\n isCaipAssetType(asset) &&\n !this.#isAssetIgnored(asset, accountId),\n );\n\n // In case accountsAndAssetsToUpdate event is fired with \"removed\" assets that don't exist, we don't want to remove them\n const filteredToBeRemovedAssets = removed.filter(\n (asset) => existing.includes(asset) && isCaipAssetType(asset),\n );\n\n if (\n filteredToBeAddedAssets.length > 0 ||\n filteredToBeRemovedAssets.length > 0\n ) {\n accountsAndAssetsToUpdate[accountId] = {\n added: filteredToBeAddedAssets,\n removed: filteredToBeRemovedAssets,\n };\n }\n\n for (const asset of existing) {\n assetsForMetadataRefresh.add(asset);\n }\n for (const asset of filteredToBeAddedAssets) {\n assetsForMetadataRefresh.add(asset);\n }\n for (const asset of filteredToBeRemovedAssets) {\n assetsForMetadataRefresh.delete(asset);\n }\n }\n }\n\n this.update((state) => {\n for (const [accountId, { added, removed }] of Object.entries(\n accountsAndAssetsToUpdate,\n )) {\n const assets = new Set([\n ...(state.accountsAssets[accountId] || []),\n ...added,\n ]);\n for (const asset of removed) {\n assets.delete(asset);\n }\n\n state.accountsAssets[accountId] = Array.from(assets);\n }\n });\n\n // Trigger fetching metadata for new assets\n await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));\n\n this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {\n assets: accountsAndAssetsToUpdate,\n });\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 this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {\n assets: {\n [account.id]: {\n added: assets,\n removed: [],\n },\n },\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 this.update((state) => {\n if (state.accountsAssets[accountId]) {\n delete state.accountsAssets[accountId];\n }\n if (state.allIgnoredAssets[accountId]) {\n delete state.allIgnoredAssets[accountId];\n }\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 });\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.messenger\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.messenger.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.messenger.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.messenger.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 { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\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 { Messenger } from '@metamask/messenger';\nimport type {\n GetPermissions,\n PermissionConstraint,\n SubjectPermissions,\n} from '@metamask/permission-controller';\nimport type {\n BulkTokenScanResponse,\n PhishingControllerBulkScanTokensAction,\n} from '@metamask/phishing-controller';\nimport { TokenScanResultType } from '@metamask/phishing-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 { isCaipAssetType, parseCaipAssetType } from '@metamask/utils';\nimport type { CaipChainId } 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 allIgnoredAssets: { [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\nexport type MultichainAssetsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: AccountsControllerAccountAssetListUpdatedEvent['payload'];\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: {}, allIgnoredAssets: {} };\n}\n\nexport type MultichainAssetsControllerGetAssetMetadataAction = {\n type: `${typeof controllerName}:getAssetMetadata`;\n handler: MultichainAssetsController['getAssetMetadata'];\n};\n\nexport type MultichainAssetsControllerIgnoreAssetsAction = {\n type: `${typeof controllerName}:ignoreAssets`;\n handler: MultichainAssetsController['ignoreAssets'];\n};\n\nexport type MultichainAssetsControllerAddAssetsAction = {\n type: `${typeof controllerName}:addAssets`;\n handler: MultichainAssetsController['addAssets'];\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 | MultichainAssetsControllerGetAssetMetadataAction\n | MultichainAssetsControllerIgnoreAssetsAction\n | MultichainAssetsControllerAddAssetsAction;\n\n/**\n * Events emitted by {@link MultichainAssetsController}.\n */\nexport type MultichainAssetsControllerEvents =\n | MultichainAssetsControllerStateChangeEvent\n | MultichainAssetsControllerAccountAssetListUpdatedEvent;\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 | PhishingControllerBulkScanTokensAction;\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 = Messenger<\n typeof controllerName,\n MultichainAssetsControllerActions | AllowedActions,\n MultichainAssetsControllerEvents | AllowedEvents\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: StateMetadata<MultichainAssetsControllerState> =\n {\n assetsMetadata: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n accountsAssets: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n allIgnoredAssets: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\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.messenger.subscribe(\n 'AccountsController:accountAdded',\n async (account) => await this.#handleOnAccountAddedEvent(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountRemoved',\n async (account) => await this.#handleOnAccountRemovedEvent(account),\n );\n this.messenger.subscribe(\n 'AccountsController:accountAssetListUpdated',\n async (event) => await this.#handleAccountAssetListUpdatedEvent(event),\n );\n\n this.#registerMessageHandlers();\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 * Constructor helper for registering the controller's messaging system\n * actions.\n */\n #registerMessageHandlers() {\n this.messenger.registerActionHandler(\n 'MultichainAssetsController:getAssetMetadata',\n this.getAssetMetadata.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'MultichainAssetsController:ignoreAssets',\n this.ignoreAssets.bind(this),\n );\n\n this.messenger.registerActionHandler(\n 'MultichainAssetsController:addAssets',\n this.addAssets.bind(this),\n );\n }\n\n /**\n * Returns the metadata for the given asset\n *\n * @param asset - The asset to get metadata for\n * @returns The metadata for the asset or undefined if not found.\n */\n getAssetMetadata(asset: CaipAssetType): FungibleAssetMetadata | undefined {\n return this.state.assetsMetadata[asset];\n }\n\n /**\n * Ignores a batch of assets for a specific account.\n *\n * @param assetsToIgnore - Array of asset IDs to ignore.\n * @param accountId - The account ID to ignore assets for.\n */\n ignoreAssets(assetsToIgnore: CaipAssetType[], accountId: string): void {\n this.update((state) => {\n if (state.accountsAssets[accountId]) {\n state.accountsAssets[accountId] = state.accountsAssets[\n accountId\n ].filter((asset) => !assetsToIgnore.includes(asset));\n }\n\n if (!state.allIgnoredAssets[accountId]) {\n state.allIgnoredAssets[accountId] = [];\n }\n\n const newIgnoredAssets = assetsToIgnore.filter(\n (asset) => !state.allIgnoredAssets[accountId].includes(asset),\n );\n state.allIgnoredAssets[accountId].push(...newIgnoredAssets);\n });\n }\n\n /**\n * Adds multiple assets to the stored asset list for a specific account.\n * All assets must belong to the same chain.\n *\n * @param assetIds - Array of CAIP asset IDs to add (must be from same chain).\n * @param accountId - The account ID to add the assets to.\n * @returns The updated asset list for the account.\n * @throws Error if assets are from different chains.\n */\n async addAssets(\n assetIds: CaipAssetType[],\n accountId: string,\n ): Promise<CaipAssetType[]> {\n if (assetIds.length === 0) {\n return this.state.accountsAssets[accountId] || [];\n }\n\n // Validate that all assets are from the same chain\n const chainIds = new Set(\n assetIds.map((assetId) => parseCaipAssetType(assetId).chainId),\n );\n if (chainIds.size > 1) {\n throw new Error(\n `All assets must belong to the same chain. Found assets from chains: ${Array.from(chainIds).join(', ')}`,\n );\n }\n\n return this.#withControllerLock(async () => {\n // Refresh metadata for all assets\n await this.#refreshAssetsMetadata(assetIds);\n\n const addedAssets: CaipAssetType[] = [];\n\n this.update((state) => {\n // Initialize account assets if it doesn't exist\n if (!state.accountsAssets[accountId]) {\n state.accountsAssets[accountId] = [];\n }\n\n // Add assets if they don't already exist\n for (const assetId of assetIds) {\n if (!state.accountsAssets[accountId].includes(assetId)) {\n state.accountsAssets[accountId].push(assetId);\n addedAssets.push(assetId);\n }\n }\n\n // Remove from ignored list if they exist there (inline logic like EVM)\n if (state.allIgnoredAssets[accountId]) {\n state.allIgnoredAssets[accountId] = state.allIgnoredAssets[\n accountId\n ].filter((asset) => !assetIds.includes(asset));\n\n // Clean up empty arrays\n if (state.allIgnoredAssets[accountId].length === 0) {\n delete state.allIgnoredAssets[accountId];\n }\n }\n });\n\n // Publish event to notify other controllers (balances, rates) about the new assets\n if (addedAssets.length > 0) {\n this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {\n assets: {\n [accountId]: {\n added: addedAssets,\n removed: [],\n },\n },\n });\n }\n\n return this.state.accountsAssets[accountId] || [];\n });\n }\n\n /**\n * Checks if an asset is ignored for a specific account.\n *\n * @param asset - The asset ID to check.\n * @param accountId - The account ID to check for.\n * @returns True if the asset is ignored, false otherwise.\n */\n #isAssetIgnored(asset: CaipAssetType, accountId: string): boolean {\n return this.state.allIgnoredAssets[accountId]?.includes(asset) ?? false;\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 assetsForMetadataRefresh = new Set<CaipAssetType>([]);\n const accountsAndAssetsToUpdate: AccountAssetListUpdatedEventPayload['assets'] =\n {};\n for (const [accountId, { added, removed }] of Object.entries(\n event.assets,\n )) {\n if (added.length > 0 || removed.length > 0) {\n const existing = this.state.accountsAssets[accountId] || [];\n\n // In case accountsAndAssetsToUpdate event is fired with \"added\" assets that already exist, we don't want to add them again\n // Also filter out ignored assets\n const preFilteredToBeAddedAssets = added.filter(\n (asset) =>\n !existing.includes(asset) &&\n isCaipAssetType(asset) &&\n !this.#isAssetIgnored(asset, accountId),\n );\n\n // Filter out tokens flagged by Blockaid as non-benign\n const filteredToBeAddedAssets = await this.#filterBlockaidSpamTokens(\n preFilteredToBeAddedAssets,\n );\n\n // In case accountsAndAssetsToUpdate event is fired with \"removed\" assets that don't exist, we don't want to remove them\n const filteredToBeRemovedAssets = removed.filter(\n (asset) => existing.includes(asset) && isCaipAssetType(asset),\n );\n\n if (\n filteredToBeAddedAssets.length > 0 ||\n filteredToBeRemovedAssets.length > 0\n ) {\n accountsAndAssetsToUpdate[accountId] = {\n added: filteredToBeAddedAssets,\n removed: filteredToBeRemovedAssets,\n };\n }\n\n for (const asset of existing) {\n assetsForMetadataRefresh.add(asset);\n }\n for (const asset of filteredToBeAddedAssets) {\n assetsForMetadataRefresh.add(asset);\n }\n for (const asset of filteredToBeRemovedAssets) {\n assetsForMetadataRefresh.delete(asset);\n }\n }\n }\n\n this.update((state) => {\n for (const [accountId, { added, removed }] of Object.entries(\n accountsAndAssetsToUpdate,\n )) {\n const assets = new Set([\n ...(state.accountsAssets[accountId] || []),\n ...added,\n ]);\n for (const asset of removed) {\n assets.delete(asset);\n }\n\n state.accountsAssets[accountId] = Array.from(assets);\n }\n });\n\n // Trigger fetching metadata for new assets\n await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));\n\n this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {\n assets: accountsAndAssetsToUpdate,\n });\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 allAssets = await this.#getAssetsList(\n account.id,\n account.metadata.snap.id,\n );\n const assets = await this.#filterBlockaidSpamTokens(allAssets);\n await this.#refreshAssetsMetadata(assets);\n this.update((state) => {\n state.accountsAssets[account.id] = assets;\n });\n this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {\n assets: {\n [account.id]: {\n added: assets,\n removed: [],\n },\n },\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 this.update((state) => {\n if (state.accountsAssets[accountId]) {\n delete state.accountsAssets[accountId];\n }\n if (state.allIgnoredAssets[accountId]) {\n delete state.allIgnoredAssets[accountId];\n }\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 });\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.messenger\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.messenger.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.messenger.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 * Filters out tokens flagged as non-benign by Blockaid via the\n * `PhishingController:bulkScanTokens` messenger action. Only tokens with\n * an `assetNamespace` of \"token\" are scanned (native assets like slip44 are\n * passed through unfiltered). If the scan fails, all tokens are kept\n * (fail open).\n *\n * @param assets - The CAIP asset type list to filter.\n * @returns The filtered list with malicious/spam/warning tokens removed.\n */\n async #filterBlockaidSpamTokens(\n assets: CaipAssetType[],\n ): Promise<CaipAssetType[]> {\n // Group scannable token assets by chain namespace\n const tokensByChain: Record<\n string,\n { asset: CaipAssetType; address: string }[]\n > = {};\n\n for (const asset of assets) {\n const { assetNamespace, assetReference, chain } =\n parseCaipAssetType(asset);\n\n // Only scan fungible token assets (e.g. SPL tokens), skip native (slip44)\n if (assetNamespace === 'token') {\n const chainName = chain.namespace;\n if (!tokensByChain[chainName]) {\n tokensByChain[chainName] = [];\n }\n tokensByChain[chainName].push({ asset, address: assetReference });\n }\n }\n\n // If there are no token assets to scan, return as-is\n if (Object.keys(tokensByChain).length === 0) {\n return assets;\n }\n\n // Build a set of assets to reject (non-benign tokens)\n const rejectedAssets = new Set<CaipAssetType>();\n\n // PhishingController:bulkScanTokens rejects requests with more than\n // 100 tokens (returning {}). Batch addresses into chunks to stay within\n // the limit.\n const BATCH_SIZE = 100;\n\n for (const [chainName, tokenEntries] of Object.entries(tokensByChain)) {\n const addresses = tokenEntries.map((entry) => entry.address);\n\n // Create batches of BATCH_SIZE\n const batches: string[][] = [];\n for (let i = 0; i < addresses.length; i += BATCH_SIZE) {\n batches.push(addresses.slice(i, i + BATCH_SIZE));\n }\n\n // Scan all batches in parallel. Using Promise.allSettled so that a\n // single batch failure doesn't discard results from successful batches\n // (fail open at the batch level, not the chain level).\n const batchResults = await Promise.allSettled(\n batches.map((batch) =>\n this.messenger.call('PhishingController:bulkScanTokens', {\n chainId: chainName,\n tokens: batch,\n }),\n ),\n );\n\n // Merge results from fulfilled batches (rejected batches fail open)\n const scanResponse: BulkTokenScanResponse = {};\n for (const result of batchResults) {\n if (result.status === 'fulfilled') {\n Object.assign(scanResponse, result.value);\n }\n }\n\n for (const entry of tokenEntries) {\n const result = scanResponse[entry.address];\n // Reject the token only if we have a definitive non-benign result\n if (\n result?.result_type &&\n result.result_type !== TokenScanResultType.Benign\n ) {\n rejectedAssets.add(entry.asset);\n }\n }\n }\n\n // Filter while preserving original order\n return assets.filter((asset) => !rejectedAssets.has(asset));\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.messenger.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"]}
|
package/dist/multicall.cjs
CHANGED
|
@@ -309,6 +309,8 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
|
|
|
309
309
|
'0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
310
310
|
// MSU (contract they deployed by their team for us)
|
|
311
311
|
'0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',
|
|
312
|
+
// INK Mainnet
|
|
313
|
+
'0xdef1': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
312
314
|
};
|
|
313
315
|
const multicallAbi = [
|
|
314
316
|
{
|
package/dist/multicall.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.cjs","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport { reduceInBatchesSerially } from './assetsUtil';\n\n// https://github.com/mds1/multicall/blob/main/deployments.json\nconst MULTICALL_CONTRACT_BY_CHAINID = {\n '0x1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa36a7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4268': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b6e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18fc4a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa37dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eee': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eeb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15f2249': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x89': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13881': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13882': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x44d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x5a2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x98a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x64': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x27d8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa86a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa869': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfaf0': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xcc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x504': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x505': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a15c308d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2a15c3083': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x63564c40': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x19': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5535072': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x120': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4e454152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x250': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5c2359': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xec0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x42': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x80': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x440': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x257': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Rootstock, bytecode OK and referenced as \"RSK\" in https://www.multicall3.com/deployments\n '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2328': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x12': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa516': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5afe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ec': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaef3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116ea': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2019': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e9': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x7d1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x141': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e15': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1251': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7f08': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8ae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1389': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1388': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f92': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14a33': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x14a34': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2105': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x936': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd2af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0ce': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe705': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe704': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe708': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2b6f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x39': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x23a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1644': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdea8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x171': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // HyperEVM (999)\n '0x3e7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x76adf1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3b9ac9ff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2e': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x15b3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x82751': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8274f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x82750': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x96f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cc5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4571': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe99': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7d0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1297': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1d5e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3a14269b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x561bf78b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x235ddd0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cd156dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5d456c62': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x79f99296': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x585eb4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507aaa2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1fc3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x32d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a73': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a71': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0d6': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1069': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7e5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x53': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x52': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe298': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x94': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2803': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2802': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c5f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c60': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4cb2f': '0xdbfa261cd7d17bb40479a0493ad6c0fee435859e',\n '0x7f93': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb660': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb02113d3f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdad': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b32': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Etherlink mainnet, bytecode OK and referenced in https://www.multicall3.com/deployments\n '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1b58': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc3': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x16fd8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc7': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x405': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x334': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1ce': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1cf': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xa70e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x868b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa0c71fd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13e31': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa1337': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xf63': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x144': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x118': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x12c': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x18995f': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x2b74': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0xfc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x9da': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x137': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13ed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x24b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xba9302': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7c8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138d5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x343b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x34a1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3109': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x91b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa96': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x22c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2be3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xbf03': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b254': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa7b14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2276': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b9e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a63bb8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xae3f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x531': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c58': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1d88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5b9b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4c7e1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa53b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x406': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2cef': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18b2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x182a9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfdd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfde': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x99c0a0f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x22cf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x310c5': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x659': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // BOB, bytecode OK and referenced in https://www.multicall3.com/deployments\n '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x31bf8c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1cbc67bfdc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x98967f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4f588': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x16db': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x3a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1e0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x221': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Injective, contract found but not in multicall3 repo\n '0x6f0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Hemi, contract found but not in multicall3 repo\n '0xa867': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plasma, contract found but not in multicall3 repo\n '0x2611': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Nonmia, contract found but not in multicall3 repo\n '0xa6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XRPL, contract found but not in multicall3 repo\n '0x15f900': '0x6B5eFbC0C82eBb26CA13a4F11836f36Fc6fdBC5D',\n // Soneium, contract found but not in multicall3 repo\n '0x74c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Genesys, contract found but not in multicall3 repo\n '0x407b': '0x90a2377F233E3461BACa6080d4837837d8762927',\n // EDU (Animoca)\n '0xa3c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Abstract\n '0xab5': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n // Berachain, contract found but not in multicall3 repo\n '0x138de': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH TESTNET\n '0x18c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Apechain\n '0x8173': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Matchain, contract found but not in multicall3 repo\n '0x2ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad TESTNET\n '0x279f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Katana\n '0xb67d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Lens, contract found but not in multicall3 repo\n '0xe8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plume\n '0x18232': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad Mainnet\n '0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XDC, contract found but not in multicall3 repo\n '0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',\n // MegaETH TESTNET v2 (timothy chain ID 6343)\n '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH mainnet, contract found matching multicall3 bytecode\n '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MSU (contract they deployed by their team for us)\n '0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',\n} as Record<Hex, Hex>;\n\nconst multicallAbi = [\n {\n name: 'tryAggregate',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n { name: 'requireSuccess', type: 'bool' },\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\n// Multicall3 ABI for aggregate3 function\nconst multicall3Abi = [\n {\n name: 'aggregate3',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'allowFailure', type: 'bool' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\nexport type Call = {\n contract: Contract;\n functionSignature: string;\n arguments: unknown[];\n};\n\nexport type MulticallResult = { success: boolean; value: unknown };\n\nexport type Aggregate3Call = {\n target: string;\n allowFailure: boolean;\n callData: string;\n};\n\nexport type Aggregate3Result = {\n success: boolean;\n returnData: string;\n};\n\n// Constants for encoded strings and addresses\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst BALANCE_OF_FUNCTION = 'balanceOf(address)';\nconst GET_ETH_BALANCE_FUNCTION = 'getEthBalance';\nconst GET_SHARES_FUNCTION = 'getShares';\nconst CONVERT_TO_ASSETS_FUNCTION = 'convertToAssets';\n\n// ERC20 balanceOf ABI\nconst ERC20_BALANCE_OF_ABI = [\n {\n name: 'balanceOf',\n type: 'function',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Multicall3 getEthBalance ABI\nconst MULTICALL3_GET_ETH_BALANCE_ABI = [\n {\n name: 'getEthBalance',\n type: 'function',\n inputs: [{ name: 'addr', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Staking contract ABI with both getShares and convertToAssets\nconst STAKING_CONTRACT_ABI = [\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\nconst multicall = async (\n calls: Call[],\n multicallAddress: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall: number,\n): Promise<MulticallResult[]> => {\n const multicallContract = new Contract(\n multicallAddress,\n multicallAbi,\n provider,\n );\n\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsPerMulticall,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const calldata = batch.map((call) => ({\n target: call.contract.address,\n callData: call.contract.interface.encodeFunctionData(\n call.contract.interface.functions[call.functionSignature],\n call.arguments,\n ),\n }));\n\n const results = await multicallContract.callStatic.tryAggregate(\n false,\n calldata,\n );\n\n return [\n ...workingResult,\n ...results.map(\n (r: { success: boolean; returnData: string }, i: number) => ({\n success: r.success,\n value: r.success\n ? batch[i].contract.interface.decodeFunctionResult(\n batch[i].functionSignature,\n r.returnData,\n )[0]\n : undefined,\n }),\n ),\n ];\n },\n });\n};\n\nconst fallback = async (\n calls: Call[],\n maxCallsParallel: number,\n): Promise<MulticallResult[]> => {\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsParallel,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const results = await Promise.allSettled(\n batch.map((call) =>\n call.contract[call.functionSignature](...call.arguments),\n ),\n );\n return [\n ...workingResult,\n ...results.map((p) => ({\n success: p.status === 'fulfilled',\n value: p.status === 'fulfilled' ? p.value : undefined,\n })),\n ];\n },\n });\n};\n\n/**\n * Executes an array of contract calls. If the chain supports multicalls,\n * the calls will be executed in single RPC requests (up to maxCallsPerMulticall).\n * Otherwise the calls will be executed separately in parallel (up to maxCallsParallel).\n *\n * @param calls - An array of contract calls to execute.\n * @param chainId - The hexadecimal chain id.\n * @param provider - An ethers rpc provider.\n * @param maxCallsPerMulticall - If multicall is supported, the maximum number of calls to exeute in each multicall.\n * @param maxCallsParallel - If multicall is not supported, the maximum number of calls to execute in parallel.\n * @returns An array of results, with a success boolean and value for each call.\n */\nexport const multicallOrFallback = async (\n calls: Call[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall = 300,\n maxCallsParallel = 20,\n): Promise<MulticallResult[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicallAddress = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n if (multicallAddress) {\n try {\n return await multicall(\n calls,\n multicallAddress,\n provider,\n maxCallsPerMulticall,\n );\n } catch (error: unknown) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n }\n }\n\n return await fallback(calls, maxCallsParallel);\n};\n\n/**\n * Execute multiple contract calls using Multicall3's aggregate3 function.\n * This allows for more efficient batch calls with individual failure handling.\n *\n * @param calls - Array of calls to execute via aggregate3\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @returns Promise resolving to array of results from aggregate3\n */\nexport const aggregate3 = async (\n calls: Aggregate3Call[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Aggregate3Result[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n multicall3Abi,\n provider,\n );\n\n return await multicall3Contract.callStatic.aggregate3(calls);\n};\n\n/**\n * Processes and decodes balance results from aggregate3 calls\n *\n * @param results - Array of results from aggregate3 calls\n * @param callMapping - Array mapping call indices to token and user addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeStaked - Whether to include staked balances\n * @returns Map of token address to map of user address to balance\n */\nconst processBalanceResults = (\n results: Aggregate3Result[],\n callMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[],\n chainId: Hex,\n provider: Web3Provider,\n includeStaked: boolean,\n): {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n} => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n const stakedBalanceMap: Record<string, BN> = {};\n\n // Create contract instances for decoding\n const erc20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n // Staking contracts are now handled separately in two-step process\n\n results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress, callType } = callMapping[index];\n if (callType === 'native') {\n // For native token, decode the getEthBalance result\n const balanceRaw = multicall3Contract.interface.decodeFunctionResult(\n GET_ETH_BALANCE_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n } else if (callType === 'staking') {\n // Staking is now handled separately in two-step process\n // This case should not occur anymore\n console.warn(\n 'Staking callType found in main processing - this should not happen',\n );\n } else {\n // For ERC20 tokens, decode the balanceOf result\n const balanceRaw = erc20Contract.interface.decodeFunctionResult(\n BALANCE_OF_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n }\n }\n });\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances: balanceMap };\n\n if (includeStaked && Object.keys(stakedBalanceMap).length > 0) {\n result.stakedBalances = stakedBalanceMap;\n }\n\n return result;\n};\n\n/**\n * Fallback function to get native token balances using individual eth_getBalance calls\n * when Multicall3 is not supported on the chain.\n *\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to balance\n */\nconst getNativeBalancesFallback = async (\n userAddresses: string[],\n provider: Web3Provider,\n maxCallsParallel = 20,\n): Promise<Record<string, BN>> => {\n const balanceMap: Record<string, BN> = {};\n\n await reduceInBatchesSerially<string, void>({\n values: userAddresses,\n batchSize: maxCallsParallel,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const results = await Promise.allSettled(\n batch.map(async (userAddress) => {\n const balance = await provider.getBalance(userAddress);\n return {\n success: true,\n balance: new BN(balance.toString()),\n userAddress,\n };\n }),\n );\n\n results.forEach((result) => {\n if (\n result.status === 'fulfilled' &&\n result.value.success &&\n result.value.balance !== null\n ) {\n balanceMap[result.value.userAddress] = result.value.balance;\n }\n });\n },\n });\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get token balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param tokenAddresses - Array of ERC20 token contract addresses\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of token address to map of user address to balance\n */\nconst getTokenBalancesFallback = async (\n tokenAddresses: string[],\n userAddresses: string[],\n provider: Web3Provider,\n includeNative: boolean,\n maxCallsParallel: number,\n): Promise<Record<string, Record<string, BN>>> => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n\n // Handle ERC20 token balances using the existing fallback function\n if (tokenAddresses.length > 0) {\n const erc20Calls: Call[] = [];\n const callMapping: { tokenAddress: string; userAddress: string }[] = [];\n\n tokenAddresses.forEach((tokenAddress) => {\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n tokenAddress,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n erc20Calls.push({\n contract,\n functionSignature: BALANCE_OF_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ tokenAddress, userAddress });\n });\n });\n\n const erc20Results = await fallback(erc20Calls, maxCallsParallel);\n erc20Results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress } = callMapping[index];\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = result.value as BN;\n }\n });\n }\n\n // Handle native token balances using the native fallback function\n if (includeNative) {\n const nativeBalances = await getNativeBalancesFallback(\n userAddresses,\n provider,\n maxCallsParallel,\n );\n if (Object.keys(nativeBalances).length > 0) {\n balanceMap[ZERO_ADDRESS] = nativeBalances;\n }\n }\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get staked balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param userAddresses - Array of user addresses to check staked balances for\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to staked balance\n */\nconst getStakedBalancesFallback = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsParallel: number,\n): Promise<Record<string, BN>> => {\n const stakedBalanceMap: Record<string, BN> = {};\n\n const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n if (!stakingContractAddress) {\n // No staking support for this chain\n return stakedBalanceMap;\n }\n\n const stakingCalls: Call[] = [];\n const callMapping: { userAddress: string }[] = [];\n\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n stakingCalls.push({\n contract,\n functionSignature: GET_SHARES_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ userAddress });\n });\n\n const stakingResults = await fallback(stakingCalls, maxCallsParallel);\n stakingResults.forEach((result, index) => {\n if (result.success) {\n const { userAddress } = callMapping[index];\n stakedBalanceMap[userAddress] = result.value as BN;\n }\n });\n\n return stakedBalanceMap;\n};\n\n/**\n * Get staked balances for multiple addresses using two-step process:\n * 1. Get shares for all addresses\n * 2. Convert non-zero shares to assets\n *\n * @param userAddresses - Array of user addresses to check\n * @param chainId - Chain ID as hex string\n * @param provider - Ethers provider\n * @returns Promise resolving to map of user address to staked balance\n */\nexport const getStakedBalancesForAddresses = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Record<string, BN>> => {\n const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n if (!stakingContractAddress) {\n return {};\n }\n\n const stakingContract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n\n try {\n // Step 1: Get shares for all addresses\n const shareCalls: Aggregate3Call[] = userAddresses.map((userAddress) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n GET_SHARES_FUNCTION,\n [userAddress],\n ),\n }));\n\n const shareResults = await aggregate3(shareCalls, chainId, provider);\n\n // Step 2: For addresses with non-zero shares, convert to assets\n const nonZeroSharesData: { address: string; shares: BN }[] = [];\n shareResults.forEach((result, index) => {\n if (result.success) {\n const sharesRaw = stakingContract.interface.decodeFunctionResult(\n GET_SHARES_FUNCTION,\n result.returnData,\n )[0];\n const shares = new BN(sharesRaw.toString());\n\n if (shares.gt(new BN(0))) {\n nonZeroSharesData.push({\n address: userAddresses[index],\n shares,\n });\n }\n }\n });\n\n if (nonZeroSharesData.length === 0) {\n return {};\n }\n\n // Step 3: Convert shares to assets for addresses with non-zero shares\n const assetCalls: Aggregate3Call[] = nonZeroSharesData.map(\n ({ shares }) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n CONVERT_TO_ASSETS_FUNCTION,\n [shares.toString()],\n ),\n }),\n );\n\n const assetResults = await aggregate3(assetCalls, chainId, provider);\n\n // Step 4: Build final result mapping\n const result: Record<string, BN> = {};\n assetResults.forEach((assetResult, index) => {\n if (assetResult.success) {\n const assetsRaw = stakingContract.interface.decodeFunctionResult(\n CONVERT_TO_ASSETS_FUNCTION,\n assetResult.returnData,\n )[0];\n const assets = new BN(assetsRaw.toString());\n\n const { address } = nonZeroSharesData[index];\n result[address] = assets;\n }\n });\n\n return result;\n } catch (error) {\n console.error('Error fetching staked balances:', error);\n return {};\n }\n};\n\n/**\n * Get token balances (both ERC20 and native) for multiple addresses using aggregate3.\n * This is more efficient than individual balanceOf calls for multiple addresses and tokens.\n * Native token balances are mapped to the zero address (0x0000000000000000000000000000000000000000).\n *\n * @param accountTokenGroups - Array of objects containing account addresses and their associated token addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param includeStaked - Whether to include staked balances from supported staking contracts (default: false)\n * @returns Promise resolving to object containing tokenBalances map and optional stakedBalances map\n */\nexport const getTokenBalancesForMultipleAddresses = async (\n accountTokenGroups: { accountAddress: Hex; tokenAddresses: Hex[] }[],\n chainId: Hex,\n provider: Web3Provider,\n includeNative: boolean,\n includeStaked: boolean,\n): Promise<{\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n}> => {\n // Return early if no groups provided\n if (accountTokenGroups.length === 0 && !includeNative && !includeStaked) {\n return { tokenBalances: {} };\n }\n\n // Extract unique token addresses and user addresses from groups\n const uniqueTokenAddresses = Array.from(\n new Set(accountTokenGroups.flatMap((group) => group.tokenAddresses)),\n ).filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS); // Exclude native token from ERC20 calls\n\n const uniqueUserAddresses = Array.from(\n new Set(accountTokenGroups.map((group) => group.accountAddress)),\n );\n\n // Check if Multicall3 is supported on this chain\n if (!MULTICALL_CONTRACT_BY_CHAINID[chainId]) {\n // Fallback to individual balance calls when Multicall3 is not supported\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n\n try {\n // Create calls directly from pairs\n const allCalls: Aggregate3Call[] = [];\n const allCallMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[] = [];\n\n // Create a temporary ERC20 contract for encoding\n const tempERC20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n // Create ERC20 balance calls for all account-token combinations\n accountTokenGroups.forEach((group) => {\n group.tokenAddresses\n .filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS)\n .forEach((tokenAddress) => {\n allCalls.push({\n target: tokenAddress,\n allowFailure: true,\n callData: tempERC20Contract.interface.encodeFunctionData(\n BALANCE_OF_FUNCTION,\n [group.accountAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress,\n userAddress: group.accountAddress,\n callType: 'erc20',\n });\n });\n });\n\n // Add native token balance calls if requested\n if (includeNative) {\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3TempContract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n uniqueUserAddresses.forEach((userAddress) => {\n allCalls.push({\n target: multicall3Address,\n allowFailure: true,\n callData: multicall3TempContract.interface.encodeFunctionData(\n GET_ETH_BALANCE_FUNCTION,\n [userAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress: ZERO_ADDRESS,\n userAddress,\n callType: 'native',\n });\n });\n }\n\n // Note: Staking balances will be handled separately in two steps after token/native calls\n\n // Execute all calls in batches\n const maxCallsPerBatch = 300; // Limit calls per batch to avoid gas/size limits\n const allResults: Aggregate3Result[] = [];\n\n await reduceInBatchesSerially<Aggregate3Call, void>({\n values: allCalls,\n batchSize: maxCallsPerBatch,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const batchResults = await aggregate3(batch, chainId, provider);\n allResults.push(...batchResults);\n },\n });\n\n // Handle staking balances in two steps if requested\n let stakedBalances: Record<string, BN> = {};\n if (includeStaked) {\n stakedBalances = await getStakedBalancesForAddresses(\n uniqueUserAddresses,\n chainId,\n provider,\n );\n }\n\n // Process and return results\n const result = processBalanceResults(\n allResults,\n allCallMapping,\n chainId,\n provider,\n false, // Don't include staked from main processing\n );\n\n // Add staked balances to result\n if (includeStaked && Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n\n return result;\n } catch (error) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n\n // Fallback to individual balance calls when aggregate3 fails\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"multicall.cjs","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport { reduceInBatchesSerially } from './assetsUtil';\n\n// https://github.com/mds1/multicall/blob/main/deployments.json\nconst MULTICALL_CONTRACT_BY_CHAINID = {\n '0x1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa36a7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4268': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b6e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18fc4a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa37dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eee': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eeb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15f2249': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x89': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13881': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13882': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x44d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x5a2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x98a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x64': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x27d8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa86a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa869': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfaf0': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xcc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x504': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x505': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a15c308d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2a15c3083': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x63564c40': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x19': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5535072': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x120': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4e454152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x250': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5c2359': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xec0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x42': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x80': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x440': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x257': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Rootstock, bytecode OK and referenced as \"RSK\" in https://www.multicall3.com/deployments\n '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2328': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x12': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa516': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5afe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ec': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaef3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116ea': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2019': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e9': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x7d1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x141': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e15': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1251': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7f08': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8ae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1389': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1388': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f92': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14a33': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x14a34': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2105': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x936': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd2af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0ce': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe705': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe704': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe708': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2b6f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x39': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x23a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1644': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdea8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x171': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // HyperEVM (999)\n '0x3e7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x76adf1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3b9ac9ff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2e': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x15b3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x82751': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8274f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x82750': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x96f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cc5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4571': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe99': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7d0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1297': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1d5e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3a14269b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x561bf78b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x235ddd0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cd156dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5d456c62': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x79f99296': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x585eb4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507aaa2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1fc3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x32d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a73': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a71': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0d6': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1069': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7e5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x53': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x52': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe298': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x94': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2803': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2802': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c5f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c60': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4cb2f': '0xdbfa261cd7d17bb40479a0493ad6c0fee435859e',\n '0x7f93': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb660': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb02113d3f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdad': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b32': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Etherlink mainnet, bytecode OK and referenced in https://www.multicall3.com/deployments\n '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1b58': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc3': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x16fd8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc7': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x405': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x334': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1ce': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1cf': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xa70e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x868b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa0c71fd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13e31': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa1337': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xf63': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x144': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x118': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x12c': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x18995f': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x2b74': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0xfc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x9da': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x137': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13ed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x24b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xba9302': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7c8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138d5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x343b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x34a1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3109': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x91b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa96': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x22c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2be3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xbf03': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b254': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa7b14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2276': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b9e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a63bb8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xae3f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x531': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c58': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1d88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5b9b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4c7e1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa53b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x406': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2cef': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18b2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x182a9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfdd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfde': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x99c0a0f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x22cf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x310c5': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x659': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // BOB, bytecode OK and referenced in https://www.multicall3.com/deployments\n '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x31bf8c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1cbc67bfdc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x98967f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4f588': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x16db': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x3a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1e0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x221': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Injective, contract found but not in multicall3 repo\n '0x6f0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Hemi, contract found but not in multicall3 repo\n '0xa867': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plasma, contract found but not in multicall3 repo\n '0x2611': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Nonmia, contract found but not in multicall3 repo\n '0xa6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XRPL, contract found but not in multicall3 repo\n '0x15f900': '0x6B5eFbC0C82eBb26CA13a4F11836f36Fc6fdBC5D',\n // Soneium, contract found but not in multicall3 repo\n '0x74c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Genesys, contract found but not in multicall3 repo\n '0x407b': '0x90a2377F233E3461BACa6080d4837837d8762927',\n // EDU (Animoca)\n '0xa3c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Abstract\n '0xab5': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n // Berachain, contract found but not in multicall3 repo\n '0x138de': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH TESTNET\n '0x18c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Apechain\n '0x8173': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Matchain, contract found but not in multicall3 repo\n '0x2ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad TESTNET\n '0x279f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Katana\n '0xb67d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Lens, contract found but not in multicall3 repo\n '0xe8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plume\n '0x18232': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad Mainnet\n '0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XDC, contract found but not in multicall3 repo\n '0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',\n // MegaETH TESTNET v2 (timothy chain ID 6343)\n '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH mainnet, contract found matching multicall3 bytecode\n '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MSU (contract they deployed by their team for us)\n '0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',\n // INK Mainnet\n '0xdef1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n} as Record<Hex, Hex>;\n\nconst multicallAbi = [\n {\n name: 'tryAggregate',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n { name: 'requireSuccess', type: 'bool' },\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\n// Multicall3 ABI for aggregate3 function\nconst multicall3Abi = [\n {\n name: 'aggregate3',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'allowFailure', type: 'bool' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\nexport type Call = {\n contract: Contract;\n functionSignature: string;\n arguments: unknown[];\n};\n\nexport type MulticallResult = { success: boolean; value: unknown };\n\nexport type Aggregate3Call = {\n target: string;\n allowFailure: boolean;\n callData: string;\n};\n\nexport type Aggregate3Result = {\n success: boolean;\n returnData: string;\n};\n\n// Constants for encoded strings and addresses\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst BALANCE_OF_FUNCTION = 'balanceOf(address)';\nconst GET_ETH_BALANCE_FUNCTION = 'getEthBalance';\nconst GET_SHARES_FUNCTION = 'getShares';\nconst CONVERT_TO_ASSETS_FUNCTION = 'convertToAssets';\n\n// ERC20 balanceOf ABI\nconst ERC20_BALANCE_OF_ABI = [\n {\n name: 'balanceOf',\n type: 'function',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Multicall3 getEthBalance ABI\nconst MULTICALL3_GET_ETH_BALANCE_ABI = [\n {\n name: 'getEthBalance',\n type: 'function',\n inputs: [{ name: 'addr', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Staking contract ABI with both getShares and convertToAssets\nconst STAKING_CONTRACT_ABI = [\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\nconst multicall = async (\n calls: Call[],\n multicallAddress: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall: number,\n): Promise<MulticallResult[]> => {\n const multicallContract = new Contract(\n multicallAddress,\n multicallAbi,\n provider,\n );\n\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsPerMulticall,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const calldata = batch.map((call) => ({\n target: call.contract.address,\n callData: call.contract.interface.encodeFunctionData(\n call.contract.interface.functions[call.functionSignature],\n call.arguments,\n ),\n }));\n\n const results = await multicallContract.callStatic.tryAggregate(\n false,\n calldata,\n );\n\n return [\n ...workingResult,\n ...results.map(\n (r: { success: boolean; returnData: string }, i: number) => ({\n success: r.success,\n value: r.success\n ? batch[i].contract.interface.decodeFunctionResult(\n batch[i].functionSignature,\n r.returnData,\n )[0]\n : undefined,\n }),\n ),\n ];\n },\n });\n};\n\nconst fallback = async (\n calls: Call[],\n maxCallsParallel: number,\n): Promise<MulticallResult[]> => {\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsParallel,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const results = await Promise.allSettled(\n batch.map((call) =>\n call.contract[call.functionSignature](...call.arguments),\n ),\n );\n return [\n ...workingResult,\n ...results.map((p) => ({\n success: p.status === 'fulfilled',\n value: p.status === 'fulfilled' ? p.value : undefined,\n })),\n ];\n },\n });\n};\n\n/**\n * Executes an array of contract calls. If the chain supports multicalls,\n * the calls will be executed in single RPC requests (up to maxCallsPerMulticall).\n * Otherwise the calls will be executed separately in parallel (up to maxCallsParallel).\n *\n * @param calls - An array of contract calls to execute.\n * @param chainId - The hexadecimal chain id.\n * @param provider - An ethers rpc provider.\n * @param maxCallsPerMulticall - If multicall is supported, the maximum number of calls to exeute in each multicall.\n * @param maxCallsParallel - If multicall is not supported, the maximum number of calls to execute in parallel.\n * @returns An array of results, with a success boolean and value for each call.\n */\nexport const multicallOrFallback = async (\n calls: Call[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall = 300,\n maxCallsParallel = 20,\n): Promise<MulticallResult[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicallAddress = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n if (multicallAddress) {\n try {\n return await multicall(\n calls,\n multicallAddress,\n provider,\n maxCallsPerMulticall,\n );\n } catch (error: unknown) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n }\n }\n\n return await fallback(calls, maxCallsParallel);\n};\n\n/**\n * Execute multiple contract calls using Multicall3's aggregate3 function.\n * This allows for more efficient batch calls with individual failure handling.\n *\n * @param calls - Array of calls to execute via aggregate3\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @returns Promise resolving to array of results from aggregate3\n */\nexport const aggregate3 = async (\n calls: Aggregate3Call[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Aggregate3Result[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n multicall3Abi,\n provider,\n );\n\n return await multicall3Contract.callStatic.aggregate3(calls);\n};\n\n/**\n * Processes and decodes balance results from aggregate3 calls\n *\n * @param results - Array of results from aggregate3 calls\n * @param callMapping - Array mapping call indices to token and user addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeStaked - Whether to include staked balances\n * @returns Map of token address to map of user address to balance\n */\nconst processBalanceResults = (\n results: Aggregate3Result[],\n callMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[],\n chainId: Hex,\n provider: Web3Provider,\n includeStaked: boolean,\n): {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n} => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n const stakedBalanceMap: Record<string, BN> = {};\n\n // Create contract instances for decoding\n const erc20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n // Staking contracts are now handled separately in two-step process\n\n results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress, callType } = callMapping[index];\n if (callType === 'native') {\n // For native token, decode the getEthBalance result\n const balanceRaw = multicall3Contract.interface.decodeFunctionResult(\n GET_ETH_BALANCE_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n } else if (callType === 'staking') {\n // Staking is now handled separately in two-step process\n // This case should not occur anymore\n console.warn(\n 'Staking callType found in main processing - this should not happen',\n );\n } else {\n // For ERC20 tokens, decode the balanceOf result\n const balanceRaw = erc20Contract.interface.decodeFunctionResult(\n BALANCE_OF_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n }\n }\n });\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances: balanceMap };\n\n if (includeStaked && Object.keys(stakedBalanceMap).length > 0) {\n result.stakedBalances = stakedBalanceMap;\n }\n\n return result;\n};\n\n/**\n * Fallback function to get native token balances using individual eth_getBalance calls\n * when Multicall3 is not supported on the chain.\n *\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to balance\n */\nconst getNativeBalancesFallback = async (\n userAddresses: string[],\n provider: Web3Provider,\n maxCallsParallel = 20,\n): Promise<Record<string, BN>> => {\n const balanceMap: Record<string, BN> = {};\n\n await reduceInBatchesSerially<string, void>({\n values: userAddresses,\n batchSize: maxCallsParallel,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const results = await Promise.allSettled(\n batch.map(async (userAddress) => {\n const balance = await provider.getBalance(userAddress);\n return {\n success: true,\n balance: new BN(balance.toString()),\n userAddress,\n };\n }),\n );\n\n results.forEach((result) => {\n if (\n result.status === 'fulfilled' &&\n result.value.success &&\n result.value.balance !== null\n ) {\n balanceMap[result.value.userAddress] = result.value.balance;\n }\n });\n },\n });\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get token balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param tokenAddresses - Array of ERC20 token contract addresses\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of token address to map of user address to balance\n */\nconst getTokenBalancesFallback = async (\n tokenAddresses: string[],\n userAddresses: string[],\n provider: Web3Provider,\n includeNative: boolean,\n maxCallsParallel: number,\n): Promise<Record<string, Record<string, BN>>> => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n\n // Handle ERC20 token balances using the existing fallback function\n if (tokenAddresses.length > 0) {\n const erc20Calls: Call[] = [];\n const callMapping: { tokenAddress: string; userAddress: string }[] = [];\n\n tokenAddresses.forEach((tokenAddress) => {\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n tokenAddress,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n erc20Calls.push({\n contract,\n functionSignature: BALANCE_OF_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ tokenAddress, userAddress });\n });\n });\n\n const erc20Results = await fallback(erc20Calls, maxCallsParallel);\n erc20Results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress } = callMapping[index];\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = result.value as BN;\n }\n });\n }\n\n // Handle native token balances using the native fallback function\n if (includeNative) {\n const nativeBalances = await getNativeBalancesFallback(\n userAddresses,\n provider,\n maxCallsParallel,\n );\n if (Object.keys(nativeBalances).length > 0) {\n balanceMap[ZERO_ADDRESS] = nativeBalances;\n }\n }\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get staked balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param userAddresses - Array of user addresses to check staked balances for\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to staked balance\n */\nconst getStakedBalancesFallback = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsParallel: number,\n): Promise<Record<string, BN>> => {\n const stakedBalanceMap: Record<string, BN> = {};\n\n const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n if (!stakingContractAddress) {\n // No staking support for this chain\n return stakedBalanceMap;\n }\n\n const stakingCalls: Call[] = [];\n const callMapping: { userAddress: string }[] = [];\n\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n stakingCalls.push({\n contract,\n functionSignature: GET_SHARES_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ userAddress });\n });\n\n const stakingResults = await fallback(stakingCalls, maxCallsParallel);\n stakingResults.forEach((result, index) => {\n if (result.success) {\n const { userAddress } = callMapping[index];\n stakedBalanceMap[userAddress] = result.value as BN;\n }\n });\n\n return stakedBalanceMap;\n};\n\n/**\n * Get staked balances for multiple addresses using two-step process:\n * 1. Get shares for all addresses\n * 2. Convert non-zero shares to assets\n *\n * @param userAddresses - Array of user addresses to check\n * @param chainId - Chain ID as hex string\n * @param provider - Ethers provider\n * @returns Promise resolving to map of user address to staked balance\n */\nexport const getStakedBalancesForAddresses = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Record<string, BN>> => {\n const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n if (!stakingContractAddress) {\n return {};\n }\n\n const stakingContract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n\n try {\n // Step 1: Get shares for all addresses\n const shareCalls: Aggregate3Call[] = userAddresses.map((userAddress) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n GET_SHARES_FUNCTION,\n [userAddress],\n ),\n }));\n\n const shareResults = await aggregate3(shareCalls, chainId, provider);\n\n // Step 2: For addresses with non-zero shares, convert to assets\n const nonZeroSharesData: { address: string; shares: BN }[] = [];\n shareResults.forEach((result, index) => {\n if (result.success) {\n const sharesRaw = stakingContract.interface.decodeFunctionResult(\n GET_SHARES_FUNCTION,\n result.returnData,\n )[0];\n const shares = new BN(sharesRaw.toString());\n\n if (shares.gt(new BN(0))) {\n nonZeroSharesData.push({\n address: userAddresses[index],\n shares,\n });\n }\n }\n });\n\n if (nonZeroSharesData.length === 0) {\n return {};\n }\n\n // Step 3: Convert shares to assets for addresses with non-zero shares\n const assetCalls: Aggregate3Call[] = nonZeroSharesData.map(\n ({ shares }) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n CONVERT_TO_ASSETS_FUNCTION,\n [shares.toString()],\n ),\n }),\n );\n\n const assetResults = await aggregate3(assetCalls, chainId, provider);\n\n // Step 4: Build final result mapping\n const result: Record<string, BN> = {};\n assetResults.forEach((assetResult, index) => {\n if (assetResult.success) {\n const assetsRaw = stakingContract.interface.decodeFunctionResult(\n CONVERT_TO_ASSETS_FUNCTION,\n assetResult.returnData,\n )[0];\n const assets = new BN(assetsRaw.toString());\n\n const { address } = nonZeroSharesData[index];\n result[address] = assets;\n }\n });\n\n return result;\n } catch (error) {\n console.error('Error fetching staked balances:', error);\n return {};\n }\n};\n\n/**\n * Get token balances (both ERC20 and native) for multiple addresses using aggregate3.\n * This is more efficient than individual balanceOf calls for multiple addresses and tokens.\n * Native token balances are mapped to the zero address (0x0000000000000000000000000000000000000000).\n *\n * @param accountTokenGroups - Array of objects containing account addresses and their associated token addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param includeStaked - Whether to include staked balances from supported staking contracts (default: false)\n * @returns Promise resolving to object containing tokenBalances map and optional stakedBalances map\n */\nexport const getTokenBalancesForMultipleAddresses = async (\n accountTokenGroups: { accountAddress: Hex; tokenAddresses: Hex[] }[],\n chainId: Hex,\n provider: Web3Provider,\n includeNative: boolean,\n includeStaked: boolean,\n): Promise<{\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n}> => {\n // Return early if no groups provided\n if (accountTokenGroups.length === 0 && !includeNative && !includeStaked) {\n return { tokenBalances: {} };\n }\n\n // Extract unique token addresses and user addresses from groups\n const uniqueTokenAddresses = Array.from(\n new Set(accountTokenGroups.flatMap((group) => group.tokenAddresses)),\n ).filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS); // Exclude native token from ERC20 calls\n\n const uniqueUserAddresses = Array.from(\n new Set(accountTokenGroups.map((group) => group.accountAddress)),\n );\n\n // Check if Multicall3 is supported on this chain\n if (!MULTICALL_CONTRACT_BY_CHAINID[chainId]) {\n // Fallback to individual balance calls when Multicall3 is not supported\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n\n try {\n // Create calls directly from pairs\n const allCalls: Aggregate3Call[] = [];\n const allCallMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[] = [];\n\n // Create a temporary ERC20 contract for encoding\n const tempERC20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n // Create ERC20 balance calls for all account-token combinations\n accountTokenGroups.forEach((group) => {\n group.tokenAddresses\n .filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS)\n .forEach((tokenAddress) => {\n allCalls.push({\n target: tokenAddress,\n allowFailure: true,\n callData: tempERC20Contract.interface.encodeFunctionData(\n BALANCE_OF_FUNCTION,\n [group.accountAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress,\n userAddress: group.accountAddress,\n callType: 'erc20',\n });\n });\n });\n\n // Add native token balance calls if requested\n if (includeNative) {\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3TempContract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n uniqueUserAddresses.forEach((userAddress) => {\n allCalls.push({\n target: multicall3Address,\n allowFailure: true,\n callData: multicall3TempContract.interface.encodeFunctionData(\n GET_ETH_BALANCE_FUNCTION,\n [userAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress: ZERO_ADDRESS,\n userAddress,\n callType: 'native',\n });\n });\n }\n\n // Note: Staking balances will be handled separately in two steps after token/native calls\n\n // Execute all calls in batches\n const maxCallsPerBatch = 300; // Limit calls per batch to avoid gas/size limits\n const allResults: Aggregate3Result[] = [];\n\n await reduceInBatchesSerially<Aggregate3Call, void>({\n values: allCalls,\n batchSize: maxCallsPerBatch,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const batchResults = await aggregate3(batch, chainId, provider);\n allResults.push(...batchResults);\n },\n });\n\n // Handle staking balances in two steps if requested\n let stakedBalances: Record<string, BN> = {};\n if (includeStaked) {\n stakedBalances = await getStakedBalancesForAddresses(\n uniqueUserAddresses,\n chainId,\n provider,\n );\n }\n\n // Process and return results\n const result = processBalanceResults(\n allResults,\n allCallMapping,\n chainId,\n provider,\n false, // Don't include staked from main processing\n );\n\n // Add staked balances to result\n if (includeStaked && Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n\n return result;\n } catch (error) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n\n // Fallback to individual balance calls when aggregate3 fails\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n};\n"]}
|
package/dist/multicall.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.d.cts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iCAAiC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"multicall.d.cts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iCAAiC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,cAAc;AAiXvB,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA0HF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,UACvB,IAAI,EAAE,WACJ,GAAG,YACF,YAAY,+DAGrB,QAAQ,eAAe,EAAE,CA6B3B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,UACd,cAAc,EAAE,WACd,GAAG,YACF,YAAY,KACrB,QAAQ,gBAAgB,EAAE,CAa5B,CAAC;AAoQF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,kBACzB,MAAM,EAAE,WACd,GAAG,YACF,YAAY,KACrB,QAAQ,OAAO,MAAM,EAAE,EAAE,CAAC,CAmF5B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oCAAoC,uBAC3B;IAAE,cAAc,EAAE,GAAG,CAAC;IAAC,cAAc,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,WAC3D,GAAG,YACF,YAAY,iBACP,OAAO,iBACP,OAAO,KACrB,QAAQ;IACT,aAAa,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC;CACrC,CAkMA,CAAC"}
|
package/dist/multicall.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.d.mts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iCAAiC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"multicall.d.mts","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iCAAiC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,EAAE,cAAc;AAiXvB,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA0HF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,UACvB,IAAI,EAAE,WACJ,GAAG,YACF,YAAY,+DAGrB,QAAQ,eAAe,EAAE,CA6B3B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,UACd,cAAc,EAAE,WACd,GAAG,YACF,YAAY,KACrB,QAAQ,gBAAgB,EAAE,CAa5B,CAAC;AAoQF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,kBACzB,MAAM,EAAE,WACd,GAAG,YACF,YAAY,KACrB,QAAQ,OAAO,MAAM,EAAE,EAAE,CAAC,CAmF5B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oCAAoC,uBAC3B;IAAE,cAAc,EAAE,GAAG,CAAC;IAAC,cAAc,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,WAC3D,GAAG,YACF,YAAY,iBACP,OAAO,iBACP,OAAO,KACrB,QAAQ;IACT,aAAa,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC;CACrC,CAkMA,CAAC"}
|
package/dist/multicall.mjs
CHANGED
|
@@ -310,6 +310,8 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
|
|
|
310
310
|
'0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
311
311
|
// MSU (contract they deployed by their team for us)
|
|
312
312
|
'0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',
|
|
313
|
+
// INK Mainnet
|
|
314
|
+
'0xdef1': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
313
315
|
};
|
|
314
316
|
const multicallAbi = [
|
|
315
317
|
{
|