@metamask-previews/assets-controllers 94.1.0-preview-42084fe4 → 94.1.0-preview-e69ede40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs +8 -2
  3. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -1
  4. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts.map +1 -1
  5. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts.map +1 -1
  6. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs +8 -2
  7. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -1
  8. package/dist/TokenListController.cjs.map +1 -1
  9. package/dist/TokenListController.d.cts +0 -12
  10. package/dist/TokenListController.d.cts.map +1 -1
  11. package/dist/TokenListController.d.mts +0 -12
  12. package/dist/TokenListController.d.mts.map +1 -1
  13. package/dist/TokenListController.mjs.map +1 -1
  14. package/dist/multicall.cjs +5 -0
  15. package/dist/multicall.cjs.map +1 -1
  16. package/dist/multicall.d.cts.map +1 -1
  17. package/dist/multicall.d.mts.map +1 -1
  18. package/dist/multicall.mjs +5 -0
  19. package/dist/multicall.mjs.map +1 -1
  20. package/dist/token-prices-service/codefi-v2.cjs +77 -101
  21. package/dist/token-prices-service/codefi-v2.cjs.map +1 -1
  22. package/dist/token-prices-service/codefi-v2.d.cts +39 -26
  23. package/dist/token-prices-service/codefi-v2.d.cts.map +1 -1
  24. package/dist/token-prices-service/codefi-v2.d.mts +39 -26
  25. package/dist/token-prices-service/codefi-v2.d.mts.map +1 -1
  26. package/dist/token-prices-service/codefi-v2.mjs +77 -101
  27. package/dist/token-prices-service/codefi-v2.mjs.map +1 -1
  28. package/dist/token-service.cjs +6 -101
  29. package/dist/token-service.cjs.map +1 -1
  30. package/dist/token-service.d.cts +1 -13
  31. package/dist/token-service.d.cts.map +1 -1
  32. package/dist/token-service.d.mts +1 -13
  33. package/dist/token-service.d.mts.map +1 -1
  34. package/dist/token-service.mjs +6 -101
  35. package/dist/token-service.mjs.map +1 -1
  36. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"TokenListController.mjs","sourceRoot":"","sources":["../src/TokenListController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { safelyExecute } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerStateChangeEvent,\n NetworkState,\n NetworkControllerGetNetworkClientByIdAction,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport {\n isTokenListSupportedForNetwork,\n formatAggregatorNames,\n formatIconUrlWithProxy,\n} from './assetsUtil';\nimport { fetchTokenListByChainId } from './token-service';\n\nconst DEFAULT_INTERVAL = 24 * 60 * 60 * 1000;\nconst DEFAULT_THRESHOLD = 24 * 60 * 60 * 1000;\n\nconst name = 'TokenListController';\n\nexport type TokenListToken = {\n name: string;\n symbol: string;\n decimals: number;\n address: string;\n occurrences: number;\n aggregators: string[];\n iconUrl: string;\n rwaData?: {\n instrumentType: string;\n ticker: string;\n market: {\n nextOpen: string;\n nextClose: string;\n };\n nextPause: {\n start: string;\n end: string;\n };\n };\n};\n\nexport type TokenListMap = Record<string, TokenListToken>;\n\ntype DataCache = {\n timestamp: number;\n data: TokenListMap;\n};\nexport type TokensChainsCache = {\n [chainId: Hex]: DataCache;\n};\n\nexport type TokenListState = {\n tokensChainsCache: TokensChainsCache;\n preventPollingOnNetworkRestart: boolean;\n};\n\nexport type TokenListStateChange = ControllerStateChangeEvent<\n typeof name,\n TokenListState\n>;\n\nexport type TokenListControllerEvents = TokenListStateChange;\n\nexport type GetTokenListState = ControllerGetStateAction<\n typeof name,\n TokenListState\n>;\n\nexport type TokenListControllerActions = GetTokenListState;\n\ntype AllowedActions = NetworkControllerGetNetworkClientByIdAction;\n\ntype AllowedEvents = NetworkControllerStateChangeEvent;\n\nexport type TokenListControllerMessenger = Messenger<\n typeof name,\n TokenListControllerActions | AllowedActions,\n TokenListControllerEvents | AllowedEvents\n>;\n\nconst metadata: StateMetadata<TokenListState> = {\n tokensChainsCache: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n preventPollingOnNetworkRestart: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n};\n\nexport const getDefaultTokenListState = (): TokenListState => {\n return {\n tokensChainsCache: {},\n preventPollingOnNetworkRestart: false,\n };\n};\n\n/** The input to start polling for the {@link TokenListController} */\ntype TokenListPollingInput = {\n chainId: Hex;\n};\n\n/**\n * Controller that passively polls on a set interval for the list of tokens from metaswaps api\n */\nexport class TokenListController extends StaticIntervalPollingController<TokenListPollingInput>()<\n typeof name,\n TokenListState,\n TokenListControllerMessenger\n> {\n private readonly mutex = new Mutex();\n\n private intervalId?: ReturnType<typeof setTimeout>;\n\n private readonly intervalDelay: number;\n\n private readonly cacheRefreshThreshold: number;\n\n private chainId: Hex;\n\n private abortController: AbortController;\n\n /**\n * Creates a TokenListController instance.\n *\n * @param options - The controller options.\n * @param options.chainId - The chain ID of the current network.\n * @param options.onNetworkStateChange - A function for registering an event handler for network state changes.\n * @param options.interval - The polling interval, in milliseconds.\n * @param options.cacheRefreshThreshold - The token cache expiry time, in milliseconds.\n * @param options.messenger - A restricted messenger.\n * @param options.state - Initial state to set on this controller.\n * @param options.preventPollingOnNetworkRestart - Determines whether to prevent poilling on network restart in extension.\n */\n constructor({\n chainId,\n preventPollingOnNetworkRestart = false,\n onNetworkStateChange,\n interval = DEFAULT_INTERVAL,\n cacheRefreshThreshold = DEFAULT_THRESHOLD,\n messenger,\n state,\n }: {\n chainId: Hex;\n preventPollingOnNetworkRestart?: boolean;\n onNetworkStateChange?: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n interval?: number;\n cacheRefreshThreshold?: number;\n messenger: TokenListControllerMessenger;\n state?: Partial<TokenListState>;\n }) {\n super({\n name,\n metadata,\n messenger,\n state: { ...getDefaultTokenListState(), ...state },\n });\n this.intervalDelay = interval;\n this.setIntervalLength(interval);\n this.cacheRefreshThreshold = cacheRefreshThreshold;\n this.chainId = chainId;\n this.updatePreventPollingOnNetworkRestart(preventPollingOnNetworkRestart);\n this.abortController = new AbortController();\n if (onNetworkStateChange) {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n onNetworkStateChange(async (networkControllerState) => {\n await this.#onNetworkControllerStateChange(networkControllerState);\n });\n } else {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (networkControllerState) => {\n await this.#onNetworkControllerStateChange(networkControllerState);\n },\n );\n }\n }\n\n /**\n * Updates state and restarts polling on changes to the network controller\n * state.\n *\n * @param networkControllerState - The updated network controller state.\n */\n async #onNetworkControllerStateChange(networkControllerState: NetworkState) {\n const selectedNetworkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkControllerState.selectedNetworkClientId,\n );\n const { chainId } = selectedNetworkClient.configuration;\n\n if (this.chainId !== chainId) {\n this.abortController.abort();\n this.abortController = new AbortController();\n this.chainId = chainId;\n if (this.state.preventPollingOnNetworkRestart) {\n this.clearingTokenListData();\n }\n }\n }\n\n // Eventually we want to remove start/restart/stop controls in favor of new _executePoll API\n // Maintaining these functions for now until we can safely deprecate them for backwards compatibility\n /**\n * Start polling for the token list.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n async start() {\n if (!isTokenListSupportedForNetwork(this.chainId)) {\n return;\n }\n await this.#startDeprecatedPolling();\n }\n\n /**\n * Restart polling for the token list.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n async restart() {\n this.stopPolling();\n await this.#startDeprecatedPolling();\n }\n\n /**\n * Stop polling for the token list.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n stop() {\n this.stopPolling();\n }\n\n /**\n * This stops any active polling.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n override destroy() {\n super.destroy();\n this.stopPolling();\n }\n\n /**\n * This stops any active polling intervals.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n private stopPolling() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n }\n\n /**\n * Starts a new polling interval for a given chainId (this should be deprecated in favor of _executePoll)\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n async #startDeprecatedPolling(): Promise<void> {\n // renaming this to avoid collision with base class\n await safelyExecute(() => this.fetchTokenList(this.chainId));\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.intervalId = setInterval(async () => {\n await safelyExecute(() => this.fetchTokenList(this.chainId));\n }, this.intervalDelay);\n }\n\n /**\n * This starts a new polling loop for any given chain. Under the hood it is deduping polls\n *\n * @param input - The input for the poll.\n * @param input.chainId - The chainId of the chain to trigger the fetch.\n * @returns A promise that resolves when this operation completes.\n */\n async _executePoll({ chainId }: TokenListPollingInput): Promise<void> {\n return this.fetchTokenList(chainId);\n }\n\n /**\n * Fetching token list from the Token Service API. This will fetch tokens across chains. It will update tokensChainsCache (scoped across chains), and also the tokenList (scoped for the selected chain)\n *\n * @param chainId - The chainId of the current chain triggering the fetch.\n */\n async fetchTokenList(chainId: Hex): Promise<void> {\n const releaseLock = await this.mutex.acquire();\n try {\n if (this.isCacheValid(chainId)) {\n return;\n }\n\n // Fetch fresh token list from the API\n const tokensFromAPI = await safelyExecute(\n () =>\n fetchTokenListByChainId(\n chainId,\n this.abortController.signal,\n ) as Promise<TokenListToken[]>,\n );\n\n // Have response - process and update list\n if (tokensFromAPI) {\n // Format tokens from API (HTTP) and update tokenList\n const tokenList: TokenListMap = {};\n for (const token of tokensFromAPI) {\n tokenList[token.address] = {\n ...token,\n aggregators: formatAggregatorNames(token.aggregators),\n iconUrl: formatIconUrlWithProxy({\n chainId,\n tokenAddress: token.address,\n }),\n };\n }\n\n this.update((state) => {\n const newDataCache: DataCache = { data: {}, timestamp: Date.now() };\n state.tokensChainsCache[chainId] ??= newDataCache;\n state.tokensChainsCache[chainId].data = tokenList;\n state.tokensChainsCache[chainId].timestamp = Date.now();\n });\n return;\n }\n\n // No response - fallback to previous state, or initialise empty\n if (!tokensFromAPI) {\n this.update((state) => {\n const newDataCache: DataCache = { data: {}, timestamp: Date.now() };\n state.tokensChainsCache[chainId] ??= newDataCache;\n state.tokensChainsCache[chainId].timestamp = Date.now();\n });\n }\n } finally {\n releaseLock();\n }\n }\n\n isCacheValid(chainId: Hex): boolean {\n const { tokensChainsCache }: TokenListState = this.state;\n const timestamp: number | undefined = tokensChainsCache[chainId]?.timestamp;\n const now = Date.now();\n return (\n timestamp !== undefined && now - timestamp < this.cacheRefreshThreshold\n );\n }\n\n /**\n * Clearing tokenList and tokensChainsCache explicitly.\n */\n clearingTokenListData(): void {\n this.update(() => {\n return {\n ...this.state,\n tokensChainsCache: {},\n };\n });\n }\n\n /**\n * Updates preventPollingOnNetworkRestart from extension.\n *\n * @param shouldPreventPolling - Determine whether to prevent polling on network change\n */\n updatePreventPollingOnNetworkRestart(shouldPreventPolling: boolean): void {\n this.update(() => {\n return {\n ...this.state,\n preventPollingOnNetworkRestart: shouldPreventPolling,\n };\n });\n }\n}\n\nexport default TokenListController;\n"]}
1
+ {"version":3,"file":"TokenListController.mjs","sourceRoot":"","sources":["../src/TokenListController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { safelyExecute } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerStateChangeEvent,\n NetworkState,\n NetworkControllerGetNetworkClientByIdAction,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport {\n isTokenListSupportedForNetwork,\n formatAggregatorNames,\n formatIconUrlWithProxy,\n} from './assetsUtil';\nimport { fetchTokenListByChainId } from './token-service';\n\nconst DEFAULT_INTERVAL = 24 * 60 * 60 * 1000;\nconst DEFAULT_THRESHOLD = 24 * 60 * 60 * 1000;\n\nconst name = 'TokenListController';\n\nexport type TokenListToken = {\n name: string;\n symbol: string;\n decimals: number;\n address: string;\n occurrences: number;\n aggregators: string[];\n iconUrl: string;\n};\n\nexport type TokenListMap = Record<string, TokenListToken>;\n\ntype DataCache = {\n timestamp: number;\n data: TokenListMap;\n};\nexport type TokensChainsCache = {\n [chainId: Hex]: DataCache;\n};\n\nexport type TokenListState = {\n tokensChainsCache: TokensChainsCache;\n preventPollingOnNetworkRestart: boolean;\n};\n\nexport type TokenListStateChange = ControllerStateChangeEvent<\n typeof name,\n TokenListState\n>;\n\nexport type TokenListControllerEvents = TokenListStateChange;\n\nexport type GetTokenListState = ControllerGetStateAction<\n typeof name,\n TokenListState\n>;\n\nexport type TokenListControllerActions = GetTokenListState;\n\ntype AllowedActions = NetworkControllerGetNetworkClientByIdAction;\n\ntype AllowedEvents = NetworkControllerStateChangeEvent;\n\nexport type TokenListControllerMessenger = Messenger<\n typeof name,\n TokenListControllerActions | AllowedActions,\n TokenListControllerEvents | AllowedEvents\n>;\n\nconst metadata: StateMetadata<TokenListState> = {\n tokensChainsCache: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n preventPollingOnNetworkRestart: {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n};\n\nexport const getDefaultTokenListState = (): TokenListState => {\n return {\n tokensChainsCache: {},\n preventPollingOnNetworkRestart: false,\n };\n};\n\n/** The input to start polling for the {@link TokenListController} */\ntype TokenListPollingInput = {\n chainId: Hex;\n};\n\n/**\n * Controller that passively polls on a set interval for the list of tokens from metaswaps api\n */\nexport class TokenListController extends StaticIntervalPollingController<TokenListPollingInput>()<\n typeof name,\n TokenListState,\n TokenListControllerMessenger\n> {\n private readonly mutex = new Mutex();\n\n private intervalId?: ReturnType<typeof setTimeout>;\n\n private readonly intervalDelay: number;\n\n private readonly cacheRefreshThreshold: number;\n\n private chainId: Hex;\n\n private abortController: AbortController;\n\n /**\n * Creates a TokenListController instance.\n *\n * @param options - The controller options.\n * @param options.chainId - The chain ID of the current network.\n * @param options.onNetworkStateChange - A function for registering an event handler for network state changes.\n * @param options.interval - The polling interval, in milliseconds.\n * @param options.cacheRefreshThreshold - The token cache expiry time, in milliseconds.\n * @param options.messenger - A restricted messenger.\n * @param options.state - Initial state to set on this controller.\n * @param options.preventPollingOnNetworkRestart - Determines whether to prevent poilling on network restart in extension.\n */\n constructor({\n chainId,\n preventPollingOnNetworkRestart = false,\n onNetworkStateChange,\n interval = DEFAULT_INTERVAL,\n cacheRefreshThreshold = DEFAULT_THRESHOLD,\n messenger,\n state,\n }: {\n chainId: Hex;\n preventPollingOnNetworkRestart?: boolean;\n onNetworkStateChange?: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n interval?: number;\n cacheRefreshThreshold?: number;\n messenger: TokenListControllerMessenger;\n state?: Partial<TokenListState>;\n }) {\n super({\n name,\n metadata,\n messenger,\n state: { ...getDefaultTokenListState(), ...state },\n });\n this.intervalDelay = interval;\n this.setIntervalLength(interval);\n this.cacheRefreshThreshold = cacheRefreshThreshold;\n this.chainId = chainId;\n this.updatePreventPollingOnNetworkRestart(preventPollingOnNetworkRestart);\n this.abortController = new AbortController();\n if (onNetworkStateChange) {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n onNetworkStateChange(async (networkControllerState) => {\n await this.#onNetworkControllerStateChange(networkControllerState);\n });\n } else {\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (networkControllerState) => {\n await this.#onNetworkControllerStateChange(networkControllerState);\n },\n );\n }\n }\n\n /**\n * Updates state and restarts polling on changes to the network controller\n * state.\n *\n * @param networkControllerState - The updated network controller state.\n */\n async #onNetworkControllerStateChange(networkControllerState: NetworkState) {\n const selectedNetworkClient = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkControllerState.selectedNetworkClientId,\n );\n const { chainId } = selectedNetworkClient.configuration;\n\n if (this.chainId !== chainId) {\n this.abortController.abort();\n this.abortController = new AbortController();\n this.chainId = chainId;\n if (this.state.preventPollingOnNetworkRestart) {\n this.clearingTokenListData();\n }\n }\n }\n\n // Eventually we want to remove start/restart/stop controls in favor of new _executePoll API\n // Maintaining these functions for now until we can safely deprecate them for backwards compatibility\n /**\n * Start polling for the token list.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n async start() {\n if (!isTokenListSupportedForNetwork(this.chainId)) {\n return;\n }\n await this.#startDeprecatedPolling();\n }\n\n /**\n * Restart polling for the token list.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n async restart() {\n this.stopPolling();\n await this.#startDeprecatedPolling();\n }\n\n /**\n * Stop polling for the token list.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n stop() {\n this.stopPolling();\n }\n\n /**\n * This stops any active polling.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n override destroy() {\n super.destroy();\n this.stopPolling();\n }\n\n /**\n * This stops any active polling intervals.\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n private stopPolling() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n }\n\n /**\n * Starts a new polling interval for a given chainId (this should be deprecated in favor of _executePoll)\n *\n * @deprecated This method is deprecated and will be removed in the future.\n * Consider using the new polling approach instead\n */\n async #startDeprecatedPolling(): Promise<void> {\n // renaming this to avoid collision with base class\n await safelyExecute(() => this.fetchTokenList(this.chainId));\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.intervalId = setInterval(async () => {\n await safelyExecute(() => this.fetchTokenList(this.chainId));\n }, this.intervalDelay);\n }\n\n /**\n * This starts a new polling loop for any given chain. Under the hood it is deduping polls\n *\n * @param input - The input for the poll.\n * @param input.chainId - The chainId of the chain to trigger the fetch.\n * @returns A promise that resolves when this operation completes.\n */\n async _executePoll({ chainId }: TokenListPollingInput): Promise<void> {\n return this.fetchTokenList(chainId);\n }\n\n /**\n * Fetching token list from the Token Service API. This will fetch tokens across chains. It will update tokensChainsCache (scoped across chains), and also the tokenList (scoped for the selected chain)\n *\n * @param chainId - The chainId of the current chain triggering the fetch.\n */\n async fetchTokenList(chainId: Hex): Promise<void> {\n const releaseLock = await this.mutex.acquire();\n try {\n if (this.isCacheValid(chainId)) {\n return;\n }\n\n // Fetch fresh token list from the API\n const tokensFromAPI = await safelyExecute(\n () =>\n fetchTokenListByChainId(\n chainId,\n this.abortController.signal,\n ) as Promise<TokenListToken[]>,\n );\n\n // Have response - process and update list\n if (tokensFromAPI) {\n // Format tokens from API (HTTP) and update tokenList\n const tokenList: TokenListMap = {};\n for (const token of tokensFromAPI) {\n tokenList[token.address] = {\n ...token,\n aggregators: formatAggregatorNames(token.aggregators),\n iconUrl: formatIconUrlWithProxy({\n chainId,\n tokenAddress: token.address,\n }),\n };\n }\n\n this.update((state) => {\n const newDataCache: DataCache = { data: {}, timestamp: Date.now() };\n state.tokensChainsCache[chainId] ??= newDataCache;\n state.tokensChainsCache[chainId].data = tokenList;\n state.tokensChainsCache[chainId].timestamp = Date.now();\n });\n return;\n }\n\n // No response - fallback to previous state, or initialise empty\n if (!tokensFromAPI) {\n this.update((state) => {\n const newDataCache: DataCache = { data: {}, timestamp: Date.now() };\n state.tokensChainsCache[chainId] ??= newDataCache;\n state.tokensChainsCache[chainId].timestamp = Date.now();\n });\n }\n } finally {\n releaseLock();\n }\n }\n\n isCacheValid(chainId: Hex): boolean {\n const { tokensChainsCache }: TokenListState = this.state;\n const timestamp: number | undefined = tokensChainsCache[chainId]?.timestamp;\n const now = Date.now();\n return (\n timestamp !== undefined && now - timestamp < this.cacheRefreshThreshold\n );\n }\n\n /**\n * Clearing tokenList and tokensChainsCache explicitly.\n */\n clearingTokenListData(): void {\n this.update(() => {\n return {\n ...this.state,\n tokensChainsCache: {},\n };\n });\n }\n\n /**\n * Updates preventPollingOnNetworkRestart from extension.\n *\n * @param shouldPreventPolling - Determine whether to prevent polling on network change\n */\n updatePreventPollingOnNetworkRestart(shouldPreventPolling: boolean): void {\n this.update(() => {\n return {\n ...this.state,\n preventPollingOnNetworkRestart: shouldPreventPolling,\n };\n });\n }\n}\n\nexport default TokenListController;\n"]}
@@ -74,6 +74,7 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
74
74
  '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',
75
75
  '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',
76
76
  '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',
77
+ // Rootstock, bytecode OK and referenced as "RSK" in https://www.multicall3.com/deployments
77
78
  '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',
78
79
  '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',
79
80
  '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',
@@ -179,6 +180,7 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
179
180
  '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',
180
181
  '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',
181
182
  '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',
183
+ // Etherlink mainnet, bytecode OK and referenced in https://www.multicall3.com/deployments
182
184
  '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',
183
185
  '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',
184
186
  '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',
@@ -248,6 +250,7 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
248
250
  '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',
249
251
  '0x659': '0xca11bde05977b3631167028862be2a173976ca11',
250
252
  '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',
253
+ // BOB, bytecode OK and referenced in https://www.multicall3.com/deployments
251
254
  '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',
252
255
  '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',
253
256
  '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',
@@ -303,6 +306,8 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
303
306
  '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',
304
307
  // MegaETH mainnet, contract found matching multicall3 bytecode
305
308
  '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',
309
+ // MSU (contract they deployed by their team for us)
310
+ '0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',
306
311
  };
307
312
  const multicallAbi = [
308
313
  {
@@ -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 '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 '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 '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 '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} 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":";;;;;;AAAA,wDAAoD;AAGpD,kDAAuB;AAEvB,6EAAiF;AACjF,iDAAuD;AAEvD,+DAA+D;AAC/D,MAAM,6BAA6B,GAAG;IACpC,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,4CAA4C;IACxD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,WAAW,EAAE,4CAA4C;IACzD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,aAAa,EAAE,4CAA4C;IAC3D,aAAa,EAAE,4CAA4C;IAC3D,YAAY,EAAE,4CAA4C;IAC1D,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,YAAY,EAAE,4CAA4C;IAC1D,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,2FAA2F;IAC3F,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,YAAY,EAAE,4CAA4C;IAC1D,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,aAAa,EAAE,4CAA4C;IAC3D,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,WAAW,EAAE,4CAA4C;IACzD,0FAA0F;IAC1F,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,aAAa,EAAE,4CAA4C;IAC3D,4EAA4E;IAC5E,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,cAAc,EAAE,4CAA4C;IAC5D,UAAU,EAAE,4CAA4C;IACxD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,uDAAuD;IACvD,OAAO,EAAE,4CAA4C;IACrD,kDAAkD;IAClD,QAAQ,EAAE,4CAA4C;IACtD,oDAAoD;IACpD,QAAQ,EAAE,4CAA4C;IACtD,oDAAoD;IACpD,MAAM,EAAE,4CAA4C;IACpD,kDAAkD;IAClD,UAAU,EAAE,4CAA4C;IACxD,qDAAqD;IACrD,OAAO,EAAE,4CAA4C;IACrD,qDAAqD;IACrD,QAAQ,EAAE,4CAA4C;IACtD,gBAAgB;IAChB,QAAQ,EAAE,4CAA4C;IACtD,WAAW;IACX,OAAO,EAAE,4CAA4C;IACrD,uDAAuD;IACvD,SAAS,EAAE,4CAA4C;IACvD,kBAAkB;IAClB,QAAQ,EAAE,4CAA4C;IACtD,WAAW;IACX,QAAQ,EAAE,4CAA4C;IACtD,sDAAsD;IACtD,OAAO,EAAE,4CAA4C;IACrD,gBAAgB;IAChB,QAAQ,EAAE,4CAA4C;IACtD,SAAS;IACT,SAAS,EAAE,4CAA4C;IACvD,kDAAkD;IAClD,MAAM,EAAE,4CAA4C;IACpD,QAAQ;IACR,SAAS,EAAE,4CAA4C;IACvD,gBAAgB;IAChB,MAAM,EAAE,4CAA4C;IACpD,iDAAiD;IACjD,MAAM,EAAE,4CAA4C;IACpD,6CAA6C;IAC7C,QAAQ,EAAE,4CAA4C;IACtD,+DAA+D;IAC/D,QAAQ,EAAE,4CAA4C;IACtD,oDAAoD;IACpD,SAAS,EAAE,4CAA4C;CACpC,CAAC;AAEtB,MAAM,YAAY,GAAG;IACnB;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;YACxC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;oBACnC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;iBACpC;aACF;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;oBACjC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;iBACtC;aACF;SACF;KACF;CACF,CAAC;AAEF,yCAAyC;AACzC,MAAM,aAAa,GAAG;IACpB;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;oBACnC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;oBACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;iBACpC;aACF;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;oBACjC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;iBACtC;aACF;SACF;KACF;CACF,CAAC;AAqBF,8CAA8C;AAC9C,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAClE,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AACjD,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACjD,MAAM,mBAAmB,GAAG,WAAW,CAAC;AACxC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC;AAErD,sBAAsB;AACtB,MAAM,oBAAoB,GAAG;IAC3B;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxC,eAAe,EAAE,MAAM;KACxB;CACF,CAAC;AAEF,+BAA+B;AAC/B,MAAM,8BAA8B,GAAG;IACrC;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC/C,eAAe,EAAE,MAAM;KACxB;CACF,CAAC;AAEF,+DAA+D;AAC/D,MAAM,oBAAoB,GAAG;IAC3B;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACjE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;IACD;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACF,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EACrB,KAAa,EACb,gBAAqB,EACrB,QAAsB,EACtB,oBAA4B,EACA,EAAE;IAC9B,MAAM,iBAAiB,GAAG,IAAI,oBAAQ,CACpC,gBAAgB,EAChB,YAAY,EACZ,QAAQ,CACT,CAAC;IAEF,OAAO,MAAM,IAAA,oCAAuB,EAA0B;QAC5D,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,oBAAoB;QAC/B,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAClD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,EACzD,IAAI,CAAC,SAAS,CACf;aACF,CAAC,CAAC,CAAC;YAEJ,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAC7D,KAAK,EACL,QAAQ,CACT,CAAC;YAEF,OAAO;gBACL,GAAG,aAAa;gBAChB,GAAG,OAAO,CAAC,GAAG,CACZ,CAAC,CAA2C,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC;oBAC3D,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,OAAO;wBACd,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAAoB,CAC9C,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAC1B,CAAC,CAAC,UAAU,CACb,CAAC,CAAC,CAAC;wBACN,CAAC,CAAC,SAAS;iBACd,CAAC,CACH;aACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EACpB,KAAa,EACb,gBAAwB,EACI,EAAE;IAC9B,OAAO,MAAM,IAAA,oCAAuB,EAA0B;QAC5D,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CACzD,CACF,CAAC;YACF,OAAO;gBACL,GAAG,aAAa;gBAChB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrB,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW;oBACjC,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBACtD,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACI,MAAM,mBAAmB,GAAG,KAAK,EACtC,KAAa,EACb,OAAY,EACZ,QAAsB,EACtB,oBAAoB,GAAG,GAAG,EAC1B,gBAAgB,GAAG,EAAE,EACO,EAAE;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CACpB,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,oBAAoB,CACrB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B;YAC1B,yEAAyE;YACzE,IACE,CAAC,KAAK;gBACN,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;gBAClB,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAC/B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC,CAAC;AAnCW,QAAA,mBAAmB,uBAmC9B;AAEF;;;;;;;;GAQG;AACI,MAAM,UAAU,GAAG,KAAK,EAC7B,KAAuB,EACvB,OAAY,EACZ,QAAsB,EACO,EAAE;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,IAAI,oBAAQ,CACrC,iBAAiB,EACjB,aAAa,EACb,QAAQ,CACT,CAAC;IAEF,OAAO,MAAM,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC,CAAC;AAjBW,QAAA,UAAU,cAiBrB;AAEF;;;;;;;;;GASG;AACH,MAAM,qBAAqB,GAAG,CAC5B,OAA2B,EAC3B,WAIG,EACH,OAAY,EACZ,QAAsB,EACtB,aAAsB,EAItB,EAAE;IACF,MAAM,UAAU,GAAuC,EAAE,CAAC;IAC1D,MAAM,gBAAgB,GAAuB,EAAE,CAAC;IAEhD,yCAAyC;IACzC,MAAM,aAAa,GAAG,IAAI,oBAAQ,CAChC,YAAY,EACZ,oBAAoB,EACpB,QAAQ,CACT,CAAC;IAEF,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,IAAI,oBAAQ,CACrC,iBAAiB,EACjB,8BAA8B,EAC9B,QAAQ,CACT,CAAC;IAEF,mEAAmE;IAEnE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACnE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,oDAAoD;gBACpD,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,CAClE,wBAAwB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC,CAAC;gBAEL,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,eAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClC,wDAAwD;gBACxD,qCAAqC;gBACrC,OAAO,CAAC,IAAI,CACV,oEAAoE,CACrE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,gDAAgD;gBAChD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,oBAAoB,CAC7D,mBAAmB,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC,CAAC;gBAEL,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,eAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAGR,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IAElC,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,cAAc,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,yBAAyB,GAAG,KAAK,EACrC,aAAuB,EACvB,QAAsB,EACtB,gBAAgB,GAAG,EAAE,EACQ,EAAE;IAC/B,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,MAAM,IAAA,oCAAuB,EAAe;QAC1C,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,SAAS;QACxB,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;YAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;gBAC9B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBACvD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI,eAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnC,WAAW;iBACZ,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YAEF,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzB,IACE,MAAM,CAAC,MAAM,KAAK,WAAW;oBAC7B,MAAM,CAAC,KAAK,CAAC,OAAO;oBACpB,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,EAC7B,CAAC;oBACD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,wBAAwB,GAAG,KAAK,EACpC,cAAwB,EACxB,aAAuB,EACvB,QAAsB,EACtB,aAAsB,EACtB,gBAAwB,EACqB,EAAE;IAC/C,MAAM,UAAU,GAAuC,EAAE,CAAC;IAE1D,mEAAmE;IACnE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAW,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAoD,EAAE,CAAC;QAExE,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YACtC,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBACpC,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAC3B,YAAY,EACZ,oBAAoB,EACpB,QAAQ,CACT,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC;oBACd,QAAQ;oBACR,iBAAiB,EAAE,mBAAmB;oBACtC,SAAS,EAAE,CAAC,WAAW,CAAC;iBACzB,CAAC,CAAC;gBACH,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAClE,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAW,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,MAAM,yBAAyB,CACpD,aAAa,EACb,QAAQ,EACR,gBAAgB,CACjB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,UAAU,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,yBAAyB,GAAG,KAAK,EACrC,aAAuB,EACvB,OAAY,EACZ,QAAsB,EACtB,gBAAwB,EACK,EAAE;IAC/B,MAAM,gBAAgB,GAAuB,EAAE,CAAC;IAEhD,MAAM,sBAAsB,GAAG,8DAAmC,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,oCAAoC;QACpC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,YAAY,GAAW,EAAE,CAAC;IAChC,MAAM,WAAW,GAA8B,EAAE,CAAC;IAElD,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAC3B,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,CACT,CAAC;QACF,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ;YACR,iBAAiB,EAAE,mBAAmB;YACtC,SAAS,EAAE,CAAC,WAAW,CAAC;SACzB,CAAC,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACtE,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3C,gBAAgB,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAW,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACI,MAAM,6BAA6B,GAAG,KAAK,EAChD,aAAuB,EACvB,OAAY,EACZ,QAAsB,EACO,EAAE;IAC/B,MAAM,sBAAsB,GAAG,8DAAmC,CAAC,OAAO,CAAC,CAAC;IAE5E,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,oBAAQ,CAClC,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,CACT,CAAC;IAEF,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,UAAU,GAAqB,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvE,MAAM,EAAE,sBAAsB;YAC9B,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,kBAAkB,CACpD,mBAAmB,EACnB,CAAC,WAAW,CAAC,CACd;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAU,EAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAErE,gEAAgE;QAChE,MAAM,iBAAiB,GAAsC,EAAE,CAAC;QAChE,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAC9D,mBAAmB,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC,CAAC;gBACL,MAAM,MAAM,GAAG,IAAI,eAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE5C,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,eAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,iBAAiB,CAAC,IAAI,CAAC;wBACrB,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC;wBAC7B,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,sEAAsE;QACtE,MAAM,UAAU,GAAqB,iBAAiB,CAAC,GAAG,CACxD,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACf,MAAM,EAAE,sBAAsB;YAC9B,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,kBAAkB,CACpD,0BAA0B,EAC1B,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CACpB;SACF,CAAC,CACH,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAU,EAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAErE,qCAAqC;QACrC,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;YAC1C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAC9D,0BAA0B,EAC1B,WAAW,CAAC,UAAU,CACvB,CAAC,CAAC,CAAC,CAAC;gBACL,MAAM,MAAM,GAAG,IAAI,eAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE5C,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAvFW,QAAA,6BAA6B,iCAuFxC;AAEF;;;;;;;;;;;GAWG;AACI,MAAM,oCAAoC,GAAG,KAAK,EACvD,kBAAoE,EACpE,OAAY,EACZ,QAAsB,EACtB,aAAsB,EACtB,aAAsB,EAIrB,EAAE;IACH,qCAAqC;IACrC,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;QACxE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC/B,CAAC;IAED,gEAAgE;IAChE,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CACrC,IAAI,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CACrE,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC,CAAC,wCAAwC;IAEnG,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CACpC,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CACjE,CAAC;IAEF,iDAAiD;IACjD,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,wEAAwE;QACxE,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAClD,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,EAAE,CACH,CAAC;QAEF,MAAM,MAAM,GAGR,EAAE,aAAa,EAAE,CAAC;QAEtB,+CAA+C;QAC/C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,yBAAyB,CACpD,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,EAAE,CACH,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,MAAM,cAAc,GAId,EAAE,CAAC;QAET,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,IAAI,oBAAQ,CACpC,YAAY,EACZ,oBAAoB,EACpB,QAAQ,CACT,CAAC;QAEF,gEAAgE;QAChE,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,KAAK,CAAC,cAAc;iBACjB,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC;iBACvD,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;gBACxB,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,YAAY;oBACpB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,iBAAiB,CAAC,SAAS,CAAC,kBAAkB,CACtD,mBAAmB,EACnB,CAAC,KAAK,CAAC,cAAc,CAAC,CACvB;iBACF,CAAC,CAAC;gBACH,cAAc,CAAC,IAAI,CAAC;oBAClB,YAAY;oBACZ,WAAW,EAAE,KAAK,CAAC,cAAc;oBACjC,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,8CAA8C;QAC9C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,sBAAsB,GAAG,IAAI,oBAAQ,CACzC,iBAAiB,EACjB,8BAA8B,EAC9B,QAAQ,CACT,CAAC;YAEF,mBAAmB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC1C,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,iBAAiB;oBACzB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,sBAAsB,CAAC,SAAS,CAAC,kBAAkB,CAC3D,wBAAwB,EACxB,CAAC,WAAW,CAAC,CACd;iBACF,CAAC,CAAC;gBACH,cAAc,CAAC,IAAI,CAAC;oBAClB,YAAY,EAAE,YAAY;oBAC1B,WAAW;oBACX,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,0FAA0F;QAE1F,+BAA+B;QAC/B,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,iDAAiD;QAC/E,MAAM,UAAU,GAAuB,EAAE,CAAC;QAE1C,MAAM,IAAA,oCAAuB,EAAuB;YAClD,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,gBAAgB;YAC3B,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;gBAC5B,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAU,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAChE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QAEH,oDAAoD;QACpD,IAAI,cAAc,GAAuB,EAAE,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAClB,cAAc,GAAG,MAAM,IAAA,qCAA6B,EAClD,mBAAmB,EACnB,OAAO,EACP,QAAQ,CACT,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,qBAAqB,CAClC,UAAU,EACV,cAAc,EACd,OAAO,EACP,QAAQ,EACR,KAAK,CACN,CAAC;QAEF,gCAAgC;QAChC,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;QACzC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,yEAAyE;QACzE,IACE,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;YAClB,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAC/B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAClD,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,EAAE,CACH,CAAC;QAEF,MAAM,MAAM,GAGR,EAAE,aAAa,EAAE,CAAC;QAEtB,+CAA+C;QAC/C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,yBAAyB,CACpD,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,EAAE,CACH,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AA3MW,QAAA,oCAAoC,wCA2M/C","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 '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 +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;AAyWvB,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"}
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;AA8WvB,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"}
@@ -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;AAyWvB,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"}
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;AA8WvB,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"}
@@ -75,6 +75,7 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
75
75
  '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',
76
76
  '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',
77
77
  '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',
78
+ // Rootstock, bytecode OK and referenced as "RSK" in https://www.multicall3.com/deployments
78
79
  '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',
79
80
  '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',
80
81
  '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',
@@ -180,6 +181,7 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
180
181
  '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',
181
182
  '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',
182
183
  '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',
184
+ // Etherlink mainnet, bytecode OK and referenced in https://www.multicall3.com/deployments
183
185
  '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',
184
186
  '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',
185
187
  '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',
@@ -249,6 +251,7 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
249
251
  '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',
250
252
  '0x659': '0xca11bde05977b3631167028862be2a173976ca11',
251
253
  '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',
254
+ // BOB, bytecode OK and referenced in https://www.multicall3.com/deployments
252
255
  '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',
253
256
  '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',
254
257
  '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',
@@ -304,6 +307,8 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
304
307
  '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',
305
308
  // MegaETH mainnet, contract found matching multicall3 bytecode
306
309
  '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',
310
+ // MSU (contract they deployed by their team for us)
311
+ '0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',
307
312
  };
308
313
  const multicallAbi = [
309
314
  {